From ef79bbde537d6b9c745a7d86cb9df1d04c35590d Mon Sep 17 00:00:00 2001 From: PCSX* teams Date: Tue, 16 Nov 2010 14:15:22 +0200 Subject: pcsxr-1.9.92 --- libpcsxcore/Makefile.am | 84 + libpcsxcore/Makefile.in | 1174 ++++++ libpcsxcore/cdriso.c | 881 +++++ libpcsxcore/cdriso.h | 34 + libpcsxcore/cdrom.c | 1138 ++++++ libpcsxcore/cdrom.h | 110 + libpcsxcore/cheat.c | 1024 +++++ libpcsxcore/cheat.h | 117 + libpcsxcore/coff.h | 38 + libpcsxcore/debug.c | 1145 ++++++ libpcsxcore/debug.h | 72 + libpcsxcore/decode_xa.c | 367 ++ libpcsxcore/decode_xa.h | 49 + libpcsxcore/disr3000a.c | 323 ++ libpcsxcore/gte.c | 904 +++++ libpcsxcore/gte.h | 65 + libpcsxcore/gte_divider.h | 4133 ++++++++++++++++++++ libpcsxcore/ix86/iGte.h | 79 + libpcsxcore/ix86/iR3000A.c | 2899 ++++++++++++++ libpcsxcore/ix86/ix86.c | 1723 +++++++++ libpcsxcore/ix86/ix86.h | 673 ++++ libpcsxcore/ix86_64/README | 2 + libpcsxcore/ix86_64/iGte.h | 79 + libpcsxcore/ix86_64/iR3000A-64.c | 2963 +++++++++++++++ libpcsxcore/ix86_64/ix86-64.c | 3139 +++++++++++++++ libpcsxcore/ix86_64/ix86-64.h | 1776 +++++++++ libpcsxcore/ix86_64/ix86_3dnow.c | 178 + libpcsxcore/ix86_64/ix86_cpudetect.c | 487 +++ libpcsxcore/ix86_64/ix86_fpu.c | 248 ++ libpcsxcore/ix86_64/ix86_mmx.c | 646 ++++ libpcsxcore/ix86_64/ix86_sse.c | 1455 +++++++ libpcsxcore/mdec.c | 565 +++ libpcsxcore/mdec.h | 45 + libpcsxcore/misc.c | 706 ++++ libpcsxcore/misc.h | 77 + libpcsxcore/plugins.c | 815 ++++ libpcsxcore/plugins.h | 411 ++ libpcsxcore/ppc/pGte.h | 91 + libpcsxcore/ppc/pR3000A.c | 3540 +++++++++++++++++ libpcsxcore/ppc/pasm.s | 124 + libpcsxcore/ppc/ppc.c | 32 + libpcsxcore/ppc/ppc.h | 60 + libpcsxcore/ppc/ppc_mnemonics.h | 529 +++ libpcsxcore/ppc/reguse.c | 419 ++ libpcsxcore/ppc/reguse.h | 83 + libpcsxcore/ppf.c | 332 ++ libpcsxcore/ppf.h | 33 + libpcsxcore/psemu_plugin_defs.h | 285 ++ libpcsxcore/psxbios.c | 2810 ++++++++++++++ libpcsxcore/psxbios.h | 51 + libpcsxcore/psxcommon.c | 76 + libpcsxcore/psxcommon.h | 169 + libpcsxcore/psxcounters.c | 480 +++ libpcsxcore/psxcounters.h | 50 + libpcsxcore/psxdma.c | 174 + libpcsxcore/psxdma.h | 60 + libpcsxcore/psxhle.c | 96 + libpcsxcore/psxhle.h | 36 + libpcsxcore/psxhw.c | 741 ++++ libpcsxcore/psxhw.h | 78 + libpcsxcore/psxinterpreter.c | 804 ++++ libpcsxcore/psxmem.c | 348 ++ libpcsxcore/psxmem.h | 144 + libpcsxcore/r3000a.c | 202 + libpcsxcore/r3000a.h | 246 ++ libpcsxcore/sio.c | 775 ++++ libpcsxcore/sio.h | 76 + libpcsxcore/sjisfont.h | 6956 ++++++++++++++++++++++++++++++++++ libpcsxcore/socket.c | 254 ++ libpcsxcore/socket.h | 43 + libpcsxcore/spu.c | 28 + libpcsxcore/spu.h | 47 + libpcsxcore/system.h | 42 + 73 files changed, 50938 insertions(+) create mode 100644 libpcsxcore/Makefile.am create mode 100644 libpcsxcore/Makefile.in create mode 100644 libpcsxcore/cdriso.c create mode 100644 libpcsxcore/cdriso.h create mode 100644 libpcsxcore/cdrom.c create mode 100644 libpcsxcore/cdrom.h create mode 100644 libpcsxcore/cheat.c create mode 100644 libpcsxcore/cheat.h create mode 100644 libpcsxcore/coff.h create mode 100644 libpcsxcore/debug.c create mode 100644 libpcsxcore/debug.h create mode 100644 libpcsxcore/decode_xa.c create mode 100644 libpcsxcore/decode_xa.h create mode 100644 libpcsxcore/disr3000a.c create mode 100644 libpcsxcore/gte.c create mode 100644 libpcsxcore/gte.h create mode 100644 libpcsxcore/gte_divider.h create mode 100644 libpcsxcore/ix86/iGte.h create mode 100644 libpcsxcore/ix86/iR3000A.c create mode 100644 libpcsxcore/ix86/ix86.c create mode 100644 libpcsxcore/ix86/ix86.h create mode 100644 libpcsxcore/ix86_64/README create mode 100644 libpcsxcore/ix86_64/iGte.h create mode 100644 libpcsxcore/ix86_64/iR3000A-64.c create mode 100644 libpcsxcore/ix86_64/ix86-64.c create mode 100644 libpcsxcore/ix86_64/ix86-64.h create mode 100644 libpcsxcore/ix86_64/ix86_3dnow.c create mode 100644 libpcsxcore/ix86_64/ix86_cpudetect.c create mode 100644 libpcsxcore/ix86_64/ix86_fpu.c create mode 100644 libpcsxcore/ix86_64/ix86_mmx.c create mode 100644 libpcsxcore/ix86_64/ix86_sse.c create mode 100644 libpcsxcore/mdec.c create mode 100644 libpcsxcore/mdec.h create mode 100644 libpcsxcore/misc.c create mode 100644 libpcsxcore/misc.h create mode 100644 libpcsxcore/plugins.c create mode 100644 libpcsxcore/plugins.h create mode 100644 libpcsxcore/ppc/pGte.h create mode 100644 libpcsxcore/ppc/pR3000A.c create mode 100644 libpcsxcore/ppc/pasm.s create mode 100644 libpcsxcore/ppc/ppc.c create mode 100644 libpcsxcore/ppc/ppc.h create mode 100644 libpcsxcore/ppc/ppc_mnemonics.h create mode 100644 libpcsxcore/ppc/reguse.c create mode 100644 libpcsxcore/ppc/reguse.h create mode 100644 libpcsxcore/ppf.c create mode 100644 libpcsxcore/ppf.h create mode 100644 libpcsxcore/psemu_plugin_defs.h create mode 100644 libpcsxcore/psxbios.c create mode 100644 libpcsxcore/psxbios.h create mode 100644 libpcsxcore/psxcommon.c create mode 100644 libpcsxcore/psxcommon.h create mode 100644 libpcsxcore/psxcounters.c create mode 100644 libpcsxcore/psxcounters.h create mode 100644 libpcsxcore/psxdma.c create mode 100644 libpcsxcore/psxdma.h create mode 100644 libpcsxcore/psxhle.c create mode 100644 libpcsxcore/psxhle.h create mode 100644 libpcsxcore/psxhw.c create mode 100644 libpcsxcore/psxhw.h create mode 100644 libpcsxcore/psxinterpreter.c create mode 100644 libpcsxcore/psxmem.c create mode 100644 libpcsxcore/psxmem.h create mode 100644 libpcsxcore/r3000a.c create mode 100644 libpcsxcore/r3000a.h create mode 100644 libpcsxcore/sio.c create mode 100644 libpcsxcore/sio.h create mode 100644 libpcsxcore/sjisfont.h create mode 100644 libpcsxcore/socket.c create mode 100644 libpcsxcore/socket.h create mode 100644 libpcsxcore/spu.c create mode 100644 libpcsxcore/spu.h create mode 100644 libpcsxcore/system.h (limited to 'libpcsxcore') diff --git a/libpcsxcore/Makefile.am b/libpcsxcore/Makefile.am new file mode 100644 index 0000000..6c0dae8 --- /dev/null +++ b/libpcsxcore/Makefile.am @@ -0,0 +1,84 @@ +INCLUDES = -DLOCALE_DIR=\"${datadir}/locale/\" \ + -I$(top_srcdir)/include + +noinst_LIBRARIES = libpcsxcore.a + +libpcsxcore_a_SOURCES = \ + $(top_builddir)/libpcsxcore/psxbios.c \ + $(top_builddir)/libpcsxcore/cdrom.c \ + $(top_builddir)/libpcsxcore/psxcounters.c \ + $(top_builddir)/libpcsxcore/psxdma.c \ + $(top_builddir)/libpcsxcore/disr3000a.c \ + $(top_builddir)/libpcsxcore/spu.c \ + $(top_builddir)/libpcsxcore/sio.c \ + $(top_builddir)/libpcsxcore/psxhw.c \ + $(top_builddir)/libpcsxcore/mdec.c \ + $(top_builddir)/libpcsxcore/psxmem.c \ + $(top_builddir)/libpcsxcore/misc.c \ + $(top_builddir)/libpcsxcore/plugins.c \ + $(top_builddir)/libpcsxcore/decode_xa.c \ + $(top_builddir)/libpcsxcore/r3000a.c \ + $(top_builddir)/libpcsxcore/psxinterpreter.c \ + $(top_builddir)/libpcsxcore/gte.c \ + $(top_builddir)/libpcsxcore/psxhle.c \ + $(top_builddir)/libpcsxcore/cdrom.h \ + $(top_builddir)/libpcsxcore/coff.h \ + $(top_builddir)/libpcsxcore/debug.c \ + $(top_builddir)/libpcsxcore/debug.h \ + $(top_builddir)/libpcsxcore/decode_xa.h \ + $(top_builddir)/libpcsxcore/gte.h \ + $(top_builddir)/libpcsxcore/gte_divider.h \ + $(top_builddir)/libpcsxcore/mdec.h \ + $(top_builddir)/libpcsxcore/misc.h \ + $(top_builddir)/libpcsxcore/plugins.h \ + $(top_builddir)/libpcsxcore/psemu_plugin_defs.h \ + $(top_builddir)/libpcsxcore/psxbios.h \ + $(top_builddir)/libpcsxcore/psxcommon.c \ + $(top_builddir)/libpcsxcore/psxcommon.h \ + $(top_builddir)/libpcsxcore/psxcounters.h \ + $(top_builddir)/libpcsxcore/psxdma.h \ + $(top_builddir)/libpcsxcore/psxhle.h \ + $(top_builddir)/libpcsxcore/psxhw.h \ + $(top_builddir)/libpcsxcore/psxmem.h \ + $(top_builddir)/libpcsxcore/r3000a.h \ + $(top_builddir)/libpcsxcore/sio.h \ + $(top_builddir)/libpcsxcore/sjisfont.h \ + $(top_builddir)/libpcsxcore/spu.h \ + $(top_builddir)/libpcsxcore/system.h \ + $(top_builddir)/libpcsxcore/cdriso.c \ + $(top_builddir)/libpcsxcore/cdriso.h \ + $(top_builddir)/libpcsxcore/cheat.c \ + $(top_builddir)/libpcsxcore/cheat.h \ + $(top_builddir)/libpcsxcore/socket.c \ + $(top_builddir)/libpcsxcore/socket.h \ + $(top_builddir)/libpcsxcore/ppf.c \ + $(top_builddir)/libpcsxcore/ppf.h + +if ARCH_X86_64 +libpcsxcore_a_SOURCES += \ + $(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c \ + $(top_builddir)/libpcsxcore/ix86_64/ix86-64.c \ + $(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c \ + $(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c \ + $(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c \ + $(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c \ + $(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c \ + $(top_builddir)/libpcsxcore/ +else +if ARCH_X86 +libpcsxcore_a_SOURCES += \ + $(top_builddir)/libpcsxcore/ix86/iR3000A.c \ + $(top_builddir)/libpcsxcore/ix86/ix86.c \ + $(top_builddir)/libpcsxcore/ +endif +endif + +if ARCH_PPC +libpcsxcore_a_SOURCES += \ + $(top_builddir)/libpcsxcore/ppc/pR3000A.c \ + $(top_builddir)/libpcsxcore/ppc/ppc.c \ + $(top_builddir)/libpcsxcore/ppc/reguse.c \ + $(top_builddir)/libpcsxcore/ppc/pasm.s \ + $(top_builddir)/libpcsxcore/ +libpcsxcore_a_CCASFLAGS = -x assembler-with-cpp -mregnames +endif diff --git a/libpcsxcore/Makefile.in b/libpcsxcore/Makefile.in new file mode 100644 index 0000000..18721a5 --- /dev/null +++ b/libpcsxcore/Makefile.in @@ -0,0 +1,1174 @@ +# Makefile.in generated by automake 1.10.2 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@ARCH_X86_64_TRUE@am__append_1 = \ +@ARCH_X86_64_TRUE@ $(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c \ +@ARCH_X86_64_TRUE@ $(top_builddir)/libpcsxcore/ix86_64/ix86-64.c \ +@ARCH_X86_64_TRUE@ $(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c \ +@ARCH_X86_64_TRUE@ $(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c \ +@ARCH_X86_64_TRUE@ $(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c \ +@ARCH_X86_64_TRUE@ $(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c \ +@ARCH_X86_64_TRUE@ $(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c \ +@ARCH_X86_64_TRUE@ $(top_builddir)/libpcsxcore/ + +@ARCH_X86_64_FALSE@@ARCH_X86_TRUE@am__append_2 = \ +@ARCH_X86_64_FALSE@@ARCH_X86_TRUE@ $(top_builddir)/libpcsxcore/ix86/iR3000A.c \ +@ARCH_X86_64_FALSE@@ARCH_X86_TRUE@ $(top_builddir)/libpcsxcore/ix86/ix86.c \ +@ARCH_X86_64_FALSE@@ARCH_X86_TRUE@ $(top_builddir)/libpcsxcore/ + +@ARCH_PPC_TRUE@am__append_3 = \ +@ARCH_PPC_TRUE@ $(top_builddir)/libpcsxcore/ppc/pR3000A.c \ +@ARCH_PPC_TRUE@ $(top_builddir)/libpcsxcore/ppc/ppc.c \ +@ARCH_PPC_TRUE@ $(top_builddir)/libpcsxcore/ppc/reguse.c \ +@ARCH_PPC_TRUE@ $(top_builddir)/libpcsxcore/ppc/pasm.s \ +@ARCH_PPC_TRUE@ $(top_builddir)/libpcsxcore/ + +subdir = libpcsxcore +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +libpcsxcore_a_AR = $(AR) $(ARFLAGS) +libpcsxcore_a_LIBADD = +am__libpcsxcore_a_SOURCES_DIST = \ + $(top_builddir)/libpcsxcore/psxbios.c \ + $(top_builddir)/libpcsxcore/cdrom.c \ + $(top_builddir)/libpcsxcore/psxcounters.c \ + $(top_builddir)/libpcsxcore/psxdma.c \ + $(top_builddir)/libpcsxcore/disr3000a.c \ + $(top_builddir)/libpcsxcore/spu.c \ + $(top_builddir)/libpcsxcore/sio.c \ + $(top_builddir)/libpcsxcore/psxhw.c \ + $(top_builddir)/libpcsxcore/mdec.c \ + $(top_builddir)/libpcsxcore/psxmem.c \ + $(top_builddir)/libpcsxcore/misc.c \ + $(top_builddir)/libpcsxcore/plugins.c \ + $(top_builddir)/libpcsxcore/decode_xa.c \ + $(top_builddir)/libpcsxcore/r3000a.c \ + $(top_builddir)/libpcsxcore/psxinterpreter.c \ + $(top_builddir)/libpcsxcore/gte.c \ + $(top_builddir)/libpcsxcore/psxhle.c \ + $(top_builddir)/libpcsxcore/cdrom.h \ + $(top_builddir)/libpcsxcore/coff.h \ + $(top_builddir)/libpcsxcore/debug.c \ + $(top_builddir)/libpcsxcore/debug.h \ + $(top_builddir)/libpcsxcore/decode_xa.h \ + $(top_builddir)/libpcsxcore/gte.h \ + $(top_builddir)/libpcsxcore/gte_divider.h \ + $(top_builddir)/libpcsxcore/mdec.h \ + $(top_builddir)/libpcsxcore/misc.h \ + $(top_builddir)/libpcsxcore/plugins.h \ + $(top_builddir)/libpcsxcore/psemu_plugin_defs.h \ + $(top_builddir)/libpcsxcore/psxbios.h \ + $(top_builddir)/libpcsxcore/psxcommon.c \ + $(top_builddir)/libpcsxcore/psxcommon.h \ + $(top_builddir)/libpcsxcore/psxcounters.h \ + $(top_builddir)/libpcsxcore/psxdma.h \ + $(top_builddir)/libpcsxcore/psxhle.h \ + $(top_builddir)/libpcsxcore/psxhw.h \ + $(top_builddir)/libpcsxcore/psxmem.h \ + $(top_builddir)/libpcsxcore/r3000a.h \ + $(top_builddir)/libpcsxcore/sio.h \ + $(top_builddir)/libpcsxcore/sjisfont.h \ + $(top_builddir)/libpcsxcore/spu.h \ + $(top_builddir)/libpcsxcore/system.h \ + $(top_builddir)/libpcsxcore/cdriso.c \ + $(top_builddir)/libpcsxcore/cdriso.h \ + $(top_builddir)/libpcsxcore/cheat.c \ + $(top_builddir)/libpcsxcore/cheat.h \ + $(top_builddir)/libpcsxcore/socket.c \ + $(top_builddir)/libpcsxcore/socket.h \ + $(top_builddir)/libpcsxcore/ppf.c \ + $(top_builddir)/libpcsxcore/ppf.h \ + $(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c \ + $(top_builddir)/libpcsxcore/ix86_64/ix86-64.c \ + $(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c \ + $(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c \ + $(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c \ + $(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c \ + $(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c \ + $(top_builddir)/libpcsxcore/ \ + $(top_builddir)/libpcsxcore/ix86/iR3000A.c \ + $(top_builddir)/libpcsxcore/ix86/ix86.c \ + $(top_builddir)/libpcsxcore/ppc/pR3000A.c \ + $(top_builddir)/libpcsxcore/ppc/ppc.c \ + $(top_builddir)/libpcsxcore/ppc/reguse.c \ + $(top_builddir)/libpcsxcore/ppc/pasm.s +@ARCH_X86_64_TRUE@am__objects_1 = iR3000A-64.$(OBJEXT) \ +@ARCH_X86_64_TRUE@ ix86-64.$(OBJEXT) ix86_cpudetect.$(OBJEXT) \ +@ARCH_X86_64_TRUE@ ix86_fpu.$(OBJEXT) ix86_3dnow.$(OBJEXT) \ +@ARCH_X86_64_TRUE@ ix86_mmx.$(OBJEXT) ix86_sse.$(OBJEXT) +@ARCH_X86_64_FALSE@@ARCH_X86_TRUE@am__objects_2 = iR3000A.$(OBJEXT) \ +@ARCH_X86_64_FALSE@@ARCH_X86_TRUE@ ix86.$(OBJEXT) +@ARCH_PPC_TRUE@am__objects_3 = pR3000A.$(OBJEXT) ppc.$(OBJEXT) \ +@ARCH_PPC_TRUE@ reguse.$(OBJEXT) libpcsxcore_a-pasm.$(OBJEXT) +am_libpcsxcore_a_OBJECTS = psxbios.$(OBJEXT) cdrom.$(OBJEXT) \ + psxcounters.$(OBJEXT) psxdma.$(OBJEXT) disr3000a.$(OBJEXT) \ + spu.$(OBJEXT) sio.$(OBJEXT) psxhw.$(OBJEXT) mdec.$(OBJEXT) \ + psxmem.$(OBJEXT) misc.$(OBJEXT) plugins.$(OBJEXT) \ + decode_xa.$(OBJEXT) r3000a.$(OBJEXT) psxinterpreter.$(OBJEXT) \ + gte.$(OBJEXT) psxhle.$(OBJEXT) debug.$(OBJEXT) \ + psxcommon.$(OBJEXT) cdriso.$(OBJEXT) cheat.$(OBJEXT) \ + socket.$(OBJEXT) ppf.$(OBJEXT) $(am__objects_1) \ + $(am__objects_2) $(am__objects_3) +libpcsxcore_a_OBJECTS = $(am_libpcsxcore_a_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +CCASCOMPILE = $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS) +LTCCASCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS) +SOURCES = $(libpcsxcore_a_SOURCES) +DIST_SOURCES = $(am__libpcsxcore_a_SOURCES_DIST) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLADE2_CFLAGS = @GLADE2_CFLAGS@ +GLADE2_LIBS = @GLADE2_LIBS@ +GLIB2_CFLAGS = @GLIB2_CFLAGS@ +GLIB2_LIBS = @GLIB2_LIBS@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCDIO_CFLAGS = @LIBCDIO_CFLAGS@ +LIBCDIO_LIBS = @LIBCDIO_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NASM = @NASM@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PEOPSXGL = @PEOPSXGL@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +PULSEAUDIO_CFLAGS = @PULSEAUDIO_CFLAGS@ +PULSEAUDIO_LIBS = @PULSEAUDIO_LIBS@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +INCLUDES = -DLOCALE_DIR=\"${datadir}/locale/\" \ + -I$(top_srcdir)/include + +noinst_LIBRARIES = libpcsxcore.a +libpcsxcore_a_SOURCES = $(top_builddir)/libpcsxcore/psxbios.c \ + $(top_builddir)/libpcsxcore/cdrom.c \ + $(top_builddir)/libpcsxcore/psxcounters.c \ + $(top_builddir)/libpcsxcore/psxdma.c \ + $(top_builddir)/libpcsxcore/disr3000a.c \ + $(top_builddir)/libpcsxcore/spu.c \ + $(top_builddir)/libpcsxcore/sio.c \ + $(top_builddir)/libpcsxcore/psxhw.c \ + $(top_builddir)/libpcsxcore/mdec.c \ + $(top_builddir)/libpcsxcore/psxmem.c \ + $(top_builddir)/libpcsxcore/misc.c \ + $(top_builddir)/libpcsxcore/plugins.c \ + $(top_builddir)/libpcsxcore/decode_xa.c \ + $(top_builddir)/libpcsxcore/r3000a.c \ + $(top_builddir)/libpcsxcore/psxinterpreter.c \ + $(top_builddir)/libpcsxcore/gte.c \ + $(top_builddir)/libpcsxcore/psxhle.c \ + $(top_builddir)/libpcsxcore/cdrom.h \ + $(top_builddir)/libpcsxcore/coff.h \ + $(top_builddir)/libpcsxcore/debug.c \ + $(top_builddir)/libpcsxcore/debug.h \ + $(top_builddir)/libpcsxcore/decode_xa.h \ + $(top_builddir)/libpcsxcore/gte.h \ + $(top_builddir)/libpcsxcore/gte_divider.h \ + $(top_builddir)/libpcsxcore/mdec.h \ + $(top_builddir)/libpcsxcore/misc.h \ + $(top_builddir)/libpcsxcore/plugins.h \ + $(top_builddir)/libpcsxcore/psemu_plugin_defs.h \ + $(top_builddir)/libpcsxcore/psxbios.h \ + $(top_builddir)/libpcsxcore/psxcommon.c \ + $(top_builddir)/libpcsxcore/psxcommon.h \ + $(top_builddir)/libpcsxcore/psxcounters.h \ + $(top_builddir)/libpcsxcore/psxdma.h \ + $(top_builddir)/libpcsxcore/psxhle.h \ + $(top_builddir)/libpcsxcore/psxhw.h \ + $(top_builddir)/libpcsxcore/psxmem.h \ + $(top_builddir)/libpcsxcore/r3000a.h \ + $(top_builddir)/libpcsxcore/sio.h \ + $(top_builddir)/libpcsxcore/sjisfont.h \ + $(top_builddir)/libpcsxcore/spu.h \ + $(top_builddir)/libpcsxcore/system.h \ + $(top_builddir)/libpcsxcore/cdriso.c \ + $(top_builddir)/libpcsxcore/cdriso.h \ + $(top_builddir)/libpcsxcore/cheat.c \ + $(top_builddir)/libpcsxcore/cheat.h \ + $(top_builddir)/libpcsxcore/socket.c \ + $(top_builddir)/libpcsxcore/socket.h \ + $(top_builddir)/libpcsxcore/ppf.c \ + $(top_builddir)/libpcsxcore/ppf.h $(am__append_1) \ + $(am__append_2) $(am__append_3) +@ARCH_PPC_TRUE@libpcsxcore_a_CCASFLAGS = -x assembler-with-cpp -mregnames +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj .s +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libpcsxcore/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu libpcsxcore/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +libpcsxcore.a: $(libpcsxcore_a_OBJECTS) $(libpcsxcore_a_DEPENDENCIES) + -rm -f libpcsxcore.a + $(libpcsxcore_a_AR) libpcsxcore.a $(libpcsxcore_a_OBJECTS) $(libpcsxcore_a_LIBADD) + $(RANLIB) libpcsxcore.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdriso.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdrom.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cheat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decode_xa.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disr3000a.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gte.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iR3000A-64.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iR3000A.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ix86-64.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ix86.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ix86_3dnow.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ix86_cpudetect.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ix86_fpu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ix86_mmx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ix86_sse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mdec.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pR3000A.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugins.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psxbios.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psxcommon.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psxcounters.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psxdma.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psxhle.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psxhw.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psxinterpreter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psxmem.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r3000a.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reguse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sio.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socket.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spu.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +psxbios.o: $(top_builddir)/libpcsxcore/psxbios.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxbios.o -MD -MP -MF $(DEPDIR)/psxbios.Tpo -c -o psxbios.o `test -f '$(top_builddir)/libpcsxcore/psxbios.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxbios.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxbios.Tpo $(DEPDIR)/psxbios.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxbios.c' object='psxbios.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxbios.o `test -f '$(top_builddir)/libpcsxcore/psxbios.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxbios.c + +psxbios.obj: $(top_builddir)/libpcsxcore/psxbios.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxbios.obj -MD -MP -MF $(DEPDIR)/psxbios.Tpo -c -o psxbios.obj `if test -f '$(top_builddir)/libpcsxcore/psxbios.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxbios.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxbios.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxbios.Tpo $(DEPDIR)/psxbios.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxbios.c' object='psxbios.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxbios.obj `if test -f '$(top_builddir)/libpcsxcore/psxbios.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxbios.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxbios.c'; fi` + +cdrom.o: $(top_builddir)/libpcsxcore/cdrom.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cdrom.o -MD -MP -MF $(DEPDIR)/cdrom.Tpo -c -o cdrom.o `test -f '$(top_builddir)/libpcsxcore/cdrom.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/cdrom.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/cdrom.Tpo $(DEPDIR)/cdrom.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/cdrom.c' object='cdrom.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cdrom.o `test -f '$(top_builddir)/libpcsxcore/cdrom.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/cdrom.c + +cdrom.obj: $(top_builddir)/libpcsxcore/cdrom.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cdrom.obj -MD -MP -MF $(DEPDIR)/cdrom.Tpo -c -o cdrom.obj `if test -f '$(top_builddir)/libpcsxcore/cdrom.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/cdrom.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/cdrom.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/cdrom.Tpo $(DEPDIR)/cdrom.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/cdrom.c' object='cdrom.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cdrom.obj `if test -f '$(top_builddir)/libpcsxcore/cdrom.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/cdrom.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/cdrom.c'; fi` + +psxcounters.o: $(top_builddir)/libpcsxcore/psxcounters.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxcounters.o -MD -MP -MF $(DEPDIR)/psxcounters.Tpo -c -o psxcounters.o `test -f '$(top_builddir)/libpcsxcore/psxcounters.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxcounters.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxcounters.Tpo $(DEPDIR)/psxcounters.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxcounters.c' object='psxcounters.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxcounters.o `test -f '$(top_builddir)/libpcsxcore/psxcounters.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxcounters.c + +psxcounters.obj: $(top_builddir)/libpcsxcore/psxcounters.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxcounters.obj -MD -MP -MF $(DEPDIR)/psxcounters.Tpo -c -o psxcounters.obj `if test -f '$(top_builddir)/libpcsxcore/psxcounters.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxcounters.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxcounters.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxcounters.Tpo $(DEPDIR)/psxcounters.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxcounters.c' object='psxcounters.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxcounters.obj `if test -f '$(top_builddir)/libpcsxcore/psxcounters.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxcounters.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxcounters.c'; fi` + +psxdma.o: $(top_builddir)/libpcsxcore/psxdma.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxdma.o -MD -MP -MF $(DEPDIR)/psxdma.Tpo -c -o psxdma.o `test -f '$(top_builddir)/libpcsxcore/psxdma.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxdma.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxdma.Tpo $(DEPDIR)/psxdma.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxdma.c' object='psxdma.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxdma.o `test -f '$(top_builddir)/libpcsxcore/psxdma.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxdma.c + +psxdma.obj: $(top_builddir)/libpcsxcore/psxdma.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxdma.obj -MD -MP -MF $(DEPDIR)/psxdma.Tpo -c -o psxdma.obj `if test -f '$(top_builddir)/libpcsxcore/psxdma.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxdma.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxdma.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxdma.Tpo $(DEPDIR)/psxdma.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxdma.c' object='psxdma.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxdma.obj `if test -f '$(top_builddir)/libpcsxcore/psxdma.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxdma.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxdma.c'; fi` + +disr3000a.o: $(top_builddir)/libpcsxcore/disr3000a.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT disr3000a.o -MD -MP -MF $(DEPDIR)/disr3000a.Tpo -c -o disr3000a.o `test -f '$(top_builddir)/libpcsxcore/disr3000a.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/disr3000a.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/disr3000a.Tpo $(DEPDIR)/disr3000a.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/disr3000a.c' object='disr3000a.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o disr3000a.o `test -f '$(top_builddir)/libpcsxcore/disr3000a.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/disr3000a.c + +disr3000a.obj: $(top_builddir)/libpcsxcore/disr3000a.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT disr3000a.obj -MD -MP -MF $(DEPDIR)/disr3000a.Tpo -c -o disr3000a.obj `if test -f '$(top_builddir)/libpcsxcore/disr3000a.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/disr3000a.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/disr3000a.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/disr3000a.Tpo $(DEPDIR)/disr3000a.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/disr3000a.c' object='disr3000a.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o disr3000a.obj `if test -f '$(top_builddir)/libpcsxcore/disr3000a.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/disr3000a.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/disr3000a.c'; fi` + +spu.o: $(top_builddir)/libpcsxcore/spu.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spu.o -MD -MP -MF $(DEPDIR)/spu.Tpo -c -o spu.o `test -f '$(top_builddir)/libpcsxcore/spu.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/spu.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/spu.Tpo $(DEPDIR)/spu.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/spu.c' object='spu.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spu.o `test -f '$(top_builddir)/libpcsxcore/spu.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/spu.c + +spu.obj: $(top_builddir)/libpcsxcore/spu.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spu.obj -MD -MP -MF $(DEPDIR)/spu.Tpo -c -o spu.obj `if test -f '$(top_builddir)/libpcsxcore/spu.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/spu.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/spu.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/spu.Tpo $(DEPDIR)/spu.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/spu.c' object='spu.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spu.obj `if test -f '$(top_builddir)/libpcsxcore/spu.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/spu.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/spu.c'; fi` + +sio.o: $(top_builddir)/libpcsxcore/sio.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sio.o -MD -MP -MF $(DEPDIR)/sio.Tpo -c -o sio.o `test -f '$(top_builddir)/libpcsxcore/sio.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/sio.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/sio.Tpo $(DEPDIR)/sio.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/sio.c' object='sio.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sio.o `test -f '$(top_builddir)/libpcsxcore/sio.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/sio.c + +sio.obj: $(top_builddir)/libpcsxcore/sio.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sio.obj -MD -MP -MF $(DEPDIR)/sio.Tpo -c -o sio.obj `if test -f '$(top_builddir)/libpcsxcore/sio.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/sio.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/sio.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/sio.Tpo $(DEPDIR)/sio.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/sio.c' object='sio.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sio.obj `if test -f '$(top_builddir)/libpcsxcore/sio.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/sio.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/sio.c'; fi` + +psxhw.o: $(top_builddir)/libpcsxcore/psxhw.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxhw.o -MD -MP -MF $(DEPDIR)/psxhw.Tpo -c -o psxhw.o `test -f '$(top_builddir)/libpcsxcore/psxhw.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxhw.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxhw.Tpo $(DEPDIR)/psxhw.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxhw.c' object='psxhw.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxhw.o `test -f '$(top_builddir)/libpcsxcore/psxhw.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxhw.c + +psxhw.obj: $(top_builddir)/libpcsxcore/psxhw.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxhw.obj -MD -MP -MF $(DEPDIR)/psxhw.Tpo -c -o psxhw.obj `if test -f '$(top_builddir)/libpcsxcore/psxhw.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxhw.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxhw.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxhw.Tpo $(DEPDIR)/psxhw.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxhw.c' object='psxhw.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxhw.obj `if test -f '$(top_builddir)/libpcsxcore/psxhw.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxhw.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxhw.c'; fi` + +mdec.o: $(top_builddir)/libpcsxcore/mdec.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mdec.o -MD -MP -MF $(DEPDIR)/mdec.Tpo -c -o mdec.o `test -f '$(top_builddir)/libpcsxcore/mdec.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/mdec.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/mdec.Tpo $(DEPDIR)/mdec.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/mdec.c' object='mdec.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mdec.o `test -f '$(top_builddir)/libpcsxcore/mdec.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/mdec.c + +mdec.obj: $(top_builddir)/libpcsxcore/mdec.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mdec.obj -MD -MP -MF $(DEPDIR)/mdec.Tpo -c -o mdec.obj `if test -f '$(top_builddir)/libpcsxcore/mdec.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/mdec.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/mdec.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/mdec.Tpo $(DEPDIR)/mdec.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/mdec.c' object='mdec.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mdec.obj `if test -f '$(top_builddir)/libpcsxcore/mdec.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/mdec.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/mdec.c'; fi` + +psxmem.o: $(top_builddir)/libpcsxcore/psxmem.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxmem.o -MD -MP -MF $(DEPDIR)/psxmem.Tpo -c -o psxmem.o `test -f '$(top_builddir)/libpcsxcore/psxmem.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxmem.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxmem.Tpo $(DEPDIR)/psxmem.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxmem.c' object='psxmem.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxmem.o `test -f '$(top_builddir)/libpcsxcore/psxmem.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxmem.c + +psxmem.obj: $(top_builddir)/libpcsxcore/psxmem.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxmem.obj -MD -MP -MF $(DEPDIR)/psxmem.Tpo -c -o psxmem.obj `if test -f '$(top_builddir)/libpcsxcore/psxmem.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxmem.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxmem.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxmem.Tpo $(DEPDIR)/psxmem.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxmem.c' object='psxmem.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxmem.obj `if test -f '$(top_builddir)/libpcsxcore/psxmem.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxmem.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxmem.c'; fi` + +misc.o: $(top_builddir)/libpcsxcore/misc.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT misc.o -MD -MP -MF $(DEPDIR)/misc.Tpo -c -o misc.o `test -f '$(top_builddir)/libpcsxcore/misc.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/misc.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/misc.Tpo $(DEPDIR)/misc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/misc.c' object='misc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o misc.o `test -f '$(top_builddir)/libpcsxcore/misc.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/misc.c + +misc.obj: $(top_builddir)/libpcsxcore/misc.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT misc.obj -MD -MP -MF $(DEPDIR)/misc.Tpo -c -o misc.obj `if test -f '$(top_builddir)/libpcsxcore/misc.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/misc.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/misc.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/misc.Tpo $(DEPDIR)/misc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/misc.c' object='misc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o misc.obj `if test -f '$(top_builddir)/libpcsxcore/misc.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/misc.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/misc.c'; fi` + +plugins.o: $(top_builddir)/libpcsxcore/plugins.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plugins.o -MD -MP -MF $(DEPDIR)/plugins.Tpo -c -o plugins.o `test -f '$(top_builddir)/libpcsxcore/plugins.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/plugins.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/plugins.Tpo $(DEPDIR)/plugins.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/plugins.c' object='plugins.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plugins.o `test -f '$(top_builddir)/libpcsxcore/plugins.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/plugins.c + +plugins.obj: $(top_builddir)/libpcsxcore/plugins.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plugins.obj -MD -MP -MF $(DEPDIR)/plugins.Tpo -c -o plugins.obj `if test -f '$(top_builddir)/libpcsxcore/plugins.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/plugins.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/plugins.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/plugins.Tpo $(DEPDIR)/plugins.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/plugins.c' object='plugins.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plugins.obj `if test -f '$(top_builddir)/libpcsxcore/plugins.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/plugins.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/plugins.c'; fi` + +decode_xa.o: $(top_builddir)/libpcsxcore/decode_xa.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT decode_xa.o -MD -MP -MF $(DEPDIR)/decode_xa.Tpo -c -o decode_xa.o `test -f '$(top_builddir)/libpcsxcore/decode_xa.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/decode_xa.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/decode_xa.Tpo $(DEPDIR)/decode_xa.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/decode_xa.c' object='decode_xa.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o decode_xa.o `test -f '$(top_builddir)/libpcsxcore/decode_xa.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/decode_xa.c + +decode_xa.obj: $(top_builddir)/libpcsxcore/decode_xa.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT decode_xa.obj -MD -MP -MF $(DEPDIR)/decode_xa.Tpo -c -o decode_xa.obj `if test -f '$(top_builddir)/libpcsxcore/decode_xa.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/decode_xa.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/decode_xa.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/decode_xa.Tpo $(DEPDIR)/decode_xa.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/decode_xa.c' object='decode_xa.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o decode_xa.obj `if test -f '$(top_builddir)/libpcsxcore/decode_xa.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/decode_xa.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/decode_xa.c'; fi` + +r3000a.o: $(top_builddir)/libpcsxcore/r3000a.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT r3000a.o -MD -MP -MF $(DEPDIR)/r3000a.Tpo -c -o r3000a.o `test -f '$(top_builddir)/libpcsxcore/r3000a.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/r3000a.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/r3000a.Tpo $(DEPDIR)/r3000a.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/r3000a.c' object='r3000a.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o r3000a.o `test -f '$(top_builddir)/libpcsxcore/r3000a.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/r3000a.c + +r3000a.obj: $(top_builddir)/libpcsxcore/r3000a.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT r3000a.obj -MD -MP -MF $(DEPDIR)/r3000a.Tpo -c -o r3000a.obj `if test -f '$(top_builddir)/libpcsxcore/r3000a.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/r3000a.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/r3000a.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/r3000a.Tpo $(DEPDIR)/r3000a.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/r3000a.c' object='r3000a.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o r3000a.obj `if test -f '$(top_builddir)/libpcsxcore/r3000a.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/r3000a.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/r3000a.c'; fi` + +psxinterpreter.o: $(top_builddir)/libpcsxcore/psxinterpreter.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxinterpreter.o -MD -MP -MF $(DEPDIR)/psxinterpreter.Tpo -c -o psxinterpreter.o `test -f '$(top_builddir)/libpcsxcore/psxinterpreter.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxinterpreter.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxinterpreter.Tpo $(DEPDIR)/psxinterpreter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxinterpreter.c' object='psxinterpreter.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxinterpreter.o `test -f '$(top_builddir)/libpcsxcore/psxinterpreter.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxinterpreter.c + +psxinterpreter.obj: $(top_builddir)/libpcsxcore/psxinterpreter.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxinterpreter.obj -MD -MP -MF $(DEPDIR)/psxinterpreter.Tpo -c -o psxinterpreter.obj `if test -f '$(top_builddir)/libpcsxcore/psxinterpreter.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxinterpreter.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxinterpreter.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxinterpreter.Tpo $(DEPDIR)/psxinterpreter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxinterpreter.c' object='psxinterpreter.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxinterpreter.obj `if test -f '$(top_builddir)/libpcsxcore/psxinterpreter.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxinterpreter.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxinterpreter.c'; fi` + +gte.o: $(top_builddir)/libpcsxcore/gte.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gte.o -MD -MP -MF $(DEPDIR)/gte.Tpo -c -o gte.o `test -f '$(top_builddir)/libpcsxcore/gte.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/gte.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/gte.Tpo $(DEPDIR)/gte.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/gte.c' object='gte.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gte.o `test -f '$(top_builddir)/libpcsxcore/gte.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/gte.c + +gte.obj: $(top_builddir)/libpcsxcore/gte.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gte.obj -MD -MP -MF $(DEPDIR)/gte.Tpo -c -o gte.obj `if test -f '$(top_builddir)/libpcsxcore/gte.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/gte.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/gte.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/gte.Tpo $(DEPDIR)/gte.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/gte.c' object='gte.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gte.obj `if test -f '$(top_builddir)/libpcsxcore/gte.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/gte.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/gte.c'; fi` + +psxhle.o: $(top_builddir)/libpcsxcore/psxhle.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxhle.o -MD -MP -MF $(DEPDIR)/psxhle.Tpo -c -o psxhle.o `test -f '$(top_builddir)/libpcsxcore/psxhle.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxhle.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxhle.Tpo $(DEPDIR)/psxhle.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxhle.c' object='psxhle.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxhle.o `test -f '$(top_builddir)/libpcsxcore/psxhle.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxhle.c + +psxhle.obj: $(top_builddir)/libpcsxcore/psxhle.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxhle.obj -MD -MP -MF $(DEPDIR)/psxhle.Tpo -c -o psxhle.obj `if test -f '$(top_builddir)/libpcsxcore/psxhle.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxhle.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxhle.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxhle.Tpo $(DEPDIR)/psxhle.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxhle.c' object='psxhle.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxhle.obj `if test -f '$(top_builddir)/libpcsxcore/psxhle.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxhle.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxhle.c'; fi` + +debug.o: $(top_builddir)/libpcsxcore/debug.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT debug.o -MD -MP -MF $(DEPDIR)/debug.Tpo -c -o debug.o `test -f '$(top_builddir)/libpcsxcore/debug.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/debug.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/debug.Tpo $(DEPDIR)/debug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/debug.c' object='debug.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o debug.o `test -f '$(top_builddir)/libpcsxcore/debug.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/debug.c + +debug.obj: $(top_builddir)/libpcsxcore/debug.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT debug.obj -MD -MP -MF $(DEPDIR)/debug.Tpo -c -o debug.obj `if test -f '$(top_builddir)/libpcsxcore/debug.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/debug.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/debug.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/debug.Tpo $(DEPDIR)/debug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/debug.c' object='debug.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o debug.obj `if test -f '$(top_builddir)/libpcsxcore/debug.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/debug.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/debug.c'; fi` + +psxcommon.o: $(top_builddir)/libpcsxcore/psxcommon.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxcommon.o -MD -MP -MF $(DEPDIR)/psxcommon.Tpo -c -o psxcommon.o `test -f '$(top_builddir)/libpcsxcore/psxcommon.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxcommon.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxcommon.Tpo $(DEPDIR)/psxcommon.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxcommon.c' object='psxcommon.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxcommon.o `test -f '$(top_builddir)/libpcsxcore/psxcommon.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/psxcommon.c + +psxcommon.obj: $(top_builddir)/libpcsxcore/psxcommon.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT psxcommon.obj -MD -MP -MF $(DEPDIR)/psxcommon.Tpo -c -o psxcommon.obj `if test -f '$(top_builddir)/libpcsxcore/psxcommon.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxcommon.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxcommon.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/psxcommon.Tpo $(DEPDIR)/psxcommon.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/psxcommon.c' object='psxcommon.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxcommon.obj `if test -f '$(top_builddir)/libpcsxcore/psxcommon.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxcommon.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxcommon.c'; fi` + +cdriso.o: $(top_builddir)/libpcsxcore/cdriso.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cdriso.o -MD -MP -MF $(DEPDIR)/cdriso.Tpo -c -o cdriso.o `test -f '$(top_builddir)/libpcsxcore/cdriso.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/cdriso.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/cdriso.Tpo $(DEPDIR)/cdriso.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/cdriso.c' object='cdriso.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cdriso.o `test -f '$(top_builddir)/libpcsxcore/cdriso.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/cdriso.c + +cdriso.obj: $(top_builddir)/libpcsxcore/cdriso.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cdriso.obj -MD -MP -MF $(DEPDIR)/cdriso.Tpo -c -o cdriso.obj `if test -f '$(top_builddir)/libpcsxcore/cdriso.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/cdriso.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/cdriso.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/cdriso.Tpo $(DEPDIR)/cdriso.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/cdriso.c' object='cdriso.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cdriso.obj `if test -f '$(top_builddir)/libpcsxcore/cdriso.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/cdriso.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/cdriso.c'; fi` + +cheat.o: $(top_builddir)/libpcsxcore/cheat.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cheat.o -MD -MP -MF $(DEPDIR)/cheat.Tpo -c -o cheat.o `test -f '$(top_builddir)/libpcsxcore/cheat.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/cheat.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/cheat.Tpo $(DEPDIR)/cheat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/cheat.c' object='cheat.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cheat.o `test -f '$(top_builddir)/libpcsxcore/cheat.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/cheat.c + +cheat.obj: $(top_builddir)/libpcsxcore/cheat.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cheat.obj -MD -MP -MF $(DEPDIR)/cheat.Tpo -c -o cheat.obj `if test -f '$(top_builddir)/libpcsxcore/cheat.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/cheat.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/cheat.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/cheat.Tpo $(DEPDIR)/cheat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/cheat.c' object='cheat.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cheat.obj `if test -f '$(top_builddir)/libpcsxcore/cheat.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/cheat.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/cheat.c'; fi` + +socket.o: $(top_builddir)/libpcsxcore/socket.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT socket.o -MD -MP -MF $(DEPDIR)/socket.Tpo -c -o socket.o `test -f '$(top_builddir)/libpcsxcore/socket.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/socket.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/socket.Tpo $(DEPDIR)/socket.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/socket.c' object='socket.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o socket.o `test -f '$(top_builddir)/libpcsxcore/socket.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/socket.c + +socket.obj: $(top_builddir)/libpcsxcore/socket.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT socket.obj -MD -MP -MF $(DEPDIR)/socket.Tpo -c -o socket.obj `if test -f '$(top_builddir)/libpcsxcore/socket.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/socket.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/socket.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/socket.Tpo $(DEPDIR)/socket.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/socket.c' object='socket.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o socket.obj `if test -f '$(top_builddir)/libpcsxcore/socket.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/socket.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/socket.c'; fi` + +ppf.o: $(top_builddir)/libpcsxcore/ppf.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ppf.o -MD -MP -MF $(DEPDIR)/ppf.Tpo -c -o ppf.o `test -f '$(top_builddir)/libpcsxcore/ppf.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ppf.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ppf.Tpo $(DEPDIR)/ppf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ppf.c' object='ppf.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ppf.o `test -f '$(top_builddir)/libpcsxcore/ppf.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ppf.c + +ppf.obj: $(top_builddir)/libpcsxcore/ppf.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ppf.obj -MD -MP -MF $(DEPDIR)/ppf.Tpo -c -o ppf.obj `if test -f '$(top_builddir)/libpcsxcore/ppf.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ppf.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ppf.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ppf.Tpo $(DEPDIR)/ppf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ppf.c' object='ppf.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ppf.obj `if test -f '$(top_builddir)/libpcsxcore/ppf.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ppf.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ppf.c'; fi` + +iR3000A-64.o: $(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iR3000A-64.o -MD -MP -MF $(DEPDIR)/iR3000A-64.Tpo -c -o iR3000A-64.o `test -f '$(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/iR3000A-64.Tpo $(DEPDIR)/iR3000A-64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c' object='iR3000A-64.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iR3000A-64.o `test -f '$(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c + +iR3000A-64.obj: $(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iR3000A-64.obj -MD -MP -MF $(DEPDIR)/iR3000A-64.Tpo -c -o iR3000A-64.obj `if test -f '$(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/iR3000A-64.Tpo $(DEPDIR)/iR3000A-64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c' object='iR3000A-64.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iR3000A-64.obj `if test -f '$(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c'; fi` + +ix86-64.o: $(top_builddir)/libpcsxcore/ix86_64/ix86-64.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ix86-64.o -MD -MP -MF $(DEPDIR)/ix86-64.Tpo -c -o ix86-64.o `test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86-64.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86_64/ix86-64.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ix86-64.Tpo $(DEPDIR)/ix86-64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86_64/ix86-64.c' object='ix86-64.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ix86-64.o `test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86-64.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86_64/ix86-64.c + +ix86-64.obj: $(top_builddir)/libpcsxcore/ix86_64/ix86-64.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ix86-64.obj -MD -MP -MF $(DEPDIR)/ix86-64.Tpo -c -o ix86-64.obj `if test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86-64.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86_64/ix86-64.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86_64/ix86-64.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ix86-64.Tpo $(DEPDIR)/ix86-64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86_64/ix86-64.c' object='ix86-64.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ix86-64.obj `if test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86-64.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86_64/ix86-64.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86_64/ix86-64.c'; fi` + +ix86_cpudetect.o: $(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ix86_cpudetect.o -MD -MP -MF $(DEPDIR)/ix86_cpudetect.Tpo -c -o ix86_cpudetect.o `test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ix86_cpudetect.Tpo $(DEPDIR)/ix86_cpudetect.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c' object='ix86_cpudetect.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ix86_cpudetect.o `test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c + +ix86_cpudetect.obj: $(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ix86_cpudetect.obj -MD -MP -MF $(DEPDIR)/ix86_cpudetect.Tpo -c -o ix86_cpudetect.obj `if test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ix86_cpudetect.Tpo $(DEPDIR)/ix86_cpudetect.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c' object='ix86_cpudetect.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ix86_cpudetect.obj `if test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c'; fi` + +ix86_fpu.o: $(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ix86_fpu.o -MD -MP -MF $(DEPDIR)/ix86_fpu.Tpo -c -o ix86_fpu.o `test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ix86_fpu.Tpo $(DEPDIR)/ix86_fpu.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c' object='ix86_fpu.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ix86_fpu.o `test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c + +ix86_fpu.obj: $(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ix86_fpu.obj -MD -MP -MF $(DEPDIR)/ix86_fpu.Tpo -c -o ix86_fpu.obj `if test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ix86_fpu.Tpo $(DEPDIR)/ix86_fpu.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c' object='ix86_fpu.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ix86_fpu.obj `if test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86_64/ix86_fpu.c'; fi` + +ix86_3dnow.o: $(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ix86_3dnow.o -MD -MP -MF $(DEPDIR)/ix86_3dnow.Tpo -c -o ix86_3dnow.o `test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ix86_3dnow.Tpo $(DEPDIR)/ix86_3dnow.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c' object='ix86_3dnow.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ix86_3dnow.o `test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c + +ix86_3dnow.obj: $(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ix86_3dnow.obj -MD -MP -MF $(DEPDIR)/ix86_3dnow.Tpo -c -o ix86_3dnow.obj `if test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ix86_3dnow.Tpo $(DEPDIR)/ix86_3dnow.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c' object='ix86_3dnow.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ix86_3dnow.obj `if test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86_64/ix86_3dnow.c'; fi` + +ix86_mmx.o: $(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ix86_mmx.o -MD -MP -MF $(DEPDIR)/ix86_mmx.Tpo -c -o ix86_mmx.o `test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ix86_mmx.Tpo $(DEPDIR)/ix86_mmx.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c' object='ix86_mmx.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ix86_mmx.o `test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c + +ix86_mmx.obj: $(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ix86_mmx.obj -MD -MP -MF $(DEPDIR)/ix86_mmx.Tpo -c -o ix86_mmx.obj `if test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ix86_mmx.Tpo $(DEPDIR)/ix86_mmx.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c' object='ix86_mmx.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ix86_mmx.obj `if test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86_64/ix86_mmx.c'; fi` + +ix86_sse.o: $(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ix86_sse.o -MD -MP -MF $(DEPDIR)/ix86_sse.Tpo -c -o ix86_sse.o `test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ix86_sse.Tpo $(DEPDIR)/ix86_sse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c' object='ix86_sse.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ix86_sse.o `test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c + +ix86_sse.obj: $(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ix86_sse.obj -MD -MP -MF $(DEPDIR)/ix86_sse.Tpo -c -o ix86_sse.obj `if test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ix86_sse.Tpo $(DEPDIR)/ix86_sse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c' object='ix86_sse.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ix86_sse.obj `if test -f '$(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86_64/ix86_sse.c'; fi` + +iR3000A.o: $(top_builddir)/libpcsxcore/ix86/iR3000A.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iR3000A.o -MD -MP -MF $(DEPDIR)/iR3000A.Tpo -c -o iR3000A.o `test -f '$(top_builddir)/libpcsxcore/ix86/iR3000A.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86/iR3000A.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/iR3000A.Tpo $(DEPDIR)/iR3000A.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86/iR3000A.c' object='iR3000A.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iR3000A.o `test -f '$(top_builddir)/libpcsxcore/ix86/iR3000A.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86/iR3000A.c + +iR3000A.obj: $(top_builddir)/libpcsxcore/ix86/iR3000A.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iR3000A.obj -MD -MP -MF $(DEPDIR)/iR3000A.Tpo -c -o iR3000A.obj `if test -f '$(top_builddir)/libpcsxcore/ix86/iR3000A.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86/iR3000A.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86/iR3000A.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/iR3000A.Tpo $(DEPDIR)/iR3000A.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86/iR3000A.c' object='iR3000A.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iR3000A.obj `if test -f '$(top_builddir)/libpcsxcore/ix86/iR3000A.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86/iR3000A.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86/iR3000A.c'; fi` + +ix86.o: $(top_builddir)/libpcsxcore/ix86/ix86.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ix86.o -MD -MP -MF $(DEPDIR)/ix86.Tpo -c -o ix86.o `test -f '$(top_builddir)/libpcsxcore/ix86/ix86.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86/ix86.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ix86.Tpo $(DEPDIR)/ix86.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86/ix86.c' object='ix86.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ix86.o `test -f '$(top_builddir)/libpcsxcore/ix86/ix86.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86/ix86.c + +ix86.obj: $(top_builddir)/libpcsxcore/ix86/ix86.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ix86.obj -MD -MP -MF $(DEPDIR)/ix86.Tpo -c -o ix86.obj `if test -f '$(top_builddir)/libpcsxcore/ix86/ix86.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86/ix86.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86/ix86.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ix86.Tpo $(DEPDIR)/ix86.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ix86/ix86.c' object='ix86.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ix86.obj `if test -f '$(top_builddir)/libpcsxcore/ix86/ix86.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ix86/ix86.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ix86/ix86.c'; fi` + +pR3000A.o: $(top_builddir)/libpcsxcore/ppc/pR3000A.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pR3000A.o -MD -MP -MF $(DEPDIR)/pR3000A.Tpo -c -o pR3000A.o `test -f '$(top_builddir)/libpcsxcore/ppc/pR3000A.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ppc/pR3000A.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/pR3000A.Tpo $(DEPDIR)/pR3000A.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ppc/pR3000A.c' object='pR3000A.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pR3000A.o `test -f '$(top_builddir)/libpcsxcore/ppc/pR3000A.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ppc/pR3000A.c + +pR3000A.obj: $(top_builddir)/libpcsxcore/ppc/pR3000A.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pR3000A.obj -MD -MP -MF $(DEPDIR)/pR3000A.Tpo -c -o pR3000A.obj `if test -f '$(top_builddir)/libpcsxcore/ppc/pR3000A.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ppc/pR3000A.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ppc/pR3000A.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/pR3000A.Tpo $(DEPDIR)/pR3000A.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ppc/pR3000A.c' object='pR3000A.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pR3000A.obj `if test -f '$(top_builddir)/libpcsxcore/ppc/pR3000A.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ppc/pR3000A.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ppc/pR3000A.c'; fi` + +ppc.o: $(top_builddir)/libpcsxcore/ppc/ppc.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ppc.o -MD -MP -MF $(DEPDIR)/ppc.Tpo -c -o ppc.o `test -f '$(top_builddir)/libpcsxcore/ppc/ppc.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ppc/ppc.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ppc.Tpo $(DEPDIR)/ppc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ppc/ppc.c' object='ppc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ppc.o `test -f '$(top_builddir)/libpcsxcore/ppc/ppc.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ppc/ppc.c + +ppc.obj: $(top_builddir)/libpcsxcore/ppc/ppc.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ppc.obj -MD -MP -MF $(DEPDIR)/ppc.Tpo -c -o ppc.obj `if test -f '$(top_builddir)/libpcsxcore/ppc/ppc.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ppc/ppc.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ppc/ppc.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/ppc.Tpo $(DEPDIR)/ppc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ppc/ppc.c' object='ppc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ppc.obj `if test -f '$(top_builddir)/libpcsxcore/ppc/ppc.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ppc/ppc.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ppc/ppc.c'; fi` + +reguse.o: $(top_builddir)/libpcsxcore/ppc/reguse.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT reguse.o -MD -MP -MF $(DEPDIR)/reguse.Tpo -c -o reguse.o `test -f '$(top_builddir)/libpcsxcore/ppc/reguse.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ppc/reguse.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/reguse.Tpo $(DEPDIR)/reguse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ppc/reguse.c' object='reguse.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o reguse.o `test -f '$(top_builddir)/libpcsxcore/ppc/reguse.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ppc/reguse.c + +reguse.obj: $(top_builddir)/libpcsxcore/ppc/reguse.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT reguse.obj -MD -MP -MF $(DEPDIR)/reguse.Tpo -c -o reguse.obj `if test -f '$(top_builddir)/libpcsxcore/ppc/reguse.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ppc/reguse.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ppc/reguse.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/reguse.Tpo $(DEPDIR)/reguse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/ppc/reguse.c' object='reguse.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o reguse.obj `if test -f '$(top_builddir)/libpcsxcore/ppc/reguse.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ppc/reguse.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ppc/reguse.c'; fi` + +.s.o: + $(CCASCOMPILE) -c -o $@ $< + +.s.obj: + $(CCASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.s.lo: + $(LTCCASCOMPILE) -c -o $@ $< + +libpcsxcore_a-pasm.o: $(top_builddir)/libpcsxcore/ppc/pasm.s + $(CCAS) $(libpcsxcore_a_CCASFLAGS) $(CCASFLAGS) -c -o libpcsxcore_a-pasm.o `test -f '$(top_builddir)/libpcsxcore/ppc/pasm.s' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ppc/pasm.s + +libpcsxcore_a-pasm.obj: $(top_builddir)/libpcsxcore/ppc/pasm.s + $(CCAS) $(libpcsxcore_a_CCASFLAGS) $(CCASFLAGS) -c -o libpcsxcore_a-pasm.obj `if test -f '$(top_builddir)/libpcsxcore/ppc/pasm.s'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/ppc/pasm.s'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/ppc/pasm.s'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-exec-am: + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: install-ps-am + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libpcsxcore/cdriso.c b/libpcsxcore/cdriso.c new file mode 100644 index 0000000..18b0de9 --- /dev/null +++ b/libpcsxcore/cdriso.c @@ -0,0 +1,881 @@ +/*************************************************************************** + * Copyright (C) 2007 PCSX-df Team * + * Copyright (C) 2009 Wei Mingzhi * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#include "psxcommon.h" +#include "plugins.h" +#include "cdrom.h" +#include "cdriso.h" + +#ifdef _WIN32 +#include +#include +#else +#include +#include +#endif + +static FILE *cdHandle = NULL; +static FILE *cddaHandle = NULL; +static FILE *subHandle = NULL; + +static boolean subChanMixed = FALSE; +static boolean subChanRaw = FALSE; + +static unsigned char cdbuffer[DATA_SIZE]; +static unsigned char subbuffer[SUB_FRAMESIZE]; + +static unsigned char sndbuffer[CD_FRAMESIZE_RAW * 10]; + +#define CDDA_FRAMETIME (1000 * (sizeof(sndbuffer) / CD_FRAMESIZE_RAW) / 75) + +#ifdef _WIN32 +static HANDLE threadid; +#else +static pthread_t threadid; +#endif +static unsigned int initial_offset = 0; +static volatile boolean playing = FALSE; +static boolean cddaBigEndian = FALSE; +static volatile unsigned int cddaCurOffset = 0; + +char* CALLBACK CDR__getDriveLetter(void); +long CALLBACK CDR__configure(void); +long CALLBACK CDR__test(void); +void CALLBACK CDR__about(void); +long CALLBACK CDR__setfilename(char *filename); +long CALLBACK CDR__getStatus(struct CdrStat *stat); + +extern void *hCDRDriver; + +struct trackinfo { + enum {DATA, CDDA} type; + char start[3]; // MSF-format + char length[3]; // MSF-format +}; + +#define MAXTRACKS 100 /* How many tracks can a CD hold? */ + +static int numtracks = 0; +static struct trackinfo ti[MAXTRACKS]; + +// get a sector from a msf-array +static unsigned int msf2sec(char *msf) { + return ((msf[0] * 60 + msf[1]) * 75) + msf[2]; +} + +static void sec2msf(unsigned int s, char *msf) { + msf[0] = s / 75 / 60; + s = s - msf[0] * 75 * 60; + msf[1] = s / 75; + s = s - msf[1] * 75; + msf[2] = s; +} + +// divide a string of xx:yy:zz into m, s, f +static void tok2msf(char *time, char *msf) { + char *token; + + token = strtok(time, ":"); + if (token) { + msf[0] = atoi(token); + } + else { + msf[0] = 0; + } + + token = strtok(NULL, ":"); + if (token) { + msf[1] = atoi(token); + } + else { + msf[1] = 0; + } + + token = strtok(NULL, ":"); + if (token) { + msf[2] = atoi(token); + } + else { + msf[2] = 0; + } +} + +#ifndef _WIN32 +static long GetTickCount(void) { + static time_t initial_time = 0; + struct timeval now; + + gettimeofday(&now, NULL); + + if (initial_time == 0) { + initial_time = now.tv_sec; + } + + return (now.tv_sec - initial_time) * 1000L + now.tv_usec / 1000L; +} +#endif + +// this thread plays audio data +#ifdef _WIN32 +static void playthread(void *param) +#else +static void *playthread(void *param) +#endif +{ + long d, t, i, s; + unsigned char tmp; + + t = GetTickCount(); + + while (playing) { + d = t - (long)GetTickCount(); + if (d <= 0) { + d = 1; + } + else if (d > CDDA_FRAMETIME) { + d = CDDA_FRAMETIME; + } +#ifdef _WIN32 + Sleep(d); +#else + usleep(d * 1000); +#endif + + t = GetTickCount() + CDDA_FRAMETIME; + + if (subChanMixed) { + s = 0; + + for (i = 0; i < sizeof(sndbuffer) / CD_FRAMESIZE_RAW; i++) { + // read one sector + d = fread(sndbuffer + CD_FRAMESIZE_RAW * i, 1, CD_FRAMESIZE_RAW, cddaHandle); + if (d < CD_FRAMESIZE_RAW) { + break; + } + + s += d; + + // skip the subchannel data + fseek(cddaHandle, SUB_FRAMESIZE, SEEK_CUR); + } + } + else { + s = fread(sndbuffer, 1, sizeof(sndbuffer), cddaHandle); + } + + if (s == 0) { + playing = FALSE; + fclose(cddaHandle); + cddaHandle = NULL; + initial_offset = 0; + break; + } + + if (!cdr.Muted && playing) { + if (cddaBigEndian) { + for (i = 0; i < s / 2; i++) { + tmp = sndbuffer[i * 2]; + sndbuffer[i * 2] = sndbuffer[i * 2 + 1]; + sndbuffer[i * 2 + 1] = tmp; + } + } + + SPU_playCDDAchannel((short *)sndbuffer, s); + } + + cddaCurOffset += s; + } + +#ifdef _WIN32 + _endthread(); +#else + pthread_exit(0); + return NULL; +#endif +} + +// stop the CDDA playback +static void stopCDDA() { + if (!playing) { + return; + } + + playing = FALSE; +#ifdef _WIN32 + WaitForSingleObject(threadid, INFINITE); +#else + pthread_join(threadid, NULL); +#endif + + if (cddaHandle != NULL) { + fclose(cddaHandle); + cddaHandle = NULL; + } + + initial_offset = 0; +} + +// start the CDDA playback +static void startCDDA(unsigned int offset) { + if (playing) { + if (initial_offset == offset) { + return; + } + stopCDDA(); + } + + cddaHandle = fopen(GetIsoFile(), "rb"); + if (cddaHandle == NULL) { + return; + } + + initial_offset = offset; + cddaCurOffset = initial_offset; + fseek(cddaHandle, initial_offset, SEEK_SET); + + playing = TRUE; + +#ifdef _WIN32 + threadid = (HANDLE)_beginthread(playthread, 0, NULL); +#else + pthread_create(&threadid, NULL, playthread, NULL); +#endif +} + +// this function tries to get the .toc file of the given .bin +// the necessary data is put into the ti (trackinformation)-array +static int parsetoc(const char *isofile) { + char tocname[MAXPATHLEN]; + FILE *fi; + char linebuf[256], dummy[256], name[256]; + char *token; + char time[20], time2[20]; + unsigned int t; + + numtracks = 0; + + // copy name of the iso and change extension from .bin to .toc + strncpy(tocname, isofile, sizeof(tocname)); + tocname[MAXPATHLEN - 1] = '\0'; + if (strlen(tocname) >= 4) { + strcpy(tocname + strlen(tocname) - 4, ".toc"); + } + else { + return -1; + } + + if ((fi = fopen(tocname, "r")) == NULL) { + // try changing extension to .cue (to satisfy some stupid tutorials) + strcpy(tocname + strlen(tocname) - 4, ".cue"); + if ((fi = fopen(tocname, "r")) == NULL) { + // if filename is image.toc.bin, try removing .bin (for Brasero) + strcpy(tocname, isofile); + t = strlen(tocname); + if (t >= 8 && strcmp(tocname + t - 8, ".toc.bin") == 0) { + tocname[t - 4] = '\0'; + if ((fi = fopen(tocname, "r")) == NULL) { + return -1; + } + } + else { + return -1; + } + } + } + + memset(&ti, 0, sizeof(ti)); + cddaBigEndian = TRUE; // cdrdao uses big-endian for CD Audio + + // parse the .toc file + while (fgets(linebuf, sizeof(linebuf), fi) != NULL) { + // search for tracks + strncpy(dummy, linebuf, sizeof(linebuf)); + token = strtok(dummy, " "); + + if (token == NULL) continue; + + if (!strcmp(token, "TRACK")) { + // get type of track + token = strtok(NULL, " "); + numtracks++; + + if (!strncmp(token, "MODE2_RAW", 9)) { + ti[numtracks].type = DATA; + sec2msf(2 * 75, ti[numtracks].start); // assume data track on 0:2:0 + + // check if this image contains mixed subchannel data + token = strtok(NULL, " "); + if (token != NULL && !strncmp(token, "RW_RAW", 6)) { + subChanMixed = TRUE; + subChanRaw = TRUE; + } + } + else if (!strncmp(token, "AUDIO", 5)) { + ti[numtracks].type = CDDA; + } + } + else if (!strcmp(token, "DATAFILE")) { + if (ti[numtracks].type == CDDA) { + sscanf(linebuf, "DATAFILE \"%[^\"]\" #%d %8s", name, &t, time2); + t /= CD_FRAMESIZE_RAW + (subChanMixed ? SUB_FRAMESIZE : 0); + t += 2 * 75; + sec2msf(t, (char *)&ti[numtracks].start); + tok2msf((char *)&time2, (char *)&ti[numtracks].length); + } + else { + sscanf(linebuf, "DATAFILE \"%[^\"]\" %8s", name, time); + tok2msf((char *)&time, (char *)&ti[numtracks].length); + } + } + else if (!strcmp(token, "FILE")) { + sscanf(linebuf, "FILE \"%[^\"]\" #%d %8s %8s", name, &t, time, time2); + tok2msf((char *)&time, (char *)&ti[numtracks].start); + t /= CD_FRAMESIZE_RAW + (subChanMixed ? SUB_FRAMESIZE : 0); + t += msf2sec(ti[numtracks].start) + 2 * 75; + sec2msf(t, (char *)&ti[numtracks].start); + tok2msf((char *)&time2, (char *)&ti[numtracks].length); + } + } + + fclose(fi); + + return 0; +} + +// this function tries to get the .cue file of the given .bin +// the necessary data is put into the ti (trackinformation)-array +static int parsecue(const char *isofile) { + char cuename[MAXPATHLEN]; + FILE *fi; + char *token; + char time[20]; + char *tmp; + char linebuf[256], dummy[256]; + unsigned int t; + + numtracks = 0; + + // copy name of the iso and change extension from .bin to .cue + strncpy(cuename, isofile, sizeof(cuename)); + cuename[MAXPATHLEN - 1] = '\0'; + if (strlen(cuename) >= 4) { + strcpy(cuename + strlen(cuename) - 4, ".cue"); + } + else { + return -1; + } + + if ((fi = fopen(cuename, "r")) == NULL) { + return -1; + } + + // Some stupid tutorials wrongly tell users to use cdrdao to rip a + // "bin/cue" image, which is in fact a "bin/toc" image. So let's check + // that... + if (fgets(linebuf, sizeof(linebuf), fi) != NULL) { + if (!strncmp(linebuf, "CD_ROM_XA", 9)) { + // Don't proceed further, as this is actually a .toc file rather + // than a .cue file. + fclose(fi); + return parsetoc(isofile); + } + fseek(fi, 0, SEEK_SET); + } + + memset(&ti, 0, sizeof(ti)); + + while (fgets(linebuf, sizeof(linebuf), fi) != NULL) { + strncpy(dummy, linebuf, sizeof(linebuf)); + token = strtok(dummy, " "); + + if (token == NULL) { + continue; + } + + if (!strcmp(token, "TRACK")){ + numtracks++; + + if (strstr(linebuf, "AUDIO") != NULL) { + ti[numtracks].type = CDDA; + } + else if (strstr(linebuf, "MODE1/2352") != NULL || strstr(linebuf, "MODE2/2352") != NULL) { + ti[numtracks].type = DATA; + } + } + else if (!strcmp(token, "INDEX")) { + tmp = strstr(linebuf, "INDEX"); + if (tmp != NULL) { + tmp += strlen("INDEX") + 3; // 3 - space + numeric index + while (*tmp == ' ') tmp++; + if (*tmp != '\n') sscanf(tmp, "%8s", time); + } + + tok2msf((char *)&time, (char *)&ti[numtracks].start); + + t = msf2sec(ti[numtracks].start) + 2 * 75; + sec2msf(t, ti[numtracks].start); + + // If we've already seen another track, this is its end + if (numtracks > 1) { + t = msf2sec(ti[numtracks].start) - msf2sec(ti[numtracks - 1].start); + sec2msf(t, ti[numtracks - 1].length); + } + } + } + + fclose(fi); + + // Fill out the last track's end based on size + if (numtracks >= 1) { + fseek(cdHandle, 0, SEEK_END); + t = ftell(cdHandle) / 2352 - msf2sec(ti[numtracks].start) + 2 * 75; + sec2msf(t, ti[numtracks].length); + } + + return 0; +} + +// this function tries to get the .ccd file of the given .img +// the necessary data is put into the ti (trackinformation)-array +static int parseccd(const char *isofile) { + char ccdname[MAXPATHLEN]; + FILE *fi; + char linebuf[256]; + unsigned int t; + + numtracks = 0; + + // copy name of the iso and change extension from .img to .ccd + strncpy(ccdname, isofile, sizeof(ccdname)); + ccdname[MAXPATHLEN - 1] = '\0'; + if (strlen(ccdname) >= 4) { + strcpy(ccdname + strlen(ccdname) - 4, ".ccd"); + } + else { + return -1; + } + + if ((fi = fopen(ccdname, "r")) == NULL) { + return -1; + } + + memset(&ti, 0, sizeof(ti)); + + while (fgets(linebuf, sizeof(linebuf), fi) != NULL) { + if (!strncmp(linebuf, "[TRACK", 6)){ + numtracks++; + } + else if (!strncmp(linebuf, "MODE=", 5)) { + sscanf(linebuf, "MODE=%d", &t); + ti[numtracks].type = ((t == 0) ? CDDA : DATA); + } + else if (!strncmp(linebuf, "INDEX 1=", 8)) { + sscanf(linebuf, "INDEX 1=%d", &t); + sec2msf(t + 2 * 75, ti[numtracks].start); + + // If we've already seen another track, this is its end + if (numtracks > 1) { + t = msf2sec(ti[numtracks].start) - msf2sec(ti[numtracks - 1].start); + sec2msf(t, ti[numtracks - 1].length); + } + } + } + + fclose(fi); + + // Fill out the last track's end based on size + if (numtracks >= 1) { + fseek(cdHandle, 0, SEEK_END); + t = ftell(cdHandle) / 2352 - msf2sec(ti[numtracks].start) + 2 * 75; + sec2msf(t, ti[numtracks].length); + } + + return 0; +} + +// this function tries to get the .mds file of the given .mdf +// the necessary data is put into the ti (trackinformation)-array +static int parsemds(const char *isofile) { + char mdsname[MAXPATHLEN]; + FILE *fi; + unsigned int offset, extra_offset, l, i; + unsigned short s; + + numtracks = 0; + + // copy name of the iso and change extension from .mdf to .mds + strncpy(mdsname, isofile, sizeof(mdsname)); + mdsname[MAXPATHLEN - 1] = '\0'; + if (strlen(mdsname) >= 4) { + strcpy(mdsname + strlen(mdsname) - 4, ".mds"); + } + else { + return -1; + } + + if ((fi = fopen(mdsname, "rb")) == NULL) { + return -1; + } + + memset(&ti, 0, sizeof(ti)); + + // check if it's a valid mds file + fread(&i, 1, sizeof(unsigned int), fi); + i = SWAP32(i); + if (i != 0x4944454D) { + // not an valid mds file + fclose(fi); + return -1; + } + + // get offset to session block + fseek(fi, 0x50, SEEK_SET); + fread(&offset, 1, sizeof(unsigned int), fi); + offset = SWAP32(offset); + + // get total number of tracks + offset += 14; + fseek(fi, offset, SEEK_SET); + fread(&s, 1, sizeof(unsigned short), fi); + s = SWAP16(s); + numtracks = s; + + // get offset to track blocks + fseek(fi, 4, SEEK_CUR); + fread(&offset, 1, sizeof(unsigned int), fi); + offset = SWAP32(offset); + + // skip lead-in data + while (1) { + fseek(fi, offset + 4, SEEK_SET); + if (fgetc(fi) < 0xA0) { + break; + } + offset += 0x50; + } + + // check if the image contains mixed subchannel data + fseek(fi, offset + 1, SEEK_SET); + subChanMixed = (fgetc(fi) ? TRUE : FALSE); + + // read track data + for (i = 1; i <= numtracks; i++) { + fseek(fi, offset, SEEK_SET); + + // get the track type + ti[i].type = ((fgetc(fi) == 0xA9) ? CDDA : DATA); + fseek(fi, 8, SEEK_CUR); + + // get the track starting point + ti[i].start[0] = fgetc(fi); + ti[i].start[1] = fgetc(fi); + ti[i].start[2] = fgetc(fi); + + if (i > 1) { + l = msf2sec(ti[i].start); + sec2msf(l - 2 * 75, ti[i].start); // ??? + } + + // get the track length + fread(&extra_offset, 1, sizeof(unsigned int), fi); + extra_offset = SWAP32(extra_offset); + + fseek(fi, extra_offset + 4, SEEK_SET); + fread(&l, 1, sizeof(unsigned int), fi); + l = SWAP32(l); + sec2msf(l, ti[i].length); + + offset += 0x50; + } + + fclose(fi); + return 0; +} + +// this function tries to get the .sub file of the given .img +static int opensubfile(const char *isoname) { + char subname[MAXPATHLEN]; + + // copy name of the iso and change extension from .img to .sub + strncpy(subname, isoname, sizeof(subname)); + subname[MAXPATHLEN - 1] = '\0'; + if (strlen(subname) >= 4) { + strcpy(subname + strlen(subname) - 4, ".sub"); + } + else { + return -1; + } + + subHandle = fopen(subname, "rb"); + if (subHandle == NULL) { + return -1; + } + + return 0; +} + +static long CALLBACK ISOinit(void) { + assert(cdHandle == NULL); + assert(subHandle == NULL); + + return 0; // do nothing +} + +static long CALLBACK ISOshutdown(void) { + if (cdHandle != NULL) { + fclose(cdHandle); + cdHandle = NULL; + } + if (subHandle != NULL) { + fclose(subHandle); + subHandle = NULL; + } + stopCDDA(); + return 0; +} + +static void PrintTracks(void) { + int i; + + for (i = 1; i <= numtracks; i++) { + SysPrintf(_("Track %.2d (%s) - Start %.2d:%.2d:%.2d, Length %.2d:%.2d:%.2d\n"), + i, (ti[i].type == DATA ? "DATA" : "AUDIO"), + ti[i].start[0], ti[i].start[1], ti[i].start[2], + ti[i].length[0], ti[i].length[1], ti[i].length[2]); + } +} + +// This function is invoked by the front-end when opening an ISO +// file for playback +static long CALLBACK ISOopen(void) { + if (cdHandle != NULL) { + return 0; // it's already open + } + + cdHandle = fopen(GetIsoFile(), "rb"); + if (cdHandle == NULL) { + return -1; + } + + SysPrintf(_("Loaded CD Image: %s"), GetIsoFile()); + + cddaBigEndian = FALSE; + subChanMixed = FALSE; + subChanRaw = FALSE; + + if (parsecue(GetIsoFile()) == 0) { + SysPrintf("[+cue]"); + } + else if (parsetoc(GetIsoFile()) == 0) { + SysPrintf("[+toc]"); + } + else if (parseccd(GetIsoFile()) == 0) { + SysPrintf("[+ccd]"); + } + else if (parsemds(GetIsoFile()) == 0) { + SysPrintf("[+mds]"); + } + + if (!subChanMixed && opensubfile(GetIsoFile()) == 0) { + SysPrintf("[+sub]"); + } + + SysPrintf(".\n"); + + PrintTracks(); + + return 0; +} + +static long CALLBACK ISOclose(void) { + if (cdHandle != NULL) { + fclose(cdHandle); + cdHandle = NULL; + } + if (subHandle != NULL) { + fclose(subHandle); + subHandle = NULL; + } + stopCDDA(); + return 0; +} + +// return Starting and Ending Track +// buffer: +// byte 0 - start track +// byte 1 - end track +static long CALLBACK ISOgetTN(unsigned char *buffer) { + buffer[0] = 1; + + if (numtracks > 0) { + buffer[1] = numtracks; + } + else { + buffer[1] = 1; + } + + return 0; +} + +// return Track Time +// buffer: +// byte 0 - frame +// byte 1 - second +// byte 2 - minute +static long CALLBACK ISOgetTD(unsigned char track, unsigned char *buffer) { + if (numtracks > 0 && track <= numtracks) { + buffer[2] = ti[track].start[0]; + buffer[1] = ti[track].start[1]; + buffer[0] = ti[track].start[2]; + } + else { + buffer[2] = 0; + buffer[1] = 2; + buffer[0] = 0; + } + + return 0; +} + +// decode 'raw' subchannel data ripped by cdrdao +static void DecodeRawSubData(void) { + unsigned char subQData[12]; + int i; + + memset(subQData, 0, sizeof(subQData)); + + for (i = 0; i < 8 * 12; i++) { + if (subbuffer[i] & (1 << 6)) { // only subchannel Q is needed + subQData[i >> 3] |= (1 << (7 - (i & 7))); + } + } + + memcpy(&subbuffer[12], subQData, 12); +} + +// read track +// time: byte 0 - minute; byte 1 - second; byte 2 - frame +// uses bcd format +static long CALLBACK ISOreadTrack(unsigned char *time) { + if (cdHandle == NULL) { + return -1; + } + + if (subChanMixed) { + fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * (CD_FRAMESIZE_RAW + SUB_FRAMESIZE) + 12, SEEK_SET); + fread(cdbuffer, 1, DATA_SIZE, cdHandle); + fread(subbuffer, 1, SUB_FRAMESIZE, cdHandle); + + if (subChanRaw) DecodeRawSubData(); + } + else { + fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * CD_FRAMESIZE_RAW + 12, SEEK_SET); + fread(cdbuffer, 1, DATA_SIZE, cdHandle); + + if (subHandle != NULL) { + fseek(subHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * SUB_FRAMESIZE, SEEK_SET); + fread(subbuffer, 1, SUB_FRAMESIZE, subHandle); + + if (subChanRaw) DecodeRawSubData(); + } + } + + return 0; +} + +// return readed track +static unsigned char * CALLBACK ISOgetBuffer(void) { + return cdbuffer; +} + +// plays cdda audio +// sector: byte 0 - minute; byte 1 - second; byte 2 - frame +// does NOT uses bcd format +static long CALLBACK ISOplay(unsigned char *time) { + if (SPU_playCDDAchannel != NULL) { + if (subChanMixed) { + startCDDA(MSF2SECT(time[0], time[1], time[2]) * (CD_FRAMESIZE_RAW + SUB_FRAMESIZE)); + } + else { + startCDDA(MSF2SECT(time[0], time[1], time[2]) * CD_FRAMESIZE_RAW); + } + } + return 0; +} + +// stops cdda audio +static long CALLBACK ISOstop(void) { + stopCDDA(); + return 0; +} + +// gets subchannel data +static unsigned char* CALLBACK ISOgetBufferSub(void) { + if (subHandle != NULL || subChanMixed) { + return subbuffer; + } + + return NULL; +} + +static long CALLBACK ISOgetStatus(struct CdrStat *stat) { + int sec; + + CDR__getStatus(stat); + + if (playing) { + stat->Type = 0x02; + stat->Status |= 0x80; + sec = cddaCurOffset / CD_FRAMESIZE_RAW; + sec2msf(sec, (char *)stat->Time); + } + else { + stat->Type = 0x01; + } + + return 0; +} + +void cdrIsoInit(void) { + CDR_init = ISOinit; + CDR_shutdown = ISOshutdown; + CDR_open = ISOopen; + CDR_close = ISOclose; + CDR_getTN = ISOgetTN; + CDR_getTD = ISOgetTD; + CDR_readTrack = ISOreadTrack; + CDR_getBuffer = ISOgetBuffer; + CDR_play = ISOplay; + CDR_stop = ISOstop; + CDR_getBufferSub = ISOgetBufferSub; + CDR_getStatus = ISOgetStatus; + + CDR_getDriveLetter = CDR__getDriveLetter; + CDR_configure = CDR__configure; + CDR_test = CDR__test; + CDR_about = CDR__about; + CDR_setfilename = CDR__setfilename; + + numtracks = 0; +} + +int cdrIsoActive(void) { + return (cdHandle != NULL); +} diff --git a/libpcsxcore/cdriso.h b/libpcsxcore/cdriso.h new file mode 100644 index 0000000..27d1ecd --- /dev/null +++ b/libpcsxcore/cdriso.h @@ -0,0 +1,34 @@ +/*************************************************************************** + * Copyright (C) 2007 PCSX-df Team * + * Copyright (C) 2009 Wei Mingzhi * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef CDRISO_H +#define CDRISO_H + +#ifdef __cplusplus +extern "C" { +#endif + +void cdrIsoInit(void); +int cdrIsoActive(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c new file mode 100644 index 0000000..92e4b7f --- /dev/null +++ b/libpcsxcore/cdrom.c @@ -0,0 +1,1138 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* Handles all CD-ROM registers and functions. +*/ + +#include "cdrom.h" +#include "ppf.h" + +cdrStruct cdr; + +/* CD-ROM magic numbers */ +#define CdlSync 0 +#define CdlNop 1 +#define CdlSetloc 2 +#define CdlPlay 3 +#define CdlForward 4 +#define CdlBackward 5 +#define CdlReadN 6 +#define CdlStandby 7 +#define CdlStop 8 +#define CdlPause 9 +#define CdlInit 10 +#define CdlMute 11 +#define CdlDemute 12 +#define CdlSetfilter 13 +#define CdlSetmode 14 +#define CdlGetmode 15 +#define CdlGetlocL 16 +#define CdlGetlocP 17 +#define CdlReadT 18 +#define CdlGetTN 19 +#define CdlGetTD 20 +#define CdlSeekL 21 +#define CdlSeekP 22 +#define CdlSetclock 23 +#define CdlGetclock 24 +#define CdlTest 25 +#define CdlID 26 +#define CdlReadS 27 +#define CdlReset 28 +#define CdlReadToc 30 + +#define AUTOPAUSE 249 +#define READ_ACK 250 +#define READ 251 +#define REPPLAY_ACK 252 +#define REPPLAY 253 +#define ASYNC 254 +/* don't set 255, it's reserved */ + +char *CmdName[0x100]= { + "CdlSync", "CdlNop", "CdlSetloc", "CdlPlay", + "CdlForward", "CdlBackward", "CdlReadN", "CdlStandby", + "CdlStop", "CdlPause", "CdlInit", "CdlMute", + "CdlDemute", "CdlSetfilter", "CdlSetmode", "CdlGetmode", + "CdlGetlocL", "CdlGetlocP", "CdlReadT", "CdlGetTN", + "CdlGetTD", "CdlSeekL", "CdlSeekP", "CdlSetclock", + "CdlGetclock", "CdlTest", "CdlID", "CdlReadS", + "CdlReset", NULL, "CDlReadToc", NULL +}; + +unsigned char Test04[] = { 0 }; +unsigned char Test05[] = { 0 }; +unsigned char Test20[] = { 0x98, 0x06, 0x10, 0xC3 }; +unsigned char Test22[] = { 0x66, 0x6F, 0x72, 0x20, 0x45, 0x75, 0x72, 0x6F }; +unsigned char Test23[] = { 0x43, 0x58, 0x44, 0x32, 0x39 ,0x34, 0x30, 0x51 }; + +// 1x = 75 sectors per second +// PSXCLK = 1 sec in the ps +// so (PSXCLK / 75) = cdr read time (linuzappz) +#define cdReadTime (PSXCLK / 75) + +static struct CdrStat stat; +static struct SubQ *subq; + +#define CDR_INT(eCycle) { \ + psxRegs.interrupt |= 0x4; \ + psxRegs.intCycle[2 + 1] = eCycle; \ + psxRegs.intCycle[2] = psxRegs.cycle; } + +#define CDREAD_INT(eCycle) { \ + psxRegs.interrupt |= 0x40000; \ + psxRegs.intCycle[2 + 16 + 1] = eCycle; \ + psxRegs.intCycle[2 + 16] = psxRegs.cycle; } + +#define StartReading(type, eCycle) { \ + cdr.Reading = type; \ + cdr.FirstSector = 1; \ + cdr.Readed = 0xff; \ + AddIrqQueue(READ_ACK, eCycle); \ +} + +#define StopReading() { \ + if (cdr.Reading) { \ + cdr.Reading = 0; \ + psxRegs.interrupt &= ~0x40000; \ + } \ + cdr.StatP &= ~0x20;\ +} + +#define StopCdda() { \ + if (cdr.Play) { \ + if (!Config.Cdda) CDR_stop(); \ + cdr.StatP &= ~0x80; \ + cdr.Play = FALSE; \ + } \ +} + +#define SetResultSize(size) { \ + cdr.ResultP = 0; \ + cdr.ResultC = size; \ + cdr.ResultReady = 1; \ +} + +static void ReadTrack() { + cdr.Prev[0] = itob(cdr.SetSector[0]); + cdr.Prev[1] = itob(cdr.SetSector[1]); + cdr.Prev[2] = itob(cdr.SetSector[2]); + +#ifdef CDR_LOG + CDR_LOG("ReadTrack() Log: KEY *** %x:%x:%x\n", cdr.Prev[0], cdr.Prev[1], cdr.Prev[2]); +#endif + cdr.RErr = CDR_readTrack(cdr.Prev); +} + +// cdr.Stat: +#define NoIntr 0 +#define DataReady 1 +#define Complete 2 +#define Acknowledge 3 +#define DataEnd 4 +#define DiskError 5 + +void AddIrqQueue(unsigned char irq, unsigned long ecycle) { + cdr.Irq = irq; + if (cdr.Stat) { + cdr.eCycle = ecycle; + } else { + CDR_INT(ecycle); + } +} + +void cdrInterrupt() { + int i; + unsigned char Irq = cdr.Irq; + + if (cdr.Stat) { + CDR_INT(0x1000); + return; + } + + cdr.Irq = 0xff; + cdr.Ctrl &= ~0x80; + + switch (Irq) { + case CdlSync: + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Acknowledge; + break; + + case CdlNop: + SetResultSize(1); + cdr.Result[0] = cdr.StatP; + cdr.Stat = Acknowledge; + i = stat.Status; + if (CDR_getStatus(&stat) != -1) { + if (stat.Type == 0xff) cdr.Stat = DiskError; + if (stat.Status & 0x10) { + cdr.Stat = DiskError; + cdr.Result[0] |= 0x11; + cdr.Result[0] &= ~0x02; + } + else if (i & 0x10) { + cdr.StatP |= 0x2; + cdr.Result[0] |= 0x2; + CheckCdrom(); + } + } + break; + + case CdlSetloc: + cdr.CmdProcess = 0; + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Acknowledge; + break; + + case CdlPlay: + cdr.CmdProcess = 0; + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Acknowledge; + cdr.StatP |= 0x80; +// if ((cdr.Mode & 0x5) == 0x5) AddIrqQueue(REPPLAY, cdReadTime); + break; + + case CdlForward: + cdr.CmdProcess = 0; + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Complete; + break; + + case CdlBackward: + cdr.CmdProcess = 0; + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Complete; + break; + + case CdlStandby: + cdr.CmdProcess = 0; + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Complete; + break; + + case CdlStop: + cdr.CmdProcess = 0; + SetResultSize(1); + cdr.StatP &= ~0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Complete; +// cdr.Stat = Acknowledge; + + // check case open/close -shalma + i = stat.Status; + if (CDR_getStatus(&stat) != -1) { + if (stat.Type == 0xff) cdr.Stat = DiskError; + if (stat.Status & 0x10) { + cdr.Stat = DiskError; + cdr.Result[0] |= 0x11; + cdr.Result[0] &= ~0x02; + } + else if (i & 0x10) { + cdr.StatP |= 0x2; + cdr.Result[0] |= 0x2; + CheckCdrom(); + } + } + break; + + case CdlPause: + SetResultSize(1); + cdr.Result[0] = cdr.StatP; + cdr.Stat = Acknowledge; + AddIrqQueue(CdlPause + 0x20, 0x1000); + cdr.Ctrl |= 0x80; + break; + + case CdlPause + 0x20: + SetResultSize(1); + cdr.StatP &= ~0x20; + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Complete; + break; + + case CdlInit: + SetResultSize(1); + cdr.StatP = 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Acknowledge; +// if (!cdr.Init) { + AddIrqQueue(CdlInit + 0x20, 0x1000); +// } + break; + + case CdlInit + 0x20: + SetResultSize(1); + cdr.Result[0] = cdr.StatP; + cdr.Stat = Complete; + cdr.Init = 1; + break; + + case CdlMute: + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Acknowledge; + break; + + case CdlDemute: + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Acknowledge; + break; + + case CdlSetfilter: + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Acknowledge; + break; + + case CdlSetmode: + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Acknowledge; + break; + + case CdlGetmode: + SetResultSize(6); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Result[1] = cdr.Mode; + cdr.Result[2] = cdr.File; + cdr.Result[3] = cdr.Channel; + cdr.Result[4] = 0; + cdr.Result[5] = 0; + cdr.Stat = Acknowledge; + break; + + case CdlGetlocL: + SetResultSize(8); +// for (i = 0; i < 8; i++) +// cdr.Result[i] = itob(cdr.Transfer[i]); + for (i = 0; i < 8; i++) + cdr.Result[i] = cdr.Transfer[i]; + cdr.Stat = Acknowledge; + break; + + case CdlGetlocP: + SetResultSize(8); + subq = (struct SubQ *)CDR_getBufferSub(); + + if (subq != NULL) { + cdr.Result[0] = subq->TrackNumber; + cdr.Result[1] = subq->IndexNumber; + memcpy(cdr.Result + 2, subq->TrackRelativeAddress, 3); + memcpy(cdr.Result + 5, subq->AbsoluteAddress, 3); + + // subQ integrity check + if (calcCrc((u8 *)subq + 12, 10) != (((u16)subq->CRC[0] << 8) | subq->CRC[1])) { + memset(cdr.Result + 2, 0, 3 + 3); // CRC wrong, wipe out time data + } + } else { + cdr.Result[0] = 1; + cdr.Result[1] = 1; + + cdr.Result[2] = btoi(cdr.Prev[0]); + cdr.Result[3] = btoi(cdr.Prev[1]) - 2; + cdr.Result[4] = cdr.Prev[2]; + + // m:s adjustment + if ((s8)cdr.Result[3] < 0) { + cdr.Result[3] += 60; + cdr.Result[2] -= 1; + } + + cdr.Result[2] = itob(cdr.Result[2]); + cdr.Result[3] = itob(cdr.Result[3]); + + memcpy(cdr.Result + 5, cdr.Prev, 3); + } + + cdr.Stat = Acknowledge; + break; + + case CdlGetTN: + cdr.CmdProcess = 0; + SetResultSize(3); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + if (CDR_getTN(cdr.ResultTN) == -1) { + cdr.Stat = DiskError; + cdr.Result[0] |= 0x01; + } else { + cdr.Stat = Acknowledge; + cdr.Result[1] = itob(cdr.ResultTN[0]); + cdr.Result[2] = itob(cdr.ResultTN[1]); + } + break; + + case CdlGetTD: + cdr.CmdProcess = 0; + cdr.Track = btoi(cdr.Param[0]); + SetResultSize(4); + cdr.StatP |= 0x2; + if (CDR_getTD(cdr.Track, cdr.ResultTD) == -1) { + cdr.Stat = DiskError; + cdr.Result[0] |= 0x01; + } else { + cdr.Stat = Acknowledge; + cdr.Result[0] = cdr.StatP; + cdr.Result[1] = itob(cdr.ResultTD[2]); + cdr.Result[2] = itob(cdr.ResultTD[1]); + cdr.Result[3] = itob(cdr.ResultTD[0]); + } + break; + + case CdlSeekL: + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.StatP |= 0x40; + cdr.Stat = Acknowledge; + cdr.Seeked = TRUE; + AddIrqQueue(CdlSeekL + 0x20, 0x1000); + break; + + case CdlSeekL + 0x20: + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.StatP &= ~0x40; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Complete; + break; + + case CdlSeekP: + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.StatP |= 0x40; + cdr.Stat = Acknowledge; + AddIrqQueue(CdlSeekP + 0x20, 0x1000); + break; + + case CdlSeekP + 0x20: + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.StatP &= ~0x40; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Complete; + break; + + case CdlTest: + cdr.Stat = Acknowledge; + switch (cdr.Param[0]) { + case 0x20: // System Controller ROM Version + SetResultSize(4); + memcpy(cdr.Result, Test20, 4); + break; + case 0x22: + SetResultSize(8); + memcpy(cdr.Result, Test22, 4); + break; + case 0x23: case 0x24: + SetResultSize(8); + memcpy(cdr.Result, Test23, 4); + break; + } + break; + + case CdlID: + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Acknowledge; + AddIrqQueue(CdlID + 0x20, 0x1000); + break; + + case CdlID + 0x20: + SetResultSize(8); + if (CDR_getStatus(&stat) == -1) { + cdr.Result[0] = 0x00; // 0x08 and cdr.Result[1]|0x10 : audio cd, enters cd player + cdr.Result[1] = 0x00; // 0x80 leads to the menu in the bios, else loads CD + } + else { + if (stat.Type == 2) { + cdr.Result[0] = 0x08; + cdr.Result[1] = 0x10; + } + else { + cdr.Result[0] = 0x00; + cdr.Result[1] = 0x00; + } + } + cdr.Result[1] |= 0x80; + cdr.Result[2] = 0x00; + cdr.Result[3] = 0x00; + strncpy((char *)&cdr.Result[4], "PCSX", 4); + cdr.Stat = Complete; + break; + + case CdlReset: + SetResultSize(1); + cdr.StatP = 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Acknowledge; + break; + + case CdlReadToc: + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Acknowledge; + AddIrqQueue(CdlReadToc + 0x20, 0x1000); + break; + + case CdlReadToc + 0x20: + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = Complete; + break; + + case AUTOPAUSE: + cdr.OCUP = 0; +/* SetResultSize(1); + StopCdda(); + StopReading(); + cdr.OCUP = 0; + cdr.StatP&=~0x20; + cdr.StatP|= 0x2; + cdr.Result[0] = cdr.StatP; + cdr.Stat = DataEnd; +*/ AddIrqQueue(CdlPause, 0x800); + break; + + case READ_ACK: + if (!cdr.Reading) return; + + SetResultSize(1); + cdr.StatP |= 0x2; + cdr.Result[0] = cdr.StatP; + if (!cdr.Seeked) { + cdr.Seeked = TRUE; + cdr.StatP |= 0x40; + } + cdr.StatP |= 0x20; + cdr.Stat = Acknowledge; + +// CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime); + CDREAD_INT(0x80000); + break; + + case REPPLAY_ACK: + cdr.Stat = Acknowledge; + cdr.Result[0] = cdr.StatP; + SetResultSize(1); + AddIrqQueue(REPPLAY, cdReadTime); + break; + + case REPPLAY: + if ((cdr.Mode & 5) != 5) break; +/* if (CDR_getStatus(&stat) == -1) { + cdr.Result[0] = 0; + cdr.Result[1] = 0; + cdr.Result[2] = 0; + cdr.Result[3] = 0; + cdr.Result[4] = 0; + cdr.Result[5] = 0; + cdr.Result[6] = 0; + cdr.Result[7] = 0; + } else memcpy(cdr.Result, &stat.Track, 8); + cdr.Stat = 1; + SetResultSize(8); + AddIrqQueue(REPPLAY_ACK, cdReadTime); +*/ break; + + case 0xff: + return; + + default: + cdr.Stat = Complete; + break; + } + + if (cdr.Stat != NoIntr && cdr.Reg2 != 0x18) { + psxHu32ref(0x1070) |= SWAP32((u32)0x4); + } + +#ifdef CDR_LOG + CDR_LOG("cdrInterrupt() Log: CDR Interrupt IRQ %x\n", Irq); +#endif +} + +void cdrReadInterrupt() { + u8 *buf; + + if (!cdr.Reading) + return; + + if (cdr.Stat) { + CDREAD_INT(0x1000); + return; + } + +#ifdef CDR_LOG + CDR_LOG("cdrReadInterrupt() Log: KEY END"); +#endif + + cdr.OCUP = 1; + SetResultSize(1); + cdr.StatP |= 0x22; + cdr.StatP &= ~0x40; + cdr.Result[0] = cdr.StatP; + + ReadTrack(); + + buf = CDR_getBuffer(); + if (buf == NULL) + cdr.RErr = -1; + + if (cdr.RErr == -1) { +#ifdef CDR_LOG + fprintf(emuLog, "cdrReadInterrupt() Log: err\n"); +#endif + memset(cdr.Transfer, 0, DATA_SIZE); + cdr.Stat = DiskError; + cdr.Result[0] |= 0x01; + CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime); + return; + } + + memcpy(cdr.Transfer, buf, DATA_SIZE); + CheckPPFCache(cdr.Transfer, cdr.Prev[0], cdr.Prev[1], cdr.Prev[2]); + + cdr.Stat = DataReady; + +#ifdef CDR_LOG + fprintf(emuLog, "cdrReadInterrupt() Log: cdr.Transfer %x:%x:%x\n", cdr.Transfer[0], cdr.Transfer[1], cdr.Transfer[2]); +#endif + + if ((!cdr.Muted) && (cdr.Mode & 0x40) && (!Config.Xa) && (cdr.FirstSector != -1)) { // CD-XA + if ((cdr.Transfer[4 + 2] & 0x4) && + ((cdr.Mode & 0x8) ? (cdr.Transfer[4 + 1] == cdr.Channel) : 1) && + (cdr.Transfer[4 + 0] == cdr.File)) { + int ret = xa_decode_sector(&cdr.Xa, cdr.Transfer+4, cdr.FirstSector); + + if (!ret) { + SPU_playADPCMchannel(&cdr.Xa); + cdr.FirstSector = 0; + } + else cdr.FirstSector = -1; + } + } + + cdr.SetSector[2]++; + if (cdr.SetSector[2] == 75) { + cdr.SetSector[2] = 0; + cdr.SetSector[1]++; + if (cdr.SetSector[1] == 60) { + cdr.SetSector[1] = 0; + cdr.SetSector[0]++; + } + } + + cdr.Readed = 0; + + if ((cdr.Transfer[4 + 2] & 0x80) && (cdr.Mode & 0x2)) { // EOF +#ifdef CDR_LOG + CDR_LOG("cdrReadInterrupt() Log: Autopausing read\n"); +#endif +// AddIrqQueue(AUTOPAUSE, 0x1000); + AddIrqQueue(CdlPause, 0x1000); + } + else { + CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime); + } + psxHu32ref(0x1070) |= SWAP32((u32)0x4); +} + +/* +cdrRead0: + bit 0 - 0 REG1 command send / 1 REG1 data read + bit 1 - 0 data transfer finish / 1 data transfer ready/in progress + bit 2 - unknown + bit 3 - unknown + bit 4 - unknown + bit 5 - 1 result ready + bit 6 - 1 dma ready + bit 7 - 1 command being processed +*/ + +unsigned char cdrRead0(void) { + if (cdr.ResultReady) + cdr.Ctrl |= 0x20; + else + cdr.Ctrl &= ~0x20; + + if (cdr.OCUP) + cdr.Ctrl |= 0x40; +// else +// cdr.Ctrl &= ~0x40; + + // What means the 0x10 and the 0x08 bits? I only saw it used by the bios + cdr.Ctrl |= 0x18; + +#ifdef CDR_LOG + CDR_LOG("cdrRead0() Log: CD0 Read: %x\n", cdr.Ctrl); +#endif + + return psxHu8(0x1800) = cdr.Ctrl; +} + +/* +cdrWrite0: + 0 - to send a command / 1 - to get the result +*/ + +void cdrWrite0(unsigned char rt) { +#ifdef CDR_LOG + CDR_LOG("cdrWrite0() Log: CD0 write: %x\n", rt); +#endif + cdr.Ctrl = rt | (cdr.Ctrl & ~0x3); + + if (rt == 0) { + cdr.ParamP = 0; + cdr.ParamC = 0; + cdr.ResultReady = 0; + } +} + +unsigned char cdrRead1(void) { + if (cdr.ResultReady) { // && cdr.Ctrl & 0x1) { + psxHu8(0x1801) = cdr.Result[cdr.ResultP++]; + if (cdr.ResultP == cdr.ResultC) + cdr.ResultReady = 0; + } else { + psxHu8(0x1801) = 0; + } +#ifdef CDR_LOG + CDR_LOG("cdrRead1() Log: CD1 Read: %x\n", psxHu8(0x1801)); +#endif + return psxHu8(0x1801); +} + +void cdrWrite1(unsigned char rt) { + int i; + +#ifdef CDR_LOG + CDR_LOG("cdrWrite1() Log: CD1 write: %x (%s)\n", rt, CmdName[rt]); +#endif +// psxHu8(0x1801) = rt; + cdr.Cmd = rt; + cdr.OCUP = 0; + +#ifdef CDRCMD_DEBUG + SysPrintf("cdrWrite1() Log: CD1 write: %x (%s)", rt, CmdName[rt]); + if (cdr.ParamC) { + SysPrintf(" Param[%d] = {", cdr.ParamC); + for (i = 0; i < cdr.ParamC; i++) + SysPrintf(" %x,", cdr.Param[i]); + SysPrintf("}\n"); + } else { + SysPrintf("\n"); + } +#endif + + if (cdr.Ctrl & 0x1) return; + + switch (cdr.Cmd) { + case CdlSync: + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlNop: + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlSetloc: + StopReading(); + cdr.Seeked = FALSE; + for (i = 0; i < 3; i++) + cdr.SetSector[i] = btoi(cdr.Param[i]); + cdr.SetSector[3] = 0; +/* if ((cdr.SetSector[0] | cdr.SetSector[1] | cdr.SetSector[2]) == 0) { + *(u32 *)cdr.SetSector = *(u32 *)cdr.SetSectorSeek; + }*/ + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlPlay: + if (!cdr.SetSector[0] & !cdr.SetSector[1] & !cdr.SetSector[2]) { + if (CDR_getTN(cdr.ResultTN) != -1) { + if (cdr.CurTrack > cdr.ResultTN[1]) + cdr.CurTrack = cdr.ResultTN[1]; + if (CDR_getTD((unsigned char)(cdr.CurTrack), cdr.ResultTD) != -1) { + int tmp = cdr.ResultTD[2]; + cdr.ResultTD[2] = cdr.ResultTD[0]; + cdr.ResultTD[0] = tmp; + if (!Config.Cdda) CDR_play(cdr.ResultTD); + } + } + } else if (!Config.Cdda) { + CDR_play(cdr.SetSector); + } + cdr.Play = TRUE; + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlForward: + if (cdr.CurTrack < 0xaa) + cdr.CurTrack++; + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlBackward: + if (cdr.CurTrack > 1) + cdr.CurTrack--; + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlReadN: + cdr.Irq = 0; + StopReading(); + cdr.Ctrl|= 0x80; + cdr.Stat = NoIntr; + StartReading(1, 0x1000); + break; + + case CdlStandby: + StopCdda(); + StopReading(); + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlStop: + StopCdda(); + StopReading(); + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlPause: + StopCdda(); + StopReading(); + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x80000); + break; + + case CdlReset: + case CdlInit: + StopCdda(); + StopReading(); + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlMute: + cdr.Muted = TRUE; + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlDemute: + cdr.Muted = FALSE; + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlSetfilter: + cdr.File = cdr.Param[0]; + cdr.Channel = cdr.Param[1]; + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlSetmode: +#ifdef CDR_LOG + CDR_LOG("cdrWrite1() Log: Setmode %x\n", cdr.Param[0]); +#endif + cdr.Mode = cdr.Param[0]; + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlGetmode: + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlGetlocL: + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlGetlocP: + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlGetTN: + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlGetTD: + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlSeekL: +// ((u32 *)cdr.SetSectorSeek)[0] = ((u32 *)cdr.SetSector)[0]; + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlSeekP: +// ((u32 *)cdr.SetSectorSeek)[0] = ((u32 *)cdr.SetSector)[0]; + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlTest: + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlID: + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + case CdlReadS: + cdr.Irq = 0; + StopReading(); + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + StartReading(2, 0x1000); + break; + + case CdlReadToc: + cdr.Ctrl |= 0x80; + cdr.Stat = NoIntr; + AddIrqQueue(cdr.Cmd, 0x1000); + break; + + default: +#ifdef CDR_LOG + CDR_LOG("cdrWrite1() Log: Unknown command: %x\n", cdr.Cmd); +#endif + return; + } + if (cdr.Stat != NoIntr) { + psxHu32ref(0x1070) |= SWAP32((u32)0x4); + } +} + +unsigned char cdrRead2(void) { + unsigned char ret; + + if (cdr.Readed == 0) { + ret = 0; + } else { + ret = *cdr.pTransfer++; + } + +#ifdef CDR_LOG + CDR_LOG("cdrRead2() Log: CD2 Read: %x\n", ret); +#endif + return ret; +} + +void cdrWrite2(unsigned char rt) { +#ifdef CDR_LOG + CDR_LOG("cdrWrite2() Log: CD2 write: %x\n", rt); +#endif + if (cdr.Ctrl & 0x1) { + switch (rt) { + case 0x07: + cdr.ParamP = 0; + cdr.ParamC = 0; + cdr.ResultReady = 1; //0; + cdr.Ctrl &= ~3; //cdr.Ctrl = 0; + break; + + default: + cdr.Reg2 = rt; + break; + } + } else if (!(cdr.Ctrl & 0x1) && cdr.ParamP < 8) { + cdr.Param[cdr.ParamP++] = rt; + cdr.ParamC++; + } +} + +unsigned char cdrRead3(void) { + if (cdr.Stat) { + if (cdr.Ctrl & 0x1) + psxHu8(0x1803) = cdr.Stat | 0xE0; + else + psxHu8(0x1803) = 0xff; + } else { + psxHu8(0x1803) = 0; + } +#ifdef CDR_LOG + CDR_LOG("cdrRead3() Log: CD3 Read: %x\n", psxHu8(0x1803)); +#endif + return psxHu8(0x1803); +} + +void cdrWrite3(unsigned char rt) { +#ifdef CDR_LOG + CDR_LOG("cdrWrite3() Log: CD3 write: %x\n", rt); +#endif + if (rt == 0x07 && cdr.Ctrl & 0x1) { + cdr.Stat = 0; + + if (cdr.Irq == 0xff) { + cdr.Irq = 0; + return; + } + if (cdr.Irq) + CDR_INT(cdr.eCycle); + if (cdr.Reading && !cdr.ResultReady) + CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime); + + return; + } + if (rt == 0x80 && !(cdr.Ctrl & 0x1) && cdr.Readed == 0) { + cdr.Readed = 1; + cdr.pTransfer = cdr.Transfer; + + switch (cdr.Mode & 0x30) { + case 0x10: + case 0x00: + cdr.pTransfer += 12; + break; + default: + break; + } + } +} + +void psxDma3(u32 madr, u32 bcr, u32 chcr) { + u32 cdsize; + u8 *ptr; + +#ifdef CDR_LOG + CDR_LOG("psxDma3() Log: *** DMA 3 *** %x addr = %x size = %x\n", chcr, madr, bcr); +#endif + + switch (chcr) { + case 0x11000000: + case 0x11400100: + if (cdr.Readed == 0) { +#ifdef CDR_LOG + CDR_LOG("psxDma3() Log: *** DMA 3 *** NOT READY\n"); +#endif + break; + } + + cdsize = (bcr & 0xffff) * 4; + + ptr = (u8 *)PSXM(madr); + if (ptr == NULL) { +#ifdef CPU_LOG + CDR_LOG("psxDma3() Log: *** DMA 3 *** NULL Pointer!\n"); +#endif + break; + } + memcpy(ptr, cdr.pTransfer, cdsize); + psxCpu->Clear(madr, cdsize / 4); + cdr.pTransfer += cdsize; + break; + default: +#ifdef CDR_LOG + CDR_LOG("psxDma3() Log: Unknown cddma %x\n", chcr); +#endif + break; + } + + HW_DMA3_CHCR &= SWAP32(~0x01000000); + DMA_INTERRUPT(3); +} + +void cdrReset() { + memset(&cdr, 0, sizeof(cdr)); + cdr.CurTrack = 1; + cdr.File = 1; + cdr.Channel = 1; +} + +int cdrFreeze(gzFile f, int Mode) { + uintptr_t tmp; + + gzfreeze(&cdr, sizeof(cdr)); + + if (Mode == 1) + tmp = cdr.pTransfer - cdr.Transfer; + + gzfreeze(&tmp, sizeof(tmp)); + + if (Mode == 0) + cdr.pTransfer = cdr.Transfer + tmp; + + return 0; +} diff --git a/libpcsxcore/cdrom.h b/libpcsxcore/cdrom.h new file mode 100644 index 0000000..c5d448c --- /dev/null +++ b/libpcsxcore/cdrom.h @@ -0,0 +1,110 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __CDROM_H__ +#define __CDROM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" +#include "decode_xa.h" +#include "r3000a.h" +#include "plugins.h" +#include "psxmem.h" +#include "psxhw.h" + +#define btoi(b) ((b) / 16 * 10 + (b) % 16) /* BCD to u_char */ +#define itob(i) ((i) / 10 * 16 + (i) % 10) /* u_char to BCD */ + +#define MSF2SECT(m, s, f) (((m) * 60 + (s) - 2) * 75 + (f)) + +#define CD_FRAMESIZE_RAW 2352 +#define DATA_SIZE (CD_FRAMESIZE_RAW - 12) + +#define SUB_FRAMESIZE 96 + +typedef struct { + unsigned char OCUP; + unsigned char Reg1Mode; + unsigned char Reg2; + unsigned char CmdProcess; + unsigned char Ctrl; + unsigned char Stat; + + unsigned char StatP; + + unsigned char Transfer[CD_FRAMESIZE_RAW]; + unsigned char *pTransfer; + + unsigned char Prev[4]; + unsigned char Param[8]; + unsigned char Result[8]; + + unsigned char ParamC; + unsigned char ParamP; + unsigned char ResultC; + unsigned char ResultP; + unsigned char ResultReady; + unsigned char Cmd; + unsigned char Readed; + u32 Reading; + + unsigned char ResultTN[6]; + unsigned char ResultTD[4]; + unsigned char SetSector[4]; + unsigned char SetSectorSeek[4]; + unsigned char Track; + boolean Play, Muted; + int CurTrack; + int Mode, File, Channel; + int Reset; + int RErr; + int FirstSector; + + xa_decode_t Xa; + + int Init; + + unsigned char Irq; + u32 eCycle; + + boolean Seeked; +} cdrStruct; + +extern cdrStruct cdr; + +void cdrReset(); +void cdrInterrupt(); +void cdrReadInterrupt(); +unsigned char cdrRead0(void); +unsigned char cdrRead1(void); +unsigned char cdrRead2(void); +unsigned char cdrRead3(void); +void cdrWrite0(unsigned char rt); +void cdrWrite1(unsigned char rt); +void cdrWrite2(unsigned char rt); +void cdrWrite3(unsigned char rt); +int cdrFreeze(gzFile f, int Mode); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/cheat.c b/libpcsxcore/cheat.c new file mode 100644 index 0000000..21d88b8 --- /dev/null +++ b/libpcsxcore/cheat.c @@ -0,0 +1,1024 @@ +/* Cheat Support for PCSX-Reloaded + * Copyright (c) 2009, Wei Mingzhi . + * + * This program is free software; you can redistribute it and/or modify + * it 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; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA + */ + +#include "psxcommon.h" +#include "r3000a.h" +#include "psxmem.h" + +#include "cheat.h" + +Cheat *Cheats = NULL; +int NumCheats = 0; +static int NumCheatsAllocated = 0; + +CheatCode *CheatCodes = NULL; +int NumCodes = 0; +static int NumCodesAllocated = 0; + +s8 *prevM = NULL; +u32 *SearchResults = NULL; +int NumSearchResults = 0; +static int NumSearchResultsAllocated = 0; + +#define ALLOC_INCREMENT 100 + +void ClearAllCheats() { + int i; + + if (Cheats != NULL) { + for (i = 0; i < NumCheats; i++) { + free(Cheats[i].Descr); + } + free(Cheats); + } + + Cheats = NULL; + NumCheats = 0; + NumCheatsAllocated = 0; + + if (CheatCodes != NULL) { + free(CheatCodes); + } + + CheatCodes = NULL; + NumCodes = 0; + NumCodesAllocated = 0; +} + +// load cheats from the specific filename +void LoadCheats(const char *filename) { + FILE *fp; + char buf[256]; + int count = 0; + unsigned int t1, t2; + + fp = fopen(filename, "r"); + if (fp == NULL) { + return; + } + + ClearAllCheats(); + + while (fgets(buf, 255, fp) != NULL) { + buf[255] = '\0'; + trim(buf); + + // Skip comment or blank lines + if (buf[0] == '#' || buf[0] == ';' || buf[0] == '/' || buf[0] == '\"' || buf[0] == '\0') + continue; + + if (buf[0] == '[' && buf[strlen(buf) - 1] == ']') { + if (NumCheats > 0) + Cheats[NumCheats - 1].n = count; + + if (NumCheats >= NumCheatsAllocated) { + NumCheatsAllocated += ALLOC_INCREMENT; + + if (Cheats == NULL) { + assert(NumCheats == 0); + assert(NumCheatsAllocated == ALLOC_INCREMENT); + Cheats = (Cheat *)malloc(sizeof(Cheat) * NumCheatsAllocated); + } else { + Cheats = (Cheat *)realloc(Cheats, sizeof(Cheat) * NumCheatsAllocated); + } + } + + buf[strlen(buf) - 1] = '\0'; + count = 0; + + if (buf[1] == '*') { + Cheats[NumCheats].Descr = strdup(buf + 2); + Cheats[NumCheats].Enabled = 1; + } else { + Cheats[NumCheats].Descr = strdup(buf + 1); + Cheats[NumCheats].Enabled = 0; + } + + Cheats[NumCheats].First = NumCodes; + + NumCheats++; + continue; + } + + if (NumCheats <= 0) + continue; + + if (NumCodes >= NumCodesAllocated) { + NumCodesAllocated += ALLOC_INCREMENT; + + if (CheatCodes == NULL) { + assert(NumCodes == 0); + assert(NumCodesAllocated == ALLOC_INCREMENT); + CheatCodes = (CheatCode *)malloc(sizeof(CheatCode) * NumCodesAllocated); + } else { + CheatCodes = (CheatCode *)realloc(CheatCodes, sizeof(CheatCode) * NumCodesAllocated); + } + } + + sscanf(buf, "%x %x", &t1, &t2); + + CheatCodes[NumCodes].Addr = t1; + CheatCodes[NumCodes].Val = t2; + + NumCodes++; + count++; + } + + if (NumCheats > 0) + Cheats[NumCheats - 1].n = count; + + fclose(fp); + + SysPrintf(_("Cheats loaded from: %s\n"), filename); +} + +// save all cheats to the specified filename +void SaveCheats(const char *filename) { + FILE *fp; + int i, j; + + fp = fopen(filename, "w"); + if (fp == NULL) { + return; + } + + for (i = 0; i < NumCheats; i++) { + // write the description + if (Cheats[i].Enabled) + fprintf(fp, "[*%s]\n", Cheats[i].Descr); + else + fprintf(fp, "[%s]\n", Cheats[i].Descr); + + // write all cheat codes + for (j = 0; j < Cheats[i].n; j++) { + fprintf(fp, "%.8X %.4X\n", + CheatCodes[Cheats[i].First + j].Addr, + CheatCodes[Cheats[i].First + j].Val); + } + + fprintf(fp, "\n"); + } + + fclose(fp); + + SysPrintf(_("Cheats saved to: %s\n"), filename); +} + +// apply all enabled cheats +void ApplyCheats() { + int i, j, k, endindex; + + for (i = 0; i < NumCheats; i++) { + if (!Cheats[i].Enabled) { + continue; + } + + // process all cheat codes + endindex = Cheats[i].First + Cheats[i].n; + + for (j = Cheats[i].First; j < endindex; j++) { + u8 type = (uint8_t)(CheatCodes[j].Addr >> 24); + u32 addr = (CheatCodes[j].Addr & 0x001FFFFF); + u16 val = CheatCodes[j].Val; + u32 taddr; + + switch (type) { + case CHEAT_CONST8: + psxMu8ref(addr) = (u8)val; + break; + + case CHEAT_CONST16: + psxMu16ref(addr) = SWAPu16(val); + break; + + case CHEAT_INC16: + psxMu16ref(addr) = SWAPu16(psxMu16(addr) + val); + break; + + case CHEAT_DEC16: + psxMu16ref(addr) = SWAPu16(psxMu16(addr) - val); + break; + + case CHEAT_INC8: + psxMu8ref(addr) += (u8)val; + break; + + case CHEAT_DEC8: + psxMu8ref(addr) -= (u8)val; + break; + + case CHEAT_SLIDE: + j++; + if (j >= endindex) + break; + + type = (uint8_t)(CheatCodes[j].Addr >> 24); + taddr = (CheatCodes[j].Addr & 0x001FFFFF); + val = CheatCodes[j].Val; + + if (type == CHEAT_CONST8) { + for (k = 0; k < ((addr >> 8) & 0xFF); k++) { + psxMu8ref(taddr) = (u8)val; + taddr += (s8)(addr & 0xFF); + val += (s8)(CheatCodes[j - 1].Val & 0xFF); + } + } + else if (type == CHEAT_CONST16) { + for (k = 0; k < ((addr >> 8) & 0xFF); k++) { + psxMu16ref(taddr) = SWAPu16(val); + taddr += (s8)(addr & 0xFF); + val += (s8)(CheatCodes[j - 1].Val & 0xFF); + } + } + break; + + case CHEAT_MEMCPY: + j++; + if (j >= endindex) + break; + + taddr = (CheatCodes[j].Addr & 0x001FFFFF); + for (k = 0; k < val; k++) { + psxMu8ref(taddr + k) = PSXMu8(addr + k); + } + break; + + case CHEAT_EQU8: + if (PSXMu8(addr) != (u8)val) + j++; // skip the next code + break; + + case CHEAT_NOTEQU8: + if (PSXMu8(addr) == (u8)val) + j++; // skip the next code + break; + + case CHEAT_LESSTHAN8: + if (PSXMu8(addr) >= (u8)val) + j++; // skip the next code + break; + + case CHEAT_GREATERTHAN8: + if (PSXMu8(addr) <= (u8)val) + j++; // skip the next code + break; + + case CHEAT_EQU16: + if (PSXMu16(addr) != val) + j++; // skip the next code + break; + + case CHEAT_NOTEQU16: + if (PSXMu16(addr) == val) + j++; // skip the next code + break; + + case CHEAT_LESSTHAN16: + if (PSXMu16(addr) >= val) + j++; // skip the next code + break; + + case CHEAT_GREATERTHAN16: + if (PSXMu16(addr) <= val) + j++; // skip the next code + break; + } + } + } +} + +int AddCheat(const char *descr, char *code) { + int c = 1; + char *p1, *p2; + + if (NumCheats >= NumCheatsAllocated) { + NumCheatsAllocated += ALLOC_INCREMENT; + + if (Cheats == NULL) { + assert(NumCheats == 0); + assert(NumCheatsAllocated == ALLOC_INCREMENT); + Cheats = (Cheat *)malloc(sizeof(Cheat) * NumCheatsAllocated); + } + else { + Cheats = (Cheat *)realloc(Cheats, sizeof(Cheat) * NumCheatsAllocated); + } + } + + Cheats[NumCheats].Descr = strdup(descr[0] ? descr : _("(Untitled)")); + Cheats[NumCheats].Enabled = 0; + Cheats[NumCheats].First = NumCodes; + Cheats[NumCheats].n = 0; + + p1 = code; + p2 = code; + + while (c) { + unsigned int t1, t2; + + while (*p2 != '\n' && *p2 != '\0') + p2++; + + if (*p2 == '\0') + c = 0; + + *p2 = '\0'; + p2++; + + t1 = 0; + t2 = 0; + sscanf(p1, "%x %x", &t1, &t2); + + if (t1 > 0x10000000) { + if (NumCodes >= NumCodesAllocated) { + NumCodesAllocated += ALLOC_INCREMENT; + + if (CheatCodes == NULL) { + assert(NumCodes == 0); + assert(NumCodesAllocated == ALLOC_INCREMENT); + CheatCodes = (CheatCode *)malloc(sizeof(CheatCode) * NumCodesAllocated); + } + else { + CheatCodes = (CheatCode *)realloc(CheatCodes, sizeof(CheatCode) * NumCodesAllocated); + } + } + + CheatCodes[NumCodes].Addr = t1; + CheatCodes[NumCodes].Val = t2; + NumCodes++; + Cheats[NumCheats].n++; + } + + p1 = p2; + } + + if (Cheats[NumCheats].n == 0) { + return -1; + } + + NumCheats++; + return 0; +} + +void RemoveCheat(int index) { + assert(index >= 0 && index < NumCheats); + + free(Cheats[index].Descr); + + while (index < NumCheats - 1) { + Cheats[index] = Cheats[index + 1]; + index++; + } + + NumCheats--; +} + +int EditCheat(int index, const char *descr, char *code) { + int c = 1; + int prev = NumCodes; + char *p1, *p2; + + assert(index >= 0 && index < NumCheats); + + p1 = code; + p2 = code; + + while (c) { + unsigned int t1, t2; + + while (*p2 != '\n' && *p2 != '\0') + p2++; + + if (*p2 == '\0') + c = 0; + + *p2 = '\0'; + p2++; + + t1 = 0; + t2 = 0; + sscanf(p1, "%x %x", &t1, &t2); + + if (t1 > 0x10000000) { + if (NumCodes >= NumCodesAllocated) { + NumCodesAllocated += ALLOC_INCREMENT; + + if (CheatCodes == NULL) { + assert(NumCodes == 0); + assert(NumCodesAllocated == ALLOC_INCREMENT); + CheatCodes = (CheatCode *)malloc(sizeof(CheatCode) * NumCodesAllocated); + } + else { + CheatCodes = (CheatCode *)realloc(CheatCodes, sizeof(CheatCode) * NumCodesAllocated); + } + } + + CheatCodes[NumCodes].Addr = t1; + CheatCodes[NumCodes].Val = t2; + NumCodes++; + } + + p1 = p2; + } + + if (NumCodes == prev) { + return -1; + } + + free(Cheats[index].Descr); + Cheats[index].Descr = strdup(descr[0] ? descr : _("(Untitled)")); + Cheats[index].First = prev; + Cheats[index].n = NumCodes - prev; + + return 0; +} + +void FreeCheatSearchResults() { + if (SearchResults != NULL) { + free(SearchResults); + } + SearchResults = NULL; + + NumSearchResults = 0; + NumSearchResultsAllocated = 0; +} + +void FreeCheatSearchMem() { + if (prevM != NULL) { + free(prevM); + } + prevM = NULL; +} + +void CheatSearchBackupMemory() { + if (prevM != NULL) { + memcpy(prevM, psxM, 0x200000); + } +} + +static void CheatSearchInitBackupMemory() { + if (prevM == NULL) { + prevM = (s8 *)malloc(0x200000); + CheatSearchBackupMemory(); + } +} + +static void CheatSearchAddResult(u32 addr) { + if (NumSearchResults >= NumSearchResultsAllocated) { + NumSearchResultsAllocated += ALLOC_INCREMENT; + + if (SearchResults == NULL) { + SearchResults = (u32 *)malloc(sizeof(u32) * NumSearchResultsAllocated); + } + else { + SearchResults = (u32 *)realloc(SearchResults, sizeof(u32) * NumSearchResultsAllocated); + } + } + + SearchResults[NumSearchResults++] = addr; +} + +void CheatSearchEqual8(u8 val) { + u32 i, j; + + CheatSearchInitBackupMemory(); + + if (SearchResults == NULL) { + // search the whole memory + for (i = 0; i < 0x200000; i++) { + if (PSXMu8(i) == val) { + CheatSearchAddResult(i); + } + } + } + else { + // only search within the previous results + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PSXMu8(SearchResults[i]) == val) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; + } +} + +void CheatSearchEqual16(u16 val) { + u32 i, j; + + CheatSearchInitBackupMemory(); + + if (SearchResults == NULL) { + // search the whole memory + for (i = 0; i < 0x200000; i += 2) { + if (PSXMu16(i) == val) { + CheatSearchAddResult(i); + } + } + } + else { + // only search within the previous results + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PSXMu16(SearchResults[i]) == val) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; + } +} + +void CheatSearchEqual32(u32 val) { + u32 i, j; + + CheatSearchInitBackupMemory(); + + if (SearchResults == NULL) { + // search the whole memory + for (i = 0; i < 0x200000; i += 4) { + if (PSXMu32(i) == val) { + CheatSearchAddResult(i); + } + } + } + else { + // only search within the previous results + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PSXMu32(SearchResults[i]) == val) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; + } +} + +void CheatSearchNotEqual8(u8 val) { + u32 i, j; + + CheatSearchInitBackupMemory(); + + if (SearchResults == NULL) { + // search the whole memory + for (i = 0; i < 0x200000; i++) { + if (PSXMu8(i) != val) { + CheatSearchAddResult(i); + } + } + } + else { + // only search within the previous results + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PSXMu8(SearchResults[i]) != val) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; + } +} + +void CheatSearchNotEqual16(u16 val) { + u32 i, j; + + CheatSearchInitBackupMemory(); + + if (SearchResults == NULL) { + // search the whole memory + for (i = 0; i < 0x200000; i += 2) { + if (PSXMu16(i) != val) { + CheatSearchAddResult(i); + } + } + } + else { + // only search within the previous results + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PSXMu16(SearchResults[i]) != val) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; + } +} + +void CheatSearchNotEqual32(u32 val) { + u32 i, j; + + CheatSearchInitBackupMemory(); + + if (SearchResults == NULL) { + // search the whole memory + for (i = 0; i < 0x200000; i += 4) { + if (PSXMu32(i) != val) { + CheatSearchAddResult(i); + } + } + } + else { + // only search within the previous results + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PSXMu32(SearchResults[i]) != val) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; + } +} + +void CheatSearchRange8(u8 min, u8 max) { + u32 i, j; + + CheatSearchInitBackupMemory(); + + if (SearchResults == NULL) { + // search the whole memory + for (i = 0; i < 0x200000; i++) { + if (PSXMu8(i) >= min && PSXMu8(i) <= max) { + CheatSearchAddResult(i); + } + } + } + else { + // only search within the previous results + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PSXMu8(SearchResults[i]) >= min && PSXMu8(SearchResults[i]) <= max) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; + } +} + +void CheatSearchRange16(u16 min, u16 max) { + u32 i, j; + + CheatSearchInitBackupMemory(); + + if (SearchResults == NULL) { + // search the whole memory + for (i = 0; i < 0x200000; i += 2) { + if (PSXMu16(i) >= min && PSXMu16(i) <= max) { + CheatSearchAddResult(i); + } + } + } + else { + // only search within the previous results + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PSXMu16(SearchResults[i]) >= min && PSXMu16(SearchResults[i]) <= max) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; + } +} + +void CheatSearchRange32(u32 min, u32 max) { + u32 i, j; + + CheatSearchInitBackupMemory(); + + if (SearchResults == NULL) { + // search the whole memory + for (i = 0; i < 0x200000; i += 4) { + if (PSXMu32(i) >= min && PSXMu32(i) <= max) { + CheatSearchAddResult(i); + } + } + } + else { + // only search within the previous results + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PSXMu32(SearchResults[i]) >= min && PSXMu32(SearchResults[i]) <= max) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; + } +} + +void CheatSearchIncreasedBy8(u8 val) { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PSXMu8(SearchResults[i]) - PrevMu8(SearchResults[i]) == val) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchIncreasedBy16(u16 val) { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PSXMu16(SearchResults[i]) - PrevMu16(SearchResults[i]) == val) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchIncreasedBy32(u32 val) { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PSXMu32(SearchResults[i]) - PrevMu32(SearchResults[i]) == val) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchDecreasedBy8(u8 val) { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PrevMu8(SearchResults[i]) - PSXMu8(SearchResults[i]) == val) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchDecreasedBy16(u16 val) { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PrevMu16(SearchResults[i]) - PSXMu16(SearchResults[i]) == val) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchDecreasedBy32(u32 val) { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PrevMu32(SearchResults[i]) - PSXMu32(SearchResults[i]) == val) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchIncreased8() { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PrevMu8(SearchResults[i]) < PSXMu8(SearchResults[i])) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchIncreased16() { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PrevMu16(SearchResults[i]) < PSXMu16(SearchResults[i])) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchIncreased32() { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PrevMu32(SearchResults[i]) < PSXMu32(SearchResults[i])) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchDecreased8() { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PrevMu8(SearchResults[i]) > PSXMu8(SearchResults[i])) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchDecreased16() { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PrevMu16(SearchResults[i]) > PSXMu16(SearchResults[i])) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchDecreased32() { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PrevMu32(SearchResults[i]) > PSXMu32(SearchResults[i])) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchDifferent8() { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PrevMu8(SearchResults[i]) != PSXMu8(SearchResults[i])) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchDifferent16() { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PrevMu16(SearchResults[i]) != PSXMu16(SearchResults[i])) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchDifferent32() { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PrevMu32(SearchResults[i]) != PSXMu32(SearchResults[i])) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchNoChange8() { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PrevMu8(SearchResults[i]) == PSXMu8(SearchResults[i])) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchNoChange16() { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PrevMu16(SearchResults[i]) == PSXMu16(SearchResults[i])) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} + +void CheatSearchNoChange32() { + u32 i, j; + + assert(prevM != NULL); // not possible for the first search + + j = 0; + + for (i = 0; i < NumSearchResults; i++) { + if (PrevMu32(SearchResults[i]) == PSXMu32(SearchResults[i])) { + SearchResults[j++] = SearchResults[i]; + } + } + + NumSearchResults = j; +} diff --git a/libpcsxcore/cheat.h b/libpcsxcore/cheat.h new file mode 100644 index 0000000..d54f22c --- /dev/null +++ b/libpcsxcore/cheat.h @@ -0,0 +1,117 @@ +/* Cheat Support for PCSX-Reloaded + * Copyright (C) 2009, Wei Mingzhi . + * + * This program is free software; you can redistribute it and/or modify + * it 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; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA + */ + +#ifndef CHEAT_H +#define CHEAT_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + uint32_t Addr; + uint16_t Val; +} CheatCode; + +typedef struct { + char *Descr; + int First; // index of the first cheat code + int n; // number of cheat codes for this cheat + int Enabled; +} Cheat; + +void ClearAllCheats(); + +void LoadCheats(const char *filename); +void SaveCheats(const char *filename); + +void ApplyCheats(); + +int AddCheat(const char *descr, char *code); +void RemoveCheat(int index); +int EditCheat(int index, const char *descr, char *code); + +void FreeCheatSearchResults(); +void FreeCheatSearchMem(); +void CheatSearchBackupMemory(); + +void CheatSearchEqual8(u8 val); +void CheatSearchEqual16(u16 val); +void CheatSearchEqual32(u32 val); +void CheatSearchNotEqual8(u8 val); +void CheatSearchNotEqual16(u16 val); +void CheatSearchNotEqual32(u32 val); +void CheatSearchRange8(u8 min, u8 max); +void CheatSearchRange16(u16 min, u16 max); +void CheatSearchRange32(u32 min, u32 max); +void CheatSearchIncreasedBy8(u8 val); +void CheatSearchIncreasedBy16(u16 val); +void CheatSearchIncreasedBy32(u32 val); +void CheatSearchDecreasedBy8(u8 val); +void CheatSearchDecreasedBy16(u16 val); +void CheatSearchDecreasedBy32(u32 val); +void CheatSearchIncreased8(); +void CheatSearchIncreased16(); +void CheatSearchIncreased32(); +void CheatSearchDecreased8(); +void CheatSearchDecreased16(); +void CheatSearchDecreased32(); +void CheatSearchDifferent8(); +void CheatSearchDifferent16(); +void CheatSearchDifferent32(); +void CheatSearchNoChange8(); +void CheatSearchNoChange16(); +void CheatSearchNoChange32(); + +extern Cheat *Cheats; +extern CheatCode *CheatCodes; +extern int NumCheats; +extern int NumCodes; + +extern s8 *prevM; +extern u32 *SearchResults; +extern int NumSearchResults; + +#define PREVM(mem) (&prevM[mem]) +#define PrevMu8(mem) (*(u8 *)PREVM(mem)) +#define PrevMu16(mem) (SWAP16(*(u16 *)PREVM(mem))) +#define PrevMu32(mem) (SWAP32(*(u32 *)PREVM(mem))) + +// cheat types +#define CHEAT_CONST8 0x30 /* 8-bit Constant Write */ +#define CHEAT_CONST16 0x80 /* 16-bit Constant Write */ +#define CHEAT_INC16 0x10 /* 16-bit Increment */ +#define CHEAT_DEC16 0x11 /* 16-bit Decrement */ +#define CHEAT_INC8 0x20 /* 8-bit Increment */ +#define CHEAT_DEC8 0x21 /* 8-bit Decrement */ +#define CHEAT_SLIDE 0x50 /* Slide Codes */ +#define CHEAT_MEMCPY 0xC2 /* Memory Copy */ + +#define CHEAT_EQU8 0xE0 /* 8-bit Equal To */ +#define CHEAT_NOTEQU8 0xE1 /* 8-bit Not Equal To */ +#define CHEAT_LESSTHAN8 0xE2 /* 8-bit Less Than */ +#define CHEAT_GREATERTHAN8 0xE3 /* 8-bit Greater Than */ +#define CHEAT_EQU16 0xD0 /* 16-bit Equal To */ +#define CHEAT_NOTEQU16 0xD1 /* 16-bit Not Equal To */ +#define CHEAT_LESSTHAN16 0xD2 /* 16-bit Less Than */ +#define CHEAT_GREATERTHAN16 0xD3 /* 16-bit Greater Than */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/coff.h b/libpcsxcore/coff.h new file mode 100644 index 0000000..1d084d2 --- /dev/null +++ b/libpcsxcore/coff.h @@ -0,0 +1,38 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __COFF_H__ +#define __COFF_H__ + +/********************** FILE HEADER **********************/ + +struct external_filehdr { + unsigned short f_magic; /* magic number */ + unsigned short f_nscns; /* number of sections */ + unsigned long f_timdat; /* time & date stamp */ + unsigned long f_symptr; /* file pointer to symtab */ + unsigned long f_nsyms; /* number of symtab entries */ + unsigned short f_opthdr; /* sizeof(optional hdr) */ + unsigned short f_flags; /* flags */ +}; + +#define FILHDR struct external_filehdr +#define FILHSZ sizeof(FILHDR) + +#endif diff --git a/libpcsxcore/debug.c b/libpcsxcore/debug.c new file mode 100644 index 0000000..307a002 --- /dev/null +++ b/libpcsxcore/debug.c @@ -0,0 +1,1145 @@ +/* Pcsx - Pc Psx Emulator + * Copyright (C) 1999-2003 Pcsx Team + * + * This program is free software; you can redistribute it and/or modify + * it 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; if not, see . + */ + +#include "psxcommon.h" +#include "r3000a.h" +#include "debug.h" +#include "socket.h" + +/* +PCSX Debug console protocol description, version 1.0 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Commands number are formatted using %03X (yes) +Registers number are formatted using %02X. +Breakpoints numbers are formatted using %X +All other values are formatted using %08X, unless specified. + + +Client inputs: +~~~~~~~~~~~~~ +Basic commands (1xx): +-------------------- +100 + Sends a dumb message. Will be replied with a 200 reply, followed by the message. +101 + Gets PCSX version. +102 + Gets protocol version. +103 + Gets status +110 + Gets PC. +111 [reg] + Gets GP register, or all, if no argument. +112 + Gets LO/HI registers. +113 [reg] + Gets COP0 register, or all, if no argument. +114 [reg] + Gets COP2 control register, or all, if no argument. +115 [reg] + Gets COP2 data register, or all, if no argument. +119 [pc] + Disassemble current PC, or given PC. +121 = + Sets a GP register. Will return a 221 message. +122 = + Sets LO or HI register. Will return a 222 message. +123 = + Sets a COP0 register. Will return a 223 message. +124 = + Sets a COP2 control register. Will return a 224 message. +125 = + Sets a COP2 data register. Will return a 225 message. +130 @ + Dumps a range of memory, of size bytes starting at addr. +140 @ + Sets a range of memory, of size bytes starting at addr. + Will have to send immediately exactly size bytes afterward. +150 [number] + Starts/reset mapping execution flow, or stop it if number = 0 +151 [number] + Starts/reset mapping read8 flow, or stop it if number = 0 +152 [number] + Starts/reset mapping read16 flow, or stop it if number = 0 +153 [number] + Starts/reset mapping read32 flow, or stop it if number = 0 +154 [number] + Starts/reset mapping write8 flow, or stop it if number = 0 +155 [number] + Starts/reset mapping write16 flow, or stop it if number = 0 +156 [number] + Starts/reset mapping write32 flow, or stop it if number = 0 +160 [number] + Breaks on map exec flow, or stop it if number = 0 +161 [number] + Breaks on map read8 flow, or stop it if number = 0 +162 [number] + Breaks on map read16 flow, or stop it if number = 0 +163 [number] + Breaks on map read32 flow, or stop it if number = 0 +164 [number] + Breaks on map write8 flow, or stop it if number = 0 +165 [number] + Breaks on map write16 flow, or stop it if number = 0 +166 [number] + Breaks on map write32 flow, or stop it if number = 0 +170 + Dumps the execution flow map in an IDC file + +Execution flow control commands (3xx): +------------------------------------- +300 [number] + Get a list of the actual breakpoints. Will get '400' answers. +301 [number] + Deletes a breakpoint, or all, if no arguments. +310
+ Sets an exec breakpoint. +320
+ Sets a read breakpoint, 1 byte / 8 bits. +321
+ Sets a read breakpoint, 2 bytes / 16 bits, has to be on an even address. +322
+ Sets a read breakpoint, 4 bytes / 32 bits, address has to be 4-bytes aligned. +330
+ Sets a write breakpoint, 1 byte / 8 bits. +331
+ Sets a write breakpoint, 2 bytes / 16 bits, has to be on an even address. +332
+ Sets a write breakpoint, 4 bytes / 32 bits, address has to be 4-bytes aligned. +390 + Pauses execution. Equivalents to a breakpoint. +391 + Restarts execution. +395 [number] + Traces execution, 1 instruction by default. Formatted using %i +398 + Soft (quick) resets. +399 + Resets. + + +Server outputs: +~~~~~~~~~~~~~~ +Spontaneous messages (0xx): +-------------------------- +000 + Greeting banner. +010 / 011 / 012 / 013 / 014 / 015 / 016 + Execution hit mapping flow automatic breakpoint. +030 @ + Execution hit breakpoint, PCSX is paused. Displays PC's value. + +Basic commands acknowledge (2xx): +-------------------------------- +200 + Sends a dumb message. +201 + Returns PCSX version. +202 + Returns protocol version. +203 + status = 0: running; = 1: paused; = 2: trace +210 PC= + Displays current PC value. +211 = + Displays one GP register value. +212 LO= HI= + Displays LO/HI registers. +213 = + Displays one COP0 register value. +214 = + Displays one COP2 control register value. +215 = + Displays one COP2 data register value. +219 + Displays one line of disassembled code. +221 = + Displays one GP register value, ack for modification. +222 LO= HI= + Displays LO/HI registers, ack for modification. +223 = + Displays one COP0 register value, ack for modification. +224 = + Displays one COP2 control register value, ack for modification. +225 = + Displays one COP2 data register value, ack for modification. +230 @ + Dumping memory. Will then raw outputs size bytes. +240 @ + Memory set acknowledge. +250 / 251 / 252 / 253 / 254 / 255 / 256 + Acknolwedge of 15x commands. +260 / 261 / 262 / 263 / 264 / 265 / 266 + Acknolwedge of 16x commands. +270 + Acknolwedge of 170 command. + +Execution flow control commands acknowledge (4xx): +------------------------------------------------- +400 @
- + Displays a breakpoint, where 'type' can be of E, R1, R2, R4, W1, W2 or W4. +401 + Breakpoint deleting acknowledge. +410, 420, 421, 422, 430, 431, 432 + Breakpoint adding acknowledge. Returns the number of the added breakpoint. +490 + Pausing. +491 + Resuming. +495 + Tracing. +498 + Soft resetting. +499 + Resetting. + +Error messages (5xx): +-------------------- +500 + Command not understood. +511 + Invalid GPR register. +512 + Invalid LO/HI register. +513, 514 + Invalid range or address. +530 + Non existant breakpoint. +531, 532, 533 + Invalid breakpoint address. +*/ + +static int debugger_active = 0, paused = 0, trace = 0, reset = 0, resetting = 0; +static int mapping_e = 0, mapping_r8 = 0, mapping_r16 = 0, mapping_r32 = 0, mapping_w8 = 0, mapping_w16 = 0, mapping_w32 = 0; +static int breakmp_e = 0, breakmp_r8 = 0, breakmp_r16 = 0, breakmp_r32 = 0, breakmp_w8 = 0, breakmp_w16 = 0, breakmp_w32 = 0; + +static void ProcessCommands(); + +static u8 *MemoryMap = NULL; + +enum { + MAP_EXEC = 1, + MAP_R8 = 2, + MAP_R16 = 4, + MAP_R32 = 8, + MAP_W8 = 16, + MAP_W16 = 32, + MAP_W32 = 64, + MAP_EXEC_JAL = 128, +}; + +char *breakpoint_type_names[] = { + "E", "R1", "R2", "R4", "W1", "W2", "W4" +}; + +typedef struct breakpoint_s { + struct breakpoint_s *next, *prev; + int number, type; + u32 address; +} breakpoint_t; + +static breakpoint_t *first = NULL; + +int add_breakpoint(int type, u32 address) { + breakpoint_t *bp = (breakpoint_t *)malloc(sizeof(breakpoint_t)); + + bp->type = type; + bp->address = address; + + if (first) { + bp->number = first->prev->number + 1; + bp->next = first; + bp->prev = first->prev; + first->prev = bp; + bp->prev->next = bp; + } else { + first = bp; + bp->number = 1; + bp->next = bp; + bp->prev = bp; + } + + return bp->number; +} + +void delete_breakpoint(breakpoint_t * bp) { + if (bp == first) { + if (bp->next == bp) { + first = NULL; + } else { + first = bp->next; + } + } + + bp->next->prev = bp->prev; + bp->prev->next = bp->next; + + free(bp); +} + +breakpoint_t *next_breakpoint(breakpoint_t *bp) { + return bp->next != first ? bp->next : 0; +} + +breakpoint_t *find_breakpoint(int number) { + breakpoint_t *p; + + for (p = first; p; p = next_breakpoint(p)) { + if (p->number == number) + return p; + } + + return 0; +} + +void StartDebugger() { + if (debugger_active) + return; + + MemoryMap = (u8 *)malloc(0x200000); + if (MemoryMap == NULL) { + SysMessage(_("Error allocating memory")); + return; + } + + if (StartServer() == -1) { + SysPrintf(_("Unable to start debug server.\n")); + return; + } + + SysPrintf(_("Debugger started.\n")); + debugger_active = 1; +} + +void StopDebugger() { + if (debugger_active) { + StopServer(); + SysPrintf(_("Debugger stopped.\n")); + } + + if (MemoryMap != NULL) { + free(MemoryMap); + MemoryMap = NULL; + } + + while (first != NULL) delete_breakpoint(first); + + debugger_active = 0; +} + +void PauseDebugger() { + trace = 0; + paused = 1; +} + +void ResumeDebugger() { + trace = 0; + paused = 0; +} + +void DebugVSync() { + if (!debugger_active || resetting) + return; + + if (reset) { + resetting = 1; + CheckCdrom(); + SysReset(); + if (reset == 2) + LoadCdrom(); + reset = resetting = 0; + return; + } + + GetClient(); + ProcessCommands(); +} + +void MarkMap(u32 address, int mask) { + if ((address & 0xff000000) != 0x80000000) return; + MemoryMap[address & 0x001fffff] |= mask; +} + +int IsMapMarked(u32 address, int mask) { + return (MemoryMap[address & 0x001fffff] & mask) != 0; +} + +void ProcessDebug() { + if (!debugger_active || reset || resetting) + return; + if (trace) { + if (!(--trace)) { + paused = 1; + } + } + if (!paused) { + DebugCheckBP(psxRegs.pc, E); + } + if (mapping_e) { + MarkMap(psxRegs.pc, MAP_EXEC); + if ((psxRegs.code >> 26) == 3) { + MarkMap(_JumpTarget_, MAP_EXEC_JAL); + } + if (((psxRegs.code >> 26) == 0) && ((psxRegs.code && 0x3F) == 9)) { + MarkMap(_Rd_, MAP_EXEC_JAL); + } + } + while (paused) { + GetClient(); + ProcessCommands(); + GPU_updateLace(); + SysUpdate(); + } +} + +static void ProcessCommands() { + int code, i, dumping; + FILE *sfile; + char cmd[257], *arguments, *p, reply[10240], *save, *dump; + u32 reg, value, size, address; + breakpoint_t *bp; + + if (!HasClient()) + return; + if (ReadSocket(cmd, 256) > 0) { + arguments = NULL; + if (strlen(cmd) <= 2) { + code = 0; + } else if (strlen(cmd) == 3) { + code = strtol(cmd, 0, 16); + } else if (!(isxdigit(cmd[0]) && isxdigit(cmd[1]) && isxdigit(cmd[2]) && (cmd[3] == 0x20))) { + code = 0; + } else if (sscanf(cmd, "%3X ", &code) != 1) { + code = 0; + } else { + arguments = cmd + 4; + } + code = strtol(cmd, &arguments, 16); + while (arguments && *arguments && *arguments == 0x20) + arguments++; + + if (*arguments == '\0') + arguments = NULL; + + dumping = 0; + save = NULL; + + switch (code) { + case 0x100: + sprintf(reply, "200 %s\r\n", arguments == NULL ? "OK" : arguments); + break; + case 0x101: + sprintf(reply, "201 %s\r\n", PACKAGE_VERSION); + break; + case 0x102: + sprintf(reply, "202 1.0\r\n"); + break; + case 0x103: + sprintf(reply, "203 %i\r\n", paused ? 1 : trace ? 2 : 0); + break; + case 0x110: + sprintf(reply, "210 PC=%08X\r\n", psxRegs.pc); + break; + case 0x111: + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "511 Malformed 111 command '%s'\r\n", cmd); + break; + } + } + if (!arguments) { + reply[0] = 0; + for (i = 0; i < 32; i++) { + sprintf(reply, "%s211 %02X=%08X\r\n", reply, i, psxRegs.GPR.r[i]); + } + } else { + if ((code >= 0) && (code < 32)) { + sprintf(reply, "211 %02X=%08X\r\n", code, psxRegs.GPR.r[code]); + } else { + sprintf(reply, "511 Invalid GPR register: %X\r\n", code); + } + } + break; + case 0x112: + sprintf(reply, "212 LO=%08X HI=%08X\r\n", psxRegs.GPR.n.lo, psxRegs.GPR.n.hi); + break; + case 0x113: + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "511 Malformed 113 command '%s'\r\n", cmd); + break; + } + } + if (!arguments) { + reply[0] = 0; + for (i = 0; i < 32; i++) { + sprintf(reply, "%s213 %02X=%08X\r\n", reply, i, psxRegs.CP0.r[i]); + } + } else { + if ((code >= 0) && (code < 32)) { + sprintf(reply, "213 %02X=%08X\r\n", code, psxRegs.CP0.r[code]); + } else { + sprintf(reply, "511 Invalid COP0 register: %X\r\n", code); + } + } + break; + case 0x114: + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "511 Malformed 114 command '%s'\r\n", cmd); + break; + } + } + if (!arguments) { + reply[0] = 0; + for (i = 0; i < 32; i++) { + sprintf(reply, "%s214 %02X=%08X\r\n", reply, i, psxRegs.CP2C.r[i]); + } + } else { + if ((code >= 0) && (code < 32)) { + sprintf(reply, "214 %02X=%08X\r\n", code, psxRegs.CP2C.r[code]); + } else { + sprintf(reply, "511 Invalid COP2C register: %X\r\n", code); + } + } + break; + case 0x115: + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "511 Malformed 111 command '%s'\r\n", cmd); + break; + } + } + if (!arguments) { + reply[0] = 0; + for (i = 0; i < 32; i++) { + sprintf(reply, "%s215 %02X=%08X\r\n", reply, i, psxRegs.CP2D.r[i]); + } + } else { + if ((code >= 0) && (code < 32)) { + sprintf(reply, "215 %02X=%08X\r\n", code, psxRegs.CP2D.r[code]); + } else { + sprintf(reply, "511 Invalid COP2D register: %X\r\n", code); + } + } + break; + case 0x119: + if (arguments) { + if (sscanf(arguments, "%08X", &code) != 1) { + sprintf(reply, "511 Malformed 119 command '%s'\r\n", cmd); + break; + } + } + if (!arguments) + code = psxRegs.pc; + + sprintf(reply, "219 %s\r\n", disR3000AF(psxMemRead32(code), code)); + break; + case 0x121: + if (!arguments || sscanf(arguments, "%02X=%08X", ®, &value) != 2) { + sprintf(reply, "500 Malformed 121 command '%s'\r\n", arguments); + break; + } + + if (reg < 32) { + psxRegs.GPR.r[reg] = value; + sprintf(reply, "221 %02X=%08X\r\n", reg, value); + } else { + sprintf(reply, "512 Invalid GPR register: %02X\r\n", reg); + } + break; + case 0x122: + if (!arguments || strncmp(arguments, "HI=", 3) == 0) { + reg = 33; + } else if (arguments && strncmp(arguments, "LO=", 3) == 0) { + reg = 32; + } else { + arguments[2] = 0; + sprintf(reply, "512 Invalid LO/HI register: '%s'\r\n", arguments); + break; + } + + if (sscanf(arguments + 3, "%08X", &value) != 1) { + sprintf(reply, "500 Malformed 122 command '%s'\r\n", arguments); + } else { + psxRegs.GPR.r[reg] = value; + sprintf(reply, "222 LO=%08X HI=%08X\r\n", psxRegs.GPR.n.lo, psxRegs.GPR.n.hi); + } + break; + case 0x123: + if (!arguments || sscanf(arguments, "%02X=%08X", ®, &value) != 2) { + sprintf(reply, "500 Malformed 123 command '%s'\r\n", arguments); + break; + } + + if (reg < 32) { + psxRegs.CP0.r[reg] = value; + sprintf(reply, "223 %02X=%08X\r\n", reg, value); + } else { + sprintf(reply, "512 Invalid COP0 register: %02X\r\n", reg); + } + break; + case 0x124: + if (!arguments || sscanf(arguments, "%02X=%08X", ®, &value) != 2) { + sprintf(reply, "500 Malformed 124 command '%s'\r\n", arguments); + break; + } + + if (reg < 32) { + psxRegs.CP2C.r[reg] = value; + sprintf(reply, "224 %02X=%08X\r\n", reg, value); + } else { + sprintf(reply, "512 Invalid COP2C register: %02X\r\n", reg); + } + break; + case 0x125: + if (!arguments || sscanf(arguments, "%02X=%08X", ®, &value) != 2) { + sprintf(reply, "500 Malformed 121 command '%s'\r\n", arguments); + break; + } + + if (reg < 32) { + psxRegs.CP2D.r[reg] = value; + sprintf(reply, "225 %02X=%08X\r\n", reg, value); + } else { + sprintf(reply, "512 Invalid COP2D register: %02X\r\n", reg); + } + break; + case 0x130: + if (!arguments || sscanf(arguments, "%08X@%08X", &size, &address) != 2) { + sprintf(reply, "500 Malformed 130 command '%s'\r\n", arguments); + break; + } + + if ((address >= 0x80000000) && ((address + size) <= 0x80200000)) { + sprintf(reply, "230 %08X@%08X\r\n", size, address); + dump = (char *) PSXM(address); + dumping = 1; + } else { + sprintf(reply, "513 Invalid address or range: '%s'\r\n", arguments); + } + break; + case 0x140: + if (!arguments || sscanf(arguments, "%08X@%08X", &size, &address) != 2) { + sprintf(reply, "500 Malformed 140 command '%s'\r\n", arguments); + break; + } + + if ((address >= 0x80000000) && ((address + size) <= 0x80200000)) { + sprintf(reply, "240 %08X@%08X\r\n", size, address); + RawReadSocket((char *)PSXM(address), size); + } else { + sprintf(reply, "514 Invalid address or range: '%s'\r\n", arguments); + } + break; + case 0x150: + code = 1; + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "500 Malformed 150 command '%s'\r\n", cmd); + break; + } + } + if (code) { + mapping_e = 1; + for (i = 0; i < 0x00200000; i++) { + MemoryMap[i] &= ~MAP_EXEC; + MemoryMap[i] &= ~MAP_EXEC_JAL; + } + } else { + mapping_e = 0; + } + sprintf(reply, "250 Mapping of exec flow %s\r\n", code ? "started" : "stopped"); + break; + case 0x151: + code = 1; + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "500 Malformed 151 command '%s'\r\n", cmd); + break; + } + } + if (code) { + mapping_r8 = 1; + for (i = 0; i < 0x00200000; i++) { + MemoryMap[i] &= ~MAP_R8; + } + } else { + mapping_r8 = 0; + } + sprintf(reply, "251 Mapping of read8 flow %s\r\n", code ? "started" : "stopped"); + break; + case 0x152: + code = 1; + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "500 Malformed 152 command '%s'\r\n", cmd); + break; + } + } + if (code) { + mapping_r16 = 1; + for (i = 0; i < 0x00200000; i++) { + MemoryMap[i] &= ~MAP_R16; + } + } else { + mapping_r16 = 0; + } + sprintf(reply, "252 Mapping of read16 flow %s\r\n", code ? "started" : "stopped"); + break; + case 0x153: + code = 1; + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "500 Malformed 153 command '%s'\r\n", cmd); + break; + } + } + if (code) { + mapping_r32 = 1; + for (i = 0; i < 0x00200000; i++) { + MemoryMap[i] &= ~MAP_R32; + } + } else { + mapping_r32 = 0; + } + sprintf(reply, "253 Mapping of read32 flow %s\r\n", code ? "started" : "stopped"); + break; + case 0x154: + code = 1; + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "500 Malformed 154 command '%s'\r\n", cmd); + break; + } + } + if (code) { + mapping_w8 = 1; + for (i = 0; i < 0x00200000; i++) { + MemoryMap[i] &= ~MAP_W8; + } + } else { + mapping_w8 = 0; + } + sprintf(reply, "254 Mapping of write8 flow %s\r\n", code ? "started" : "stopped"); + break; + case 0x155: + code = 1; + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "500 Malformed 155 command '%s'\r\n", cmd); + break; + } + } + if (code) { + mapping_w16 = 1; + for (i = 0; i < 0x00200000; i++) { + MemoryMap[i] &= ~MAP_W16; + } + } else { + mapping_w16 = 0; + } + sprintf(reply, "255 Mapping of write16 flow %s\r\n", code ? "started" : "stopped"); + break; + case 0x156: + code = 1; + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "500 Malformed 156 command '%s'\r\n", cmd); + break; + } + } + if (code) { + mapping_w32 = 1; + for (i = 0; i < 0x00200000; i++) { + MemoryMap[i] &= ~MAP_W32; + } + } else { + mapping_w32 = 0; + } + sprintf(reply, "256 Mapping of write32 flow %s\r\n", code ? "started" : "stopped"); + break; + case 0x160: + code = 1; + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "500 Malformed 160 command '%s'\r\n", cmd); + break; + } + } + if (code) { + breakmp_e = 1; + } else { + breakmp_e = 0; + } + sprintf(reply, "260 Break on map of exec flow %s\r\n", code ? "started" : "stopped"); + break; + case 0x161: + code = 1; + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "500 Malformed 161 command '%s'\r\n", cmd); + break; + } + } + if (code) { + breakmp_r8 = 1; + } else { + breakmp_r8 = 0; + } + sprintf(reply, "261 Break on map of read8 flow %s\r\n", code ? "started" : "stopped"); + break; + case 0x162: + code = 1; + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "500 Malformed 162 command '%s'\r\n", cmd); + break; + } + } + if (code) { + breakmp_r16 = 1; + } else { + breakmp_r16 = 0; + } + sprintf(reply, "262 Break on map of read16 flow %s\r\n", code ? "started" : "stopped"); + break; + case 0x163: + code = 1; + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "500 Malformed 163 command '%s'\r\n", cmd); + break; + } + } + if (code) { + breakmp_r32 = 1; + } else { + breakmp_r32 = 0; + } + sprintf(reply, "263 Break on map of read32 flow %s\r\n", code ? "started" : "stopped"); + break; + case 0x164: + code = 1; + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "500 Malformed 164 command '%s'\r\n", cmd); + break; + } + } + if (code) { + breakmp_w8 = 1; + } else { + breakmp_w8 = 0; + } + sprintf(reply, "264 Break on map of write8 flow %s\r\n", code ? "started" : "stopped"); + break; + case 0x165: + code = 1; + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "500 Malformed 165 command '%s'\r\n", cmd); + break; + } + } + if (code) { + breakmp_w16 = 1; + } else { + breakmp_w16 = 0; + } + sprintf(reply, "265 Break on map of write16 flow %s\r\n", code ? "started" : "stopped"); + break; + case 0x166: + code = 1; + if (arguments) { + if (sscanf(arguments, "%02X", &code) != 1) { + sprintf(reply, "500 Malformed 166 command '%s'\r\n", cmd); + break; + } + } + if (code) { + breakmp_w32 = 1; + } else { + breakmp_w32 = 0; + } + sprintf(reply, "266 Break on map of write32 flow %s\r\n", code ? "started" : "stopped"); + break; + case 0x170: + sfile = fopen("flow.idc", "wb"); + fprintf(sfile, "#include \r\n\r\n"); + fprintf(sfile, "static main(void) {\r\n"); + for (i = 0; i < 0x00200000; i++) { + if (IsMapMarked(i, MAP_EXEC_JAL)) { + fprintf(sfile, "\tMakeFunction(0X8%07X,BADADDR);\r\n", i); + } + } + fprintf(sfile, "}\r\n"); + fclose(sfile); + sfile = fopen("markcode.idc", "wb"); + fprintf(sfile, "#include \r\n\r\n"); + fprintf(sfile, "static main(void) {\r\n"); + for (i = 0; i < 0x00200000; i++) { + if (IsMapMarked(i, MAP_EXEC)) { + fprintf(sfile, "\tMakeCode(0X8%07X);\r\n", i); + } + } + fprintf(sfile, "}\r\n"); + fclose(sfile); + sprintf(reply, "270 flow.idc and markcode.idc dumped\r\n"); + break; + case 0x300: + p = arguments; + if (arguments) { + code = strtol(arguments, &p, 16); + } + if (p == arguments) { + if (first) { + reply[0] = 0; + for (bp = first; bp; bp = next_breakpoint(bp)) { + sprintf(reply, "%s400 %X@%08X-%s\r\n", reply, bp->number, bp->address, breakpoint_type_names[bp->type]); + } + } else { + sprintf(reply, "530 No breakpoint\r\n"); + } + } else { + if ((bp = find_breakpoint(code))) { + sprintf(reply, "400 %X@%08X-%s\r\n", bp->number, bp->address, breakpoint_type_names[bp->type]); + } else { + sprintf(reply, "530 Invalid breakpoint number: %X\r\n", code); + } + } + break; + case 0x301: + p = arguments; + if (arguments) { + code = strtol(arguments, &p, 16); + } + if (p == arguments) { + while (first != NULL) delete_breakpoint(first); + sprintf(reply, "401 All breakpoints deleted.\r\n"); + } else { + if ((bp = find_breakpoint(code))) { + delete_breakpoint(bp); + sprintf(reply, "401 Breakpoint %X deleted.\r\n", code); + } else { + sprintf(reply, "530 Invalid breakpoint number: %X\r\n", code); + } + } + break; + case 0x310: + if (!arguments || sscanf(arguments, "%08X", &address) != 1) { + sprintf(reply, "500 Malformed 310 command '%s'\r\n", arguments); + break; + } +// if ((address & 3) || (address < 0x80000000) || (address >= 0x80200000)) { +// sprintf(reply, "531 Invalid address %08X\r\n", address); +// break; +// } + code = add_breakpoint(E, address); + sprintf(reply, "410 %X\r\n", code); + break; + case 0x320: + if (!arguments || sscanf(arguments, "%08X", &address) != 1) { + sprintf(reply, "500 Malformed 320 command '%s'\r\n", arguments); + break; + } + if ((address < 0x80000000) || (address >= 0x80200000)) { + sprintf(reply, "532 Invalid address %08X\r\n", address); + break; + } + code = add_breakpoint(R1, address); + sprintf(reply, "420 %X\r\n", code); + break; + case 0x321: + if (!arguments || sscanf(arguments, "%08X", &address) != 1) { + sprintf(reply, "500 Malformed 321 command '%s'\r\n", arguments); + break; + } + if ((address & 1) || (address < 0x80000000) || (address >= 0x80200000)) { + sprintf(reply, "532 Invalid address %08X\r\n", address); + break; + } + code = add_breakpoint(R2, address); + sprintf(reply, "421 %X\r\n", code); + break; + case 0x322: + if (!arguments || sscanf(arguments, "%08X", &address) != 1) { + sprintf(reply, "500 Malformed 322 command '%s'\r\n", arguments); + break; + } + if ((address & 3) || (address < 0x80000000) || (address >= 0x80200000)) { + sprintf(reply, "532 Invalid address %08X\r\n", address); + break; + } + code = add_breakpoint(R4, address); + sprintf(reply, "422 %X\r\n", code); + break; + case 0x330: + if (!arguments || sscanf(arguments, "%08X", &address) != 1) { + sprintf(reply, "500 Malformed 330 command '%s'\r\n", arguments); + break; + } + if ((address < 0x80000000) || (address >= 0x80200000)) { + sprintf(reply, "533 Invalid address %08X\r\n", address); + break; + } + code = add_breakpoint(W1, address); + sprintf(reply, "430 %X\r\n", code); + break; + case 0x331: + if (!arguments || sscanf(arguments, "%08X", &address) != 1) { + sprintf(reply, "500 Malformed 331 command '%s'\r\n", arguments); + break; + } + if ((address & 1) || (address < 0x80000000) || (address >= 0x80200000)) { + sprintf(reply, "533 Invalid address %08X\r\n", address); + break; + } + code = add_breakpoint(W2, address); + sprintf(reply, "431 %X\r\n", code); + break; + case 0x332: + if (!arguments || sscanf(arguments, "%08X", &address) != 1) { + sprintf(reply, "500 Malformed 332 command '%s'\r\n", arguments); + break; + } + if ((address & 3) || (address < 0x80000000) || (address >= 0x80200000)) { + sprintf(reply, "533 Invalid address %08X\r\n", address); + break; + } + code = add_breakpoint(W4, address); + sprintf(reply, "432 %X\r\n", code); + break; + case 0x390: + paused = 1; + sprintf(reply, "490 Paused\r\n"); + break; + case 0x391: + paused = 0; + sprintf(reply, "491 Resumed\r\n"); + break; + case 0x395: + p = arguments; + if (arguments) { + trace = strtol(arguments, &p, 10); + } + if (p == arguments) { + trace = 1; + } + paused = 0; + sprintf(reply, "495 Tracing\r\n"); + break; + case 0x398: + paused = 0; + trace = 0; + reset = 2; + sprintf(reply, "498 Soft resetting\r\n"); + break; + case 0x399: + paused = 0; + trace = 0; + reset = 1; + sprintf(reply, "499 Resetting\r\n"); + break; + default: + sprintf(reply, "500 Unknown command '%s'\r\n", cmd); + break; + } + WriteSocket(reply, strlen(reply)); + + if (dumping) { + WriteSocket(dump, size); + } + + if (save) { + free(save); + } + } +} + +void DebugCheckBP(u32 address, enum breakpoint_types type) { + breakpoint_t *bp; + char reply[512]; + + if (!debugger_active || reset) + return; + for (bp = first; bp; bp = next_breakpoint(bp)) { + if ((bp->type == type) && (bp->address == address)) { + sprintf(reply, "030 %X@%08X\r\n", bp->number, psxRegs.pc); + WriteSocket(reply, strlen(reply)); + paused = 1; + return; + } + } + if (breakmp_e && type == E) { + if (!IsMapMarked(address, MAP_EXEC)) { + sprintf(reply, "010 %08X@%08X\r\n", address, psxRegs.pc); + WriteSocket(reply, strlen(reply)); + paused = 1; + } + } + if (breakmp_r8 && type == R1) { + if (!IsMapMarked(address, MAP_R8)) { + sprintf(reply, "011 %08X@%08X\r\n", address, psxRegs.pc); + WriteSocket(reply, strlen(reply)); + paused = 1; + } + } + if (breakmp_r16 && type == R2) { + if (!IsMapMarked(address, MAP_R16)) { + sprintf(reply, "012 %08X@%08X\r\n", address, psxRegs.pc); + WriteSocket(reply, strlen(reply)); + paused = 1; + } + } + if (breakmp_r32 && type == R4) { + if (!IsMapMarked(address, MAP_R32)) { + sprintf(reply, "013 %08X@%08X\r\n", address, psxRegs.pc); + WriteSocket(reply, strlen(reply)); + paused = 1; + } + } + if (breakmp_w8 && type == W1) { + if (!IsMapMarked(address, MAP_W8)) { + sprintf(reply, "014 %08X@%08X\r\n", address, psxRegs.pc); + WriteSocket(reply, strlen(reply)); + paused = 1; + } + } + if (breakmp_w16 && type == W2) { + if (!IsMapMarked(address, MAP_W16)) { + sprintf(reply, "015 %08X@%08X\r\n", address, psxRegs.pc); + WriteSocket(reply, strlen(reply)); + paused = 1; + } + } + if (breakmp_w32 && type == W4) { + if (!IsMapMarked(address, MAP_W32)) { + sprintf(reply, "016 %08X@%08X\r\n", address, psxRegs.pc); + WriteSocket(reply, strlen(reply)); + paused = 1; + } + } + if (mapping_r8 && type == R1) MarkMap(address, MAP_R8); + if (mapping_r16 && type == R2) MarkMap(address, MAP_R16); + if (mapping_r32 && type == R4) MarkMap(address, MAP_R32); + if (mapping_w8 && type == W1) MarkMap(address, MAP_W8); + if (mapping_w16 && type == W2) MarkMap(address, MAP_W16); + if (mapping_w32 && type == W4) MarkMap(address, MAP_W32); + } diff --git a/libpcsxcore/debug.h b/libpcsxcore/debug.h new file mode 100644 index 0000000..5c5336d --- /dev/null +++ b/libpcsxcore/debug.h @@ -0,0 +1,72 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +enum breakpoint_types { + E, R1, R2, R4, W1, W2, W4 +}; + +void StartDebugger(); +void StopDebugger(); + +void DebugVSync(); +void ProcessDebug(); + +void DebugCheckBP(u32 address, enum breakpoint_types type); + +void PauseDebugger(); +void ResumeDebugger(); + +extern char *disRNameCP0[]; + +char* disR3000AF(u32 code, u32 pc); + +/* + * Specficies which logs should be activated. + */ + +//#define LOG_STDOUT + +//#define PAD_LOG __Log +//#define GTE_LOG __Log +//#define CDR_LOG __Log("%8.8lx %8.8lx: ", psxRegs.pc, psxRegs.cycle); __Log + +//#define PSXHW_LOG __Log("%8.8lx %8.8lx: ", psxRegs.pc, psxRegs.cycle); __Log +//#define PSXBIOS_LOG __Log("%8.8lx %8.8lx: ", psxRegs.pc, psxRegs.cycle); __Log +//#define PSXDMA_LOG __Log +//#define PSXMEM_LOG __Log("%8.8lx %8.8lx: ", psxRegs.pc, psxRegs.cycle); __Log +//#define PSXCPU_LOG __Log + +//#define CDRCMD_DEBUG + +#if defined (PSXCPU_LOG) || defined(PSXDMA_LOG) || defined(CDR_LOG) || defined(PSXHW_LOG) || \ + defined(PSXBIOS_LOG) || defined(PSXMEM_LOG) || defined(GTE_LOG) || defined(PAD_LOG) +#define EMU_LOG __Log +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/decode_xa.c b/libpcsxcore/decode_xa.c new file mode 100644 index 0000000..ee1dd6f --- /dev/null +++ b/libpcsxcore/decode_xa.c @@ -0,0 +1,367 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* XA audio decoding functions (Kazzuya). +*/ + +#include "decode_xa.h" + +#define FIXED + +#define NOT(_X_) (!(_X_)) +#define XACLAMP(_X_,_MI_,_MA_) {if(_X_<_MI_)_X_=_MI_;if(_X_>_MA_)_X_=_MA_;} + +#define SH 4 +#define SHC 10 + +//============================================ +//=== ADPCM DECODING ROUTINES +//============================================ + +#ifndef FIXED +static double K0[4] = { + 0.0, + 0.9375, + 1.796875, + 1.53125 +}; + +static double K1[4] = { + 0.0, + 0.0, + -0.8125, + -0.859375 +}; +#else +static int K0[4] = { + 0.0 * (1<y0 = 0; + decp->y1 = 0; +} + +//=========================================== +#ifndef FIXED +#define IK0(fid) ((int)((-K0[fid]) * (1<> 4) & 0x0f; + range = (filter_range >> 0) & 0x0f; + + fy0 = decp->y0; + fy1 = decp->y1; + + for (i = BLKSIZ/4; i; --i) { + s32 y; + s32 x0, x1, x2, x3; + + y = *blockp++; + x3 = (short)( y & 0xf000) >> range; x3 <<= SH; + x2 = (short)((y << 4) & 0xf000) >> range; x2 <<= SH; + x1 = (short)((y << 8) & 0xf000) >> range; x1 <<= SH; + x0 = (short)((y << 12) & 0xf000) >> range; x0 <<= SH; + + x0 -= (IK0(filterid) * fy0 + (IK1(filterid) * fy1)) >> SHC; fy1 = fy0; fy0 = x0; + x1 -= (IK0(filterid) * fy0 + (IK1(filterid) * fy1)) >> SHC; fy1 = fy0; fy0 = x1; + x2 -= (IK0(filterid) * fy0 + (IK1(filterid) * fy1)) >> SHC; fy1 = fy0; fy0 = x2; + x3 -= (IK0(filterid) * fy0 + (IK1(filterid) * fy1)) >> SHC; fy1 = fy0; fy0 = x3; + + XACLAMP( x0, -32768<> SH; destp += inc; + XACLAMP( x1, -32768<> SH; destp += inc; + XACLAMP( x2, -32768<> SH; destp += inc; + XACLAMP( x3, -32768<> SH; destp += inc; + } + decp->y0 = fy0; + decp->y1 = fy1; +} + +static int headtable[4] = {0,2,8,10}; + +//=========================================== +static void xa_decode_data( xa_decode_t *xdp, unsigned char *srcp ) { + const u8 *sound_groupsp; + const u8 *sound_datap, *sound_datap2; + int i, j, k, nbits; + u16 data[4096], *datap; + short *destp; + + destp = xdp->pcm; + nbits = xdp->nbits == 4 ? 4 : 2; + + if (xdp->stereo) { // stereo + if ((xdp->nbits == 8) && (xdp->freq == 37800)) { // level A + for (j=0; j < 18; j++) { + sound_groupsp = srcp + j * 128; // sound groups header + sound_datap = sound_groupsp + 16; // sound data just after the header + + for (i=0; i < nbits; i++) { + datap = data; + sound_datap2 = sound_datap + i; + + for (k=0; k < 14; k++, sound_datap2 += 8) { + *(datap++) = (u16)sound_datap2[0] | + (u16)(sound_datap2[4] << 8); + } + + ADPCM_DecodeBlock16( &xdp->left, sound_groupsp[headtable[i]+0], data, + destp+0, 2 ); + + datap = data; + sound_datap2 = sound_datap + i; + for (k=0; k < 14; k++, sound_datap2 += 8) { + *(datap++) = (u16)sound_datap2[0] | + (u16)(sound_datap2[4] << 8); + } + ADPCM_DecodeBlock16( &xdp->right, sound_groupsp[headtable[i]+1], data, + destp+1, 2 ); + + destp += 28*2; + } + } + } else { // level B/C + for (j=0; j < 18; j++) { + sound_groupsp = srcp + j * 128; // sound groups header + sound_datap = sound_groupsp + 16; // sound data just after the header + + for (i=0; i < nbits; i++) { + datap = data; + sound_datap2 = sound_datap + i; + + for (k=0; k < 7; k++, sound_datap2 += 16) { + *(datap++) = (u16)(sound_datap2[ 0] & 0x0f) | + ((u16)(sound_datap2[ 4] & 0x0f) << 4) | + ((u16)(sound_datap2[ 8] & 0x0f) << 8) | + ((u16)(sound_datap2[12] & 0x0f) << 12); + } + ADPCM_DecodeBlock16( &xdp->left, sound_groupsp[headtable[i]+0], data, + destp+0, 2 ); + + datap = data; + sound_datap2 = sound_datap + i; + for (k=0; k < 7; k++, sound_datap2 += 16) { + *(datap++) = (u16)(sound_datap2[ 0] >> 4) | + ((u16)(sound_datap2[ 4] >> 4) << 4) | + ((u16)(sound_datap2[ 8] >> 4) << 8) | + ((u16)(sound_datap2[12] >> 4) << 12); + } + ADPCM_DecodeBlock16( &xdp->right, sound_groupsp[headtable[i]+1], data, + destp+1, 2 ); + + destp += 28*2; + } + } + } + } else { // mono + if ((xdp->nbits == 8) && (xdp->freq == 37800)) { // level A + for (j=0; j < 18; j++) { + sound_groupsp = srcp + j * 128; // sound groups header + sound_datap = sound_groupsp + 16; // sound data just after the header + + for (i=0; i < nbits; i++) { + datap = data; + sound_datap2 = sound_datap + i; + for (k=0; k < 14; k++, sound_datap2 += 8) { + *(datap++) = (u16)sound_datap2[0] | + (u16)(sound_datap2[4] << 8); + } + ADPCM_DecodeBlock16( &xdp->left, sound_groupsp[headtable[i]+0], data, + destp, 1 ); + + destp += 28; + + datap = data; + sound_datap2 = sound_datap + i; + for (k=0; k < 14; k++, sound_datap2 += 8) { + *(datap++) = (u16)sound_datap2[0] | + (u16)(sound_datap2[4] << 8); + } + ADPCM_DecodeBlock16( &xdp->left, sound_groupsp[headtable[i]+1], data, + destp, 1 ); + + destp += 28; + } + } + } else { // level B/C + for (j=0; j < 18; j++) { + sound_groupsp = srcp + j * 128; // sound groups header + sound_datap = sound_groupsp + 16; // sound data just after the header + + for (i=0; i < nbits; i++) { + datap = data; + sound_datap2 = sound_datap + i; + for (k=0; k < 7; k++, sound_datap2 += 16) { + *(datap++) = (u16)(sound_datap2[ 0] & 0x0f) | + ((u16)(sound_datap2[ 4] & 0x0f) << 4) | + ((u16)(sound_datap2[ 8] & 0x0f) << 8) | + ((u16)(sound_datap2[12] & 0x0f) << 12); + } + ADPCM_DecodeBlock16( &xdp->left, sound_groupsp[headtable[i]+0], data, + destp, 1 ); + + destp += 28; + + datap = data; + sound_datap2 = sound_datap + i; + for (k=0; k < 7; k++, sound_datap2 += 16) { + *(datap++) = (u16)(sound_datap2[ 0] >> 4) | + ((u16)(sound_datap2[ 4] >> 4) << 4) | + ((u16)(sound_datap2[ 8] >> 4) << 8) | + ((u16)(sound_datap2[12] >> 4) << 12); + } + ADPCM_DecodeBlock16( &xdp->left, sound_groupsp[headtable[i]+1], data, + destp, 1 ); + + destp += 28; + } + } + } + } +} + +//============================================ +//=== XA SPECIFIC ROUTINES +//============================================ +typedef struct { +u8 filenum; +u8 channum; +u8 submode; +u8 coding; + +u8 filenum2; +u8 channum2; +u8 submode2; +u8 coding2; +} xa_subheader_t; + +#define SUB_SUB_EOF (1<<7) // end of file +#define SUB_SUB_RT (1<<6) // real-time sector +#define SUB_SUB_FORM (1<<5) // 0 form1 1 form2 +#define SUB_SUB_TRIGGER (1<<4) // used for interrupt +#define SUB_SUB_DATA (1<<3) // contains data +#define SUB_SUB_AUDIO (1<<2) // contains audio +#define SUB_SUB_VIDEO (1<<1) // contains video +#define SUB_SUB_EOR (1<<0) // end of record + +#define AUDIO_CODING_GET_STEREO(_X_) ( (_X_) & 3) +#define AUDIO_CODING_GET_FREQ(_X_) (((_X_) >> 2) & 3) +#define AUDIO_CODING_GET_BPS(_X_) (((_X_) >> 4) & 3) +#define AUDIO_CODING_GET_EMPHASIS(_X_) (((_X_) >> 6) & 1) + +#define SUB_UNKNOWN 0 +#define SUB_VIDEO 1 +#define SUB_AUDIO 2 + +//============================================ +static int parse_xa_audio_sector( xa_decode_t *xdp, + xa_subheader_t *subheadp, + unsigned char *sectorp, + int is_first_sector ) { + if ( is_first_sector ) { + switch ( AUDIO_CODING_GET_FREQ(subheadp->coding) ) { + case 0: xdp->freq = 37800; break; + case 1: xdp->freq = 18900; break; + default: xdp->freq = 0; break; + } + switch ( AUDIO_CODING_GET_BPS(subheadp->coding) ) { + case 0: xdp->nbits = 4; break; + case 1: xdp->nbits = 8; break; + default: xdp->nbits = 0; break; + } + switch ( AUDIO_CODING_GET_STEREO(subheadp->coding) ) { + case 0: xdp->stereo = 0; break; + case 1: xdp->stereo = 1; break; + default: xdp->stereo = 0; break; + } + + if ( xdp->freq == 0 ) + return -1; + + ADPCM_InitDecode( &xdp->left ); + ADPCM_InitDecode( &xdp->right ); + + xdp->nsamples = 18 * 28 * 8; + if (xdp->stereo == 1) xdp->nsamples /= 2; + } + xa_decode_data( xdp, sectorp ); + + return 0; +} + +//================================================================ +//=== THIS IS WHAT YOU HAVE TO CALL +//=== xdp - structure were all important data are returned +//=== sectorp - data in input +//=== pcmp - data in output +//=== is_first_sector - 1 if it's the 1st sector of the stream +//=== - 0 for any other successive sector +//=== return -1 if error +//================================================================ +s32 xa_decode_sector( xa_decode_t *xdp, + unsigned char *sectorp, int is_first_sector ) { + if (parse_xa_audio_sector(xdp, (xa_subheader_t *)sectorp, sectorp + sizeof(xa_subheader_t), is_first_sector)) + return -1; + + return 0; +} + +/* EXAMPLE: +"nsamples" is the number of 16 bit samples +every sample is 2 bytes in mono and 4 bytes in stereo + +xa_decode_t xa; + + sectorp = read_first_sector(); + xa_decode_sector( &xa, sectorp, 1 ); + play_wave( xa.pcm, xa.freq, xa.nsamples ); + + while ( --n_sectors ) + { + sectorp = read_next_sector(); + xa_decode_sector( &xa, sectorp, 0 ); + play_wave( xa.pcm, xa.freq, xa.nsamples ); + } +*/ diff --git a/libpcsxcore/decode_xa.h b/libpcsxcore/decode_xa.h new file mode 100644 index 0000000..a5994e1 --- /dev/null +++ b/libpcsxcore/decode_xa.h @@ -0,0 +1,49 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __DECODE_XA_H__ +#define __DECODE_XA_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" + +typedef struct { + s32 y0, y1; +} ADPCM_Decode_t; + +typedef struct { + int freq; + int nbits; + int stereo; + int nsamples; + ADPCM_Decode_t left, right; + short pcm[16384]; +} xa_decode_t; + +s32 xa_decode_sector( xa_decode_t *xdp, + unsigned char *sectorp, + int is_first_sector ); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/disr3000a.c b/libpcsxcore/disr3000a.c new file mode 100644 index 0000000..23667c1 --- /dev/null +++ b/libpcsxcore/disr3000a.c @@ -0,0 +1,323 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* R3000A disassembler. +*/ + +#include "psxcommon.h" + +char ostr[256]; + +// Names of registers +static char *disRNameGPR[] = { + "r0", "at", "v0", "v1", "a0", "a1","a2", "a3", + "t0", "t1", "t2", "t3", "t4", "t5","t6", "t7", + "s0", "s1", "s2", "s3", "s4", "s5","s6", "s7", + "t8", "t9", "k0", "k1", "gp", "sp","fp", "ra"}; + +char *disRNameCP0[] = { + "Index" , "Random" , "EntryLo0", "EntryLo1", "Context" , "PageMask" , "Wired" , "*Check me*", + "BadVAddr" , "Count" , "EntryHi" , "Compare" , "Status" , "Cause" , "ExceptPC" , "PRevID" , + "Config" , "LLAddr" , "WatchLo" , "WatchHi" , "XContext", "*RES*" , "*RES*" , "*RES*" , + "*RES*" , "*RES* " , "PErr" , "CacheErr", "TagLo" , "TagHi" , "ErrorEPC" , "*RES*" }; + + +// Type deffinition of our functions + +typedef char* (*TdisR3000AF)(u32 code, u32 pc); + +// These macros are used to assemble the disassembler functions +#define MakeDisFg(fn, b) char* fn(u32 code, u32 pc) { b; return ostr; } +#define MakeDisF(fn, b) \ + static char* fn(u32 code, u32 pc) { \ + sprintf (ostr, "%8.8x %8.8x:", pc, code); \ + b; /*ostr[(strlen(ostr) - 1)] = 0;*/ return ostr; \ + } + + +#include "r3000a.h" + +#undef _Funct_ +#undef _Rd_ +#undef _Rt_ +#undef _Rs_ +#undef _Sa_ +#undef _Im_ +#undef _Target_ + +#define _Funct_ ((code ) & 0x3F) // The funct part of the instruction register +#define _Rd_ ((code >> 11) & 0x1F) // The rd part of the instruction register +#define _Rt_ ((code >> 16) & 0x1F) // The rt part of the instruction register +#define _Rs_ ((code >> 21) & 0x1F) // The rs part of the instruction register +#define _Sa_ ((code >> 6) & 0x1F) // The sa part of the instruction register +#define _Im_ ( code & 0xFFFF) // The immediate part of the instruction register + +#define _Target_ ((pc & 0xf0000000) + ((code & 0x03ffffff) * 4)) +#define _Branch_ (pc + 4 + ((short)_Im_ * 4)) +#define _OfB_ _Im_, _nRs_ + +#define dName(i) sprintf(ostr, "%s %-7s,", ostr, i) +#define dGPR(i) sprintf(ostr, "%s %8.8x (%s),", ostr, psxRegs.GPR.r[i], disRNameGPR[i]) +#define dCP0(i) sprintf(ostr, "%s %8.8x (%s),", ostr, psxRegs.CP0.r[i], disRNameCP0[i]) +#define dHI() sprintf(ostr, "%s %8.8x (%s),", ostr, psxRegs.GPR.n.hi, "hi") +#define dLO() sprintf(ostr, "%s %8.8x (%s),", ostr, psxRegs.GPR.n.lo, "lo") +#define dImm() sprintf(ostr, "%s %4.4x (%d),", ostr, _Im_, _Im_) +#define dTarget() sprintf(ostr, "%s %8.8x,", ostr, _Target_) +#define dSa() sprintf(ostr, "%s %2.2x (%d),", ostr, _Sa_, _Sa_) +#define dOfB() sprintf(ostr, "%s %4.4x (%8.8x (%s)),", ostr, _Im_, psxRegs.GPR.r[_Rs_], disRNameGPR[_Rs_]) +#define dOffset() sprintf(ostr, "%s %8.8x,", ostr, _Branch_) +#define dCode() sprintf(ostr, "%s %8.8x,", ostr, (code >> 6) & 0xffffff) + +/********************************************************* +* Arithmetic with immediate operand * +* Format: OP rt, rs, immediate * +*********************************************************/ +MakeDisF(disADDI, dName("ADDI"); dGPR(_Rt_); dGPR(_Rs_); dImm();) +MakeDisF(disADDIU, dName("ADDIU"); dGPR(_Rt_); dGPR(_Rs_); dImm();) +MakeDisF(disANDI, dName("ANDI"); dGPR(_Rt_); dGPR(_Rs_); dImm();) +MakeDisF(disORI, dName("ORI"); dGPR(_Rt_); dGPR(_Rs_); dImm();) +MakeDisF(disSLTI, dName("SLTI"); dGPR(_Rt_); dGPR(_Rs_); dImm();) +MakeDisF(disSLTIU, dName("SLTIU"); dGPR(_Rt_); dGPR(_Rs_); dImm();) +MakeDisF(disXORI, dName("XORI"); dGPR(_Rt_); dGPR(_Rs_); dImm();) + +/********************************************************* +* Register arithmetic * +* Format: OP rd, rs, rt * +*********************************************************/ +MakeDisF(disADD, dName("ADD"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disADDU, dName("ADDU"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disAND, dName("AND"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disNOR, dName("NOR"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disOR, dName("OR"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disSLT, dName("SLT"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disSLTU, dName("SLTU"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disSUB, dName("SUB"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disSUBU, dName("SUBU"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disXOR, dName("XOR"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) + +/********************************************************* +* Register arithmetic & Register trap logic * +* Format: OP rs, rt * +*********************************************************/ +MakeDisF(disDIV, dName("DIV"); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disDIVU, dName("DIVU"); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disMULT, dName("MULT"); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disMULTU, dName("MULTU"); dGPR(_Rs_); dGPR(_Rt_);) + +/********************************************************* +* Register branch logic * +* Format: OP rs, offset * +*********************************************************/ +MakeDisF(disBGEZ, dName("BGEZ"); dGPR(_Rs_); dOffset();) +MakeDisF(disBGEZAL, dName("BGEZAL"); dGPR(_Rs_); dOffset();) +MakeDisF(disBGTZ, dName("BGTZ"); dGPR(_Rs_); dOffset();) +MakeDisF(disBLEZ, dName("BLEZ"); dGPR(_Rs_); dOffset();) +MakeDisF(disBLTZ, dName("BLTZ"); dGPR(_Rs_); dOffset();) +MakeDisF(disBLTZAL, dName("BLTZAL"); dGPR(_Rs_); dOffset();) + +/********************************************************* +* Shift arithmetic with constant shift * +* Format: OP rd, rt, sa * +*********************************************************/ +MakeDisF(disSLL, if (code) { dName("SLL"); dGPR(_Rd_); dGPR(_Rt_); dSa(); } else { dName("NOP"); }) +MakeDisF(disSRA, dName("SRA"); dGPR(_Rd_); dGPR(_Rt_); dSa();) +MakeDisF(disSRL, dName("SRL"); dGPR(_Rd_); dGPR(_Rt_); dSa();) + +/********************************************************* +* Shift arithmetic with variant register shift * +* Format: OP rd, rt, rs * +*********************************************************/ +MakeDisF(disSLLV, dName("SLLV"); dGPR(_Rd_); dGPR(_Rt_); dGPR(_Rs_);) +MakeDisF(disSRAV, dName("SRAV"); dGPR(_Rd_); dGPR(_Rt_); dGPR(_Rs_);) +MakeDisF(disSRLV, dName("SRLV"); dGPR(_Rd_); dGPR(_Rt_); dGPR(_Rs_);) + +/********************************************************* +* Load higher 16 bits of the first word in GPR with imm * +* Format: OP rt, immediate * +*********************************************************/ +MakeDisF(disLUI, dName("LUI"); dGPR(_Rt_); dImm();) + +/********************************************************* +* Move from HI/LO to GPR * +* Format: OP rd * +*********************************************************/ +MakeDisF(disMFHI, dName("MFHI"); dGPR(_Rd_); dHI();) +MakeDisF(disMFLO, dName("MFLO"); dGPR(_Rd_); dLO();) + +/********************************************************* +* Move from GPR to HI/LO * +* Format: OP rd * +*********************************************************/ +MakeDisF(disMTHI, dName("MTHI"); dHI(); dGPR(_Rs_);) +MakeDisF(disMTLO, dName("MTLO"); dLO(); dGPR(_Rs_);) + +/********************************************************* +* Special purpose instructions * +* Format: OP * +*********************************************************/ +MakeDisF(disBREAK, dName("BREAK")) +MakeDisF(disRFE, dName("RFE")) +MakeDisF(disSYSCALL, dName("SYSCALL")) +MakeDisF(disHLE, dName("HLE")) + + +MakeDisF(disRTPS, dName("RTPS")) +MakeDisF(disOP , dName("OP")) +MakeDisF(disNCLIP, dName("NCLIP")) +MakeDisF(disDPCS, dName("DPCS")) +MakeDisF(disINTPL, dName("INTPL")) +MakeDisF(disMVMVA, dName("MVMVA")) +MakeDisF(disNCDS , dName("NCDS")) +MakeDisF(disCDP , dName("CDP")) +MakeDisF(disNCDT , dName("NCDT")) +MakeDisF(disNCCS , dName("NCCS")) +MakeDisF(disCC , dName("CC")) +MakeDisF(disNCS , dName("NCS")) +MakeDisF(disNCT , dName("NCT")) +MakeDisF(disSQR , dName("SQR")) +MakeDisF(disDCPL , dName("DCPL")) +MakeDisF(disDPCT , dName("DPCT")) +MakeDisF(disAVSZ3, dName("AVSZ3")) +MakeDisF(disAVSZ4, dName("AVSZ4")) +MakeDisF(disRTPT , dName("RTPT")) +MakeDisF(disGPF , dName("GPF")) +MakeDisF(disGPL , dName("GPL")) +MakeDisF(disNCCT , dName("NCCT")) + +MakeDisF(disMFC2, dName("MFC2"); dGPR(_Rt_);) +MakeDisF(disCFC2, dName("CFC2"); dGPR(_Rt_);) +MakeDisF(disMTC2, dName("MTC2"); dGPR(_Rt_);) +MakeDisF(disCTC2, dName("CTC2"); dGPR(_Rt_);) + +/********************************************************* +* Register branch logic * +* Format: OP rs, rt, offset * +*********************************************************/ +MakeDisF(disBEQ, dName("BEQ"); dGPR(_Rs_); dGPR(_Rt_); dOffset();) +MakeDisF(disBNE, dName("BNE"); dGPR(_Rs_); dGPR(_Rt_); dOffset();) + +/********************************************************* +* Jump to target * +* Format: OP target * +*********************************************************/ +MakeDisF(disJ, dName("J"); dTarget();) +MakeDisF(disJAL, dName("JAL"); dTarget(); dGPR(31);) + +/********************************************************* +* Register jump * +* Format: OP rs, rd * +*********************************************************/ +MakeDisF(disJR, dName("JR"); dGPR(_Rs_);) +MakeDisF(disJALR, dName("JALR"); dGPR(_Rs_); dGPR(_Rd_)) + +/********************************************************* +* Load and store for GPR * +* Format: OP rt, offset(base) * +*********************************************************/ +MakeDisF(disLB, dName("LB"); dGPR(_Rt_); dOfB();) +MakeDisF(disLBU, dName("LBU"); dGPR(_Rt_); dOfB();) +MakeDisF(disLH, dName("LH"); dGPR(_Rt_); dOfB();) +MakeDisF(disLHU, dName("LHU"); dGPR(_Rt_); dOfB();) +MakeDisF(disLW, dName("LW"); dGPR(_Rt_); dOfB();) +MakeDisF(disLWL, dName("LWL"); dGPR(_Rt_); dOfB();) +MakeDisF(disLWR, dName("LWR"); dGPR(_Rt_); dOfB();) +MakeDisF(disLWC2, dName("LWC2"); dGPR(_Rt_); dOfB();) +MakeDisF(disSB, dName("SB"); dGPR(_Rt_); dOfB();) +MakeDisF(disSH, dName("SH"); dGPR(_Rt_); dOfB();) +MakeDisF(disSW, dName("SW"); dGPR(_Rt_); dOfB();) +MakeDisF(disSWL, dName("SWL"); dGPR(_Rt_); dOfB();) +MakeDisF(disSWR, dName("SWR"); dGPR(_Rt_); dOfB();) +MakeDisF(disSWC2, dName("SWC2"); dGPR(_Rt_); dOfB();) + +/********************************************************* +* Moves between GPR and COPx * +* Format: OP rt, fs * +*********************************************************/ +MakeDisF(disMFC0, dName("MFC0"); dGPR(_Rt_); dCP0(_Rd_);) +MakeDisF(disMTC0, dName("MTC0"); dCP0(_Rd_); dGPR(_Rt_);) +MakeDisF(disCFC0, dName("CFC0"); dGPR(_Rt_); dCP0(_Rd_);) +MakeDisF(disCTC0, dName("CTC0"); dCP0(_Rd_); dGPR(_Rt_);) + +/********************************************************* +* Unknow instruction (would generate an exception) * +* Format: ? * +*********************************************************/ +MakeDisF(disNULL, dName("*** Bad OP ***");) + + +TdisR3000AF disR3000A_SPECIAL[] = { // Subset of disSPECIAL + disSLL , disNULL , disSRL , disSRA , disSLLV , disNULL , disSRLV , disSRAV , + disJR , disJALR , disNULL, disNULL, disSYSCALL, disBREAK , disNULL , disNULL , + disMFHI, disMTHI , disMFLO, disMTLO, disNULL , disNULL , disNULL , disNULL , + disMULT, disMULTU, disDIV , disDIVU, disNULL , disNULL , disNULL , disNULL , + disADD , disADDU , disSUB , disSUBU, disAND , disOR , disXOR , disNOR , + disNULL, disNULL , disSLT , disSLTU, disNULL , disNULL , disNULL , disNULL , + disNULL, disNULL , disNULL, disNULL, disNULL , disNULL , disNULL , disNULL , + disNULL, disNULL , disNULL, disNULL, disNULL , disNULL , disNULL , disNULL}; + +MakeDisF(disSPECIAL, disR3000A_SPECIAL[_Funct_](code, pc)) + +TdisR3000AF disR3000A_BCOND[] = { // Subset of disBCOND + disBLTZ , disBGEZ , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, + disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, + disBLTZAL, disBGEZAL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, + disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL}; + +MakeDisF(disBCOND, disR3000A_BCOND[_Rt_](code, pc)) + +TdisR3000AF disR3000A_COP0[] = { // Subset of disCOP0 + disMFC0, disNULL, disCFC0, disNULL, disMTC0, disNULL, disCTC0, disNULL, + disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, + disRFE , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, + disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL}; + +MakeDisF(disCOP0, disR3000A_COP0[_Rs_](code, pc)) + +TdisR3000AF disR3000A_BASIC[] = { // Subset of disBASIC (based on rs) + disMFC2, disNULL, disCFC2, disNULL, disMTC2, disNULL, disCTC2, disNULL, + disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, + disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, + disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL}; + +MakeDisF(disBASIC, disR3000A_BASIC[_Rs_](code, pc)) + +TdisR3000AF disR3000A_COP2[] = { // Subset of disR3000F_COP2 (based on funct) + disBASIC, disRTPS , disNULL , disNULL , disNULL, disNULL , disNCLIP, disNULL, + disNULL , disNULL , disNULL , disNULL , disOP , disNULL , disNULL , disNULL, + disDPCS , disINTPL, disMVMVA, disNCDS , disCDP , disNULL , disNCDT , disNULL, + disNULL , disNULL , disNULL , disNCCS , disCC , disNULL , disNCS , disNULL, + disNCT , disNULL , disNULL , disNULL , disNULL, disNULL , disNULL , disNULL, + disSQR , disDCPL , disDPCT , disNULL , disNULL, disAVSZ3, disAVSZ4, disNULL, + disRTPT , disNULL , disNULL , disNULL , disNULL, disNULL , disNULL , disNULL, + disNULL , disNULL , disNULL , disNULL , disNULL, disGPF , disGPL , disNCCT }; + +MakeDisF(disCOP2, disR3000A_COP2[_Funct_](code, pc)) + +TdisR3000AF disR3000A[] = { + disSPECIAL , disBCOND , disJ , disJAL , disBEQ , disBNE , disBLEZ , disBGTZ , + disADDI , disADDIU , disSLTI , disSLTIU, disANDI, disORI , disXORI , disLUI , + disCOP0 , disNULL , disCOP2 , disNULL , disNULL, disNULL, disNULL , disNULL , + disNULL , disNULL , disNULL , disNULL , disNULL, disNULL, disNULL , disNULL , + disLB , disLH , disLWL , disLW , disLBU , disLHU , disLWR , disNULL , + disSB , disSH , disSWL , disSW , disNULL, disNULL, disSWR , disNULL , + disNULL , disNULL , disLWC2 , disNULL , disNULL, disNULL, disNULL , disNULL , + disNULL , disNULL , disSWC2 , disHLE , disNULL, disNULL, disNULL , disNULL }; + +MakeDisFg(disR3000AF, disR3000A[code >> 26](code, pc)) diff --git a/libpcsxcore/gte.c b/libpcsxcore/gte.c new file mode 100644 index 0000000..72210d3 --- /dev/null +++ b/libpcsxcore/gte.c @@ -0,0 +1,904 @@ +/*************************************************************************** + * PCSX-Revolution - PlayStation Emulator for Nintendo Wii * + * Copyright (C) 2009-2010 PCSX-Revolution Dev Team * + * * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* GTE functions. +*/ + +#include "gte.h" +#include "psxmem.h" + +#define VX(n) (n < 3 ? psxRegs.CP2D.p[n << 1].sw.l : psxRegs.CP2D.p[9].sw.l) +#define VY(n) (n < 3 ? psxRegs.CP2D.p[n << 1].sw.h : psxRegs.CP2D.p[10].sw.l) +#define VZ(n) (n < 3 ? psxRegs.CP2D.p[(n << 1) + 1].sw.l : psxRegs.CP2D.p[11].sw.l) +#define MX11(n) (n < 3 ? psxRegs.CP2C.p[(n << 3)].sw.l : 0) +#define MX12(n) (n < 3 ? psxRegs.CP2C.p[(n << 3)].sw.h : 0) +#define MX13(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 1].sw.l : 0) +#define MX21(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 1].sw.h : 0) +#define MX22(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 2].sw.l : 0) +#define MX23(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 2].sw.h : 0) +#define MX31(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 3].sw.l : 0) +#define MX32(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 3].sw.h : 0) +#define MX33(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 4].sw.l : 0) +#define CV1(n) (n < 3 ? (s32)psxRegs.CP2C.r[(n << 3) + 5] : 0) +#define CV2(n) (n < 3 ? (s32)psxRegs.CP2C.r[(n << 3) + 6] : 0) +#define CV3(n) (n < 3 ? (s32)psxRegs.CP2C.r[(n << 3) + 7] : 0) + +#define fSX(n) ((psxRegs.CP2D.p)[((n) + 12)].sw.l) +#define fSY(n) ((psxRegs.CP2D.p)[((n) + 12)].sw.h) +#define fSZ(n) ((psxRegs.CP2D.p)[((n) + 17)].w.l) /* (n == 0) => SZ1; */ + +#define gteVXY0 (psxRegs.CP2D.r[0]) +#define gteVX0 (psxRegs.CP2D.p[0].sw.l) +#define gteVY0 (psxRegs.CP2D.p[0].sw.h) +#define gteVZ0 (psxRegs.CP2D.p[1].sw.l) +#define gteVXY1 (psxRegs.CP2D.r[2]) +#define gteVX1 (psxRegs.CP2D.p[2].sw.l) +#define gteVY1 (psxRegs.CP2D.p[2].sw.h) +#define gteVZ1 (psxRegs.CP2D.p[3].sw.l) +#define gteVXY2 (psxRegs.CP2D.r[4]) +#define gteVX2 (psxRegs.CP2D.p[4].sw.l) +#define gteVY2 (psxRegs.CP2D.p[4].sw.h) +#define gteVZ2 (psxRegs.CP2D.p[5].sw.l) +#define gteRGB (psxRegs.CP2D.r[6]) +#define gteR (psxRegs.CP2D.p[6].b.l) +#define gteG (psxRegs.CP2D.p[6].b.h) +#define gteB (psxRegs.CP2D.p[6].b.h2) +#define gteCODE (psxRegs.CP2D.p[6].b.h3) +#define gteOTZ (psxRegs.CP2D.p[7].w.l) +#define gteIR0 (psxRegs.CP2D.p[8].sw.l) +#define gteIR1 (psxRegs.CP2D.p[9].sw.l) +#define gteIR2 (psxRegs.CP2D.p[10].sw.l) +#define gteIR3 (psxRegs.CP2D.p[11].sw.l) +#define gteSXY0 (psxRegs.CP2D.r[12]) +#define gteSX0 (psxRegs.CP2D.p[12].sw.l) +#define gteSY0 (psxRegs.CP2D.p[12].sw.h) +#define gteSXY1 (psxRegs.CP2D.r[13]) +#define gteSX1 (psxRegs.CP2D.p[13].sw.l) +#define gteSY1 (psxRegs.CP2D.p[13].sw.h) +#define gteSXY2 (psxRegs.CP2D.r[14]) +#define gteSX2 (psxRegs.CP2D.p[14].sw.l) +#define gteSY2 (psxRegs.CP2D.p[14].sw.h) +#define gteSXYP (psxRegs.CP2D.r[15]) +#define gteSXP (psxRegs.CP2D.p[15].sw.l) +#define gteSYP (psxRegs.CP2D.p[15].sw.h) +#define gteSZ0 (psxRegs.CP2D.p[16].w.l) +#define gteSZ1 (psxRegs.CP2D.p[17].w.l) +#define gteSZ2 (psxRegs.CP2D.p[18].w.l) +#define gteSZ3 (psxRegs.CP2D.p[19].w.l) +#define gteRGB0 (psxRegs.CP2D.r[20]) +#define gteR0 (psxRegs.CP2D.p[20].b.l) +#define gteG0 (psxRegs.CP2D.p[20].b.h) +#define gteB0 (psxRegs.CP2D.p[20].b.h2) +#define gteCODE0 (psxRegs.CP2D.p[20].b.h3) +#define gteRGB1 (psxRegs.CP2D.r[21]) +#define gteR1 (psxRegs.CP2D.p[21].b.l) +#define gteG1 (psxRegs.CP2D.p[21].b.h) +#define gteB1 (psxRegs.CP2D.p[21].b.h2) +#define gteCODE1 (psxRegs.CP2D.p[21].b.h3) +#define gteRGB2 (psxRegs.CP2D.r[22]) +#define gteR2 (psxRegs.CP2D.p[22].b.l) +#define gteG2 (psxRegs.CP2D.p[22].b.h) +#define gteB2 (psxRegs.CP2D.p[22].b.h2) +#define gteCODE2 (psxRegs.CP2D.p[22].b.h3) +#define gteRES1 (psxRegs.CP2D.r[23]) +#define gteMAC0 (((s32 *)psxRegs.CP2D.r)[24]) +#define gteMAC1 (((s32 *)psxRegs.CP2D.r)[25]) +#define gteMAC2 (((s32 *)psxRegs.CP2D.r)[26]) +#define gteMAC3 (((s32 *)psxRegs.CP2D.r)[27]) +#define gteIRGB (psxRegs.CP2D.r[28]) +#define gteORGB (psxRegs.CP2D.r[29]) +#define gteLZCS (psxRegs.CP2D.r[30]) +#define gteLZCR (psxRegs.CP2D.r[31]) + +#define gteR11R12 (((s32 *)psxRegs.CP2C.r)[0]) +#define gteR22R23 (((s32 *)psxRegs.CP2C.r)[2]) +#define gteR11 (psxRegs.CP2C.p[0].sw.l) +#define gteR12 (psxRegs.CP2C.p[0].sw.h) +#define gteR13 (psxRegs.CP2C.p[1].sw.l) +#define gteR21 (psxRegs.CP2C.p[1].sw.h) +#define gteR22 (psxRegs.CP2C.p[2].sw.l) +#define gteR23 (psxRegs.CP2C.p[2].sw.h) +#define gteR31 (psxRegs.CP2C.p[3].sw.l) +#define gteR32 (psxRegs.CP2C.p[3].sw.h) +#define gteR33 (psxRegs.CP2C.p[4].sw.l) +#define gteTRX (((s32 *)psxRegs.CP2C.r)[5]) +#define gteTRY (((s32 *)psxRegs.CP2C.r)[6]) +#define gteTRZ (((s32 *)psxRegs.CP2C.r)[7]) +#define gteL11 (psxRegs.CP2C.p[8].sw.l) +#define gteL12 (psxRegs.CP2C.p[8].sw.h) +#define gteL13 (psxRegs.CP2C.p[9].sw.l) +#define gteL21 (psxRegs.CP2C.p[9].sw.h) +#define gteL22 (psxRegs.CP2C.p[10].sw.l) +#define gteL23 (psxRegs.CP2C.p[10].sw.h) +#define gteL31 (psxRegs.CP2C.p[11].sw.l) +#define gteL32 (psxRegs.CP2C.p[11].sw.h) +#define gteL33 (psxRegs.CP2C.p[12].sw.l) +#define gteRBK (((s32 *)psxRegs.CP2C.r)[13]) +#define gteGBK (((s32 *)psxRegs.CP2C.r)[14]) +#define gteBBK (((s32 *)psxRegs.CP2C.r)[15]) +#define gteLR1 (psxRegs.CP2C.p[16].sw.l) +#define gteLR2 (psxRegs.CP2C.p[16].sw.h) +#define gteLR3 (psxRegs.CP2C.p[17].sw.l) +#define gteLG1 (psxRegs.CP2C.p[17].sw.h) +#define gteLG2 (psxRegs.CP2C.p[18].sw.l) +#define gteLG3 (psxRegs.CP2C.p[18].sw.h) +#define gteLB1 (psxRegs.CP2C.p[19].sw.l) +#define gteLB2 (psxRegs.CP2C.p[19].sw.h) +#define gteLB3 (psxRegs.CP2C.p[20].sw.l) +#define gteRFC (((s32 *)psxRegs.CP2C.r)[21]) +#define gteGFC (((s32 *)psxRegs.CP2C.r)[22]) +#define gteBFC (((s32 *)psxRegs.CP2C.r)[23]) +#define gteOFX (((s32 *)psxRegs.CP2C.r)[24]) +#define gteOFY (((s32 *)psxRegs.CP2C.r)[25]) +#define gteH (psxRegs.CP2C.p[26].sw.l) +#define gteDQA (psxRegs.CP2C.p[27].sw.l) +#define gteDQB (((s32 *)psxRegs.CP2C.r)[28]) +#define gteZSF3 (psxRegs.CP2C.p[29].sw.l) +#define gteZSF4 (psxRegs.CP2C.p[30].sw.l) +#define gteFLAG (psxRegs.CP2C.r[31]) + +#define GTE_OP(op) ((op >> 20) & 31) +#define GTE_SF(op) ((op >> 19) & 1) +#define GTE_MX(op) ((op >> 17) & 3) +#define GTE_V(op) ((op >> 15) & 3) +#define GTE_CV(op) ((op >> 13) & 3) +#define GTE_CD(op) ((op >> 11) & 3) /* not used */ +#define GTE_LM(op) ((op >> 10) & 1) +#define GTE_CT(op) ((op >> 6) & 15) /* not used */ +#define GTE_FUNCT(op) (op & 63) + +#define gteop (psxRegs.code & 0x1ffffff) + +static inline s64 BOUNDS(s64 n_value, s64 n_max, int n_maxflag, s64 n_min, int n_minflag) { + if (n_value > n_max) { + gteFLAG |= n_maxflag; + } else if (n_value < n_min) { + gteFLAG |= n_minflag; + } + return n_value; +} + +static inline s32 LIM(s32 value, s32 max, s32 min, u32 flag) { + s32 ret = value; + if (value > max) { + gteFLAG |= flag; + ret = max; + } else if (value < min) { + gteFLAG |= flag; + ret = min; + } + return ret; +} + +#define A1(a) BOUNDS((a), 0x7fffffff, (1 << 30), -(s64)0x80000000, (1 << 31) | (1 << 27)) +#define A2(a) BOUNDS((a), 0x7fffffff, (1 << 29), -(s64)0x80000000, (1 << 31) | (1 << 26)) +#define A3(a) BOUNDS((a), 0x7fffffff, (1 << 28), -(s64)0x80000000, (1 << 31) | (1 << 25)) +#define limB1(a, l) LIM((a), 0x7fff, -0x8000 * !l, (1 << 31) | (1 << 24)) +#define limB2(a, l) LIM((a), 0x7fff, -0x8000 * !l, (1 << 31) | (1 << 23)) +#define limB3(a, l) LIM((a), 0x7fff, -0x8000 * !l, (1 << 22)) +#define limC1(a) LIM((a), 0x00ff, 0x0000, (1 << 21)) +#define limC2(a) LIM((a), 0x00ff, 0x0000, (1 << 20)) +#define limC3(a) LIM((a), 0x00ff, 0x0000, (1 << 19)) +#define limD(a) LIM((a), 0xffff, 0x0000, (1 << 31) | (1 << 18)) + +static inline u32 limE(u32 result) { + if (result > 0x1ffff) { + gteFLAG |= (1 << 31) | (1 << 17); + return 0x1ffff; + } + return result; +} + +#define F(a) BOUNDS((a), 0x7fffffff, (1 << 31) | (1 << 16), -(s64)0x80000000, (1 << 31) | (1 << 15)) +#define limG1(a) LIM((a), 0x3ff, -0x400, (1 << 31) | (1 << 14)) +#define limG2(a) LIM((a), 0x3ff, -0x400, (1 << 31) | (1 << 13)) +#define limH(a) LIM((a), 0xfff, 0x000, (1 << 12)) + +#include "gte_divider.h" + +static inline u32 MFC2(int reg) { + switch (reg) { + case 1: + case 3: + case 5: + case 8: + case 9: + case 10: + case 11: + psxRegs.CP2D.r[reg] = (s32)psxRegs.CP2D.p[reg].sw.l; + break; + + case 7: + case 16: + case 17: + case 18: + case 19: + psxRegs.CP2D.r[reg] = (u32)psxRegs.CP2D.p[reg].w.l; + break; + + case 15: + psxRegs.CP2D.r[reg] = gteSXY2; + break; + + case 28: + case 30: + return 0; + + case 29: + psxRegs.CP2D.r[reg] = LIM(gteIR1 >> 7, 0x1f, 0, 0) | + (LIM(gteIR2 >> 7, 0x1f, 0, 0) << 5) | + (LIM(gteIR3 >> 7, 0x1f, 0, 0) << 10); + break; + } + return psxRegs.CP2D.r[reg]; +} + +static inline void MTC2(u32 value, int reg) { + switch (reg) { + case 15: + gteSXY0 = gteSXY1; + gteSXY1 = gteSXY2; + gteSXY2 = value; + gteSXYP = value; + break; + + case 28: + gteIRGB = value; + gteIR1 = (value & 0x1f) << 7; + gteIR2 = (value & 0x3e0) << 2; + gteIR3 = (value & 0x7c00) >> 3; + break; + + case 30: + { + int a; + gteLZCS = value; + + a = gteLZCS; + if (a > 0) { + int i; + for (i = 31; (a & (1 << i)) == 0 && i >= 0; i--); + gteLZCR = 31 - i; + } else if (a < 0) { + int i; + a ^= 0xffffffff; + for (i = 31; (a & (1 << i)) == 0 && i >= 0; i--); + gteLZCR = 31 - i; + } else { + gteLZCR = 32; + } + } + break; + + case 7: + case 29: + case 31: + return; + + default: + psxRegs.CP2D.r[reg] = value; + } +} + +static inline void CTC2(u32 value, int reg) { + switch (reg) { + case 4: + case 12: + case 20: + case 26: + case 27: + case 29: + case 30: + value = (s32)(s16)value; + break; + + case 31: + value = value & 0x7ffff000; + if (value & 0x7f87e000) value |= 0x80000000; + break; + } + + psxRegs.CP2C.r[reg] = value; +} + +void gteMFC2() { + if (!_Rt_) return; + psxRegs.GPR.r[_Rt_] = MFC2(_Rd_); +} + +void gteCFC2() { + if (!_Rt_) return; + psxRegs.GPR.r[_Rt_] = psxRegs.CP2C.r[_Rd_]; +} + +void gteMTC2() { + MTC2(psxRegs.GPR.r[_Rt_], _Rd_); +} + +void gteCTC2() { + CTC2(psxRegs.GPR.r[_Rt_], _Rd_); +} + +#define _oB_ (psxRegs.GPR.r[_Rs_] + _Imm_) + +void gteLWC2() { + MTC2(psxMemRead32(_oB_), _Rt_); +} + +void gteSWC2() { + psxMemWrite32(_oB_, MFC2(_Rt_)); +} + +void gteRTPS() { + int quotient; + +#ifdef GTE_LOG + GTE_LOG("GTE RTPS\n"); +#endif + gteFLAG = 0; + + gteMAC1 = A1((((s64)gteTRX << 12) + (gteR11 * gteVX0) + (gteR12 * gteVY0) + (gteR13 * gteVZ0)) >> 12); + gteMAC2 = A2((((s64)gteTRY << 12) + (gteR21 * gteVX0) + (gteR22 * gteVY0) + (gteR23 * gteVZ0)) >> 12); + gteMAC3 = A3((((s64)gteTRZ << 12) + (gteR31 * gteVX0) + (gteR32 * gteVY0) + (gteR33 * gteVZ0)) >> 12); + gteIR1 = limB1(gteMAC1, 0); + gteIR2 = limB2(gteMAC2, 0); + gteIR3 = limB3(gteMAC3, 0); + gteSZ0 = gteSZ1; + gteSZ1 = gteSZ2; + gteSZ2 = gteSZ3; + gteSZ3 = limD(gteMAC3); + quotient = limE(DIVIDE(gteH, gteSZ3)); + gteSXY0 = gteSXY1; + gteSXY1 = gteSXY2; + gteSX2 = limG1(F((s64)gteOFX + ((s64)gteIR1 * quotient)) >> 16); + gteSY2 = limG2(F((s64)gteOFY + ((s64)gteIR2 * quotient)) >> 16); + + gteMAC0 = F((s64)(gteDQB + ((s64)gteDQA * quotient)) >> 12); + gteIR0 = limH(gteMAC0); +} + +void gteRTPT() { + int quotient; + int v; + s32 vx, vy, vz; + +#ifdef GTE_LOG + GTE_LOG("GTE RTPT\n"); +#endif + gteFLAG = 0; + + gteSZ0 = gteSZ3; + for (v = 0; v < 3; v++) { + vx = VX(v); + vy = VY(v); + vz = VZ(v); + gteMAC1 = A1((((s64)gteTRX << 12) + (gteR11 * vx) + (gteR12 * vy) + (gteR13 * vz)) >> 12); + gteMAC2 = A2((((s64)gteTRY << 12) + (gteR21 * vx) + (gteR22 * vy) + (gteR23 * vz)) >> 12); + gteMAC3 = A3((((s64)gteTRZ << 12) + (gteR31 * vx) + (gteR32 * vy) + (gteR33 * vz)) >> 12); + gteIR1 = limB1(gteMAC1, 0); + gteIR2 = limB2(gteMAC2, 0); + gteIR3 = limB3(gteMAC3, 0); + fSZ(v) = limD(gteMAC3); + quotient = limE(DIVIDE(gteH, fSZ(v))); + fSX(v) = limG1(F((s64)gteOFX + ((s64)gteIR1 * quotient)) >> 16); + fSY(v) = limG2(F((s64)gteOFY + ((s64)gteIR2 * quotient)) >> 16); + } + gteMAC0 = F((s64)(gteDQB + ((s64)gteDQA * quotient)) >> 12); + gteIR0 = limH(gteMAC0); +} + +void gteMVMVA() { + int shift = 12 * GTE_SF(gteop); + int mx = GTE_MX(gteop); + int v = GTE_V(gteop); + int cv = GTE_CV(gteop); + int lm = GTE_LM(gteop); + s32 vx = VX(v); + s32 vy = VY(v); + s32 vz = VZ(v); + +#ifdef GTE_LOG + GTE_LOG("GTE MVMVA\n"); +#endif + gteFLAG = 0; + + gteMAC1 = A1((((s64)CV1(cv) << 12) + (MX11(mx) * vx) + (MX12(mx) * vy) + (MX13(mx) * vz)) >> shift); + gteMAC2 = A2((((s64)CV2(cv) << 12) + (MX21(mx) * vx) + (MX22(mx) * vy) + (MX23(mx) * vz)) >> shift); + gteMAC3 = A3((((s64)CV3(cv) << 12) + (MX31(mx) * vx) + (MX32(mx) * vy) + (MX33(mx) * vz)) >> shift); + + gteIR1 = limB1(gteMAC1, lm); + gteIR2 = limB2(gteMAC2, lm); + gteIR3 = limB3(gteMAC3, lm); +} + +void gteNCLIP() { +#ifdef GTE_LOG + GTE_LOG("GTE NCLIP\n"); +#endif + gteFLAG = 0; + + gteMAC0 = F((s64)gteSX0 * (gteSY1 - gteSY2) + + gteSX1 * (gteSY2 - gteSY0) + + gteSX2 * (gteSY0 - gteSY1)); +} + +void gteAVSZ3() { +#ifdef GTE_LOG + GTE_LOG("GTE AVSZ3\n"); +#endif + gteFLAG = 0; + + gteMAC0 = F((s64)(gteZSF3 * gteSZ1) + (gteZSF3 * gteSZ2) + (gteZSF3 * gteSZ3)); + gteOTZ = limD(gteMAC0 >> 12); +} + +void gteAVSZ4() { +#ifdef GTE_LOG + GTE_LOG("GTE AVSZ4\n"); +#endif + gteFLAG = 0; + + gteMAC0 = F((s64)(gteZSF4 * (gteSZ0 + gteSZ1 + gteSZ2 + gteSZ3))); + gteOTZ = limD(gteMAC0 >> 12); +} + +void gteSQR() { + int shift = 12 * GTE_SF(gteop); + int lm = GTE_LM(gteop); + +#ifdef GTE_LOG + GTE_LOG("GTE SQR\n"); +#endif + gteFLAG = 0; + + gteMAC1 = A1((gteIR1 * gteIR1) >> shift); + gteMAC2 = A2((gteIR2 * gteIR2) >> shift); + gteMAC3 = A3((gteIR3 * gteIR3) >> shift); + gteIR1 = limB1(gteMAC1 >> shift, lm); + gteIR2 = limB2(gteMAC2 >> shift, lm); + gteIR3 = limB3(gteMAC3 >> shift, lm); +} + +void gteNCCS() { +#ifdef GTE_LOG + GTE_LOG("GTE NCCS\n"); +#endif + gteFLAG = 0; + + gteMAC1 = A1((((s64)gteL11 * gteVX0) + (gteL12 * gteVY0) + (gteL13 * gteVZ0)) >> 12); + gteMAC2 = A2((((s64)gteL21 * gteVX0) + (gteL22 * gteVY0) + (gteL23 * gteVZ0)) >> 12); + gteMAC3 = A3((((s64)gteL31 * gteVX0) + (gteL32 * gteVY0) + (gteL33 * gteVZ0)) >> 12); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + gteMAC1 = A1((((s64)gteRBK << 12) + (gteLR1 * gteIR1) + (gteLR2 * gteIR2) + (gteLR3 * gteIR3)) >> 12); + gteMAC2 = A2((((s64)gteGBK << 12) + (gteLG1 * gteIR1) + (gteLG2 * gteIR2) + (gteLG3 * gteIR3)) >> 12); + gteMAC3 = A3((((s64)gteBBK << 12) + (gteLB1 * gteIR1) + (gteLB2 * gteIR2) + (gteLB3 * gteIR3)) >> 12); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + gteMAC1 = A1(((s64)gteR * gteIR1) >> 8); + gteMAC2 = A2(((s64)gteG * gteIR2) >> 8); + gteMAC3 = A3(((s64)gteB * gteIR3) >> 8); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + + gteRGB0 = gteRGB1; + gteRGB1 = gteRGB2; + gteCODE2 = gteCODE; + gteR2 = limC1(gteMAC1 >> 4); + gteG2 = limC2(gteMAC2 >> 4); + gteB2 = limC3(gteMAC3 >> 4); +} + +void gteNCCT() { + int v; + s32 vx, vy, vz; + +#ifdef GTE_LOG + GTE_LOG("GTE NCCT\n"); +#endif + gteFLAG = 0; + + for (v = 0; v < 3; v++) { + vx = VX(v); + vy = VY(v); + vz = VZ(v); + gteMAC1 = A1((((s64)gteL11 * vx) + (gteL12 * vy) + (gteL13 * vz)) >> 12); + gteMAC2 = A2((((s64)gteL21 * vx) + (gteL22 * vy) + (gteL23 * vz)) >> 12); + gteMAC3 = A3((((s64)gteL31 * vx) + (gteL32 * vy) + (gteL33 * vz)) >> 12); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + gteMAC1 = A1((((s64)gteRBK << 12) + (gteLR1 * gteIR1) + (gteLR2 * gteIR2) + (gteLR3 * gteIR3)) >> 12); + gteMAC2 = A2((((s64)gteGBK << 12) + (gteLG1 * gteIR1) + (gteLG2 * gteIR2) + (gteLG3 * gteIR3)) >> 12); + gteMAC3 = A3((((s64)gteBBK << 12) + (gteLB1 * gteIR1) + (gteLB2 * gteIR2) + (gteLB3 * gteIR3)) >> 12); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + gteMAC1 = A1(((s64)gteR * gteIR1) >> 8); + gteMAC2 = A2(((s64)gteG * gteIR2) >> 8); + gteMAC3 = A3(((s64)gteB * gteIR3) >> 8); + + gteRGB0 = gteRGB1; + gteRGB1 = gteRGB2; + gteCODE2 = gteCODE; + gteR2 = limC1(gteMAC1 >> 4); + gteG2 = limC2(gteMAC2 >> 4); + gteB2 = limC3(gteMAC3 >> 4); + } + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); +} + +void gteNCDS() { +#ifdef GTE_LOG + GTE_LOG("GTE NCDS\n"); +#endif + gteFLAG = 0; + + gteMAC1 = A1((((s64)gteL11 * gteVX0) + (gteL12 * gteVY0) + (gteL13 * gteVZ0)) >> 12); + gteMAC2 = A2((((s64)gteL21 * gteVX0) + (gteL22 * gteVY0) + (gteL23 * gteVZ0)) >> 12); + gteMAC3 = A3((((s64)gteL31 * gteVX0) + (gteL32 * gteVY0) + (gteL33 * gteVZ0)) >> 12); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + gteMAC1 = A1((((s64)gteRBK << 12) + (gteLR1 * gteIR1) + (gteLR2 * gteIR2) + (gteLR3 * gteIR3)) >> 12); + gteMAC2 = A2((((s64)gteGBK << 12) + (gteLG1 * gteIR1) + (gteLG2 * gteIR2) + (gteLG3 * gteIR3)) >> 12); + gteMAC3 = A3((((s64)gteBBK << 12) + (gteLB1 * gteIR1) + (gteLB2 * gteIR2) + (gteLB3 * gteIR3)) >> 12); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + gteMAC1 = A1(((((s64)gteR << 4) * gteIR1) + (gteIR0 * limB1(gteRFC - ((gteR * gteIR1) >> 8), 0))) >> 12); + gteMAC2 = A2(((((s64)gteG << 4) * gteIR2) + (gteIR0 * limB2(gteGFC - ((gteG * gteIR2) >> 8), 0))) >> 12); + gteMAC3 = A3(((((s64)gteB << 4) * gteIR3) + (gteIR0 * limB3(gteBFC - ((gteB * gteIR3) >> 8), 0))) >> 12); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + + gteRGB0 = gteRGB1; + gteRGB1 = gteRGB2; + gteCODE2 = gteCODE; + gteR2 = limC1(gteMAC1 >> 4); + gteG2 = limC2(gteMAC2 >> 4); + gteB2 = limC3(gteMAC3 >> 4); +} + +void gteNCDT() { + int v; + s32 vx, vy, vz; + +#ifdef GTE_LOG + GTE_LOG("GTE NCDT\n"); +#endif + gteFLAG = 0; + + for (v = 0; v < 3; v++) { + vx = VX(v); + vy = VY(v); + vz = VZ(v); + gteMAC1 = A1((((s64)gteL11 * vx) + (gteL12 * vy) + (gteL13 * vz)) >> 12); + gteMAC2 = A2((((s64)gteL21 * vx) + (gteL22 * vy) + (gteL23 * vz)) >> 12); + gteMAC3 = A3((((s64)gteL31 * vx) + (gteL32 * vy) + (gteL33 * vz)) >> 12); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + gteMAC1 = A1((((s64)gteRBK << 12) + (gteLR1 * gteIR1) + (gteLR2 * gteIR2) + (gteLR3 * gteIR3)) >> 12); + gteMAC2 = A2((((s64)gteGBK << 12) + (gteLG1 * gteIR1) + (gteLG2 * gteIR2) + (gteLG3 * gteIR3)) >> 12); + gteMAC3 = A3((((s64)gteBBK << 12) + (gteLB1 * gteIR1) + (gteLB2 * gteIR2) + (gteLB3 * gteIR3)) >> 12); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + gteMAC1 = A1(((((s64)gteR << 4) * gteIR1) + (gteIR0 * limB1(gteRFC - ((gteR * gteIR1) >> 8), 0))) >> 12); + gteMAC2 = A2(((((s64)gteG << 4) * gteIR2) + (gteIR0 * limB2(gteGFC - ((gteG * gteIR2) >> 8), 0))) >> 12); + gteMAC3 = A3(((((s64)gteB << 4) * gteIR3) + (gteIR0 * limB3(gteBFC - ((gteB * gteIR3) >> 8), 0))) >> 12); + + gteRGB0 = gteRGB1; + gteRGB1 = gteRGB2; + gteCODE2 = gteCODE; + gteR2 = limC1(gteMAC1 >> 4); + gteG2 = limC2(gteMAC2 >> 4); + gteB2 = limC3(gteMAC3 >> 4); + } + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); +} + +void gteOP() { + int shift = 12 * GTE_SF(gteop); + int lm = GTE_LM(gteop); + +#ifdef GTE_LOG + GTE_LOG("GTE OP\n"); +#endif + gteFLAG = 0; + + gteMAC1 = A1(((s64)(gteR22 * gteIR3) - (gteR33 * gteIR2)) >> shift); + gteMAC2 = A2(((s64)(gteR33 * gteIR1) - (gteR11 * gteIR3)) >> shift); + gteMAC3 = A3(((s64)(gteR11 * gteIR2) - (gteR22 * gteIR1)) >> shift); + gteIR1 = limB1(gteMAC1, lm); + gteIR2 = limB2(gteMAC2, lm); + gteIR3 = limB3(gteMAC3, lm); +} + +void gteDCPL() { + int lm = GTE_LM(gteop); + + s64 RIR1 = ((s64)gteR * gteIR1) >> 8; + s64 GIR2 = ((s64)gteG * gteIR2) >> 8; + s64 BIR3 = ((s64)gteB * gteIR3) >> 8; + +#ifdef GTE_LOG + GTE_LOG("GTE DCPL\n"); +#endif + gteFLAG = 0; + + gteMAC1 = A1(RIR1 + ((gteIR0 * limB1(gteRFC - RIR1, 0)) >> 12)); + gteMAC2 = A2(GIR2 + ((gteIR0 * limB1(gteGFC - GIR2, 0)) >> 12)); + gteMAC3 = A3(BIR3 + ((gteIR0 * limB1(gteBFC - BIR3, 0)) >> 12)); + + gteIR1 = limB1(gteMAC1, lm); + gteIR2 = limB2(gteMAC2, lm); + gteIR3 = limB3(gteMAC3, lm); + + gteRGB0 = gteRGB1; + gteRGB1 = gteRGB2; + gteCODE2 = gteCODE; + gteR2 = limC1(gteMAC1 >> 4); + gteG2 = limC2(gteMAC2 >> 4); + gteB2 = limC3(gteMAC3 >> 4); +} + +void gteGPF() { + int shift = 12 * GTE_SF(gteop); + +#ifdef GTE_LOG + GTE_LOG("GTE GPF\n"); +#endif + gteFLAG = 0; + + gteMAC1 = A1(((s64)gteIR0 * gteIR1) >> shift); + gteMAC2 = A2(((s64)gteIR0 * gteIR2) >> shift); + gteMAC3 = A3(((s64)gteIR0 * gteIR3) >> shift); + gteIR1 = limB1(gteMAC1, 0); + gteIR2 = limB2(gteMAC2, 0); + gteIR3 = limB3(gteMAC3, 0); + + gteRGB0 = gteRGB1; + gteRGB1 = gteRGB2; + gteCODE2 = gteCODE; + gteR2 = limC1(gteMAC1 >> 4); + gteG2 = limC2(gteMAC2 >> 4); + gteB2 = limC3(gteMAC3 >> 4); +} + +void gteGPL() { + int shift = 12 * GTE_SF(gteop); + +#ifdef GTE_LOG + GTE_LOG("GTE GPL\n"); +#endif + gteFLAG = 0; + + gteMAC1 = A1((((s64)gteMAC1 << shift) + (gteIR0 * gteIR1)) >> shift); + gteMAC2 = A2((((s64)gteMAC2 << shift) + (gteIR0 * gteIR2)) >> shift); + gteMAC3 = A3((((s64)gteMAC3 << shift) + (gteIR0 * gteIR3)) >> shift); + gteIR1 = limB1(gteMAC1, 0); + gteIR2 = limB2(gteMAC2, 0); + gteIR3 = limB3(gteMAC3, 0); + + gteRGB0 = gteRGB1; + gteRGB1 = gteRGB2; + gteCODE2 = gteCODE; + gteR2 = limC1(gteMAC1 >> 4); + gteG2 = limC2(gteMAC2 >> 4); + gteB2 = limC3(gteMAC3 >> 4); +} + +void gteDPCS() { + int shift = 12 * GTE_SF(gteop); + +#ifdef GTE_LOG + GTE_LOG("GTE DPCS\n"); +#endif + gteFLAG = 0; + + gteMAC1 = A1(((gteR << 16) + (gteIR0 * limB1(A1((s64)gteRFC - (gteR << 4)) << (12 - shift), 0))) >> 12); + gteMAC2 = A2(((gteG << 16) + (gteIR0 * limB2(A2((s64)gteGFC - (gteG << 4)) << (12 - shift), 0))) >> 12); + gteMAC3 = A3(((gteB << 16) + (gteIR0 * limB3(A3((s64)gteBFC - (gteB << 4)) << (12 - shift), 0))) >> 12); + + gteIR1 = limB1(gteMAC1, 0); + gteIR2 = limB2(gteMAC2, 0); + gteIR3 = limB3(gteMAC3, 0); + gteRGB0 = gteRGB1; + gteRGB1 = gteRGB2; + gteCODE2 = gteCODE; + gteR2 = limC1(gteMAC1 >> 4); + gteG2 = limC2(gteMAC2 >> 4); + gteB2 = limC3(gteMAC3 >> 4); +} + +void gteDPCT() { + int v; + +#ifdef GTE_LOG + GTE_LOG("GTE DPCT\n"); +#endif + gteFLAG = 0; + + for (v = 0; v < 3; v++) { + gteMAC1 = A1((((s64)gteR0 << 16) + ((s64)gteIR0 * (limB1(gteRFC - (gteR0 << 4), 0)))) >> 12); + gteMAC2 = A2((((s64)gteG0 << 16) + ((s64)gteIR0 * (limB1(gteGFC - (gteG0 << 4), 0)))) >> 12); + gteMAC3 = A3((((s64)gteB0 << 16) + ((s64)gteIR0 * (limB1(gteBFC - (gteB0 << 4), 0)))) >> 12); + + gteRGB0 = gteRGB1; + gteRGB1 = gteRGB2; + gteCODE2 = gteCODE; + gteR2 = limC1(gteMAC1 >> 4); + gteG2 = limC2(gteMAC2 >> 4); + gteB2 = limC3(gteMAC3 >> 4); + } + gteIR1 = limB1(gteMAC1, 0); + gteIR2 = limB2(gteMAC2, 0); + gteIR3 = limB3(gteMAC3, 0); +} + +void gteNCS() { +#ifdef GTE_LOG + GTE_LOG("GTE NCS\n"); +#endif + gteFLAG = 0; + + gteMAC1 = A1((((s64)gteL11 * gteVX0) + (gteL12 * gteVY0) + (gteL13 * gteVZ0)) >> 12); + gteMAC2 = A2((((s64)gteL21 * gteVX0) + (gteL22 * gteVY0) + (gteL23 * gteVZ0)) >> 12); + gteMAC3 = A3((((s64)gteL31 * gteVX0) + (gteL32 * gteVY0) + (gteL33 * gteVZ0)) >> 12); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + gteMAC1 = A1((((s64)gteRBK << 12) + (gteLR1 * gteIR1) + (gteLR2 * gteIR2) + (gteLR3 * gteIR3)) >> 12); + gteMAC2 = A2((((s64)gteGBK << 12) + (gteLG1 * gteIR1) + (gteLG2 * gteIR2) + (gteLG3 * gteIR3)) >> 12); + gteMAC3 = A3((((s64)gteBBK << 12) + (gteLB1 * gteIR1) + (gteLB2 * gteIR2) + (gteLB3 * gteIR3)) >> 12); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + + gteRGB0 = gteRGB1; + gteRGB1 = gteRGB2; + gteCODE2 = gteCODE; + gteR2 = limC1(gteMAC1 >> 4); + gteG2 = limC2(gteMAC2 >> 4); + gteB2 = limC3(gteMAC3 >> 4); +} + +void gteNCT() { + int v; + s32 vx, vy, vz; + +#ifdef GTE_LOG + GTE_LOG("GTE NCT\n"); +#endif + gteFLAG = 0; + + for (v = 0; v < 3; v++) { + vx = VX(v); + vy = VY(v); + vz = VZ(v); + gteMAC1 = A1((((s64)gteL11 * vx) + (gteL12 * vy) + (gteL13 * vz)) >> 12); + gteMAC2 = A2((((s64)gteL21 * vx) + (gteL22 * vy) + (gteL23 * vz)) >> 12); + gteMAC3 = A3((((s64)gteL31 * vx) + (gteL32 * vy) + (gteL33 * vz)) >> 12); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + gteMAC1 = A1((((s64)gteRBK << 12) + (gteLR1 * gteIR1) + (gteLR2 * gteIR2) + (gteLR3 * gteIR3)) >> 12); + gteMAC2 = A2((((s64)gteGBK << 12) + (gteLG1 * gteIR1) + (gteLG2 * gteIR2) + (gteLG3 * gteIR3)) >> 12); + gteMAC3 = A3((((s64)gteBBK << 12) + (gteLB1 * gteIR1) + (gteLB2 * gteIR2) + (gteLB3 * gteIR3)) >> 12); + gteRGB0 = gteRGB1; + gteRGB1 = gteRGB2; + gteCODE2 = gteCODE; + gteR2 = limC1(gteMAC1 >> 4); + gteG2 = limC2(gteMAC2 >> 4); + gteB2 = limC3(gteMAC3 >> 4); + } + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); +} + +void gteCC() { +#ifdef GTE_LOG + GTE_LOG("GTE CC\n"); +#endif + gteFLAG = 0; + + gteMAC1 = A1((((s64)gteRBK << 12) + (gteLR1 * gteIR1) + (gteLR2 * gteIR2) + (gteLR3 * gteIR3)) >> 12); + gteMAC2 = A2((((s64)gteGBK << 12) + (gteLG1 * gteIR1) + (gteLG2 * gteIR2) + (gteLG3 * gteIR3)) >> 12); + gteMAC3 = A3((((s64)gteBBK << 12) + (gteLB1 * gteIR1) + (gteLB2 * gteIR2) + (gteLB3 * gteIR3)) >> 12); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + gteMAC1 = A1(((s64)gteR * gteIR1) >> 8); + gteMAC2 = A2(((s64)gteG * gteIR2) >> 8); + gteMAC3 = A3(((s64)gteB * gteIR3) >> 8); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + + gteRGB0 = gteRGB1; + gteRGB1 = gteRGB2; + gteCODE2 = gteCODE; + gteR2 = limC1(gteMAC1 >> 4); + gteG2 = limC2(gteMAC2 >> 4); + gteB2 = limC3(gteMAC3 >> 4); +} + +void gteINTPL() { + int shift = 12 * GTE_SF(gteop); + int lm = GTE_LM(gteop); + +#ifdef GTE_LOG + GTE_LOG("GTE INTPL\n"); +#endif + gteFLAG = 0; + + gteMAC1 = A1(((gteIR1 << 12) + (gteIR0 * limB1(((s64)gteRFC - gteIR1), 0))) >> shift); + gteMAC2 = A2(((gteIR2 << 12) + (gteIR0 * limB2(((s64)gteGFC - gteIR2), 0))) >> shift); + gteMAC3 = A3(((gteIR3 << 12) + (gteIR0 * limB3(((s64)gteBFC - gteIR3), 0))) >> shift); + gteIR1 = limB1(gteMAC1, lm); + gteIR2 = limB2(gteMAC2, lm); + gteIR3 = limB3(gteMAC3, lm); + gteRGB0 = gteRGB1; + gteRGB1 = gteRGB2; + gteCODE2 = gteCODE; + gteR2 = limC1(gteMAC1 >> 4); + gteG2 = limC2(gteMAC2 >> 4); + gteB2 = limC3(gteMAC3 >> 4); +} + +void gteCDP() { +#ifdef GTE_LOG + GTE_LOG("GTE CDP\n"); +#endif + gteFLAG = 0; + + gteMAC1 = A1((((s64)gteRBK << 12) + (gteLR1 * gteIR1) + (gteLR2 * gteIR2) + (gteLR3 * gteIR3)) >> 12); + gteMAC2 = A2((((s64)gteGBK << 12) + (gteLG1 * gteIR1) + (gteLG2 * gteIR2) + (gteLG3 * gteIR3)) >> 12); + gteMAC3 = A3((((s64)gteBBK << 12) + (gteLB1 * gteIR1) + (gteLB2 * gteIR2) + (gteLB3 * gteIR3)) >> 12); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + gteMAC1 = A1(((((s64)gteR << 4) * gteIR1) + (gteIR0 * limB1(gteRFC - ((gteR * gteIR1) >> 8), 0))) >> 12); + gteMAC2 = A2(((((s64)gteG << 4) * gteIR2) + (gteIR0 * limB2(gteGFC - ((gteG * gteIR2) >> 8), 0))) >> 12); + gteMAC3 = A3(((((s64)gteB << 4) * gteIR3) + (gteIR0 * limB3(gteBFC - ((gteB * gteIR3) >> 8), 0))) >> 12); + gteIR1 = limB1(gteMAC1, 1); + gteIR2 = limB2(gteMAC2, 1); + gteIR3 = limB3(gteMAC3, 1); + + gteRGB0 = gteRGB1; + gteRGB1 = gteRGB2; + gteCODE2 = gteCODE; + gteR2 = limC1(gteMAC1 >> 4); + gteG2 = limC2(gteMAC2 >> 4); + gteB2 = limC3(gteMAC3 >> 4); +} diff --git a/libpcsxcore/gte.h b/libpcsxcore/gte.h new file mode 100644 index 0000000..2cea026 --- /dev/null +++ b/libpcsxcore/gte.h @@ -0,0 +1,65 @@ +/*************************************************************************** + * PCSX-Revolution - PlayStation Emulator for Nintendo Wii * + * Copyright (C) 2009-2010 PCSX-Revolution Dev Team * + * * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __GTE_H__ +#define __GTE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" +#include "r3000a.h" + +void gteMFC2(); +void gteCFC2(); +void gteMTC2(); +void gteCTC2(); +void gteLWC2(); +void gteSWC2(); + +void gteRTPS(); +void gteOP(); +void gteNCLIP(); +void gteDPCS(); +void gteINTPL(); +void gteMVMVA(); +void gteNCDS(); +void gteNCDT(); +void gteCDP(); +void gteNCCS(); +void gteCC(); +void gteNCS(); +void gteNCT(); +void gteSQR(); +void gteDCPL(); +void gteDPCT(); +void gteAVSZ3(); +void gteAVSZ4(); +void gteRTPT(); +void gteGPF(); +void gteGPL(); +void gteNCCT(); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/gte_divider.h b/libpcsxcore/gte_divider.h new file mode 100644 index 0000000..ae32db0 --- /dev/null +++ b/libpcsxcore/gte_divider.h @@ -0,0 +1,4133 @@ +// GTE Divider by shalma +// http://forums.ngemu.com/1844192-post72.html + +static u16 initial_guess[32768] = { + 0x0000, 0xFE93, 0xFE91, 0xFE8F, 0xFE8D, 0xFE8B, 0xFE89, 0xFE87, + 0xFE85, 0xFE83, 0xFE81, 0xFE7F, 0xFE7D, 0xFE7B, 0xFE79, 0xFE77, + 0xFE75, 0xFE71, 0xFE6F, 0xFE6D, 0xFE6B, 0xFE69, 0xFE67, 0xFE65, + 0xFE63, 0xFE61, 0xFE5D, 0xFE5B, 0xFE59, 0xFE57, 0xFE55, 0xFE53, + 0xFE4F, 0xFE4D, 0xFE4B, 0xFE49, 0xFE47, 0xFE45, 0xFE41, 0xFE3F, + 0xFE3D, 0xFE3B, 0xFE37, 0xFE35, 0xFE33, 0xFE31, 0xFE2F, 0xFE2B, + 0xFE29, 0xFE27, 0xFE25, 0xFE21, 0xFE1F, 0xFE1D, 0xFE19, 0xFE17, + 0xFE15, 0xFE13, 0xFE0F, 0xFE0D, 0xFE0B, 0xFE07, 0xFE05, 0xFE03, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFDB6, 0xFDB2, 0xFDB0, 0xFDAC, 0xFDAA, + 0xFDA6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEB72, 0xEB70, 0xEB6E, + 0xEB86, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xEBDF, 0xEBF9, + 0xEBF7, 0xEBF5, 0xE64A, 0xE65C, 0xE65A, 0xE66E, 0xE66C, 0xE65F, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xEC3E, 0xEC3C, 0xEC56, 0xE6B7, 0xE6C9, + 0xE6C7, 0xE6BA, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFF43, 0xEC94, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFF0E, 0xED15, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFE36, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF44, + 0xFD16, 0xE877, 0xE868, 0xE4DC, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFF5A, 0xFDBB, 0xED6C, 0xE891, 0xE528, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFED2, 0xFD10, 0xED52, 0xE8AA, 0xE554, + 0xE28E, 0xE28C, 0xE040, 0xFFFE, 0xFF5C, 0xFDF1, 0xFBB1, 0xE8BC, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF6E, 0xFE0A, 0xFC57, + 0xE8C1, 0xE558, 0xE556, 0xE2A0, 0xE2B2, 0xE060, 0xDE5E, 0xFE56, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFF78, 0xFE4E, 0xFCDC, 0xED27, 0xE57A, 0xE56D, 0xE2C3, 0xE086, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFF04, 0xFDCB, 0xFC53, 0xED0A, 0xE57F, 0xE2D8, 0xE09E, + 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFF37, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF88, + 0xFE9A, 0xFD43, 0xFBD6, 0xECBE, 0xE574, 0xE2EF, 0xE0B1, 0xDED1, + 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFF86, 0xFE6F, 0xFD54, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF8E, 0xFEAC, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFC5, 0xFEBB, 0xFDA6, 0xFC62, 0xFACC, + 0xE885, 0xE2E9, 0xFF90, 0xFEB4, 0xFDA3, 0xFC59, 0xFAA5, 0xE867, + 0xE561, 0xE0C5, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFF12, + 0xFE21, 0xFCEC, 0xFBA5, 0xF9CA, 0xFFFF, 0xFF96, 0xFEC2, 0xFDBD, + 0xFC83, 0xFB14, 0xF90C, 0xE551, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFF5B, 0xFE66, 0xFD69, 0xFC39, 0xFAD6, 0xF8DC, 0xFF67, + 0xFE9D, 0xFDA2, 0xFCCE, 0xFB79, 0xF9E9, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xE80C, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFF9A, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFF71, 0xE519, 0xE0A5, 0xFFFE, 0xFFFE, 0xFFFE, 0xFF6B, 0xE4FF, + 0xE0A1, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF46, 0xE50A, 0xE0A8, 0xDED3, + 0xDD3C, 0xDBAB, 0xDA53, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFF71, 0xFE96, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFD3, 0xFF1F, 0xFE5B, 0xE293, 0xDEC3, 0xDD2C, + 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFA4, 0xFEDA, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFD2, 0xFF25, 0xFE6D, 0xE787, 0xE08E, 0xDEC7, 0xFFFF, 0xFFFF, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFF79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF7F, 0xFED7, + 0xFE03, 0xE75E, 0xE276, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFF7D, 0xFEBB, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFF83, 0xFEDF, 0xFE17, 0xFD52, 0xE49F, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFD5, 0xFF25, 0xFE6C, 0xFDAC, 0xFFFF, 0xFFAE, + 0xFF0E, 0xFE60, 0xFDA7, 0xFCDE, 0xE235, 0xDE95, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFAE, 0xE039, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF8B, 0xE023, 0xDCE3, + 0xDB7C, 0xDA35, 0xD7CD, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFD9, 0xFF35, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFB4, 0xFF1C, 0xE009, 0xDCE2, 0xDA2B, 0xFFFF, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFD9, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFF8F, 0xFEFB, 0xE1D1, 0xDE4C, 0xFFFF, + 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFF8D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFB6, 0xFF26, 0xFE92, + 0xE1C4, 0xDE3B, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFF91, 0xFEEF, 0xFFFF, 0xFFFF, 0xFFB8, + 0xFF2A, 0xFE9C, 0xFDE9, 0xDFC1, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xE177, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFB8, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xE177, + 0xDC8A, 0xD9DF, 0xFFFF, 0xFF99, 0xDF9C, 0xDB26, 0xD89E, 0xD792, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFF74, 0xDF88, 0xDB09, 0xFFFF, 0xFF7A, 0xE142, 0xDC6B, 0xD9CE, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFBC, 0xFF2E, 0xE12E, 0xFFFF, 0xFFBE, 0xFF3A, 0xFEB6, 0xDDC0, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFF78, 0xFEE8, 0xFE59, 0xFFFF, 0xFF7E, 0xFEFC, 0xFE74, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFC0, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFE0, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFC2, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFE0, 0xFF67, 0xDEDF, 0xFFFE, 0xFFE1, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, + 0xFF21, 0xDEAE, 0xDA80, 0xFF86, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFA5, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFA3, 0xFF23, + 0xFE9B, 0xDD12, 0xFF6B, 0xFFE2, 0xFFC4, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFC3, 0xDA41, 0xFF8A, 0xFF8A, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF8C, + 0xDA41, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFC5, 0xFF54, 0xDB71, + 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFA9, 0xFFFF, 0xFFFF, 0xFFC5, 0xFF56, 0xFEE6, 0xDB56, 0xD6AF, + 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xD9FB, 0xD6A4, 0xFFFE, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFC7, + 0xFFFE, 0xFFFE, 0xFFFE, 0xDB1B, 0xD794, 0xD49C, 0xFFFE, 0xFFFE, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFAD, 0xDB12, 0xD68B, + 0xFFE3, 0xFF73, 0xD893, 0xD573, 0xD3AC, 0xFFFE, 0xFFFE, 0xFFC8, + 0xFF58, 0xD9C0, 0xFFE5, 0xFF79, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFE5, 0xFF75, 0xFF01, 0xD9A7, + 0xFF94, 0xFFFF, 0xFFE4, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD98E, 0xFFFE, 0xFFB1, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFCB, 0xD843, 0xFF62, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFB0, + 0xFF4B, 0xD719, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFB3, 0xFF4D, 0xD93E, 0xFFFF, + 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xD5FB, 0xFFFE, 0xFFB3, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFE5, 0xD6E4, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFF9C, 0xFFFE, 0xFFFE, 0xFFB3, 0xD7C7, 0xD3F1, + 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFB4, 0xFF53, + 0xD6A8, 0xFFCE, 0xFF68, 0xD7B0, 0xD4C5, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xD5AF, 0xD2FC, 0xFFCD, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFE6, 0xD591, + 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFE6, 0xFF87, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFE7, 0xFFFF, 0xFFFF, 0xFFCF, 0xFF70, + 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFCF, 0xFFFE, 0xFFFE, 0xFFD0, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFF8B, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFE8, 0xFFFE, 0xFFFE, 0xFFE7, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFBB, 0xFFFE, 0xFFFE, + 0xFFB9, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFE8, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFBB, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xD406, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFBB, 0xD3F1, 0xFFE8, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFF8D, 0xD3DC, 0xFFD3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, + 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD217, 0xFFFF, 0xFFBC, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFD4, 0xD202, 0xFF7C, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFD3, 0xFF7C, 0xFFFF, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFBF, 0xFF67, + 0xFFEA, 0xFFFE, 0xFFE9, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFA8, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFEA, 0xFFEA, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFBF, 0xFFBF, 0xFFFF, 0xFFFF, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFF80, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFD6, 0xFFFF, 0xFFEA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFC0, 0xFFFE, + 0xFFFF, 0xFFFF, 0xCFC0, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFD7, 0xFFFF, 0xFFFF, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFC1, 0xFFFF, 0xFFD7, 0xFF86, + 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFC2, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFF88, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFEC, 0xFFFE, 0xFE99, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFF, 0xFFEC, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFDB0, 0xFFD8, 0xFFD8, 0xFFFF, 0xFFFF, 0xFFC5, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFF, 0xFEEE, 0xFF9B, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFEB, 0xFFFE, 0xFF60, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFEB, + 0xFE78, 0xFFC4, 0xFFC4, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFB2, 0xFFFF, 0xFF9F, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFDA, 0xFFDA, + 0xFFFF, 0xFFFF, 0xCB8D, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFF, 0xFFFF, 0xFFEC, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFED, 0xFFFF, 0xFFFF, 0xFFB3, 0xFFFF, 0xFFFF, + 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFC6, + 0xFFFE, 0xFFFE, 0xFFC7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, + 0xFFFE, 0xFF90, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFE, 0xFE23, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFEC, 0xFFEC, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFE90, 0xFFC7, 0xFFFF, 0xFFFF, + 0xFFB5, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFAE1, 0xFE5B, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFED, 0xFC33, + 0xFECB, 0xFFEC, 0xFFEC, 0xFFFE, 0xFFED, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFC9, 0xFCAF, 0xFF20, 0xFFB7, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFF92, 0xFD1F, 0xFF81, 0xFFFE, 0xFFFE, 0xFFFE, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFECF, 0xFFEE, 0xFD8F, 0xFFED, 0xFFED, + 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFB7, 0xFFB7, 0xFE8B, + 0xFFB8, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFFFE, 0xFDD3, 0xFF83, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFD12, 0xFFEE, 0xFFEE, + 0xFFFE, 0xFFDC, 0xFFDC, 0xFFFF, 0xFFFF, 0xFFFE, 0xFB9A, 0xFE14, + 0xFFB9, 0xFFFE, 0xFFB8, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF893, + 0xFD47, 0xFF85, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFED7, 0xFB40, 0xFE43, 0xFFDC, 0xFFDC, 0xFFFF, 0xFFCA, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFB9, 0xFCE4, 0xFF1F, 0xFFFF, 0xFFFF, 0xFF98, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFF87, 0xFB81, 0xFE64, 0xFFFF, 0xFFEE, + 0xFFFE, 0xFFED, 0xFFFF, 0xFFFF, 0xFECF, 0xFFDC, 0xFDA9, 0xFFCC, + 0xFFCC, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFD89, 0xFFA9, 0xFFFF, + 0xFF1B, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFCCA, 0xFEF0, + 0xFFEE, 0xFE62, 0xFFEF, 0xFFEF, 0xFFFF, 0xFFFF, 0xFFFE, 0xFC04, + 0xFEBF, 0xFFBC, 0xFFFE, 0xFFBC, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFB35, 0xFE06, 0xFF89, 0xFFFE, 0xFFFE, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFDE2, 0xFFDE, 0xFFDE, 0xFFFF, 0xFFCC, 0xFFFE, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFDAB, 0xFF38, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFF89, 0xFFEE, 0xFFEE, + 0xFBC5, 0xFDDF, 0xFFDD, 0xFFDD, 0xFFDE, 0xFFDE, 0xFFFF, 0xFFFF, + 0xFFFE, 0xFB91, 0xFE43, 0xFFAD, 0xFFFE, 0xFFAD, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFE, 0xFB5E, 0xFE14, 0xFFFE, 0xFFFE, 0xFFEE, 0xFFDF, + 0xFFFE, 0xFFFE, 0xFEE9, 0xFBCC, 0xFE61, 0xFFCD, 0xFFFF, 0xFFBD, + 0xFFFE, 0xFFFE, 0xFFFE, 0xFF36, 0xFC22, 0xFE2C, 0xFFFF, 0xFFFF, + 0xFF8D, 0xFFFE, 0xFFFE, 0xFC85, 0xFF05, 0xFBF6, 0xFE7C, 0xFFDF, + 0xFFDF, 0xFFDE, 0xFFCF, 0xFFFF, 0xFCDA, 0xFED2, 0xFC4B, 0xFECD, + 0xFFAF, 0xFFFE, 0xFFAD, 0xFFFF, 0xFA8D, 0xFDB0, 0xFF8D, 0xFD2B, + 0xFE9E, 0xFFEF, 0xFFEF, 0xFFE0, 0xFFE0, 0xFAE5, 0xFE00, 0xFFCE, + 0xFD7C, 0xFFCF, 0xFFCF, 0xFFFF, 0xFFAE, 0xF7CC, 0xFBD1, 0xFE42, + 0xFFA0, 0xFDCB, 0xFF9E, 0xFFFF, 0xFFFF, 0xFFFE, 0xF8E6, 0xFCAB, + 0xFF0B, 0xFFE0, 0xFE84, 0xFFD0, 0xFFD0, 0xFFFE, 0xFD79, 0xFA65, + 0xFCFE, 0xFF42, 0xFFFF, 0xFEC4, 0xFFFE, 0xFFFE, 0xFFFE, 0xFE48, + 0xFBD4, 0xFDC0, 0xFFF0, 0xFFF0, 0xFF73, 0xFFEF, 0xFFFF, 0xFD2C, + 0xFEFC, 0xFCA3, 0xFE79, 0xFFC1, 0xFFFE, 0xFFC0, 0xFFFF, 0xFFFF, + 0xFDE8, 0xFFB1, 0xFD61, 0xFF2F, 0xFFFE, 0xFFFE, 0xFFF0, 0xFFF0, + 0xFFEF, 0xFFEF, 0xFFDF, 0xFFDF, 0xFBC2, 0xFE0F, 0xFFC2, 0xFDA3, + 0xFF55, 0xFFFF, 0xFFFF, 0xFFFE, 0xFA18, 0xFD0B, 0xFECA, 0xFC82, + 0xFEBE, 0xFFFF, 0xFFF0, 0xFFEF, 0xF8D5, 0xFB70, 0xFDC7, 0xFFE0, + 0xFD3E, 0xFFD0, 0xFFD0, 0xFFFE, 0xF6F7, 0xFA42, 0xFCA7, 0xFEE2, + 0xFCA8, 0xFE63, 0xFFFE, 0xFFFE, 0xFC97, 0xF87E, 0xFC0C, 0xFE4C, + 0xFF84, 0xFDCB, 0xFF77, 0xFFE0, 0xFAFC, 0xF7CE, 0xFAF5, 0xFD35, + 0xFEEE, 0xFCC4, 0xFEE4, 0xFFFF, 0xFA52, 0xFC36, 0xF9BD, 0xFC2A, + 0xFE58, 0xFFFE, 0xFE50, 0xFFE1, 0xF8A1, 0xFB95, 0xF894, 0xFB8D, + 0xFDC2, 0xFF68, 0xFDB8, 0xFEF0, 0xF7E3, 0xFAF2, 0xFCC5, 0xFA76, + 0xFCBB, 0xFED7, 0xFFFF, 0xFE5C, 0xF60E, 0xF9D9, 0xFC25, 0xF9CE, + 0xFC24, 0xFE45, 0xFFD3, 0xFE40, 0xF546, 0xF92D, 0xFB88, 0xFDB9, + 0xFB85, 0xFDAD, 0xFFA6, 0xFFFE, 0xF32E, 0xF881, 0xFB69, 0xFD21, + 0xFAE6, 0xFD81, 0xFF1B, 0xFFE2, 0xFAD5, 0xF7C7, 0xFACA, 0xFCEE, + 0xFF03, 0xFCEF, 0xFE8B, 0xFFFF, 0xFA2D, 0xF7B2, 0xFA2B, 0xFCD5, + 0xFE71, 0xFC50, 0xFECE, 0xFFE1, 0xF98C, 0xFC43, 0xF983, 0xFC3B, + 0xFE46, 0xFFD3, 0xFE3E, 0xFFB6, 0xF9DF, 0xFBA6, 0xF9DF, 0xFC0D, + 0xFDB6, 0xFC09, 0xFE0D, 0xFF3D, 0xFFF1, 0xFF88, 0xFFE1, 0xFFFE, + 0xFD89, 0xFB70, 0xFD7E, 0xFF6E, 0xFFFF, 0xFF07, 0xFFFE, 0xFFFE, + 0xFD69, 0xFBBF, 0xFD55, 0xFF43, 0xFFF0, 0xFF3F, 0xFFF1, 0xFB29, + 0xFDA0, 0xFB8E, 0xFD39, 0xFF18, 0xFFC6, 0xFF12, 0xFFC4, 0xFAFB, + 0xFD75, 0xFAF3, 0xFD6F, 0xFEED, 0xFFFE, 0xFF43, 0xF915, 0xFB49, + 0xFD4E, 0xFAC7, 0xFD3E, 0xFF21, 0xFFD3, 0xFF1A, 0xF8E3, 0xFB89, + 0xFD1F, 0xFB86, 0xFD16, 0xFEF6, 0xFFFF, 0xF539, 0xF8BA, 0xFB5D, + 0xFCFF, 0xFB55, 0xFD52, 0xFF29, 0xFFD4, 0xF509, 0xF90E, 0xFB32, + 0xFD38, 0xFB95, 0xFD8A, 0xFF00, 0xF8E7, 0xF5FA, 0xF958, 0xFB83, + 0xFD74, 0xFB67, 0xFD5B, 0xFF8E, 0xF9B2, 0xF6E1, 0xF93A, 0xFC21, + 0xFDAE, 0xFBB3, 0xFD92, 0xF6BE, 0xF9F7, 0xF6B1, 0xFA62, 0xFC5E, + 0xFDD3, 0xFBF1, 0xFE2F, 0xF799, 0xFA3B, 0xF80B, 0xFAA0, 0xFC98, + 0xFE06, 0xFC2B, 0xF45C, 0xF7E2, 0xFA79, 0xF84C, 0xFADC, 0xFCD4, + 0xFEA1, 0xFCBD, 0xF5D2, 0xF8A1, 0xFB25, 0xF906, 0xFB88, 0xFD01, + 0xFE76, 0xF969, 0xF627, 0xF8F3, 0xFBC9, 0xF951, 0xFBC4, 0xFD9A, + 0xFF56, 0xF9B0, 0xF700, 0xF9A9, 0xFC05, 0xF9FD, 0xFBFE, 0xFDCE, + 0xF7C8, 0xFA60, 0xFCA5, 0xFA46, 0xFC3D, 0xFE0E, 0xF88E, 0xFAA3, + 0xF8F6, 0xFAF3, 0xFCD3, 0xFB56, 0xFD30, 0xF61A, 0xF943, 0xF68D, + 0xF9AA, 0xFB98, 0xFD6C, 0xFB92, 0xFD53, 0xF6F0, 0xF9F1, 0xF7CD, + 0xF9E5, 0xFC25, 0xFDF4, 0xFC85, 0xF568, 0xF886, 0xFAF0, 0xF8F4, + 0xFAED, 0xFCC4, 0xFE73, 0xF2A2, 0xF6AD, 0xF93D, 0xFB30, 0xF933, + 0xFBE7, 0xFD4A, 0xFBDA, 0xF496, 0xF7D2, 0xFA44, 0xFC21, 0xFAA5, + 0xFC73, 0xFDD3, 0xF8FC, 0xF663, 0xF8F7, 0xFAEC, 0xF949, 0xFB3A, + 0xFD5C, 0xF72F, 0xF99D, 0xF715, 0xF9FC, 0xFBCF, 0xF9F6, 0xFC28, + 0xF528, 0xF8B4, 0xF61C, 0xF843, 0xFAF9, 0xFCBE, 0xFAF4, 0xFCB2, + 0xF672, 0xF9C1, 0xF7B6, 0xF94A, 0xFB8B, 0xFD46, 0xFC3A, 0xF561, + 0xF7FF, 0xFAB8, 0xF8CA, 0xFB09, 0xFCC9, 0xFE6E, 0xF353, 0xF700, + 0xF96A, 0xFB4E, 0xF9CD, 0xFB9A, 0xFD4B, 0xFEDF, 0xF594, 0xF884, + 0xFACE, 0xFC8C, 0xFB1E, 0xFCD5, 0xFE22, 0xF992, 0xF730, 0xF98E, + 0xFBB3, 0xF9E2, 0xFBA6, 0xFDAB, 0xF84B, 0xFA29, 0xF905, 0xFAE1, + 0xFCE6, 0xFB2B, 0xFC83, 0xFE74, 0xF9A9, 0xF7B5, 0xFA63, 0xFBBC, + 0xFDBC, 0xFC09, 0xFDA1, 0xF860, 0xFAF6, 0xF91E, 0xFB46, 0xFC9A, + 0xF77B, 0xFA26, 0xFB89, 0xFA76, 0xFBD5, 0xFD70, 0xF893, 0xF6F1, + 0xF8E5, 0xFB0B, 0xF936, 0xFB59, 0xFCFD, 0xF80A, 0xF590, 0xF865, + 0xFA8A, 0xFC95, 0xFADB, 0xFC30, 0xF782, 0xF905, 0xF70C, 0xF9BD, + 0xFB6C, 0xFA0D, 0xF298, 0xF628, 0xF8E6, 0xF685, 0xF937, 0xFAF1, + 0xFC97, 0xF1F9, 0xF59F, 0xF868, 0xF66B, 0xF8B8, 0xFA77, 0xFC1B, + 0xEFB1, 0xF42C, 0xF7E1, 0xF9A9, 0xF7D7, 0xFA5A, 0xFC05, 0xF630, + 0xF391, 0xF68A, 0xF990, 0xF754, 0xF9DE, 0xFB8A, 0xF5A8, 0xF28C, + 0xF678, 0xF853, 0xFAC8, 0xF962, 0xFB16, 0xF516, 0xF77C, 0xF5E4, + 0xF837, 0xFA4C, 0xF8E4, 0xFA9A, 0xF502, 0xF75D, 0xF55F, 0xF7B8, + 0xF9D0, 0xFBC8, 0xFA1E, 0xF38C, 0xF6D6, 0xF904, 0xF731, 0xF956, + 0xFB54, 0xF9A4, 0xF2F1, 0xF651, 0xF8E7, 0xF6AC, 0xF936, 0xFAD8, + 0xF9DA, 0xF2DF, 0xF5CA, 0xF86D, 0xF6ED, 0xF914, 0xFB0E, 0xFC4B, + 0xF244, 0xF5AD, 0xF7E8, 0xF9FA, 0xF88E, 0xFA95, 0xFC28, 0xF7D2, + 0xF520, 0xF82B, 0xF9D1, 0xF879, 0xFA1D, 0xF434, 0xF752, 0xF56B, + 0xF7A8, 0xFA0F, 0xFB9D, 0xFA59, 0xF486, 0xF6CF, 0xF943, 0xF77A, + 0xF993, 0xFB27, 0xFA2D, 0xF3F6, 0xF70F, 0xF8C4, 0xF768, 0xF969, + 0xF80B, 0xF9B5, 0xF860, 0xFA54, 0xFBDB, 0xF73C, 0xF557, 0xF78D, + 0xF9EC, 0xF838, 0xF9DA, 0xFBB8, 0xF77F, 0xF53F, 0xF7CB, 0xF9CA, + 0xF871, 0xFA60, 0xFBEE, 0xF6FC, 0xF517, 0xF7A2, 0xF99B, 0xF84F, + 0xFA3F, 0xF4A5, 0xF794, 0xF560, 0xF7E4, 0xF9D9, 0xF885, 0xFA10, + 0xF47B, 0xF715, 0xF536, 0xF7B8, 0xF9B1, 0xF860, 0xF1E9, 0xF4C0, + 0xF7A7, 0xF57B, 0xF793, 0xF98A, 0xF83A, 0xF152, 0xF567, 0xF783, + 0xF615, 0xF824, 0xFA10, 0xF484, 0xF213, 0xF53D, 0xF759, 0xF5EB, + 0xF7FD, 0xFA39, 0xF4C7, 0xF265, 0xF582, 0xF7ED, 0xF62E, 0xF890, + 0xF16C, 0xF49F, 0xF319, 0xF5B4, 0xF7C5, 0xF666, 0xF8BB, 0xF220, + 0xF544, 0xF2E9, 0xF652, 0xF851, 0xF6FE, 0xF88E, 0xF2D7, 0xF57C, + 0xF398, 0xF628, 0xF880, 0xF727, 0xEEBF, 0xF386, 0xF614, 0xF442, + 0xF713, 0xF8AF, 0xF6FE, 0xEF96, 0xF3BE, 0xF64A, 0xF475, 0xF6F0, + 0xF8D8, 0xF3AC, 0xF0CF, 0xF463, 0xF735, 0xF57A, 0xF71F, 0xF90C, + 0xF384, 0xF188, 0xF49B, 0xF760, 0xF5A5, 0xF7AF, 0xF174, 0xF487, + 0xF29E, 0xF592, 0xF78C, 0xF5E6, 0xF880, 0xF28C, 0xF4BF, 0xF2DB, + 0xF5C7, 0xF810, 0xF9DF, 0xF8F8, 0xF2C9, 0xF60D, 0xF3E4, 0xF652, + 0xF83B, 0xF74D, 0xF925, 0xFA8F, 0xF95C, 0xF47C, 0xF6E6, 0xF8B7, + 0xF7C9, 0xF99A, 0xFAFE, 0xF283, 0xF570, 0xF762, 0xF60B, 0xF845, + 0xF9C1, 0xFB6B, 0xF3EF, 0xF64C, 0xF7E1, 0xF692, 0xF8C1, 0xFA2A, + 0xF594, 0xF47A, 0xF6D3, 0xF85F, 0xF710, 0xF93B, 0xF413, 0xF228, + 0xF50E, 0xF750, 0xF91A, 0xF7E0, 0xF280, 0xF54D, 0xF326, 0xF5E8, + 0xF7D2, 0xF63D, 0xF8AA, 0xF372, 0xF5D6, 0xF3C7, 0xF6C2, 0xF83D, + 0xF6FC, 0xF176, 0xF462, 0xF65D, 0xF4B7, 0xF743, 0xF954, 0xEEE5, + 0xF275, 0xF543, 0xF38F, 0xF5D8, 0xF7C1, 0xF2C1, 0xEFFC, 0xF367, + 0xF621, 0xF474, 0xF701, 0xF8C7, 0xF40F, 0xF185, 0xF4AB, 0xF690, + 0xF548, 0xF734, 0xF1C6, 0xF49D, 0xF2DE, 0xF58B, 0xF7B3, 0xF675, + 0xEF46, 0xF377, 0xF1A2, 0xF414, 0xF612, 0xF4C3, 0xEC77, 0xF11E, + 0xF45E, 0xF29D, 0xF553, 0xF726, 0xF63B, 0xEF7B, 0xF2DC, 0xF52E, + 0xF38B, 0xF5D6, 0xF82E, 0xED3A, 0xF0F7, 0xF420, 0xF65B, 0xF50E, + 0xF6E6, 0xF192, 0xEF3E, 0xF241, 0xF547, 0xF351, 0xF5D9, 0xEF30, + 0xF2E7, 0xF112, 0xF3E5, 0xF5C8, 0xF4D6, 0xF6AB, 0xF153, 0xF473, + 0xF25C, 0xF560, 0xF6DD, 0xF5F0, 0xEFC1, 0xF2A9, 0xF13A, 0xF3A2, + 0xF29F, 0xF067, 0xF39B, 0xF573, 0xF435, 0xF6A8, 0xF809, 0xEE5A, + 0xF1C5, 0xF4BF, 0xF2CC, 0xF554, 0xF766, 0xF25E, 0xF08F, 0xF35A, + 0xF5DF, 0xF3FA, 0xF66A, 0xF0CE, 0xF3F1, 0xF234, 0xF488, 0xF69B, + 0xF5B1, 0xF001, 0xF26E, 0xF111, 0xF41C, 0xF63A, 0xF4B1, 0xED88, + 0xF1B1, 0xF44E, 0xF2AF, 0xF4E3, 0xF6F4, 0xEBA2, 0xF029, 0xF344, + 0xF139, 0xF3DB, 0xF68D, 0xF0CD, 0xEE7A, 0xF1D2, 0xF4AC, 0xF373, + 0xF53D, 0xEF20, 0xF2B4, 0xF0FB, 0xF3A5, 0xF5C8, 0xF441, 0xEE53, + 0xF19C, 0xEF70, 0xF294, 0xF55E, 0xF3CF, 0xEC26, 0xF012, 0xF36D, + 0xF224, 0xF40B, 0xF65F, 0xF534, 0xEF36, 0xF25E, 0xF0AD, 0xF347, + 0xF56A, 0xF434, 0xEDF8, 0xF144, 0xF427, 0xF28E, 0xF502, 0xF6B3, + 0xEBCD, 0xF0D3, 0xF31E, 0xF17C, 0xF3FE, 0xF652, 0xF110, 0xEF4B, + 0xF2B0, 0xF4CA, 0xF2F1, 0xF55B, 0xEFEF, 0xF2E8, 0xF140, 0xF420, + 0xF61A, 0xF4F3, 0xEF73, 0xF278, 0xF12D, 0xF3B0, 0xF523, 0xF3F1, + 0xEDD9, 0xF16A, 0xF3E8, 0xF2AB, 0xF4BB, 0xF6B1, 0xEC90, 0xF0F3, + 0xF37C, 0xF23A, 0xF453, 0xF64B, 0xF18E, 0xEFCF, 0xF275, 0xF484, + 0xF3A9, 0xF5A8, 0xF11D, 0xF348, 0xF206, 0xF473, 0xF618, 0xF544, + 0xF414, 0xF60A, 0xF4E5, 0xEF94, 0xF22F, 0xF0E3, 0xF3AE, 0xF5AB, + 0xF47F, 0xEF7F, 0xF1C1, 0xF06F, 0xF2FB, 0xF547, 0xF3D7, 0xEE4C, + 0xF1B0, 0xF3CC, 0xF28F, 0xF4DF, 0xF36D, 0xEDD4, 0xF098, 0xF35F, + 0xF226, 0xF439, 0xF61A, 0xEC98, 0xF024, 0xF2F9, 0xF16C, 0xF3D3, + 0xEE05, 0xF10B, 0xF00D, 0xF28A, 0xF443, 0xF365, 0xED89, 0xF0F6, + 0xEF9E, 0xF27A, 0xF433, 0xF354, 0xED0A, 0xF087, 0xEE7A, 0xF16A, + 0xF3C9, 0xF2E6, 0xEBC7, 0xF00E, 0xF286, 0xF0FB, 0xF360, 0xF27F, + 0xEBB2, 0xEF55, 0xF276, 0xF0E9, 0xF350, 0xF536, 0xEB31, 0xEEDD, + 0xF209, 0xF075, 0xF2E1, 0xECA8, 0xF06E, 0xEE67, 0xF19C, 0xF3F0, + 0xF313, 0xEC2D, 0xF001, 0xEE50, 0xF188, 0xF38C, 0xF2AD, 0xEC18, + 0xEF8B, 0xEDD8, 0xF11F, 0xF324, 0xF240, 0xEB99, 0xEF77, 0xF239, + 0xF0B0, 0xF34F, 0xF22C, 0xEB82, 0xEF07, 0xF1CC, 0xF09B, 0xF2EB, + 0xED46, 0xEAF9, 0xEEF0, 0xF1B6, 0xF0CD, 0xF2D2, 0xED83, 0xF067, + 0xEF2D, 0xF151, 0xF38C, 0xF2AE, 0xED04, 0xF057, 0xEEB7, 0xF183, + 0xF3BB, 0xF2A0, 0xECEF, 0xF08B, 0xEE41, 0xF1B3, 0xF357, 0xF233, + 0xEC7B, 0xF01E, 0xF26C, 0xF148, 0xF385, 0xF265, 0xECB8, 0xEFAA, + 0xEE67, 0xF178, 0xF31C, 0xF295, 0xF46C, 0xF62D, 0xEEA0, 0xF10D, + 0xF34C, 0xF229, 0xF408, 0xF5C9, 0xEE30, 0xF13D, 0xF328, 0xF258, + 0xF436, 0xEFAC, 0xEE62, 0xF16F, 0xF358, 0xF236, 0xF414, 0xEFDE, + 0xEE9F, 0xF104, 0xF382, 0xF266, 0xECE6, 0xF010, 0xEED4, 0xF134, + 0xF360, 0xF296, 0xECD1, 0xF043, 0xEF0C, 0xF165, 0xF389, 0xEF03, + 0xED0E, 0xF07B, 0xF269, 0xF142, 0xF365, 0xEEDA, 0xED4B, 0xF051, + 0xF2D9, 0xF172, 0xF395, 0xEF17, 0xEDCF, 0xF089, 0xF2B7, 0xF1EB, + 0xEC6E, 0xEF47, 0xEE0A, 0xF0BB, 0xF2E3, 0xF1C9, 0xECA9, 0xEFC5, + 0xEE3C, 0xF12E, 0xF34F, 0xE889, 0xEC8B, 0xEFFB, 0xEEC0, 0xF108, + 0xF32D, 0xE8DC, 0xED75, 0xF074, 0xEEF9, 0xF138, 0xEB5E, 0xE9E7, + 0xED4A, 0xF052, 0xEF72, 0xF1AE, 0xECA3, 0xEA2D, 0xEE32, 0xF082, + 0xEF52, 0xF18C, 0xEC28, 0xEF8E, 0xEEAC, 0xF0F7, 0xEFC9, 0xE942, + 0xED62, 0xF00B, 0xEF2D, 0xF115, 0xF040, 0xE9E5, 0xEDE4, 0xF082, + 0xEF0D, 0xF18A, 0xEC92, 0xEA2B, 0xEE66, 0xF0F3, 0xEF84, 0xF1F6, + 0xED1F, 0xEB79, 0xEE46, 0xF0CD, 0xEFF9, 0xE940, 0xEDA1, 0xEC04, + 0xEEC6, 0xF188, 0xF070, 0xEA9E, 0xEE21, 0xEC91, 0xEF84, 0xF1F4, + 0xF095, 0xF2A1, 0xE96C, 0xED63, 0xEFF9, 0xEE88, 0xF148, 0xEC0A, + 0xEA5D, 0xEDE3, 0xF020, 0xEF47, 0xF126, 0xEC95, 0xEAF3, 0xEEAA, + 0xF0D6, 0xEFC4, 0xE97F, 0xED67, 0xEC82, 0xEED1, 0xF18B, 0xF07A, + 0xEB22, 0xEE33, 0xEC59, 0xEF8C, 0xF1A7, 0xE6A8, 0xEBAD, 0xEEF1, + 0xED29, 0xF045, 0xF256, 0xE87C, 0xEC86, 0xEF16, 0xEDF9, 0xF06A, + 0xEB28, 0xE974, 0xED9B, 0xEFD2, 0xEF03, 0xE8B6, 0xEC01, 0xEB15, + 0xEE60, 0xF0CF, 0xEFBD, 0xE9A3, 0xED1F, 0xEBEE, 0xEE85, 0xF0EB, + 0xE5D1, 0xEA90, 0xEDED, 0xED0C, 0xEF8D, 0xF15E, 0xE7B7, 0xEBB9, + 0xEEF5, 0xED31, 0xEFA9, 0xEB0D, 0xE906, 0xEC8C, 0xEF57, 0xEE3A, + 0xF0E3, 0xEC34, 0xEA41, 0xEDE6, 0xF053, 0xEF41, 0xE98E, 0xEC5B, + 0xEB71, 0xEE0D, 0xF0B2, 0xEFAB, 0xEABE, 0xEDBA, 0xEC8D, 0xEF58, + 0xF114, 0xE79B, 0xEBE3, 0xEEC0, 0xED9C, 0xEFB7, 0xEA90, 0xE93F, + 0xEC56, 0xEF22, 0xEE06, 0xF0AE, 0xEBB7, 0xEA78, 0xEDB5, 0xEFD8, + 0xEF4F, 0xEA13, 0xED14, 0xEBE9, 0xEE31, 0xF101, 0xEFF3, 0xEA91, + 0xEDCC, 0xECA4, 0xEFA5, 0xF19A, 0xE88D, 0xEC02, 0xEF15, 0xEDFC, + 0xF04D, 0xF231, 0xEA1B, 0xEDA2, 0xEFB7, 0xEEA9, 0xF0E7, 0xEC1B, + 0xEF64, 0xF15C, 0xECEB, 0xEBBF, 0xEED0, 0xEDB9, 0xF00B, 0xEB19, + 0xEDF7, 0xED68, 0xEFBE, 0xEEA8, 0xE92B, 0xECC9, 0xEB9C, 0xEE13, + 0xF09B, 0xE5F0, 0xE9F7, 0xEDC2, 0xEC56, 0xEF01, 0xF13A, 0xE7F9, + 0xEBFC, 0xEEB0, 0xED54, 0xEFE6, 0xEBA5, 0xEA26, 0xECFE, 0xEF98, + 0xEE5A, 0xE9C3, 0xECA9, 0xEB31, 0xEDF7, 0xED71, 0xE649, 0xEAD7, + 0xE8FD, 0xECD9, 0xEF26, 0xEEAB, 0xE89A, 0xEBF6, 0xEB5A, 0xEE13, + 0xF009, 0xE625, 0xEAFE, 0xED7C, 0xECA1, 0xEEB9, 0xEA0B, 0xE915, + 0xEC52, 0xEE68, 0xEDDC, 0xE813, 0xEBFA, 0xEA34, 0xED8A, 0xEC24, + 0xE467, 0xE9D6, 0xE83C, 0xEBD5, 0xEE76, 0xED65, 0xE786, 0xEB7B, + 0xE9C0, 0xED16, 0xEF4E, 0xE503, 0xE952, 0xED08, 0xEB61, 0xEE85, + 0xE8F5, 0xE760, 0xEAFE, 0xEDF2, 0xECDF, 0xE698, 0xEAA2, 0xEA13, + 0xECCF, 0xEBBD, 0xEE93, 0xE96E, 0xE7D2, 0xEB68, 0xEE02, 0xECB9, + 0xE773, 0xEACA, 0xE9E1, 0xEC99, 0xEF19, 0xE4F4, 0xE9D5, 0xEC8D, + 0xEBC4, 0xEE10, 0xE974, 0xE73B, 0xEB26, 0xEDC1, 0xECAC, 0xEF68, + 0xEAD0, 0xE99D, 0xEC9D, 0xEBDA, 0xEE1F, 0xE98F, 0xE7BF, 0xEB82, + 0xEDCF, 0xED03, 0xE760, 0xEB2A, 0xE9B8, 0xECF7, 0xEF27, 0xE5F4, + 0xE2FA, 0xE8CE, 0xEBDC, 0xEA32, 0xED9A, 0xEC91, 0xE61D, 0xEA14, + 0xE989, 0xEC44, 0xEEB3, 0xE402, 0xE933, 0xEBEC, 0xEACF, 0xEDAC, + 0xE8D4, 0xE6AA, 0xEAC3, 0xED56, 0xEC54, 0xE68C, 0xEAF6, 0xE9E2, + 0xEC34, 0xEBB4, 0xE580, 0xE939, 0xE76D, 0xEBA8, 0xEDDD, 0xE21D, + 0xE7A2, 0xEB52, 0xE9F4, 0xED15, 0xE7E2, 0xE6AA, 0xE99E, 0xECC1, + 0xEBB9, 0xE642, 0xE9CA, 0xE941, 0xEBA1, 0xEB1A, 0xED54, 0xE8E2, + 0xE76D, 0xEB0E, 0xED87, 0xEC89, 0xE70C, 0xEAB8, 0xE9A4, 0xEC7B, + 0xEB74, 0xE5A8, 0xE947, 0xE811, 0xEB23, 0xEDCD, 0xE3E8, 0xE8A2, + 0xEBD6, 0xEACA, 0xED02, 0xE890, 0xE70F, 0xEA74, 0xECF4, 0xEBF6, + 0xE6B2, 0xEA20, 0xE907, 0xEC1E, 0xEB5A, 0xE4FD, 0xE97B, 0xE8A1, + 0xEB4E, 0xED7B, 0xE3EC, 0xE84D, 0xEB42, 0xEA32, 0xED25, 0xEEF6, + 0xE6BC, 0xEA14, 0xECDA, 0xEC1D, 0xEDFE, 0xEA8F, 0xE981, 0xEBC8, + 0xEB0A, 0xEDAA, 0xE924, 0xE855, 0xEB73, 0xED5D, 0xECE1, 0xE7F8, + 0xEB67, 0xEAA3, 0xED0B, 0xEC8D, 0xE794, 0xEA4D, 0xECFD, 0xEC42, + 0xEE8B, 0xEAC1, 0xE9F2, 0xEBF3, 0xEB31, 0xED8E, 0xE99E, 0xE8D1, + 0xEB9A, 0xEDEE, 0xED3A, 0xE879, 0xEB8E, 0xEACA, 0xED2E, 0xEC73, + 0xEBB8, 0xEB3A, 0xED4D, 0xE37F, 0xE80F, 0xEAE6, 0xEA24, 0xEC8F, + 0xE88A, 0xE7B0, 0xEA94, 0xE903, 0xEC39, 0xE759, 0xE678, 0xE9BD, + 0xEC29, 0xEB6D, 0xE616, 0xEA2F, 0xE89C, 0xEBD4, 0xEA9D, 0xE5B4, + 0xE910, 0xE83A, 0xEB0F, 0xED1E, 0xE463, 0xE7E8, 0xEB33, 0xE9F9, + 0xE3FF, 0xE8A9, 0xE7D5, 0xEA63, 0xE99E, 0xE396, 0xE77A, 0xE69F, + 0xE994, 0xE8C9, 0xE22A, 0xE71D, 0xE55E, 0xE939, 0xEB6A, 0xE044, + 0xE631, 0xE9AB, 0xE85B, 0xEB57, 0xE6B5, 0xE4EB, 0xE8D4, 0xE802, + 0xEA89, 0xE576, 0xE489, 0xE87B, 0xEAB3, 0xEA37, 0xE47F, 0xE820, + 0xE79D, 0xEAA0, 0xE964, 0xE416, 0xE80F, 0xE669, 0xE9D4, 0xEC23, + 0xE2B7, 0xE6E2, 0xE658, 0xE97B, 0xEC10, 0xE146, 0xE6D1, 0xE9E9, + 0xE8A6, 0xEB4D, 0xE74A, 0xE59D, 0xE916, 0xE84D, 0xEAFB, 0xE665, + 0xE58C, 0xE8BD, 0xEB62, 0xEAA2, 0xE60C, 0xE92D, 0xE7E1, 0xEB0E, + 0xE687, 0xE519, 0xE8D4, 0xE78A, 0xEA46, 0xE59B, 0xE4B9, 0xE801, + 0xEB1F, 0xE9ED, 0xE53B, 0xE871, 0xE7A6, 0xEA5D, 0xE9DC, 0xE448, + 0xE81A, 0xE712, 0xEA04, 0xE90E, 0xE3E8, 0xE807, 0xE6B6, 0xE9F1, + 0xEBF5, 0xE2E5, 0xE72D, 0xEA1B, 0xE929, 0xEBA4, 0xE823, 0xE6D2, + 0xE575, 0xE8D0, 0xE851, 0xEAA9, 0xEA30, 0xE564, 0xE8BF, 0xE83E, + 0xEA58, 0xECC1, 0xE4FB, 0xE868, 0xE766, 0xEA47, 0xEC71, 0xE40A, + 0xE855, 0xEA6F, 0xE9F7, 0xE56A, 0xE87F, 0xE77D, 0xEA1F, 0xE9A0, + 0xE482, 0xE828, 0xE726, 0xEA0E, 0xE98D, 0xE41B, 0xE815, 0xE715, + 0xE9B5, 0xE93F, 0xE40C, 0xE7C0, 0xE6BE, 0xE9A4, 0xE51D, 0xE3AE, + 0xE7AD, 0xEA44, 0xE956, 0xE42E, 0xE39D, 0xE6D7, 0xE9EE, 0xE8FF, + 0xE4AE, 0xE7CD, 0xE745, 0xE99F, 0xE964, 0xE3BF, 0xE76F, 0xE6F0, + 0xE98C, 0xE4D0, 0xE3B0, 0xE763, 0xE6DF, 0xE937, 0xE472, 0xE349, + 0xE707, 0xE681, 0xE92B, 0xE45B, 0xE33A, 0xE6B2, 0xE9C4, 0xE94E, + 0xE3FC, 0xE2D5, 0xE720, 0xE976, 0xDE33, 0xE3ED, 0xE7C9, 0xE6CB, + 0xE997, 0xE57E, 0xE46D, 0xE774, 0xE6BA, 0xE984, 0xE526, 0xE408, + 0xE763, 0xE65C, 0xE932, 0xE515, 0xE3F7, 0xE70E, 0xE6CC, 0xE005, + 0xE4B9, 0xE39B, 0xE773, 0xE9EE, 0xDF99, 0xE4A8, 0xE81A, 0xE71E, + 0xE9A2, 0xDF83, 0xE4D4, 0xE7C5, 0xE70D, 0xE9FF, 0xE584, 0xE4C3, + 0xE7ED, 0xE737, 0xE1E3, 0xE5F9, 0xE4ED, 0xE7DC, 0xE758, 0xE180, + 0xE59D, 0xE491, 0xE7FD, 0xE74A, 0xE171, 0xE58C, 0xE508, 0xE7AA, + 0xE2D0, 0xE677, 0xE635, 0xE8C3, 0xE3DD, 0xE350, 0xE666, 0xE5E2, + 0xE8E6, 0xE410, 0xE2ED, 0xE704, 0xE940, 0xDFA6, 0xE43A, 0xE36B, + 0xE6B1, 0xE92D, 0xDF33, 0xE4AF, 0xE756, 0xE6D7, 0xE94E, 0xDFCA, + 0xE4D9, 0xE7F4, 0xE6FC, 0xE139, 0xE587, 0xE47F, 0xE815, 0xE6EB, + 0xE256, 0xE5B1, 0xE4F4, 0xE837, 0xE789, 0xE1F3, 0xE5DB, 0xE59B, + 0xE85E, 0xE340, 0xE271, 0xE5FC, 0xE548, 0xE87F, 0xE373, 0xE331, + 0xE626, 0xE569, 0xE8A0, 0xE3E8, 0xE2D0, 0xE650, 0xE593, 0xDFEC, + 0xE412, 0xE34C, 0xE6BC, 0xE638, 0xE021, 0xE4C0, 0xE378, 0xE6DD, + 0xE217, 0xE0AF, 0xE4EA, 0xE42D, 0xE737, 0xE24A, 0xE176, 0xE514, + 0xE80C, 0xE75F, 0xE276, 0xE236, 0xE5B9, 0xE82B, 0xDDFC, 0xE32B, + 0xE695, 0xE5E1, 0xE84C, 0xDEDE, 0xE35E, 0xE6BF, 0xE60B, 0xE8A6, + 0xE4CE, 0xE40C, 0xE719, 0xE665, 0xE115, 0xE573, 0xE4B8, 0xE738, + 0xE686, 0xE1DC, 0xE59B, 0xE4E2, 0xE792, 0xE6E0, 0xE206, 0xE5C1, + 0xE50A, 0xE7B3, 0xE3C8, 0xE2FD, 0xE61F, 0xE5DF, 0xE80D, 0xE474, + 0xE3B2, 0xE640, 0xE609, 0xE82C, 0xE49A, 0xE3DC, 0xE713, 0xE663, + 0xE17D, 0xE578, 0xE43D, 0xE76B, 0xE975, 0xE1E9, 0xE59B, 0xE4E3, + 0xE427, 0xE367, 0xE6A6, 0xE8BF, 0xE103, 0xE50A, 0xE3C8, 0xE6FD, + 0xE28F, 0xE1C8, 0xE52D, 0xE474, 0xE757, 0xE37D, 0xE2B4, 0xE58E, + 0xE54E, 0xDF17, 0xE3DE, 0xE2E5, 0xE661, 0xE5B1, 0xE075, 0xE408, + 0xE3C8, 0xE6B9, 0xE241, 0xE178, 0xE4E2, 0xE42B, 0xE70A, 0xE32B, + 0xE1A2, 0xE543, 0xE505, 0xDF24, 0xE395, 0xE295, 0xE59D, 0xE566, + 0xE0C0, 0xE3F6, 0xE37F, 0xE66E, 0xE1FA, 0xE0EA, 0xE4D0, 0xE3E2, + 0xE6F6, 0xE2E4, 0xE1E4, 0xE52B, 0xE4BA, 0xDF68, 0xE345, 0xE307, + 0xE602, 0xE54B, 0xE074, 0xE426, 0xE36F, 0xE65A, 0xDAEA, 0xE16E, + 0xE487, 0xE449, 0xE6E2, 0xDCD6, 0xE25F, 0xE58F, 0xE4E1, 0xDFB5, + 0xDED7, 0xE2F7, 0xE5E7, 0xE539, 0xE0B6, 0xDFE1, 0xE3D8, 0xE676, + 0xDCF2, 0xE1E7, 0xE0E2, 0xE470, 0xE6FE, 0xDE13, 0xE248, 0xE20A, + 0xE4CB, 0xE039, 0xDF64, 0xE367, 0xE2AB, 0xE5CE, 0xE171, 0xE065, + 0xE3FF, 0xE38A, 0xDD91, 0xE297, 0xE194, 0xE50E, 0xE422, 0xDF77, + 0xE2F8, 0xE2BA, 0xE594, 0xE0FB, 0xE0B6, 0xE43F, 0xE352, 0xE623, + 0xE221, 0xE1E3, 0xE4D4, 0xE466, 0xDEFA, 0xE33E, 0xE282, 0xE55F, + 0xE4F5, 0xE040, 0xE3D6, 0xE398, 0xE5E9, 0xE267, 0xE16D, 0xE463, + 0xE027, 0xDF14, 0xE2FF, 0xE2CA, 0xE598, 0xE192, 0xE091, 0xE44A, + 0xE360, 0xDE21, 0xE231, 0xE1B5, 0xE4D7, 0xE49E, 0xDF65, 0xE37C, + 0xE28B, 0xE594, 0xDBF8, 0xE0D9, 0xDFD8, 0xE3D4, 0xE61A, 0xDD5C, + 0xE1B6, 0xE141, 0xE466, 0xDFFD, 0xDEEE, 0xE308, 0xE217, 0xDC5B, + 0xE15F, 0xE05E, 0xE39C, 0xE360, 0xDDFB, 0xE23A, 0xE1C0, 0xE460, + 0xE083, 0xDF7D, 0xE2D0, 0xE294, 0xE524, 0xE160, 0xE0ED, 0xE447, + 0xE35F, 0xDE93, 0xDE10, 0xE1C1, 0xE505, 0xDA79, 0xE00A, 0xDFCE, + 0xE346, 0xE5BD, 0xDD1A, 0xE1A8, 0xE0A9, 0xE40A, 0xDF29, 0xDEE6, + 0xE27C, 0xE23E, 0xE4CC, 0xE0CE, 0xE092, 0xE345, 0xE309, 0xDDFE, + 0xE25A, 0xE16D, 0xE43E, 0xE3CB, 0xDFB1, 0xE35C, 0xE2F0, 0xE528, + 0xDC7E, 0xE14D, 0xE41E, 0xE3E9, 0xDF9A, 0xDE51, 0xE256, 0xE50E, + 0xE4D9, 0xE07C, 0xE039, 0xE31F, 0xE2EA, 0xDDA0, 0xE18C, 0xE150, + 0xE416, 0xE3E1, 0xDF5A, 0xE33D, 0xE251, 0xE53B, 0xE1A8, 0xE130, + 0xE432, 0xE34E, 0xDF81, 0xE2A8, 0xE237, 0xE4AF, 0xE445, 0xE096, + 0xE39F, 0xE36C, 0xE594, 0xDE1A, 0xE1A4, 0xE4C4, 0xE45A, 0xE6A9, + 0xDF7D, 0xE381, 0xE268, 0xE576, 0xE1BC, 0xE14A, 0xE3CE, 0xE399, + 0xE32A, 0xE2F5, 0xE552, 0xDD92, 0xE1D9, 0xE0B0, 0xE418, 0xDFFE, + 0xDFC2, 0xE30A, 0xE1F3, 0xDDB9, 0xE146, 0xE0CE, 0xE38E, 0xDA11, + 0xDEE5, 0xE279, 0xE246, 0xE4A9, 0xDC8D, 0xE128, 0xDFF3, 0xE36E, + 0xDF41, 0xDEC2, 0xE25B, 0xE13D, 0xDCB4, 0xE089, 0xE01A, 0xE2DD, + 0xD88F, 0xDE23, 0xDDE0, 0xE18E, 0xE433, 0xDB73, 0xE06D, 0xDF38, + 0xE2F4, 0xDE7F, 0xDE00, 0xE1E1, 0xE1A7, 0xDBE6, 0xE00A, 0xDF94, + 0xE298, 0xE229, 0xDE63, 0xDD19, 0xE10F, 0xE3EC, 0xDBC5, 0xDFEE, + 0xDFB4, 0xE2AF, 0xDDBF, 0xDD7C, 0xE19E, 0xE12F, 0xDB11, 0xDF8D, + 0xDF15, 0xE253, 0xE1E4, 0xDDDF, 0xDD62, 0xE0CC, 0xE05D, 0xDAF7, + 0xDFA4, 0xDF2E, 0xE26A, 0xDE77, 0xDCF3, 0xE152, 0xE0E3, 0xDBA6, + 0xDB1B, 0xDFC4, 0xE210, 0xE1D6, 0xDD99, 0xDD13, 0xE089, 0xE048, + 0xDBC8, 0xDF63, 0xDEED, 0xE254, 0xDE2F, 0xDDB9, 0xE144, 0xE0D5, + 0xDB18, 0xDAD7, 0xDFB8, 0xE22E, 0xE1C6, 0xDE8B, 0xDCCD, 0xE0B0, + 0xE03A, 0xDB84, 0xDF57, 0xDF16, 0xE278, 0xDE23, 0xDDAF, 0xE16B, + 0xE0FC, 0xE38E, 0xDBE9, 0xDFDF, 0xDF6B, 0xE219, 0xDE7F, 0xDE04, + 0xE0D7, 0xE09D, 0xDB7C, 0xDFBA, 0xDF46, 0xE2FE, 0xDE55, 0xDDDF, + 0xDD64, 0xE18B, 0xE11C, 0xE3A3, 0xE33D, 0xDFCC, 0xDF58, 0xE237, + 0xE4D6, 0xDDFA, 0xE0F7, 0xE08A, 0xE377, 0xDFEA, 0xDF7D, 0xE288, + 0xE283, 0xDE90, 0xDE13, 0xE1A9, 0xE13C, 0xDC15, 0xE097, 0xE02A, + 0xE2F0, 0xD9FB, 0xDED5, 0xE1EC, 0xE17F, 0xDD69, 0xDCEE, 0xE038, + 0xDFDB, 0xE2C4, 0xDF60, 0xDF28, 0xE1CE, 0xE196, 0xDE3B, 0xDDC0, + 0xE126, 0xE0B9, 0xDC4F, 0xDFD8, 0xDF6D, 0xE269, 0xDE85, 0xDDD7, + 0xE167, 0xE0FA, 0xDC5F, 0xDBE4, 0xDFAE, 0xDF51, 0xDA16, 0xDED8, + 0xDED3, 0xE13B, 0xD783, 0xDDAC, 0xDCF7, 0xE09A, 0xDBFA, 0xDB7A, + 0xDF50, 0xDEDC, 0xE1BA, 0xDDF6, 0xDD7B, 0xE143, 0xE0DD, 0xDBD2, + 0xDB0F, 0xDF59, 0xDEEE, 0xD935, 0xDE83, 0xDE4B, 0xE14A, 0xD647, + 0xDD59, 0xE01E, 0xE019, 0xDBAB, 0xDAE8, 0xDF68, 0xDEFD, 0xD90E, + 0xDDDD, 0xDD64, 0xE0C0, 0xD5D3, 0xDC05, 0xDBC6, 0xDFAB, 0xDB41, + 0xDB00, 0xDE30, 0xDE2B, 0xE160, 0xDDEE, 0xDD7C, 0xE059, 0xDFE7, + 0xDB94, 0xDB14, 0xDF1A, 0xDF15, 0xD8FB, 0xDE6B, 0xDDBF, 0xE0C8, + 0xD5CB, 0xDC31, 0xDBF0, 0xDFF6, 0xDBA5, 0xDB66, 0xDEE1, 0xDE3E, + 0xD95D, 0xDD9B, 0xDD63, 0xE071, 0xD5EE, 0xDCA6, 0xDBF3, 0xDF91, + 0xDEEC, 0xE234, 0xD981, 0xDE4D, 0xDE48, 0xE0D9, 0xDD2C, 0xDC79, + 0xE06B, 0xDFC8, 0xDB92, 0xDB8D, 0xDEFD, 0xDEF6, 0xD9CE, 0xDE14, + 0xDD6A, 0xE10B, 0xDD03, 0xDCC4, 0xDFA9, 0xDFA4, 0xDB95, 0xDADD, + 0xDF62, 0xDE8C, 0xD9A7, 0xDDB8, 0xDDB3, 0xE0D0, 0xD77A, 0xDCC5, + 0xDC14, 0xDFD6, 0xDB6C, 0xDB2F, 0xDE92, 0xDE6A, 0xD9EB, 0xD8E6, + 0xDE28, 0xDDB6, 0xD79B, 0xDC6B, 0xDC2C, 0xE008, 0xD4E9, 0xDBAB, + 0xDABB, 0xDE9C, 0xD9C4, 0xD987, 0xDDEF, 0xDD1B, 0xD830, 0xDCE0, + 0xDCDB, 0xE007, 0xD562, 0xDAFB, 0xDACC, 0xDECE, 0xDAC9, 0xDA85, + 0xDDB8, 0xDD56, 0xE074, 0xD806, 0xDD14, 0xDCD7, 0xE003, 0xDB8E, + 0xDB89, 0xDF09, 0xDF04, 0xDA8F, 0xD967, 0xDDC9, 0xDD8C, 0xD919, + 0xDD89, 0xDD12, 0xE035, 0xD672, 0xDC03, 0xDBFE, 0xDF36, 0xDA92, + 0xDA2B, 0xDDFD, 0xDDFF, 0xDA1C, 0xDDBB, 0xDDBD, 0xE02E, 0xD7E0, + 0xDC78, 0xDC39, 0xDF35, 0xDB85, 0xDAE6, 0xDEF5, 0xDE23, 0xDA9F, + 0xDA59, 0xDDF1, 0xDDEA, 0xD8AB, 0xDCB1, 0xDCAC, 0xE01F, 0xD696, + 0xDC34, 0xDB23, 0xDF29, 0xDB19, 0xDB14, 0xDE2A, 0xDDED, 0xD974, + 0xD96F, 0xDD42, 0xDCE2, 0xD776, 0xDCA7, 0xDCA2, 0xDF21, 0xD578, + 0xDF1E, 0xDB51, 0xDB4C, 0xDE21, 0xDE1C, 0xD9ED, 0xDDE1, 0xDDDA, + 0xE015, 0xD83C, 0xDCD6, 0xDCD1, 0xDFD5, 0xDBC4, 0xDB8E, 0xDEDF, + 0xDEDA, 0xDB7F, 0xDA33, 0xDDDD, 0xDDDF, 0xDA24, 0xDA1F, 0xDDCE, + 0xDCD6, 0xD8BB, 0xDCCC, 0xDCC7, 0xDF96, 0xD6F7, 0xDBBC, 0xDB7F, + 0xDECC, 0xDB75, 0xDA61, 0xDDD1, 0xDDCF, 0xDA59, 0xDA1C, 0xDD93, + 0xDCCA, 0xD8F2, 0xDCC0, 0xDCBB, 0xDF59, 0xD774, 0xDBB2, 0xDBAD, + 0xDE8F, 0xDB6B, 0xDA96, 0xDE4F, 0xDE4A, 0xDA51, 0xDA4C, 0xDD87, + 0xDD82, 0xD927, 0xD922, 0xDC79, 0xDC7B, 0xD7B4, 0xDC71, 0xDBA3, + 0xD62F, 0xD62A, 0xDB5C, 0xDB5E, 0xD48B, 0xDA86, 0xDA42, 0xDE05, + 0xD274, 0xD95E, 0xD921, 0xDD36, 0xD919, 0xD914, 0xDC67, 0xDC62, + 0xD7EA, 0xD7E5, 0xDB5B, 0xDB56, 0xD664, 0xDB4C, 0xDB47, 0xDDF5, + 0xD4C9, 0xDA32, 0xDA2D, 0xDDB4, 0xD94E, 0xD913, 0xD90E, 0xDCE7, + 0xD904, 0xD81C, 0xDC18, 0xDC13, 0xD7D7, 0xD6A4, 0xDBD3, 0xDB07, + 0xD697, 0xDAFD, 0xDAFA, 0xDE32, 0xD549, 0xDA1D, 0xDA18, 0xDD65, + 0xD9D8, 0xD8FE, 0xDD2C, 0xDC98, 0xD8F1, 0xD8EC, 0xDC5A, 0xDC55, + 0xD7C4, 0xDBC1, 0xDB86, 0xDE78, 0xD68D, 0xDB7E, 0xDAAD, 0xDDB2, + 0xD53F, 0xDAA5, 0xDAA0, 0xDDA5, 0xD3E7, 0xD9C5, 0xD9C0, 0xDCD8, + 0xD8DC, 0xD8A1, 0xDC9A, 0xDC0D, 0xD894, 0xD7AE, 0xDBFE, 0xDBF9, + 0xD7A6, 0xD7A1, 0xDB2C, 0xDB27, 0xD66F, 0xDAE7, 0xDA55, 0xDDAF, + 0xD569, 0xDA46, 0xDA0B, 0xDD1A, 0xD96B, 0xD968, 0xDCDC, 0xDCD7, + 0xD923, 0xD881, 0xDC40, 0xD12B, 0xD837, 0xD839, 0xDBFD, 0xD750, + 0xD74B, 0xDB66, 0xDB63, 0xD73E, 0xD653, 0xDA8F, 0xDA8A, 0xD646, + 0xDA87, 0xDA84, 0xDA49, 0xD503, 0xD9AB, 0xD9A6, 0xDCD9, 0xD3F1, + 0xD961, 0xD8C1, 0xDCCC, 0xD8BE, 0xD8BB, 0xDC35, 0xDC01, 0xD7D4, + 0xD7CF, 0xDB65, 0xD7CE, 0xD7C9, 0xD6E0, 0xDB5A, 0xD6DD, 0xD6D8, + 0xDA88, 0xDA8A, 0xD5E0, 0xD5E2, 0xDA7B, 0xDA76, 0xD4E3, 0xD9E1, + 0xD9A6, 0xDCCE, 0xD4D1, 0xD997, 0xD994, 0xDC8B, 0xD37D, 0xD8F1, + 0xD8B8, 0xDC7E, 0xD8AE, 0xD8A9, 0xDBEB, 0xDBEB, 0xD801, 0xD7C8, + 0xDBA8, 0xD7BE, 0xD719, 0xDB13, 0xDB10, 0xD713, 0xD70E, 0xDB08, + 0xDA76, 0xD61D, 0xD618, 0xDA33, 0xDA2E, 0xD612, 0xDA2B, 0xDA26, + 0xDCD7, 0xD517, 0xDA20, 0xD987, 0xDCCC, 0xD949, 0xD944, 0xDC37, + 0xDC32, 0xD93E, 0xD8A0, 0xDBFD, 0xDBF8, 0xD891, 0xD893, 0xDBE9, + 0xDBEB, 0xDBE6, 0xD7AD, 0xD7A8, 0xDB53, 0xDB4E, 0xD7A2, 0xDB17, + 0xDB12, 0xDB0D, 0xD6F7, 0xDB0A, 0xDB05, 0xDD69, 0xD6A8, 0xDA6D, + 0xDA68, 0xD6A2, 0xD69D, 0xDA2A, 0xDA27, 0xD5AE, 0xDA24, 0xDA1F, + 0xDC96, 0xD5A3, 0xD980, 0xD982, 0xDC89, 0xD4E7, 0xD93F, 0xD93A, + 0xD49D, 0xD937, 0xD932, 0xD92F, 0xD3E1, 0xD925, 0xD927, 0xDBFF, + 0xD3CF, 0xD888, 0xD883, 0xDBF2, 0xD845, 0xD842, 0xD83D, 0xDB5C, + 0xD833, 0xD835, 0xDB54, 0xD2AD, 0xD828, 0xD78C, 0xDB13, 0xD19A, + 0xD786, 0xD746, 0xDB08, 0xD73C, 0xD73E, 0xDACC, 0xDAC7, 0xD731, + 0xD72C, 0xDABF, 0xCF87, 0xD688, 0xD685, 0xDA22, 0xD67B, 0xD63B, + 0xD63F, 0xDA17, 0xD635, 0xD630, 0xD9DB, 0xD9D6, 0xD62A, 0xD625, + 0xD9D0, 0xD57A, 0xD575, 0xD577, 0xD98F, 0xD56F, 0xD52F, 0xD982, + 0xD984, 0xD5CC, 0xD5C7, 0xD975, 0xD972, 0xD517, 0xD514, 0xD936, + 0xD511, 0xD4CC, 0xD92E, 0xD92B, 0xD4C4, 0xD4C1, 0xD91C, 0xD8E5, + 0xD4B4, 0xD4B6, 0xD8DD, 0xD8D8, 0xD46E, 0xD46B, 0xD8D2, 0xD8CD, + 0xD45E, 0xD891, 0xD893, 0xD456, 0xD453, 0xD884, 0xD881, 0xD44D, + 0xD399, 0xD879, 0xD840, 0xD3FB, 0xD838, 0xD83A, 0xDB33, 0xD3F0, + 0xD3EB, 0xD828, 0xD82A, 0xD3E5, 0xD3A0, 0xD877, 0xD879, 0xD39A, + 0xD7DC, 0xD7DE, 0xDB2F, 0xD38A, 0xD832, 0xD82D, 0xD382, 0xD37F, + 0xD820, 0xD7E7, 0xD339, 0xD3E3, 0xD7E1, 0xD7DC, 0xD327, 0xD7D9, + 0xD7D6, 0xDAF1, 0xD38B, 0xD828, 0xD825, 0xD385, 0xD380, 0xD7E4, + 0xD7DF, 0xD373, 0xD370, 0xD7D7, 0xD7D4, 0xD3D7, 0xD82B, 0xD826, + 0xD322, 0xD31F, 0xD7EC, 0xD7E9, 0xD37F, 0xD381, 0xD7DA, 0xD7DC, + 0xD374, 0xD371, 0xD829, 0xD82B, 0xD3D8, 0xD7EF, 0xD7EA, 0xD3CB, + 0xD3C6, 0xD7E4, 0xD839, 0xD428, 0xD37D, 0xD833, 0xD82E, 0xD3E4, + 0xD3DF, 0xD7ED, 0xD3D7, 0xD43F, 0xD841, 0xD83C, 0xD432, 0xD42F, + 0xD88E, 0xD88B, 0xD48F, 0xD48A, 0xD851, 0xD489, 0xD4EA, 0xD4E5, + 0xD89E, 0xD43E, 0xD49F, 0xD891, 0xD85A, 0xD499, 0xD496, 0xD8AC, + 0xD8A7, 0xD4F4, 0xD4F1, 0xD8FB, 0xD54D, 0xD54A, 0xD545, 0xD8B5, + 0xD50B, 0xD506, 0xD907, 0xD904, 0xD55F, 0xD55A, 0xD8CA, 0xCFA3, + 0xD5B3, 0xD5B0, 0xD910, 0xD60C, 0xD609, 0xD56C, 0xD905, 0xD5C8, + 0xD5C5, 0xD91E, 0xD973, 0xD61E, 0xD619, 0xD96B, 0xD156, 0xD672, + 0xD634, 0xD97F, 0xD1BF, 0xD68D, 0xD688, 0xD99A, 0xD6DF, 0xD6DA, + 0xD6D5, 0xD6D7, 0xD9DD, 0xD2E9, 0xD6F0, 0xD6F4, 0xD9F8, 0xD2A0, + 0xD744, 0xD799, 0xD305, 0xD737, 0xD75A, 0xD75C, 0xD3C6, 0xD7AC, + 0xD7A7, 0xD801, 0xD41F, 0xD7A1, 0xD7C2, 0xD3E0, 0xD441, 0xD814, + 0xD80F, 0xD49A, 0xD495, 0xD82D, 0xD4F1, 0xD4F3, 0xD4F0, 0xD875, + 0xD4AF, 0xD510, 0xD50B, 0xD890, 0xD567, 0xD5C1, 0xD8D9, 0xD06D, + 0xD582, 0xD57F, 0xD945, 0xD146, 0xD633, 0xD630, 0xD216, 0xD211, + 0xD64E, 0xD64B, 0xD20B, 0xD233, 0xD6FA, 0xD698, 0xD298, 0xD2FE, + 0xD70E, 0xD361, 0xD35C, 0xD760, 0xD703, 0xD34F, 0xD377, 0xD779, + 0xCD1E, 0xD439, 0xD436, 0xD794, 0xCE16, 0xD454, 0xD456, 0xD7E1, + 0xCF7C, 0xD50C, 0xD564, 0xCFE6, 0xD05A, 0xD527, 0xD586, 0xD134, + 0xD5DB, 0xD5D8, 0xD5A1, 0xD156, 0xD5F6, 0xD650, 0xD224, 0xD21F, + 0xD611, 0xD669, 0xD284, 0xD27F, 0xD6BB, 0xCBEB, 0xD36C, 0xD367, + 0xD72C, 0xD366, 0xD387, 0xD389, 0xD79D, 0xD447, 0xD444, 0xD43F, + 0xCF4C, 0xD462, 0xD4C1, 0xD7D1, 0xCFEA, 0xD4E1, 0xD539, 0xD12B, + 0xD128, 0xD589, 0xD58B, 0xD14D, 0xD1BA, 0xD601, 0xD5FE, 0xD216, + 0xD23E, 0xD679, 0xD308, 0xD367, 0xD300, 0xD6EA, 0xD323, 0xD382, + 0xD3E1, 0xD754, 0xCE73, 0xD406, 0xD45E, 0xD7C5, 0xCFC9, 0xD47C, + 0xD4DB, 0xD05E, 0xD0C9, 0xD4FB, 0xD553, 0xD12C, 0xD0EB, 0xD571, + 0xD223, 0xD21E, 0xD21B, 0xD5E2, 0xD2A7, 0xD304, 0xD306, 0xD6AE, + 0xD329, 0xD388, 0xD6CC, 0xCECC, 0xD408, 0xD460, 0xD78C, 0xCF6A, + 0xD480, 0xD4DD, 0xD040, 0xD03D, 0xD553, 0xD555, 0xD139, 0xD136, + 0xD5C9, 0xCA0E, 0xD224, 0xD226, 0xD5E4, 0xD2AB, 0xD2A8, 0xD2AA, + 0xCDD3, 0xD391, 0xD32A, 0xD3B2, 0xCE6F, 0xD40C, 0xD3D2, 0xD48A, + 0xCFEC, 0xD482, 0xD4FE, 0xD04F, 0xD0E3, 0xD579, 0xD574, 0xD171, + 0xD235, 0xD594, 0xCC23, 0xD2BC, 0xD2B9, 0xD627, 0xCDC4, 0xD339, + 0xD33B, 0xCED8, 0xCF41, 0xD3B4, 0xD437, 0xCFD9, 0xCFD6, 0xD4B0, + 0xD0D3, 0xD0D0, 0xD529, 0xD526, 0xD15C, 0xD182, 0xD568, 0xD5C0, + 0xD269, 0xD2CD, 0xD632, 0xCD3B, 0xD34D, 0xD348, 0xD6C7, 0xCF60, + 0xD3EC, 0xD444, 0xD05F, 0xD05A, 0xD462, 0xD4E3, 0xD0E6, 0xD113, + 0xD557, 0xD172, 0xD261, 0xD25C, 0xD5EA, 0xD2DF, 0xD2DC, 0xD362, + 0xCE4C, 0xD385, 0xD382, 0xD37D, 0xCFE9, 0xD3FB, 0xD47C, 0xD77B, + 0xD077, 0xD4EE, 0xD568, 0xD1F5, 0xD1F0, 0xD586, 0xD583, 0xD270, + 0xD2F6, 0xD291, 0xD616, 0xD689, 0xD395, 0xD397, 0xD6A7, 0xD009, + 0xD48D, 0xD48A, 0xD4B0, 0xD0F7, 0xD527, 0xD522, 0xD20C, 0xD207, + 0xD5B8, 0xD5B5, 0xD2B0, 0xD2AD, 0xD64B, 0xCED9, 0xD3AF, 0xD3AA, + 0xD6D7, 0xD001, 0xD447, 0xD449, 0xD11B, 0xD118, 0xD4DF, 0xD559, + 0xD226, 0xD2AC, 0xD577, 0xCDCD, 0xD2CA, 0xD349, 0xD679, 0xCF01, + 0xD3C2, 0xD3E8, 0xD022, 0xD0B4, 0xD4D7, 0xCAEE, 0xD137, 0xD1BD, + 0xD56F, 0xCCBE, 0xD2C4, 0xD266, 0xCE6D, 0xCF04, 0xD361, 0xD3E0, + 0xCF8E, 0xD020, 0xD3FE, 0xCA3A, 0xD138, 0xD135, 0xD50C, 0xCCC1, + 0xD1DC, 0xD260, 0xCD5E, 0xCE6B, 0xD302, 0xD304, 0xCF8F, 0xCFBC, + 0xD39F, 0xD049, 0xD0D4, 0xD0CF, 0xD4B2, 0xD1E0, 0xD17D, 0xD201, + 0xCD66, 0xD27D, 0xD2A3, 0xD29E, 0xCF2D, 0xCF28, 0xD3C2, 0xD043, + 0xD0CE, 0xD06B, 0xCB80, 0xD17A, 0xD177, 0xD1FB, 0xCD69, 0xD21E, + 0xD2A2, 0xCE99, 0xCF29, 0xD33B, 0xD361, 0xCFE1, 0xD06A, 0xD3FC, + 0xCB8A, 0xD116, 0xD19C, 0xD508, 0xCD6C, 0xD241, 0xD2C0, 0xCE9A, + 0xCEC7, 0xD35E, 0xD37F, 0xCFE2, 0xD06D, 0xD418, 0xCB8F, 0xD117, + 0xD13D, 0xD4D0, 0xCD76, 0xD264, 0xD2E3, 0xCEC6, 0xCF56, 0xD323, + 0xD3A0, 0xD00C, 0xD097, 0xD0BB, 0xD45A, 0xCCDE, 0xD162, 0xD1E4, + 0xCDA2, 0xCE3C, 0xD284, 0xD2AA, 0xCEF4, 0xCF82, 0xD3BE, 0xD031, + 0xD0BA, 0xD0E0, 0xCCE6, 0xCCE8, 0xD185, 0xD209, 0xCE3D, 0xCED2, + 0xD2C9, 0xCF86, 0xCFB1, 0xD03A, 0xD403, 0xCBB1, 0xD166, 0xD105, + 0xCD1E, 0xCDB3, 0xD22F, 0xCE73, 0xCF01, 0xCF8F, 0xD367, 0xC9C2, + 0xD039, 0xD0E6, 0xCC5D, 0xCC5F, 0xD189, 0xD1AF, 0xCDB9, 0xCE75, + 0xD276, 0xCF30, 0xCFB7, 0xCFDD, 0xD3AC, 0xCB25, 0xD10C, 0xD132, + 0xCD2D, 0xCDC7, 0xD1D5, 0xCE80, 0xCEAB, 0xCF32, 0xD336, 0xCA5A, + 0xD00A, 0xD093, 0xCC73, 0xCCA3, 0xD158, 0xD17E, 0xCDF6, 0xCE89, + 0xD29C, 0xCF3B, 0xCFED, 0xD011, 0xCB45, 0xCBE4, 0xD0DD, 0xD15F, + 0xCD41, 0xCE02, 0xD224, 0xCEB6, 0xCEE1, 0xCF68, 0xD303, 0xCAAC, + 0xD0BE, 0xD0E4, 0xCCB5, 0xCD4F, 0xD1A9, 0xD1CD, 0xCEC2, 0xCEE8, + 0xD306, 0xCA8F, 0xD043, 0xD040, 0xCBFD, 0xCCC3, 0xD133, 0xD1AE, + 0xCE3D, 0xCE38, 0xD295, 0xCF18, 0xCF9F, 0xCFC5, 0xD36D, 0xCC0B, + 0xD0B8, 0xD138, 0xCD8F, 0xCE44, 0xD21F, 0xCEFB, 0xCF1F, 0xCFCF, + 0xD2FE, 0xCC1C, 0xD099, 0xD0BD, 0xCD99, 0xCDC4, 0xD224, 0xD248, + 0xD267, 0xCF4F, 0xCFFD, 0xD31E, 0xD344, 0xD0C7, 0xD0ED, 0xD418, + 0xCDCD, 0xD24B, 0xD26F, 0xCF59, 0xCF7D, 0xD2D1, 0xD347, 0xD04E, + 0xD0F0, 0xD41B, 0xCDD7, 0xD1D5, 0xD1FB, 0xCF63, 0xCF89, 0xD2DB, + 0xD371, 0xD07A, 0xD09E, 0xD11E, 0xCD59, 0xCE0C, 0xD1FE, 0xCEE5, + 0xCF93, 0xCFB7, 0xD31F, 0xCC7E, 0xD0A8, 0xD14A, 0xCD8C, 0xCE18, + 0xD22A, 0xC95B, 0xCF13, 0xCFC1, 0xD327, 0xCC8F, 0xD0AB, 0xD0F8, + 0xCD96, 0xCE50, 0xD1DD, 0xC973, 0xCF46, 0xCFED, 0xD2D5, 0xCC07, + 0xD0DE, 0xD0FB, 0xCDA7, 0xCDCD, 0xD202, 0xC9B9, 0xCF77, 0xD020, + 0xCC16, 0xCCD3, 0xD108, 0xD127, 0xCDDA, 0xCE8D, 0xCEB1, 0xCA71, + 0xCF83, 0xCFCE, 0xCC27, 0xCC52, 0xCD36, 0xD153, 0xCE12, 0xCEC0, + 0xCEE4, 0xCB49, 0xCB79, 0xCFFA, 0xCC61, 0xCD17, 0xCD42, 0xD1A6, + 0xC99A, 0xCEF1, 0xCF15, 0xCAC1, 0xCC45, 0xD02B, 0xC619, 0xCD51, + 0xCE29, 0xD154, 0xC9E0, 0xCF24, 0xCF6F, 0xCB99, 0xCC84, 0xD079, + 0xC72B, 0xCDB0, 0xCE5C, 0xCE85, 0xCABD, 0xCF77, 0xCF9B, 0xCC93, + 0xCCB7, 0xCD94, 0xC82C, 0xCDE3, 0xCEB6, 0xCEDF, 0xCAFC, 0xCBE5, + 0xCFEE, 0xCCCB, 0xCD1B, 0xCDCC, 0xC91A, 0xCA19, 0xCEE7, 0xCF32, + 0xCBF9, 0xCCDD, 0xD041, 0xD103, 0xCE02, 0xCE26, 0xCEF9, 0xCB22, + 0xCF68, 0xD006, 0xCC5A, 0xCD37, 0xCD60, 0xD154, 0xCE5C, 0xCF28, + 0xCF4C, 0xCB88, 0xCC45, 0xD07B, 0xC77C, 0xCD96, 0xCDBF, 0xCA57, + 0xCA87, 0xCF7B, 0xCFC6, 0xCC80, 0xCCA4, 0xD0CE, 0xC8A2, 0xCE9D, + 0xCEC1, 0xCAC2, 0xCBB0, 0xCFF5, 0xD019, 0xCD06, 0xCDB5, 0xCE00, + 0xC9E8, 0xCAA8, 0xCF3B, 0xCBE6, 0xCCC8, 0xCCEC, 0xC8A8, 0xC9A0, + 0xCE36, 0xCE81, 0xCB16, 0xCBF8, 0xCFB3, 0xC6D3, 0xCD4E, 0xCE1D, + 0xC9E7, 0xCAD3, 0xCF56, 0xCFA1, 0xCC33, 0xCC83, 0xD0C9, 0xC903, + 0xCDCD, 0xCE9C, 0xCB15, 0xCB65, 0xCC45, 0xC6D9, 0xCD6B, 0xCD94, + 0xCDDF, 0xCA3B, 0xCB27, 0xCF3D, 0xCC57, 0xCCA7, 0xCCF7, 0xC902, + 0xCA24, 0xCE3A, 0xCF26, 0xCB89, 0xCC90, 0xCFD7, 0xC819, 0xCD54, + 0xCE23, 0xCA92, 0xCABB, 0xCF7A, 0xC613, 0xCCF2, 0xCD3B, 0xCD64, + 0xC9BA, 0xCE79, 0xCEC2, 0xCBD9, 0xCC29, 0xCC79, 0xC87C, 0xC977, + 0xCE8C, 0xCEB0, 0xCB0D, 0xCC12, 0xCF83, 0xC867, 0xCD86, 0xCDCF, + 0xCA11, 0xCAF6, 0xCF26, 0xC63C, 0xCCA0, 0xCCC2, 0xD0D7, 0xC9FA, + 0xCE4C, 0xCE95, 0xCB84, 0xCC89, 0xCFE7, 0xC8C3, 0xCD44, 0xCE3A, + 0xCA63, 0xCB72, 0xCF10, 0xC782, 0xCD0B, 0xCD59, 0xCA23, 0xCA78, + 0xCED7, 0xC545, 0xCBF9, 0xCC49, 0xCD42, 0xC94D, 0xCA66, 0xCE1F, + 0xCBC0, 0xCC0E, 0xCC5E, 0xC816, 0xC936, 0xCDEB, 0xC2B3, 0xCAF4, + 0xCC25, 0xCFA4, 0xC82D, 0xCD05, 0xCDF9, 0xC9FA, 0xCB09, 0xCECF, + 0xC6E7, 0xCCA5, 0xCCF5, 0xC990, 0xC9EA, 0xCB1E, 0xCEDF, 0xCBBC, + 0xCC0C, 0xCD03, 0xC8E6, 0xC9FF, 0xCE05, 0xC5B0, 0xCBD1, 0xCC21, + 0xC8A8, 0xC902, 0xCDD1, 0xCE15, 0xCAB9, 0xCBE6, 0xCC2F, 0xC893, + 0xCCF4, 0xCDDF, 0xCA7E, 0xCAFA, 0xCBF6, 0xC785, 0xC7E4, 0xCD02, + 0xC988, 0xCABA, 0xCB0F, 0xCF0A, 0xC7A1, 0xCCC9, 0xCD12, 0xC99D, + 0xCACF, 0xCE12, 0xC658, 0xCBE7, 0xCD03, 0xC95F, 0xC9B2, 0xCDFE, + 0xCE47, 0xCBAE, 0xCBF5, 0xCC6A, 0xC8B7, 0xC9F3, 0xCE33, 0xCAC0, + 0xCBE8, 0xCC31, 0xC872, 0xC8CC, 0xCD36, 0xCE68, 0xCAD0, 0xCC1D, + 0xCF57, 0xC8BA, 0xCD22, 0xCD90, 0xCAC3, 0xCB11, 0xCB84, 0xC87C, + 0xCD0E, 0xCD57, 0xCDC5, 0xCAFD, 0xCB4B, 0xCEE0, 0xC8BD, 0xCD4A, + 0xCDB1, 0xC9E7, 0xCB39, 0xCECC, 0xC78C, 0xCC68, 0xCCDB, 0xD01D, + 0xCA4D, 0xCEB8, 0xCF01, 0xCC5B, 0xCCA2, 0xCD10, 0xCA11, 0xCDE7, + 0xCB01, 0xCC47, 0xCC90, 0xC89C, 0xCD6C, 0xCDD3, 0xCAEF, 0xCB3D, + 0xCBB0, 0xC88A, 0xC909, 0xCDC6, 0xC4D9, 0xCB55, 0xCB9C, 0xCF3C, + 0xC8FC, 0xCCEB, 0xCD59, 0xCB41, 0xCBB4, 0xCBFD, 0xC8EA, 0xC962, + 0xCD45, 0xC519, 0xCBA2, 0xCC0E, 0xC8D6, 0xC955, 0xCD58, 0xC509, + 0xCABD, 0xCB30, 0xC7AE, 0xC830, 0xC9BB, 0xCDB2, 0xCAAB, 0xCB1E, + 0xCB8F, 0xC84A, 0xC8C7, 0xCD03, 0xC578, 0xCB36, 0xCBA2, 0xC838, + 0xC8B5, 0xCCEF, 0xC568, 0xCB22, 0xCBBA, 0xC850, 0xC8CD, 0xC94A, + 0xCD8E, 0xC613, 0xCBCD, 0xCC39, 0xC8BB, 0xC962, 0xCDA1, 0xC601, + 0xCAC5, 0xCB5B, 0xC8D3, 0xC950, 0xC9F2, 0xC620, 0xC6A9, 0xCB73, + 0xC16F, 0xC968, 0xCA05, 0xCD6C, 0xC6C1, 0xCB86, 0xCC1E, 0xC878, + 0xC918, 0xCA90, 0xC6E0, 0xC762, 0xCC2F, 0xC890, 0xC932, 0xC9A8, + 0xC5A4, 0xC77F, 0xCB53, 0xC255, 0xC94A, 0xC9EC, 0xCA87, 0xC679, + 0xCB8B, 0xCC21, 0xC987, 0xC9FD, 0xCA9A, 0xC698, 0xC749, 0xCC59, + 0xC373, 0xCA3A, 0xCAD7, 0xC6E1, 0xC78B, 0xCC8F, 0xC392, 0xC954, + 0xC9F1, 0xC728, 0xC7AA, 0xC84F, 0xCC49, 0xC47D, 0xCA2E, 0xCAC9, + 0xC7EC, 0xC893, 0xCC81, 0xC4CB, 0xCA6B, 0xCB2B, 0xC830, 0xC8D5, + 0xC45E, 0xC519, 0xCACB, 0xCB61, 0xC89C, 0xC93C, 0xCCEA, 0xC567, + 0xCB2D, 0xCBBE, 0xC7A7, 0xC84E, 0xC8EE, 0xC5B5, 0xC66B, 0xCAE4, + 0xC213, 0xC8BA, 0xC955, 0xC62D, 0xC6DC, 0xCB44, 0xC26B, 0xC8F7, + 0xC9BC, 0xC674, 0xC74F, 0xC7F4, 0xCC55, 0xC3C3, 0xCA1C, 0xCADC, + 0xC7BB, 0xC860, 0xCBB4, 0xC445, 0xCAA8, 0xCACA, 0xC827, 0xC8F1, + 0xC93D, 0xC4C2, 0xC57D, 0xCA82, 0xC265, 0xC803, 0xC8CB, 0xC53F, + 0xC622, 0xCB09, 0xC2EC, 0xC899, 0xC95C, 0xCA1C, 0xC693, 0xC767, + 0xCBCE, 0xC496, 0xC9E8, 0xCAA1, 0xC730, 0xC7FD, 0xC8F1, 0xC511, + 0xCA6D, 0xCA20, 0xC7C4, 0xC8B8, 0xC951, 0xC5B8, 0xC6B9, 0xCA96, + 0xC191, 0xC7CA, 0xC8BC, 0xC4DB, 0xC5BE, 0xC6C4, 0xCBED, 0xC383, + 0xC970, 0xCA53, 0xC688, 0xC784, 0xCB64, 0xC432, 0xCA1A, 0xCAAE, + 0xC74B, 0xC83D, 0xC92A, 0xC50B, 0xC613, 0xCA43, 0xC28F, 0xC91B, + 0xC918, 0xC604, 0xC705, 0xCB12, 0xC377, 0xC834, 0xC944, 0xCA25, + 0xC747, 0xC735, 0xCB5E, 0xC5B9, 0xCA16, 0xCACF, 0xC6FC, 0xC816, + 0xCC3F, 0xC4B9, 0xCA2E, 0xCA69, 0xC809, 0xC917, 0xC9B0, 0xC5B7, + 0xC6E0, 0xCB79, 0xC327, 0xC90C, 0xC96A, 0xC6D1, 0xC815, 0xCB42, + 0xC852, 0xCCD0, 0xC6EC, 0xCAC9, 0xCAE1, 0xC868, 0xC99B, 0xCA52, + 0xC704, 0xC744, 0xCC0A, 0xC5A7, 0xC9D1, 0xCA0C, 0xC75F, 0xC897, + 0xC97D, 0xC53E, 0xC62E, 0xCB3F, 0xC453, 0xC8D4, 0xC914, 0xC621, + 0xC790, 0xC87B, 0xC375, 0xC4E4, 0xCA74, 0xC007, 0xC7D2, 0xC835, + 0xC501, 0xC657, 0xC774, 0xCB28, 0xC388, 0xC9A1, 0xC99E, 0xC6C1, + 0xC729, 0xCB16, 0xC53C, 0xC91D, 0xCA7D, 0xC76E, 0xC8C7, 0xC8CB, + 0xC583, 0xC61A, 0xCA70, 0xC414, 0xC845, 0xC9AF, 0xC65D, 0xC7EA, + 0xC7EE, 0xC431, 0xC4FC, 0xC99D, 0xC2B3, 0xC768, 0xC8FF, 0xC544, + 0xC70F, 0xC70C, 0xC2D0, 0xC3D9, 0xC8EF, 0xC16D, 0xC683, 0xC824, + 0xC450, 0xC623, 0xC625, 0xC0C3, 0xC2A2, 0xC83A, 0xC59A, 0xC597, + 0xC76F, 0xC323, 0xC539, 0xC96B, 0xBEA9, 0xC785, 0xC75F, 0xC4A6, + 0xC4A8, 0xC6B4, 0xC1E9, 0xC445, 0xC8BD, 0xBCE6, 0xC6CD, 0xC6A2, + 0xC3AD, 0xC3AF, 0xC5F7, 0xC9C1, 0xC347, 0xC832, 0xC80C, 0xC612, + 0xC5E7, 0xC7DB, 0xC2AE, 0xC537, 0xC93B, 0xC246, 0xC781, 0xC792, + 0xC550, 0xC525, 0xC723, 0xC1A3, 0xC892, 0xC88F, 0xC5D8, 0xC6C4, + 0xC72C, 0xC48B, 0xC460, 0xC994, 0xC08E, 0xC802, 0xC7FF, 0xC56A, + 0xC93F, 0xC1CA, 0xC7A8, 0xC856, 0xC5D5, 0xC5D2, 0xC774, 0xC32B, + 0xC4FA, 0xC8B4, 0xC0E7, 0xC71A, 0xC83D, 0xC544, 0xC519, 0xC6E6, + 0xC28B, 0xC4B4, 0xC869, 0xC035, 0xC68C, 0xC7FA, 0xC47F, 0xC495, + 0xC630, 0xC1B4, 0xC446, 0xC8DC, 0xBF7C, 0xC5FB, 0xC76E, 0xC3E4, + 0xC4A6, 0xC59F, 0xC105, 0xC3AB, 0xC858, 0xBEBE, 0xC563, 0xC6E0, + 0xC344, 0xC534, 0xC509, 0xC024, 0xC2DE, 0xC7CC, 0xBE39, 0xC5B5, + 0xC654, 0xC2A4, 0xC49E, 0xC473, 0xBF72, 0xC239, 0xC743, 0xBE56, + 0xC5C4, 0xC5C1, 0xC1FF, 0xC403, 0xC419, 0xBEB6, 0xC196, 0xC6B7, + 0xBE73, 0xC52E, 0xC5E6, 0xC683, 0xC368, 0xC4FC, 0xC8B1, 0xC11B, + 0xC770, 0xC76D, 0xC4C5, 0xC61D, 0xC5F2, 0xC2C8, 0xC48E, 0xC82F, + 0xC073, 0xC70C, 0xC7FE, 0xC431, 0xC58C, 0xC6B0, 0xC257, 0xC3F8, + 0xC8BB, 0xBFC1, 0xC680, 0xC79A, 0xC521, 0xC523, 0xC64C, 0xC38A, + 0xC387, 0xC834, 0xC17B, 0xC711, 0xC713, 0xC4BA, 0xC5E8, 0xC5BD, + 0xC2F1, 0xC459, 0xC8BE, 0xC100, 0xC6AD, 0xC7A4, 0xC424, 0xC557, + 0xC67B, 0xC280, 0xC3ED, 0xC837, 0xC08A, 0xC649, 0xC740, 0xC4EC, + 0xC4F0, 0xC617, 0xC384, 0xC381, 0xC8C3, 0xC1CF, 0xC6DF, 0xC7A9, + 0xBFD3, 0xBFD0, 0xC6AD, 0xBD32, 0xC44E, 0xC57F, 0xC160, 0xC2DC, + 0xC41C, 0xBF53, 0xC124, 0xC621, 0xBCA5, 0xC3E7, 0xC4F0, 0xC26E, + 0xC26B, 0xC3B0, 0xBED5, 0xC0AE, 0xC6B7, 0xBC18, 0xC4AD, 0xC5B1, + 0xC1FD, 0xC342, 0xC47B, 0xC038, 0xC1C1, 0xC64E, 0xBE16, 0xC54D, + 0xC54A, 0xC2D9, 0xC412, 0xC40F, 0xC17B, 0xC2CA, 0xC6BC, 0xBDCA, + 0xC4E6, 0xC5BD, 0xC268, 0xC3A6, 0xC4AF, 0xC10C, 0xC259, 0xC728, + 0xBF35, 0xC57A, 0xC651, 0xC33F, 0xC44B, 0xC548, 0xC1ED, 0xC308, + 0xC791, 0xC05A, 0xC5ED, 0xC6B8, 0xC3E2, 0xC4E4, 0xC5BB, 0xC2C7, + 0xC3D3, 0xC4B2, 0xC170, 0xC290, 0xC726, 0xBE34, 0xC47D, 0xC559, + 0xC256, 0xC36C, 0xC44D, 0xC101, 0xC221, 0xC6C4, 0xBF61, 0xC518, + 0xC5C5, 0xC300, 0xC40A, 0xC4E6, 0xC1E0, 0xC2CE, 0xC708, 0xC081, + 0xC589, 0xC631, 0xC3A3, 0xC482, 0xC557, 0xC288, 0xC371, 0xC76F, + 0xC138, 0xC5F5, 0xC69D, 0xC446, 0xC4F3, 0xC5C8, 0xC330, 0xC40F, + 0xC7B3, 0xC212, 0xC63E, 0xC7A7, 0xC4B7, 0xC564, 0xC6DA, 0xC3AD, + 0xC485, 0xC88E, 0xC2BA, 0xC74B, 0xC7EB, 0xC5D3, 0xC67B, 0xC71E, + 0xC444, 0xC5A1, 0xC8CD, 0xC335, 0xC791, 0xC82A, 0xC63F, 0xC6E2, + 0xC4B8, 0xC565, 0xC212, 0xC3D6, 0xC753, 0xC0EC, 0xC5E0, 0xC683, + 0xC456, 0xC508, 0xC5D6, 0xC372, 0xC44C, 0xC4F7, 0xC286, 0xC33D, + 0xBF41, 0xC06C, 0xC572, 0xBDF5, 0xC3E8, 0xC495, 0xC21A, 0xC2FC, + 0xC3B3, 0xC121, 0xC210, 0xC661, 0xBEF0, 0xC459, 0xC5AF, 0xC2C2, + 0xC377, 0xC4D7, 0xC1A6, 0xC28B, 0xC41B, 0xC0AB, 0xC19C, 0xC5F8, + 0xBE6D, 0xC49B, 0xC548, 0xC309, 0xC3B9, 0xC46B, 0xC156, 0xC2FA, + 0xBF2F, 0xC02D, 0xC58F, 0xBCD0, 0xBF25, 0xC4D8, 0xBB2E, 0xC293, + 0xC348, 0xC0E0, 0xC1A4, 0xC289, 0xBEE1, 0xC0AB, 0xC521, 0xBD97, + 0xC3C1, 0xC46C, 0xC165, 0xC302, 0xC38F, 0xC06C, 0xC216, 0xC2D0, + 0xBF64, 0xC05D, 0xC55E, 0xBE54, 0xC403, 0xC4AE, 0xC1D7, 0xC349, + 0xC01C, 0xC0E3, 0xC1A2, 0xBE12, 0xBFE7, 0xC4F3, 0xBCBE, 0xC2E2, + 0xC443, 0xC166, 0xC21E, 0xC2D8, 0xBFA3, 0xC131, 0xC1EE, 0xBE98, + 0xC063, 0xC535, 0xBD85, 0xC329, 0xC480, 0xC0F2, 0xC265, 0xC3CB, + 0xC021, 0xC1A3, 0xC5FA, 0xBF20, 0xC41E, 0xC54A, 0xBE10, 0xC36B, + 0xB92E, 0xC21F, 0xC2AC, 0xBFAB, 0xC072, 0xC1EF, 0xBED2, 0xBF9C, + 0xC460, 0xBCAC, 0xC323, 0xC3AB, 0xC0F3, 0xC266, 0xC2F3, 0xC022, + 0xC17E, 0xC236, 0xC36F, 0xBFEF, 0xC16F, 0xC5A1, 0xBF19, 0xC46E, + 0xBC1C, 0xC2AD, 0xC3BB, 0xC075, 0xC1EB, 0xC308, 0xBFA4, 0xC0FE, + 0xC271, 0xBEA0, 0xC034, 0xC488, 0xBDC2, 0xC378, 0xC3FB, 0xC17F, + 0xC2BB, 0xC348, 0xC0B5, 0xC205, 0xC28B, 0xBFE9, 0xC085, 0xBD74, + 0xBE48, 0xC394, 0xBB70, 0xC24F, 0xC302, 0xC06F, 0xC1BA, 0xC245, + 0xBFA0, 0xC03A, 0xC18A, 0xBDD1, 0xBF6B, 0xC455, 0xBCE9, 0xC296, + 0xC3A2, 0xC149, 0xC1DB, 0xC315, 0xBFF1, 0xC13F, 0xBD83, 0xBF1D, + 0xC07A, 0xBC9D, 0xBE4B, 0xC361, 0xBA87, 0xC21E, 0xC2A9, 0xC040, + 0xC0D0, 0xC214, 0xBF71, 0xC0C9, 0xC159, 0xBDCD, 0xBF67, 0xC401, + 0xBCEC, 0xC2EE, 0xC36F, 0xC118, 0xC233, 0xBF28, 0xC055, 0xC19C, + 0xBE56, 0xBFB6, 0xC0DE, 0xBCA0, 0xBEE9, 0xC38C, 0xBBB7, 0xC1ED, + 0xC2FC, 0xC00F, 0xC132, 0xC246, 0xBF42, 0xC098, 0xC4B2, 0xBEA0, + 0xBFD0, 0xC427, 0xBDC9, 0xC319, 0xBA69, 0xC17A, 0xC289, 0xBFBA, + 0xC0E2, 0xC1F9, 0xBEED, 0xC01D, 0xC444, 0xBD7D, 0xBF80, 0xC3B9, + 0xBD71, 0xC224, 0xC32E, 0xC073, 0xC18F, 0xC322, 0xC06C, 0xC183, + 0xC531, 0xBFCD, 0xC3D6, 0xBCFA, 0xBE67, 0xC34B, 0xBC46, 0xC25B, + 0xC2BB, 0xC39A, 0xC474, 0xC22B, 0xC30F, 0xC081, 0xC224, 0xC284, + 0xC075, 0xC191, 0xC512, 0xBFDB, 0xC045, 0xC491, 0xBE7A, 0xC352, + 0xC406, 0xC241, 0xC2C2, 0xC0C2, 0xC1AE, 0xC295, 0xBFFF, 0xC11B, + 0xC207, 0xBF62, 0xC086, 0xC423, 0xBEC0, 0xBFE9, 0xC417, 0xBE20, + 0xC2B4, 0xC391, 0xC13D, 0xC224, 0xBFAF, 0xC0A5, 0xC196, 0xBF14, + 0xC00D, 0xC127, 0xBE49, 0xBF70, 0xC3A9, 0xBD9D, 0xC267, 0xC3A2, + 0xBCF3, 0xC23A, 0xBA05, 0xC0BB, 0xC1A7, 0xBF2A, 0xC025, 0xC13F, + 0xBE8F, 0xBF8D, 0xC0AC, 0xBDEA, 0xBEF0, 0xC334, 0xBD45, 0xC1EF, + 0xBA66, 0xC072, 0xC1BD, 0xB9A5, 0xBFDA, 0xC12F, 0xBE13, 0xBFCE, + 0xC0C2, 0xBD6E, 0xBF38, 0xC02C, 0xBCC4, 0xBE96, 0xC2BC, 0xBC17, + 0xC1D5, 0xBA06, 0xC07C, 0xC147, 0xBEED, 0xBFEB, 0xC0DA, 0xBE52, + 0xBF4E, 0xC042, 0xBDAD, 0xBEB3, 0xC32B, 0xBD0A, 0xBEA9, 0xBA60, + 0xBBBA, 0xC158, 0xB8AF, 0xC001, 0xC151, 0xBE6F, 0xBF6B, 0xC0C0, + 0xBDCF, 0xBF5F, 0xC02D, 0xBD27, 0xBEC4, 0xC2B8, 0xBC7D, 0xC1CF, + 0xB9CD, 0xBBD5, 0xC162, 0xB909, 0xBFE7, 0xC0D6, 0xBE80, 0xBF7C, + 0xC0CF, 0xBDE0, 0xBEE1, 0xC039, 0xBD42, 0xBED5, 0xBAD7, 0xBC9A, + 0xBE3A, 0xC290, 0xBBED, 0xC14D, 0xC289, 0xBFF8, 0xC141, 0xBE96, + 0xBFEC, 0xC0B5, 0xBDF6, 0xBF56, 0xC048, 0xBD53, 0xBEC2, 0xBFB4, + 0xBCB0, 0xBE4D, 0xC279, 0xBCA6, 0xC1B8, 0xB9B8, 0xC068, 0xC12C, + 0xB8F4, 0xBFD7, 0xC0C1, 0xBE07, 0xBF67, 0xC030, 0xBE02, 0xBED3, + 0xBBB5, 0xBD62, 0xBECC, 0xBB38, 0xBD58, 0xC19E, 0xBA88, 0xBCB5, + 0xC192, 0xBA7C, 0xC049, 0xC10B, 0xBE88, 0xBFDC, 0xBD14, 0xBE7C, + 0xBF4D, 0xBC6E, 0xBDE3, 0xBF41, 0xBC67, 0xBDD7, 0xBEAD, 0xBBBF, + 0xBD39, 0xC1D9, 0xBB11, 0xC0B9, 0xB8B1, 0xBF61, 0xC028, 0xB72A, + 0xBEF6, 0xC021, 0xBD8C, 0xBE5D, 0xBF8D, 0xBCEB, 0xBE56, 0xBAC3, + 0xBC73, 0xBE4A, 0xBA3C, 0xBBD0, 0xC0FE, 0xBA37, 0xBBC6, 0xC0F4, + 0xB97F, 0xBFA6, 0xC068, 0xBE71, 0xBF3B, 0xBC96, 0xBDD8, 0xBF34, + 0xBC8C, 0xBD63, 0xBE9B, 0xBBE9, 0xBD5E, 0xBE96, 0xBB40, 0xBCBB, + 0xB922, 0xBAC3, 0xC075, 0xB867, 0xBEC0, 0xBFEB, 0xB7A2, 0xBEB9, + 0xBFDF, 0xBD7C, 0xBEAF, 0xBFD8, 0xBCE0, 0xBE3F, 0xBB87, 0xBCD4, + 0xBDA8, 0xBAE1, 0xBC61, 0xC11B, 0xBA61, 0xBBBB, 0xC091, 0xB9AE, + 0xBF8D, 0xC08A, 0xBE34, 0xBF62, 0xBCF4, 0xBE2F, 0xBF58, 0xBCED, + 0xBE23, 0xBA84, 0xBC75, 0xC104, 0xBA7F, 0xBBD4, 0xC0FD, 0xB9D1, + 0xBFDA, 0xB798, 0xBE48, 0xBFD0, 0xB78C, 0xBE3C, 0xBF41, 0xBD01, + 0xBE37, 0xBED6, 0xBC65, 0xBDA0, 0xBA98, 0xBC5B, 0xBD99, 0xBA93, + 0xBC54, 0xBD8D, 0xB9E5, 0xBBDC, 0xC055, 0xB9DB, 0xBFB2, 0xB7AC, + 0xB9D4, 0xBF49, 0xB65C, 0xBE1B, 0xBF1E, 0xBCDB, 0xBE0F, 0xBF12, + 0xBC68, 0xBD7D, 0xBA79, 0xBBC9, 0xBD71, 0xBA6D, 0xBBC2, 0xBD6C, + 0xBA68, 0xBBB8, 0xC085, 0xBA5C, 0xBBB1, 0xB7C0, 0xBA57, 0xBEFD, + 0xB7B9, 0xBE57, 0xBEF6, 0xB7AF, 0xBDEC, 0xBF4E, 0xBCB3, 0xBDBE, + 0xBAF7, 0xBCA7, 0xBDB2, 0xBAEB, 0xBC0D, 0xBDAD, 0xBA49, 0xBC03, + 0xBDA6, 0xBA3D, 0xBBFC, 0xC091, 0xBA38, 0xBF96, 0xB84B, 0xBA2C, + 0xBF30, 0xB844, 0xBE04, 0xBF02, 0xBCF4, 0xBE61, 0xBF5A, 0xBCED, + 0xBE55, 0xBBA7, 0xBCBF, 0xBDEC, 0xBBA0, 0xBCB3, 0xBDBE, 0xBB2A, + 0xBCAE, 0xC0FC, 0xBAF7, 0xBCA2, 0xB8AA, 0xBAED, 0xBFA2, 0xB919, + 0xBEA2, 0xBF77, 0xB912, 0xBE79, 0xBFCA, 0xBD6C, 0xBECF, 0xBC59, + 0xBDC9, 0xBE66, 0xBBE6, 0xBD5B, 0xBE5C, 0xBBB8, 0xBD2D, 0xBE31, + 0xBC18, 0xBD26, 0xBA87, 0xBC13, 0xC04B, 0xBA13, 0xBF52, 0xC03F, + 0xBE16, 0xBB96, 0xBCE7, 0xC0FE, 0xBBCF, 0xBD42, 0xC0F9, 0xBBC8, + 0xC003, 0xBA34, 0xBF0F, 0xBFFC, 0xBA01, 0xBF03, 0xC02B, 0xBE64, + 0xBEFE, 0xB8C0, 0xBDFB, 0xBF2D, 0xBCF2, 0xBE2F, 0xBF26, 0xBCC4, + 0xBE25, 0xBBAC, 0xBD1F, 0xBE1E, 0xBBA5, 0xBD18, 0xBDF0, 0xBC05, + 0xBCAC, 0xBE4B, 0xBB94, 0xBCE0, 0xBA07, 0xBBCD, 0xBCD9, 0xBA43, + 0xBBC6, 0xBFD4, 0xBAA8, 0xBBBC, 0xB90C, 0xBA32, 0xBF33, 0xB88B, + 0xBE37, 0xBF05, 0xB858, 0xBE2D, 0xB68D, 0xBD27, 0xBE02, 0xB707, + 0xBD22, 0xBE5A, 0xBC14, 0xBCF4, 0xB3C3, 0xBC0F, 0xBD4F, 0xBAF4, + 0xBBDC, 0xBD43, 0xBA80, 0xBC3A, 0xBD77, 0xBABC, 0xBC0E, 0xB922, + 0xBB1A, 0xBC67, 0xB98A, 0xBAAB, 0xBC62, 0xB985, 0xBB4C, 0xB850, + 0xB979, 0xBB47, 0xB7CF, 0xBA29, 0xBE96, 0xB815, 0xBD5E, 0xB5CB, + 0xB880, 0xBDF2, 0xB645, 0xBCB0, 0xBD8B, 0xB6BC, 0xBCE7, 0xB3BF, + 0xBB9F, 0xBCDD, 0xB3B5, 0xBBD1, 0xBD14, 0xBA7C, 0xBBCC, 0xBD0A, + 0xBAB3, 0xBC03, 0xB94F, 0xBAAC, 0xBBF7, 0xB98B, 0xBAE3, 0xBC90, + 0xB986, 0xBADE, 0xB7E1, 0xB9C2, 0xBB15, 0xB84E, 0xBA25, 0xBB73, + 0xB818, 0xB9F2, 0xB68A, 0xB8F5, 0xBA55, 0xB683, 0xB87E, 0xBDF0, + 0xBBD7, 0xBCB5, 0xBA87, 0xBBD2, 0xB920, 0xBB28, 0xBC09, 0xB95C, + 0xBAB9, 0xBC3B, 0xB998, 0xBB53, 0xB89B, 0xBA00, 0xBB27, 0xB81F, + 0xBA37, 0xBB85, 0xB8D2, 0xBA30, 0xB6DC, 0xB8C6, 0xBA67, 0xB797, + 0xB907, 0xBDD2, 0xB78B, 0xB9B0, 0xB5CB, 0xB841, 0xBCF2, 0xB645, + 0xB80D, 0xBD26, 0xB6FE, 0xBC48, 0xB461, 0xB67F, 0xBC7F, 0xB4AA, + 0xBB9C, 0xBD11, 0xB527, 0xBBCE, 0xB244, 0xBAE8, 0xBC05, 0xB3BA, + 0xBB1F, 0xBBFB, 0xBA34, 0xBB1A, 0xB0F4, 0xB9C2, 0xBB4C, 0xB8CA, + 0xBA66, 0xBB83, 0xB906, 0xBA9D, 0xB796, 0xB942, 0xBAD4, 0xB847, + 0xB9E4, 0xBB0B, 0xB881, 0xBA1B, 0xB709, 0xB92A, 0xBA16, 0xB704, + 0xB8B8, 0xBA4D, 0xB7B3, 0xB95F, 0xB5B6, 0xB7F4, 0xB996, 0xB672, + 0xB8A0, 0xB9D0, 0xB72B, 0xB8DA, 0xB59E, 0xB76C, 0xB916, 0xB51C, + 0xB81B, 0xBCCC, 0xB5DD, 0xB857, 0xB436, 0xB696, 0xBC25, 0xB504, + 0xB6DA, 0xBC57, 0xB548, 0xBB7B, 0xB39E, 0xB609, 0xBBAD, 0xB46C, + 0xBACE, 0xBBE4, 0xB532, 0xBB63, 0xB214, 0xBA84, 0xBB9A, 0xB2F4, + 0xBAB6, 0xBBCC, 0xB924, 0xBAEB, 0xB16C, 0xBA04, 0xBB22, 0xB867, + 0xBA3E, 0xBB59, 0xB90C, 0xBA75, 0xB7A8, 0xB948, 0xBAA7, 0xB852, + 0xB9BE, 0xBADC, 0xB314, 0xB9FA, 0xBB13, 0xB365, 0xBA2F, 0xBBDF, + 0xB9AB, 0xBAC9, 0xB18C, 0xB9E0, 0xBB37, 0xB8F6, 0xBA17, 0xBB6C, + 0xB92B, 0xBA4E, 0xB788, 0xB967, 0xBABF, 0xB873, 0xB99C, 0xBAF6, + 0xB8AD, 0xBA14, 0xB770, 0xB8E7, 0xBAAC, 0xB7F0, 0xB9C5, 0xBB1A, + 0xB89A, 0xB9FA, 0xB79E, 0xB910, 0xBA31, 0xB7DB, 0xB94A, 0xB6DC, + 0xB817, 0xB981, 0xB71B, 0xB892, 0xB9F7, 0xB809, 0xB973, 0xB656, + 0xB843, 0xB9A8, 0xB695, 0xB87A, 0xB9DF, 0xB786, 0xB8F5, 0xB63E, + 0xB7C2, 0xB92F, 0xB6C1, 0xB8A6, 0xB9A5, 0xB700, 0xB921, 0xB66F, + 0xB7EE, 0xB956, 0xB6AE, 0xB869, 0xB5A7, 0xB72E, 0xB8A3, 0xB5E6, + 0xB81A, 0xB97F, 0xB6DC, 0xB856, 0xB519, 0xB75F, 0xB8CA, 0xB617, + 0xB799, 0xBC8C, 0xB69F, 0xB817, 0xB54F, 0xB78B, 0xB8F8, 0xB648, + 0xB7C5, 0xBC55, 0xB687, 0xB840, 0xB580, 0xB70A, 0xBC10, 0xB5BF, + 0xB788, 0xB464, 0xB6F9, 0xBB6D, 0xB5B1, 0xB736, 0xBBD6, 0xB5F0, + 0xB7B4, 0xB49A, 0xB72A, 0xBBC8, 0xB5E4, 0xB7A8, 0xBC2F, 0xB66A, + 0xBB25, 0xB51C, 0xB6A4, 0xBB91, 0xB559, 0xBB17, 0xBBFA, 0xB696, + 0xBB83, 0xB54D, 0xB719, 0xBBEC, 0xB5D3, 0xBADD, 0xBC53, 0xB656, + 0xB80B, 0xB9A8, 0xB745, 0xB886, 0xBCC7, 0xB7FF, 0xB8FA, 0xBD29, + 0xB878, 0xB96E, 0xB705, 0xB8EC, 0xB9DF, 0xB82B, 0xB962, 0xB6F7, + 0xB8DE, 0xB9D1, 0xB775, 0xB954, 0xBA3F, 0xB82D, 0xB9C5, 0xB767, + 0xB8A1, 0xBA31, 0xB7E0, 0xB917, 0xB756, 0xB893, 0xB986, 0xB7D2, + 0xB909, 0xB69B, 0xB887, 0xB978, 0xB719, 0xB8FB, 0xBA23, 0xB7D4, + 0xB96C, 0xB70B, 0xB84A, 0xB97A, 0xB789, 0xB8FD, 0xB6FD, 0xB83C, + 0xB96C, 0xB77B, 0xB8EF, 0xBA17, 0xB82E, 0xB960, 0xB6C2, 0xB8E1, + 0xBA0B, 0xB77D, 0xB952, 0xB092, 0xB830, 0xB960, 0xB76F, 0xB8A4, + 0xB081, 0xB822, 0xB954, 0xB24D, 0xB8D5, 0xB9FD, 0xB816, 0xB946, + 0xB16C, 0xB8C9, 0xB9F1, 0xB2D4, 0xB8D7, 0xB160, 0xB3B1, 0xB982, + 0xB1F9, 0xB8CB, 0xBA28, 0xB3A5, 0xB974, 0xB1ED, 0xB478, 0xBA1A, + 0xB397, 0xB968, 0xB1E1, 0xB46C, 0xB976, 0xB3D2, 0xB534, 0xBA56, + 0xB4A2, 0xB9A4, 0xB2B5, 0xB56A, 0xBA48, 0xB3D9, 0xB62D, 0xB2F5, + 0xB55C, 0xB6EB, 0xB3CD, 0xB61F, 0xB2E7, 0xB49D, 0xB71E, 0xB3C1, + 0xB563, 0xB72C, 0xB4D3, 0xB665, 0xB3FA, 0xB599, 0xB720, 0xB4C5, + 0xB659, 0xB3EE, 0xB5CF, 0xB751, 0xB500, 0xB68D, 0xB841, 0xB5C3, + 0xB782, 0xB851, 0xB5D1, 0xB792, 0xB502, 0xB6CE, 0xB87D, 0xB607, + 0xB7C3, 0xB53D, 0xB6FF, 0xB8AB, 0xB63D, 0xB7F4, 0xB8BE, 0xB732, + 0xB829, 0xB66E, 0xB7A9, 0xB8EA, 0xB6E5, 0xB830, 0xB0D9, 0xB776, + 0xB918, 0xB6B4, 0xB861, 0xB11C, 0xB7A2, 0xB8D0, 0xB24E, 0xB850, + 0xB15F, 0xB370, 0xB8D7, 0xB28E, 0xB822, 0xB9B5, 0xB3AB, 0xB93D, + 0xB2CC, 0xB4BB, 0xB94D, 0xB3E4, 0xB510, 0xB1F8, 0xB43E, 0xB610, + 0xB31A, 0xB546, 0xB236, 0xB474, 0xB680, 0xB39D, 0xB5B9, 0xB6F7, + 0xB4AA, 0xB6B1, 0xB3D8, 0xB5EF, 0xB701, 0xB525, 0xB641, 0xB453, + 0xB577, 0xB76C, 0xB490, 0xB6AF, 0xB391, 0xB5AD, 0xB760, 0xB4E3, + 0xB71F, 0xAD7F, 0xB620, 0xB76C, 0xB556, 0xB670, 0xB850, 0xB612, + 0xB7D5, 0xAFD5, 0xB6E0, 0xB81F, 0xB15F, 0xB752, 0xB06D, 0xB318, + 0xB885, 0xB1EC, 0xB7D0, 0xB0B0, 0xB351, 0xB842, 0xB274, 0xB3ED, + 0xB020, 0xB2CE, 0xB575, 0xB1A2, 0xB468, 0xB5C7, 0xB351, 0xB527, + 0xB274, 0xB4E3, 0xB677, 0xB411, 0xB575, 0xB2F7, 0xB466, 0xB66B, + 0xB3C0, 0xB625, 0xB330, 0xB520, 0xB672, 0xB411, 0xB5B2, 0xB726, + 0xB554, 0xB6E0, 0xB4CE, 0xB662, 0xB7A4, 0xB560, 0xB6EC, 0xADEB, + 0xB656, 0xB437, 0xB610, 0xB755, 0xB54D, 0xB69A, 0xB443, 0xB59D, + 0xB724, 0xB53F, 0xB6CB, 0xAE7A, 0xB685, 0xB7C7, 0xB100, 0xB70F, + 0xAF6C, 0xB1D7, 0xB7CE, 0xB186, 0xB740, 0xB09E, 0xB2C1, 0xB7FA, + 0xB14D, 0xB3CA, 0xB045, 0xB381, 0xB523, 0xB264, 0xB45D, 0xB62F, + 0xB34B, 0xB4EF, 0xB29D, 0xB491, 0xB5E6, 0xB448, 0xB5A2, 0xB338, + 0xB51C, 0xB6A4, 0xB3FA, 0xB5EB, 0xB3B3, 0xB50E, 0xB6AD, 0xB50C, + 0xB61A, 0xAD8B, 0xB613, 0xB716, 0xB06A, 0xB6D5, 0xAF27, 0xB1F0, + 0xB794, 0xB02E, 0xB2D7, 0xAF6D, 0xB22E, 0xB3E0, 0xB1E2, 0xB397, + 0xB068, 0xB309, 0xB4F0, 0xB18C, 0xB3E8, 0xB5BA, 0xB2FD, 0xB4FC, + 0xB2FB, 0xB45E, 0xB640, 0xB415, 0xB52B, 0xB307, 0xB524, 0xB632, + 0xB421, 0xB5EE, 0xACFA, 0xB56D, 0xB6B0, 0xAF97, 0xB66F, 0xAF3E, + 0xB561, 0xB731, 0xB0D7, 0xB67B, 0xAEE2, 0xB253, 0xB7AA, 0xB113, + 0xB3B7, 0xB0C4, 0xB28C, 0xB4C9, 0xB240, 0xB3A6, 0xB591, 0xB362, + 0xB54D, 0xB2D6, 0xB437, 0xB612, 0xB430, 0xB519, 0xB30A, 0xB4FD, + 0xB693, 0xB479, 0xB5C7, 0xB3DB, 0xB583, 0xB711, 0xB4AD, 0xB646, + 0xAEB8, 0xB602, 0xB750, 0xB0B9, 0xB6C4, 0xB04D, 0xB2F8, 0xB7C9, + 0xB1CA, 0xB3D2, 0xB5B0, 0xB349, 0xB49D, 0xB636, 0xB49B, 0xB62F, + 0xAE5D, 0xB526, 0xB6B4, 0xB0D4, 0xB673, 0xAF3B, 0xB206, 0xB6F8, + 0xB1FD, 0xB33B, 0xB079, 0xB2DA, 0xB48B, 0xB293, 0xB3C7, 0xB162, + 0xB36B, 0xB50F, 0xB324, 0xB4CD, 0xB240, 0xB434, 0xB593, 0xB3F0, + 0xB58C, 0xADC8, 0xB4BD, 0xB614, 0xAF68, 0xB5D5, 0xAF16, 0xB195, + 0xB658, 0xB059, 0xB275, 0xB052, 0xB26E, 0xB422, 0xB13F, 0xB306, + 0xB138, 0xB2FF, 0xB4AB, 0xB21B, 0xB427, 0xB1D1, 0xB38B, 0xB4ED, + 0xB384, 0xB4EB, 0xABD3, 0xB417, 0xB571, 0xAF43, 0xB56A, 0xAD99, + 0xB036, 0xB67A, 0xB034, 0xB5AE, 0xAEE5, 0xB204, 0xB6B9, 0xB0D0, + 0xB377, 0xB0C9, 0xB298, 0xB402, 0xB291, 0xB3FE, 0xB1AA, 0xB324, + 0xB514, 0xB31B, 0xB445, 0xB23E, 0xB43E, 0xB55B, 0xB367, 0xB554, + 0xADC4, 0xB4C2, 0xB65F, 0xAFC2, 0xB59D, 0xAFC0, 0xB198, 0xB6A3, + 0xB191, 0xB30B, 0xB0A4, 0xB304, 0xB42C, 0xB225, 0xB425, 0xB1DB, + 0xB34E, 0xB53B, 0xB34C, 0xB46C, 0xB26D, 0xB46A, 0xB57F, 0xB393, + 0xB540, 0xAEA7, 0xB4AC, 0xB649, 0xB090, 0xB5BD, 0xAF9B, 0xB20C, + 0xB68B, 0xB1C7, 0xB337, 0xB120, 0xB333, 0xB458, 0xB256, 0xB414, + 0xB5B4, 0xB689, 0xB16D, 0xB680, 0xB166, 0xB29E, 0xB454, 0xB297, + 0xB44D, 0xB1F5, 0xB3B8, 0xB523, 0xB3B4, 0xB494, 0xB2DC, 0xB48D, + 0xAD6E, 0xB3FB, 0xB563, 0xB013, 0xB55A, 0xAF19, 0xB14F, 0xB628, + 0xB14B, 0xB27E, 0xB05E, 0xB27C, 0xB3F2, 0xB275, 0xB35D, 0xB193, + 0xB359, 0xB4C7, 0xB2BF, 0xB435, 0xAD5A, 0xB42E, 0xB591, 0xAFF5, + 0xB502, 0xAF00, 0xB134, 0xB61E, 0xB12D, 0xB2BB, 0xB045, 0xB21E, + 0xB03E, 0xB217, 0xB393, 0xB17A, 0xB2FE, 0xAA45, 0xB2F7, 0xB468, + 0xAD91, 0xB3D3, 0xAD8A, 0xAFDF, 0xB535, 0xAFD8, 0xB1B4, 0xAEE0, + 0xB0D4, 0xB331, 0xB0CD, 0xB297, 0xB025, 0xB1FC, 0xB3CB, 0xB1B5, + 0xB371, 0xAC03, 0xB32F, 0xB49B, 0xAE74, 0xB494, 0xAE70, 0xB067, + 0xAD6F, 0xB060, 0xB1F4, 0xAF72, 0xB152, 0xAEC5, 0xB14B, 0xB2CF, + 0xB0AB, 0xB2C8, 0xA8C7, 0xB230, 0xB3F5, 0xACFE, 0xB365, 0xABE8, + 0xAF0C, 0xB48A, 0xAF05, 0xB0A7, 0xAE52, 0xB0A5, 0xB22A, 0xAFFD, + 0xB228, 0xAFF6, 0xB18B, 0xB358, 0xB184, 0xB300, 0xAB6F, 0xB2BE, + 0xAA46, 0xAD9E, 0xB3EB, 0xAD97, 0xB038, 0xACDE, 0xAF90, 0xB180, + 0xAF8E, 0xB123, 0xAE9D, 0xB0DE, 0xB2EF, 0xB0D7, 0xB259, 0xA9C5, + 0xB255, 0xB389, 0xAD26, 0xAF8A, 0xB4F7, 0xAF83, 0xB11B, 0xAED8, + 0xB114, 0xB2E4, 0xB10D, 0xB24F, 0xB06F, 0xB248, 0xB37C, 0xB241, + 0xB375, 0xAD67, 0xB336, 0xAC5E, 0xAF18, 0xB456, 0xAF11, 0xB105, + 0xAE66, 0xB067, 0xB23D, 0xB060, 0xB239, 0xAFBD, 0xB1A3, 0xB32B, + 0xB19C, 0xB324, 0xABE5, 0xB2CF, 0xABE3, 0xAE60, 0xB3BC, 0xAE59, + 0xB055, 0xADAB, 0xB051, 0xB227, 0xAFB0, 0xB18F, 0xAFA9, 0xB18D, + 0xB313, 0xB186, 0xB2BB, 0xAC27, 0xAE97, 0xB3F6, 0xAE4C, 0xB04B, + 0xADE7, 0xB044, 0xAD97, 0xAFE4, 0xB182, 0xAF9A, 0xB17B, 0xAF3A, + 0xB177, 0xB2FD, 0xAC1F, 0xB26A, 0xABB1, 0xAE88, 0xB3DE, 0xAE81, + 0xB035, 0xADD3, 0xB02E, 0xADD1, 0xAFCE, 0xB1C0, 0xAF86, 0xB165, + 0xA8DC, 0xB123, 0xB2AE, 0xAC5E, 0xB2A7, 0xABA2, 0xAE74, 0xB392, + 0xAE6D, 0xB021, 0xAE69, 0xB01A, 0xB1B1, 0xB016, 0xB1AC, 0xB00F, + 0xB1A5, 0xA930, 0xB10F, 0xB2E9, 0xAC4F, 0xAEC6, 0xAC48, 0xAEBF, + 0xB0FD, 0xAE5C, 0xB064, 0xAE57, 0xB05D, 0xB1EE, 0xB05B, 0xB1EA, + 0xAFFB, 0xB1A5, 0xAA42, 0xAD9E, 0xB2E6, 0xACED, 0xAF51, 0xACE6, + 0xAF4A, 0xB13D, 0xAEA9, 0xB0A9, 0xAEA2, 0xB0A2, 0xB27A, 0xB09B, + 0xAE99, 0xB097, 0xB1E5, 0xAAF5, 0xB1DE, 0xAAF3, 0xAD88, 0xB318, + 0xAD3B, 0xAF92, 0xACD0, 0xAF90, 0xB13D, 0xAEEF, 0xB0E0, 0xAEE8, + 0xB0DE, 0xA87D, 0xB0D7, 0xB271, 0xAC0C, 0xAED8, 0xAC05, 0xAE34, + 0xB035, 0xAE2D, 0xB02E, 0xAE2B, 0xB02C, 0xADC3, 0xB025, 0xB174, + 0xAA0D, 0xB16D, 0xAA06, 0xAD10, 0xB26E, 0xAD09, 0xAF77, 0xAD02, + 0xAF19, 0xB0C9, 0xAED6, 0xB0C5, 0xAECF, 0xB0BE, 0xA852, 0xB027, + 0xB1C7, 0xAC41, 0xAE63, 0xAB8A, 0xAE5C, 0xB017, 0xADB8, 0xB013, + 0xADB3, 0xB00C, 0xA6D9, 0xAF72, 0xB118, 0xAA4C, 0xB116, 0xAA45, + 0xAD9C, 0xB29D, 0xACF5, 0xAF5E, 0xACEE, 0xAF57, 0xB0FD, 0xAF50, + 0xB0A7, 0xAEB6, 0xB067, 0xA967, 0xACD9, 0xB244, 0xACD5, 0xAEA6, + 0xAC28, 0xAE9F, 0xB050, 0xAE98, 0xB049, 0xAE96, 0xB009, 0xA806, + 0xB002, 0xB19D, 0xAAF5, 0xB196, 0xAAF3, 0xADE2, 0xAFF2, 0xADDD, + 0xAFEB, 0xADD9, 0xAFE9, 0xB149, 0xAF8E, 0xB142, 0xAAD7, 0xB13D, + 0xAA1A, 0xAD24, 0xB286, 0xAD1D, 0xAF3B, 0xAD1B, 0xAF34, 0xB09C, + 0xAF32, 0xB09A, 0xAF2B, 0xB093, 0xA9FA, 0xB0E0, 0xB230, 0xAC5A, + 0xAEDA, 0xAC55, 0xAED8, 0xB043, 0xAED1, 0xB03C, 0xAECA, 0xB03A, + 0xAEC8, 0xAC9D, 0xAE6A, 0xAC9B, 0xAE24, 0xB079, 0xAE20, 0xB023, + 0xA845, 0xABE5, 0xB18A, 0xABDE, 0xAE67, 0xABDC, 0xAE62, 0xABD5, + 0xAE5E, 0xB020, 0xADC1, 0xB019, 0xA896, 0xAB7E, 0xB131, 0xAB77, + 0xAE08, 0xAB75, 0xAE06, 0xAB6E, 0xADFF, 0xAFC2, 0xADF8, 0xAFBD, + 0xA7AF, 0xAFB9, 0xB114, 0xABBB, 0xADA9, 0xABB9, 0xADA2, 0xAB09, + 0xADA0, 0xAFBA, 0xADF3, 0xAFB3, 0xA808, 0xAFB1, 0xB10A, 0xAB54, + 0xB0CA, 0xAB4F, 0xAD9D, 0xAB4B, 0xAD96, 0xAF61, 0xAD94, 0xAFAE, + 0xADE4, 0xAFA7, 0xB0C7, 0xAAEF, 0xB111, 0xAAED, 0xAD7D, 0xAB48, + 0xAD37, 0xAF57, 0xAD8C, 0xAFA4, 0xAD85, 0xAFA2, 0xA852, 0xAB95, + 0xB107, 0xAB8E, 0xADCF, 0xAAE3, 0xAD73, 0xAFA1, 0xAD87, 0xAF9A, + 0xAD80, 0xAF98, 0xA7E7, 0xAF3F, 0xB0FD, 0xABE8, 0xADCA, 0xABE6, + 0xADC5, 0xAF99, 0xAD7F, 0xAF95, 0xADD2, 0xAF8E, 0xA910, 0xAF50, + 0xB0F3, 0xABE8, 0xAE19, 0xAC3E, 0xADC0, 0xAFE1, 0xADCF, 0xAF8D, + 0xAE24, 0xAF9C, 0xA910, 0xAFE9, 0xB14B, 0xAC3D, 0xB147, 0xAC3B, + 0xAE28, 0xAFA0, 0xAE21, 0xAFE8, 0xAE71, 0xB033, 0xAE6A, 0xAFDF, + 0xB141, 0xAC97, 0xB155, 0xACEA, 0xAE75, 0xB29D, 0xAEC0, 0xB030, + 0xAE67, 0xAC96, 0xAE7B, 0xACEE, 0xAEC8, 0xB085, 0xAEC4, 0xB031, + 0xAA96, 0xAC9C, 0xAAF1, 0xACF2, 0xAECC, 0xAD42, 0xAF17, 0xAD40, + 0xAF13, 0xB044, 0xAED2, 0xB08C, 0xABB2, 0xADA0, 0xABAB, 0xAD99, + 0xAF14, 0xAD92, 0xAF28, 0xADA6, 0xAF73, 0xA930, 0xAC09, 0xB0E4, + 0xAC07, 0xAD98, 0xABC1, 0xAE01, 0xAC14, 0xAE4C, 0xAF6D, 0xA9FC, + 0xAFCE, 0xA995, 0xAC1F, 0xAA0E, 0xAC72, 0xAE50, 0xACC8, 0xAE4E, + 0xACC3, 0xAEAF, 0xA76C, 0xAA77, 0xB029, 0xAB32, 0xAD23, 0xAB2B, + 0xAD1C, 0xAB26, 0xAD85, 0xAEFE, 0xA8B3, 0xAF0F, 0xA979, 0xAB8E, + 0xA912, 0xAB87, 0xADDB, 0xABF8, 0xAD82, 0xA656, 0xADE8, 0xAF5E, + 0xA9E0, 0xAC5B, 0xA9D9, 0xAC56, 0xAA50, 0xAC4F, 0xAE3E, 0xACBB, + 0xAE52, 0xA7A9, 0xAE9D, 0xA7C0, 0xAB13, 0xAD6D, 0xAB11, 0xAD14, + 0xAB80, 0xAD28, 0xA436, 0xAD78, 0xAF4F, 0xA962, 0xABE3, 0xA960, + 0xABDE, 0xA9D7, 0xABDC, 0xADCC, 0xAC48, 0xAE32, 0xA790, 0xAA9F, + 0xA720, 0xAA9D, 0xACA8, 0xAA96, 0xACA1, 0xAB05, 0xAD0A, 0xA51E, + 0xAD03, 0xAE90, 0xA8E6, 0xAB6D, 0xA8DF, 0xAB66, 0xAD79, 0xAC2C, + 0xADC4, 0xABD0, 0xADC0, 0xA779, 0xAA26, 0xAF53, 0xAA1F, 0xAC9E, + 0xAAEE, 0xAC99, 0xAE2C, 0xACAB, 0xAE8D, 0xA8CF, 0xAB56, 0xA8C8, + 0xAB6A, 0xAD5D, 0xABBB, 0xAD59, 0xAB77, 0xADBF, 0xA764, 0xAA0D, + 0xAF4B, 0xAA08, 0xAC87, 0xAA7C, 0xAC2B, 0xAA78, 0xAC94, 0xAE85, + 0xA8BD, 0xAE83, 0xA8B6, 0xAB51, 0xA92D, 0xAB4C, 0xAD53, 0xABB6, + 0xADB7, 0xA752, 0xA99B, 0xA6E2, 0xAA6A, 0xAC84, 0xAA08, 0xAC7D, + 0xAAD4, 0xACE6, 0xA560, 0xA840, 0xAE7D, 0xA91D, 0xABA8, 0xA91B, + 0xABA6, 0xA98D, 0xAC0D, 0xADB4, 0xA740, 0xADAF, 0xA7BD, 0xAA6C, + 0xA7BB, 0xAA67, 0xAC7C, 0xAAD6, 0xACE3, 0xA5C4, 0xAD47, 0xA649, + 0xA97F, 0xABAA, 0xA97D, 0xAC11, 0xA9EF, 0xAC0A, 0xA3B0, 0xAC73, + 0xAE12, 0xA88F, 0xAACB, 0xA82A, 0xAB32, 0xA902, 0xAB30, 0xAD48, + 0xAB9A, 0xAD44, 0xA72C, 0xA9E1, 0xA811, 0xAA53, 0xAC10, 0xAABF, + 0xAC77, 0xAAB8, 0xACDB, 0xA623, 0xA8F4, 0xAE81, 0xA96B, 0xABF5, + 0xA9DD, 0xABA0, 0xAA47, 0xAC07, 0xADA4, 0xA79B, 0xADB8, 0xA87B, + 0xAB1E, 0xA8ED, 0xAB32, 0xACDA, 0xAB2B, 0xAD3E, 0xA782, 0xA9CF, + 0xA71A, 0xAA3C, 0xAC60, 0xAAA8, 0xAC74, 0xAABF, 0xAC6D, 0xA618, + 0xA95B, 0xAE79, 0xA954, 0xAB89, 0xA9C6, 0xABF0, 0xAA35, 0xAC04, + 0xAA47, 0xAC68, 0xA5FA, 0xA8E0, 0xAE0F, 0xA952, 0xAB84, 0xA9C4, + 0xABEB, 0xAA2E, 0xAB94, 0xA477, 0xA7ED, 0xADA9, 0xA867, 0xAAAA, + 0xA8D9, 0xAB14, 0xA94B, 0xAB7B, 0xAD34, 0xA6F4, 0xAA27, 0xA771, + 0xAA3E, 0xA7E6, 0xAAA8, 0xAC67, 0xAB0D, 0xACC9, 0xA677, 0xA942, + 0xA6F4, 0xAA23, 0xABEF, 0xA9C6, 0xABE8, 0xAA35, 0xAC65, 0xA5D9, + 0xA8CE, 0xA6DB, 0xA940, 0xAB18, 0xA9AD, 0xABE8, 0xA4CE, 0xABE6, + 0xA554, 0xA85C, 0xAA98, 0xA8CE, 0xAAFF, 0xA93E, 0xAB13, 0xA3B6, + 0xA754, 0xAD42, 0xA843, 0xAA29, 0xA8B5, 0xAA93, 0xA8CC, 0xAAFD, + 0xA288, 0xA6D7, 0xACDC, 0xA752, 0xAA13, 0xA7C7, 0xAA27, 0xA8B3, + 0xAAFD, 0xAC64, 0xA6C1, 0xA937, 0xA6D8, 0xA9A4, 0xA750, 0xA9B8, + 0xABEC, 0xAA91, 0xABFB, 0xA644, 0xA8C8, 0xA6C1, 0xA935, 0xAB6F, + 0xAA11, 0xAB83, 0xAA25, 0xABE5, 0xA5C4, 0xA8AF, 0xA644, 0xA91C, + 0xAB6F, 0xA9A2, 0xAB83, 0xA4A5, 0xABE5, 0xA5B0, 0xA83D, 0xAA88, + 0xA91F, 0xAB03, 0xA933, 0xAB6A, 0xA422, 0xABE5, 0xAD37, 0xA83D, + 0xAA88, 0xA8AD, 0xAA9C, 0xA91F, 0xAB68, 0xACD8, 0xA7B4, 0xAD37, + 0xA829, 0xAA88, 0xA840, 0xAA9C, 0xA91F, 0xAB01, 0xAC74, 0xA7A0, + 0xAA0A, 0xAB8B, 0xA59F, 0xABED, 0xA69C, 0xA91F, 0xA6B3, 0xA98C, + 0x9F0C, 0xAA0A, 0xAB8B, 0xA5A4, 0xA89E, 0xA6A1, 0xA8B0, 0xA714, + 0xA98C, 0xAB10, 0xA50F, 0xAB8B, 0xA612, 0xA89E, 0xA624, 0xA8B0, + 0xA719, 0xA98C, 0xAB10, 0xA4FB, 0xA818, 0xA595, 0xA89E, 0xA68D, + 0xA90B, 0xAB01, 0xA98C, 0xAB77, 0xA583, 0xA81A, 0xA59A, 0xA8A3, + 0xA692, 0xA90E, 0xAB01, 0xA4EE, 0xAB77, 0xA588, 0xA88F, 0xA603, + 0xA8A3, 0xAA9C, 0xA90E, 0xAB01, 0xA4F3, 0xA80B, 0xA58D, 0xA891, + 0xA685, 0xA8A3, 0xAA9C, 0xA4E1, 0xAB15, 0xA4FB, 0xA810, 0xA5F6, + 0xA894, 0xAA8D, 0xA915, 0xAB03, 0xA4E9, 0xA7A0, 0xA580, 0xA810, + 0xA676, 0xA894, 0xAA8D, 0xA984, 0xAB03, 0xA56E, 0xA817, 0xA585, + 0xA82E, 0xAA8F, 0xA903, 0xAB05, 0xA4DC, 0xAB7B, 0xA5F3, 0xA889, + 0xA60A, 0xA90A, 0xAA8F, 0xA921, 0xAB05, 0xA561, 0xA808, 0xA670, + 0xA889, 0xAA91, 0xA90D, 0xAB0A, 0xA4EB, 0xAB19, 0xA5E6, 0xA890, + 0xA675, 0xA914, 0xAAAA, 0xA98D, 0xAB20, 0xA570, 0xA80F, 0xA607, + 0xA893, 0xAA96, 0xA914, 0xAB0C, 0xA992, 0xAB20, 0xA66D, 0xA89A, + 0xA6F7, 0xA91B, 0xAB13, 0xA994, 0xAB22, 0xA5E3, 0xAB98, 0xA689, + 0xA4C1, 0xAAAE, 0xAC2B, 0xA80E, 0xAA17, 0xA88D, 0xAA26, 0xA90E, + 0xAA9F, 0xA4C6, 0xA78A, 0xA9B2, 0xA827, 0xAA2B, 0xA910, 0xAAA1, + 0xA550, 0xA7FE, 0xA5E2, 0xA815, 0xAA2F, 0xA8AD, 0xAAA8, 0xA4C0, + 0xAB19, 0xA5E9, 0xA887, 0xA6EB, 0xA89B, 0xAAAA, 0xA930, 0xAB1E, + 0xA5D7, 0xA88E, 0xA67D, 0xA8A2, 0xA779, 0xA91E, 0xAB22, 0xA5E1, + 0xA828, 0xA66B, 0xA911, 0xA77E, 0xA923, 0xA254, 0xA660, 0xAB4C, + 0xA6EA, 0xA913, 0xA6FC, 0xA92A, 0xA2E7, 0xA9B7, 0xA38A, 0xA6F1, + 0xA91A, 0xA703, 0xA92C, 0xA810, 0xA9BE, 0xA417, 0xA6F6, 0xA4AC, + 0xA77A, 0xA933, 0xA815, 0xA9C0, 0xA49F, 0xA6FD, 0xA4B6, 0xA781, + 0xA5DA, 0xA81C, 0xA9C5, 0xA4AB, 0xA704, 0xA53B, 0xA78B, 0xA659, + 0xA823, 0xA03A, 0xA4B5, 0xAA56, 0xA545, 0xA813, 0xA660, 0xA825, + 0xA0E3, 0xA922, 0xA23F, 0xA551, 0xA818, 0xA66A, 0xA8AD, 0xA705, + 0xA929, 0xA2D2, 0xA65A, 0xA40A, 0xA66F, 0xA8B2, 0xA70F, 0xA944, + 0xA360, 0xA664, 0xA419, 0xA6FF, 0xA53B, 0xA781, 0xA946, 0xA409, + 0xA9D3, 0xA49C, 0xA706, 0xA545, 0xA79F, 0xA025, 0xA834, 0xAA50, + 0xA53A, 0xA794, 0xA5DB, 0xA827, 0xA665, 0xA83B, 0xA21D, 0xA541, + 0xA796, 0xA5E5, 0xA82E, 0xA6F3, 0xA8BE, 0xAA6D, 0xA5DA, 0xA821, + 0xA678, 0xA8B1, 0xA711, 0xA8D9, 0xA35A, 0xA66B, 0xA40E, 0xA706, + 0xA8CC, 0xA79C, 0xA95C, 0xA401, 0xA672, 0xA4AD, 0xA70D, 0xA551, + 0xA7A3, 0xA974, 0xA4A2, 0xA9FC, 0xA546, 0xA796, 0xA5E7, 0xA7BE, + 0xA15D, 0xA536, 0xA2C2, 0xA5D7, 0xA7B1, 0xA675, 0xA844, 0xA2B2, + 0xA8EA, 0xA369, 0xA66D, 0xA413, 0xA703, 0xA8DD, 0xA72E, 0xA968, + 0xA408, 0xA688, 0xA4AF, 0xA721, 0x9F51, 0xA7B4, 0xA162, 0xA4A4, + 0xA716, 0xA5D2, 0xA7A9, 0xA670, 0xA850, 0xA217, 0xA53B, 0xA2CC, + 0xA5F5, 0xA843, 0xA68E, 0xA86B, 0xA2C1, 0xA5E5, 0xA406, 0xA683, + 0xA4AF, 0xA730, 0xA902, 0xA3FB, 0xA608, 0xA49F, 0xA725, 0xA55F, + 0xA7B6, 0xA0B1, 0xA41E, 0xA217, 0xA54F, 0xA743, 0xA5F0, 0xA7EA, + 0xA20C, 0xA544, 0xA359, 0xA5F9, 0xA403, 0xA692, 0xA881, 0xA34C, + 0xA5EC, 0xA40F, 0xA685, 0xA543, 0xA72F, 0x9FF0, 0xA404, 0xA15F, + 0xA4AB, 0xA6BC, 0xA5ED, 0xA7CE, 0xA1F5, 0xA4B7, 0xA2AA, 0xA556, + 0xA373, 0xA68D, 0xA7FD, 0xA220, 0xA89F, 0xA3F8, 0xA5FE, 0xA42B, + 0xA6AD, 0x9FE0, 0xA374, 0xA14A, 0xA4AB, 0xA6B9, 0xA563, 0xA75E, + 0xA5FC, 0xA7F1, 0xA6A9, 0xA890, 0xA35E, 0xA608, 0xA4AC, 0xA6B5, + 0xA564, 0xA75F, 0xA143, 0xA42B, 0xA6A8, 0xA4E3, 0xA752, 0xA604, + 0xA78E, 0xA2A5, 0xA560, 0xA36B, 0xA610, 0x9D69, 0xA6BD, 0xA828, + 0xA35E, 0xA597, 0xA421, 0xA647, 0x9FC9, 0xA6F1, 0xA14A, 0xA4B5, + 0xA21C, 0xA56D, 0xA6FD, 0xA13F, 0xA79F, 0xA2A7, 0xA4EF, 0xA370, + 0xA626, 0x9EF3, 0xA2B8, 0xA848, 0xA37C, 0xA5B0, 0xA4C2, 0xA6DA, + 0x9FD3, 0xA77F, 0xA154, 0xA4CE, 0xA2BC, 0xA581, 0xA788, 0xA201, + 0xA7AE, 0xA2C8, 0xA58A, 0xA389, 0xA63A, 0x9F05, 0xA2D4, 0xA08F, + 0xA425, 0xA646, 0xA4DB, 0xA6EB, 0xA144, 0xA431, 0xA211, 0xA4E7, + 0xA2D5, 0xA597, 0x9E2E, 0xA2B3, 0xA4F3, 0xA374, 0xA5A3, 0xA449, + 0xA662, 0xA084, 0xA385, 0xA154, 0xA455, 0xA2D0, 0xA508, 0xA727, + 0xA1FE, 0xA4E6, 0xA2DC, 0xA514, 0xA39D, 0xA658, 0x9FB9, 0xA37B, + 0xA099, 0xA434, 0xA661, 0xA503, 0xA71D, 0xA144, 0xA440, 0xA22A, + 0xA50A, 0xA398, 0xA5CE, 0xA7DC, 0xA2CC, 0xA516, 0xA3A4, 0xA5DA, + 0xA471, 0xA696, 0xA0A3, 0xA3B0, 0xA225, 0xA502, 0xA6A2, 0xA5C4, + 0xA75B, 0xA231, 0xA50E, 0xA39A, 0xA5D0, 0x9F04, 0xA68C, 0xA0A0, + 0xA3A6, 0xA5F0, 0x9FBD, 0xA2FB, 0xA14B, 0xA3CB, 0xA5FC, 0xA51B, + 0xA6B8, 0xA15C, 0xA462, 0xA23D, 0xA527, 0xA3A1, 0xA5E6, 0x9FB8, + 0xA2F6, 0xA0AF, 0xA3C6, 0xA60B, 0xA48E, 0xA6C2, 0xA16E, 0xA471, + 0xA24F, 0xA536, 0x9E0D, 0xA575, 0x9F13, 0xA2EC, 0xA53F, 0xA3D8, + 0xA615, 0x9FE3, 0xA314, 0xA169, 0xA3E4, 0xA2EF, 0xA4A9, 0x9E0D, + 0xA194, 0xA48C, 0xA300, 0xA54C, 0xA3E7, 0xA61F, 0xA09C, 0xA323, + 0xA180, 0xA48D, 0xA306, 0xA4CF, 0x9E2A, 0xA23C, 0xA499, 0xA312, + 0xA56F, 0x9F05, 0xA5B1, 0xA097, 0xA335, 0xA195, 0xA419, 0x9C62, + 0xA0C2, 0xA716, 0xA24E, 0xA4BF, 0xA338, 0xA57E, 0x9F05, 0xA276, + 0xA0C8, 0xA3E6, 0xA254, 0xA4C2, 0xA66C, 0xA187, 0xA409, 0xA260, + 0xA4E2, 0xA34A, 0xA5A4, 0x9FDB, 0xA32D, 0xA0DF, 0xA40C, 0x9B61, + 0xA4E8, 0xA68F, 0xA19E, 0xA42F, 0xA330, 0xA508, 0x9F02, 0xA5D9, + 0xA00F, 0xA353, 0xA1A1, 0xA432, 0xA5F9, 0xA0D1, 0xA415, 0xA274, + 0xA455, 0xA359, 0xA52E, 0x9F39, 0xA297, 0xA0DC, 0xA37C, 0xA5DD, + 0xA458, 0xA61C, 0xA1AD, 0xA43B, 0xA29D, 0xA50F, 0xA37F, 0xA563, + 0xA00C, 0xA362, 0xA1B3, 0xA43C, 0xA614, 0xA0E8, 0xA6DA, 0xA1F2, + 0xA014, 0xA37C, 0xA549, 0x9FEF, 0xA2BD, 0xA10A, 0xA39F, 0xA29D, + 0xA476, 0x9E2E, 0xA1D8, 0xA014, 0xA2C0, 0xA544, 0xA3B9, 0xA581, + 0xA0ED, 0xA39C, 0xA1DE, 0xA473, 0x9D69, 0xA113, 0x9F43, 0xA2C0, + 0xA0F3, 0xA39F, 0xA57B, 0xA025, 0xA2E3, 0xA1DB, 0xA3D9, 0xA2C3, + 0xA4C4, 0x9F26, 0xA203, 0xA042, 0xA302, 0x9B2C, 0xA022, 0xA5C7, + 0xA11B, 0xA3D6, 0xA220, 0xA4BF, 0x9F26, 0xA200, 0xA028, 0xA2FA, + 0xA138, 0xA3F0, 0x9D5C, 0xA118, 0xA339, 0xA21D, 0xA427, 0x9E4F, + 0xA50D, 0xA02A, 0xA2F7, 0xA138, 0xA3E8, 0x9D44, 0xA06F, 0x9E77, + 0xA21A, 0xA422, 0xA314, 0xA50A, 0x9F7B, 0xA30B, 0xA135, 0xA367, + 0xA24E, 0xA450, 0x9E79, 0xA231, 0xA04C, 0xA328, 0xA519, 0xA043, + 0xA56A, 0xA14E, 0xA35F, 0xA24B, 0xA44D, 0x9F4F, 0xA18B, 0xA063, + 0xA339, 0xA16B, 0xA390, 0xA57B, 0xA0A5, 0xA373, 0xA262, 0xA473, + 0x9E9A, 0xA553, 0xA07C, 0xA29E, 0xA182, 0xA3A4, 0x9D92, 0xA162, + 0xA387, 0xA276, 0xA484, 0xA37E, 0xA4D8, 0xA07C, 0xA2B0, 0xA19B, + 0xA3B8, 0x9E6E, 0xA4B2, 0x9F8D, 0xA28A, 0xA495, 0xA392, 0xA4FD, + 0xA0AF, 0xA2DD, 0xA1AF, 0xA3E0, 0xA2BB, 0xA4D8, 0x9FBE, 0xA2B5, + 0xA4BB, 0xA615, 0xA1E3, 0xA411, 0xA2EF, 0xA506, 0xA0A3, 0xA5F2, + 0xA1BD, 0xA3E9, 0xA2C9, 0xA43D, 0x9FB7, 0xA20E, 0xA0DA, 0xA317, + 0x9D83, 0xA0D1, 0xA58E, 0xA1E8, 0xA411, 0xA2F1, 0xA479, 0x9FED, + 0xA2EB, 0xA10D, 0xA342, 0x9DBC, 0xA456, 0x9FBF, 0xA216, 0xA0E4, + 0xA333, 0xA49C, 0xA0D9, 0xA316, 0xA138, 0xA381, 0x9DF5, 0xA479, + 0x9FF5, 0xA241, 0xA112, 0xA35B, 0x9DAF, 0xA109, 0x9F03, 0xA232, + 0x9A52, 0xA289, 0xA4B3, 0xA028, 0xA283, 0xA157, 0xA398, 0x9ED1, + 0xA14E, 0x9FFF, 0xA25D, 0x9B8D, 0xA372, 0x9DDE, 0xA128, 0x9F2A, + 0xA19C, 0xA3D7, 0x9F07, 0xA17C, 0xA047, 0xA29F, 0xA173, 0xA3B1, + 0x9E14, 0xA16D, 0x9F60, 0xA290, 0x9BA5, 0x9F57, 0x9DEB, 0xA091, + 0x97BD, 0xA1B8, 0xA402, 0x9F2E, 0xA1AF, 0xA082, 0xA2CD, 0x9CE1, + 0xA062, 0x9F1F, 0xA1A0, 0xA059, 0xA2BE, 0x9BD7, 0x9F95, 0x9E2C, + 0xA0C7, 0xA323, 0x9E23, 0xA0C1, 0x9F6C, 0xA1E5, 0xA0B8, 0xA314, + 0x9D2A, 0xA0B2, 0x9F5D, 0xA1D6, 0x9A86, 0x9F54, 0x9CFE, 0x9FCE, + 0x9E6D, 0xA117, 0xA365, 0x9E67, 0xA0F7, 0x9FC1, 0xA22F, 0x9CE6, + 0x9FA1, 0x9E40, 0xA0E8, 0x9F98, 0xA220, 0x9BE1, 0x9F92, 0x9D64, + 0xA3C4, 0x9F89, 0xA161, 0xA01A, 0xA291, 0x9D38, 0xA014, 0x9E9F, + 0xA152, 0x9A9F, 0xA282, 0xA429, 0xA002, 0xA27C, 0xA143, 0xA2FE, + 0x9E89, 0xA13D, 0x9FF3, 0xA281, 0x9C1E, 0xA2EA, 0x9E7A, 0xA12E, + 0x9FE9, 0xA1B6, 0x9C11, 0x9FE0, 0xA1AD, 0xA06C, 0xA2EC, 0x9D9D, + 0xA068, 0x9EFB, 0xA1B5, 0xA05F, 0xA2F4, 0x9D8B, 0xA056, 0x9F06, + 0xA1A6, 0x9AEB, 0x9EFD, 0x9D81, 0xA061, 0x9EF7, 0xA1AE, 0xA370, + 0x9EEE, 0xA0E1, 0xA052, 0xA228, 0x9D83, 0xA060, 0x9EF6, 0xA0E9, + 0x9AE8, 0xA230, 0x9C8C, 0x9F81, 0x9E10, 0xA0DA, 0x9AD6, 0x9E0A, + 0x9C7A, 0x9F8C, 0xA232, 0x9C71, 0x9F88, 0x9E12, 0xA0F3, 0x9F7F, + 0xA235, 0x9C81, 0x9F90, 0x9E1D, 0xA0FB, 0x99A9, 0x9E14, 0x9C8C, + 0x9F98, 0x9E10, 0xA103, 0xA2CB, 0x9E24, 0xA0FA, 0x9FA3, 0xA180, + 0x9C93, 0x9F9A, 0x9E2C, 0xA03D, 0x99C3, 0xA19C, 0x9C84, 0x9FA2, + 0x9E37, 0xA045, 0x99D6, 0x9E33, 0x9C91, 0x9FAD, 0xA1B5, 0x9CA5, + 0x9FBE, 0x9E3E, 0xA05E, 0x9FCF, 0xA1BD, 0x9CB5, 0x9EDE, 0x9E46, + 0xA066, 0x99F0, 0x9E57, 0x9CC0, 0x9F00, 0x9E68, 0xA06E, 0xA265, + 0x9D6E, 0xA07F, 0x9F0B, 0xA1ED, 0x9CE1, 0x9F1C, 0x9E84, 0xA09E, + 0x9A05, 0x9E95, 0xA0AF, 0x9F29, 0xA147, 0xA0C0, 0xA2AA, 0x9DAF, + 0xA0B7, 0x9F4B, 0xA166, 0x9C0B, 0x9F57, 0x9DBC, 0xA0D4, 0x9A3F, + 0x9DD0, 0x9C30, 0x9F79, 0x9DE1, 0xA0F3, 0x9A6C, 0x9DF2, 0xA101, + 0x9F9B, 0xA1AD, 0x9D68, 0x9FA9, 0x9E17, 0xA135, 0x9BC1, 0x9E28, + 0x9D8D, 0x9FCB, 0x9E39, 0xA154, 0x9BE6, 0x9E4A, 0x9DB2, 0x9FEA, + 0x98D7, 0x9DC3, 0x9BF1, 0x9E6F, 0xA0AD, 0x9C0A, 0x9E80, 0x9DE5, + 0xA02F, 0x9E91, 0xA0CA, 0x9C4C, 0x9EB9, 0x9E0A, 0xA051, 0x9A71, + 0x9E1B, 0x9C71, 0x9EDB, 0x988C, 0x9C85, 0x9A9E, 0x9E57, 0x9C96, + 0x9EFB, 0xA142, 0x9CAA, 0x9F23, 0x9E79, 0xA0C7, 0x9AF7, 0x9EA4, + 0x9CE9, 0x9F5C, 0x9906, 0xA0FD, 0x9B24, 0x9EC1, 0x9D0E, 0x9F7C, + 0x9951, 0x9D3C, 0x9B69, 0x9EFD, 0x9734, 0x9B7D, 0x9F25, 0x9D78, + 0x9FD8, 0x9F36, 0xA187, 0x9CD6, 0x9F5C, 0x9DB7, 0xA00E, 0x9B11, + 0x9DC8, 0x9D13, 0x9F95, 0x9926, 0x9D3E, 0x9B56, 0x9DFF, 0x9D4F, + 0x9FE0, 0x9971, 0x9D7D, 0x9FEC, 0x9E55, 0xA0B0, 0x9BC9, 0x9E64, + 0x9DB9, 0xA037, 0x99EF, 0x9DDF, 0x9C0B, 0x9EB7, 0x9E0A, 0xA082, + 0x9B78, 0x9E33, 0x9C62, 0x9F05, 0x999B, 0x9C8D, 0x9BBA, 0x9E86, + 0x9CA1, 0x9F53, 0x99E8, 0x9CCF, 0x9C16, 0x9ED4, 0x97C5, 0x9F9E, + 0x9A4A, 0x9E3B, 0x9C6D, 0x9F22, 0x9991, 0x9C9B, 0x9F48, 0x9EA3, + 0xA00F, 0x9C10, 0x9EC9, 0x9CEF, 0x9F93, 0x9A2A, 0x9D1D, 0x9C67, + 0x9F17, 0x9D48, 0x9FF8, 0x9A8C, 0x9D6E, 0x9CC0, 0x9F7C, 0x9885, + 0x9CE9, 0x9AEE, 0x9DD9, 0x97BD, 0x9B1C, 0x9A5A, 0x9D57, 0x9FFF, + 0x9A86, 0xA0D5, 0x9B93, 0x9E6A, 0x9DA8, 0xA061, 0x9AE8, 0x9DE8, + 0x9D26, 0x9ECF, 0x98EF, 0x9D6B, 0x9B5C, 0x9E53, 0x982F, 0x9B8D, + 0x9ACE, 0x9DD1, 0x9BD0, 0x9EB6, 0x98B5, 0x9BFE, 0x9B45, 0x9E39, + 0x9661, 0x9B73, 0x9E79, 0x9C87, 0x9F58, 0x996E, 0x9CB2, 0x9BE7, + 0x9EDC, 0x98D4, 0x9FCF, 0x9B59, 0x9D35, 0x9C72, 0x9F53, 0x9954, + 0x9CB5, 0x9BE7, 0x9DA0, 0x98BA, 0x9C13, 0x99D6, 0x9D1E, 0x964B, + 0x9A22, 0x993F, 0x9C9B, 0x9E72, 0x9D9E, 0xA08D, 0x9C13, 0x9DF5, + 0x9D1E, 0x9EEC, 0x9A25, 0x9D76, 0x9C99, 0x9E72, 0x998E, 0x9CF6, + 0x9AB9, 0x9DF3, 0x9742, 0x9AFF, 0x9A28, 0x9D76, 0x9B45, 0x9E87, + 0x9979, 0x9CF6, 0x9ABC, 0x9E08, 0x9FC7, 0x9B02, 0x9E48, 0x9D8B, + 0x9F4E, 0x9A74, 0x9DE0, 0x9BA8, 0x9EEE, 0x9E20, 0x9FEE, 0x9B1D, + 0x9E74, 0xA03A, 0x9B7D, 0x9EC6, 0x9CA3, 0x9FC9, 0x9ADA, 0x9CE3, + 0x9C20, 0x9E0F, 0x98B9, 0x9C78, 0x9B95, 0x9D92, 0x981C, 0x9BF5, + 0x9B0F, 0x9D10, 0x975E, 0x9B6F, 0x98DC, 0x9C90, 0x9BB2, 0x9DBF, + 0x983F, 0x9C0D, 0x9991, 0x9D3F, 0x9784, 0x9B87, 0x98F7, 0x9CD7, + 0x94E1, 0x9960, 0x9D31, 0x9C54, 0x9E52, 0x98CE, 0x9CB1, 0x9A2F, + 0x9DF2, 0x9D06, 0x9F0D, 0x999B, 0x9D75, 0x9B08, 0x9EA8, 0x9909, + 0x9B68, 0x9A7C, 0x9E2E, 0x9871, 0x9ADF, 0x99F0, 0x9C35, 0x95DC, + 0x9A53, 0x995E, 0x9BC7, 0x9504, 0x99C7, 0x98CC, 0x9B46, 0x9A42, + 0x9C91, 0x9EB0, 0x9ABD, 0x9D00, 0x9C13, 0x9E50, 0x9A31, 0x9C80, + 0x9BA5, 0x9DD6, 0x99A2, 0x9C1A, 0x9B1F, 0x9D73, 0x9719, 0x9B94, + 0x9A9B, 0x9CF6, 0x9675, 0x9E46, 0x9832, 0x9C76, 0x9B86, 0x9DE1, + 0x9777, 0x9C0D, 0x9AFD, 0x9D69, 0x96D9, 0x9B8A, 0x98A5, 0x9D03, + 0x9635, 0x9926, 0x9D6D, 0x9AC3, 0x9D47, 0x9894, 0x9B53, 0x9A3A, + 0x9CCA, 0x9BDD, 0x9E44, 0x99C8, 0x9C64, 0x9B57, 0x9DCA, 0x9939, + 0x9BE1, 0x9AD6, 0x9D67, 0x98AC, 0x9B60, 0x9A67, 0x9CEC, 0x9814, + 0x9AF7, 0x99DB, 0x9C86, 0x977C, 0x9A6E, 0x994C, 0x9C06, 0x9AFB, + 0x9D9E, 0x98BF, 0x9B9D, 0x9A8F, 0x9D3B, 0x982A, 0x9B1C, 0x9A03, + 0x9CC0, 0x9525, 0x9AB0, 0x997C, 0x9C5A, 0x9475, 0x9A27, 0x98EF, + 0x9BDC, 0x93BF, 0x99A0, 0x960B, 0x9B73, 0x92E2, 0x96D6, 0x9B9C, + 0x98E5, 0x9BE7, 0x9AC7, 0x9D91, 0x9855, 0x9B69, 0x9A40, 0x9D31, + 0x97C2, 0x9AFD, 0x99D1, 0x9CB6, 0x9727, 0x9A79, 0x994A, 0x9C50, + 0x968E, 0x9A0D, 0x98B8, 0x9BEF, 0x95EA, 0x9983, 0x9845, 0x9B86, + 0x9548, 0x98F9, 0x97B0, 0x9B05, 0x94A0, 0x9CFA, 0x971A, 0x9A99, + 0x994D, 0x9C82, 0x967E, 0x9A2D, 0x98E0, 0x9C1C, 0x95E2, 0x99A6, + 0x9850, 0x9BB8, 0x9CCA, 0x9934, 0x9C7E, 0x9B4F, 0x9C58, 0x98A7, + 0x9C03, 0x9AE6, 0x9BF2, 0x9837, 0x9B56, 0x9A7C, 0x9B89, 0x97A4, + 0x9A76, 0x99F8, 0x9B25, 0x99CF, 0x9D3E, 0x98D7, 0x9AB9, 0x9948, + 0x9CDB, 0x9641, 0x9A38, 0x98D3, 0x9C7D, 0x95A2, 0x99CE, 0x9861, + 0x9C17, 0x9500, 0x995C, 0x97D3, 0x9BB3, 0x9455, 0x98EF, 0x975B, + 0x9B67, 0x93A7, 0x9862, 0x9C57, 0x9AFB, 0x9CDA, 0x9CC1, 0x9E5F, + 0x9A97, 0x9C77, 0x9C5E, 0x9E14, 0x9A28, 0x9C16, 0x9BFA, 0x9DCB, + 0x99BE, 0x9BB0, 0x9B94, 0x9D82, 0x994F, 0x9B4C, 0x9B30, 0x9D22, + 0x9185, 0x971B, 0x9AC9, 0x9A07, 0x9B73, 0x96A2, 0x9A48, 0x99B5, + 0x9B0A, 0x99FD, 0x9D9B, 0x9946, 0x9AA3, 0x9976, 0x9D52, 0x98D9, + 0x9A54, 0x98F1, 0x9D09, 0x9869, 0x99EA, 0x9867, 0x9CC0, 0x97F4, + 0x9998, 0x97DC, 0x9C74, 0x9781, 0x9929, 0x973A, 0x9C28, 0x96B8, + 0x98B9, 0x96C4, 0x9BDC, 0x95CE, 0x9864, 0x964B, 0x9B90, 0x915F, + 0x97F4, 0x95CA, 0x9B41, 0x9096, 0x9781, 0x954B, 0x9AF5, 0x8FC9, + 0x970B, 0x94CC, 0x9AA3, 0x8EE8, 0x9A8C, 0x9429, 0x9A54, 0x9868, + 0x9A3A, 0x93A1, 0x9A02, 0x97F8, 0x99ED, 0x9316, 0x99B5, 0x97A5, + 0x999B, 0x9C7C, 0x9963, 0x9B56, 0x9949, 0x9C45, 0x990E, 0x9B07, + 0x98F4, 0x9BF9, 0x98BC, 0x9AD0, 0x989F, 0x9BC2, 0x9864, 0x9A9B, + 0x984F, 0x9B90, 0x9811, 0x9A4C, 0x97F7, 0x9B44, 0x97B9, 0x9A12, + 0x979F, 0x9B0A, 0x9761, 0x99DA, 0x9744, 0x9ABE, 0x9ABC, 0x9CE3, + 0x96EE, 0x9A89, 0x9A6D, 0x9CB1, 0x9693, 0x9A4F, 0x9A33, 0x9C7D, + 0x963A, 0x9A02, 0x99FE, 0x9C46, 0x95DC, 0x99C8, 0x99AC, 0x9BFF, + 0x957B, 0x998E, 0x9972, 0x9BCB, 0x951F, 0x993E, 0x993A, 0x9B94, + 0x94BB, 0x9904, 0x9902, 0x9B5F, 0x945C, 0x98CC, 0x98AD, 0x9B28, + 0x9ACD, 0x93D5, 0x9873, 0x9776, 0x9AC5, 0x936E, 0x9838, 0x9751, + 0x9AB8, 0x9306, 0x9800, 0x9713, 0x9A83, 0x9299, 0x97C0, 0x96F3, + 0x9A49, 0x922E, 0x9785, 0x96CB, 0x9A14, 0x91C3, 0x9732, 0x96A8, + 0x99DF, 0x9152, 0x96F2, 0x9685, 0x99A5, 0x90DC, 0x96B4, 0x9662, + 0x9970, 0x9065, 0x9679, 0x9657, 0x9933, 0x8FEE, 0x9636, 0x9634, + 0x98FE, 0x8F74, 0x95F8, 0x95F1, 0x98C6, 0x8EF4, 0x95BA, 0x95B3, + 0x98A1, 0x8E71, 0x9579, 0x9575, 0x9869, 0x8DE8, 0x953B, 0x9534, + 0x9831, 0x8D5C, 0x9515, 0x94F3, 0x97F6, 0x8CCA, 0x94CF, 0x94B2, + 0x97B9, 0x8C2F, 0x948E, 0x948C, 0x9799, 0x8B8E, 0x944A, 0x9446, + 0x975E, 0x8AE7, 0x9406, 0x9402, 0x9723, 0x8A3C, 0x93E0, 0x93BE, + 0x9700, 0x897A, 0x939C, 0x9395, 0x96C5, 0x88AC, 0x9358, 0x9351, + 0x9685, 0x87D4, 0x932F, 0x930A, 0x9662, 0x86D3, 0x92E8, 0x92E9, + 0x9624, 0x85B9, 0x92A1, 0x929F, 0x9601, 0x8443, 0x927D, 0x9276, + 0x95C3, 0x8221, 0x9236, 0x922F, 0x97EC, 0x7FFF, 0x957F, 0x91E5, + 0x97B4, 0x7FFF, 0x9559, 0x91B9, 0x9794, 0x7FFF, 0x951B, 0x9190, + 0x9759, 0x7FFF, 0x94F5, 0x9148, 0x9739, 0x7FFF, 0x94B7, 0x911F, + 0x96FE, 0x9A52, 0x98CA, 0x9B94, 0x96DB, 0x9A32, 0x98AA, 0x988E, + 0x96B8, 0x9A15, 0x942A, 0x986E, 0x967D, 0x99E0, 0x9404, 0x984E, + 0x965A, 0x99BE, 0x93DE, 0x9816, 0x963A, 0x9989, 0x939F, 0x97F6, + 0x97F2, 0x9969, 0x9379, 0x97D3, 0x97BA, 0x994C, 0x95B3, 0x979E, + 0x9797, 0x9A7A, 0x9595, 0x9779, 0x9777, 0x9A48, 0x9572, 0x98D4, + 0x973C, 0x9A28, 0x954F, 0x98B4, 0x971C, 0x9A0B, 0x950E, 0x9894, + 0x96F9, 0x99D6, 0x94EB, 0x9877, 0x96D9, 0x99B9, 0x94C5, 0x983F, + 0x983D, 0x9999, 0x94A2, 0x981F, 0x981D, 0x9A95, 0x9675, 0x97FF, + 0x97FD, 0x91CF, 0x963A, 0x943C, 0x97C5, 0x91A6, 0x9617, 0x9416, + 0x97A5, 0x9182, 0x95F4, 0x93F0, 0x9785, 0x9156, 0x95D1, 0x95CD, + 0x98C3, 0x912D, 0x95B1, 0x95AC, 0x98A3, 0x93A3, 0x971F, 0x9571, + 0x986E, 0x935F, 0x96FF, 0x954E, 0x984E, 0x9339, 0x96E1, 0x8C9D, + 0x9524, 0x9318, 0x96C1, 0x9060, 0x9506, 0x92F2, 0x969E, 0x9058, + 0x94E3, 0x92C9, 0x97D0, 0x9031, 0x94BD, 0x94B9, 0x97B0, 0x9005, + 0x963D, 0x9498, 0x9790, 0x9276, 0x961A, 0x9475, 0x9770, 0x9250, + 0x95F7, 0x944F, 0x9896, 0x922A, 0x95D4, 0x95D5, 0x985E, 0x9206, + 0x8F57, 0x95B2, 0x93E9, 0x970B, 0x91D6, 0x958F, 0x93C5, 0x981F, + 0x91B2, 0x956C, 0x9552, 0x97FF, 0x9189, 0x96AA, 0x952F, 0x97DF, + 0x9376, 0x968A, 0x9509, 0x97BF, 0x9350, 0x9667, 0x94EB, 0x98B5, + 0x932F, 0x9647, 0x9645, 0x9895, 0x9309, 0x9761, 0x9625, 0x9875, + 0x949F, 0x9741, 0x9602, 0x9962, 0x9479, 0x9721, 0x90B7, 0x95E0, + 0x9456, 0x9832, 0x9293, 0x95BD, 0x95B6, 0x9812, 0x928B, 0x96D8, + 0x9598, 0x97F2, 0x9267, 0x96BD, 0x9578, 0x98CD, 0x93E6, 0x969D, + 0x9696, 0x98AD, 0x93C0, 0x9797, 0x9676, 0x9890, 0x93A2, 0x9779, + 0x9658, 0x8FD5, 0x9509, 0x937A, 0x9755, 0x8FB1, 0x94EB, 0x9372, + 0x9735, 0x919D, 0x960F, 0x94C1, 0x9717, 0x9195, 0x95EC, 0x94A3, + 0x9327, 0x9320, 0x95CC, 0x8F4A, 0x9479, 0x92FF, 0x96D1, 0x8F23, + 0x945B, 0x92D9, 0x96B1, 0x911E, 0x9585, 0x9436, 0x9691, 0x90F5, + 0x9562, 0x9410, 0x9775, 0x9289, 0x9542, 0x9540, 0x9755, 0x9268, + 0x9648, 0x951D, 0x982E, 0x93C6, 0x962A, 0x9626, 0x9811, 0x93A3, + 0x970F, 0x9603, 0x98D1, 0x9382, 0x96EF, 0x95E8, 0x98B4, 0x94B3, + 0x97CB, 0x96CD, 0x95C1, 0x9490, 0x97B0, 0x9330, 0x96A9, 0x959C, + 0x9871, 0x9328, 0x968B, 0x957C, 0x9851, 0x9446, 0x976A, 0x9664, + 0x9836, 0x9423, 0x974D, 0x92DB, 0x9645, 0x9535, 0x980E, 0x92BA, + 0x9622, 0x9512, 0x97F3, 0x93D9, 0x9707, 0x9600, 0x8F63, 0x93D1, + 0x928A, 0x95E0, 0x8F58, 0x94CB, 0x93AC, 0x96C5, 0x90EA, 0x94C3, + 0x938B, 0x96AA, 0x923A, 0x9599, 0x949E, 0x976E, 0x9219, 0x9591, + 0x8EF9, 0x947C, 0x933C, 0x9661, 0x908C, 0x9459, 0x9336, 0x9641, + 0x91C9, 0x954D, 0x9434, 0x970B, 0x91C1, 0x952A, 0x9526, 0x97CC, + 0x92EC, 0x95FD, 0x9508, 0x97B1, 0x93EA, 0x96C7, 0x95DB, 0x985A, + 0x93C7, 0x92A1, 0x95BB, 0x8FE1, 0x94C1, 0x8C34, 0x9279, 0x9143, + 0x949E, 0x8E07, 0x9398, 0x926F, 0x958A, 0x8FA9, 0x9375, 0x9373, + 0x963F, 0x90F0, 0x946D, 0x9350, 0x9637, 0x90E8, 0x9546, 0x9448, + 0x96E9, 0x9201, 0x9523, 0x9521, 0x9795, 0x9303, 0x95F6, 0x9501, + 0x9405, 0x9401, 0x96A8, 0x91CC, 0x94DF, 0x93E3, 0x9688, 0x91A6, + 0x95B2, 0x94BA, 0x9734, 0x92B3, 0x917E, 0x958B, 0x8EC2, 0x93AF, + 0x928E, 0x956D, 0x9016, 0x948B, 0x938A, 0x9625, 0x914C, 0x946B, + 0x9467, 0x96CF, 0x925F, 0x9529, 0x9449, 0x9442, 0x9340, 0x95F4, + 0x9507, 0x8E5C, 0x9322, 0x9213, 0x95D2, 0x8FB0, 0x93FF, 0x9318, + 0x966F, 0x90CE, 0x94D6, 0x93DD, 0x92F3, 0x91DF, 0x9591, 0x8F7B, + 0x93D3, 0x92CE, 0x9641, 0x909C, 0x948F, 0x93AE, 0x9623, 0x9197, + 0x9548, 0x946D, 0x96BD, 0x929C, 0x952A, 0x9526, 0x9764, 0x9364, + 0x9277, 0x9165, 0x9044, 0x943E, 0x8BDE, 0x9252, 0x913D, 0x94FA, + 0x8EE8, 0x9335, 0x922A, 0x94D7, 0x8FF3, 0x93FA, 0x9313, 0x9592, + 0x910B, 0x94B6, 0x93D5, 0x9627, 0x91FB, 0x9493, 0x9491, 0x93B3, + 0x92C9, 0x954E, 0x90C0, 0x946F, 0x93A4, 0x95E6, 0x91B3, 0x9525, + 0x944D, 0x8CE2, 0x929A, 0x91A4, 0x9503, 0x8E28, 0x935F, 0x9272, + 0x94E8, 0x907E, 0x941C, 0x933A, 0x924D, 0x9159, 0x94BF, 0x8DF5, + 0x9318, 0x9243, 0x9572, 0x902E, 0x93D7, 0x930E, 0x960C, 0x9127, + 0x9493, 0x93B5, 0x95EF, 0x91F6, 0x9531, 0x9471, 0x9686, 0x92C4, + 0x91EF, 0x950F, 0x8FD6, 0x9386, 0x8C2B, 0x91C7, 0x90CF, 0x942A, + 0x8E9B, 0x9295, 0x91A7, 0x94E3, 0x8FA1, 0x933F, 0x9270, 0x9565, + 0x90A0, 0x94BA, 0x93FA, 0x95FD, 0x9249, 0x949F, 0x9498, 0x93D5, + 0x930C, 0x95DA, 0x914E, 0x9476, 0x93B3, 0x9671, 0x921A, 0x9514, + 0x9044, 0x9390, 0x92C7, 0x95AE, 0x911C, 0x9434, 0x9387, 0x9630, + 0x91CF, 0x94D2, 0x8FF9, 0x9424, 0x9360, 0x8B48, 0x91C4, 0x8FEC, + 0x9404, 0x8DC6, 0x926F, 0x919C, 0x94A2, 0x8EB7, 0x9319, 0x924F, + 0x9525, 0x909B, 0x93BD, 0x8EAB, 0x9240, 0x916D, 0x945E, 0x8F90, + 0x92EA, 0x92E8, 0x9599, 0x906E, 0x943A, 0x938D, 0x9618, 0x91F6, + 0x911E, 0x9418, 0x8E4D, 0x92A1, 0x8BFB, 0x9114, 0x9035, 0x934B, + 0x8E3C, 0x91CA, 0x90F1, 0x9490, 0x8F29, 0x9321, 0x9273, 0x9515, + 0x90CA, 0x93C3, 0x9318, 0x9592, 0x9194, 0x9464, 0x8FDE, 0x92F5, + 0x9244, 0x8B8A, 0x9098, 0x8FB3, 0x9395, 0x8DB6, 0x921A, 0x914A, + 0x941E, 0x8EA4, 0x92C5, 0x91F8, 0x94A1, 0x9067, 0x93F5, 0x8E93, + 0x92A1, 0x911B, 0x9480, 0x8F5C, 0x932D, 0x927C, 0x9500, 0x90F4, + 0x93C9, 0x9320, 0x8D49, 0x91A2, 0x90EA, 0x9450, 0x8F25, 0x92FA, + 0x8C18, 0x917E, 0x90C0, 0x9383, 0x8E2C, 0x9229, 0x9174, 0x94AF, + 0x8FD7, 0x935F, 0x92B1, 0x952F, 0x914A, 0x93E8, 0x9358, 0x9596, + 0x91F8, 0x950B, 0x906A, 0x93DA, 0x932F, 0x8CD0, 0x91D1, 0x9117, + 0x93B7, 0x8E97, 0x925E, 0x91AC, 0x94C6, 0x9036, 0x9394, 0x92EB, + 0x8C9B, 0x9188, 0x90CD, 0x9374, 0x8E60, 0x9230, 0x8B60, 0x90C3, + 0x8FEC, 0x9366, 0x8E54, 0x920C, 0x9157, 0x9472, 0x8FDB, 0x933D, + 0x9294, 0x94DF, 0x9074, 0x93C6, 0x8EEE, 0x9271, 0x91DB, 0x8B1A, + 0x906B, 0x8FA7, 0x92FC, 0x8D01, 0x91B2, 0x90FF, 0x9380, 0x8EB9, + 0x9241, 0x8CF5, 0x90DA, 0x903A, 0x935C, 0x8E92, 0x921D, 0x9181, + 0x946D, 0x9010, 0x9338, 0x92A5, 0x8CBB, 0x915A, 0x90A4, 0x8F26, + 0x8E5B, 0x91EF, 0x8BAB, 0x9098, 0x8FDF, 0x930A, 0x8E4F, 0x91C8, + 0x912C, 0x9419, 0x8FB5, 0x92E3, 0x9253, 0x91A4, 0x9105, 0x93F5, + 0x8EE9, 0x8DFF, 0x922C, 0x8C4A, 0x90DE, 0x903E, 0x92B6, 0x8DEE, + 0x9173, 0x90D4, 0x93B2, 0x8F5A, 0x9292, 0x8CF6, 0x914C, 0x90AD, + 0x93A4, 0x8F4E, 0x926E, 0x91D5, 0x9497, 0x9086, 0x8FE6, 0x92F0, + 0x8D92, 0x91B1, 0x9117, 0x907D, 0x8FBE, 0x92CF, 0x8D86, 0x91A5, + 0x9055, 0x933D, 0x8EF2, 0x92AB, 0x9215, 0x9433, 0x90E2, 0x932F, + 0x929E, 0x920B, 0x915C, 0x8B98, 0x9022, 0x8F66, 0x9278, 0x8DF7, + 0x9150, 0x909B, 0x9377, 0x8F58, 0x9254, 0x91C0, 0x9465, 0x908F, + 0x9353, 0x8F33, 0x9230, 0x919C, 0x9444, 0x9068, 0x932F, 0x92B5, + 0x9224, 0x8CE2, 0x90F7, 0x9041, 0x9321, 0x8EFA, 0x9200, 0x9169, + 0x93FF, 0x9033, 0x87F8, 0x8E2E, 0x8D62, 0x9148, 0x8AED, 0x9011, + 0x8F6E, 0x9249, 0x8D51, 0x9137, 0x90A0, 0x9343, 0x8F44, 0x923B, + 0x8D29, 0x9113, 0x9079, 0x931F, 0x8F3B, 0x8DD0, 0x9183, 0x8C48, + 0x9052, 0x8FB7, 0x9286, 0x8E6D, 0x915F, 0x8C3C, 0x9046, 0x8FA6, + 0x92EE, 0x8D9A, 0x9153, 0x90BC, 0x9359, 0x8F7F, 0x8EDE, 0x8E37, + 0x8D8A, 0x9095, 0x8A5C, 0x8F5D, 0x8EB4, 0x922E, 0x8D5D, 0x9106, + 0x9085, 0x9310, 0x8EAB, 0x920A, 0x8C86, 0x90F8, 0x9061, 0x92EC, + 0x8E81, 0x8DD7, 0x916B, 0x8C73, 0x903A, 0x8F9F, 0x9253, 0x8E6E, + 0x9144, 0x8C4B, 0x902E, 0x8F8E, 0x92BB, 0x8E4C, 0x91B2, 0x90A4, + 0x9394, 0x8F6C, 0x9297, 0x921F, 0x8CCB, 0x9110, 0x8B55, 0x8F5E, + 0x8F5C, 0x91FB, 0x8D69, 0x90EC, 0x9057, 0x92DD, 0x8F35, 0x91D7, + 0x915C, 0x90CA, 0x9046, 0x9329, 0x8F10, 0x8E85, 0x91B1, 0x8C82, + 0x90B7, 0x8F87, 0x9293, 0x8E5E, 0x91A3, 0x8C5A, 0x9093, 0x8FF9, + 0x9288, 0x8E39, 0x917F, 0x9106, 0x93B9, 0x8FF0, 0x92D5, 0x925D, + 0x8E29, 0x9159, 0x8C22, 0x905F, 0x8FC7, 0x923E, 0x8DFF, 0x914B, + 0x90BC, 0x8B5C, 0x8FA0, 0x8805, 0x8DF6, 0x8DEF, 0x9125, 0x8B31, + 0x8F94, 0x8EF6, 0x9208, 0x8DCA, 0x9101, 0x8BDB, 0x9006, 0x8F6B, + 0x88C4, 0x8DBE, 0x8D11, 0x9061, 0x8B15, 0x8F60, 0x8EC2, 0x8E37, + 0x8D95, 0x90CD, 0x8BA0, 0x8FB9, 0x8F37, 0x9213, 0x8D6A, 0x9122, + 0x90A7, 0x8AD7, 0x8FA9, 0x8876, 0x8DE9, 0x8D5D, 0x9085, 0x8B65, + 0x8F82, 0x8F00, 0x91DF, 0x8DD6, 0x90F1, 0x8BF0, 0x8FF4, 0x8EDB, + 0x8838, 0x8DB4, 0x8D22, 0x9051, 0x8B2C, 0x8F50, 0x8EB2, 0x9198, + 0x8DA1, 0x90A4, 0x8BB7, 0x8FAC, 0x8F27, 0x91FE, 0x8D7C, 0x9110, + 0x9097, 0x8BAA, 0x8F9C, 0x898E, 0x8DF5, 0x8D6C, 0x90EA, 0x8C32, + 0x8F75, 0x8EF2, 0x91B7, 0x8DCC, 0x90C6, 0x904A, 0x8FCE, 0x8F4C, + 0x8952, 0x8E47, 0x8DBE, 0x90B6, 0x8BF7, 0x8FBE, 0x8F3C, 0x91E1, + 0x8D97, 0x9109, 0x8C7C, 0x9014, 0x8F95, 0x91D3, 0x8E12, 0x915C, + 0x90E3, 0x8C52, 0x8F76, 0x8EF1, 0x8E6C, 0x8DE9, 0x90BF, 0x8CD4, + 0x8FE0, 0x8FDE, 0x926C, 0x8E5E, 0x9128, 0x90AF, 0x90B0, 0x8FBA, + 0x8A33, 0x8EBB, 0x8E38, 0x9102, 0x8D24, 0x9010, 0x8F93, 0x9227, + 0x8E92, 0x9155, 0x8CFF, 0x9066, 0x8FEA, 0x9274, 0x8F07, 0x91A5, + 0x8DFF, 0x90B9, 0x8C62, 0x8FDA, 0x8F5D, 0x91F2, 0x8E5B, 0x910C, + 0x90A9, 0x9030, 0x8FB4, 0x922C, 0x8EB5, 0x8E4E, 0x90FC, 0x8D3D, + 0x900A, 0x8F8E, 0x8F2A, 0x8EA5, 0x9136, 0x8D9F, 0x9060, 0x8FE4, + 0x9256, 0x8F01, 0x8E7F, 0x8DFC, 0x8D76, 0x903A, 0x8BD3, 0x8FD0, + 0x8EDB, 0x91D2, 0x8DEC, 0x90FF, 0x8CDC, 0x9023, 0x8FAC, 0x8A97, + 0x8EC6, 0x8DC8, 0x90D9, 0x8CB6, 0x9000, 0x8B06, 0x8F20, 0x8EA0, + 0x9129, 0x8D2F, 0x9053, 0x8FD7, 0x8AF5, 0x8EF7, 0x89C3, 0x8E10, + 0x8D8D, 0x902D, 0x8BED, 0x8F50, 0x8ED1, 0x9151, 0x8DE7, 0x9080, + 0x8C6F, 0x8BDF, 0x8FA2, 0x8A25, 0x8E41, 0x8DBE, 0x90CF, 0x8CCD, + 0x8FF5, 0x8B26, 0x8F18, 0x8E99, 0x9109, 0x8D2D, 0x8CA4, 0x8C31, + 0x8BA4, 0x8EF2, 0x89E6, 0x8E09, 0x8D85, 0x9023, 0x8C0A, 0x8F46, + 0x8A53, 0x8E65, 0x8DE5, 0x871B, 0x8CF2, 0x8C68, 0x8F98, 0x8AD7, + 0x8EBA, 0x8909, 0x8DCE, 0x8CC8, 0x904A, 0x8BCC, 0x8EF8, 0x8E94, + 0x88FB, 0x8DAA, 0x86DB, 0x8CB7, 0x8BA5, 0x8F4A, 0x8A9E, 0x8E6C, + 0x8E02, 0x90D3, 0x8D15, 0x8FA0, 0x8B93, 0x8A74, 0x8E5C, 0x8958, + 0x8D72, 0x8CE9, 0x8FD9, 0x8BF2, 0x8F15, 0x8A62, 0x8E31, 0x8DCA, + 0x8D47, 0x9028, 0x8FC5, 0x91E8, 0x8EED, 0x9133, 0x8DA1, 0x8D1E, + 0x9002, 0x8C29, 0x8F3E, 0x8EC4, 0x8E60, 0x8DF9, 0x90AC, 0x8D0C, + 0x8FEE, 0x8F7A, 0x8B19, 0x8EB5, 0x897C, 0x8DD1, 0x8D67, 0x9027, + 0x8C76, 0x8F68, 0x8E8F, 0x8E88, 0x8E24, 0x9064, 0x8CD3, 0x8CCF, + 0x8F42, 0x8B52, 0x8EDD, 0x8E00, 0x8D99, 0x8D13, 0x904E, 0x8C3B, + 0x8F1D, 0x8EB6, 0x8A21, 0x8DD8, 0x87EC, 0x8D04, 0x8C80, 0x8F6A, + 0x8B19, 0x8E8F, 0x8E28, 0x8DC3, 0x8D43, 0x8732, 0x8C6E, 0x8B7B, + 0x8EE1, 0x8A77, 0x8E00, 0x8D9B, 0x8D34, 0x8C45, 0x8F7B, 0x8BD5, + 0x8AD9, 0x8E55, 0x893C, 0x8D73, 0x877E, 0x8C9C, 0x8C34, 0x8EF5, + 0x8AB0, 0x8E2D, 0x8DC6, 0x8D5F, 0x8C78, 0x862D, 0x8B9A, 0x8B9B, + 0x8E7F, 0x8995, 0x8D9E, 0x8D34, 0x8CCF, 0x8C62, 0x8F1C, 0x8B00, + 0x8A70, 0x8DF3, 0x88E9, 0x8D0E, 0x8725, 0x8C39, 0x8BC9, 0x8E91, + 0x8A5E, 0x8DCB, 0x8D64, 0x883C, 0x8C95, 0x85DB, 0x8BA3, 0x8B32, + 0x8E1E, 0x89BB, 0x8D3C, 0x8CD4, 0x8C6A, 0x8BFF, 0x8F18, 0x8A97, + 0x8A23, 0x8DF4, 0x8914, 0x8D26, 0x8779, 0x8BD4, 0x8B66, 0x8E8F, + 0x89F5, 0x8DCC, 0x8D65, 0x87EE, 0x8C96, 0x86BD, 0x8BC0, 0x8AC9, + 0x8E08, 0x89E1, 0x8D3D, 0x8CD8, 0x8F65, 0x8C03, 0x8EBC, 0x8B27, + 0x8E56, 0x8DF5, 0x9052, 0x8D29, 0x8CC2, 0x8C5A, 0x8B6A, 0x8E90, + 0x8A8D, 0x8DCD, 0x8D66, 0x8FE3, 0x8C97, 0x8F83, 0x8BC4, 0x8B59, + 0x8E69, 0x89ED, 0x8DA0, 0x8D3C, 0x8C74, 0x8C06, 0x8EFE, 0x8B2D, + 0x8ABF, 0x8DDD, 0x89D7, 0x8D2D, 0x8854, 0x8CC1, 0x8BF3, 0x8ED7, + 0x8B1A, 0x8E2B, 0x89AB, 0x8936, 0x8D00, 0x8840, 0x8C31, 0x8BC6, + 0x8E67, 0x8A80, 0x8E04, 0x899A, 0x8D3B, 0x8C70, 0x8790, 0x8B9B, + 0x8B30, 0x8AC4, 0x8A53, 0x8D75, 0x88F6, 0x8CC5, 0x8C5D, 0x8F19, + 0x8B8A, 0x8489, 0x8AAE, 0x8A3F, 0x8D64, 0x8956, 0x8C98, 0x8C33, + 0x8BCB, 0x8B5D, 0x8E49, 0x8A13, 0x899F, 0x8D38, 0x88B5, 0x8C6E, + 0x869B, 0x8B9E, 0x8AE0, 0x8E22, 0x8A6D, 0x8D72, 0x8889, 0x880B, + 0x8C44, 0x8687, 0x8B88, 0x8B1F, 0x8E0C, 0x89D2, 0x8D49, 0x88E9, + 0x886E, 0x8C2E, 0x86F7, 0x8B5D, 0x8AF2, 0x8A17, 0x89A5, 0x8D1F, + 0x8842, 0x8C69, 0x8C04, 0x8645, 0x8AE3, 0x83E7, 0x8A70, 0x89FF, + 0x8D09, 0x88A7, 0x8C3F, 0x8BDA, 0x8B88, 0x8B1D, 0x8467, 0x8A43, + 0x8964, 0x8D42, 0x8877, 0x8C2E, 0x8703, 0x8BC2, 0x8AF0, 0x8E24, + 0x8D7E, 0x89C0, 0x8D18, 0x8CB6, 0x8F01, 0x8C00, 0x8B97, 0x8ADF, + 0x8A71, 0x8DAF, 0x8993, 0x8CEE, 0x8CA0, 0x8C3B, 0x8BD3, 0x863B, + 0x8B19, 0x8AB3, 0x8D88, 0x8965, 0x8CDB, 0x8909, 0x8C77, 0x8BA9, + 0x8E67, 0x8B58, 0x8A86, 0x8A1A, 0x89C2, 0x8CFB, 0x88DE, 0x8C4A, + 0x8BE5, 0x8E81, 0x8B2E, 0x84E5, 0x8A6E, 0x8A02, 0x8CE7, 0x88B0, + 0x8C81, 0x87DC, 0x8BD0, 0x8B01, 0x8E10, 0x8AAD, 0x89D4, 0x8D07, + 0x890D, 0x8C57, 0x87AB, 0x8C07, 0x8B3B, 0x8E41, 0x8A83, 0x842B, + 0x89BF, 0x8950, 0x8C90, 0x880E, 0x8BDC, 0x871D, 0x8B28, 0x8ABD, + 0x83F4, 0x89FF, 0x8990, 0x8CC4, 0x8855, 0x8C16, 0x86EC, 0x8B62, + 0x8AF7, 0x8DA9, 0x8A3C, 0x834B, 0x890D, 0x8908, 0x8C4D, 0x8752, + 0x8B38, 0x8B36, 0x8A80, 0x8A79, 0x8316, 0x8950, 0x8949, 0x8C23, + 0x8810, 0x8B6F, 0x86A1, 0x8B07, 0x8AB5, 0x8D50, 0x8990, 0x898B, + 0x88AC, 0x8856, 0x8BF3, 0x870D, 0x8B44, 0x8A8E, 0x8A87, 0x89CD, + 0x8381, 0x8908, 0x8907, 0x8C2C, 0x87C8, 0x8B7B, 0x865E, 0x8AC6, + 0x8A5A, 0x8D56, 0x899C, 0x8947, 0x88D5, 0x8811, 0x8BB2, 0x86C2, + 0x8B00, 0x8AFB, 0x8A48, 0x8A41, 0x832F, 0x8918, 0x88AB, 0x8C33, + 0x8766, 0x8B84, 0x8690, 0x8ACD, 0x8A19, 0x8D02, 0x8958, 0x8CB5, + 0x8893, 0x8C07, 0x8BA4, 0x8751, 0x8B09, 0x8B05, 0x8A51, 0x8A50, + 0x8CD5, 0x8927, 0x8C85, 0x8BDE, 0x8798, 0x8B8B, 0x86C0, 0x8ADC, + 0x8A25, 0x8D4D, 0x89CF, 0x8CA5, 0x8910, 0x8832, 0x8C0C, 0x8763, + 0x8B13, 0x8630, 0x8A5E, 0x8A5C, 0x8CD9, 0x89A1, 0x88E1, 0x8874, + 0x881E, 0x8B97, 0x874F, 0x8AE5, 0x8AE1, 0x8A30, 0x89DE, 0x83A3, + 0x891F, 0x891B, 0x8BBA, 0x87EA, 0x8B67, 0x86C0, 0x8AB5, 0x8A66, + 0x8564, 0x89B0, 0x8941, 0x88F1, 0x8898, 0x8BE8, 0x87D0, 0x8B3C, + 0x8AED, 0x862C, 0x8A38, 0x84CE, 0x89E4, 0x892A, 0x8C08, 0x8867, + 0x8BBA, 0x879F, 0x8745, 0x8ABD, 0x85FB, 0x8A0A, 0x851B, 0x89B6, + 0x88FC, 0x8BDB, 0x88A4, 0x87E0, 0x8716, 0x8717, 0x8A8F, 0x85C9, + 0x8A3E, 0x898A, 0x8988, 0x8933, 0x81FE, 0x8873, 0x881B, 0x8B5E, + 0x8754, 0x8AC3, 0x85AF, 0x8A10, 0x89BE, 0x83E0, 0x8905, 0x82E6, + 0x88AD, 0x87EC, 0x8B2E, 0x8723, 0x8A95, 0x85F5, 0x851A, 0x8990, + 0x8430, 0x893C, 0x8881, 0x887C, 0x8827, 0x8B61, 0x8760, 0x870A, + 0x8A63, 0x8561, 0x8A12, 0x847D, 0x890E, 0x890C, 0x8BC9, 0x87F8, + 0x87A5, 0x8B32, 0x86D6, 0x8A38, 0x8A33, 0x85A3, 0x8994, 0x8993, + 0x88DE, 0x8888, 0x8B9A, 0x8831, 0x8B02, 0x8B00, 0x8714, 0x8A67, + 0x85E9, 0x89B2, 0x8965, 0x8C5A, 0x890E, 0x8BC8, 0x8800, 0x87AA, + 0x8AD5, 0x86E3, 0x8A84, 0x85B5, 0x89E8, 0x89E7, 0x847A, 0x88E0, + 0x829C, 0x888E, 0x87D0, 0x8AEF, 0x8723, 0x8A9F, 0x8656, 0x85F7, + 0x8A04, 0x84C4, 0x8968, 0x88B0, 0x8860, 0x885B, 0x8B68, 0x87B5, + 0x86F0, 0x8A72, 0x8695, 0x89D9, 0x8566, 0x8985, 0x8938, 0x88E5, + 0x88E4, 0x82CF, 0x87D3, 0x8782, 0x8AEB, 0x8727, 0x8A9D, 0x8605, + 0x85A8, 0x8955, 0x84D1, 0x8904, 0x8388, 0x8861, 0x880E, 0x8B08, + 0x874B, 0x86F4, 0x869B, 0x85CF, 0x8A1F, 0x8570, 0x8924, 0x8437, + 0x8881, 0x887D, 0x827A, 0x87D7, 0x8786, 0x8782, 0x8668, 0x8A3A, + 0x860F, 0x89A3, 0x899F, 0x847C, 0x8905, 0x8333, 0x87FA, 0x87FB, + 0x8AED, 0x874F, 0x8A9F, 0x86A2, 0x86A3, 0x89BF, 0x857D, 0x896E, + 0x8444, 0x88D1, 0x8881, 0x8290, 0x882F, 0x8125, 0x871D, 0x86C4, + 0x8A27, 0x8616, 0x898B, 0x85B5, 0x84E8, 0x88EC, 0x8427, 0x889B, + 0x884B, 0x87F8, 0x87A4, 0x8A89, 0x868F, 0x8638, 0x89EF, 0x85DC, + 0x8958, 0x8525, 0x88BB, 0x83EC, 0x8867, 0x8816, 0x8AEB, 0x8773, + 0x8771, 0x871B, 0x86C7, 0x89C0, 0x85A7, 0x896F, 0x84F3, 0x88D5, + 0x8888, 0x83CF, 0x87E5, 0x87E3, 0x8790, 0x873A, 0x8A6B, 0x8692, + 0x8639, 0x863A, 0x85E3, 0x893C, 0x852C, 0x88A2, 0x8852, 0x8816, + 0x87AC, 0x82C9, 0x8757, 0x8706, 0x86AF, 0x8659, 0x89A2, 0x85AB, + 0x8551, 0x8920, 0x84F5, 0x88CC, 0x843A, 0x887D, 0x882A, 0x87DC, + 0x878C, 0x81BA, 0x8737, 0x86E3, 0x89B7, 0x8574, 0x8937, 0x84BD, + 0x84BB, 0x88E4, 0x8400, 0x8847, 0x833B, 0x87F5, 0x87A4, 0x8A64, + 0x86FE, 0x7F93, 0x8659, 0x8602, 0x894C, 0x8551, 0x88FE, 0x84F5, + 0x8498, 0x8862, 0x8301, 0x87BF, 0x8235, 0x876C, 0x871C, 0x89E3, + 0x8672, 0x7EFB, 0x85C7, 0x8570, 0x8913, 0x84BE, 0x88C2, 0x8403, + 0x83A2, 0x87DA, 0x82DD, 0x8739, 0x811F, 0x86E4, 0x8690, 0x89AD, + 0x85E5, 0x858E, 0x8537, 0x84DD, 0x88DD, 0x8425, 0x888B, 0x8366, + 0x8305, 0x87A0, 0x823A, 0x86FF, 0x86A9, 0x8658, 0x8604, 0x8974, + 0x8570, 0x8516, 0x8517, 0x84BA, 0x88A1, 0x83FF, 0x8852, 0x8802, + 0x8262, 0x8764, 0x8195, 0x86C2, 0x866F, 0x8635, 0x85E1, 0x893B, + 0x88F1, 0x8584, 0x886E, 0x886C, 0x8478, 0x881D, 0x8369, 0x87CE, + 0x877B, 0x872D, 0x86DC, 0x89D0, 0x864F, 0x864D, 0x894F, 0x85F5, + 0x8903, 0x8549, 0x8869, 0x8833, 0x83E7, 0x8832, 0x832B, 0x8794, + 0x8744, 0x86F6, 0x86A2, 0x80C8, 0x8667, 0x8662, 0x860E, 0x85BA, + 0x8912, 0x850F, 0x84B5, 0x882E, 0x8402, 0x87F6, 0x8305, 0x87A6, + 0x87A5, 0x8754, 0x86B5, 0x81DA, 0x862D, 0x8628, 0x8624, 0x8625, + 0x88DC, 0x852A, 0x84D3, 0x8478, 0x841E, 0x87F1, 0x83DC, 0x87B9, + 0x876E, 0x8321, 0x871C, 0x81FC, 0x867A, 0x863E, 0x863F, 0x85EB, + 0x7F0C, 0x8595, 0x853E, 0x8494, 0x8453, 0x884F, 0x83FA, 0x87B7, + 0x839A, 0x833C, 0x8731, 0x8223, 0x86DC, 0x868E, 0x863D, 0x8603, + 0x7FC9, 0x85FD, 0x85A9, 0x8554, 0x8503, 0x884A, 0x846B, 0x8467, + 0x8412, 0x840D, 0x8778, 0x82FE, 0x86F1, 0x86EF, 0x86EB, 0x869D, + 0x8191, 0x85C3, 0x85C1, 0x85BF, 0x85BB, 0x88A2, 0x84C2, 0x8485, + 0x842A, 0x8429, 0x878A, 0x83CF, 0x8787, 0x82BA, 0x8279, 0x86B2, + 0x8213, 0x86AC, 0x86AD, 0x860D, 0x85B9, 0x7F3B, 0x8580, 0x857B, + 0x852A, 0x84D2, 0x881A, 0x843E, 0x8814, 0x843A, 0x838C, 0x8748, + 0x8294, 0x8742, 0x828D, 0x8671, 0x866D, 0x861C, 0x861D, 0x8923, + 0x8578, 0x853B, 0x853C, 0x853A, 0x8858, 0x843B, 0x87C3, 0x83FC, + 0x83F8, 0x8789, 0x8345, 0x8705, 0x82A6, 0x86B5, 0x86B1, 0x81E7, + 0x8615, 0x80E0, 0x85DC, 0x85D7, 0x8899, 0x84FA, 0x7E54, 0x84F9, + 0x84F4, 0x87D0, 0x840D, 0x87CA, 0x83B6, 0x83B4, 0x8747, 0x82C2, + 0x86F5, 0x8262, 0x8673, 0x8671, 0x813F, 0x861C, 0x80F6, 0x8594, + 0x8592, 0x8889, 0x853F, 0x7F03, 0x84B3, 0x84AE, 0x8806, 0x8405, + 0x8788, 0x836D, 0x836E, 0x8737, 0x82B7, 0x86B5, 0x8275, 0x86B2, + 0x8664, 0x8116, 0x85DC, 0x810D, 0x85D6, 0x8552, 0x84FE, 0x84FC, + 0x7F28, 0x84F6, 0x846B, 0x8467, 0x8415, 0x8778, 0x837F, 0x837E, + 0x8323, 0x8324, 0x86F1, 0x8231, 0x8655, 0x8228, 0x8226, 0x861B, + 0x8126, 0x8596, 0x8125, 0x858D, 0x853E, 0x7FAC, 0x84B0, 0x7FA8, + 0x84AF, 0x84AB, 0x8768, 0x83CB, 0x7B51, 0x83C5, 0x8334, 0x86E4, + 0x82DA, 0x86DE, 0x82D3, 0x81E2, 0x8657, 0x81DB, 0x85D5, 0x80DB, + 0x8582, 0x857E, 0x80D2, 0x84F8, 0x7FC4, 0x84F2, 0x84F0, 0x8466, + 0x8464, 0x7E2F, 0x840B, 0x840C, 0x837E, 0x8379, 0x86CE, 0x8376, + 0x828E, 0x864D, 0x8285, 0x8644, 0x8645, 0x818F, 0x85C0, 0x8189, + 0x85BA, 0x85B8, 0x883B, 0x8532, 0x7F74, 0x84E2, 0x8458, 0x87BA, + 0x8451, 0x7E4D, 0x844E, 0x83C0, 0x873A, 0x83BD, 0x86B8, 0x832A, + 0x82D5, 0x82D0, 0x82CC, 0x8631, 0x8238, 0x862E, 0x822F, 0x813C, + 0x85AA, 0x8136, 0x85A1, 0x8095, 0x851E, 0x8519, 0x802F, 0x8491, + 0x7F81, 0x848D, 0x8489, 0x8724, 0x83FF, 0x7E5D, 0x83A9, 0x83A7, + 0x86A0, 0x8317, 0x869A, 0x8311, 0x827F, 0x8619, 0x8279, 0x8612, + 0x81E2, 0x8593, 0x858E, 0x8180, 0x858B, 0x80E2, 0x8505, 0x80DC, + 0x8039, 0x84FD, 0x8039, 0x8477, 0x7F2A, 0x8471, 0x846F, 0x7E06, + 0x83E6, 0x7E05, 0x83DD, 0x83DE, 0x86B6, 0x8351, 0x7B87, 0x8348, + 0x82BC, 0x862F, 0x8265, 0x85F6, 0x81CB, 0x81C7, 0x85A5, 0x81C6, + 0x856F, 0x8129, 0x8568, 0x8567, 0x8083, 0x84E4, 0x8080, 0x84DE, + 0x7F7A, 0x8455, 0x8456, 0x7ECA, 0x844F, 0x7EC4, 0x83C6, 0x83C1, + 0x86C9, 0x83BE, 0x7CE2, 0x8334, 0x832D, 0x8645, 0x829F, 0x860A, + 0x8299, 0x829A, 0x8605, 0x8201, 0x8588, 0x8200, 0x81FB, 0x8580, + 0x8164, 0x84FA, 0x80C7, 0x84F7, 0x84F5, 0x8064, 0x846F, 0x7FC2, + 0x846C, 0x7FBC, 0x8430, 0x83E1, 0x83DF, 0x83DA, 0x86D6, 0x83A1, + 0x7E5A, 0x834D, 0x8348, 0x8655, 0x830F, 0x7C7A, 0x8306, 0x82B6, + 0x8615, 0x8274, 0x85CA, 0x8273, 0x826E, 0x8593, 0x81DB, 0x858A, + 0x81DA, 0x8589, 0x8143, 0x813E, 0x8505, 0x8138, 0x84FF, 0x80A0, + 0x809B, 0x847A, 0x8098, 0x8476, 0x7FF6, 0x83F0, 0x83EE, 0x7F53, + 0x83E8, 0x7F4A, 0x83AC, 0x83AD, 0x83AB, 0x8359, 0x7DF0, 0x831C, + 0x831B, 0x8319, 0x8314, 0x8605, 0x8311, 0x7BFF, 0x8281, 0x8282, + 0x85CA, 0x81F1, 0x7B2A, 0x81EB, 0x81EC, 0x8545, 0x8155, 0x8542, + 0x8151, 0x814D, 0x84BD, 0x80B8, 0x84BA, 0x80B1, 0x84B3, 0x8071, + 0x806C, 0x8479, 0x7FD1, 0x842B, 0x7FC8, 0x7FC6, 0x83F0, 0x7FC2, + 0x83EA, 0x7F20, 0x83E6, 0x83E2, 0x7F1B, 0x835B, 0x7E6F, 0x8357, + 0x8356, 0x8354, 0x82C9, 0x7DBB, 0x82C8, 0x82C3, 0x8289, 0x8287, + 0x7C46, 0x8283, 0x7C42, 0x81F3, 0x81F4, 0x85A3, 0x81ED, 0x7AAB, + 0x81EA, 0x81E8, 0x851F, 0x81E2, 0x851E, 0x8151, 0x814F, 0x8499, + 0x80BA, 0x8496, 0x80B4, 0x845D, 0x8073, 0x806F, 0x8458, 0x806E, + 0x8451, 0x7FD0, 0x7FD1, 0x83CF, 0x7FCA, 0x83C9, 0x7FC7, 0x83C5, + 0x83C1, 0x83C2, 0x83C0, 0x83BB, 0x7F21, 0x8335, 0x7E78, 0x8334, + 0x832F, 0x85F4, 0x82F6, 0x7DC7, 0x82EF, 0x82EE, 0x82EF, 0x8266, + 0x7D7A, 0x8260, 0x8261, 0x825C, 0x8258, 0x8534, 0x8257, 0x7CB8, + 0x8251, 0x8252, 0x8528, 0x81C4, 0x7B37, 0x81BE, 0x81BC, 0x851D, + 0x81B6, 0x84A0, 0x8179, 0x8125, 0x8121, 0x80E8, 0x8494, 0x80E2, + 0x80E0, 0x80DE, 0x80DA, 0x8489, 0x80D9, 0x8485, 0x80D0, 0x80D1, + 0x8406, 0x803C, 0x8400, 0x8038, 0x8033, 0x8032, 0x8033, 0x83F4, + 0x802A, 0x83F1, 0x7F94, 0x7F92, 0x836B, 0x7F4C, 0x8368, 0x7F4B, + 0x7F49, 0x8360, 0x7F43, 0x835C, 0x7EA3, 0x8323, 0x7E9D, 0x7E9E, + 0x831E, 0x7E97, 0x82CC, 0x7E94, 0x8293, 0x8294, 0x7E8C, 0x828B, + 0x7E8B, 0x828A, 0x8286, 0x7DE3, 0x8285, 0x7DDD, 0x827C, 0x827D, + 0x827B, 0x81F5, 0x7CE9, 0x81EF, 0x7CE3, 0x81EB, 0x81E7, 0x7CDD, + 0x81E6, 0x7CDA, 0x81DF, 0x81DE, 0x81DF, 0x81DA, 0x7CD1, 0x81D7, + 0x81D5, 0x8149, 0x814A, 0x7C14, 0x8143, 0x7C14, 0x8140, 0x813E, + 0x84B4, 0x8138, 0x7C08, 0x8134, 0x8132, 0x8131, 0x812F, 0x7AF9, + 0x8129, 0x8127, 0x815C, 0x815D, 0x8455, 0x8156, 0x80CA, 0x80CB, + 0x80C9, 0x80C4, 0x80C3, 0x8446, 0x80C2, 0x83C9, 0x80B9, 0x80BA, + 0x80B8, 0x80B3, 0x83C0, 0x80B3, 0x80AE, 0x80AC, 0x80AB, 0x83E5, + 0x8019, 0x83E4, 0x8018, 0x8013, 0x83DC, 0x8010, 0x83D6, 0x800C, + 0x8008, 0x8006, 0x8007, 0x8352, 0x7FFE, 0x8382, 0x7FFD, 0x8035, + 0x837D, 0x802F, 0x8374, 0x802B, 0x8029, 0x8028, 0x7F9A, 0x836E, + 0x7F93, 0x7F8F, 0x7F90, 0x7F8E, 0x8318, 0x7F88, 0x8314, 0x7F87, + 0x7F82, 0x830F, 0x7F7F, 0x8309, 0x7FB5, 0x7FB4, 0x7FB2, 0x7FB0, + 0x8333, 0x7FAA, 0x8330, 0x7FA9, 0x7FA4, 0x835B, 0x7F0E, 0x8357, + 0x7F0E, 0x7F0C, 0x7F07, 0x7F43, 0x82D1, 0x7F3C, 0x7F3B, 0x7F39, + 0x7F3A, 0x82F9, 0x7F31, 0x82F8, 0x7F30, 0x7F66, 0x7F67, 0x7F68, + 0x831D, 0x7F5F, 0x7F5D, 0x7F5E, 0x7F5C, 0x8299, 0x7F93, 0x8293, + 0x7F8C, 0x7F8B, 0x82C1, 0x7EF5, 0x82BD, 0x7EF4, 0x7EF2, 0x7EED, + 0x7EEC, 0x82E5, 0x7F23, 0x7731, 0x7F22, 0x7F20, 0x830C, 0x7F1A, + 0x830C, 0x7F50, 0x7F4F, 0x7F4D, 0x7F4B, 0x82B6, 0x7F82, 0x7F80, + 0x7F7E, 0x7F7A, 0x82E0, 0x7F79, 0x82DA, 0x7FAD, 0x7FAB, 0x7FA9, + 0x7FA7, 0x8304, 0x7FDE, 0x7F13, 0x7F14, 0x7F0F, 0x82B1, 0x7F46, + 0x7F44, 0x82AC, 0x7F3E, 0x7F79, 0x7F77, 0x7F73, 0x8304, 0x7F72, + 0x8303, 0x7FA6, 0x7FA4, 0x7FA2, 0x7FD7, 0x8328, 0x7FD7, 0x7FD2, + 0x8008, 0x8006, 0x82D7, 0x8002, 0x7A3E, 0x8036, 0x8037, 0x7F72, + 0x7F70, 0x832C, 0x7FA4, 0x7FA2, 0x7FD7, 0x7FD6, 0x8353, 0x7FD2, + 0x7AB9, 0x8006, 0x8007, 0x8002, 0x8037, 0x7AF8, 0x8037, 0x7B39, + 0x8067, 0x8063, 0x7B34, 0x8099, 0x7B78, 0x8093, 0x80C5, 0x805B, + 0x8007, 0x7BAE, 0x803E, 0x7BEF, 0x8037, 0x806A, 0x7C2B, 0x8069, + 0x7C2A, 0x8099, 0x8098, 0x7C66, 0x80CB, 0x7CA4, 0x80FB, 0x7CA0, + 0x7C9B, 0x812A, 0x7CDC, 0x8126, 0x7D13, 0x80B8, 0x809F, 0x7D4F, + 0x80D2, 0x7C70, 0x8102, 0x7CAA, 0x7CA9, 0x8131, 0x7CE6, 0x8161, + 0x7CE0, 0x7D22, 0x818F, 0x7D59, 0x8189, 0x7D56, 0x8152, 0x7D90, + 0x7D8E, 0x816B, 0x7DC5, 0x8198, 0x7DFD, 0x7DFE, 0x7E37, 0x7E38, + 0x81F4, 0x7E6F, 0x7EA2, 0x7EA3, 0x7ED9, 0x81EB, 0x7E9B, 0x76F1, + 0x7E0A, 0x7E43, 0x7E41, 0x7E77, 0x822E, 0x7EAE, 0x7EAF, 0x7EE4, + 0x7EE3, 0x8256, 0x7F16, 0x7982, 0x7F4D, 0x7F80, 0x7F81, 0x7FB6, + 0x7A59, 0x7FB0, 0x7A55, 0x7F78, 0x7F3F, 0x82B8, 0x7F58, 0x7B1B, + 0x7FC2, 0x7B59, 0x7FF6, 0x7FF4, 0x8026, 0x8025, 0x7BD7, 0x808C, + 0x7C56, 0x8052, 0x8053, 0x7B6D, 0x8016, 0x7BAB, 0x8068, 0x7BE9, + 0x7C2C, 0x80CA, 0x7C64, 0x80F8, 0x7C9E, 0x80F7, 0x80F2, 0x7D15, + 0x80BE, 0x7D4D, 0x80D4, 0x7D87, 0x7DC3, 0x8136, 0x7DF7, 0x8196, + 0x7DB9, 0x7D7C, 0x7D78, 0x7D9B, 0x815D, 0x7DCF, 0x7864, 0x7E41, + 0x7E3F, 0x7E78, 0x7EAE, 0x793F, 0x7EDF, 0x7F17, 0x7EDE, 0x7EDC, + 0x787B, 0x7E9E, 0x7913, 0x7EF2, 0x7F2A, 0x7F28, 0x7F5B, 0x79E1, + 0x7FC2, 0x7A6B, 0x7FC2, 0x7FBD, 0x7AEF, 0x7F83, 0x7B6F, 0x7FD5, + 0x7BAD, 0x7BEA, 0x803B, 0x7C66, 0x8068, 0x7C9B, 0x7C5B, 0x802F, + 0x7C1C, 0x8048, 0x7C3E, 0x7C77, 0x7CB4, 0x7CF0, 0x80D8, 0x7D5F, + 0x76A1, 0x7DD1, 0x7DD0, 0x7DCE, 0x7D91, 0x817F, 0x7D8E, 0x787C, + 0x7DE4, 0x7E1D, 0x8146, 0x7E89, 0x77B1, 0x7EBD, 0x7EBB, 0x7E82, + 0x7E80, 0x7925, 0x7E9C, 0x79B3, 0x7F3E, 0x7F6E, 0x7A7A, 0x7F6D, + 0x7B3C, 0x7F67, 0x7BBC, 0x7B79, 0x7FB4, 0x7B75, 0x801C, 0x7B56, + 0x7B93, 0x8014, 0x7C0F, 0x7FFB, 0x7CC3, 0x8090, 0x7CF7, 0x7CF6, + 0x808B, 0x7CB7, 0x8088, 0x7D11, 0x7D4A, 0x7DBB, 0x7DF4, 0x8130, + 0x80FE, 0x7DEC, 0x80FA, 0x7DAE, 0x7E06, 0x7E3C, 0x7EA9, 0x816F, + 0x7EA5, 0x7945, 0x7E9F, 0x7EA0, 0x7EBD, 0x7F27, 0x7B17, 0x7F58, + 0x7B13, 0x7F52, 0x7F50, 0x7ACF, 0x7F9F, 0x7BAA, 0x8007, 0x7C62, + 0x7C5D, 0x7FCB, 0x7C59, 0x804B, 0x7C3A, 0x7C77, 0x7CEB, 0x7D5C, + 0x8040, 0x7D59, 0x7662, 0x7D1A, 0x7D3B, 0x7DAC, 0x7E17, 0x7907, + 0x7E16, 0x7906, 0x7E12, 0x7E0E, 0x78B8, 0x7ECD, 0x79F4, 0x7EC9, + 0x7EC7, 0x7AB5, 0x7EE3, 0x7AB1, 0x7F7C, 0x7AD1, 0x7B4C, 0x7F43, + 0x7C04, 0x7FF8, 0x7BFE, 0x7BC0, 0x7BBC, 0x7C59, 0x800E, 0x7D04, + 0x76C7, 0x7CC5, 0x7CC3, 0x7CE1, 0x7D8D, 0x80E1, 0x7DBE, 0x781A, + 0x7D86, 0x7DA4, 0x7E46, 0x7E79, 0x78E6, 0x7E3E, 0x7994, 0x7E5C, + 0x7EF8, 0x7A9A, 0x7EF4, 0x7A93, 0x7EBC, 0x7B33, 0x7BAC, 0x7F73, + 0x7BAB, 0x7F6D, 0x7BA4, 0x7C3C, 0x7CAE, 0x7CAF, 0x7FE8, 0x7C70, + 0x76B5, 0x7D72, 0x7D6D, 0x7D34, 0x7D35, 0x7745, 0x7DF8, 0x7965, + 0x7DF1, 0x7DF0, 0x795C, 0x7E75, 0x797F, 0x7E74, 0x7E72, 0x7A80, + 0x7F2B, 0x7A7F, 0x7F24, 0x7B93, 0x7B91, 0x7FA1, 0x7B52, 0x7FA0, + 0x7C5F, 0x7C5D, 0x7C59, 0x7C5A, 0x7FE2, 0x7D21, 0x76A3, 0x7D1D, + 0x781C, 0x7DA9, 0x7DA7, 0x7DA2, 0x7DA1, 0x7990, 0x7E60, 0x794A, + 0x7E28, 0x7E23, 0x7A6E, 0x7ED9, 0x7A6A, 0x7EA2, 0x7B7F, 0x7B7D, + 0x7F24, 0x7B3E, 0x7F1E, 0x7C47, 0x7C0D, 0x7C09, 0x7C9D, 0x8017, + 0x7CD1, 0x76BA, 0x7CCE, 0x7D93, 0x7D59, 0x7D58, 0x784E, 0x7E12, + 0x797E, 0x7DDA, 0x797B, 0x7A9C, 0x7E94, 0x7A9B, 0x7E5C, 0x7B6D, + 0x7B6C, 0x7B6D, 0x7B2C, 0x7F5A, 0x7BFE, 0x75A6, 0x7BFA, 0x7CC4, + 0x7CC2, 0x7CC0, 0x774F, 0x7D4C, 0x7748, 0x7D45, 0x7D44, 0x7888, + 0x7DCC, 0x79B2, 0x7DC6, 0x79B2, 0x7A8D, 0x7E49, 0x7A8D, 0x7ECA, + 0x7B5F, 0x7B5D, 0x7B23, 0x7B1E, 0x7F12, 0x7BED, 0x768C, 0x7C79, + 0x7C78, 0x7C79, 0x7C77, 0x77D3, 0x7D00, 0x78C5, 0x7DBD, 0x7D87, + 0x78C3, 0x7D83, 0x79A7, 0x7E05, 0x7A84, 0x7A82, 0x7E85, 0x7B52, + 0x7F04, 0x7B51, 0x7B11, 0x7BE1, 0x7BDF, 0x7F48, 0x7C6C, 0x771B, + 0x7C68, 0x7CF6, 0x7CF1, 0x7CF0, 0x780E, 0x7D78, 0x78FD, 0x7D72, + 0x7DF9, 0x79DC, 0x7DC0, 0x7AB5, 0x7E42, 0x7A73, 0x7B47, 0x7EC2, + 0x7B41, 0x7F0C, 0x7BD1, 0x7BD2, 0x7C60, 0x7C5E, 0x7F82, 0x7CE7, + 0x7852, 0x7CE4, 0x7D6B, 0x7D69, 0x7D36, 0x7935, 0x7DB8, 0x79D6, + 0x79D1, 0x7E35, 0x7AA5, 0x7AA6, 0x7E81, 0x7B39, 0x7EFC, 0x7BC7, + 0x7BC8, 0x7C56, 0x7C54, 0x7F44, 0x7CDA, 0x779F, 0x7CA5, 0x7D2A, + 0x7D28, 0x7D29, 0x7931, 0x7DAB, 0x7A0B, 0x7DF9, 0x7A9F, 0x7A9E, + 0x7E76, 0x7B31, 0x7EC0, 0x7BC1, 0x7BBD, 0x7BBE, 0x7C4C, 0x76EF, + 0x7C46, 0x77E3, 0x7C9A, 0x7D21, 0x78C9, 0x7D1E, 0x796B, 0x7D6B, + 0x7A06, 0x7A04, 0x7DEC, 0x7A98, 0x7E39, 0x7B2C, 0x757D, 0x7BB9, + 0x7BB7, 0x7BB5, 0x7C44, 0x777A, 0x7C95, 0x7824, 0x7C8F, 0x7D16, + 0x78C7, 0x7D67, 0x79A5, 0x7D60, 0x7A3A, 0x79FF, 0x7E2F, 0x7A93, + 0x7509, 0x7B24, 0x7B25, 0x7BB4, 0x7BAF, 0x76CE, 0x7C01, 0x77BE, + 0x7C8D, 0x7864, 0x7862, 0x7CD9, 0x7902, 0x7D5C, 0x79A0, 0x7A36, + 0x7A34, 0x7ACA, 0x7DF5, 0x7AC7, 0x755B, 0x7B1C, 0x7BAA, 0x7BA9, + 0x7BFF, 0x7710, 0x7C85, 0x77BC, 0x7C82, 0x7CD1, 0x793F, 0x7D54, + 0x799E, 0x7D9F, 0x7A36, 0x7A34, 0x7AC7, 0x7AC5, 0x74EE, 0x7B1A, + 0x75AD, 0x7BA4, 0x7BA2, 0x7758, 0x7C7E, 0x7804, 0x7C7D, 0x78A3, + 0x7941, 0x7D1B, 0x79D9, 0x7D9A, 0x79D5, 0x7A2F, 0x7AC2, 0x7AC0, + 0x7E2D, 0x7B15, 0x7646, 0x7B9F, 0x76F4, 0x7BF4, 0x7C79, 0x7842, + 0x7CCA, 0x78E1, 0x7D15, 0x793D, 0x7D11, 0x79D2, 0x7A66, 0x7DAB, + 0x7ABE, 0x7E27, 0x7B4B, 0x7B49, 0x7B9D, 0x7B9E, 0x773C, 0x7C76, + 0x7885, 0x7C70, 0x78E2, 0x78E3, 0x7D0D, 0x7978, 0x7D5E, 0x7A66, + 0x7A67, 0x7ABE, 0x7ABC, 0x7DEE, 0x7B46, 0x76D6, 0x7B9B, 0x7BEB, + 0x77E4, 0x7C6F, 0x7887, 0x7CBD, 0x791D, 0x797A, 0x7978, 0x7A0F, + 0x7DA1, 0x7A64, 0x7507, 0x7AB9, 0x7B45, 0x7B44, 0x7B9A, 0x76DD, + 0x7BE6, 0x7827, 0x7C37, 0x78C4, 0x791F, 0x7D06, 0x79B4, 0x73D9, + 0x7A0F, 0x7A66, 0x7AF0, 0x7AF1, 0x7610, 0x7B43, 0x767D, 0x7B94, + 0x77CB, 0x7869, 0x7C33, 0x78C6, 0x7C84, 0x7925, 0x79B6, 0x79B7, + 0x7A0E, 0x7D69, 0x7A63, 0x75AC, 0x7B43, 0x7B42, 0x76C6, 0x7B93, + 0x77D0, 0x7BE2, 0x786D, 0x78CB, 0x7962, 0x7960, 0x7CCB, 0x79B9, + 0x748E, 0x7A9D, 0x7A9B, 0x7AF2, 0x7B42, 0x7710, 0x7B94, 0x7771, + 0x7812, 0x7810, 0x7872, 0x7C7E, 0x7964, 0x7286, 0x79BA, 0x7A4A, + 0x7A48, 0x7A9F, 0x759A, 0x7AF1, 0x76B0, 0x7B92, 0x77B5, 0x77B9, + 0x7C33, 0x78AF, 0x7C7E, 0x7908, 0x7966, 0x79F3, 0x7A4A, 0x7536, + 0x7A9D, 0x75E5, 0x7AEF, 0x7B42, 0x775D, 0x7B91, 0x77FA, 0x7C31, + 0x7C32, 0x78B1, 0x7CC9, 0x79A3, 0x79F7, 0x7D60, 0x7A4A, 0x7586, + 0x7AF4, 0x7AF2, 0x7B43, 0x7B93, 0x77A2, 0x7BE1, 0x785F, 0x7C30, + 0x794E, 0x7949, 0x7D16, 0x79FB, 0x746F, 0x7A4D, 0x75D5, 0x7AF5, + 0x7AF3, 0x7749, 0x7B97, 0x77A6, 0x7BE2, 0x789C, 0x78F7, 0x7CC9, + 0x79A6, 0x7D11, 0x79FF, 0x7577, 0x7AA4, 0x7AA5, 0x76ED, 0x7B46, + 0x77EA, 0x7B95, 0x784A, 0x78A2, 0x78FD, 0x78FB, 0x7CC7, 0x79AA, + 0x74AB, 0x7A53, 0x7A54, 0x762C, 0x7AF8, 0x7734, 0x7B99, 0x77F1, + 0x7850, 0x78AB, 0x78A9, 0x7C7C, 0x7956, 0x74FD, 0x7A04, 0x7A02, + 0x767A, 0x7AAA, 0x76DB, 0x7B4B, 0x779C, 0x77F7, 0x7853, 0x78EA, + 0x7C7E, 0x7996, 0x73E2, 0x79E9, 0x75B7, 0x7A08, 0x7A5C, 0x7681, + 0x7AFA, 0x77E0, 0x77DE, 0x783A, 0x7895, 0x7C33, 0x7944, 0x73C6, + 0x79F0, 0x755D, 0x7A95, 0x7A93, 0x76C9, 0x7AFF, 0x778A, 0x77E9, + 0x7841, 0x783F, 0x7898, 0x78F2, 0x7425, 0x799E, 0x74FC, 0x7A44, + 0x7A97, 0x7673, 0x7AB1, 0x7734, 0x7B4F, 0x77EF, 0x784A, 0x78A2, + 0x78FA, 0x73BD, 0x79A6, 0x754F, 0x7A4B, 0x7A9C, 0x7619, 0x7AB8, + 0x7779, 0x7B56, 0x7833, 0x788B, 0x78E3, 0x78A8, 0x741A, 0x7954, + 0x759E, 0x7A4F, 0x7663, 0x7AEE, 0x7AEF, 0x7781, 0x7B57, 0x7837, + 0x7BEF, 0x78E7, 0x793F, 0x7990, 0x7959, 0x7540, 0x7A54, 0x760D, + 0x7AF5, 0x7AF0, 0x778B, 0x7B59, 0x783F, 0x7BC4, 0x78EF, 0x7943, + 0x7998, 0x79B6, 0x75F7, 0x7A58, 0x76B9, 0x7AF6, 0x7774, 0x782A, + 0x7BAC, 0x7847, 0x7BC5, 0x78F3, 0x7466, 0x79EF, 0x79ED, 0x7602, + 0x7A5A, 0x76C4, 0x7AFB, 0x77D9, 0x782E, 0x7886, 0x7885, 0x7399, + 0x7951, 0x7471, 0x79F4, 0x75AA, 0x760D, 0x7AB0, 0x772A, 0x7ACA, + 0x77E1, 0x7839, 0x78E5, 0x78E6, 0x745C, 0x7956, 0x7591, 0x79FB, + 0x7657, 0x7714, 0x7B04, 0x776E, 0x7B6C, 0x783F, 0x7323, 0x793F, + 0x793E, 0x74D3, 0x79B0, 0x759F, 0x7A1C, 0x76C3, 0x771F, 0x77D5, + 0x782A, 0x7B6E, 0x789E, 0x73ED, 0x7947, 0x7524, 0x75EC, 0x7A57, + 0x76AA, 0x7A70, 0x7725, 0x7784, 0x7831, 0x7888, 0x731F, 0x78F9, + 0x7467, 0x796B, 0x7594, 0x765B, 0x7A29, 0x776B, 0x7AC4, 0x778B, + 0x7294, 0x7892, 0x78B0, 0x74B7, 0x79A6, 0x75E3, 0x7A13, 0x7603, + 0x76C1, 0x7777, 0x77CF, 0x7B32, 0x7843, 0x7319, 0x78B7, 0x745E, + 0x752B, 0x79CB, 0x764F, 0x7A67, 0x76CD, 0x7780, 0x7830, 0x77F5, + 0x78A3, 0x7BE6, 0x7913, 0x757A, 0x79B6, 0x75FC, 0x7A6F, 0x7A3D, + 0x7731, 0x7AD5, 0x7839, 0x73CA, 0x78AA, 0x78FE, 0x791A, 0x79BE, + 0x7648, 0x7A27, 0x76C3, 0x7774, 0x7775, 0x77EA, 0x7B40, 0x785E, + 0x74AA, 0x7922, 0x7571, 0x75F5, 0x7A2F, 0x76AE, 0x7A98, 0x77D7, + 0x72F2, 0x789E, 0x789D, 0x790E, 0x7960, 0x75DE, 0x79CC, 0x765D, + 0x7714, 0x7733, 0x77E2, 0x7B02, 0x7856, 0x7443, 0x78C6, 0x750A, + 0x758B, 0x79D4, 0x7647, 0x7A3D, 0x7775, 0x7209, 0x783F, 0x785E, + 0x742D, 0x78CE, 0x7578, 0x798B, 0x7658, 0x76B1, 0x76D3, 0x7783, + 0x72DA, 0x7848, 0x73D5, 0x78BB, 0x7505, 0x7586, 0x7993, 0x7605, + 0x7A4C, 0x7715, 0x7195, 0x77AA, 0x7853, 0x7428, 0x7913, 0x7572, + 0x7980, 0x764D, 0x764E, 0x7722, 0x7720, 0x72D8, 0x77E9, 0x73D3, + 0x7879, 0x74C2, 0x75DD, 0x7988, 0x76B6, 0x6FFF, 0x7785, 0x7257, + 0x77F3, 0x7814, 0x7426, 0x78D5, 0x750B, 0x798F, 0x7644, 0x76C1, + 0x76BF, 0x7790, 0x72D6, 0x7801, 0x7434, 0x78BF, 0x751C, 0x757C, + 0x7997, 0x7656, 0x7083, 0x7722, 0x72C2, 0x780B, 0x7809, 0x74AB, + 0x78E7, 0x7589, 0x6EB6, 0x76BB, 0x76B9, 0x772F, 0x77A2, 0x7341, + 0x7864, 0x7494, 0x78D4, 0x7576, 0x764E, 0x79A6, 0x76C6, 0x7A78, + 0x7738, 0x72E8, 0x7870, 0x786F, 0x7505, 0x7949, 0x75A5, 0x79AF, + 0x76D0, 0x76F2, 0x779C, 0x780B, 0x73CA, 0x7879, 0x7512, 0x7953, + 0x75F0, 0x766A, 0x7689, 0x7733, 0x72C5, 0x7815, 0x73B7, 0x7883, + 0x74C7, 0x7580, 0x795B, 0x7674, 0x70C8, 0x7740, 0x726C, 0x77CE, + 0x7820, 0x7450, 0x78FB, 0x7590, 0x6FC3, 0x7660, 0x76D7, 0x774A, + 0x77BD, 0x73B8, 0x782A, 0x749E, 0x757B, 0x75F6, 0x7615, 0x766E, + 0x76E4, 0x7249, 0x77CA, 0x742C, 0x742D, 0x750B, 0x7588, 0x7977, + 0x7604, 0x70E5, 0x76EE, 0x72C7, 0x73BA, 0x7840, 0x749D, 0x78AD, + 0x7599, 0x7033, 0x7632, 0x76DD, 0x72B5, 0x776E, 0x742A, 0x784D, + 0x74AD, 0x7587, 0x75FE, 0x7678, 0x7133, 0x76EA, 0x72C9, 0x77CC, + 0x743E, 0x743C, 0x7517, 0x7594, 0x7038, 0x7682, 0x71BC, 0x7766, + 0x7340, 0x742C, 0x77F5, 0x7529, 0x6E7B, 0x75A2, 0x7027, 0x768F, + 0x7703, 0x72CB, 0x77E2, 0x7439, 0x6BE9, 0x7536, 0x75B1, 0x762B, + 0x769B, 0x71C1, 0x7710, 0x7342, 0x73C8, 0x74A9, 0x7524, 0x75A2, + 0x7619, 0x713F, 0x76A9, 0x72CB, 0x73B8, 0x743A, 0x74B8, 0x787F, + 0x78EB, 0x7625, 0x7699, 0x770C, 0x7727, 0x7797, 0x7804, 0x7447, + 0x788B, 0x7544, 0x75BB, 0x7632, 0x76A6, 0x79F4, 0x7732, 0x7437, + 0x780E, 0x7534, 0x75AB, 0x78FA, 0x763E, 0x797E, 0x7725, 0x7343, + 0x77AD, 0x744B, 0x74C6, 0x789E, 0x75B8, 0x7921, 0x76BE, 0x72D0, + 0x774C, 0x77BC, 0x745A, 0x783E, 0x7550, 0x70A3, 0x763B, 0x7658, + 0x76CB, 0x773B, 0x73C9, 0x7831, 0x7540, 0x755F, 0x75D7, 0x7648, + 0x76BE, 0x76D7, 0x7356, 0x77D0, 0x7458, 0x754D, 0x75C7, 0x75E6, + 0x7656, 0x76CA, 0x7349, 0x7752, 0x73EB, 0x746A, 0x74E5, 0x75D6, + 0x712B, 0x7663, 0x724D, 0x76F1, 0x73DB, 0x745A, 0x7851, 0x74F4, + 0x7018, 0x7601, 0x71D3, 0x76E2, 0x72E6, 0x73EA, 0x77F4, 0x74E4, + 0x6F8E, 0x75F1, 0x71C2, 0x767D, 0x76ED, 0x73DA, 0x7793, 0x7478, + 0x6EDB, 0x756B, 0x7600, 0x766E, 0x768C, 0x72EC, 0x7783, 0x7468, + 0x6E4D, 0x7503, 0x7598, 0x713B, 0x767C, 0x72D9, 0x7726, 0x73FF, + 0x7478, 0x74F3, 0x7588, 0x70BC, 0x761B, 0x7268, 0x7716, 0x73EF, + 0x740E, 0x748A, 0x7523, 0x70AF, 0x760B, 0x7258, 0x76B5, 0x737F, + 0x73FE, 0x747A, 0x7513, 0x709F, 0x7619, 0x71E0, 0x76A5, 0x7372, + 0x7395, 0x77B2, 0x74AA, 0x7853, 0x75B4, 0x7628, 0x7644, 0x76CC, + 0x7382, 0x77C2, 0x749A, 0x77F6, 0x75A4, 0x75C3, 0x764F, 0x76BF, + 0x7315, 0x7762, 0x7431, 0x7523, 0x753F, 0x75B3, 0x763F, 0x765D, + 0x7386, 0x7755, 0x749B, 0x74BA, 0x752F, 0x75C1, 0x78A8, 0x766B, + 0x72F4, 0x775F, 0x7432, 0x74AA, 0x7540, 0x755C, 0x71DD, 0x765B, + 0x7309, 0x7702, 0x7422, 0x74B9, 0x780A, 0x754C, 0x7168, 0x7669, + 0x7298, 0x7399, 0x7433, 0x7453, 0x7815, 0x755D, 0x7158, 0x7608, + 0x730D, 0x732D, 0x73CA, 0x7443, 0x77BA, 0x756E, 0x714B, 0x7616, + 0x729D, 0x731C, 0x7729, 0x7457, 0x701D, 0x755E, 0x7160, 0x7606, + 0x728C, 0x73AF, 0x7733, 0x7468, 0x6F9D, 0x756C, 0x714F, 0x7616, + 0x72A4, 0x7342, 0x7741, 0x7458, 0x7028, 0x757D, 0x7167, 0x7210, + 0x76AF, 0x7335, 0x774F, 0x7469, 0x6FA8, 0x758B, 0x717C, 0x7225, + 0x76BA, 0x7346, 0x6E37, 0x7477, 0x702C, 0x7596, 0x75B4, 0x729A, + 0x765B, 0x73D2, 0x6DAB, 0x7488, 0x6FB3, 0x75A6, 0x75C2, 0x72AB, + 0x7669, 0x736C, 0x6E45, 0x7499, 0x7037, 0x7175, 0x75D3, 0x72BD, + 0x7677, 0x737A, 0x6E61, 0x74A7, 0x7536, 0x7187, 0x75E1, 0x724F, + 0x6C1E, 0x738B, 0x6F85, 0x74B8, 0x7544, 0x7179, 0x75EF, 0x72C1, + 0x6CC7, 0x7417, 0x74AA, 0x74C6, 0x7555, 0x718E, 0x75FA, 0x72F7, + 0x6D92, 0x7428, 0x74BB, 0x7048, 0x7563, 0x71C5, 0x7628, 0x7308, + 0x6DB1, 0x7436, 0x74C9, 0x70EB, 0x7592, 0x723A, 0x7636, 0x7394, + 0x742B, 0x7447, 0x74DA, 0x70FF, 0x759D, 0x7270, 0x6C08, 0x73A2, + 0x7439, 0x7476, 0x7506, 0x719A, 0x75AA, 0x7300, 0x6D86, 0x73B4, + 0x744A, 0x7058, 0x7514, 0x71D4, 0x7645, 0x730E, 0x73A5, 0x73E6, + 0x7479, 0x7070, 0x753F, 0x7265, 0x75E7, 0x731F, 0x73D8, 0x746B, + 0x7487, 0x7131, 0x75BD, 0x7279, 0x7314, 0x73C9, 0x73E9, 0x749A, + 0x7526, 0x71CC, 0x75E5, 0x72AC, 0x7347, 0x73D8, 0x7489, 0x74A8, + 0x7552, 0x71DD, 0x7611, 0x7335, 0x73EA, 0x740A, 0x749A, 0x712C, + 0x7560, 0x728F, 0x761E, 0x7368, 0x73FC, 0x74A9, 0x74C6, 0x71E2, + 0x758B, 0x72C2, 0x735D, 0x740C, 0x742B, 0x74D5, 0x74F1, 0x71FA, + 0x75B7, 0x72D4, 0x738C, 0x741D, 0x74C7, 0x7504, 0x758D, 0x722D, + 0x7648, 0x737E, 0x742C, 0x744C, 0x74F6, 0x71FF, 0x75B5, 0x72D8, + 0x7670, 0x73AD, 0x7459, 0x7478, 0x7522, 0x7232, 0x75E1, 0x730B, + 0x73BD, 0x6FEF, 0x70BF, 0x7163, 0x7224, 0x75ED, 0x7300, 0x6F32, + 0x745D, 0x70B4, 0x7179, 0x7199, 0x725A, 0x6DAA, 0x73C2, 0x6FFB, + 0x748C, 0x70EB, 0x71AC, 0x726D, 0x7302, 0x6E82, 0x73F1, 0x7035, + 0x7181, 0x71A1, 0x725C, 0x7315, 0x7350, 0x7003, 0x741D, 0x70F3, + 0x71B4, 0x7272, 0x7328, 0x6E91, 0x73F6, 0x703D, 0x74D5, 0x71A6, + 0x7263, 0x72A2, 0x7357, 0x6F5E, 0x7440, 0x70FB, 0x71BA, 0x7277, + 0x72B8, 0x7367, 0x7416, 0x7049, 0x746C, 0x71D0, 0x728A, 0x72C8, + 0x737A, 0x6F8F, 0x7442, 0x7125, 0x7520, 0x729D, 0x72BA, 0x736C, + 0x73A7, 0x7051, 0x748C, 0x71D8, 0x6C52, 0x72CD, 0x737F, 0x73B7, + 0x7461, 0x712A, 0x753F, 0x7227, 0x6DFD, 0x731B, 0x73C9, 0x707B, + 0x74AB, 0x71FB, 0x7585, 0x72F3, 0x6ECE, 0x73D9, 0x7414, 0x7154, + 0x7579, 0x7250, 0x6E0C, 0x733E, 0x6FBA, 0x74AF, 0x74E6, 0x7225, + 0x75BF, 0x7316, 0x6FAD, 0x741A, 0x70BC, 0x717E, 0x7235, 0x7273, + 0x7602, 0x7361, 0x708B, 0x7464, 0x718E, 0x7248, 0x7286, 0x7354, + 0x6FDB, 0x743A, 0x70E6, 0x7512, 0x727A, 0x72B8, 0x7367, 0x73A2, + 0x70BB, 0x7481, 0x71B8, 0x728D, 0x72CB, 0x7377, 0x73B2, 0x7474, + 0x71AB, 0x6C5D, 0x729D, 0x6F0C, 0x6F55, 0x73DF, 0x7104, 0x74BE, + 0x71FD, 0x6E24, 0x730A, 0x6FED, 0x70D5, 0x7117, 0x71F1, 0x6D61, + 0x72E2, 0x6F3D, 0x7026, 0x70EC, 0x712B, 0x7204, 0x72D5, 0x6E7F, + 0x734E, 0x703D, 0x711E, 0x71F7, 0x7236, 0x6E4C, 0x7323, 0x7030, + 0x685B, 0x7132, 0x720B, 0x7249, 0x7317, 0x6F5E, 0x7414, 0x7128, + 0x6BA1, 0x723C, 0x6E5D, 0x6F4E, 0x737F, 0x7080, 0x7479, 0x719C, + 0x6D97, 0x72AC, 0x6F68, 0x7051, 0x746D, 0x716D, 0x6CA6, 0x7281, + 0x6EB1, 0x6FA1, 0x7087, 0x7164, 0x71A0, 0x7272, 0x6EA4, 0x72EA, + 0x707A, 0x70BC, 0x7196, 0x71D4, 0x6DBF, 0x72E1, 0x6FA9, 0x73FD, + 0x70F1, 0x71CB, 0x7206, 0x72D1, 0x6F9F, 0x73D0, 0x70C6, 0x6BAE, + 0x71FA, 0x72C8, 0x6EEB, 0x733D, 0x70B7, 0x7452, 0x71ED, 0x6DC3, + 0x72F6, 0x6FCB, 0x7011, 0x7446, 0x714C, 0x6CFC, 0x725D, 0x6EF5, + 0x7004, 0x70E2, 0x7121, 0x74C2, 0x7250, 0x6EEC, 0x736E, 0x703A, + 0x7115, 0x7175, 0x7244, 0x6E34, 0x7364, 0x702D, 0x73F1, 0x7168, + 0x71A7, 0x7272, 0x72CC, 0x7024, 0x73E4, 0x715F, 0x719A, 0x7284, + 0x72C2, 0x6F77, 0x73D8, 0x7152, 0x7464, 0x71EA, 0x6E5A, 0x730C, + 0x7050, 0x70AE, 0x7184, 0x6D2E, 0x721C, 0x6F61, 0x6FA0, 0x70A4, + 0x70E3, 0x6D21, 0x7210, 0x6F54, 0x734B, 0x7095, 0x70D6, 0x71C8, + 0x7222, 0x6E7E, 0x733F, 0x6FF2, 0x6B0A, 0x712A, 0x6D7B, 0x6E93, + 0x7336, 0x6FE2, 0x6AFD, 0x711E, 0x6D6E, 0x7265, 0x6F96, 0x6FD9, + 0x70D3, 0x7133, 0x6D61, 0x7259, 0x6EC3, 0x6FCC, 0x702D, 0x7123, + 0x6D5B, 0x726B, 0x6EDC, 0x72FB, 0x7024, 0x6B5C, 0x7177, 0x71D4, + 0x6ECF, 0x730D, 0x7039, 0x6B4F, 0x7189, 0x6DB1, 0x6EC6, 0x6F2B, + 0x702D, 0x73A8, 0x717D, 0x6DCA, 0x7233, 0x6F1F, 0x7042, 0x7081, + 0x7192, 0x6DC1, 0x7226, 0x6F37, 0x68FB, 0x7096, 0x70F4, 0x6D04, + 0x7238, 0x6F2B, 0x736D, 0x70A9, 0x6C83, 0x71F4, 0x6E36, 0x6F43, + 0x72DB, 0x709F, 0x6CA3, 0x7157, 0x6E2D, 0x6F59, 0x6FBA, 0x70B1, + 0x710F, 0x716C, 0x6E46, 0x72A6, 0x6FB1, 0x7012, 0x7124, 0x717E, + 0x6E39, 0x72B7, 0x6FC3, 0x6A81, 0x7136, 0x6D13, 0x71CE, 0x72C9, + 0x6FDC, 0x7371, 0x714B, 0x6D30, 0x71FB, 0x6ECD, 0x6FEE, 0x704F, + 0x715D, 0x6D49, 0x720D, 0x6EE6, 0x7007, 0x7062, 0x70BF, 0x71C9, + 0x721F, 0x6EFF, 0x72CB, 0x707A, 0x6C37, 0x71DB, 0x7231, 0x6F11, + 0x694A, 0x708C, 0x6C2A, 0x7141, 0x6EC5, 0x6F2A, 0x6F8C, 0x709E, + 0x6C47, 0x7153, 0x6EDB, 0x6F3D, 0x6F9E, 0x70B1, 0x6C60, 0x7186, + 0x6E2D, 0x6928, 0x6FB4, 0x6C08, 0x713E, 0x7198, 0x6E45, 0x7248, + 0x6FEB, 0x6C25, 0x7151, 0x6DF5, 0x6E5B, 0x6F9F, 0x6FFD, 0x6C42, + 0x7181, 0x6E0B, 0x67C2, 0x6FB5, 0x7013, 0x708F, 0x7196, 0x6E47, + 0x725E, 0x6FE9, 0x6B24, 0x70A1, 0x6D08, 0x6E60, 0x6EC2, 0x6FFC, + 0x6B64, 0x70D2, 0x6D44, 0x6E98, 0x6EFA, 0x7033, 0x6B81, 0x7106, + 0x6D5E, 0x71B3, 0x6F32, 0x6B2C, 0x70BE, 0x6D0D, 0x6D99, 0x71E4, + 0x6F44, 0x6B49, 0x70EF, 0x6D49, 0x6DB2, 0x6F1A, 0x6F7C, 0x6B89, + 0x7120, 0x6D85, 0x71EB, 0x6F30, 0x6FAD, 0x700B, 0x7150, 0x6D9E, + 0x7218, 0x6F65, 0x6B74, 0x703F, 0x6D70, 0x6DD6, 0x6E5F, 0x6F99, + 0x6B91, 0x708F, 0x6DAC, 0x6E12, 0x6E97, 0x6FCD, 0x704A, 0x70C0, + 0x6DE5, 0x718F, 0x6ECF, 0x6A99, 0x707B, 0x6CA5, 0x6E1D, 0x71DB, + 0x6F04, 0x6AB6, 0x70C8, 0x6CE5, 0x6E55, 0x6EDA, 0x6F38, 0x7083, + 0x70FB, 0x6D21, 0x71DF, 0x6F0E, 0x6F8C, 0x7009, 0x7147, 0x6E63, + 0x7228, 0x6F43, 0x6B0F, 0x703A, 0x6D2F, 0x6E98, 0x6F19, 0x6F96, + 0x7010, 0x6CDE, 0x6D6B, 0x6EEF, 0x6F6D, 0x6AFA, 0x7060, 0x6D3D, + 0x714B, 0x6F24, 0x6AC8, 0x701B, 0x7094, 0x6D79, 0x7197, 0x6E80, + 0x6B0C, 0x706B, 0x6D48, 0x6DD1, 0x6E56, 0x6ED7, 0x6B76, 0x70BA, + 0x6DA7, 0x6753, 0x6EAD, 0x6B1E, 0x6BD9, 0x7103, 0x6E02, 0x7202, + 0x6F01, 0x6B88, 0x7017, 0x6DB5, 0x6E59, 0x6ED7, 0x6F55, 0x6BEB, + 0x7067, 0x6E10, 0x6923, 0x6F2B, 0x6BBD, 0x6C4E, 0x70B3, 0x6E83, + 0x6999, 0x6F7F, 0x6C20, 0x6CAD, 0x6D3A, 0x6ED7, 0x6F58, 0x6FEE, + 0x6C7F, 0x70F8, 0x6DB2, 0x69D9, 0x6FC7, 0x6C51, 0x6CDE, 0x715C, + 0x6E0C, 0x6A44, 0x7033, 0x6CB1, 0x6D60, 0x6DE2, 0x6E83, 0x6AAF, + 0x6F9A, 0x6D32, 0x678C, 0x6E59, 0x6A80, 0x6F70, 0x6D04, 0x6D8A, + 0x712B, 0x6ECF, 0x6AEB, 0x6FDF, 0x6D60, 0x6E05, 0x6EA5, 0x6F42, + 0x6B75, 0x704B, 0x6DDA, 0x6879, 0x6F18, 0x6B47, 0x6BFB, 0x6DD0, + 0x6E51, 0x68F3, 0x6F84, 0x6BCD, 0x70AE, 0x6D2A, 0x6EE4, 0x6F7D, + 0x7012, 0x6C53, 0x7131, 0x6DA5, 0x695E, 0x6EE3, 0x6C25, 0x6CD2, + 0x6D77, 0x6E3B, 0x6B42, 0x6F6E, 0x6CC7, 0x6D70, 0x6E11, 0x6EAE, + 0x6BEF, 0x6FFC, 0x6D45, 0x7118, 0x6EA4, 0x6BC1, 0x6FD2, 0x6D3A, + 0x6DDF, 0x6987, 0x6F32, 0x6C67, 0x6D10, 0x6DB5, 0x6E72, 0x6A1D, + 0x6FC0, 0x6CE2, 0x6DAA, 0x6E4B, 0x6F04, 0x6AD2, 0x7047, 0x6D9F, + 0x6747, 0x6EF9, 0x6AA0, 0x703D, 0x6C2D, 0x6CFD, 0x6DBE, 0x6E5C, + 0x6B4E, 0x6FC6, 0x6CF2, 0x6982, 0x6E54, 0x6B46, 0x6C1E, 0x6CC4, + 0x6D8C, 0x6A5F, 0x6F02, 0x6BF0, 0x6CB9, 0x6D81, 0x6E3E, 0x6B10, + 0x6FA9, 0x6CB1, 0x679B, 0x6E37, 0x6B05, 0x6BDD, 0x6CAA, 0x6D6F, + 0x686C, 0x6EE5, 0x6BD2, 0x7044, 0x6D64, 0x6864, 0x6EDA, 0x6BA7, + 0x6C97, 0x7000, 0x6E16, 0x6929, 0x6F84, 0x6C8C, 0x6D51, 0x6E12, + 0x6E8A, 0x6A06, 0x6F29, 0x6BE2, 0x681E, 0x6D90, 0x6A02, 0x6B02, + 0x6BD7, 0x6CC3, 0x6907, 0x6E61, 0x6AF7, 0x6482, 0x6CB8, 0x68FF, + 0x69EF, 0x6F28, 0x6BE7, 0x70B6, 0x6D92, 0x69E0, 0x6F3F, 0x6BDC, + 0x6CC5, 0x6DA9, 0x6E82, 0x6ADC, 0x6FFE, 0x6CBE, 0x68E4, 0x6E77, + 0x6AF8, 0x6BE9, 0x6CD5, 0x6DB6, 0x69E9, 0x6F03, 0x6BE5, 0x658D, + 0x6DCA, 0x6E84, 0x6B05, 0x6EE2, 0x6CE2, 0x66D0, 0x6DC1, 0x6AFD, + 0x6C15, 0x6CFA, 0x6CF8, 0x6D40, 0x6E39, 0x6BEA, 0x6FF3, 0x6C77, + 0x681B, 0x6E4E, 0x6A63, 0x6B7F, 0x6C8F, 0x6D70, 0x6953, 0x6F52, + 0x6B9A, 0x6FC3, 0x6DA4, 0x6972, 0x6F7F, 0x6BB2, 0x6CBB, 0x6DB8, + 0x6EAA, 0x6AB6, 0x6F08, 0x6CD3, 0x6872, 0x6EC1, 0x6ACE, 0x6BE6, + 0x6D07, 0x6E00, 0x69C9, 0x6E65, 0x6C1E, 0x673A, 0x6DFC, 0x69E5, + 0x6B02, 0x6F7C, 0x6D56, 0x68CD, 0x6DB9, 0x6B41, 0x6C6D, 0x6CED, + 0x6CD7, 0x6A40, 0x6EF9, 0x6C85, 0x679D, 0x6D0E, 0x6A58, 0x6F2C, + 0x6BD5, 0x6BFE, 0x6D42, 0x6E53, 0x6B26, 0x6F03, 0x6C39, 0x696B, + 0x6E87, 0x69E4, 0x6B44, 0x6C71, 0x6DAD, 0x68D3, 0x6E5E, 0x6B83, + 0x65C9, 0x6DDD, 0x6916, 0x6A63, 0x6BBB, 0x6CFF, 0x67CE, 0x6DB8, + 0x6A9E, 0x6C16, 0x6D53, 0x6D70, 0x6999, 0x6EF9, 0x6C4D, 0x6695, + 0x6D0A, 0x69DC, 0x6B3C, 0x6CA1, 0x6CC2, 0x68A3, 0x6E73, 0x6B97, + 0x656C, 0x6C5C, 0x68EA, 0x6A7E, 0x6BF2, 0x6C10, 0x67A2, 0x6DEC, + 0x6ADD, 0x63FC, 0x6BA6, 0x67E9, 0x6E3C, 0x6B38, 0x6B3A, 0x6BE9, + 0x6D42, 0x6A1B, 0x6DE3, 0x6AC8, 0x670A, 0x6DB2, 0x6DB3, 0x6A58, + 0x6F6C, 0x6CB7, 0x6954, 0x6D55, 0x69EE, 0x6BAA, 0x6D2A, 0x6D28, + 0x696E, 0x6EE7, 0x6C24, 0x685E, 0x6CCA, 0x6923, 0x6AF3, 0x6C9B, + 0x6C99, 0x682D, 0x6E7F, 0x6B6E, 0x6787, 0x6C3B, 0x6854, 0x6A58, + 0x6C0C, 0x6C0A, 0x6CD1, 0x6DFC, 0x6DFD, 0x6BBE, 0x6F56, 0x6D60, + 0x6995, 0x6E35, 0x6B77, 0x6C3F, 0x6D90, 0x6D72, 0x6B2E, 0x6EF2, + 0x6CF1, 0x68CA, 0x6DCA, 0x6AE0, 0x6BCF, 0x6D25, 0x6D07, 0x6A93, + 0x6E8E, 0x6C85, 0x67F7, 0x6D62, 0x6A44, 0x6B3B, 0x6C97, 0x6C9B, + 0x69F4, 0x6E23, 0x6C12, 0x671C, 0x6D10, 0x69A5, 0x6AC4, 0x6C2A, + 0x6C28, 0x6958, 0x6DBB, 0x6BA2, 0x663C, 0x6CA4, 0x6905, 0x6A2C, + 0x6BBA, 0x6B98, 0x68B4, 0x6D50, 0x6B2E, 0x6B6F, 0x6C57, 0x6D2B, + 0x69B0, 0x6E70, 0x6B28, 0x680C, 0x6CE5, 0x6ADA, 0x6AFF, 0x6C07, + 0x6CBF, 0x6934, 0x6E28, 0x6AB4, 0x675C, 0x6C98, 0x6A66, 0x6A87, + 0x6BD6, 0x6C53, 0x6890, 0x6DC0, 0x6A3C, 0x66A8, 0x6C2C, 0x6A11, + 0x6A0F, 0x6B86, 0x6C03, 0x680F, 0x6D58, 0x69CC, 0x65EC, 0x6BBC, + 0x6999, 0x6997, 0x6B75, 0x6B93, 0x67B2, 0x6D0C, 0x6997, 0x652F, + 0x6B50, 0x691C, 0x691E, 0x6B21, 0x6B22, 0x672A, 0x6CA0, 0x6942, + 0x6466, 0x6B43, 0x68A0, 0x689E, 0x6AD0, 0x6AAE, 0x66C9, 0x6C53, + 0x6931, 0x638E, 0x6B6E, 0x681F, 0x681D, 0x6A5C, 0x6A5A, 0x6664, + 0x6BE7, 0x6920, 0x62AD, 0x6BC0, 0x67C2, 0x679C, 0x6A07, 0x69E5, + 0x6E5A, 0x6BFA, 0x6956, 0x6DF5, 0x6B6D, 0x6B71, 0x6CAA, 0x6CA8, + 0x6990, 0x6EB9, 0x6C81, 0x6965, 0x6DAF, 0x6B1F, 0x6AFD, 0x6C5A, + 0x693A, 0x6A2F, 0x6AD4, 0x6C38, 0x6910, 0x6D47, 0x6AAE, 0x6653, + 0x6C0D, 0x68E1, 0x6A85, 0x6A83, 0x6BE8, 0x68B7, 0x6CFB, 0x6A5A, + 0x65EE, 0x6BC0, 0x6868, 0x6A34, 0x6A32, 0x6B9B, 0x683A, 0x6CAF, + 0x6A09, 0x6564, 0x6B70, 0x680E, 0x69DF, 0x6A29, 0x6B4A, 0x67E1, + 0x6C65, 0x69B4, 0x64FE, 0x6C3C, 0x67B5, 0x698A, 0x6AFC, 0x6AFD, + 0x6784, 0x6D25, 0x695F, 0x6491, 0x6BF2, 0x6758, 0x6935, 0x6AAB, + 0x6AA9, 0x672A, 0x6CDC, 0x6A85, 0x6427, 0x6BA5, 0x68E2, 0x68E0, + 0x6A5A, 0x6B7C, 0x66C9, 0x6C93, 0x6A34, 0x63B9, 0x6B58, 0x6889, + 0x6A07, 0x6A09, 0x6B2F, 0x685F, 0x6C47, 0x69DF, 0x6664, 0x6B07, + 0x6830, 0x69B6, 0x69B7, 0x6AFE, 0x682A, 0x6CEE, 0x698E, 0x6602, + 0x6BD6, 0x67FE, 0x6964, 0x6AAF, 0x6AB1, 0x67D1, 0x6CA1, 0x6939, + 0x65A4, 0x6B89, 0x67A5, 0x6933, 0x6A5E, 0x6B80, 0x6777, 0x6C58, + 0x6A38, 0x653E, 0x6B5C, 0x68DC, 0x6A2F, 0x6A10, 0x6B33, 0x671D, + 0x6CFC, 0x6A07, 0x6504, 0x6C04, 0x6887, 0x69E1, 0x6AE4, 0x6AE6, + 0x6BE0, 0x69B8, 0x6D81, 0x6AC0, 0x6BBB, 0x6C8E, 0x6D5C, 0x6AB7, + 0x6B92, 0x6C88, 0x6966, 0x6D38, 0x6B8C, 0x67FE, 0x6C61, 0x6A68, + 0x6A66, 0x6B68, 0x6C3B, 0x6935, 0x6DB5, 0x6B3F, 0x67CC, 0x6CE5, + 0x6A1A, 0x6B19, 0x6BF4, 0x6BF2, 0x6A11, 0x6D70, 0x6AF2, 0x68D8, + 0x68B6, 0x69E9, 0x6AEC, 0x6748, 0x6C7A, 0x69C3, 0x658E, 0x6B9E, + 0x6886, 0x6996, 0x6A9D, 0x6B78, 0x6859, 0x6C4D, 0x6A77, 0x670B, + 0x6B54, 0x6851, 0x6968, 0x6A6C, 0x6B4B, 0x6827, 0x6CD1, 0x6A46, + 0x66B1, 0x6BF9, 0x6939, 0x64EE, 0x6B00, 0x67F4, 0x690F, 0x6A17, + 0x6AFA, 0x67CA, 0x6BB3, 0x68E7, 0x64B4, 0x6AD2, 0x67A1, 0x68BD, + 0x69C9, 0x6AA9, 0x6798, 0x6C38, 0x69A0, 0x6619, 0x6B5F, 0x688A, + 0x699A, 0x6A7B, 0x6B39, 0x6881, 0x6CBC, 0x6A58, 0x65DF, 0x6B31, + 0x685C, 0x6949, 0x6A30, 0x6B0C, 0x6832, 0x6C73, 0x6A27, 0x66E0, + 0x6829, 0x6919, 0x6A01, 0x66DA, 0x6B98, 0x68EF, 0x639F, 0x6AB7, + 0x67D5, 0x6182, 0x69D2, 0x6543, 0x66A8, 0x67CD, 0x68C1, 0x6515, + 0x6B44, 0x67A3, 0x613F, 0x6980, 0x6671, 0x6799, 0x688E, 0x697A, + 0x6643, 0x6AFA, 0x6868, 0x631E, 0x6A35, 0x6745, 0x6862, 0x694B, + 0x6A0F, 0x6610, 0x6B86, 0x6925, 0x6499, 0x6AC5, 0x6713, 0x680C, + 0x69E3, 0x6AA3, 0x670A, 0x6BEF, 0x68F3, 0x65AE, 0x6B32, 0x67DC, + 0x68CD, 0x69B2, 0x6A72, 0x67D3, 0x6C57, 0x698C, 0x66A8, 0x6B08, + 0x689A, 0x63FB, 0x6A26, 0x67A3, 0x6874, 0x6960, 0x6A1D, 0x6676, + 0x5FE0, 0x6936, 0x653A, 0x664B, 0x6844, 0x692D, 0x6508, 0x6A91, + 0x6747, 0x61E1, 0x69CB, 0x6617, 0x6741, 0x6812, 0x69C2, 0x660E, + 0x6B1A, 0x680C, 0x6375, 0x6A5C, 0x670D, 0x67E2, 0x68AF, 0x6A36, + 0x66E3, 0x6B84, 0x68A9, 0x6493, 0x6AC9, 0x67B2, 0x6883, 0x6948, + 0x6A09, 0x67A9, 0x6BEC, 0x6942, 0x6579, 0x6B36, 0x6850, 0x691C, + 0x69DD, 0x6779, 0x684A, 0x6913, 0x69B7, 0x664F, 0x6B9F, 0x68E9, + 0x653B, 0x6A4A, 0x681A, 0x68E3, 0x6988, 0x6A44, 0x67F0, 0x6C07, + 0x697F, 0x6615, 0x6AB8, 0x68B4, 0x6958, 0x69FC, 0x6B48, 0x688D, + 0x63AD, 0x69F3, 0x66E3, 0x6884, 0x692C, 0x69CD, 0x66BC, 0x6B98, + 0x6923, 0x65B0, 0x6A60, 0x6858, 0x68FD, 0x69A1, 0x6A3A, 0x682E, + 0x6BFD, 0x6998, 0x667F, 0x6B61, 0x68D1, 0x6972, 0x6A12, 0x6B3E, + 0x68C7, 0x696C, 0x6A09, 0x6728, 0x6BB0, 0x6946, 0x6624, 0x6B16, + 0x6898, 0x693D, 0x661E, 0x6AF0, 0x6875, 0x6419, 0x69B7, 0x66CE, + 0x6174, 0x690D, 0x65EA, 0x66C8, 0x6845, 0x68EA, 0x65E4, 0x6ABF, + 0x683C, 0x63DE, 0x6982, 0x6694, 0x6815, 0x68BB, 0x695C, 0x668E, + 0x6B0C, 0x68B5, 0x6585, 0x6A6E, 0x67E6, 0x688B, 0x657C, 0x6A68, + 0x67E0, 0x636D, 0x69C6, 0x6633, 0x60E3, 0x685F, 0x654B, 0x662A, + 0x67B0, 0x6859, 0x6545, 0x6A16, 0x6789, 0x632E, 0x6974, 0x65F9, + 0x6780, 0x6829, 0x696E, 0x65F3, 0x6A81, 0x6823, 0x6507, 0x69E5, + 0x6750, 0x67FD, 0x6942, 0x69BF, 0x674A, 0x689B, 0x691C, 0x65B9, + 0x604E, 0x6871, 0x64CD, 0x6668, 0x671A, 0x686B, 0x64A2, 0x698D, + 0x66F3, 0x62AA, 0x68EA, 0x663B, 0x66ED, 0x683F, 0x68E1, 0x660D, + 0x6A72, 0x6815, 0x6467, 0x69D7, 0x66BD, 0x680F, 0x6934, 0x69D1, + 0x6760, 0x6809, 0x692E, 0x65D6, 0x6AB8, 0x67E3, 0x6516, 0x69A2, + 0x6733, 0x67DD, 0x6902, 0x6A17, 0x672A, 0x6325, 0x68DC, 0x65A0, + 0x6703, 0x6851, 0x68D6, 0x664B, 0x6A64, 0x682B, 0x64AD, 0x69C9, + 0x66D3, 0x6825, 0x68A6, 0x661B, 0x6779, 0x67FF, 0x6920, 0x6615, + 0x6A8D, 0x67F9, 0x6476, 0x6997, 0x6749, 0x6873, 0x68F4, 0x69EC, + 0x6194, 0x6850, 0x6524, 0x666E, 0x6719, 0x6847, 0x64F9, 0x69DD, + 0x6713, 0x6341, 0x693E, 0x665F, 0x6158, 0x681A, 0x65A6, 0x6638, + 0x676E, 0x6894, 0x657C, 0x6A0A, 0x6765, 0x63F9, 0x690C, 0x66B8, + 0x675F, 0x6868, 0x6965, 0x66AF, 0x621E, 0x6862, 0x6545, 0x5FE2, + 0x67BA, 0x6480, 0x65F4, 0x672B, 0x67B1, 0x647A, 0x6933, 0x6704, + 0x62B9, 0x68B0, 0x65C0, 0x66FB, 0x6808, 0x6887, 0x6599, 0x66D4, + 0x67FF, 0x64FD, 0x697D, 0x66CE, 0x634C, 0x64D2, 0x661D, 0x6750, + 0x6346, 0x68D4, 0x6614, 0x626C, 0x6850, 0x655B, 0x669A, 0x6724, + 0x682A, 0x6551, 0x6694, 0x67A2, 0x63D5, 0x691E, 0x666A, 0x6303, + 0x689B, 0x65D6, 0x66EC, 0x6772, 0x6874, 0x65AF, 0x6117, 0x67F0, + 0x6516, 0x65A5, 0x6765, 0x67E7, 0x64EB, 0x662F, 0x673E, 0x6389, + 0x68C2, 0x6626, 0x61E7, 0x683E, 0x6571, 0x668B, 0x6715, 0x6818, + 0x6567, 0x69E6, 0x6790, 0x63EF, 0x68EF, 0x6704, 0x678A, 0x64A7, + 0x6961, 0x66E1, 0x631E, 0x68E2, 0x65C1, 0x616D, 0x67DE, 0x650B, + 0x6648, 0x6756, 0x67BB, 0x6505, 0x698B, 0x6730, 0x6468, 0x690C, + 0x66A3, 0x67AE, 0x680F, 0x6906, 0x669A, 0x6787, 0x6882, 0x655F, + 0x6673, 0x67FF, 0x685F, 0x65E6, 0x66F6, 0x67DB, 0x654E, 0x6029, + 0x66EC, 0x63FE, 0x6527, 0x6642, 0x674A, 0x63F5, 0x6905, 0x66C1, + 0x632E, 0x68A2, 0x65A8, 0x61B1, 0x67A2, 0x6513, 0x65A2, 0x6719, + 0x679C, 0x64EC, 0x5FDE, 0x6710, 0x63B6, 0x6570, 0x6687, 0x676E, + 0x6449, 0x68C6, 0x6660, 0x62E5, 0x6846, 0x65D0, 0x6167, 0x67C2, + 0x64AA, 0x65CA, 0x66B9, 0x67BC, 0x6539, 0x6079, 0x6734, 0x63E9, + 0x650E, 0x66AB, 0x62A5, 0x6475, 0x6595, 0x6688, 0x633E, 0x6849, + 0x658F, 0x61C8, 0x67E2, 0x64FA, 0x65F2, 0x66E0, 0x67BF, 0x6561, + 0x60E5, 0x6758, 0x643A, 0x5E37, 0x66CF, 0x6302, 0x64C2, 0x65BD, + 0x66AC, 0x6396, 0x6869, 0x663D, 0x6229, 0x67E5, 0x6526, 0x60A1, + 0x6781, 0x648D, 0x6589, 0x6678, 0x675E, 0x6487, 0x5FD8, 0x66F3, + 0x63ED, 0x64F1, 0x65E5, 0x66D0, 0x63C2, 0x6889, 0x6664, 0x6324, + 0x6809, 0x65D7, 0x61DB, 0x6784, 0x64B9, 0x65B0, 0x669C, 0x677E, + 0x6540, 0x6045, 0x66FA, 0x641D, 0x65A3, 0x668E, 0x62E5, 0x6484, + 0x659D, 0x66E9, 0x6379, 0x6885, 0x65FF, 0x62D7, 0x67A5, 0x656E, + 0x665A, 0x6741, 0x67FB, 0x6568, 0x615E, 0x677A, 0x64D7, 0x5FF3, + 0x66B2, 0x63AF, 0x68A7, 0x6629, 0x6336, 0x67CE, 0x6537, 0x6684, + 0x630A, 0x64A2, 0x6596, 0x6264, 0x67A4, 0x6508, 0x6112, 0x66DC, + 0x6494, 0x658C, 0x6657, 0x6737, 0x646D, 0x65EB, 0x66B1, 0x63F8, + 0x5DE0, 0x6646, 0x62C7, 0x645F, 0x6554, 0x66A4, 0x6358, 0x6820, + 0x65B6, 0x621A, 0x67BD, 0x64C0, 0x60C7, 0x66DB, 0x642A, 0x6523, + 0x6210, 0x6736, 0x6491, 0x60B9, 0x66CE, 0x6420, 0x5E88, 0x65E4, + 0x62EF, 0x6487, 0x6557, 0x663F, 0x6380, 0x681C, 0x65B9, 0x6246, + 0x63E7, 0x6549, 0x6121, 0x62DB, 0x6452, 0x65A8, 0x623C, 0x6732, + 0x64B5, 0x606B, 0x66CD, 0x63B2, 0x6518, 0x6665, 0x631B, 0x64A7, + 0x6033, 0x6642, 0x63A8, 0x5DF4, 0x65D6, 0x6298, 0x640F, 0x64E3, + 0x6634, 0x6307, 0x6476, 0x65AB, 0x6268, 0x672D, 0x64D9, 0x6147, + 0x62D4, 0x6447, 0x659D, 0x625A, 0x6723, 0x64AA, 0x6091, 0x66BF, + 0x6439, 0x5F27, 0x65D5, 0x6335, 0x649D, 0x656C, 0x6694, 0x639D, + 0x5F19, 0x65CB, 0x6328, 0x5CB3, 0x6541, 0x6216, 0x6393, 0x646B, + 0x65A0, 0x6286, 0x677F, 0x6530, 0x6169, 0x671B, 0x64C7, 0x60BD, + 0x6253, 0x63CB, 0x649F, 0x6139, 0x6690, 0x6432, 0x60B3, 0x662B, + 0x6747, 0x6492, 0x612B, 0x66E3, 0x6421, 0x655A, 0x661E, 0x66C0, + 0x6466, 0x686D, 0x665B, 0x63F5, 0x5FEE, 0x65F3, 0x6316, 0x6459, + 0x658A, 0x664E, 0x63E8, 0x67E6, 0x65C8, 0x62E3, 0x6786, 0x64FA, + 0x626D, 0x6352, 0x648D, 0x65BE, 0x62D9, 0x6778, 0x6555, 0x61C7, + 0x6718, 0x6483, 0x6149, 0x6653, 0x6412, 0x64C1, 0x61BD, 0x66AE, + 0x6454, 0x609A, 0x6649, 0x63E6, 0x5F66, 0x65E1, 0x6375, 0x644A, + 0x655A, 0x667F, 0x63D9, 0x5F58, 0x65B6, 0x62DB, 0x5E0A, 0x654D, + 0x625E, 0x63AD, 0x64E4, 0x65AC, 0x6338, 0x647A, 0x6525, 0x6254, + 0x5C5E, 0x64B8, 0x6141, 0x632E, 0x63E5, 0x6518, 0x6224, 0x66D8, + 0x64AB, 0x6133, 0x6677, 0x6441, 0x60B4, 0x6612, 0x6366, 0x6483, + 0x619C, 0x66A9, 0x6412, 0x6080, 0x65E7, 0x633A, 0x5F76, 0x6582, + 0x62C8, 0x6408, 0x6519, 0x65DA, 0x639A, 0x5FEF, 0x6574, 0x62BA, + 0x5DFB, 0x650F, 0x6244, 0x636B, 0x64A2, 0x65AB, 0x628B, 0x6435, + 0x64E0, 0x6214, 0x5D54, 0x6477, 0x6127, 0x62EF, 0x6409, 0x6538, + 0x6279, 0x6353, 0x64CF, 0x6190, 0x6672, 0x63FF, 0x6111, 0x626B, + 0x638E, 0x64A3, 0x6160, 0x6320, 0x63F2, 0x6066, 0x65E6, 0x6384, + 0x5FE3, 0x659E, 0x6312, 0x642C, 0x6539, 0x6636, 0x63C2, 0x67A7, + 0x65D5, 0x6350, 0x674A, 0x650E, 0x6270, 0x6393, 0x64C6, 0x65AD, + 0x6346, 0x6459, 0x6544, 0x62D4, 0x66DC, 0x64FC, 0x6262, 0x667B, + 0x6493, 0x6598, 0x62A8, 0x63C3, 0x64D1, 0x6232, 0x66B1, 0x646B, + 0x6148, 0x666A, 0x641C, 0x60CD, 0x6293, 0x63AE, 0x64C0, 0x61B1, + 0x6642, 0x6456, 0x6136, 0x65E1, 0x6386, 0x6044, 0x6599, 0x6314, + 0x642E, 0x612C, 0x6614, 0x63E2, 0x60B1, 0x65CC, 0x6374, 0x5FB6, + 0x656A, 0x6306, 0x6419, 0x60F4, 0x6602, 0x63AF, 0x5FFD, 0x659D, + 0x62DA, 0x5EFA, 0x64F7, 0x6286, 0x6383, 0x64F0, 0x6217, 0x6333, + 0x5FEF, 0x652E, 0x62C8, 0x5EE7, 0x64C8, 0x6256, 0x6371, 0x6462, + 0x6170, 0x6303, 0x5EB3, 0x64FF, 0x6248, 0x5E26, 0x6499, 0x61D5, + 0x62F9, 0x644D, 0x615E, 0x62F1, 0x63E3, 0x648B, 0x6214, 0x5E14, + 0x6487, 0x61A1, 0x5CF5, 0x63D9, 0x60D9, 0x6253, 0x636F, 0x64BE, + 0x6202, 0x5E05, 0x6413, 0x618F, 0x5CE2, 0x640C, 0x60A8, 0x6241, + 0x63A2, 0x644A, 0x61D2, 0x62F2, 0x6446, 0x610A, 0x5B6D, 0x63DC, + 0x6096, 0x6211, 0x632D, 0x647D, 0x61C0, 0x6325, 0x6413, 0x6149, + 0x5B5A, 0x6368, 0x605E, 0x61FF, 0x6360, 0x5F8C, 0x618C, 0x62AD, + 0x639F, 0x60C7, 0x6569, 0x639B, 0x604C, 0x61CB, 0x62E8, 0x5FCC, + 0x610A, 0x6279, 0x63D2, 0x6103, 0x6598, 0x636B, 0x6017, 0x6536, + 0x631F, 0x5FBD, 0x6146, 0x62B0, 0x63A2, 0x6081, 0x656C, 0x6356, + 0x6079, 0x650A, 0x62EF, 0x5F85, 0x6111, 0x6237, 0x6394, 0x60C0, + 0x6233, 0x6326, 0x6044, 0x6539, 0x62BB, 0x5F76, 0x64F1, 0x626E, + 0x6361, 0x6088, 0x61FF, 0x635D, 0x6032, 0x650A, 0x62AD, 0x5FB6, + 0x64C2, 0x62A5, 0x6394, 0x6079, 0x61ED, 0x6390, 0x6072, 0x64F8, + 0x62E0, 0x5F81, 0x64F1, 0x6275, 0x5F27, 0x648F, 0x6225, 0x6360, + 0x603D, 0x650A, 0x62B0, 0x5FE7, 0x64C5, 0x62A9, 0x5F6B, 0x64BE, + 0x61F4, 0x6393, 0x602B, 0x6538, 0x62E4, 0x6027, 0x6496, 0x62E0, + 0x5F32, 0x6492, 0x622C, 0x6363, 0x644A, 0x6509, 0x6317, 0x6066, + 0x6505, 0x62AC, 0x5F9C, 0x64C1, 0x6263, 0x6393, 0x645B, 0x625B, + 0x62E7, 0x60A2, 0x6531, 0x62E3, 0x5FDC, 0x6492, 0x6278, 0x6367, + 0x648A, 0x622B, 0x635F, 0x6445, 0x6505, 0x6316, 0x601B, 0x6501, + 0x62AF, 0x5F9F, 0x645E, 0x6262, 0x6392, 0x645A, 0x6516, 0x632B, + 0x6412, 0x61A6, 0x5DF0, 0x640E, 0x619E, 0x5DEC, 0x6366, 0x60E8, + 0x622A, 0x5F0C, 0x60E0, 0x6226, 0x5E38, 0x63DE, 0x6171, 0x5E34, + 0x63D7, 0x6169, 0x6261, 0x5F4C, 0x6118, 0x625A, 0x5F48, 0x644E, + 0x61A5, 0x5E78, 0x63EC, 0x61A1, 0x5D9C, 0x5F8F, 0x60E7, 0x626F, + 0x5F88, 0x6460, 0x6225, 0x5EBC, 0x641B, 0x621E, 0x5EB4, 0x601D, + 0x616C, 0x62A6, 0x5FCB, 0x6165, 0x62A2, 0x5FC3, 0x6430, 0x61F1, + 0x5EF8, 0x6059, 0x61E9, 0x5EF4, 0x6051, 0x619C, 0x6272, 0x5F8E, + 0x649C, 0x626A, 0x5F8A, 0x5A65, 0x6266, 0x5EBB, 0x60D7, 0x6219, + 0x62E7, 0x601C, 0x61B1, 0x62E3, 0x6014, 0x64A6, 0x6236, 0x5FC2, + 0x615C, 0x6232, 0x5FBE, 0x60A2, 0x61E5, 0x62F8, 0x609A, 0x64BB, + 0x62AF, 0x604C, 0x5BA3, 0x62A7, 0x6044, 0x6127, 0x62A3, 0x6369, + 0x611F, 0x61F6, 0x6365, 0x60CE, 0x5CDE, 0x62BC, 0x60CA, 0x61A1, + 0x62B8, 0x600F, 0x619D, 0x626F, 0x637A, 0x60E7, 0x5D7E, 0x6372, + 0x60E3, 0x5D76, 0x632D, 0x6095, 0x61B6, 0x6329, 0x63E7, 0x61AE, + 0x5EE2, 0x6387, 0x6164, 0x5E15, 0x6342, 0x615D, 0x622F, 0x633A, + 0x6439, 0x622B, 0x5F70, 0x6435, 0x6223, 0x5EA8, 0x63F0, 0x6172, + 0x5EA4, 0x604C, 0x616E, 0x6240, 0x5FFA, 0x5BE5, 0x6239, 0x5F89, + 0x5AED, 0x6231, 0x5F33, 0x6118, 0x61EB, 0x5F2B, 0x60CA, 0x5C8E, + 0x62F3, 0x600F, 0x5C86, 0x62AA, 0x600B, 0x5C26, 0x6242, 0x6004, + 0x6129, 0x5E03, 0x6346, 0x60DB, 0x5DFB, 0x6300, 0x60D4, 0x5D22, + 0x5EED, 0x60D0, 0x61E9, 0x5EE5, 0x6015, 0x619F, 0x5E8E, 0x6353, + 0x6133, 0x5E8A, 0x589B, 0x60E9, 0x5DBD, 0x5FBE, 0x60E1, 0x61FA, + 0x5FB6, 0x60DD, 0x61F6, 0x5F64, 0x5A72, 0x61EE, 0x5EA0, 0x608B, + 0x61EA, 0x5E9B, 0x6083, 0x613C, 0x624D, 0x5FCC, 0x5C6F, 0x6249, + 0x5FC4, 0x5C0F, 0x6241, 0x5FC0, 0x60E6, 0x5E34, 0x5F71, 0x60DE, + 0x5D63, 0x629C, 0x60DA, 0x5D5F, 0x6298, 0x608C, 0x5D07, 0x5EA1, + 0x6088, 0x613A, 0x5E99, 0x634F, 0x6136, 0x5E46, 0x632D, 0x6132, + 0x5E41, 0x5FC5, 0x60E4, 0x5E3D, 0x5F76, 0x60E0, 0x61F5, 0x5F6E, + 0x5BAF, 0x618D, 0x5F6A, 0x5ABF, 0x6185, 0x5F66, 0x6043, 0x6181, + 0x62CC, 0x601C, 0x5D04, 0x6286, 0x6015, 0x5CA8, 0x6222, 0x5FCA, + 0x5CA4, 0x621E, 0x5FC2, 0x6127, 0x5E3E, 0x62DD, 0x6123, 0x5E3A, + 0x62D5, 0x6093, 0x5DE3, 0x62B3, 0x606C, 0x61C5, 0x5F63, 0x6068, + 0x5D0D, 0x62AB, 0x6064, 0x5D09, 0x5E9B, 0x605C, 0x6173, 0x5E97, + 0x6058, 0x6129, 0x5E93, 0x59E8, 0x6106, 0x5E8E, 0x6006, 0x60FE, + 0x5E87, 0x5FFE, 0x60FA, 0x61EA, 0x5F65, 0x5C94, 0x61E2, 0x5F3E, + 0x5BB8, 0x61DE, 0x5F3A, 0x60EA, 0x5D61, 0x5F36, 0x60E3, 0x5D59, + 0x62B9, 0x609C, 0x5D55, 0x62B5, 0x604E, 0x5D51, 0x5F26, 0x602B, + 0x6184, 0x5F21, 0x6023, 0x613A, 0x5F1D, 0x5B36, 0x6117, 0x5ECA, + 0x59E3, 0x6110, 0x5E58, 0x6013, 0x5D38, 0x5E54, 0x600F, 0x5C0D, + 0x61F3, 0x600B, 0x5C05, 0x61EF, 0x5FBC, 0x5C01, 0x5E40, 0x5F6E, + 0x60F4, 0x5E3C, 0x5F4A, 0x60AD, 0x5E38, 0x5958, 0x6063, 0x5E30, + 0x5F3E, 0x6083, 0x5E2C, 0x5F3A, 0x607E, 0x616F, 0x5F36, 0x5BE3, + 0x616B, 0x5F79, 0x5BDF, 0x61A5, 0x5F75, 0x5AFE, 0x5D55, 0x5F26, + 0x6067, 0x5D51, 0x623F, 0x6063, 0x5D4C, 0x57B5, 0x6018, 0x5D48, + 0x5EA8, 0x5FF5, 0x5D44, 0x5EA4, 0x5FF1, 0x6128, 0x5EA0, 0x5ADC, + 0x6121, 0x5EE3, 0x5AD8, 0x615F, 0x5EDF, 0x6024, 0x5C88, 0x5ED7, + 0x6020, 0x5C60, 0x61DE, 0x5FD5, 0x5CAC, 0x61DA, 0x5FD1, 0x5CA8, + 0x5E34, 0x5F86, 0x60E6, 0x5E0D, 0x5FA6, 0x60E2, 0x5E54, 0x59CC, + 0x5CEB, 0x61C6, 0x5FE1, 0x5CE7, 0x61BF, 0x5FDD, 0x5CDF, 0x619C, + 0x5FD9, 0x6088, 0x5E8B, 0x5F8E, 0x60AB, 0x5E3B, 0x6274, 0x60A3, + 0x5DE8, 0x5A6D, 0x60E2, 0x5E10, 0x5FA2, 0x60DA, 0x5E08, 0x5F9E, + 0x5C9B, 0x61A0, 0x5FE0, 0x5C97, 0x61DE, 0x5F95, 0x5CE3, 0x5E47, + 0x5F91, 0x5CDE, 0x5E3F, 0x5F46, 0x60E6, 0x5DEF, 0x59BE, 0x609F, + 0x5DEB, 0x5A17, 0x609B, 0x5E0F, 0x5FA5, 0x6097, 0x5E53, 0x5F9D, + 0x5CA2, 0x619C, 0x5F52, 0x5C9A, 0x6198, 0x5F4E, 0x5CE6, 0x5E46, + 0x5F6E, 0x5CE2, 0x5DF7, 0x5FB1, 0x609F, 0x5E1B, 0x5A52, 0x607C, + 0x5E62, 0x5A22, 0x60FD, 0x5EA2, 0x5A21, 0x5CAD, 0x5E56, 0x5F7A, + 0x5CF5, 0x61BB, 0x5FBD, 0x5CF1, 0x5851, 0x5FB5, 0x5CE9, 0x5E6E, + 0x5FB1, 0x5CE5, 0x5EB2, 0x5B14, 0x60C2, 0x5EAD, 0x5AB6, 0x60BB, + 0x5E5E, 0x5AB2, 0x60DA, 0x5E5A, 0x5ADF, 0x5D4C, 0x5E7E, 0x5FC0, + 0x5D48, 0x5F08, 0x5FE0, 0x5CF4, 0x5929, 0x601F, 0x5D19, 0x5983, + 0x601B, 0x5DB0, 0x5E92, 0x5B1B, 0x60E2, 0x5F1C, 0x5B9C, 0x60DE, + 0x5F18, 0x5C3D, 0x5D54, 0x5EC9, 0x5C35, 0x5DC4, 0x5EC5, 0x5FE4, + 0x5E08, 0x5A52, 0x6043, 0x5DB8, 0x5A4D, 0x603F, 0x5DB4, 0x5A49, + 0x603B, 0x5E20, 0x5F00, 0x6033, 0x6125, 0x5F87, 0x5C45, 0x615C, + 0x5F3C, 0x5C6D, 0x6158, 0x5F34, 0x5D05, 0x5E7F, 0x5F9B, 0x5D01, + 0x5E77, 0x5F97, 0x60A6, 0x5E2F, 0x5B89, 0x60A1, 0x5E4F, 0x5B84, + 0x60C1, 0x5ED7, 0x5B80, 0x5D61, 0x5E8B, 0x5FA7, 0x5D11, 0x5E87, + 0x5FC7, 0x5DCD, 0x59E4, 0x6006, 0x5DC5, 0x59E3, 0x5FFE, 0x5D75, + 0x5EE6, 0x5BE5, 0x5DE5, 0x5F4A, 0x5CAA, 0x6124, 0x5F46, 0x5C56, + 0x5747, 0x5EFE, 0x5C52, 0x5E45, 0x5F62, 0x5D12, 0x5E41, 0x5B28, + 0x602D, 0x5E39, 0x5B24, 0x608C, 0x5EA1, 0x5B4D, 0x5D77, 0x5E9D, + 0x5BEA, 0x5D27, 0x5E51, 0x5FD5, 0x5D26, 0x5982, 0x5FD1, 0x5DDB, + 0x5AB4, 0x5FF1, 0x5D8B, 0x5A5E, 0x5C53, 0x5DF7, 0x5F18, 0x5CC4, + 0x5DF3, 0x5F14, 0x5CBF, 0x590C, 0x5F77, 0x5CBB, 0x5908, 0x5F30, + 0x5D2C, 0x5E53, 0x5B9B, 0x5D24, 0x5EBA, 0x5B96, 0x60BA, 0x5E6F, + 0x5B92, 0x56C3, 0x5ED6, 0x5C08, 0x5D40, 0x5ED2, 0x5C03, 0x5DAC, + 0x5A5B, 0x6003, 0x5DA8, 0x5B2B, 0x5FFE, 0x5E11, 0x5AD5, 0x5CE2, + 0x5E0D, 0x5AD1, 0x5CDD, 0x5E75, 0x5F46, 0x5D4A, 0x59EE, 0x5FA9, + 0x5D46, 0x5990, 0x5FA5, 0x5DB2, 0x5A65, 0x5C09, 0x5DAE, 0x5EF1, + 0x5C7A, 0x5E16, 0x5EEC, 0x5C76, 0x5830, 0x5F50, 0x5CE7, 0x591A, + 0x5F08, 0x5CDF, 0x5E2F, 0x5B50, 0x5D4C, 0x5E93, 0x5C17, 0x6051, + 0x5E8F, 0x5BC2, 0x57B5, 0x5EAF, 0x5C84, 0x5D68, 0x5EAB, 0x5C33, + 0x5DD0, 0x5AE8, 0x603B, 0x5E35, 0x5AE4, 0x5FFB, 0x5E31, 0x5B5E, + 0x5D0D, 0x5E55, 0x5C1D, 0x5D05, 0x5E4D, 0x5F86, 0x5D72, 0x5A7C, + 0x5FA6, 0x5DDA, 0x5A78, 0x5FA2, 0x5D8E, 0x5AF2, 0x5CAA, 0x5DF7, + 0x5F31, 0x5CA6, 0x5DF2, 0x5F94, 0x5D13, 0x598B, 0x5F4D, 0x5D7C, + 0x5A0B, 0x5FAC, 0x5D2F, 0x5E73, 0x5C47, 0x5D9C, 0x5ED7, 0x5CB4, + 0x5922, 0x5EF7, 0x5CB0, 0x591A, 0x5EF3, 0x5D1D, 0x5E1D, 0x5B6E, + 0x5D3E, 0x5E81, 0x5BE3, 0x605C, 0x5E7D, 0x5C55, 0x58AC, 0x5E9D, + 0x5C4D, 0x5E0B, 0x5F01, 0x5CBE, 0x5DBF, 0x5B84, 0x5CDF, 0x5E27, + 0x5B7C, 0x6003, 0x5E8B, 0x5BEE, 0x583A, 0x5EAB, 0x5C5F, 0x5DAC, + 0x5EA7, 0x5CCC, 0x5DCD, 0x5B1C, 0x5FB2, 0x5E35, 0x5B92, 0x6011, + 0x5E31, 0x5B8A, 0x5D52, 0x5E51, 0x5BFC, 0x5D4E, 0x5EB2, 0x5F9F, + 0x5D72, 0x5AB7, 0x5FBC, 0x5DD7, 0x5B2A, 0x5FDC, 0x5DFB, 0x5BA0, + 0x5CF7, 0x5E5C, 0x5F4E, 0x5D60, 0x5E7C, 0x5F6A, 0x5D80, 0x5B1B, + 0x5C2E, 0x5945, 0x5EDC, 0x5C9C, 0x59C5, 0x5B3C, 0x5D05, 0x5A40, + 0x5BAE, 0x5D26, 0x5E22, 0x5C1C, 0x5932, 0x5E86, 0x5C40, 0x59B2, + 0x5B29, 0x5CAE, 0x5957, 0x5B4E, 0x5D17, 0x5E10, 0x5BC0, 0x583C, + 0x5E30, 0x5C2E, 0x58C4, 0x5E94, 0x5C4F, 0x5944, 0x5B3B, 0x5CBC, + 0x59C4, 0x5B60, 0x5D25, 0x5E1E, 0x5BCF, 0x585A, 0x5EA3, 0x5C40, + 0x58DB, 0x5E5E, 0x5C61, 0x595B, 0x5B4E, 0x5CCB, 0x5DEC, 0x5B73, + 0x5847, 0x5E50, 0x5BE1, 0x58C8, 0x5E6D, 0x5C4F, 0x594C, 0x5AEE, + 0x5C73, 0x5975, 0x5B60, 0x5CD9, 0x5DFA, 0x5B85, 0x585E, 0x5E5B, + 0x5BF3, 0x58E2, 0x5E7B, 0x5C5D, 0x5962, 0x5B04, 0x5CEF, 0x5DA4, + 0x5BE5, 0x5CEB, 0x5E08, 0x5C09, 0x5878, 0x5E8D, 0x5C73, 0x58F9, + 0x5B17, 0x5C98, 0x59F5, 0x5B89, 0x5CFE, 0x5E1B, 0x5BAE, 0x5869, + 0x5E3B, 0x5C18, 0x596A, 0x5E58, 0x5C3D, 0x5994, 0x5B2D, 0x5CA6, + 0x5E2D, 0x5C0A, 0x5D31, 0x5E4A, 0x5C2E, 0x5905, 0x5E6A, 0x5C53, + 0x59FD, 0x5ECA, 0x5CB9, 0x59AA, 0x5BB2, 0x5CDD, 0x5DF7, 0x5BD3, + 0x589B, 0x5E58, 0x5C3D, 0x599B, 0x5E78, 0x5CCF, 0x5A13, 0x5BC8, + 0x5CF0, 0x5E09, 0x5BED, 0x5D55, 0x5E2A, 0x5C53, 0x593A, 0x5E87, + 0x5CE2, 0x5A2A, 0x5B6C, 0x5D02, 0x5A53, 0x5BD7, 0x592B, 0x5E39, + 0x5C66, 0x59A3, 0x5E59, 0x5CF4, 0x5A45, 0x5632, 0x5D15, 0x5A6A, + 0x5BED, 0x5918, 0x5B50, 0x5C7C, 0x59BE, 0x5ECC, 0x5D07, 0x59E4, + 0x55BA, 0x5D2B, 0x5AD2, 0x56E5, 0x5D48, 0x5B66, 0x5C8F, 0x59D9, + 0x5B8B, 0x5CB3, 0x5A4C, 0x56D6, 0x5D3A, 0x5AE5, 0x5708, 0x5D5B, + 0x5B7D, 0x5818, 0x59F0, 0x5B9E, 0x5CC6, 0x5A63, 0x5BC3, 0x5D50, + 0x5AFC, 0x5783, 0x5D6D, 0x5B93, 0x5837, 0x5A0A, 0x5BB4, 0x58B4, + 0x5AA7, 0x5C44, 0x5D1E, 0x5B16, 0x5828, 0x5DA4, 0x5BA6, 0x5852, + 0x5246, 0x5BCB, 0x58CF, 0x5ABE, 0x5C5A, 0x59ED, 0x5B52, 0x5843, + 0x5DB6, 0x5B77, 0x58EE, 0x5DD7, 0x5C03, 0x5966, 0x5492, 0x5C6D, + 0x5A08, 0x5BD7, 0x58E0, 0x5AA1, 0x5BF8, 0x5909, 0x5E0A, 0x5C84, + 0x59AF, 0x55BD, 0x5CA8, 0x5A48, 0x5684, 0x5CC5, 0x5AB8, 0x5C0B, + 0x599D, 0x5B06, 0x5C55, 0x5A3A, 0x5675, 0x5CDC, 0x5AD3, 0x5732, + 0x5D62, 0x5AF8, 0x57E3, 0x59B7, 0x5B88, 0x5CCE, 0x5A51, 0x5BAD, + 0x5CF2, 0x5AE9, 0x57D4, 0x5D99, 0x5B34, 0x5883, 0x5A6C, 0x5BC4, + 0x5926, 0x5B04, 0x5C53, 0x5D26, 0x5B29, 0x5874, 0x5D6B, 0x5BB9, + 0x591B, 0x5A86, 0x5BFF, 0x5941, 0x5B1B, 0x5C87, 0x5A09, 0x56A2, + 0x5CAB, 0x5AA1, 0x57DD, 0x5CF1, 0x5B32, 0x5889, 0x59FA, 0x5B57, + 0x5CC2, 0x5A93, 0x574C, 0x5CE3, 0x5ADE, 0x57F9, 0x5D87, 0x5B72, + 0x58CE, 0x5AAE, 0x5B93, 0x596D, 0x5AD3, 0x581C, 0x5D17, 0x5B89, + 0x58C0, 0x5DBA, 0x5BAA, 0x5962, 0x554E, 0x5C36, 0x5A26, 0x5B7E, + 0x58DF, 0x5A4B, 0x5BC5, 0x5981, 0x5ADF, 0x5C50, 0x59A3, 0x56C1, + 0x5C92, 0x5A66, 0x5776, 0x5924, 0x5AF7, 0x5822, 0x59C2, 0x5BB0, + 0x5CA9, 0x5A5B, 0x5713, 0x5CCA, 0x5B12, 0x583E, 0x5244, 0x5B5C, + 0x5868, 0x5A73, 0x5BE8, 0x59AD, 0x5B2C, 0x5861, 0x59FC, 0x5B4E, + 0x5904, 0x54A9, 0x5BFF, 0x59C8, 0x55A8, 0x5C45, 0x59ED, 0x56EE, + 0x591F, 0x5AA9, 0x5BAF, 0x59E3, 0x562A, 0x5C5C, 0x5A09, 0x5712, + 0x5C7D, 0x5AC3, 0x57BF, 0x5964, 0x5B76, 0x5891, 0x5A24, 0x5736, + 0x595A, 0x5ADB, 0x57DF, 0x5CD6, 0x5B25, 0x58AD, 0x5415, 0x5BB1, + 0x5979, 0x55AC, 0x57FE, 0x599B, 0x5B40, 0x58CC, 0x5A5A, 0x5BEE, + 0x5994, 0x5660, 0x5C0F, 0x5A50, 0x568B, 0x58EB, 0x5A75, 0x57E9, + 0x59AC, 0x5B28, 0x58B7, 0x5A6B, 0x5732, 0x5C8D, 0x5AB6, 0x5808, + 0x59CB, 0x5AD7, 0x5C61, 0x5A86, 0x5780, 0x5CA4, 0x5ACD, 0x5828, + 0x59E6, 0x5B7F, 0x58F2, 0x5AA1, 0x581E, 0x5CBA, 0x5AE8, 0x5872, + 0x5CFC, 0x5B96, 0x5937, 0x55CD, 0x5BDC, 0x59F7, 0x5AFF, 0x5891, + 0x5A42, 0x5BD6, 0x5956, 0x5AF5, 0x5C18, 0x5A12, 0x5784, 0x5C5B, + 0x5A5D, 0x57AE, 0x5971, 0x5B10, 0x58A6, 0x5A53, 0x57A3, 0x596B, + 0x5A9E, 0x5872, 0x5D37, 0x5B50, 0x58C2, 0x5544, 0x5B93, 0x5983, + 0x5632, 0x58BB, 0x5A64, 0x57B9, 0x597C, 0x5AAF, 0x5BCF, 0x59C7, + 0x5705, 0x5C12, 0x5A13, 0x57DC, 0x52B6, 0x5AEC, 0x58CC, 0x5A09, + 0x5728, 0x591C, 0x5ABC, 0x5826, 0x59D9, 0x5B03, 0x58E8, 0x554C, + 0x5B6F, 0x59D2, 0x5665, 0x5842, 0x5A1A, 0x573E, 0x5931, 0x5A65, + 0x583B, 0x5A13, 0x5737, 0x5C54, 0x5A5B, 0x578C, 0x53A3, 0x5AA2, + 0x5881, 0x5562, 0x5B76, 0x5942, 0x55C1, 0x5850, 0x59B4, 0x5B6F, + 0x58C7, 0x55BA, 0x5BB2, 0x5987, 0x5698, 0x50C4, 0x59F9, 0x579B, + 0x597D, 0x5ACE, 0x588C, 0x59C9, 0x5790, 0x58DC, 0x5AA2, 0x57E5, + 0x54AE, 0x5B0E, 0x58D2, 0x5511, 0x5B55, 0x59B8, 0x56A7, 0x58CB, + 0x5A00, 0x57A6, 0x5917, 0x55ED, 0x5B8E, 0x59F9, 0x56F6, 0x5214, + 0x5A66, 0x57F0, 0x5CB8, 0x5AAD, 0x586B, 0x5A3A, 0x5B7D, 0x5952, + 0x5AA7, 0x5864, 0x5C91, 0x5AEA, 0x5948, 0x562F, 0x5BDB, 0x5993, + 0x5733, 0x5C1D, 0x5A93, 0x5829, 0x598D, 0x5ADA, 0x5C14, 0x59FB, + 0x577D, 0x5C77, 0x5AD0, 0x5899, 0x5530, 0x5B38, 0x58E5, 0x566D, + 0x5864, 0x59EA, 0x5B32, 0x58DB, 0x5A35, 0x5B9A, 0x59E3, 0x5766, + 0x5BDC, 0x5A2B, 0x57B7, 0x5457, 0x5A94, 0x58CA, 0x5A21, 0x57AC, + 0x5940, 0x5A8D, 0x58C0, 0x59AE, 0x5AF6, 0x5936, 0x56A1, 0x5B5F, + 0x59A7, 0x56FA, 0x533E, 0x5A7D, 0x5816, 0x599D, 0x56EF, 0x5925, + 0x59E5, 0x5810, 0x5993, 0x5ADC, 0x5883, 0x55AE, 0x5B44, 0x598C, + 0x56DE, 0x587C, 0x59FA, 0x575E, 0x5986, 0x562D, 0x5876, 0x59F0, + 0x5754, 0x58E8, 0x5A5D, 0x586B, 0x54DE, 0x5AC6, 0x58E2, 0x561C, + 0x57C5, 0x5950, 0x5743, 0x58D4, 0x5615, 0x57BE, 0x5946, 0x573C, + 0x529E, 0x5A68, 0x57B4, 0x54C2, 0x5AD1, 0x58ED, 0x5554, 0x57D8, + 0x595F, 0x5685, 0x584F, 0x5549, 0x57CD, 0x5955, 0x56A9, 0x5282, + 0x59C3, 0x57C7, 0x53EF, 0x5A52, 0x583E, 0x5568, 0x571F, 0x58B1, + 0x5698, 0x5834, 0x5561, 0x5AB4, 0x58D0, 0x568E, 0x518A, 0x593F, + 0x5739, 0x5407, 0x5A5D, 0x584D, 0x554F, 0x5732, 0x58E6, 0x59CC, + 0x57AA, 0x5490, 0x5AE1, 0x58DF, 0x55FA, 0x5175, 0x594D, 0x5721, + 0x532B, 0x59E1, 0x57C3, 0x596A, 0x5741, 0x5837, 0x59FD, 0x57B9, + 0x54A7, 0x5A66, 0x5857, 0x560D, 0x5195, 0x597F, 0x5692, 0x5347, + 0x5607, 0x57D2, 0x58E9, 0x56B2, 0x5870, 0x5A08, 0x57F2, 0x54C3, + 0x5A93, 0x588C, 0x5621, 0x5097, 0x58FE, 0x56CC, 0x5885, 0x5645, + 0x5748, 0x591A, 0x56C2, 0x58A2, 0x59AE, 0x5765, 0x54D7, 0x5A3A, + 0x58C1, 0x558C, 0x5789, 0x5930, 0x56DC, 0x5823, 0x55B1, 0x5782, + 0x594F, 0x5700, 0x581C, 0x59DF, 0x579F, 0x5438, 0x5A6A, 0x583C, + 0x55CF, 0x57BF, 0x58D5, 0x5741, 0x585C, 0x55C5, 0x57DF, 0x58F1, + 0x569C, 0x587C, 0x5985, 0x57D8, 0x5480, 0x5A11, 0x5898, 0x560E, + 0x57F8, 0x592D, 0x56B6, 0x58B8, 0x5632, 0x5755, 0x5949, 0x56DA, + 0x5319, 0x59D8, 0x5779, 0x54C4, 0x5A86, 0x5839, 0x564C, 0x5799, + 0x58D2, 0x5717, 0x5859, 0x566D, 0x5A84, 0x58EE, 0x573B, 0x5484, + 0x59A1, 0x57D9, 0x5537, 0x5A30, 0x5895, 0x55E4, 0x57F6, 0x5926, + 0x5A48, 0x58B5, 0x560C, 0x5AF4, 0x5968, 0x579B, 0x53E5, 0x59F4, + 0x534A, 0x5984, 0x56FB, 0x540B, 0x5678, 0x5878, 0x59A3, 0x5718, + 0x5438, 0x5A51, 0x57DD, 0x55EE, 0x51D2, 0x5899, 0x56BD, 0x53C7, + 0x560F, 0x5783, 0x5482, 0x56DE, 0x53F0, 0x596F, 0x57A3, 0x54D7, + 0x5A1D, 0x5860, 0x567F, 0x5259, 0x5917, 0x5749, 0x543F, 0x569F, + 0x5806, 0x5521, 0x5790, 0x5494, 0x55FA, 0x584C, 0x5572, 0x5210, + 0x5904, 0x5645, 0x5313, 0x5905, 0x5710, 0x54E2, 0x5666, 0x57D1, + 0x55E3, 0x5757, 0x5532, 0x56B1, 0x5814, 0x5607, 0x52CB, 0x58F2, + 0x56F9, 0x53C0, 0x5653, 0x57BE, 0x55A4, 0x571D, 0x53E6, 0x569E, + 0x5801, 0x55F0, 0x5764, 0x58DF, 0x56BF, 0x537C, 0x598E, 0x57AB, + 0x5490, 0x5706, 0x588A, 0x556A, 0x57EE, 0x54B5, 0x574D, 0x57F3, + 0x55BA, 0x5364, 0x58CD, 0x56B0, 0x544D, 0x4EDC, 0x5799, 0x5556, + 0x5199, 0x5878, 0x5651, 0x57DC, 0x55A3, 0x573F, 0x58BA, 0x569D, + 0x5439, 0x59B1, 0x5786, 0x5543, 0x5185, 0x5888, 0x563E, 0x52B7, + 0x5593, 0x574F, 0x58CA, 0x56AD, 0x5832, 0x58CE, 0x5796, 0x552F, + 0x59C2, 0x582B, 0x5652, 0x52A3, 0x589C, 0x5715, 0x53C5, 0x55AC, + 0x5741, 0x54D4, 0x569F, 0x541A, 0x59D1, 0x57AE, 0x554C, 0x528F, + 0x5497, 0x566B, 0x5817, 0x5598, 0x577B, 0x5910, 0x56B2, 0x5433, + 0x5932, 0x57BE, 0x5564, 0x527B, 0x58BF, 0x567F, 0x53CA, 0x55AD, + 0x578E, 0x5500, 0x56F1, 0x544B, 0x5620, 0x57D1, 0x5578, 0x5104, + 0x57F9, 0x5693, 0x53E6, 0x55EC, 0x56B9, 0x5518, 0x5665, 0x52FB, + 0x5592, 0x5706, 0x546C, 0x5664, 0x582F, 0x5595, 0x52BE, 0x5905, + 0x56D6, 0x5403, 0x50B0, 0x5800, 0x555D, 0x524F, 0x5484, 0x569F, + 0x5842, 0x55D4, 0x52DE, 0x5890, 0x570D, 0x544B, 0x50D2, 0x57A3, + 0x559C, 0x526F, 0x54C8, 0x56DD, 0x5413, 0x5637, 0x5327, 0x5568, + 0x56D3, 0x5490, 0x56A6, 0x5796, 0x5603, 0x52BD, 0x58B6, 0x5608, + 0x5457, 0x55AA, 0x5766, 0x5580, 0x569E, 0x54FB, 0x55D4, 0x57EF, + 0x5504, 0x5189, 0x581A, 0x566E, 0x5340, 0x4F54, 0x57C0, 0x54CC, + 0x514A, 0x53EE, 0x563A, 0x5302, 0x556B, 0x520C, 0x5497, 0x56F3, + 0x53B5, 0x58D9, 0x571F, 0x5537, 0x519D, 0x5866, 0x569C, 0x537C, + 0x55FA, 0x56EF, 0x552A, 0x5626, 0x5425, 0x55F3, 0x579F, 0x55C5, + 0x5220, 0x57E7, 0x55F2, 0x5419, 0x4FD1, 0x5796, 0x5517, 0x51E2, + 0x54C1, 0x55E9, 0x53E3, 0x54EE, 0x52CF, 0x586C, 0x56A6, 0x5431, + 0x55DC, 0x56EC, 0x54E5, 0x56E9, 0x585F, 0x5699, 0x531B, 0x58A9, + 0x56C2, 0x54D8, 0x5668, 0x580A, 0x563E, 0x579C, 0x559F, 0x56B5, + 0x57E1, 0x55E9, 0x5399, 0x58FE, 0x578F, 0x5592, 0x5157, 0x57DA, + 0x55E6, 0x538C, 0x5560, 0x5739, 0x5533, 0x56C6, 0x548A, 0x55D9, + 0x570C, 0x54E2, 0x526A, 0x5833, 0x56BA, 0x547D, 0x4FC5, 0x5709, + 0x54D9, 0x5230, 0x5422, 0x5663, 0x5420, 0x55EB, 0x536D, 0x54CC, + 0x5635, 0x53C7, 0x50F5, 0x5789, 0x55DE, 0x5360, 0x4DCA, 0x562E, + 0x53BE, 0x55B0, 0x52D0, 0x5583, 0x570D, 0x5506, 0x523D, 0x57A2, + 0x5555, 0x5273, 0x580F, 0x56DA, 0x54FD, 0x51D2, 0x57DE, 0x5579, + 0x5297, 0x54CB, 0x5687, 0x549D, 0x565A, 0x53F3, 0x5594, 0x571A, + 0x546E, 0x5134, 0x5765, 0x5603, 0x5412, 0x4F43, 0x5734, 0x5493, + 0x515C, 0x53DF, 0x55AB, 0x53B1, 0x55A5, 0x52F9, 0x54D9, 0x566A, + 0x537E, 0x4FAA, 0x56DD, 0x554A, 0x531C, 0x4B59, 0x5685, 0x53A3, + 0x4FD3, 0x52E9, 0x54F1, 0x5657, 0x54EB, 0x51F9, 0x575D, 0x55DD, + 0x5283, 0x4DFB, 0x5677, 0x548F, 0x521D, 0x5461, 0x55F8, 0x52DD, + 0x54E1, 0x51E9, 0x5432, 0x55A2, 0x542C, 0x50B8, 0x56D5, 0x5573, + 0x56AC, 0x53DB, 0x514A, 0x578A, 0x5545, 0x539D, 0x5542, 0x567C, + 0x544A, 0x5652, 0x536D, 0x551A, 0x5732, 0x54E6, 0x525A, 0x580B, + 0x561F, 0x533E, 0x5031, 0x5702, 0x54B2, 0x52D7, 0x5488, 0x55CB, + 0x53DE, 0x55C9, 0x52A3, 0x54B2, 0x56A9, 0x5453, 0x51B3, 0x5784, + 0x556E, 0x52A0, 0x4F07, 0x567A, 0x53F6, 0x5234, 0x53F0, 0x553D, + 0x5399, 0x5510, 0x51D0, 0x5496, 0x5620, 0x5393, 0x510A, 0x5700, + 0x54DF, 0x522E, 0x4DCA, 0x55F0, 0x5367, 0x515F, 0x532F, 0x54B4, + 0x5329, 0x5480, 0x512B, 0x547A, 0x5597, 0x52F9, 0x508E, 0x567B, + 0x544C, 0x5211, 0x4C76, 0x5566, 0x539F, 0x5080, 0x5291, 0x550F, + 0x528B, 0x53EC, 0x5052, 0x53E6, 0x5508, 0x525B, 0x500D, 0x55F2, + 0x5411, 0x5222, 0x4AFA, 0x55C3, 0x5387, 0x4FCD, 0x51F2, 0x54A4, + 0x51EB, 0x5354, 0x506A, 0x5351, 0x54F6, 0x52F7, 0x4F59, 0x564D, + 0x5449, 0x5182, 0x4947, 0x5538, 0x52ED, 0x4F19, 0x514A, 0x5418, + 0x5147, 0x5412, 0x5114, 0x52B8, 0x5502, 0x52B2, 0x4E9B, 0x55C4, + 0x53DD, 0x50D9, 0x473E, 0x54D1, 0x524F, 0x4E57, 0x524D, 0x5380, + 0x509E, 0x537D, 0x5098, 0x5219, 0x5473, 0x5213, 0x4DD8, 0x553A, + 0x5348, 0x502F, 0x4462, 0x54E6, 0x51DD, 0x4D8F, 0x51D7, 0x5411, + 0x4FEF, 0x52E4, 0x4FED, 0x52DE, 0x53E3, 0x5173, 0x4D46, 0x559A, + 0x53DA, 0x4FAE, 0x3FFE, 0x54A3, 0x52A6, 0x4CFD, 0x5136, 0x53A9, + 0x5134, 0x537A, 0x4F6B, 0x5274, 0x5470, 0x5241, 0x4C73, 0x5533, + 0x5345, 0x50C5, 0x3FFE, 0x543F, 0x520B, 0x4EF0, 0x5209, 0x5314, + 0x508B, 0x530E, 0x5088, 0x530B, 0x5408, 0x51CF, 0x4EAA, 0x556C, + 0x53D7, 0x504D, 0x3FFE, 0x54A0, 0x52D0, 0x4E6D, 0x5196, 0x53A6, + 0x5190, 0x53A0, 0x500C, 0x529E, 0x546D, 0x526F, 0x4E26, 0x55C8, + 0x536F, 0x512A, 0x4B2C, 0x5500, 0x5239, 0x4DE5, 0x5237, 0x540C, + 0x50EF, 0x530F, 0x50ED, 0x5309, 0x54A6, 0x5201, 0x4D9D, 0x5565, + 0x53D5, 0x50B2, 0x4A89, 0x5475, 0x52D1, 0x4F17, 0x51C4, 0x53A0, + 0x51BE, 0x539D, 0x5075, 0x529B, 0x543F, 0x5299, 0x4ED5, 0x559A, + 0x543A, 0x5186, 0x4CCF, 0x54D6, 0x5263, 0x5031, 0x5261, 0x5405, + 0x514F, 0x53DB, 0x511C, 0x530A, 0x54A0, 0x5304, 0x4FF3, 0x55D2, + 0x53D2, 0x51F6, 0x4E4D, 0x550F, 0x52D2, 0x4FB8, 0x52CC, 0x5442, + 0x51C0, 0x543D, 0x51BD, 0x5370, 0x54D9, 0x536E, 0x50A0, 0x5607, + 0x540C, 0x5187, 0x4DC5, 0x5185, 0x5339, 0x5068, 0x5336, 0x5066, + 0x525C, 0x53D8, 0x525A, 0x4F01, 0x5511, 0x53D0, 0x5146, 0x4B8A, + 0x5449, 0x5224, 0x4EF3, 0x521E, 0x539F, 0x510F, 0x5399, 0x510D, + 0x52C7, 0x54B2, 0x52C5, 0x4FE5, 0x554A, 0x540D, 0x51BA, 0x4D27, + 0x54A6, 0x533A, 0x4FAA, 0x528D, 0x53DC, 0x51B1, 0x53DA, 0x517E, + 0x5309, 0x54E8, 0x5303, 0x5091, 0x55EE, 0x5447, 0x522A, 0x4F63, + 0x5553, 0x539D, 0x5143, 0x4C94, 0x54B3, 0x52C9, 0x5051, 0x51EE, + 0x540D, 0x51EB, 0x5369, 0x510A, 0x533F, 0x5480, 0x5295, 0x5014, + 0x4A2E, 0x53DA, 0x51B3, 0x4EE4, 0x50CD, 0x530B, 0x50C7, 0x525D, + 0x4FDA, 0x5257, 0x5444, 0x517A, 0x4EA1, 0x54B9, 0x52D3, 0x508E, + 0x4D53, 0x54B0, 0x521F, 0x4F96, 0x521C, 0x536D, 0x513C, 0x5343, + 0x5139, 0x5299, 0x547E, 0x5297, 0x4F58, 0x5562, 0x53B4, 0x51E2, + 0x4E1A, 0x54C2, 0x5309, 0x50FE, 0x525F, 0x5421, 0x5259, 0x4F14, + 0x51A9, 0x537A, 0x517A, 0x52D5, 0x50C1, 0x52D3, 0x548A, 0x5224, + 0x4FCE, 0x556B, 0x53E9, 0x516B, 0x4ED0, 0x54CF, 0x533E, 0x5086, + 0x5299, 0x5452, 0x51EA, 0x53B2, 0x51E4, 0x53AF, 0x549C, 0x530B, + 0x5104, 0x5305, 0x5422, 0x525B, 0x5044, 0x5574, 0x537C, 0x51A9, + 0x4E4D, 0x54FF, 0x52D1, 0x50C5, 0x4D36, 0x545E, 0x5224, 0x5004, + 0x5222, 0x53BD, 0x516E, 0x5340, 0x516C, 0x5297, 0x542C, 0x5295, + 0x4FC7, 0x5580, 0x5389, 0x51E4, 0x4ECD, 0x5508, 0x5307, 0x5131, + 0x52DC, 0x504A, 0x525E, 0x4F87, 0x5258, 0x4F84, 0x51AD, 0x534D, + 0x51A7, 0x4DB0, 0x5438, 0x52A6, 0x5038, 0x4C92, 0x53BB, 0x521E, + 0x4F44, 0x5172, 0x5317, 0x516C, 0x5311, 0x50B7, 0x526C, 0x53FD, + 0x5269, 0x4FCC, 0x552F, 0x535B, 0x5137, 0x4E35, 0x54B6, 0x52DB, + 0x507B, 0x4D21, 0x5079, 0x522F, 0x4FBA, 0x51A9, 0x4EC3, 0x517D, + 0x5322, 0x50F6, 0x4DF1, 0x547F, 0x529F, 0x5039, 0x4CD9, 0x5405, + 0x51F2, 0x4F74, 0x5143, 0x52E9, 0x5140, 0x52E6, 0x50B8, 0x5269, + 0x4FFE, 0x523E, 0x4FF8, 0x51B8, 0x532F, 0x51B5, 0x4F35, 0x5488, + 0x52B0, 0x5103, 0x4D63, 0x5076, 0x522C, 0x4FB8, 0x5201, 0x4FB5, + 0x517B, 0x536E, 0x5178, 0x4EF2, 0x5451, 0x52EF, 0x50C1, 0x4D1B, + 0x53B3, 0x526B, 0x4F79, 0x4B3E, 0x5338, 0x513E, 0x4EAE, 0x513B, + 0x52B5, 0x508A, 0x52B3, 0x4FF9, 0x5235, 0x537B, 0x518A, 0x4F37, + 0x5184, 0x4F34, 0x54A5, 0x52F6, 0x50FE, 0x4D9A, 0x542F, 0x5276, + 0x5046, 0x51F8, 0x53B5, 0x51CD, 0x533D, 0x514A, 0x5337, 0x5471, + 0x52BE, 0x50BD, 0x5526, 0x53F7, 0x523E, 0x5004, 0x4C70, 0x537D, + 0x5190, 0x4F70, 0x510D, 0x52FE, 0x5107, 0x5282, 0x507F, 0x527F, + 0x53BC, 0x5201, 0x4FC6, 0x54C7, 0x5342, 0x5153, 0x4F31, 0x544E, + 0x52C6, 0x50C9, 0x4D9B, 0x5041, 0x5243, 0x503B, 0x51C4, 0x4F83, + 0x5199, 0x5309, 0x5116, 0x4EEE, 0x5487, 0x528A, 0x508C, 0x4E22, + 0x5412, 0x51E5, 0x4FFD, 0x4CAA, 0x5398, 0x5160, 0x4F3F, 0x515A, + 0x4EAB, 0x50D6, 0x52A4, 0x50D4, 0x4DDE, 0x53DA, 0x5224, 0x5046, + 0x4D3A, 0x5360, 0x51A0, 0x4F00, 0x4B78, 0x52E5, 0x511A, 0x4E66, + 0x5093, 0x5266, 0x5090, 0x5263, 0x5008, 0x51E5, 0x5376, 0x51E3, + 0x4F78, 0x4B63, 0x52FB, 0x515E, 0x4EB4, 0x4A6A, 0x52A4, 0x5053, + 0x4E1A, 0x5050, 0x5224, 0x4FC7, 0x51A6, 0x4FC1, 0x51A4, 0x5336, + 0x5121, 0x4E75, 0x543E, 0x52BB, 0x509B, 0x4DD6, 0x4904, 0x51EC, + 0x5010, 0x4D36, 0x500A, 0x5167, 0x4F80, 0x5165, 0x4EEE, 0x515F, + 0x5282, 0x50DF, 0x4E29, 0x5391, 0x5203, 0x5055, 0x4D8E, 0x538C, + 0x5182, 0x4FC9, 0x4C13, 0x4F3B, 0x5125, 0x4F39, 0x50FA, 0x4EAA, + 0x509F, 0x5241, 0x509D, 0x4D4A, 0x539F, 0x51C1, 0x5012, 0x4CA4, + 0x5328, 0x51B9, 0x4F82, 0x4BF9, 0x52D5, 0x50BA, 0x4EF2, 0x50B8, + 0x4E62, 0x505D, 0x5200, 0x502D, 0x4CFD, 0x5362, 0x5180, 0x4F48, + 0x4C56, 0x52EB, 0x517B, 0x4F3F, 0x4BAB, 0x5270, 0x50F6, 0x4EAA, + 0x5072, 0x5215, 0x4FED, 0x5212, 0x4FEB, 0x4D7B, 0x5301, 0x5192, + 0x4F5B, 0x4C05, 0x52AB, 0x5110, 0x4EF8, 0x4B58, 0x522F, 0x50B4, + 0x4E62, 0x502F, 0x5226, 0x502D, 0x51AC, 0x4FA8, 0x5156, 0x52C1, + 0x5154, 0x4F17, 0x4C8D, 0x52BC, 0x50CF, 0x4EB0, 0x4B05, 0x5241, + 0x504C, 0x4E1A, 0x4FED, 0x51E9, 0x4FEA, 0x51E3, 0x4FE8, 0x5168, + 0x52D2, 0x5166, 0x4F5C, 0x5110, 0x527C, 0x508C, 0x4E69, 0x4AEF, + 0x5200, 0x5084, 0x4DD6, 0x5003, 0x51FB, 0x5001, 0x517D, 0x4FA1, + 0x517B, 0x52E0, 0x5124, 0x4F15, 0x5122, 0x5269, 0x511C, 0x4E84, + 0x534F, 0x5211, 0x5045, 0x4DF1, 0x5043, 0x520D, 0x4FBE, 0x518F, + 0x4FB8, 0x513D, 0x52F2, 0x5137, 0x4F2C, 0x53D3, 0x5277, 0x50B5, + 0x4EC9, 0x535D, 0x5223, 0x5058, 0x4E37, 0x5355, 0x51CC, 0x5053, + 0x4DA0, 0x4FCE, 0x4D3A, 0x4F73, 0x5149, 0x4F70, 0x4C99, 0x5288, + 0x50F0, 0x4EE4, 0x4BF6, 0x5235, 0x506E, 0x4E7D, 0x4AA1, 0x522D, + 0x5066, 0x4DEA, 0x500E, 0x4DE8, 0x4F89, 0x515B, 0x4F87, 0x4CEC, + 0x4F81, 0x5156, 0x4F24, 0x4C4A, 0x5292, 0x5084, 0x4E97, 0x4BA3, + 0x4E95, 0x507C, 0x4E05, 0x5021, 0x4E03, 0x501E, 0x4D9D, 0x501C, + 0x4D9B, 0x4F9B, 0x5168, 0x4F95, 0x4CFF, 0x52A3, 0x50EB, 0x4F33, + 0x4BF7, 0x4EAC, 0x5092, 0x4EA9, 0x4BEF, 0x4E48, 0x5089, 0x4E46, + 0x502F, 0x4E40, 0x502C, 0x51C9, 0x4FAB, 0x4D49, 0x4FA9, 0x50FD, + 0x4F4D, 0x4CB1, 0x48A2, 0x50F8, 0x4F44, 0x4C13, 0x4EBE, 0x509C, + 0x4E5D, 0x5099, 0x4E5B, 0x5097, 0x4E55, 0x5017, 0x4DC8, 0x4FBF, + 0x515F, 0x4FBD, 0x4D64, 0x49C5, 0x515A, 0x4F5B, 0x4D5B, 0x4F59, + 0x5102, 0x4F56, 0x4C5A, 0x4F54, 0x50A9, 0x4ECA, 0x50A7, 0x4E6D, + 0x4B4A, 0x51C4, 0x5024, 0x4E64, 0x4B41, 0x51BB, 0x4FCB, 0x4D76, + 0x49E9, 0x5164, 0x4FC2, 0x4D6E, 0x4FC0, 0x510F, 0x4F64, 0x50E4, + 0x4EE2, 0x4C6E, 0x4EDC, 0x508F, 0x4ED9, 0x4C00, 0x51CD, 0x5086, + 0x4E76, 0x4BFB, 0x51A4, 0x502D, 0x4E17, 0x502B, 0x514C, 0x5025, + 0x4D84, 0x4A3A, 0x5144, 0x4F4C, 0x4D7B, 0x4907, 0x50EF, 0x4F44, + 0x4D13, 0x4EEB, 0x50E7, 0x4EE9, 0x50E4, 0x4EE3, 0x4C12, 0x4EE0, + 0x503B, 0x4E84, 0x4C0D, 0x51A5, 0x500D, 0x4DF6, 0x4AFF, 0x517B, + 0x4FB3, 0x4D92, 0x4AFA, 0x4D8F, 0x4FAB, 0x4D8D, 0x4FA8, 0x4D87, + 0x4F4D, 0x50CC, 0x4F4A, 0x4D22, 0x4F48, 0x50C4, 0x4EF0, 0x4C89, + 0x47D2, 0x50BF, 0x4E67, 0x4C1F, 0x4E61, 0x5066, 0x4E5E, 0x4BB0, + 0x4E5C, 0x500D, 0x4DFB, 0x4FB6, 0x4DF8, 0x4B0A, 0x5126, 0x4F88, + 0x4DF0, 0x4A96, 0x50FC, 0x4F83, 0x4D05, 0x4971, 0x50F4, 0x4F25, + 0x4C9B, 0x4F23, 0x4C99, 0x4F20, 0x4C93, 0x4EC4, 0x4C90, 0x4EC2, + 0x5094, 0x4EBF, 0x4C26, 0x5185, 0x503F, 0x4E60, 0x4C21, 0x46C7, + 0x4FE6, 0x4DD3, 0x4B18, 0x4DD0, 0x4FB8, 0x4DCE, 0x4F86, 0x4D70, + 0x4F5E, 0x4D69, 0x4F5B, 0x4D67, 0x4A9C, 0x511C, 0x4F53, 0x4D02, + 0x497C, 0x50C8, 0x4EF8, 0x4CFA, 0x4973, 0x50BF, 0x4EF0, 0x4CF4, + 0x4EED, 0x4C01, 0x4E95, 0x5014, 0x4E8F, 0x4BF8, 0x4E8C, 0x500F, + 0x4E8A, 0x4B8A, 0x5150, 0x4FE5, 0x4E2B, 0x4B85, 0x4DCD, 0x4F88, + 0x4DA0, 0x4B15, 0x4D9E, 0x4F83, 0x4D98, 0x4F80, 0x4D3A, 0x4F7E, + 0x4D37, 0x4F78, 0x50C5, 0x4F75, 0x4D2F, 0x51FC, 0x50BD, 0x4F1B, + 0x4CCA, 0x51F4, 0x506C, 0x4F13, 0x4CC5, 0x4EBB, 0x5063, 0x4EB8, + 0x4CC0, 0x4EB6, 0x505B, 0x4E5D, 0x5058, 0x4E57, 0x4C54, 0x4E2E, + 0x5003, 0x4E28, 0x4B58, 0x5141, 0x4FAA, 0x4DC8, 0x4B4F, 0x5117, + 0x4FA5, 0x4DC3, 0x4B4A, 0x4DC1, 0x4F7B, 0x4DBB, 0x4F75, 0x4DB8, + 0x4F72, 0x4DB6, 0x4F70, 0x4DB3, 0x4ACF, 0x50B3, 0x4F16, 0x4D53, + 0x4ACA, 0x50AE, 0x4F0D, 0x4D4B, 0x4A5A, 0x50AA, 0x4F08, 0x4CEA, + 0x4F06, 0x4CE4, 0x4F00, 0x4C85, 0x4EFD, 0x4C82, 0x4EA5, 0x5025, + 0x4EA3, 0x4C4E, 0x48B7, 0x501D, 0x4E48, 0x4BE8, 0x48B1, 0x5018, + 0x4E3F, 0x4BDF, 0x4E16, 0x4BDD, 0x4E14, 0x4BDA, 0x4E0E, 0x4BD8, + 0x4E0B, 0x5008, 0x4E09, 0x4BD3, 0x4E06, 0x4FB3, 0x4E04, 0x4BCA, + 0x481B, 0x4FAE, 0x4DFB, 0x4BC5, 0x4DF9, 0x4F54, 0x4DF6, 0x4B5A, + 0x4D99, 0x4B58, 0x4D97, 0x4F24, 0x4D94, 0x4AE9, 0x4D92, 0x4F1F, + 0x4D34, 0x4A7D, 0x508E, 0x4F1A, 0x4D2C, 0x4A47, 0x4D29, 0x4F11, + 0x4D00, 0x4A42, 0x4CFA, 0x4F0D, 0x4CF7, 0x4F07, 0x4CF5, 0x4A36, + 0x4CF2, 0x4EB0, 0x4CF0, 0x4A2E, 0x5025, 0x4EA7, 0x4CE7, 0x4A28, + 0x4285, 0x4E7D, 0x4CE2, 0x4A23, 0x4CE0, 0x4E78, 0x4C81, 0x4EC7, + 0x4C7F, 0x4EC5, 0x4C78, 0x4E6D, 0x4C76, 0x49A7, 0x4FE3, 0x4E68, + 0x4C10, 0x4930, 0x4FDE, 0x4E5F, 0x4C41, 0x492B, 0x4C3B, 0x4E04, + 0x4C38, 0x4E32, 0x4C36, 0x4E2C, 0x4C33, 0x4E29, 0x4C8D, 0x4E27, + 0x4FA4, 0x4E24, 0x4C2C, 0x48E4, 0x4F9C, 0x4E1C, 0x4C23, 0x48DF, + 0x4F97, 0x4E17, 0x4BBD, 0x48D6, 0x4BBB, 0x4DBC, 0x4BB8, 0x4DE6, + 0x4BB6, 0x4DE3, 0x4FB3, 0x4DE1, 0x4BE2, 0x4E31, 0x4F5D, 0x4DDC, + 0x4BDA, 0x484D, 0x4F58, 0x4DD3, 0x4BD5, 0x4848, 0x4F7B, 0x4DCE, + 0x4BD0, 0x4D75, 0x4B6C, 0x4DA3, 0x4F74, 0x4DA1, 0x4B67, 0x4DF1, + 0x4F1E, 0x4DEF, 0x4B94, 0x4873, 0x4F41, 0x4D93, 0x4BEC, 0x48DC, + 0x4F3C, 0x4D8B, 0x4B8A, 0x4D88, 0x4F38, 0x4DB6, 0x4F32, 0x4E06, + 0x4B7F, 0x4DAD, 0x4F2D, 0x4DAB, 0x4B7A, 0x5095, 0x4F50, 0x4DA6, + 0x4C04, 0x481D, 0x4F4B, 0x4D9D, 0x4BA2, 0x4DCB, 0x4F21, 0x4DC9, + 0x4B9D, 0x4DC3, 0x4F69, 0x4DC0, 0x4F67, 0x4DBE, 0x4B66, 0x5057, + 0x4F11, 0x4D8F, 0x4BBF, 0x507A, 0x4F85, 0x4DE0, 0x4BBA, 0x4DDE, + 0x4F33, 0x4D85, 0x4BB5, 0x4D83, 0x4F2A, 0x4D80, 0x4F28, 0x4DFD, + 0x4BDB, 0x4909, 0x4F4B, 0x4DA2, 0x4BD6, 0x4893, 0x4F46, 0x4D9D, + 0x4BD1, 0x48CE, 0x4BA3, 0x4E17, 0x4BFE, 0x4932, 0x4BF8, 0x4DBF, + 0x4BF5, 0x4DBD, 0x4BF3, 0x4927, 0x4BF0, 0x4DE1, 0x4BEE, 0x4921, + 0x4F33, 0x4DDC, 0x4C1A, 0x49C0, 0x445B, 0x4DD7, 0x4C11, 0x4953, + 0x4C0F, 0x4DFE, 0x4C3E, 0x494A, 0x4C3B, 0x49E7, 0x4C39, 0x4DF4, + 0x4C33, 0x49E2, 0x4C30, 0x4E1B, 0x4C5F, 0x49DD, 0x45AE, 0x4E16, + 0x4C5A, 0x4A72, 0x45A9, 0x4E3D, 0x4C55, 0x4A06, 0x4C80, 0x4A04, + 0x4C7D, 0x4A01, 0x4C7B, 0x4A98, 0x4C75, 0x4E59, 0x4CFB, 0x4A8F, + 0x465E, 0x4E51, 0x4C9E, 0x4A28, 0x4715, 0x4E78, 0x4C96, 0x4ABC, + 0x4710, 0x4E9F, 0x4CC1, 0x4AB7, 0x4CBF, 0x4B44, 0x4CBD, 0x4AE4, + 0x4D3A, 0x4ADE, 0x4CE5, 0x4EBB, 0x4CE2, 0x4B68, 0x485F, 0x4EB2, + 0x4D5D, 0x4B63, 0x4857, 0x4ED9, 0x4D02, 0x4B90, 0x48FB, 0x4B8E, + 0x4D80, 0x4B8B, 0x4D7A, 0x4B89, 0x4DA4, 0x4BB4, 0x4DA1, 0x4BB2, + 0x4922, 0x4F18, 0x4D4A, 0x4BAD, 0x49BD, 0x4F3A, 0x4DC4, 0x4BD6, + 0x49B8, 0x4BD7, 0x4DE8, 0x4C02, 0x49E6, 0x4BFF, 0x4DE3, 0x4BFD, + 0x4E0C, 0x4C80, 0x4A74, 0x4C7D, 0x4E04, 0x4C23, 0x4A0C, 0x4F4F, + 0x4A0A, 0x4CA3, 0x4A9C, 0x4CA1, 0x4E52, 0x4CCB, 0x4A97, 0x4CC9, + 0x4E49, 0x4CC6, 0x4AC5, 0x4818, 0x4E70, 0x4CEE, 0x4AF2, 0x4813, + 0x4AEC, 0x4D16, 0x4B78, 0x48B4, 0x4B76, 0x4D0D, 0x4B16, 0x4D38, + 0x4B9F, 0x48E4, 0x4B9C, 0x4D5F, 0x4B9A, 0x497B, 0x4EFE, 0x4D5A, + 0x4BC6, 0x490E, 0x4553, 0x4D82, 0x4BEF, 0x49A4, 0x4611, 0x4DA5, + 0x4BEA, 0x49D6, 0x4C15, 0x49D0, 0x4C12, 0x4A63, 0x4C41, 0x4A60, + 0x46FE, 0x4DEE, 0x4CBD, 0x4A8D, 0x47A6, 0x4E15, 0x4C60, 0x4ABB, + 0x4848, 0x4AB8, 0x4CE0, 0x4B41, 0x487B, 0x4AE5, 0x4D04, 0x4B6E, + 0x4917, 0x4B68, 0x4914, 0x4B65, 0x4D29, 0x4B94, 0x4947, 0x4B92, + 0x4D4D, 0x4BC1, 0x4975, 0x45A2, 0x4D74, 0x4BE9, 0x4A06, 0x465A, + 0x4A04, 0x4BE1, 0x4A34, 0x4C0F, 0x4A31, 0x4C0D, 0x4A2F, 0x4C37, + 0x4A5F, 0x47E6, 0x4A59, 0x4C60, 0x4A8C, 0x47E0, 0x4E33, 0x4CDB, + 0x4B13, 0x48B5, 0x434E, 0x4D03, 0x4B3C, 0x48E8, 0x4B3A, 0x4D27, + 0x4B69, 0x48E3, 0x4B62, 0x4918, 0x4B91, 0x4D74, 0x4B8F, 0x49AA, + 0x4666, 0x4D9C, 0x4BB7, 0x49D8, 0x4751, 0x4DBF, 0x4BE0, 0x4A02, + 0x4785, 0x4A35, 0x4C36, 0x4ABF, 0x4827, 0x4ABD, 0x4CB1, 0x4AE8, + 0x4CDB, 0x4AEA, 0x4CD9, 0x4B15, 0x4D03, 0x4B13, 0x4CFD, 0x4B3E, + 0x4920, 0x4E77, 0x4D24, 0x4B6B, 0x494E, 0x4EBE, 0x4D74, 0x4C19, + 0x49B3, 0x46B5, 0x4D98, 0x4C3D, 0x4A3B, 0x4BE7, 0x4A6B, 0x4C65, + 0x4A69, 0x4C8F, 0x4A98, 0x4C8D, 0x4E0C, 0x4CB7, 0x4AC2, 0x4897, + 0x4E2F, 0x4CDB, 0x4AEE, 0x48CA, 0x4523, 0x4D03, 0x4B17, 0x4930, + 0x4BC9, 0x4D53, 0x4BC6, 0x49BD, 0x4BF1, 0x49ED, 0x4C1C, 0x4A1D, + 0x4C19, 0x4A1B, 0x4774, 0x4DC4, 0x4C41, 0x4A44, 0x4812, 0x4DE7, + 0x4C96, 0x4AA3, 0x4879, 0x4545, 0x4CBA, 0x4B53, 0x490C, 0x4B51, + 0x493D, 0x4B7C, 0x4971, 0x4BAB, 0x496B, 0x4BA5, 0x499F, 0x4BCF, + 0x49CB, 0x4750, 0x4D7F, 0x4BF8, 0x4A85, 0x47BC, 0x4DCB, 0x4C4D, + 0x4AAE, 0x488D, 0x44A8, 0x4C71, 0x4B09, 0x48BB, 0x4B06, 0x48F0, + 0x4B32, 0x48ED, 0x4B61, 0x49B0, 0x4B88, 0x49DD, 0x4B85, 0x49DE, + 0x47A1, 0x4D63, 0x4BDF, 0x4A3A, 0x47D4, 0x43BC, 0x4C03, 0x4A63, + 0x483B, 0x44CB, 0x4C58, 0x4ABE, 0x4906, 0x4AEA, 0x4933, 0x4AEB, + 0x4934, 0x4B16, 0x4961, 0x46E2, 0x4995, 0x4BEE, 0x49C1, 0x474F, + 0x4D46, 0x4C12, 0x49EE, 0x4820, 0x43E4, 0x4C67, 0x4AD2, 0x4887, + 0x4AFD, 0x4884, 0x4AFA, 0x48B5, 0x4B26, 0x48E6, 0x4B51, 0x49A9, + 0x4B7C, 0x49D9, 0x472F, 0x4CDA, 0x4BD1, 0x4A02, 0x479B, 0x42F6, + 0x4C23, 0x4A5E, 0x47CF, 0x450C, 0x4C4A, 0x4AB9, 0x48CE, 0x4AE4, + 0x48FE, 0x4B0F, 0x492F, 0x4B0D, 0x495F, 0x46A9, 0x498C, 0x4B63, + 0x49BC, 0x47B8, 0x4D61, 0x4BB5, 0x49E9, 0x481F, 0x4478, 0x4C0A, + 0x4A45, 0x484E, 0x456D, 0x487F, 0x4B1F, 0x48B4, 0x4B4A, 0x4973, + 0x4B74, 0x49A0, 0x4B9F, 0x49D0, 0x4737, 0x49FF, 0x4BF1, 0x4A2B, + 0x4838, 0x44A0, 0x4BC9, 0x4A86, 0x489A, 0x45CF, 0x4C1A, 0x4ADD, + 0x48FC, 0x4641, 0x492C, 0x4B33, 0x495D, 0x4B5E, 0x498D, 0x4B89, + 0x49B9, 0x4BDD, 0x49E9, 0x47F0, 0x4A15, 0x4C2E, 0x4A40, 0x4853, + 0x45ED, 0x4C7E, 0x4A9B, 0x4947, 0x465F, 0x4CCB, 0x4B1B, 0x49A3, + 0x47A4, 0x49CF, 0x4B71, 0x4A2D, 0x4B9C, 0x4A59, 0x483D, 0x4A84, + 0x4BED, 0x4AB0, 0x489E, 0x4ADB, 0x4C67, 0x4B06, 0x4900, 0x46B7, + 0x4CB7, 0x4B85, 0x498F, 0x475C, 0x49BB, 0x4BD7, 0x49EB, 0x4C01, + 0x4A13, 0x4C54, 0x4A42, 0x4BD9, 0x4A9C, 0x4919, 0x4AC7, 0x4C53, + 0x4AF2, 0x4975, 0x4741, 0x4CA0, 0x4B71, 0x4A00, 0x47E1, 0x4D18, + 0x4812, 0x4A5B, 0x4843, 0x4AB4, 0x4874, 0x4ADF, 0x48D8, 0x4B06, + 0x4905, 0x4690, 0x4935, 0x4B85, 0x4961, 0x47CB, 0x446C, 0x4B5D, + 0x49EB, 0x4861, 0x45D0, 0x4BD8, 0x4A71, 0x48F1, 0x467C, 0x4922, + 0x4AF5, 0x494E, 0x46E9, 0x49AC, 0x474F, 0x49D8, 0x4785, 0x4A32, + 0x47B6, 0x450E, 0x4C18, 0x4A89, 0x490A, 0x469B, 0x4C69, 0x4B09, + 0x4995, 0x473C, 0x433E, 0x4B31, 0x496C, 0x47A3, 0x44FE, 0x4808, + 0x49F2, 0x4839, 0x4A1E, 0x4899, 0x45E3, 0x48CA, 0x4AA3, 0x4929, + 0x475E, 0x4955, 0x4B4C, 0x49B3, 0x47F4, 0x4522, 0x4BCA, 0x4A39, + 0x4886, 0x45CF, 0x48E5, 0x4AB9, 0x4916, 0x4676, 0x4971, 0x46E1, + 0x49A0, 0x4714, 0x49FA, 0x477D, 0x49A2, 0x47E3, 0x49CE, 0x4814, + 0x462C, 0x4C08, 0x4A80, 0x48A5, 0x46CE, 0x43CA, 0x4B00, 0x4963, + 0x479E, 0x4484, 0x47CF, 0x49E9, 0x4834, 0x453C, 0x4894, 0x4A97, + 0x48C0, 0x4AF0, 0x4920, 0x4759, 0x497E, 0x4AEB, 0x49D8, 0x47EF, + 0x44EC, 0x4B6C, 0x4A01, 0x48B0, 0x45D3, 0x490F, 0x4A5B, 0x4882, + 0x4676, 0x48E2, 0x4ADB, 0x4940, 0x474B, 0x496C, 0x47AC, 0x49C6, + 0x47DE, 0x4A20, 0x4842, 0x4630, 0x4BD7, 0x4ACA, 0x48FD, 0x4702, + 0x495C, 0x4768, 0x49B6, 0x47CD, 0x4A0C, 0x4B73, 0x4A37, 0x4891, + 0x468A, 0x4C16, 0x4A66, 0x494B, 0x4756, 0x43C4, 0x4B0F, 0x491E, + 0x4820, 0x44B8, 0x478E, 0x4A00, 0x47EE, 0x45A0, 0x484F, 0x4AAA, + 0x48AE, 0x467C, 0x490D, 0x4717, 0x4996, 0x4B00, 0x49F0, 0x47DE, + 0x458F, 0x4BA4, 0x4A43, 0x489D, 0x466B, 0x429E, 0x4A9B, 0x4985, + 0x476B, 0x44D1, 0x47CD, 0x4980, 0x4831, 0x45EE, 0x48BC, 0x4656, + 0x48EC, 0x46C0, 0x4892, 0x475A, 0x48ED, 0x4ADD, 0x4976, 0x47ED, + 0x45DD, 0x4B5E, 0x4A53, 0x4822, 0x45A9, 0x42BD, 0x4A27, 0x490B, + 0x46B5, 0x4402, 0x471B, 0x49EA, 0x47B0, 0x452B, 0x4840, 0x4598, + 0x489F, 0x463D, 0x4929, 0x46A4, 0x43F0, 0x4AE9, 0x4900, 0x47D3, + 0x4515, 0x4B41, 0x4A08, 0x488F, 0x462C, 0x4366, 0x4A5B, 0x48BF, + 0x475D, 0x4496, 0x47F1, 0x49A2, 0x47BC, 0x45AF, 0x47C4, 0x464F, + 0x4853, 0x46EA, 0x48DD, 0x46B4, 0x4484, 0x4ACC, 0x4963, 0x4782, + 0x45D7, 0x40D5, 0x49EB, 0x4871, 0x45D9, 0x4285, 0x4A6B, 0x48CE, + 0x470F, 0x4401, 0x47A4, 0x49B3, 0x4834, 0x455B, 0x4860, 0x45FD, + 0x4835, 0x469C, 0x48C3, 0x4732, 0x442F, 0x4AD9, 0x49A2, 0x4791, + 0x4972, 0x47C8, 0x4624, 0x4B80, 0x4A7A, 0x4910, 0x4721, 0x490A, + 0x4A7C, 0x4911, 0x478A, 0x49C0, 0x4849, 0x4A19, 0x48A4, 0x4A13, + 0x48A2, 0x4682, 0x48D5, 0x4AEB, 0x4987, 0x480C, 0x4565, 0x4B16, + 0x4989, 0x480D, 0x463F, 0x443C, 0x4A87, 0x494B, 0x479F, 0x4442, + 0x4798, 0x497B, 0x47D0, 0x45FC, 0x488A, 0x4A25, 0x48E4, 0x472D, + 0x48E2, 0x46F7, 0x4942, 0x4792, 0x49C2, 0x484C, 0x4654, 0x4879, + 0x4A1B, 0x4852, 0x468A, 0x445C, 0x4A6D, 0x495C, 0x4813, 0x4615, + 0x41DD, 0x4A0D, 0x4844, 0x464B, 0x48F8, 0x4716, 0x4924, 0x47A2, + 0x4928, 0x47A0, 0x4560, 0x4806, 0x49D3, 0x48BF, 0x4707, 0x44B1, + 0x4A7F, 0x4919, 0x4709, 0x44ED, 0x4243, 0x496D, 0x4853, 0x46C5, + 0x4431, 0x46C2, 0x490B, 0x46FA, 0x44A8, 0x47EA, 0x45BA, 0x47E7, + 0x4652, 0x481E, 0x464F, 0x433A, 0x46F0, 0x48D0, 0x47B0, 0x4576, + 0x4267, 0x49AD, 0x4810, 0x45B1, 0x42EF, 0x4A59, 0x4893, 0x473F, + 0x4567, 0x3F93, 0x494A, 0x4830, 0x45A2, 0x429F, 0x46D3, 0x4861, + 0x46D0, 0x4911, 0x4738, 0x44EB, 0x47F3, 0x49C2, 0x47F1, 0x4690, + 0x4400, 0x4A1B, 0x48AA, 0x472A, 0x4441, 0x40A9, 0x498A, 0x478E, + 0x4621, 0x43F1, 0x4625, 0x4871, 0x474B, 0x4468, 0x4749, 0x45E0, + 0x47DF, 0x45AD, 0x4836, 0x464B, 0x436D, 0x46DD, 0x48EE, 0x46DB, + 0x456C, 0x426B, 0x49A0, 0x47CE, 0x4671, 0x42B2, 0x3D9B, 0x4887, + 0x46D7, 0x44F2, 0x425C, 0x4530, 0x4790, 0x4662, 0x42E3, 0x4630, + 0x44B0, 0x4758, 0x4478, 0x4726, 0x458C, 0x47EB, 0x49B1, 0x4813, + 0x45F7, 0x4435, 0x4A30, 0x48CB, 0x46EB, 0x45B2, 0x40FE, 0x494F, + 0x47AB, 0x46B2, 0x43B5, 0x46AC, 0x4864, 0x4743, 0x4539, 0x4770, + 0x453B, 0x4801, 0x466F, 0x482A, 0x4641, 0x44FC, 0x4734, 0x48E1, + 0x4736, 0x45D2, 0x4327, 0x4965, 0x47F0, 0x46CD, 0x44B7, 0x3F17, + 0x48A9, 0x47BC, 0x45C3, 0x42A0, 0x45C1, 0x4871, 0x46BF, 0x443D, + 0x46BC, 0x451C, 0x477F, 0x4584, 0x477C, 0x4653, 0x43FA, 0x4680, + 0x4895, 0x4743, 0x4543, 0x41C6, 0x4944, 0x4801, 0x4644, 0x43B5, + 0x4611, 0x4887, 0x4709, 0x4503, 0x4798, 0x490C, 0x47C4, 0x4605, + 0x4851, 0x46CE, 0x484E, 0x46CB, 0x48D6, 0x478D, 0x45C9, 0x4791, + 0x4959, 0x4818, 0x4690, 0x4481, 0x49D8, 0x48A1, 0x4724, 0x4554, + 0x42A5, 0x49A5, 0x4814, 0x4655, 0x4406, 0x4718, 0x48EE, 0x47A6, + 0x461B, 0x47A8, 0x4619, 0x43C3, 0x46DD, 0x48B8, 0x46AF, 0x44D7, + 0x4211, 0x493C, 0x47FA, 0x46A5, 0x4462, 0x3F9C, 0x487F, 0x4736, + 0x45A0, 0x4374, 0x459D, 0x47C1, 0x4667, 0x4489, 0x46FA, 0x4563, + 0x46F8, 0x4560, 0x47B5, 0x462B, 0x444B, 0x46EE, 0x4810, 0x46BC, + 0x451F, 0x42E6, 0x491E, 0x4807, 0x45EC, 0x4406, 0x4124, 0x488C, + 0x4743, 0x44DF, 0x429F, 0x45B0, 0x47CE, 0x4679, 0x44A4, 0x470C, + 0x44A2, 0x4709, 0x4577, 0x4797, 0x4641, 0x437E, 0x463E, 0x4821, + 0x46D2, 0x456B, 0x4210, 0x48FD, 0x47E9, 0x4602, 0x4458, 0x4035, + 0x452E, 0x4729, 0x452B, 0x42FC, 0x45C6, 0x4416, 0x468A, 0x4413, + 0x471D, 0x44EE, 0x42EF, 0x4589, 0x4779, 0x4652, 0x43D5, 0x4175, + 0x4889, 0x46DF, 0x4581, 0x42A9, 0x3F83, 0x47FA, 0x4614, 0x446F, + 0x4128, 0x4544, 0x4736, 0x4542, 0x438A, 0x45DC, 0x4467, 0x4670, + 0x4507, 0x46FF, 0x4505, 0x4347, 0x459F, 0x478A, 0x4664, 0x4422, + 0x4210, 0x486C, 0x4756, 0x4593, 0x4301, 0x4082, 0x47DC, 0x46BC, + 0x44BB, 0x41C9, 0x455B, 0x4719, 0x45F0, 0x43A6, 0x4684, 0x447E, + 0x4713, 0x451E, 0x4710, 0x45E4, 0x4399, 0x4649, 0x47F7, 0x4646, + 0x4512, 0x46D9, 0x45AC, 0x4763, 0x4641, 0x4434, 0x463E, 0x4845, + 0x46A2, 0x4570, 0x434A, 0x48F5, 0x47B5, 0x4602, 0x4497, 0x421C, + 0x486B, 0x46F5, 0x4530, 0x43B8, 0x40D6, 0x47DC, 0x465A, 0x452B, + 0x42C8, 0x45C1, 0x4748, 0x45BE, 0x444E, 0x4623, 0x44EE, 0x46B2, + 0x44EB, 0x4740, 0x4586, 0x4445, 0x4617, 0x47F7, 0x467A, 0x457C, + 0x4361, 0x48CF, 0x4767, 0x45DF, 0x44A5, 0x426F, 0x4544, 0x46D2, + 0x45D5, 0x43C5, 0x45A6, 0x446B, 0x4637, 0x4507, 0x4315, 0x459D, + 0x43BD, 0x462D, 0x445F, 0x4691, 0x44FB, 0x42D2, 0x4561, 0x4779, + 0x45F6, 0x4421, 0x40E0, 0x47D0, 0x46E4, 0x4558, 0x4373, 0x3F85, + 0x47A0, 0x464E, 0x44B6, 0x4286, 0x4520, 0x4737, 0x45B2, 0x43D7, + 0x4616, 0x4478, 0x46A5, 0x4514, 0x4704, 0x4579, 0x43CF, 0x4080, + 0x47B8, 0x466D, 0x44D7, 0x42E9, 0x3F1F, 0x4756, 0x45D2, 0x4433, + 0x41F6, 0x3D93, 0x46C1, 0x4535, 0x4385, 0x402D, 0x43F5, 0x462A, + 0x4492, 0x429D, 0x452D, 0x4346, 0x458E, 0x43E9, 0x4680, 0x4454, + 0x4291, 0x4588, 0x473D, 0x45E9, 0x444F, 0x419D, 0x47F0, 0x46AC, + 0x454C, 0x43A5, 0x4097, 0x4760, 0x4641, 0x44AD, 0x42F1, 0x3F84, + 0x4367, 0x45A9, 0x4405, 0x4150, 0x44A1, 0x42B2, 0x4507, 0x435B, + 0x4600, 0x43C7, 0x41FB, 0x4502, 0x46BE, 0x4567, 0x431C, 0x403C, + 0x4776, 0x4628, 0x44C5, 0x426B, 0x3F1E, 0x46E5, 0x45C0, 0x4421, + 0x41AF, 0x44BD, 0x46DC, 0x4523, 0x4377, 0x4588, 0x4419, 0x464A, + 0x4480, 0x42C7, 0x457E, 0x436F, 0x45DF, 0x4477, 0x463E, 0x44E1, + 0x42BF, 0x4546, 0x46F8, 0x45A7, 0x443D, 0x41D1, 0x3EB2, 0x46C3, + 0x453A, 0x4398, 0x4113, 0x4435, 0x465D, 0x449C, 0x42ED, 0x4565, + 0x438C, 0x45C6, 0x4492, 0x4629, 0x44F8, 0x42E0, 0x455D, 0x473B, + 0x45BE, 0x4459, 0x422F, 0x47EE, 0x46D9, 0x45B4, 0x43B4, 0x4172, + 0x4762, 0x4648, 0x451B, 0x433C, 0x40AF, 0x4759, 0x45DC, 0x447D, + 0x428F, 0x44E3, 0x46F7, 0x45D7, 0x440A, 0x4632, 0x4475, 0x42F8, + 0x453E, 0x471D, 0x459F, 0x446B, 0x4246, 0x47A5, 0x46BB, 0x4533, + 0x43C7, 0x418F, 0x4744, 0x4629, 0x4495, 0x4321, 0x455E, 0x473B, + 0x45C2, 0x448F, 0x42A7, 0x44F5, 0x46D9, 0x45B8, 0x43EF, 0x4618, + 0x4456, 0x4648, 0x4520, 0x46FF, 0x4580, 0x43E3, 0x463E, 0x4787, + 0x469D, 0x4518, 0x43DA, 0x4861, 0x477E, 0x4636, 0x450E, 0x4338, + 0x4543, 0x43A0, 0x41A3, 0x3DFC, 0x465D, 0x44D6, 0x4396, 0x40E5, + 0x4402, 0x420D, 0x44CC, 0x4280, 0x452E, 0x435C, 0x4159, 0x4432, + 0x4620, 0x4494, 0x42E8, 0x409A, 0x4706, 0x45B9, 0x4426, 0x42DE, + 0x400E, 0x46A5, 0x45B3, 0x441C, 0x41BB, 0x3F41, 0x429F, 0x451B, + 0x437B, 0x4102, 0x43E3, 0x4229, 0x44B2, 0x4307, 0x4572, 0x43DD, + 0x4176, 0x4444, 0x425B, 0x4509, 0x436A, 0x416C, 0x443A, 0x45FC, + 0x446F, 0x42C3, 0x4030, 0x46DF, 0x4595, 0x4401, 0x4249, 0x4026, + 0x4326, 0x4529, 0x43F8, 0x4243, 0x44C2, 0x42B1, 0x44F7, 0x4388, + 0x4119, 0x43BE, 0x4204, 0x448A, 0x42E2, 0x454E, 0x43B9, 0x41FA, + 0x4480, 0x4637, 0x44B5, 0x4345, 0x40CF, 0x3E78, 0x45A9, 0x444B, + 0x433B, 0x40C5, 0x3CAB, 0x459F, 0x4442, 0x4224, 0x3F81, 0x4301, + 0x4537, 0x43D3, 0x421E, 0x446D, 0x42FC, 0x4532, 0x43CE, 0x4562, + 0x43FF, 0x4287, 0x44C9, 0x46A8, 0x455D, 0x43FA, 0x41D5, 0x3F2A, + 0x4645, 0x44F4, 0x438B, 0x4159, 0x3E96, 0x45E3, 0x44EB, 0x431B, + 0x4154, 0x43B7, 0x45D9, 0x4482, 0x42A6, 0x4516, 0x4348, 0x4572, + 0x4414, 0x426A, 0x44AD, 0x4342, 0x410A, 0x43A5, 0x459D, 0x44A4, + 0x42CE, 0x408C, 0x436E, 0x4567, 0x443A, 0x42C8, 0x44CF, 0x42FE, + 0x4173, 0x43CC, 0x41E2, 0x4466, 0x42F5, 0x40BA, 0x4361, 0x455A, + 0x4460, 0x4284, 0x4037, 0x4670, 0x4525, 0x43F2, 0x427A, 0x3FB3, + 0x3BAC, 0x451B, 0x43ED, 0x4204, 0x3FA9, 0x42AB, 0x44B7, 0x437E, + 0x4156, 0x4418, 0x4236, 0x44AD, 0x430E, 0x40D9, 0x440F, 0x4230, + 0x3F5D, 0x42D7, 0x44D8, 0x43A1, 0x41BA, 0x3F53, 0x45F5, 0x44CF, + 0x4335, 0x41B0, 0x3EC8, 0x4592, 0x4466, 0x42C5, 0x40C1, 0x3DF4, + 0x41E2, 0x4460, 0x4289, 0x407F, 0x435C, 0x41DC, 0x43F7, 0x4284, + 0x3FFC, 0x42EC, 0x4161, 0x43ED, 0x420E, 0x4482, 0x42E3, 0x40E9, + 0x3DDB, 0x4546, 0x4419, 0x42AB, 0x4067, 0x3DD5, 0x453C, 0x4413, + 0x423A, 0x4029, 0x3C56, 0x450B, 0x43A5, 0x4230, 0x3FA5, 0x42D2, + 0x410C, 0x436E, 0x41BA, 0x3F9B, 0x4262, 0x4106, 0x4369, 0x41B4, + 0x43FF, 0x425C, 0x4011, 0x42F9, 0x4523, 0x4395, 0x4252, 0x3FD2, + 0x3CD5, 0x451D, 0x438F, 0x41E1, 0x3F49, 0x3B3F, 0x44B5, 0x4386, + 0x41D7, 0x3F44, 0x427A, 0x44B0, 0x4380, 0x41CD, 0x3F3A, 0x4274, + 0x4033, 0x4311, 0x4156, 0x43AC, 0x426B, 0x3FB0, 0x430C, 0x4504, + 0x433E, 0x41F9, 0x440C, 0x45BE, 0x44A0, 0x4338, 0x4183, 0x46A2, + 0x458D, 0x4496, 0x4301, 0x417D, 0x3EE2, 0x4584, 0x4491, 0x42FB, + 0x4106, 0x43F7, 0x457E, 0x4428, 0x42F2, 0x40FC, 0x438D, 0x41E3, + 0x441F, 0x42EC, 0x44E5, 0x4384, 0x41DA, 0x43EC, 0x42E3, 0x447D, + 0x4319, 0x41D4, 0x3F84, 0x456E, 0x4477, 0x4313, 0x415D, 0x3F00, + 0x4565, 0x446E, 0x42DC, 0x4158, 0x3EF6, 0x455B, 0x4409, 0x42D2, + 0x414E, 0x436E, 0x41F6, 0x4400, 0x42CD, 0x40D6, 0x4364, 0x41BA, + 0x442D, 0x42C3, 0x445E, 0x42F9, 0x41B4, 0x3FA2, 0x4257, 0x4458, + 0x42F4, 0x41AF, 0x3F1D, 0x4574, 0x4482, 0x4322, 0x41A5, 0x3F18, + 0x3B6E, 0x4479, 0x4319, 0x4132, 0x3ED4, 0x41D7, 0x4418, 0x42AD, + 0x4129, 0x437D, 0x4206, 0x4000, 0x42A8, 0x4123, 0x4373, 0x4201, + 0x3FFB, 0x429E, 0x4469, 0x436E, 0x41FB, 0x3FF5, 0x4267, 0x4463, + 0x4303, 0x4185, 0x3F76, 0x3CD0, 0x448D, 0x42FE, 0x4180, 0x3F6C, + 0x3CCA, 0x4428, 0x4328, 0x417A, 0x3F66, 0x4252, 0x40CB, 0x4323, + 0x4142, 0x3F27, 0x424D, 0x4053, 0x42B8, 0x41A5, 0x4383, 0x4215, + 0x4049, 0x3D8B, 0x44AA, 0x4379, 0x420B, 0x400F, 0x3D41, 0x44A0, + 0x4374, 0x4206, 0x4079, 0x3DC3, 0x4123, 0x43A2, 0x41FC, 0x4073, + 0x3DBD, 0x4153, 0x4338, 0x41C4, 0x3FFA, 0x4262, 0x414E, 0x4332, + 0x4226, 0x3FF0, 0x4291, 0x40DB, 0x3F33, 0x41B9, 0x43C5, 0x428C, + 0x40D1, 0x3EB3, 0x41AF, 0x43BC, 0x4286, 0x4106, 0x3EAD, 0x3BA1, + 0x43B6, 0x42B5, 0x4100, 0x3EA3, 0x41DA, 0x43E0, 0x42AB, 0x40F6, + 0x3EDF, 0x41D4, 0x3FD7, 0x4240, 0x40BE, 0x430C, 0x4204, 0x3FCD, + 0x426F, 0x4125, 0x433A, 0x4192, 0x3FC7, 0x3CB3, 0x445E, 0x4335, + 0x418D, 0x3FC1, 0x3D82, 0x442D, 0x42FE, 0x41C1, 0x3FF7, 0x3D78, + 0x40DD, 0x42F9, 0x41B7, 0x3FF2, 0x3D72, 0x40D8, 0x4323, 0x41E7, + 0x3FE8, 0x4252, 0x4108, 0x431E, 0x41E1, 0x4382, 0x424C, 0x4103, + 0x3F2A, 0x4174, 0x43AC, 0x427B, 0x4133, 0x3EAA, 0x44F8, 0x43A7, + 0x4272, 0x412D, 0x3F5B, 0x3B54, 0x43D1, 0x42A1, 0x40BB, 0x3EDC, + 0x41CE, 0x43FA, 0x429B, 0x40EB, 0x3F8C, 0x41C4, 0x4073, 0x42C6, + 0x40E6, 0x432B, 0x41F4, 0x3FFF, 0x425F, 0x411A, 0x4359, 0x41EE, + 0x4030, 0x3E06, 0x4450, 0x4354, 0x421D, 0x40D3, 0x3E42, 0x4475, + 0x4322, 0x4249, 0x4060, 0x3E38, 0x4470, 0x434C, 0x41E0, 0x4095, + 0x3E74, 0x416F, 0x4342, 0x4210, 0x408B, 0x3E6E, 0x419F, 0x4370, + 0x4206, 0x40C0, 0x3EAA, 0x3BB1, 0x439A, 0x4235, 0x40B6, 0x3EE1, + 0x3C88, 0x43C4, 0x4264, 0x40EA, 0x3EDB, 0x3BF3, 0x4004, 0x4293, + 0x411B, 0x3F12, 0x4187, 0x403A, 0x428A, 0x4115, 0x3FBC, 0x41B7, + 0x4030, 0x3E0C, 0x4145, 0x434D, 0x41E6, 0x4065, 0x3E47, 0x4175, + 0x437B, 0x4215, 0x409A, 0x3EF9, 0x3B3F, 0x4315, 0x4244, 0x40CA, + 0x3F30, 0x3C18, 0x4052, 0x423B, 0x40C5, 0x3F2A, 0x3C5B, 0x3FDE, + 0x426A, 0x40F5, 0x3F60, 0x4197, 0x4014, 0x3E66, 0x4125, 0x3F96, + 0x41C6, 0x4045, 0x3E61, 0x4155, 0x42FB, 0x41F6, 0x407A, 0x3E9C, + 0x3C42, 0x4325, 0x4225, 0x40AA, 0x3ED3, 0x3BAD, 0x434F, 0x4250, + 0x40A5, 0x3F09, 0x3C7F, 0x402D, 0x427E, 0x40D5, 0x3F40, 0x3CBD, + 0x405D, 0x3E08, 0x4105, 0x3F76, 0x41DB, 0x4025, 0x3E44, 0x4135, + 0x3FAB, 0x420A, 0x4059, 0x3E7B, 0x3CAA, 0x4335, 0x4235, 0x408A, + 0x3EB2, 0x3CEC, 0x4363, 0x4264, 0x40BB, 0x3EED, 0x3D29, 0x4047, + 0x428F, 0x40EB, 0x3F23, 0x3D66, 0x4078, 0x425C, 0x411B, 0x3F55, + 0x3DA2, 0x40A8, 0x3ED6, 0x4184, 0x3FC6, 0x421B, 0x40D8, 0x3F11, + 0x41AF, 0x3FF7, 0x424A, 0x413E, 0x4313, 0x41DE, 0x402C, 0x3E52, + 0x40D4, 0x433D, 0x4209, 0x405D, 0x3E89, 0x413A, 0x430B, 0x41D6, + 0x40C8, 0x3EBF, 0x3CBC, 0x4335, 0x4235, 0x40F8, 0x3F32, 0x3CF9, + 0x4085, 0x4264, 0x4127, 0x3F68, 0x3D36, 0x40B5, 0x428F, 0x418C, + 0x3F9D, 0x4223, 0x411B, 0x3F1F, 0x41B7, 0x4009, 0x41F0, 0x40AD, + 0x3F55, 0x3D66, 0x403A, 0x424F, 0x4117, 0x3FC6, 0x3DA2, 0x43A7, + 0x427E, 0x4142, 0x3FF7, 0x3E1B, 0x3BBF, 0x42D8, 0x41A7, 0x4062, + 0x3E52, 0x3BFE, 0x3F44, 0x4206, 0x408E, 0x3EC5, 0x4165, 0x3F7A, + 0x3E08, 0x405A, 0x3F00, 0x4132, 0x3FE6, 0x3E80, 0x40C0, 0x3F6D, + 0x4196, 0x404D, 0x3EB7, 0x3C71, 0x4321, 0x41F2, 0x407D, 0x3F25, + 0x3CF6, 0x3981, 0x4220, 0x40E3, 0x3F91, 0x3D33, 0x39CC, 0x41ED, + 0x4148, 0x3FFD, 0x3DAD, 0x3B48, 0x3EA6, 0x4114, 0x3F8D, 0x3E26, + 0x40A2, 0x3F14, 0x3D62, 0x3FF9, 0x3E99, 0x40D2, 0x3F85, 0x3DDB, + 0x4060, 0x3F0B, 0x4137, 0x3FEC, 0x3E4F, 0x3BC1, 0x426C, 0x41CC, + 0x4057, 0x3EC2, 0x3C48, 0x384C, 0x4199, 0x40BD, 0x3F30, 0x3CC9, + 0x39F1, 0x41F8, 0x4085, 0x3EFA, 0x3D44, 0x3FDC, 0x3E3F, 0x40EA, + 0x3F67, 0x3DBD, 0x407C, 0x3EED, 0x3D3B, 0x3FD3, 0x3E36, 0x40DE, + 0x3F5A, 0x3DB0, 0x403A, 0x4218, 0x4142, 0x3FC6, 0x3E29, 0x3B50, + 0x4272, 0x410F, 0x402D, 0x3E9B, 0x3BDD, 0x38D5, 0x41A0, 0x3FF8, + 0x3F09, 0x3CA2, 0x3F84, 0x3DA4, 0x4094, 0x3ECF, 0x3D21, 0x3FEC, + 0x3E54, 0x40F6, 0x3F77, 0x3D96, 0x4088, 0x3EC6, 0x3D14, 0x3FDF, + 0x3E47, 0x40ED, 0x3F6B, 0x3D89, 0x3A9F, 0x4252, 0x40EA, 0x3FD6, + 0x3E3E, 0x3C3B, 0x424F, 0x414F, 0x3FCC, 0x3EAD, 0x3CBB, 0x39A2, + 0x41AA, 0x403A, 0x3EE3, 0x3D73, 0x3FCB, 0x3DF7, 0x40D5, 0x3F1C, + 0x3D38, 0x4067, 0x3E6A, 0x40D0, 0x3FBE, 0x3DEE, 0x4093, 0x3F13, + 0x3D2F, 0x405B, 0x41CE, 0x40CA, 0x3FB1, 0x3DE1, 0x3B96, 0x422F, + 0x415F, 0x3FAC, 0x3E8C, 0x3C5B, 0x425A, 0x412C, 0x404F, 0x3F34, + 0x3D14, 0x3FAA, 0x41EC, 0x40E6, 0x3EFB, 0x3E07, 0x4047, 0x3E49, + 0x40B2, 0x3FD4, 0x3DCD, 0x4044, 0x3F29, 0x4178, 0x403A, 0x3E78, + 0x40DB, 0x3FC7, 0x3DC0, 0x403C, 0x423B, 0x413B, 0x3FC9, 0x3EA6, + 0x3C3A, 0x426C, 0x416D, 0x4065, 0x3F13, 0x3D35, 0x3A8B, 0x41CC, + 0x4090, 0x3F4C, 0x3DE6, 0x4058, 0x422D, 0x412D, 0x3FE9, 0x3E1D, + 0x408F, 0x3F3F, 0x3DD9, 0x3FEB, 0x3ECA, 0x4120, 0x3FA7, 0x3DDB, + 0x3C9C, 0x3FA3, 0x4122, 0x4014, 0x3EF8, 0x3C5B, 0x3AFA, 0x417D, + 0x4076, 0x3EF3, 0x3D51, 0x3AB7, 0x372A, 0x40DD, 0x3F98, 0x3E76, + 0x3BC8, 0x388C, 0x3DC2, 0x3FFF, 0x3E40, 0x3CC6, 0x3FC2, 0x3E31, + 0x3BFF, 0x3F52, 0x3DF2, 0x3FC3, 0x3E6F, 0x3D38, 0x3F4C, 0x3DB7, + 0x4090, 0x3F45, 0x3D32, 0x3B6B, 0x3ED0, 0x40C3, 0x3F7D, 0x3E23, + 0x3CA8, 0x395C, 0x40F2, 0x3FE4, 0x3E90, 0x3C70, 0x3ACC, 0x3E89, + 0x4082, 0x3F37, 0x3D9E, 0x3B94, 0x3E53, 0x3CDF, 0x3F68, 0x3E0D, + 0x3BDE, 0x3F65, 0x3DCD, 0x403D, 0x3EB9, 0x3D14, 0x3F62, 0x3E0C, + 0x3C53, 0x3EEB, 0x3D4B, 0x3FFF, 0x3EE8, 0x3D0B, 0x3A25, 0x3E72, + 0x4098, 0x3F1C, 0x3D83, 0x3BC0, 0x37EF, 0x40CF, 0x3F83, 0x3E2E, + 0x3C7B, 0x397E, 0x3E26, 0x4022, 0x3F0C, 0x3D3A, 0x3B6C, 0x3E28, + 0x3C3B, 0x3F12, 0x3DA9, 0x3BAA, 0x3ECD, 0x3DA2, 0x3FDD, 0x3EC5, + 0x3CEC, 0x3FA4, 0x3DE0, 0x3BEC, 0x3EC7, 0x4115, 0x3FA5, 0x3E86, + 0x3D1C, 0x3A84, 0x4177, 0x403D, 0x3F2C, 0x3D98, 0x3B98, 0x3906, + 0x40A0, 0x3F96, 0x3E02, 0x3C53, 0x394D, 0x3DC3, 0x3FC6, 0x3EE5, + 0x3D4B, 0x3B04, 0x4199, 0x4060, 0x3F86, 0x3D8A, 0x3BC6, 0x3EA9, + 0x40C3, 0x3FBD, 0x3E67, 0x3D3B, 0x3F47, 0x3E60, 0x3FE9, 0x3F0E, + 0x3D3D, 0x3FE2, 0x3E99, 0x3CF5, 0x3FAE, 0x3DE4, 0x404B, 0x3ED2, + 0x3DE1, 0x3BF3, 0x3EC7, 0x40E3, 0x3F6B, 0x3E89, 0x3C6A, 0x3A50, + 0x4145, 0x400A, 0x3EC2, 0x3D5C, 0x3BE2, 0x3884, 0x406E, 0x3F29, + 0x3E42, 0x3C27, 0x39AF, 0x3D98, 0x3FC9, 0x3EE8, 0x3D14, 0x3B93, + 0x3E02, 0x3CD3, 0x3F57, 0x3DC3, 0x3C17, 0x3EA9, 0x3DBF, 0x3B47, + 0x3EA2, 0x3C8D, 0x3F4A, 0x3E31, 0x3C86, 0x3A2D, 0x3D7B, 0x3FB3, + 0x3E69, 0x3D73, 0x3ABE, 0x3E28, 0x404D, 0x3F0B, 0x3E21, 0x3BFE, + 0x3A62, 0x40B0, 0x3F79, 0x3EC7, 0x3CF2, 0x3AEE, 0x374E, 0x400F, + 0x3F32, 0x3DA1, 0x3BAF, 0x3A10, 0x3D9E, 0x3FCD, 0x3E4A, 0x3CA5, + 0x3B65, 0x3E46, 0x3C64, 0x3EF0, 0x3D59, 0x3BE5, 0x3EE8, 0x3D56, + 0x3B18, 0x3E02, 0x3CA0, 0x3F52, 0x3DFF, 0x3C1A, 0x39B9, 0x3D8D, + 0x3FBB, 0x3E6F, 0x3CD0, 0x3A8B, 0x38C8, 0x401F, 0x3F11, 0x3D80, + 0x3BCB, 0x3A79, 0x3D7D, 0x3F76, 0x3E28, 0x3C8F, 0x3B82, 0x3E21, + 0x3C80, 0x3ED2, 0x3DE7, 0x3C3F, 0x3E91, 0x3D30, 0x3B3A, 0x3E8E, + 0x3D2D, 0x3EFB, 0x3DDE, 0x3C36, 0x3A67, 0x3D9F, 0x3FA2, 0x3E88, + 0x3D64, 0x3BED, 0x3988, 0x4068, 0x3F5B, 0x3E0D, 0x3CA4, 0x3A9B, + 0x3756, 0x3FC3, 0x3EAF, 0x3D54, 0x3B9F, 0x392C, 0x3D19, 0x3F19, + 0x3DC5, 0x3C5B, 0x3A4A, 0x3DC2, 0x3C58, 0x3E6D, 0x3D0C, 0x3B54, + 0x3E33, 0x3CD0, 0x3B0D, 0x3E2B, 0x3CC9, 0x3E9E, 0x3D7B, 0x3BCC, + 0x39F1, 0x3D73, 0x3FA4, 0x3E93, 0x3C83, 0x3AC2, 0x382B, 0x3FD7, + 0x3EFE, 0x3DE1, 0x3C78, 0x3959, 0x35BF, 0x3F63, 0x3E4D, 0x3CF0, + 0x3B77, 0x394E, 0x3CED, 0x3F27, 0x3D66, 0x3C2F, 0x3A62, 0x3D5F, + 0x3BF2, 0x3E7B, 0x3D5C, 0x3B2C, 0x3DD0, 0x3CA4, 0x3EE5, 0x3DCD, + 0x3CA1, 0x3EE2, 0x3DC6, 0x3BA4, 0x3E39, 0x3D14, 0x3F16, 0x3E36, + 0x3D0C, 0x3AD9, 0x3E2E, 0x3FE4, 0x3F0C, 0x3D7E, 0x3C17, 0x3A8A, + 0x4047, 0x3F71, 0x3E60, 0x3CC8, 0x3B4E, 0x396B, 0x400D, 0x3ECA, + 0x3DB1, 0x3C85, 0x3EC7, 0x3DAA, 0x3F9A, 0x3E8E, 0x3CF8, 0x3EFB, + 0x3E1A, 0x3CF5, 0x3EF4, 0x3E13, 0x3FC9, 0x3EF0, 0x3D67, 0x3C39, + 0x3E4B, 0x4060, 0x3F24, 0x3E44, 0x3D5C, 0x3B71, 0x4092, 0x3FF2, + 0x3F1A, 0x3D96, 0x3CA2, 0x3A66, 0x4088, 0x3F4D, 0x3E72, 0x3D14, + 0x3BE4, 0x3DFF, 0x3CD9, 0x3B23, 0x393F, 0x3CD6, 0x3ADC, 0x3DBD, + 0x3C1D, 0x3AD9, 0x3D48, 0x3C15, 0x3A0A, 0x3D41, 0x3B59, 0x3E26, + 0x3D3D, 0x3B52, 0x38E5, 0x3C8A, 0x3EC9, 0x3D77, 0x3C83, 0x3A86, + 0x37AD, 0x3F98, 0x3E54, 0x3CF6, 0x3BC5, 0x39B3, 0x3655, 0x3EF3, + 0x3DD9, 0x3CB7, 0x3AFC, 0x3886, 0x3C37, 0x3E7D, 0x3D25, 0x3BFA, + 0x3A2F, 0x3D22, 0x3B74, 0x3E07, 0x3D1F, 0x3B71, 0x3956, 0x3C6B, + 0x3AAE, 0x3DCA, 0x3C64, 0x3AAB, 0x3D51, 0x3C61, 0x3AA3, 0x3D4E, + 0x3BA6, 0x3E2E, 0x3D47, 0x3BA3, 0x3990, 0x3C98, 0x3ECD, 0x3D80, + 0x3C91, 0x3ADA, 0x38AF, 0x33E1, 0x3E58, 0x3D76, 0x3BD4, 0x3A0D, + 0x37C0, 0x3B56, 0x3E1B, 0x3CC5, 0x3B4E, 0x3933, 0x3C45, 0x3B4B, + 0x3DA4, 0x3C42, 0x3A88, 0x3DA1, 0x3C3F, 0x3A81, 0x3CF4, 0x3B84, + 0x3E46, 0x3CED, 0x3B81, 0x39AE, 0x3C72, 0x3EE5, 0x3DD0, 0x3C6F, + 0x3ABC, 0x38D2, 0x3C6C, 0x3E70, 0x3D1C, 0x3BB2, 0x3A2A, 0x37E9, + 0x3F0E, 0x3DFA, 0x3C9F, 0x3B2C, 0x3956, 0x36F1, 0x3E99, 0x3DBD, + 0x3C98, 0x3B26, 0x3874, 0x3C1D, 0x3E5D, 0x3D45, 0x3BE1, 0x3A5B, + 0x3D3E, 0x3BD9, 0x3DEB, 0x3CC8, 0x3B57, 0x3DE4, 0x3CC1, 0x3B54, + 0x38F6, 0x3C4A, 0x3E88, 0x3D6D, 0x3C0E, 0x3A8E, 0x3D6A, 0x3C07, + 0x3E12, 0x3CF0, 0x3B89, 0x3E0B, 0x3CB5, 0x3B82, 0x39FE, 0x3CB2, + 0x3E78, 0x3D61, 0x3C3B, 0x3AFC, 0x3929, 0x3C34, 0x3E72, 0x3D57, + 0x3C31, 0x3A35, 0x3847, 0x3F0B, 0x3DFC, 0x3CDE, 0x3BAD, 0x3A2F, + 0x37A5, 0x3E9B, 0x3DF2, 0x3CD4, 0x3AED, 0x395B, 0x3C5D, 0x3AEA, + 0x3D7B, 0x3C56, 0x3AE7, 0x38C6, 0x3BDA, 0x3A5E, 0x3D03, 0x3B9E, + 0x3A5B, 0x3CC8, 0x3B9B, 0x3A58, 0x3CC5, 0x3B1D, 0x3DDC, 0x3C4F, + 0x3B15, 0x398A, 0x3C47, 0x3E4A, 0x3D69, 0x3C44, 0x3A8E, 0x38F5, + 0x363B, 0x3E0A, 0x3CED, 0x3BC5, 0x3A84, 0x3817, 0x3531, 0x3DCE, + 0x3CE7, 0x3BBB, 0x39BB, 0x3774, 0x3B3D, 0x3D5B, 0x3C6A, 0x3B3A, + 0x392C, 0x3C2E, 0x3AB7, 0x3D50, 0x3C2B, 0x3A75, 0x3921, 0x3BAF, + 0x3A72, 0x3CD8, 0x3BAC, 0x39EC, 0x3CD1, 0x3BA9, 0x39E9, 0x37AF, + 0x3B2B, 0x3DB2, 0x3CCB, 0x3B24, 0x3956, 0x3706, 0x3E86, 0x3D3B, + 0x3C4D, 0x3B1D, 0x3950, 0x36FF, 0x3E15, 0x3D30, 0x3BD3, 0x3A97, + 0x3879, 0x3556, 0x3E0B, 0x3CB8, 0x3B8F, 0x3A0F, 0x37DC, 0x3B4B, + 0x3A08, 0x3CB2, 0x3B48, 0x3981, 0x3C3C, 0x3B0C, 0x397E, 0x3C34, + 0x3B04, 0x393A, 0x3C31, 0x3A85, 0x38A9, 0x3C2E, 0x3A82, 0x3D14, + 0x3BB7, 0x3A7B, 0x38A2, 0x3BAF, 0x3DBD, 0x3C9C, 0x3BAC, 0x39F2, + 0x380B, 0x3587, 0x3DB3, 0x3C96, 0x3B2C, 0x39E8, 0x3800, 0x33AF, + 0x3D40, 0x3C58, 0x3AEC, 0x395E, 0x3762, 0x3AE5, 0x3D3A, 0x3C12, + 0x3AE1, 0x3953, 0x3BD6, 0x3A62, 0x3D2F, 0x3BD3, 0x3A5B, 0x3CBF, + 0x3BD0, 0x3A58, 0x3835, 0x3B54, 0x3A54, 0x3CB5, 0x3B50, 0x39CF, + 0x37E7, 0x3B4D, 0x3D5E, 0x3CAA, 0x3B46, 0x39C5, 0x3749, 0x3E33, + 0x3D54, 0x3C31, 0x3B40, 0x39BE, 0x3743, 0x3DFB, 0x3D14, 0x3C2B, + 0x3ABF, 0x3930, 0x369E, 0x3AB7, 0x3CD6, 0x3BB1, 0x3AB4, 0x38A0, + 0x3BA9, 0x3A35, 0x3CD0, 0x3BA6, 0x3A32, 0x3CC9, 0x3B6A, 0x3A2A, + 0x3CC6, 0x3B67, 0x3D72, 0x3C54, 0x3B64, 0x39A2, 0x3C4D, 0x3B20, + 0x3D6C, 0x3C4A, 0x3AE4, 0x399B, 0x3767, 0x3E0A, 0x3CF5, 0x3C0C, + 0x3AD9, 0x3955, 0x3719, 0x3E04, 0x3CEF, 0x3BC6, 0x3AD3, 0x3907, + 0x3BC3, 0x3D93, 0x3CE4, 0x3BC0, 0x3AC8, 0x3CAE, 0x3B84, 0x3D88, + 0x3CAB, 0x3B81, 0x3A46, 0x3CA4, 0x3B7E, 0x3A43, 0x3CA1, 0x3B7B, + 0x3DB5, 0x3C9E, 0x3B73, 0x3A39, 0x3C96, 0x3E52, 0x3D43, 0x3C93, + 0x3B6D, 0x39B5, 0x381A, 0x35AB, 0x3D38, 0x3C1F, 0x3AED, 0x39AA, + 0x380F, 0x34FB, 0x3D00, 0x3C14, 0x3AE7, 0x3969, 0x3808, 0x34F4, + 0x3966, 0x3BD6, 0x3AA7, 0x395E, 0x3770, 0x3AA0, 0x395B, 0x3BD0, + 0x3A9D, 0x3958, 0x376A, 0x3A9A, 0x3955, 0x3BC6, 0x3A92, 0x394D, + 0x3BC3, 0x3A8F, 0x38C6, 0x36C8, 0x3A8C, 0x3CA9, 0x3B48, 0x3A0D, + 0x38C0, 0x3679, 0x3A0A, 0x3C9F, 0x3B7E, 0x3A07, 0x38B5, 0x366D, + 0x3146, 0x3C2B, 0x3B73, 0x3A3E, 0x3872, 0x3667, 0x313A, 0x3C5B, + 0x3B6D, 0x3A38, 0x3867, 0x365C, 0x3A35, 0x3C55, 0x3AF2, 0x39B5, + 0x3861, 0x3B2B, 0x39B2, 0x385E, 0x3B24, 0x39AA, 0x3856, 0x3B21, + 0x39A7, 0x3853, 0x3B1E, 0x39A4, 0x3C0E, 0x3B1A, 0x39DF, 0x37C1, + 0x35A4, 0x39DC, 0x3C04, 0x3ADB, 0x39D9, 0x37BB, 0x359E, 0x3CE4, + 0x3BF9, 0x3AD1, 0x3955, 0x37FA, 0x34EE, 0x3D14, 0x3BBF, 0x3ACA, + 0x398D, 0x37F3, 0x3541, 0x398A, 0x3BB9, 0x3B01, 0x3987, 0x3760, + 0x3AFE, 0x397F, 0x3BEA, 0x3A85, 0x397C, 0x37A0, 0x3A7D, 0x38FA, + 0x379D, 0x3A7A, 0x393B, 0x3BA9, 0x3AB4, 0x3937, 0x3792, 0x3AB1, + 0x3C8F, 0x3BA3, 0x3AAE, 0x392D, 0x378C, 0x3AA6, 0x3CBA, 0x3BD4, + 0x3AA3, 0x3969, 0x3BD1, 0x3A6B, 0x3962, 0x3BCD, 0x3A68, 0x395F, + 0x37C4, 0x3A60, 0x3C7B, 0x3B8F, 0x3A9A, 0x38DA, 0x3731, 0x3A97, + 0x3C71, 0x3B89, 0x3A94, 0x3917, 0x3776, 0x35A6, 0x3CA1, 0x3BBA, + 0x3ACA, 0x390C, 0x376B, 0x34FD, 0x3CD1, 0x3BB4, 0x3A4E, 0x3949, + 0x37AF, 0x3A4B, 0x3946, 0x3B76, 0x3A85, 0x3981, 0x37A4, 0x3A7D, + 0x397E, 0x37A1, 0x3A7A, 0x397B, 0x37E7, 0x3AB4, 0x38FA, 0x37E0, + 0x3AB1, 0x393A, 0x3BD9, 0x3AA9, 0x3932, 0x3823, 0x3587, 0x392F, + 0x3B9B, 0x3A6E, 0x396F, 0x3796, 0x35CE, 0x3CB2, 0x3B95, 0x3AA4, + 0x3964, 0x37D5, 0x35C7, 0x31E0, 0x3BC5, 0x3AD6, 0x399C, 0x37CA, + 0x360E, 0x39DB, 0x3BBF, 0x3B0C, 0x39D4, 0x3808, 0x3608, 0x3958, + 0x3805, 0x3A91, 0x3997, 0x3846, 0x364E, 0x3990, 0x3843, 0x3AC7, + 0x398D, 0x3884, 0x3B00, 0x39C7, 0x387D, 0x368C, 0x39C4, 0x38BD, + 0x3B32, 0x39FF, 0x38BA, 0x36D1, 0x33A2, 0x3BE1, 0x3ABB, 0x3A35, + 0x3878, 0x3711, 0x34F1, 0x3C11, 0x3AED, 0x39B8, 0x38B1, 0x3755, + 0x344A, 0x38AE, 0x3B1E, 0x39EF, 0x38EE, 0x3794, 0x3537, 0x38E7, + 0x3B54, 0x3A63, 0x3926, 0x3706, 0x3A60, 0x3923, 0x3749, 0x3A59, + 0x395E, 0x3746, 0x3A20, 0x38E2, 0x3788, 0x3A5A, 0x38DF, 0x3785, + 0x3A57, 0x391A, 0x37C7, 0x360E, 0x3955, 0x3B45, 0x3A89, 0x3952, + 0x3805, 0x369B, 0x3312, 0x3BB0, 0x3A83, 0x398A, 0x383E, 0x36DB, + 0x3368, 0x3BE1, 0x3ABC, 0x39C1, 0x387C, 0x364A, 0x34B8, 0x38B8, + 0x3AF2, 0x39BE, 0x383A, 0x36D6, 0x39BB, 0x3876, 0x3AE7, 0x39F5, + 0x3873, 0x3716, 0x3A2F, 0x38B3, 0x3759, 0x3A64, 0x38EF, 0x3755, + 0x3A29, 0x392A, 0x3797, 0x39EC, 0x3927, 0x3B4E, 0x3A26, 0x3962, + 0x37D6, 0x366F, 0x38E6, 0x3B4B, 0x3A94, 0x3925, 0x37D0, 0x35D9, + 0x33E4, 0x3BB7, 0x3A8E, 0x399B, 0x3816, 0x3666, 0x348C, 0x3B7D, + 0x3AC7, 0x39CD, 0x384F, 0x36AB, 0x398D, 0x388B, 0x3AF9, 0x3992, + 0x38CB, 0x3731, 0x39CC, 0x3906, 0x3AFA, 0x3A06, 0x38C0, 0x37B5, + 0x3A3B, 0x38C5, 0x37F6, 0x3A38, 0x3900, 0x3B5F, 0x3A00, 0x393B, + 0x376F, 0x3A35, 0x3976, 0x3B5C, 0x3A6E, 0x3973, 0x37ED, 0x3642, + 0x3C71, 0x3B8D, 0x3AA0, 0x3974, 0x386A, 0x36CD, 0x3C72, 0x3B8E, + 0x3AD9, 0x39E4, 0x3864, 0x3752, 0x3A1E, 0x3BF5, 0x3B0A, 0x39DE, + 0x38E3, 0x37D1, 0x39DE, 0x391E, 0x3B0B, 0x3A54, 0x3958, 0x3B76, + 0x366A, 0x3955, 0x37CF, 0x3667, 0x3918, 0x380C, 0x3625, 0x3952, + 0x388B, 0x3A83, 0x39CA, 0x3888, 0x36F2, 0x3492, 0x384E, 0x3AB9, + 0x39C4, 0x388A, 0x3776, 0x357A, 0x32D6, 0x3AED, 0x3A3A, 0x393E, + 0x37B0, 0x3608, 0x3382, 0x3AEE, 0x3A30, 0x3902, 0x37F6, 0x36DA, + 0x3479, 0x3832, 0x3AA5, 0x39B0, 0x386E, 0x3691, 0x3510, 0x386A, + 0x36D4, 0x3974, 0x386F, 0x375B, 0x3556, 0x38AB, 0x379D, 0x355C, + 0x3924, 0x37D9, 0x35A5, 0x3920, 0x3792, 0x3635, 0x38E7, 0x37DB, + 0x3A52, 0x395B, 0x3817, 0x3701, 0x345F, 0x3892, 0x3A53, 0x3992, + 0x3850, 0x36BD, 0x3543, 0x32A2, 0x3ABC, 0x3A09, 0x38CE, 0x37C2, + 0x361D, 0x33A4, 0x3036, 0x3A06, 0x38D0, 0x37BC, 0x361F, 0x3495, + 0x3804, 0x3A74, 0x397E, 0x387F, 0x372C, 0x34DD, 0x387C, 0x3728, + 0x3980, 0x3842, 0x36E8, 0x3575, 0x38BC, 0x376F, 0x3605, 0x38F2, + 0x37EB, 0x368F, 0x38EF, 0x37E8, 0x3646, 0x3433, 0x37ED, 0x3A21, + 0x3967, 0x3867, 0x3718, 0x3560, 0x3864, 0x3A96, 0x39A1, 0x3869, + 0x3753, 0x35A6, 0x3377, 0x3B01, 0x39D8, 0x3919, 0x3817, 0x367C, + 0x34B7, 0x37D5, 0x3A49, 0x3953, 0x3819, 0x367E, 0x34BA, 0x3893, + 0x3701, 0x354C, 0x3B9F, 0x3A7F, 0x39C7, 0x3890, 0x377F, 0x3620, + 0x3405, 0x3AEA, 0x3A00, 0x3906, 0x3800, 0x36AA, 0x34A4, 0x37FD, + 0x3A3A, 0x3979, 0x387F, 0x36E9, 0x357C, 0x387C, 0x3773, 0x39EF, + 0x3880, 0x37AF, 0x3657, 0x3932, 0x3774, 0x3654, 0x38F2, 0x382F, + 0x3659, 0x3934, 0x382C, 0x371D, 0x3527, 0x3831, 0x371A, 0x396E, + 0x38A6, 0x371E, 0x35FB, 0x342E, 0x37DF, 0x39D8, 0x391E, 0x3798, + 0x36CA, 0x34C8, 0x3224, 0x3A12, 0x3995, 0x3856, 0x370D, 0x3556, + 0x3378, 0x2E56, 0x3997, 0x38D4, 0x374F, 0x362D, 0x346C, 0x3154, + 0x362A, 0x390E, 0x37C7, 0x36FB, 0x34B4, 0x32BE, 0x36F8, 0x3981, + 0x3846, 0x377D, 0x35D5, 0x38C3, 0x377A, 0x3621, 0x38C0, 0x37BE, + 0x3663, 0x393B, 0x37FA, 0x3668, 0x3538, 0x37FE, 0x372B, 0x39AD, + 0x3874, 0x3728, 0x360F, 0x33A7, 0x37AC, 0x39E6, 0x38EC, 0x37A9, + 0x3698, 0x34DD, 0x32A4, 0x3A1B, 0x3927, 0x3824, 0x371F, 0x35BB, + 0x32F4, 0x3056, 0x3999, 0x3864, 0x37A0, 0x3686, 0x3435, 0x3291, + 0x3642, 0x38DD, 0x381A, 0x370D, 0x3562, 0x32EA, 0x36CA, 0x35F5, + 0x3894, 0x378E, 0x35ED, 0x33D4, 0x3753, 0x36BE, 0x350B, 0x37CF, + 0x3676, 0x34BB, 0x380E, 0x3740, 0x359C, 0x337A, 0x36FD, 0x3599, + 0x38C5, 0x37BC, 0x3667, 0x3464, 0x315A, 0x366C, 0x38FF, 0x37FC, + 0x36EF, 0x3543, 0x3317, 0x3153, 0x3972, 0x3876, 0x3730, 0x35CE, + 0x3408, 0x32B5, 0x39A7, 0x38B1, 0x37AC, 0x36A5, 0x3581, 0x33AD, + 0x36E2, 0x3964, 0x38A6, 0x3766, 0x3651, 0x3495, 0x3763, 0x3608, + 0x38E0, 0x37E1, 0x36D4, 0x356F, 0x385E, 0x3758, 0x35FC, 0x381D, + 0x3715, 0x35F9, 0x3899, 0x3794, 0x3685, 0x3519, 0x3812, 0x3682, + 0x38D4, 0x380F, 0x36C7, 0x35A9, 0x33E2, 0x374B, 0x3986, 0x38C9, + 0x3744, 0x3632, 0x34C4, 0x328D, 0x39BB, 0x3903, 0x3805, 0x373D, + 0x35E1, 0x3381, 0x3112, 0x393D, 0x387E, 0x377A, 0x366A, 0x3502, + 0x3375, 0x36EF, 0x3932, 0x383A, 0x36AC, 0x358D, 0x3414, 0x3730, + 0x361A, 0x3875, 0x37AF, 0x36A0, 0x34A8, 0x37EE, 0x369D, 0x353C, + 0x37EB, 0x36E2, 0x3925, 0x3867, 0x3762, 0x3652, 0x3451, 0x37DF, + 0x399A, 0x38E2, 0x3822, 0x36D4, 0x35BC, 0x381F, 0x3A45, 0x391C, + 0x385D, 0x3797, 0x3688, 0x34D8, 0x3A42, 0x39C8, 0x3911, 0x37D3, + 0x370A, 0x35F3, 0x33EA, 0x3A37, 0x3946, 0x388D, 0x37C8, 0x363B, + 0x3515, 0x33E2, 0x36BC, 0x35A3, 0x3803, 0x3701, 0x362F, 0x342E, + 0x377F, 0x3675, 0x34C4, 0x37BE, 0x3672, 0x3553, 0x383B, 0x36F2, + 0x35E0, 0x3424, 0x3736, 0x3666, 0x34B5, 0x37B4, 0x36AC, 0x3549, + 0x332D, 0x36A4, 0x3590, 0x3831, 0x36E9, 0x3617, 0x3463, 0x3321, + 0x2FF0, 0x38E5, 0x37AB, 0x36E2, 0x3581, 0x3457, 0x321A, 0x2E2D, + 0x3861, 0x37A0, 0x364F, 0x34A1, 0x3367, 0x30A7, 0x3531, 0x37DB, + 0x3713, 0x35BE, 0x3496, 0x3267, 0x3604, 0x3525, 0x3796, 0x3685, + 0x3571, 0x33AC, 0x36CA, 0x35F8, 0x3443, 0x370A, 0x363E, 0x34D4, + 0x3788, 0x36BF, 0x3562, 0x339D, 0x3703, 0x35A9, 0x3805, 0x3742, + 0x3630, 0x3482, 0x32A4, 0x3675, 0x3511, 0x37FA, 0x36B5, 0x359A, + 0x33DD, 0x31EC, 0x35E0, 0x3875, 0x3773, 0x3626, 0x3552, 0x33D6, + 0x318E, 0x38EB, 0x37F0, 0x36EB, 0x361B, 0x34B5, 0x32DE, 0x30CC, + 0x34FC, 0x37EA, 0x36A5, 0x358A, 0x3415, 0x322D, 0x35D0, 0x3463, + 0x3763, 0x3652, 0x357E, 0x3373, 0x3697, 0x35C5, 0x3457, 0x36D7, + 0x360A, 0x34E7, 0x3797, 0x3650, 0x352E, 0x33B6, 0x36D0, 0x3575, + 0x3813, 0x370F, 0x35FC, 0x3495, 0x330E, 0x3641, 0x388A, 0x378D, + 0x3682, 0x35B4, 0x37CC, 0x3743, 0x35F6, 0x34D6, 0x3782, 0x367B, + 0x351E, 0x33EF, 0x36BB, 0x35A6, 0x37FF, 0x36FB, 0x35EC, 0x3512, + 0x32FE, 0x3675, 0x38B5, 0x37BA, 0x36EF, 0x35E0, 0x3479, 0x32F2, + 0x392A, 0x3836, 0x3772, 0x3666, 0x354F, 0x346E, 0x3247, 0x2F5C, + 0x382B, 0x372D, 0x365B, 0x3502, 0x33D3, 0x3193, 0x358A, 0x37AA, + 0x3722, 0x3614, 0x34F6, 0x3330, 0x3659, 0x353D, 0x379F, 0x3699, + 0x3584, 0x345D, 0x3324, 0x364E, 0x34AA, 0x3374, 0x368E, 0x357D, + 0x3456, 0x36CE, 0x35BE, 0x349E, 0x3368, 0x3683, 0x34E6, 0x378D, + 0x36C7, 0x35B3, 0x3404, 0x32C4, 0x35F8, 0x34DA, 0x3787, 0x3639, + 0x3521, 0x33F9, 0x3219, 0x35ED, 0x37FE, 0x3700, 0x3632, 0x351B, + 0x33F2, 0x31BB, 0x2E4F, 0x37BA, 0x36F5, 0x35EB, 0x3482, 0x3350, + 0x3106, 0x2E47, 0x37B3, 0x366C, 0x359C, 0x3477, 0x3345, 0x3043, + 0x34C3, 0x372D, 0x3665, 0x354F, 0x33DD, 0x32A1, 0x361A, 0x34B8, + 0x3388, 0x365A, 0x3544, 0x33D6, 0x31F5, 0x358A, 0x346A, 0x32E5, + 0x3613, 0x353D, 0x3386, 0x3654, 0x357F, 0x3417, 0x32DE, 0x35C4, + 0x34AA, 0x3715, 0x364D, 0x34F2, 0x33C8, 0x3233, 0x2FC3, 0x37CF, + 0x370A, 0x3642, 0x34E6, 0x33BD, 0x31DC, 0x2EEF, 0x37C4, 0x36C9, + 0x35B7, 0x34DB, 0x33B6, 0x317A, 0x2EE8, 0x3784, 0x36BE, 0x35AC, + 0x3492, 0x3314, 0x3121, 0x34D9, 0x33F3, 0x36B3, 0x35E9, 0x3486, + 0x330D, 0x3114, 0x34CD, 0x33A4, 0x362E, 0x3559, 0x347F, 0x3301, + 0x35E3, 0x34C7, 0x339D, 0x3623, 0x3552, 0x33E6, 0x36A6, 0x35D7, + 0x3479, 0x3396, 0x3159, 0x350A, 0x33DF, 0x369A, 0x354C, 0x3472, + 0x32F4, 0x3152, 0x34FF, 0x3720, 0x3659, 0x3545, 0x3467, 0x32ED, + 0x3146, 0x3815, 0x3715, 0x364E, 0x357E, 0x341D, 0x32E1, 0x3090, + 0x2E3D, 0x370A, 0x3647, 0x34F2, 0x3412, 0x3290, 0x3089, 0x34A4, + 0x36C9, 0x3601, 0x34E6, 0x340B, 0x3284, 0x3571, 0x3498, 0x3700, + 0x35F5, 0x3524, 0x33FF, 0x327D, 0x35AE, 0x3492, 0x36B7, 0x35EF, + 0x3519, 0x33B5, 0x3637, 0x351E, 0x33F9, 0x330F, 0x35A8, 0x348B, + 0x3730, 0x362B, 0x3517, 0x343D, 0x3308, 0x359D, 0x34CA, 0x36E8, + 0x3663, 0x3555, 0x3432, 0x32B7, 0x35D9, 0x37E1, 0x36E5, 0x35DE, + 0x3549, 0x33E8, 0x32B0, 0x30B7, 0x3765, 0x36DE, 0x3616, 0x3502, + 0x33DC, 0x32A4, 0x358C, 0x379A, 0x3699, 0x360B, 0x34FB, 0x33D5, + 0x32EB, 0x35C4, 0x34AE, 0x3381, 0x31A7, 0x3534, 0x3415, 0x324C, + 0x3539, 0x34A2, 0x32EA, 0x3601, 0x34EC, 0x33CB, 0x3240, 0x3099, + 0x3459, 0x332B, 0x35F6, 0x34E6, 0x33C0, 0x3288, 0x3092, 0x3453, + 0x36BB, 0x35B4, 0x351F, 0x3400, 0x3281, 0x3086, 0x2D69, 0x36B4, + 0x35EC, 0x3492, 0x33F9, 0x322F, 0x30DB, 0x2E9D, 0x36B1, 0x35E5, + 0x34D0, 0x33AF, 0x3277, 0x30CF, 0x2DCA, 0x3313, 0x359F, 0x350E, + 0x33EF, 0x3270, 0x311E, 0x347C, 0x3354, 0x35D7, 0x34C6, 0x33E8, + 0x32B2, 0x306E, 0x3433, 0x3394, 0x320D, 0x3504, 0x3399, 0x32F8, + 0x3589, 0x3472, 0x32FD, 0x31BB, 0x34F9, 0x33DE, 0x325A, 0x3542, + 0x34AC, 0x3343, 0x31B4, 0x3056, 0x3418, 0x3609, 0x357A, 0x3460, + 0x3383, 0x31FC, 0x30A6, 0x3412, 0x3683, 0x35B7, 0x345D, 0x3378, + 0x3243, 0x2FEF, 0x2D29, 0x3642, 0x3571, 0x34E0, 0x3379, 0x31F2, + 0x3045, 0x2D92, 0x3675, 0x35A9, 0x3490, 0x33B9, 0x3239, 0x3095, + 0x3447, 0x331E, 0x3567, 0x34D6, 0x33F8, 0x3280, 0x30E5, 0x3443, + 0x335E, 0x35E2, 0x350F, 0x33AF, 0x32C2, 0x312E, 0x3482, 0x3314, + 0x3223, 0x34CC, 0x33EE, 0x3276, 0x3590, 0x3439, 0x3354, 0x31D1, + 0x3505, 0x33E8, 0x361B, 0x354E, 0x3478, 0x3399, 0x35CD, 0x34FE, + 0x342A, 0x334A, 0x35C9, 0x34B1, 0x3396, 0x360C, 0x353F, 0x3469, + 0x32FA, 0x3209, 0x34B3, 0x33D5, 0x3601, 0x3534, 0x3420, 0x3340, + 0x3202, 0x305D, 0x3704, 0x3640, 0x3574, 0x34A4, 0x3380, 0x31FF, + 0x3051, 0x36C4, 0x3635, 0x356D, 0x345C, 0x337D, 0x3294, 0x30AA, + 0x2E7A, 0x3674, 0x35AD, 0x34DA, 0x3402, 0x3288, 0x30F9, 0x2ED9, + 0x336D, 0x35A2, 0x34D3, 0x33BE, 0x32D6, 0x3191, 0x348B, 0x3366, + 0x31EA, 0x3514, 0x343E, 0x3317, 0x3144, 0x3488, 0x33AA, 0x327A, + 0x30E2, 0x33F5, 0x3314, 0x31DB, 0x34C1, 0x33E9, 0x327C, 0x3134, + 0x3479, 0x339F, 0x326B, 0x3502, 0x33EA, 0x3305, 0x31CB, 0x2F75, + 0x3356, 0x35D1, 0x34FB, 0x3425, 0x32FE, 0x3179, 0x3075, 0x2D7F, + 0x3603, 0x353B, 0x346B, 0x338D, 0x325D, 0x3114, 0x2EA3, 0x2B23, + 0x3577, 0x3468, 0x3386, 0x3256, 0x30C1, 0x2F5A, 0x2C8A, 0x3570, + 0x34E5, 0x340F, 0x32E8, 0x31AE, 0x2FAC, 0x337F, 0x3202, 0x34E2, + 0x33CA, 0x32E1, 0x3161, 0x3006, 0x33BA, 0x3291, 0x314F, 0x344A, + 0x3370, 0x3240, 0x30F7, 0x3401, 0x32DA, 0x31A0, 0x2FF6, 0x336D, + 0x3239, 0x30A8, 0x33FE, 0x331A, 0x31E3, 0x3041, 0x33AC, 0x32CB, + 0x3510, 0x343C, 0x33A4, 0x327A, 0x30E9, 0x2F2C, 0x3313, 0x3549, + 0x34BD, 0x33A5, 0x3273, 0x3132, 0x2F25, 0x2CCA, 0x3588, 0x34FE, + 0x33A2, 0x3304, 0x31D1, 0x302F, 0x2E5E, 0x29D0, 0x34FB, 0x3426, + 0x334C, 0x31CE, 0x3079, 0x2DFF, 0x32AE, 0x34FC, 0x3468, 0x3349, + 0x325D, 0x316F, 0x2F6C, 0x32F6, 0x3259, 0x34A9, 0x3389, 0x32EE, + 0x316C, 0x2FBD, 0x3380, 0x3256, 0x3111, 0x3410, 0x32F0, 0x31B4, + 0x30B8, 0x33C3, 0x3297, 0x31AB, 0x300D, 0x3333, 0x324C, 0x34DB, + 0x340A, 0x3327, 0x31FB, 0x3058, 0x3373, 0x32DD, 0x3516, 0x3406, + 0x336A, 0x31F8, 0x30FA, 0x2FA2, 0x3320, 0x3556, 0x3448, 0x33B2, + 0x3286, 0x319A, 0x2FA4, 0x2DBF, 0x3591, 0x3489, 0x3434, 0x3311, + 0x31E5, 0x3097, 0x2F36, 0x32C7, 0x34CA, 0x3475, 0x3359, 0x322F, + 0x3138, 0x2F38, 0x3351, 0x3544, 0x34B6, 0x339C, 0x3278, 0x31D1, + 0x2FE1, 0x3393, 0x3268, 0x34F2, 0x33DE, 0x3300, 0x321C, 0x30D5, + 0x33D6, 0x32B1, 0x3179, 0x3420, 0x334B, 0x32AD, 0x3122, 0x3418, + 0x333B, 0x320C, 0x311E, 0x33CF, 0x32F1, 0x352B, 0x3459, 0x3382, + 0x3256, 0x31B7, 0x3018, 0x2D97, 0x2A6E, 0x349A, 0x33C4, 0x32EA, + 0x3202, 0x30BB, 0x2EA7, 0x2D1E, 0x315F, 0x340A, 0x3373, 0x3293, + 0x3156, 0x2F5B, 0x2DE5, 0x31B2, 0x3104, 0x33B5, 0x32D7, 0x31A1, + 0x3057, 0x2EA2, 0x32D3, 0x319E, 0x3003, 0x331A, 0x31EC, 0x30A9, + 0x2FA8, 0x3317, 0x31E8, 0x30A1, 0x2EEB, 0x327D, 0x31E0, 0x309D, + 0x335A, 0x3232, 0x313C, 0x2F98, 0x2D64, 0x3229, 0x30EA, 0x339C, + 0x32BD, 0x3187, 0x303D, 0x2F39, 0x2CF3, 0x3184, 0x3426, 0x334F, + 0x326A, 0x3132, 0x2FE4, 0x2E16, 0x2AB0, 0x3467, 0x3391, 0x32B3, + 0x31C6, 0x3083, 0x2ED2, 0x2C7A, 0x2337, 0x33CF, 0x32F6, 0x3210, + 0x30D4, 0x2F7A, 0x2DA7, 0x2A23, 0x30CC, 0x3382, 0x32EA, 0x31BB, + 0x30C8, 0x2E64, 0x2BFA, 0x3118, 0x301B, 0x332D, 0x3205, 0x3114, + 0x2FC6, 0x2E57, 0x3201, 0x3110, 0x2F10, 0x32E0, 0x315F, 0x3065, + 0x2F07, 0x3246, 0x315B, 0x3011, 0x2EAA, 0x3242, 0x3153, 0x300D, + 0x331B, 0x323A, 0x30AE, 0x2F58, 0x2D84, 0x319E, 0x30AA, 0x331C, + 0x3283, 0x319A, 0x3057, 0x2E42, 0x2C48, 0x3148, 0x33E7, 0x3310, + 0x322F, 0x30F2, 0x2F9F, 0x2E35, 0x2AE3, 0x342C, 0x3353, 0x3274, + 0x318F, 0x309C, 0x2EE5, 0x353C, 0x346D, 0x33DD, 0x3306, 0x326C, + 0x30E8, 0x2FE6, 0x32FD, 0x34EF, 0x3461, 0x3391, 0x32B0, 0x31C8, + 0x30DB, 0x2F32, 0x3265, 0x34A5, 0x33CE, 0x333C, 0x325D, 0x3127, + 0x302C, 0x32F3, 0x31C6, 0x3452, 0x3382, 0x32EF, 0x31BE, 0x30D1, + 0x337E, 0x329D, 0x31BA, 0x3075, 0x3332, 0x3253, 0x31B2, 0x3022, + 0x332A, 0x324F, 0x3114, 0x301E, 0x32E5, 0x31FB, 0x3110, 0x3374, + 0x32DC, 0x31B0, 0x3108, 0x2F6B, 0x328F, 0x31A7, 0x33F9, 0x3368, + 0x3244, 0x31A4, 0x305E, 0x2F5F, 0x323C, 0x347C, 0x33ED, 0x32D2, + 0x3238, 0x3102, 0x2FB2, 0x2EA3, 0x2C5B, 0x3431, 0x335E, 0x32C6, + 0x3199, 0x30F6, 0x2F54, 0x2D89, 0x2B0A, 0x33E3, 0x3352, 0x322E, + 0x318D, 0x304C, 0x2EF1, 0x2CB4, 0x3189, 0x3397, 0x32BC, 0x3222, + 0x30EB, 0x3040, 0x2E91, 0x3219, 0x30E3, 0x338B, 0x32B0, 0x3183, + 0x30DF, 0x2F94, 0x2DCD, 0x317F, 0x30DB, 0x2F8B, 0x3262, 0x3176, + 0x3035, 0x2EDA, 0x320F, 0x3173, 0x3032, 0x2ED6, 0x320B, 0x30D4, + 0x3029, 0x32E7, 0x3208, 0x30D1, 0x3025, 0x2E19, 0x31BC, 0x30C8, + 0x3331, 0x324F, 0x31B4, 0x30C4, 0x2F79, 0x2DB7, 0x3160, 0x3077, + 0x3325, 0x3248, 0x315C, 0x301B, 0x2EC4, 0x2D45, 0x2AC9, 0x336B, + 0x32D5, 0x31FA, 0x310C, 0x300E, 0x2EB7, 0x2CE1, 0x29D0, 0x335F, + 0x3288, 0x31A2, 0x3100, 0x2FBC, 0x2DFA, 0x2C08, 0x30FC, 0x3357, + 0x327C, 0x3196, 0x305C, 0x2F5A, 0x2DED, 0x2C00, 0x3054, 0x32C2, + 0x322E, 0x3147, 0x3050, 0x2EFC, 0x2D2B, 0x313E, 0x304C, 0x2EF8, + 0x3222, 0x313A, 0x3044, 0x2E98, 0x321E, 0x3137, 0x2FA1, 0x2E41, + 0x3216, 0x3098, 0x2F98, 0x3265, 0x3184, 0x3090, 0x2F94, 0x2E34, + 0x317C, 0x308C, 0x2F91, 0x325E, 0x3178, 0x3088, 0x2F8D, 0x2E2D, + 0x2BDD, 0x3080, 0x32EE, 0x3210, 0x316C, 0x3032, 0x2F2F, 0x2D68, + 0x2AF9, 0x3333, 0x32E2, 0x3204, 0x311D, 0x302A, 0x2ECD, 0x2D60, + 0x2AF1, 0x3370, 0x3291, 0x31F8, 0x3110, 0x301E, 0x2E72, 0x2D53, + 0x2AE9, 0x3364, 0x328E, 0x315E, 0x30B7, 0x2F73, 0x2E6B, 0x2C89, + 0x306A, 0x2F6F, 0x3282, 0x31A2, 0x3066, 0x2F6B, 0x2E5E, 0x319A, + 0x3063, 0x2F62, 0x3234, 0x3196, 0x30AC, 0x2F5E, 0x3231, 0x3147, + 0x30A9, 0x2F5B, 0x322D, 0x3147, 0x3009, 0x2F06, 0x3225, 0x3143, + 0x3005, 0x2F02, 0x3221, 0x3140, 0x2FFC, 0x32B5, 0x31D7, 0x3137, + 0x3047, 0x32B1, 0x31D3, 0x3134, 0x3043, 0x2EF2, 0x2D2E, 0x30E8, + 0x303F, 0x3264, 0x31CC, 0x30E4, 0x2F9E, 0x2E98, 0x31C3, 0x30DB, + 0x2F9A, 0x2E94, 0x317D, 0x30D8, 0x2FE5, 0x2E90, 0x3175, 0x30D4, + 0x2FE1, 0x2E88, 0x31BC, 0x30CB, 0x2FDD, 0x3251, 0x31B8, 0x3084, + 0x2FD5, 0x2E80, 0x2D68, 0x307B, 0x2F86, 0x324A, 0x316A, 0x30C4, + 0x2F82, 0x2E25, 0x2CA5, 0x30C0, 0x2F7F, 0x31FC, 0x315E, 0x30BD, + 0x2F76, 0x2E75, 0x2CFE, 0x2A87, 0x32D1, 0x323A, 0x319D, 0x306C, + 0x2FBD, 0x2E68, 0x2CF1, 0x2A7F, 0x32C5, 0x322E, 0x3153, 0x30AD, + 0x2F6B, 0x2EB7, 0x2D48, 0x2AE9, 0x2F67, 0x322B, 0x3147, 0x3059, + 0x2F5F, 0x2E06, 0x2C85, 0x2ADB, 0x2FAF, 0x3223, 0x313B, 0x3055, + 0x2FAB, 0x2E51, 0x2CDE, 0x309E, 0x2F53, 0x2E4D, 0x313C, 0x3096, + 0x2F54, 0x2EA0, 0x2CD6, 0x3045, 0x2F50, 0x2E45, 0x3130, 0x3045, + 0x2F9B, 0x2DEE, 0x3135, 0x3042, 0x2F97, 0x2E42, 0x2C6F, 0x308B, + 0x2F94, 0x2E3E, 0x3174, 0x3087, 0x2F45, 0x2E91, 0x2CC2, 0x307F, + 0x2F90, 0x3201, 0x3125, 0x3037, 0x2F8C, 0x2E84, 0x2D1A, 0x2B20, + 0x2FD7, 0x3247, 0x3164, 0x30C4, 0x2F80, 0x2E2A, 0x2D6B, 0x2B82, + 0x2845, 0x31FE, 0x311A, 0x3079, 0x2F7D, 0x2ECF, 0x2D0F, 0x2B15, + 0x28C3, 0x323C, 0x319F, 0x30B9, 0x2FC4, 0x2E76, 0x2D60, 0x2B77, + 0x2FC0, 0x2E72, 0x3156, 0x3069, 0x2FC5, 0x2EC4, 0x2DB1, 0x2BD2, + 0x2FBC, 0x2F10, 0x3194, 0x30F5, 0x3006, 0x2F0C, 0x2D56, 0x2C2C, + 0x2FB5, 0x2EBD, 0x2DAA, 0x30AB, 0x2FB5, 0x2EB9, 0x2DFE, 0x30EE, + 0x2FFF, 0x2F05, 0x2DFA, 0x30EA, 0x3049, 0x2F51, 0x2DF6, 0x30A3, + 0x2FF8, 0x2EFE, 0x2D9F, 0x2C7E, 0x2FF8, 0x2EFE, 0x31C8, 0x312A, + 0x3042, 0x2F4A, 0x2E46, 0x2CD6, 0x303E, 0x2F46, 0x31C4, 0x312B, + 0x303E, 0x2F4B, 0x2E3E, 0x2CD3, 0x2BA6, 0x329B, 0x31C1, 0x311F, + 0x3083, 0x2FE0, 0x2E91, 0x2D83, 0x2B99, 0x3298, 0x31BD, 0x3166, + 0x30CC, 0x2F8F, 0x2E8D, 0x2D27, 0x2BFD, 0x2FD9, 0x31FB, 0x31A8, + 0x307C, 0x2FD0, 0x2F2A, 0x2E26, 0x2CB1, 0x2FD5, 0x323C, 0x315F, + 0x30BC, 0x301F, 0x2F27, 0x2DCC, 0x30C1, 0x3016, 0x2F72, 0x319D, + 0x3104, 0x301B, 0x2F1A, 0x2E6C, 0x3100, 0x3060, 0x2F6E, 0x319A, + 0x314B, 0x3018, 0x2FB9, 0x31E3, 0x3143, 0x3061, 0x2F67, 0x2EBA, + 0x3148, 0x3058, 0x2FB5, 0x31E0, 0x313F, 0x305D, 0x2FB1, 0x2F0B, + 0x3144, 0x30A1, 0x2FB6, 0x2F03, 0x2E03, 0x2C93, 0x2A91, 0x2F08, + 0x3182, 0x30E9, 0x2FF8, 0x2F53, 0x2E00, 0x2CE5, 0x2B58, 0x28AE, + 0x317F, 0x312C, 0x3041, 0x2F9D, 0x2E49, 0x2D92, 0x2BBC, 0x29A2, + 0x23CB, 0x312D, 0x3089, 0x2F9F, 0x2EEB, 0x2D94, 0x2C16, 0x2A74, + 0x2EA0, 0x2DE7, 0x30CD, 0x2F9B, 0x2F3B, 0x2DDE, 0x2CCD, 0x2B44, + 0x2EE4, 0x2E3A, 0x30CE, 0x2FDC, 0x2F86, 0x2E31, 0x2D7F, 0x2B47, + 0x2F34, 0x2E87, 0x2D76, 0x3026, 0x2FD0, 0x2E83, 0x2D7C, 0x2C5E, + 0x2F7F, 0x2ED8, 0x2DCF, 0x2C5E, 0x3019, 0x2ED4, 0x2DC6, 0x2CB4, + 0x2FC9, 0x2F23, 0x2E22, 0x2CB0, 0x2BEC, 0x2F20, 0x2E19, 0x2D67, + 0x3012, 0x2F73, 0x2E6F, 0x2D63, 0x2C49, 0x2A47, 0x2E6B, 0x30F9, + 0x305B, 0x2FBD, 0x2EC0, 0x2DB7, 0x2CA5, 0x2B12, 0x2872, 0x3140, + 0x30A7, 0x3002, 0x2F0C, 0x2E0A, 0x2D00, 0x2BD9, 0x2951, 0x318A, + 0x30EE, 0x304A, 0x2F57, 0x2E5C, 0x2DAC, 0x2C90, 0x2A99, 0x285B, + 0x3130, 0x3047, 0x2FA1, 0x2EB1, 0x2DFA, 0x2CE6, 0x2B62, 0x28D5, + 0x2DF6, 0x308F, 0x303A, 0x2F4B, 0x2E4C, 0x2D40, 0x2BC0, 0x29B1, + 0x2E48, 0x2D97, 0x303B, 0x2F95, 0x2E9D, 0x2D94, 0x2C78, 0x2FE2, + 0x2EEC, 0x2E3B, 0x2CD6, 0x2B4D, 0x2EE8, 0x3167, 0x30CA, 0x302B, + 0x2F37, 0x2E37, 0x2D2B, 0x2C0C, 0x2F85, 0x2E8D, 0x30C7, 0x3028, + 0x2F81, 0x2E89, 0x2D7F, 0x2C68, 0x2FCF, 0x2ED8, 0x2E27, 0x30BA, + 0x301B, 0x2F2C, 0x2E7C, 0x2D72, 0x301B, 0x2F2C, 0x2E28, 0x2D6E, + 0x2BFD, 0x2F76, 0x2E78, 0x2DC5, 0x3063, 0x2FBE, 0x2ECD, 0x2E1B, + 0x2D0F, 0x2BEF, 0x2F1B, 0x2E6C, 0x2D67, 0x3010, 0x2F18, 0x2E68, + 0x2D63, 0x2C4C, 0x2ABD, 0x2EBC, 0x2DBA, 0x3053, 0x2FB3, 0x2F0B, + 0x2E10, 0x2D03, 0x2B7F, 0x29DB, 0x2E60, 0x309F, 0x3000, 0x2F5E, + 0x2E5C, 0x2D52, 0x2C40, 0x2B0F, 0x2876, 0x312F, 0x3048, 0x2FA3, + 0x2EFB, 0x2DFF, 0x2D4A, 0x2B73, 0x2A35, 0x2868, 0x308F, 0x2FF0, + 0x2F4E, 0x2E4C, 0x2D99, 0x2C89, 0x2B66, 0x28E1, 0x2DEF, 0x3087, + 0x2F97, 0x2EEF, 0x2E44, 0x2D3F, 0x2BC3, 0x2A8E, 0x2E44, 0x2D91, + 0x2C1E, 0x2F3E, 0x2E99, 0x2D8D, 0x2C7D, 0x2BB6, 0x29AB, 0x2DE3, + 0x2CD6, 0x2C16, 0x2F36, 0x2E34, 0x2D2E, 0x2C70, 0x2AE6, 0x2E88, + 0x2D85, 0x2CC9, 0x2B49, 0x2E88, 0x2DDB, 0x2CC5, 0x2BAA, 0x2ED7, + 0x2E2C, 0x2D1D, 0x2C0A, 0x2A71, 0x2E7C, 0x2D75, 0x2C65, 0x2F73, + 0x2ECA, 0x2DCB, 0x2CBE, 0x2B3D, 0x2A04, 0x2DCB, 0x2D16, 0x2FC0, + 0x2F1E, 0x2E20, 0x2D6D, 0x2C53, 0x2B30, 0x291E, 0x2DBE, 0x300C, + 0x2F6B, 0x2F11, 0x2E14, 0x2D60, 0x2BF2, 0x2A5D, 0x2825, 0x3058, + 0x3000, 0x2F5F, 0x2E68, 0x2DB6, 0x2CA5, 0x2BE4, 0x2A4F, 0x281D, + 0x2298, 0x2FAC, 0x2F06, 0x2E5C, 0x2D54, 0x2C9D, 0x2B1C, 0x2971, + 0x2710, 0x2CF0, 0x2FA4, 0x2EB0, 0x2DAB, 0x2CF5, 0x2BD9, 0x2B0E, + 0x2963, 0x2D4D, 0x2C33, 0x2F47, 0x2EA3, 0x2D9E, 0x2CE8, 0x2BCB, + 0x2A3B, 0x2E47, 0x2D40, 0x2C2B, 0x2EF1, 0x2E47, 0x2D96, 0x2C84, + 0x2B03, 0x2E96, 0x2D96, 0x2C85, 0x2BC4, 0x2EE5, 0x2E3F, 0x2D38, + 0x2C23, 0x2EEA, 0x2E8E, 0x2D89, 0x2C7C, 0x2BBB, 0x2E8F, 0x2DDF, + 0x2D2B, 0x2F88, 0x2EDD, 0x2E38, 0x2D81, 0x2C6F, 0x2AF3, 0x2E87, + 0x2D82, 0x2C75, 0x2F7B, 0x2E87, 0x2E2B, 0x2D23, 0x2C0E, 0x2AE5, + 0x2940, 0x2D7A, 0x3012, 0x2F27, 0x2E7A, 0x2DCA, 0x2D16, 0x2C01, + 0x2AD8, 0x28BF, 0x305D, 0x2F74, 0x2F1A, 0x2E6D, 0x2D6D, 0x2C60, + 0x2B40, 0x2A05, 0x2847, 0x300B, 0x2FB7, 0x2F12, 0x2E17, 0x2D65, + 0x2C53, 0x2B32, 0x29FC, 0x2DBF, 0x3003, 0x2F5B, 0x2EBD, 0x2E0F, + 0x2D07, 0x2CA2, 0x2F06, 0x2E0F, 0x2DB2, 0x2CA7, 0x2BE4, 0x2ABA, + 0x2DB7, 0x2CFF, 0x2BEA, 0x2EB0, 0x2E5A, 0x2D59, 0x2C9A, 0x2B82, + 0x29E7, 0x2DAA, 0x2CF2, 0x2F9F, 0x2EF5, 0x2E03, 0x2D4C, 0x2C92, + 0x2B74, 0x29DE, 0x27A4, 0x2C93, 0x2F42, 0x2EA4, 0x2DF6, 0x2D3F, + 0x2C32, 0x2B6C, 0x2A39, 0x2812, 0x2FE2, 0x2F3E, 0x2E98, 0x2DE9, + 0x2CE6, 0x2C25, 0x2B09, 0x2963, 0x280A, 0x2439, 0x2F32, 0x2E8B, + 0x2D92, 0x2D33, 0x2C1C, 0x2AFB, 0x295B, 0x27FB, 0x2C79, 0x2F2E, + 0x2E87, 0x2DD8, 0x2CD1, 0x2BBB, 0x2AEE, 0x29B7, 0x2703, 0x2C6C, + 0x2B53, 0x2E31, 0x2D81, 0x2CCD, 0x2C0B, 0x2A89, 0x28DD, 0x2D1F, + 0x2C11, 0x2B4B, 0x2E76, 0x2DCC, 0x2CC0, 0x2BAF, 0x2AE2, 0x2941, + 0x2D1B, 0x2C60, 0x2B3E, 0x2E25, 0x2D75, 0x2CBC, 0x2BFF, 0x2ADA, + 0x2E13, 0x2D0E, 0x2C05, 0x2B3A, 0x2A07, 0x2DBC, 0x2D0A, 0x2BF2, + 0x2A70, 0x2DC1, 0x2D0A, 0x2C4F, 0x2B90, 0x2A04, 0x2D64, 0x2C55, + 0x2B96, 0x2E63, 0x2E07, 0x2D02, 0x2C47, 0x2B2E, 0x29F6, 0x2843, + 0x2CF9, 0x2BE6, 0x2EAC, 0x2DB0, 0x2CFE, 0x2C43, 0x2B7F, 0x29EE, + 0x28A8, 0x2C9F, 0x2F02, 0x2E5B, 0x2DAC, 0x2CF1, 0x2C36, 0x2B22, + 0x29EA, 0x3039, 0x2F9D, 0x2EFE, 0x2E9B, 0x2DF2, 0x2D42, 0x2C37, + 0x2B73, 0x2A44, 0x3035, 0x2F90, 0x2F3C, 0x2E97, 0x2D9C, 0x2CE9, + 0x2C2A, 0x2B6B, 0x29DE, 0x2D8E, 0x2FD6, 0x2F38, 0x2E8F, 0x2DE7, + 0x2D36, 0x2C7D, 0x2B67, 0x2A99, 0x2DDD, 0x2CD8, 0x2F2C, 0x2E8B, + 0x2E30, 0x2D32, 0x2C75, 0x2B5A, 0x2A3A, 0x2D86, 0x2CD0, 0x2C15, + 0x2ED3, 0x2DDF, 0x2D25, 0x2CC7, 0x2BB4, 0x2A8D, 0x2D7E, 0x2D21, + 0x2C11, 0x2AF3, 0x2E20, 0x2D75, 0x2CC3, 0x2BB0, 0x2E71, 0x2DC9, + 0x2D1D, 0x2C0D, 0x2B45, 0x2A7B, 0x2D71, 0x2CBB, 0x2C00, 0x2E6E, + 0x2DC5, 0x2D10, 0x2C5C, 0x2B9E, 0x2A7D, 0x2D6D, 0x2CB7, 0x2BFC, + 0x2E6A, 0x2DC1, 0x2D60, 0x2CAE, 0x2B42, 0x2A6F, 0x299C, 0x2D08, + 0x2BF8, 0x2EB2, 0x2E07, 0x2D5C, 0x2C54, 0x2BEA, 0x2B2B, 0x299E, + 0x27DF, 0x2C47, 0x2EAE, 0x2E03, 0x2DAC, 0x2CA2, 0x2BE6, 0x2ACD, + 0x2990, 0x2844, 0x25E1, 0x2EFA, 0x2DFF, 0x2DA8, 0x2CF3, 0x2C3E, + 0x2B1F, 0x2A55, 0x291E, 0x26D4, 0x24A7, 0x2E48, 0x2DA4, 0x2CEF, + 0x2C3B, 0x2B79, 0x2A52, 0x2910, 0x2744, 0x2BD1, 0x2B17, 0x2DEE, + 0x2D3F, 0x2C37, 0x2BCD, 0x2A53, 0x2976, 0x282A, 0x2C29, 0x2B6C, + 0x2A40, 0x2D3B, 0x2C80, 0x2C20, 0x2AA6, 0x2A3B, 0x282C, 0x2C7B, + 0x2B6D, 0x2AA2, 0x2D86, 0x2CD1, 0x2C1C, 0x2B01, 0x2A38, 0x28F5, + 0x2C77, 0x2BB8, 0x2AF8, 0x2965, 0x2CD6, 0x2C73, 0x2B56, 0x2A34, + 0x295B, 0x2CC9, 0x2BBD, 0x2B52, 0x2A26, 0x28ED, 0x2C6F, 0x2BAF, + 0x2A96, 0x29C0, 0x2CC5, 0x2C10, 0x2BA6, 0x2A82, 0x2953, 0x2802, + 0x2C02, 0x2AEC, 0x2DC4, 0x2D15, 0x2CB7, 0x2BA7, 0x2ADE, 0x29B8, + 0x286B, 0x260C, 0x2B9E, 0x2DC8, 0x2D68, 0x2CB3, 0x2BFA, 0x2ADA, + 0x2A16, 0x293D, 0x2707, 0x257A, 0x2E11, 0x2DB2, 0x2D04, 0x2BF7, + 0x2B3E, 0x2AD1, 0x299C, 0x27E8, 0x257D, 0x2E5A, 0x2DAE, 0x2D00, + 0x2CA2, 0x2BE9, 0x2ACE, 0x29FF, 0x2857, 0x267C, 0x24DC, 0x2E00, + 0x2D53, 0x2C9E, 0x2BE5, 0x2B23, 0x29FC, 0x28BE, 0x276D, 0x25E7, + 0x2B1F, 0x2D9D, 0x2CEE, 0x2C37, 0x2B7C, 0x2A62, 0x29EE, 0x28B0, + 0x26DD, 0x2B1B, 0x2A54, 0x2D42, 0x2C92, 0x2BD9, 0x2B16, 0x2A4A, + 0x2916, 0x2C88, 0x2BCF, 0x2B0D, 0x29E5, 0x2CDD, 0x2C2B, 0x2B6B, + 0x2A4C, 0x2975, 0x2C85, 0x2BCC, 0x2B0E, 0x2A42, 0x2971, 0x2C80, + 0x2BC7, 0x2B05, 0x2A3E, 0x2D2D, 0x2C77, 0x2BBE, 0x2A9E, 0x296D, + 0x2CCC, 0x2C19, 0x2B59, 0x2A3A, 0x2969, 0x2821, 0x2BBF, 0x2AFD, + 0x2D80, 0x2D20, 0x2C6F, 0x2BB6, 0x2AF8, 0x2A2C, 0x295B, 0x2C6B, + 0x2BB1, 0x2AEF, 0x2D72, 0x2CC4, 0x2C11, 0x2B4D, 0x2A88, 0x2957, + 0x2CBF, 0x2BAE, 0x2AEB, 0x2A24, 0x2953, 0x2C5E, 0x2BA4, 0x2AE7, + 0x2A20, 0x2CBC, 0x2C59, 0x2BA0, 0x2AE3, 0x2A16, 0x2873, 0x2C00, + 0x2B9C, 0x2AD9, 0x2D0F, 0x2CAE, 0x2BFC, 0x2B3B, 0x2A18, 0x2946, + 0x286A, 0x2BF2, 0x2AD5, 0x2A0E, 0x2D02, 0x2C51, 0x2BEE, 0x2AD1, + 0x2A0A, 0x2938, 0x277D, 0x2B33, 0x2ACD, 0x2D55, 0x2CA6, 0x2C44, + 0x2B2F, 0x2A6A, 0x2935, 0x2858, 0x276F, 0x24F5, 0x2DA2, 0x2CFA, + 0x2C98, 0x2B86, 0x2B21, 0x2A5C, 0x292C, 0x284F, 0x2675, 0x23CA, + 0x2D48, 0x2CEC, 0x2C32, 0x2B7E, 0x2ABB, 0x29EF, 0x291D, 0x2762, + 0x256D, 0x21CC, 0x2D3F, 0x2C87, 0x2BD4, 0x2B70, 0x2A50, 0x2986, + 0x283D, 0x2754, 0x255D, 0x2A46, 0x2CE4, 0x2C2A, 0x2BC7, 0x2B0B, + 0x2A42, 0x2978, 0x2834, 0x2660, 0x2B07, 0x29E3, 0x28A4, 0x2C1D, + 0x2B68, 0x2B03, 0x29D9, 0x289F, 0x27BF, 0x2B64, 0x2A9D, 0x29D5, + 0x289B, 0x2BBF, 0x2B5A, 0x2A3A, 0x29CB, 0x2891, 0x273E, 0x2B56, + 0x2A35, 0x2962, 0x288D, 0x2BB1, 0x2AFB, 0x2A31, 0x28FB, 0x2823, + 0x2BAD, 0x2AF1, 0x2A28, 0x28F7, 0x281A, 0x2B52, 0x2AED, 0x2A23, + 0x28ED, 0x2C0C, 0x2B4E, 0x2AE3, 0x29BF, 0x28E9, 0x27A0, 0x26AD, + 0x2A82, 0x29BB, 0x2C61, 0x2BFE, 0x2B40, 0x2A82, 0x29B6, 0x287C, + 0x2791, 0x25AE, 0x2A7E, 0x29AD, 0x2C53, 0x2BA0, 0x2AE1, 0x2A75, + 0x29A8, 0x286E, 0x271B, 0x25A5, 0x2A70, 0x2CAB, 0x2C4F, 0x2B93, + 0x2B2E, 0x2A13, 0x293F, 0x2860, 0x270C, 0x2596, 0x2D4F, 0x2C9E, + 0x2C41, 0x2B85, 0x2ACE, 0x2A05, 0x2931, 0x27F2, 0x2693, 0x2488, + 0x29FB, 0x2C99, 0x2BE4, 0x2B81, 0x2AC1, 0x29F7, 0x28C6, 0x27E3, + 0x2685, 0x2478, 0x29F3, 0x2C8C, 0x2BD7, 0x2B22, 0x2A60, 0x2994, + 0x28BD, 0x27DA, 0x267C, 0x2A56, 0x29EE, 0x2C88, 0x2BD2, 0x2B14, + 0x2AAF, 0x29E5, 0x28AF, 0x2765, 0x2B10, 0x2AAA, 0x297C, 0x2C2C, + 0x2BC5, 0x2B10, 0x2A4E, 0x2981, 0x28AA, 0x2BC5, 0x2B0C, 0x2A44, + 0x297D, 0x2C23, 0x2BC1, 0x2B02, 0x2A9D, 0x29D8, 0x2903, 0x2BB7, + 0x2AFE, 0x2A3C, 0x296F, 0x2898, 0x2BBC, 0x2AFE, 0x2A3C, 0x296F, + 0x2C16, 0x2BB3, 0x2AFA, 0x2A37, 0x296B, 0x2894, 0x2BAF, 0x2AF6, + 0x2A90, 0x29C6, 0x288F, 0x27AD, 0x25D6, 0x23B8, 0x2C6D, 0x2C08, + 0x2BAA, 0x2AEC, 0x2A2A, 0x295D, 0x2823, 0x273D, 0x2644, 0x23A9, + 0x2959, 0x2C04, 0x2BA6, 0x2AE4, 0x2A21, 0x29B4, 0x28E4, 0x27A0, + 0x263B, 0x242D, 0x2950, 0x2BFF, 0x2B99, 0x2ADF, 0x2A7A, 0x2950, + 0x2879, 0x272A, 0x2637, 0x24AE, 0x29AB, 0x28DC, 0x2B94, 0x2B31, + 0x2A18, 0x294C, 0x28D2, 0x27FD, 0x26A3, 0x2A6C, 0x2948, 0x2870, + 0x2789, 0x2AD2, 0x2A68, 0x29A2, 0x28D3, 0x2789, 0x262A, 0x2A68, + 0x2999, 0x28C9, 0x27EF, 0x2ACD, 0x2A63, 0x299E, 0x28C5, 0x27EA, + 0x2704, 0x2A5A, 0x2995, 0x28C5, 0x2781, 0x268C, 0x2A5F, 0x2990, + 0x2927, 0x27E6, 0x2B1B, 0x2A5B, 0x29F4, 0x28C1, 0x27E2, 0x26FB, + 0x2590, 0x29EA, 0x2922, 0x27E2, 0x2B16, 0x2AAD, 0x29EA, 0x2919, + 0x2846, 0x26F7, 0x2581, 0x29E6, 0x291E, 0x2842, 0x2B12, 0x2AA9, + 0x29E2, 0x2915, 0x2842, 0x275A, 0x2670, 0x2470, 0x291A, 0x2BC5, + 0x2B0E, 0x2AA5, 0x29DD, 0x2975, 0x283E, 0x27C6, 0x25F7, 0x2467, + 0x216D, 0x2BC1, 0x2B63, 0x2AFB, 0x2A36, 0x2971, 0x2897, 0x27C2, + 0x2663, 0x2565, 0x233E, 0x2C0F, 0x2BB3, 0x2AF2, 0x2A32, 0x29CB, + 0x2C0F, 0x2B56, 0x2AF7, 0x2A8E, 0x29C7, 0x28F9, 0x281D, 0x26D3, + 0x2A32, 0x2CBC, 0x2C0B, 0x2BA5, 0x2B47, 0x2A8A, 0x29BD, 0x2955, + 0x2880, 0x2736, 0x2A8A, 0x2A1F, 0x2C0B, 0x2BFD, 0x2B43, 0x2A80, + 0x29C2, 0x2956, 0x287C, 0x279C, 0x2ADB, 0x2A1B, 0x294C, 0x2BF9, + 0x2B3F, 0x2AD7, 0x2A72, 0x29B0, 0x28DE, 0x27A2, 0x2AD7, 0x2A17, + 0x29B0, 0x28DE, 0x2B98, 0x2B31, 0x2A6E, 0x29A6, 0x28DA, 0x286F, + 0x2789, 0x2A73, 0x2A09, 0x293A, 0x2865, 0x2B2D, 0x2A6A, 0x29AC, + 0x293F, 0x286A, 0x278B, 0x2AC5, 0x29FF, 0x2935, 0x286B, 0x27F4, + 0x270B, 0x2A5B, 0x2999, 0x28C7, 0x27F0, 0x2AC9, 0x2A60, 0x2999, + 0x2927, 0x2852, 0x270D, 0x2617, 0x2995, 0x28CD, 0x2858, 0x2B1A, + 0x2A5C, 0x29F2, 0x2923, 0x284E, 0x2773, 0x2687, 0x2515, 0x2986, + 0x28B4, 0x2B6E, 0x2AB7, 0x2A4E, 0x2986, 0x28BA, 0x2845, 0x26FA, + 0x260A, 0x248C, 0x291A, 0x2B6A, 0x2AB3, 0x2A4A, 0x2982, 0x2915, + 0x2841, 0x2761, 0x2674, 0x2502, 0x2368, 0x2BC2, 0x2B08, 0x2AA5, + 0x29E0, 0x2974, 0x28A7, 0x27D0, 0x26E7, 0x25F7, 0x24F8, 0x218E, + 0x2B60, 0x2AFA, 0x2A3C, 0x29D1, 0x2907, 0x2899, 0x274E, 0x2667, + 0x24F4, 0x23E0, 0x217D, 0x2AFF, 0x2A97, 0x2A2D, 0x2961, 0x2895, + 0x27BD, 0x26D9, 0x25E9, 0x245F, 0x221D, 0x2825, 0x2AF1, 0x2A29, + 0x29BF, 0x28FA, 0x2886, 0x27AE, 0x2654, 0x255F, 0x23D3, 0x2886, + 0x27AE, 0x26C6, 0x2A1B, 0x2958, 0x28EB, 0x2816, 0x26C7, 0x25D6, + 0x24D7, 0x28EB, 0x2878, 0x2732, 0x264B, 0x29B6, 0x294A, 0x287D, + 0x279B, 0x26B7, 0x25C7, 0x294A, 0x28DD, 0x27A1, 0x2728, 0x263B, + 0x29A8, 0x28DD, 0x2804, 0x2729, 0x2641, 0x29A8, 0x293C, 0x2809, + 0x2792, 0x26AE, 0x2543, 0x2941, 0x28D4, 0x2793, 0x271A, 0x2A04, + 0x2941, 0x28D4, 0x27FB, 0x2720, 0x269F, 0x2533, 0x2933, 0x285C, + 0x2789, 0x2A68, 0x299F, 0x2933, 0x28C6, 0x27EC, 0x2711, 0x25B0, + 0x242C, 0x28C6, 0x27F2, 0x277A, 0x2A5A, 0x2990, 0x2925, 0x2853, + 0x277B, 0x2702, 0x25A1, 0x241C, 0x28BD, 0x27E3, 0x2A5A, 0x29F6, + 0x292A, 0x28BD, 0x284E, 0x276C, 0x2616, 0x2598, 0x2412, 0x284E, + 0x2AB8, 0x2A4C, 0x29E8, 0x297D, 0x28AE, 0x27D5, 0x26F9, 0x267F, + 0x2518, 0x2385, 0x21B8, 0x2AAA, 0x2A47, 0x2983, 0x2917, 0x2845, + 0x27D0, 0x26F0, 0x25FE, 0x2508, 0x2375, 0x27D6, 0x2A9C, 0x2A39, + 0x2509, 0x2909, 0x2837, 0x2AA6, 0x2A39, 0x29D5, 0x296A, 0x289B, + 0x27C7, 0x2750, 0x25FA, 0x2500, 0x28A1, 0x2B03, 0x2A98, 0x2A34, + 0x2970, 0x2904, 0x2832, 0x27B8, 0x26DD, 0x25F0, 0x24F0, 0x2363, + 0x2AF5, 0x2A93, 0x29D0, 0x296B, 0x28F6, 0x2888, 0x27B4, 0x26CE, + 0x25E1, 0x246E, 0x2353, 0x2AF0, 0x2A85, 0x2A22, 0x29B8, 0x28F1, + 0x281F, 0x2742, 0x265A, 0x2563, 0x24DC, 0x22C3, 0x27AF, 0x2A80, + 0x2A18, 0x2953, 0x28E3, 0x2811, 0x27A0, 0x26C0, 0x25CE, 0x24D3, + 0x22B3, 0x280C, 0x272F, 0x29B9, 0x294A, 0x28DE, 0x280C, 0x272F, + 0x264C, 0x2555, 0x2451, 0x2335, 0x279C, 0x26BC, 0x29AF, 0x2940, + 0x28D9, 0x2807, 0x2726, 0x26AD, 0x25C0, 0x24BF, 0x2867, 0x278D, + 0x271B, 0x2632, 0x293B, 0x2871, 0x27F9, 0x2788, 0x26A8, 0x2542, + 0x243D, 0x285E, 0x27EF, 0x26A8, 0x2629, 0x2532, 0x28C6, 0x27F4, + 0x2717, 0x2699, 0x25AC, 0x28D0, 0x2859, 0x2784, 0x2708, 0x2624, + 0x252D, 0x28BC, 0x27EF, 0x2775, 0x2695, 0x25A8, 0x28C1, 0x2854, + 0x277F, 0x2703, 0x2620, 0x251E, 0x241E, 0x27EB, 0x2771, 0x2690, + 0x2599, 0x2919, 0x284F, 0x27D7, 0x26FF, 0x2611, 0x2593, 0x241A, + 0x2304, 0x276C, 0x268C, 0x2984, 0x2915, 0x284B, 0x27D2, 0x26FA, + 0x267C, 0x258F, 0x2416, 0x2273, 0x27CD, 0x2687, 0x297F, 0x2910, + 0x2846, 0x27CE, 0x26F6, 0x2678, 0x258A, 0x2484, 0x2379, 0x21C0, + 0x26E7, 0x2975, 0x2906, 0x289F, 0x27C9, 0x274E, 0x2673, 0x257B, + 0x24FC, 0x2375, 0x2129, 0x2A37, 0x29CB, 0x290B, 0x289B, 0x2829, + 0x2754, 0x26D8, 0x25E9, 0x24F8, 0x236C, 0x2249, 0x2065, 0x29C6, + 0x2962, 0x2896, 0x2824, 0x274F, 0x26D3, 0x25E5, 0x2567, 0x23E8, + 0x22D1, 0x1FB7, 0x26CE, 0x295D, 0x28EE, 0x2824, 0x27B0, 0x26CF, + 0x2650, 0x2563, 0x2462, 0x22D3, 0x2740, 0x26CA, 0x2953, 0x28EE, + 0x287D, 0x27AC, 0x2731, 0x2656, 0x25D1, 0x24DA, 0x234D, 0x27A2, + 0x26C0, 0x2647, 0x28E9, 0x2878, 0x2807, 0x2737, 0x26BB, 0x25D2, + 0x24D5, 0x2874, 0x279D, 0x2723, 0x2647, 0x25C7, 0x28DA, 0x280C, + 0x2793, 0x26B6, 0x2638, 0x2545, 0x286A, 0x2801, 0x278E, 0x26AC, + 0x25C3, 0x28D5, 0x2865, 0x278E, 0x2719, 0x26A7, 0x25BE, 0x28CB, + 0x27FD, 0x2789, 0x26A7, 0x2629, 0x253C, 0x2865, 0x27F3, 0x277F, + 0x26A2, 0x293A, 0x28D0, 0x2860, 0x27EE, 0x2714, 0x2698, 0x25AF, + 0x24B8, 0x23AC, 0x228F, 0x2017, 0x2935, 0x28C6, 0x285B, 0x27E9, + 0x2776, 0x2693, 0x25AA, 0x2528, 0x2427, 0x228B, 0x2155, 0x268E, + 0x2927, 0x28B8, 0x284C, 0x2776, 0x2700, 0x2684, 0x259B, 0x24A4, + 0x239E, 0x2281, 0x26F6, 0x2616, 0x28BC, 0x284C, 0x27DA, 0x2767, + 0x268A, 0x260B, 0x251E, 0x2494, 0x2301, 0x2146, 0x2685, 0x2606, + 0x28AE, 0x283D, 0x27CB, 0x26F7, 0x267A, 0x2587, 0x248F, 0x2389, + 0x226C, 0x26EC, 0x2675, 0x250F, 0x283D, 0x27D0, 0x275D, 0x26E2, + 0x25F8, 0x250A, 0x2480, 0x2379, 0x2753, 0x26DD, 0x2588, 0x2505, + 0x2404, 0x27C1, 0x274E, 0x2667, 0x257D, 0x24FA, 0x23FF, 0x2758, + 0x26E3, 0x25F8, 0x2578, 0x24F5, 0x23F4, 0x274E, 0x26D8, 0x25EE, + 0x256D, 0x247C, 0x27BC, 0x2749, 0x26D4, 0x25E9, 0x2569, 0x2471, + 0x2360, 0x273F, 0x26C9, 0x25DF, 0x24F1, 0x246C, 0x27AD, 0x273A, + 0x265D, 0x256F, 0x24EC, 0x2461, 0x22D4, 0x26CF, 0x2658, 0x2564, + 0x24E1, 0x2815, 0x273A, 0x26C4, 0x264D, 0x255F, 0x24DC, 0x235D, + 0x22C4, 0x26C0, 0x2648, 0x2554, 0x2815, 0x27A8, 0x272B, 0x26B5, + 0x25D5, 0x2550, 0x2458, 0x234C, 0x2235, 0x2649, 0x25D0, 0x287B, + 0x2806, 0x2799, 0x2726, 0x26B0, 0x25C5, 0x254A, 0x244E, 0x233C, + 0x2224, 0x204B, 0x28DF, 0x286C, 0x2801, 0x278F, 0x26B6, 0x2639, + 0x25BC, 0x24CE, 0x23C7, 0x22B0, 0x2214, 0x2040, 0x28D1, 0x2867, + 0x27F6, 0x2720, 0x26A7, 0x262F, 0x25B1, 0x24BE, 0x23B8, 0x2327, + 0x20E5, 0x1EDC, 0x28C6, 0x285D, 0x2789, 0x2711, 0x269C, 0x2625, + 0x2536, 0x24AF, 0x23A8, 0x229B, 0x216B, 0x2620, 0x28C1, 0x27F1, + 0x277B, 0x270C, 0x2697, 0x2616, 0x252D, 0x24AA, 0x23A3, 0x228B, + 0x2692, 0x25A7, 0x28B7, 0x27EC, 0x2775, 0x2702, 0x2688, 0x2611, + 0x2522, 0x242B, 0x2399, 0x26FD, 0x2688, 0x25A2, 0x251D, 0x27E7, + 0x2770, 0x26F8, 0x2683, 0x259D, 0x2518, 0x2495, 0x2394, 0x26F8, + 0x2678, 0x2601, 0x2518, 0x27D8, 0x2766, 0x26EE, 0x267E, 0x2593, + 0x250D, 0x2490, 0x2761, 0x26ED, 0x2673, 0x25FC, 0x2513, 0x27CD, + 0x2761, 0x26E8, 0x2673, 0x258E, 0x2508, 0x27CD, 0x2757, 0x26E8, + 0x266E, 0x25F7, 0x2503, 0x27C8, 0x2756, 0x26E3, 0x266E, 0x25ED, + 0x2837, 0x27C8, 0x2751, 0x26E3, 0x2664, 0x25F2, 0x24FE, 0x27C7, + 0x2751, 0x26D9, 0x2669, 0x28A0, 0x2892, 0x27BE, 0x2751, 0x26D9, + 0x265F, 0x25E7, 0x256A, 0x2477, 0x23E7, 0x22E0, 0x2122, 0x25E3, + 0x24F9, 0x2472, 0x274C, 0x26D4, 0x265A, 0x25E2, 0x2565, 0x2472, + 0x23E2, 0x22D0, 0x21B1, 0x2078, 0x2564, 0x24DF, 0x27A9, 0x2732, + 0x2659, 0x25DD, 0x255A, 0x246D, 0x23DD, 0x22CB, 0x2237, 0x206E, + 0x1E5B, 0x2813, 0x279F, 0x272D, 0x26BF, 0x2645, 0x2555, 0x24DA, + 0x2452, 0x234B, 0x2239, 0x2102, 0x1F12, 0x2813, 0x27A3, 0x272D, + 0x26B4, 0x263A, 0x25C8, 0x24D5, 0x244D, 0x2346, 0x22B5, 0x20FD, + 0x1F0D, 0x1CAA, 0x2799, 0x2727, 0x26B4, 0x263F, 0x25BE, 0x2540, + 0x2448, 0x23C3, 0x22B1, 0x218D, 0x1FB7, 0x1E40, 0x24C0, 0x2789, + 0x2718, 0x2635, 0x25B9, 0x2540, 0x24C0, 0x23BE, 0x2331, 0x2213, + 0x2055, 0x1F99, 0x24B5, 0x2438, 0x2717, 0x269F, 0x2625, 0x25A9, + 0x24BB, 0x2433, 0x232C, 0x221A, 0x2177, 0x25A9, 0x252B, 0x2433, + 0x23A8, 0x269F, 0x2625, 0x25A9, 0x252B, 0x24AB, 0x23A9, 0x229C, + 0x21FD, 0x2615, 0x252B, 0x24AB, 0x2423, 0x269A, 0x2620, 0x25A4, + 0x2526, 0x24A0, 0x23A4, 0x2317, 0x21FF, 0x2610, 0x2526, 0x24A6, + 0x241E, 0x2317, 0x268A, 0x2610, 0x2594, 0x2516, 0x241E, 0x2393, + 0x2287, 0x2610, 0x2594, 0x2516, 0x2773, 0x2702, 0x268A, 0x2610, + 0x2594, 0x2516, 0x2496, 0x240E, 0x2306, 0x267A, 0x2600, 0x2584, + 0x2496, 0x2768, 0x26F2, 0x267A, 0x2600, 0x2584, 0x2506, 0x2414, + 0x2389, 0x22FC, 0x2600, 0x2589, 0x2506, 0x2486, 0x23FE, 0x26E7, + 0x266F, 0x2589, 0x250B, 0x2486, 0x2403, 0x2379, 0x2674, 0x25F0, + 0x2579, 0x24F6, 0x2403, 0x2379, 0x2674, 0x25FA, 0x2579, 0x24FB, + 0x2476, 0x23F3, 0x2674, 0x265F, 0x25EA, 0x256E, 0x247B, 0x23F3, + 0x2368, 0x2250, 0x25EA, 0x256E, 0x247B, 0x23F3, 0x236E, 0x2664, + 0x25EA, 0x2574, 0x24F6, 0x246B, 0x236F, 0x22E1, 0x21BE, 0x2574, + 0x24F6, 0x246B, 0x23E3, 0x26D1, 0x2659, 0x25DA, 0x255E, 0x24E6, + 0x2460, 0x235E, 0x22D1, 0x21B3, 0x2081, 0x24E6, 0x2466, 0x23DE, + 0x26C6, 0x25E4, 0x25D5, 0x2559, 0x2466, 0x23DE, 0x234E, 0x2241, + 0x2117, 0x2076, 0x24DB, 0x23E3, 0x26C6, 0x2653, 0x25D9, 0x25CA, + 0x24DB, 0x2456, 0x23CE, 0x2348, 0x2230, 0x219D, 0x1FC6, 0x1E6C, + 0x244B, 0x26C0, 0x2648, 0x25CF, 0x2553, 0x24D0, 0x244B, 0x23C8, + 0x22BB, 0x21A4, 0x2107, 0x1FC1, 0x1E5A, 0x2726, 0x26B5, 0x2639, + 0x25C4, 0x2548, 0x24C5, 0x2445, 0x2343, 0x22B1, 0x221A, 0x20F6, + 0x1FAF, 0x1D98, 0x19E1, 0x26AA, 0x2633, 0x25BE, 0x253E, 0x24C0, + 0x23C3, 0x23B2, 0x22A6, 0x218E, 0x2056, 0x1F07, 0x1D86, 0x23B3, + 0x26A5, 0x2628, 0x25B3, 0x2533, 0x24B5, 0x2430, 0x23AD, 0x22A0, + 0x220B, 0x20E0, 0x1F9F, 0x1E37, 0x23AD, 0x2322, 0x2622, 0x25AE, + 0x252D, 0x24AF, 0x2425, 0x23A2, 0x2290, 0x21FF, 0x20DA, 0x1EF0, + 0x242F, 0x23A8, 0x2318, 0x2621, 0x25A3, 0x2522, 0x24AA, 0x241F, + 0x239C, 0x228A, 0x21FA, 0x20C9, 0x1F89, 0x242A, 0x239D, 0x230D, + 0x2285, 0x259D, 0x2521, 0x249F, 0x241A, 0x2397, 0x2285, 0x21F5, + 0x20C4, 0x249F, 0x2424, 0x2397, 0x2307, 0x227A, 0x2592, 0x251C, + 0x2499, 0x240F, 0x238C, 0x2302, 0x21EF, 0x2150, 0x249E, 0x248E, + 0x2392, 0x2307, 0x2274, 0x2591, 0x2511, 0x248E, 0x2414, 0x2386, + 0x22F7, 0x21EA, 0x258C, 0x250B, 0x2489, 0x2391, 0x2381, 0x226F, + 0x21D9, 0x2510, 0x2501, 0x2409, 0x2381, 0x22FC, 0x2264, 0x2581, + 0x2500, 0x2488, 0x2403, 0x2376, 0x226A, 0x21D9, 0x257C, 0x24FB, + 0x240E, 0x23F8, 0x2370, 0x25FE, 0x2580, 0x2505, 0x2483, 0x23FE, + 0x2370, 0x2603, 0x25F4, 0x257B, 0x24FA, 0x2478, 0x23F2, 0x2365, + 0x2264, 0x21C8, 0x212F, 0x1FF7, 0x246D, 0x23E7, 0x22E6, 0x25EE, + 0x257A, 0x24F9, 0x2477, 0x23F2, 0x236B, 0x22DB, 0x2248, 0x212A, + 0x2087, 0x2471, 0x23EC, 0x235F, 0x22D5, 0x256F, 0x24F4, 0x2476, + 0x2466, 0x23E1, 0x235A, 0x224E, 0x21B2, 0x2119, 0x2466, 0x23E1, + 0x2365, 0x22D5, 0x2242, 0x255F, 0x24E4, 0x2461, 0x23DC, 0x234F, + 0x22C5, 0x21AD, 0x2113, 0x1FDB, 0x2456, 0x23D1, 0x22D0, 0x223D, + 0x21A7, 0x2553, 0x2460, 0x23DC, 0x2354, 0x22C4, 0x2232, 0x219B, + 0x2071, 0x2455, 0x23D0, 0x2349, 0x22BF, 0x222C, 0x2196, 0x206B, + 0x2455, 0x23CB, 0x2343, 0x22B3, 0x2220, 0x2102, 0x24CD, 0x244F, + 0x23CA, 0x2338, 0x222C, 0x2196, 0x20FD, 0x2059, 0x2444, 0x23BF, + 0x2338, 0x2226, 0x2190, 0x24CC, 0x244F, 0x23CA, 0x23BA, 0x2332, + 0x221B, 0x2185, 0x20EB, 0x1F13, 0x23BF, 0x2337, 0x22AD, 0x2215, + 0x2541, 0x24C6, 0x243E, 0x23B9, 0x2332, 0x22A8, 0x218B, 0x20F2, + 0x204E, 0x1F01, 0x23AE, 0x2327, 0x229D, 0x220A, 0x24C5, 0x24B5, + 0x2433, 0x23AE, 0x2321, 0x2297, 0x2204, 0x20E0, 0x203D, 0x1EEF, + 0x1D85, 0x2321, 0x2210, 0x253A, 0x24B9, 0x2432, 0x23B3, 0x232C, + 0x2316, 0x2204, 0x2174, 0x2044, 0x1F96, 0x1E3F, 0x1D7A, 0x2296, + 0x25A7, 0x252E, 0x24A9, 0x242C, 0x23A7, 0x231B, 0x2291, 0x21FE, + 0x2163, 0x20C3, 0x1F8A, 0x1ED7, 0x1CAF, 0x25AB, 0x2532, 0x2523, + 0x24A3, 0x2421, 0x23A1, 0x230F, 0x2285, 0x21ED, 0x2157, 0x202D, + 0x1F85, 0x1E27, 0x1C9C, 0x25A5, 0x252C, 0x251D, 0x2498, 0x241B, + 0x2391, 0x2309, 0x2274, 0x21E7, 0x2151, 0x2021, 0x1F73, 0x1E15, + 0x1C90, 0x2599, 0x2520, 0x24A1, 0x241F, 0x240F, 0x2385, 0x22FE, + 0x226F, 0x21DC, 0x20B8, 0x200F, 0x1F6D, 0x1E0F, 0x22F8, 0x226E, + 0x251A, 0x24A0, 0x248B, 0x2409, 0x237F, 0x22F8, 0x2263, 0x21D6, + 0x213A, 0x20A1, 0x1F5C, 0x237F, 0x22ED, 0x2263, 0x250F, 0x2494, + 0x2485, 0x23FE, 0x237E, 0x22EC, 0x225D, 0x21D0, 0x2135, 0x209B, + 0x23FD, 0x2373, 0x22EC, 0x225D, 0x250E, 0x2489, 0x240C, 0x23FC, + 0x2373, 0x22E6, 0x225C, 0x21C4, 0x2129, 0x208F, 0x23F1, 0x2372, + 0x22E6, 0x2257, 0x250C, 0x24F8, 0x2478, 0x23F1, 0x236D, 0x22E5, + 0x2256, 0x21BE, 0x2128, 0x2477, 0x23F0, 0x236C, 0x22DA, 0x2256, + 0x21BE, 0x2123, 0x2477, 0x23F0, 0x236C, 0x22E0, 0x224B, 0x21BE, + 0x2123, 0x2084, 0x1FDA, 0x1E92, 0x22DF, 0x224A, 0x21B8, 0x2122, + 0x246B, 0x23EF, 0x23DF, 0x2355, 0x22C9, 0x2239, 0x21A1, 0x2084, + 0x2072, 0x1F2D, 0x1DCE, 0x22C8, 0x2239, 0x21A7, 0x246A, 0x23E9, + 0x235F, 0x2354, 0x22C8, 0x2239, 0x21A7, 0x210B, 0x206C, 0x1F27, + 0x1E74, 0x1CFC, 0x2238, 0x21A6, 0x2469, 0x2459, 0x23D8, 0x234E, + 0x22C2, 0x22B7, 0x2227, 0x2195, 0x206C, 0x1FC3, 0x1F15, 0x1DB6, + 0x1C2A, 0x2227, 0x2467, 0x2458, 0x23D1, 0x234D, 0x22C1, 0x2232, + 0x2222, 0x2189, 0x2066, 0x1FBD, 0x1F0F, 0x1DB0, 0x1CEB, 0x1A60, + 0x24DB, 0x245B, 0x244C, 0x23CA, 0x2341, 0x22B5, 0x2226, 0x2194, + 0x20F3, 0x2054, 0x1FAB, 0x1E5D, 0x1D9D, 0x1C18, 0x1A4C, 0x245A, + 0x244B, 0x23C9, 0x2340, 0x2330, 0x22A4, 0x2215, 0x2182, 0x20E7, + 0x1FB1, 0x1F04, 0x1E51, 0x1CE0, 0x1B2F, 0x2182, 0x244E, 0x243F, + 0x23BD, 0x232F, 0x22A3, 0x2214, 0x2182, 0x20ED, 0x20D5, 0x1F9F, + 0x1EF1, 0x1D92, 0x1BFF, 0x2203, 0x2171, 0x243D, 0x23BC, 0x2333, + 0x2323, 0x229C, 0x220E, 0x2171, 0x20D5, 0x203C, 0x1F93, 0x1E3F, + 0x229C, 0x220D, 0x217B, 0x2164, 0x203C, 0x23B0, 0x232C, 0x231C, + 0x220D, 0x24C9, 0x24BA, 0x243B, 0x23B0, 0x232C, 0x231C, 0x2290, + 0x21FC, 0x216A, 0x20CF, 0x202A, 0x23A4, 0x231B, 0x228F, 0x2201, + 0x21F0, 0x243E, 0x242F, 0x23A4, 0x2320, 0x2310, 0x2284, 0x21F0, + 0x215E, 0x20BD, 0x201E, 0x239E, 0x230F, 0x2283, 0x21FA, 0x21E4, + 0x20C8, 0x2423, 0x239D, 0x2314, 0x228E, 0x227D, 0x21E4, 0x2151, + 0x20B7, 0x2018, 0x2313, 0x228D, 0x227D, 0x21EE, 0x2157, 0x20BC, + 0x2018, 0x2396, 0x230D, 0x2282, 0x2271, 0x21DD, 0x214B, 0x20AA, + 0x2011, 0x2312, 0x2302, 0x2271, 0x21E8, 0x214B, 0x20B6, 0x2011, + 0x1F6E, 0x2301, 0x227B, 0x21E7, 0x2156, 0x213F, 0x20A4, 0x2005, + 0x2306, 0x22F6, 0x226F, 0x21DC, 0x2145, 0x20A9, 0x2005, 0x1F62, + 0x1EB5, 0x226F, 0x21E0, 0x21D0, 0x2139, 0x2098, 0x1FFF, 0x2304, + 0x22F4, 0x2263, 0x21CF, 0x2143, 0x212D, 0x1FFF, 0x1F5C, 0x1EA8, + 0x1DEF, 0x225D, 0x21C9, 0x212C, 0x2097, 0x1FF2, 0x22FE, 0x22E8, + 0x2262, 0x21CE, 0x2137, 0x209D, 0x1FFE, 0x1FEC, 0x1F3D, 0x1DE9, + 0x1D30, 0x21C8, 0x212B, 0x2091, 0x1FEC, 0x2375, 0x22E7, 0x225C, + 0x21CD, 0x21BC, 0x2125, 0x2085, 0x1FE0, 0x1F37, 0x1E8F, 0x1D23, + 0x1C56, 0x212A, 0x2119, 0x207F, 0x236D, 0x22E5, 0x2255, 0x21C7, + 0x21B0, 0x2119, 0x2084, 0x1FE6, 0x1F37, 0x1E89, 0x1DD0, 0x1C51, + 0x1AAC, 0x208F, 0x207E, 0x236C, 0x22E4, 0x2253, 0x2243, 0x21AF, + 0x2118, 0x207E, 0x1FE5, 0x1FCD, 0x1F24, 0x1DD0, 0x1D0A, 0x1B7D, + 0x19A7, 0x2071, 0x236A, 0x22E2, 0x22D2, 0x2241, 0x21AE, 0x2117, + 0x207D, 0x206B, 0x1FC7, 0x1F1E, 0x1E6A, 0x1D04, 0x1C37, 0x1A8B, + 0x1760, 0x236D, 0x235D, 0x22D5, 0x2245, 0x2235, 0x21A7, 0x2110, + 0x2070, 0x205F, 0x1F1D, 0x1E70, 0x1DB7, 0x1CF1, 0x1B63, 0x198C, + 0x0FF8, 0x235C, 0x22D4, 0x2244, 0x2233, 0x21A6, 0x210F, 0x20F8, + 0x205E, 0x1FBF, 0x1F17, 0x1E5D, 0x1DA4, 0x1C2B, 0x1B4F, 0x1870, + 0x2058, 0x22D7, 0x22C7, 0x2237, 0x2227, 0x2199, 0x20F7, 0x205D, + 0x1FBF, 0x1FAD, 0x1F04, 0x1E50, 0x1CE4, 0x1C17, 0x197A, 0x205C, + 0x204B, 0x22CB, 0x22BB, 0x2230, 0x2198, 0x2101, 0x20F0, 0x2056, + 0x1FB2, 0x1F04, 0x1E56, 0x1D9D, 0x1CD1, 0x1B43, 0x20F0, 0x204A, + 0x1FAC, 0x22BE, 0x2234, 0x2224, 0x218B, 0x20F5, 0x20E4, 0x2049, + 0x2345, 0x22B3, 0x2228, 0x2218, 0x218A, 0x20EF, 0x2055, 0x203D, + 0x1F9F, 0x1EF1, 0x1E43, 0x1D84, 0x217F, 0x23DC, 0x2357, 0x2348, + 0x22C0, 0x22B1, 0x2221, 0x218E, 0x217E, 0x20E2, 0x2048, 0x2037, + 0x1F98, 0x1EE4, 0x1E36, 0x1D77, 0x1CB7, 0x20E1, 0x2355, 0x2346, + 0x22B4, 0x22A4, 0x221A, 0x2209, 0x2171, 0x20E0, 0x20CF, 0x202A, + 0x1F8B, 0x1EDD, 0x1E30, 0x1D70, 0x1BF1, 0x20D4, 0x203A, 0x2339, + 0x22B2, 0x22A2, 0x220D, 0x2180, 0x216F, 0x20D4, 0x2034, 0x1F97, + 0x1F85, 0x1ED7, 0x1E29, 0x1D6A, 0x1BEB, 0x20D3, 0x2034, 0x2022, + 0x1F7E, 0x229A, 0x220B, 0x2173, 0x2163, 0x20D2, 0x20C1, 0x2022, + 0x1F78, 0x1ED6, 0x1E1C, 0x1D5D, 0x1BE5, 0x20C6, 0x2032, 0x201B, + 0x1F77, 0x1EC9, 0x2209, 0x21F9, 0x2161, 0x20C5, 0x2032, 0x201A, + 0x1F77, 0x1EC9, 0x1E16, 0x1D63, 0x1C97, 0x20C5, 0x2026, 0x201A, + 0x1F76, 0x1EC8, 0x1E15, 0x21F1, 0x215F, 0x20C4, 0x20B3, 0x2014, + 0x1F76, 0x1F64, 0x1EB6, 0x1E02, 0x1C91, 0x20C3, 0x20B2, 0x2013, + 0x1F75, 0x1F63, 0x1EB5, 0x1E02, 0x2158, 0x20C2, 0x20B1, 0x2012, + 0x1F74, 0x1F63, 0x1EB5, 0x1E02, 0x1D42, 0x2146, 0x20B1, 0x2017, + 0x2006, 0x1F62, 0x1EB4, 0x1E01, 0x1D42, 0x2150, 0x20B5, 0x20A4, + 0x2005, 0x1F62, 0x1EB4, 0x1E01, 0x1DEE, 0x214A, 0x20B4, 0x20A3, + 0x2004, 0x1F61, 0x1EB3, 0x1EA1, 0x1DEE, 0x1D2E, 0x20B3, 0x20A3, + 0x2003, 0x1F60, 0x1F49, 0x1EA1, 0x1DEE, 0x2148, 0x20B3, 0x20A2, + 0x2003, 0x1F60, 0x1F48, 0x1EA0, 0x1DED, 0x1D2E, 0x1C68, 0x20A6, + 0x2095, 0x1FF6, 0x1F47, 0x1EA0, 0x1DED, 0x214B, 0x213B, 0x20A5, + 0x2095, 0x1FF6, 0x1F53, 0x1F41, 0x1DED, 0x1DDA, 0x1D1A, 0x1C54, + 0x2094, 0x1FF5, 0x1F52, 0x1F40, 0x1E92, 0x21D6, 0x213E, 0x212E, + 0x2098, 0x1FFA, 0x1FE8, 0x1F40, 0x1E92, 0x1DDF, 0x1DCC, 0x1C5B, + 0x1B88, 0x1FF9, 0x1FE8, 0x1F45, 0x1F33, 0x21DE, 0x21CD, 0x2137, + 0x209C, 0x208B, 0x1FEC, 0x1FDB, 0x1F32, 0x1E8B, 0x1DD8, 0x1DC5, + 0x1C4E, 0x1B73, 0x207F, 0x1FDA, 0x1F37, 0x21E1, 0x21D1, 0x213F, + 0x212F, 0x208F, 0x207E, 0x1FE5, 0x1F37, 0x1F25, 0x1E7D, 0x1DCB, + 0x1D0C, 0x1C47, 0x1B6C, 0x1FEA, 0x1FD8, 0x2267, 0x21DE, 0x21CE, + 0x2132, 0x2122, 0x208D, 0x207C, 0x1FD8, 0x1F35, 0x1F23, 0x1E70, + 0x1DC4, 0x1CFF, 0x1C33, 0x1B66, 0x1FDC, 0x2274, 0x2264, 0x21D6, + 0x1E69, 0x2130, 0x211F, 0x207F, 0x1FE7, 0x1FD6, 0x1F28, 0x1F16, + 0x1E6E, 0x1DB6, 0x2123, 0x208A, 0x2073, 0x1FDB, 0x1FC9, 0x1F21, + 0x1E6E, 0x1DC2, 0x1DAF, 0x2117, 0x207D, 0x206D, 0x1FCE, 0x1FBD, + 0x1F14, 0x1E67, 0x1DB5, 0x2121, 0x2082, 0x2071, 0x1FD9, 0x1FC7, + 0x1F1F, 0x1E6D, 0x1E5A, 0x1DA2, 0x1CE9, 0x2075, 0x2065, 0x1FCC, + 0x1FBB, 0x1F13, 0x1E60, 0x1DAE, 0x2119, 0x2085, 0x2074, 0x2063, + 0x1FC0, 0x1F18, 0x1F06, 0x1E59, 0x1DA1, 0x1CE3, 0x1C17, 0x2068, + 0x1FCA, 0x1FB9, 0x1F11, 0x1E5E, 0x1E4C, 0x1D94, 0x210B, 0x2072, + 0x2061, 0x1FBE, 0x1F16, 0x1F04, 0x1E58, 0x1DA0, 0x1D8D, 0x1CCE, + 0x1C02, 0x1B2F, 0x1FB1, 0x1F09, 0x1EF8, 0x1E4B, 0x1D92, 0x210E, + 0x2075, 0x2064, 0x1FC1, 0x1FB0, 0x1F08, 0x1EF6, 0x1E4A, 0x1D8C, + 0x1CCD, 0x1C02, 0x1B2F, 0x1A4B, 0x1FA3, 0x1F01, 0x1E4F, 0x1E3D, + 0x2111, 0x2101, 0x205C, 0x2057, 0x1FAE, 0x1F06, 0x1EF5, 0x1E48, + 0x1D90, 0x1D7E, 0x1CBF, 0x1BFB, 0x1B1A, 0x1A36, 0x1F05, 0x1EF4, + 0x1E3B, 0x2114, 0x2103, 0x206A, 0x205A, 0x1FB1, 0x1FA0, 0x1EF9, + 0x1EE7, 0x1E3A, 0x1D89, 0x1D70, 0x1BFA, 0x1BDF, 0x1B0B, 0x1948, + 0x183E, 0x1EE6, 0x1E2D, 0x2106, 0x20F6, 0x205D, 0x204C, 0x1FA9, + 0x1F98, 0x1EEB, 0x1E3F, 0x1E2C, 0x1D7B, 0x1CB7, 0x1BEC, 0x1BD8, + 0x1A2F, 0x193A, 0x1827, 0x1E38, 0x210E, 0x20FE, 0x20ED, 0x204F, + 0x1FAC, 0x1F9B, 0x1EFA, 0x1EE9, 0x1E37, 0x1E25, 0x1D6D, 0x1CA9, + 0x1BE5, 0x1BCA, 0x1A28, 0x192C, 0x1820, 0x219A, 0x2105, 0x20F5, + 0x2057, 0x2047, 0x1FAA, 0x1F99, 0x1EEC, 0x1EDB, 0x1E2F, 0x1E1D, + 0x1D5F, 0x1C9B, 0x1BD6, 0x1BC2, 0x1A1A, 0x1A04, 0x180A, 0x2192, + 0x2102, 0x20F2, 0x2055, 0x2044, 0x1FA1, 0x1F90, 0x1EEA, 0x1ED9, + 0x1E21, 0x1E0F, 0x1D5D, 0x1C99, 0x1BCF, 0x1BB4, 0x1A13, 0x19FD, + 0x1803, 0x1E20, 0x20FA, 0x20EA, 0x204C, 0x203B, 0x1F9F, 0x1F8E, + 0x1F7D, 0x1ED0, 0x1E1F, 0x1E0D, 0x1D56, 0x1C98, 0x1C85, 0x1BB3, + 0x1AD9, 0x19EE, 0x1ECF, 0x1E1E, 0x20FC, 0x20EC, 0x204F, 0x203E, + 0x202D, 0x1F86, 0x1F7A, 0x1ECE, 0x1E1D, 0x1E0B, 0x1D4E, 0x1D47, + 0x1C83, 0x1BB2, 0x1AD8, 0x1F73, 0x1ECD, 0x1EC1, 0x20F4, 0x20E3, + 0x20DE, 0x2040, 0x2030, 0x1F88, 0x1F77, 0x1ED1, 0x1EC0, 0x1E0E, + 0x1DFC, 0x1D3F, 0x1C82, 0x1BB1, 0x1B9D, 0x1F76, 0x1ED0, 0x1EBF, + 0x1E0D, 0x1DFB, 0x1D3E, 0x1C81, 0x1C6E, 0x1F8B, 0x1F7A, 0x1ED4, + 0x1EC3, 0x1E0D, 0x1DFA, 0x1D3D, 0x1C81, 0x202B, 0x1F8A, 0x1F79, + 0x1ED3, 0x1EC2, 0x1E11, 0x1DFF, 0x1D49, 0x1D36, 0x1C73, 0x1B9C, + 0x1AC2, 0x1F6C, 0x1EC6, 0x1EB5, 0x1DFE, 0x1D48, 0x1D2F, 0x1C72, + 0x2022, 0x1F7C, 0x1F6B, 0x1EC5, 0x1EB3, 0x1E03, 0x1DF1, 0x1D3A, + 0x1D28, 0x1C5E, 0x1B94, 0x1ABA, 0x19CA, 0x1EB8, 0x1E07, 0x1DF5, + 0x1D39, 0x1D27, 0x2025, 0x1F84, 0x1F73, 0x1F62, 0x1EBC, 0x1EAB, + 0x1DF4, 0x1D3E, 0x1D2C, 0x1C69, 0x1C56, 0x1B85, 0x1AAC, 0x19C2, + 0x18CD, 0x1DF9, 0x1DE7, 0x1D31, 0x1D1E, 0x201C, 0x1F81, 0x1F70, + 0x1F5F, 0x1EAE, 0x1E04, 0x1DF2, 0x1D30, 0x1D1D, 0x1C61, 0x1C4E, + 0x1B76, 0x1AA4, 0x19B3, 0x18BE, 0x1DF6, 0x1DE4, 0x1D22, 0x1D10, + 0x2018, 0x1F78, 0x1F67, 0x1EB7, 0x1EA5, 0x1DFB, 0x1DE9, 0x1DD7, + 0x1D1B, 0x1C52, 0x1C45, 0x1B75, 0x1A95, 0x19AC, 0x18B6, 0x179C, + 0x1DDC, 0x1D20, 0x2025, 0x2015, 0x1F6F, 0x1F5E, 0x1EB9, 0x1EA8, + 0x1E96, 0x1DE7, 0x1DD5, 0x1D12, 0x1C50, 0x1C3D, 0x1B73, 0x1B5F, + 0x1A7F, 0x1995, 0x1795, 0x165F, 0x1D1E, 0x2027, 0x2016, 0x1F71, + 0x1F60, 0x1EB6, 0x1EA5, 0x1E93, 0x1DDE, 0x1DCC, 0x1D10, 0x1D03, + 0x1C41, 0x1B72, 0x1B5E, 0x1A7E, 0x1995, 0x1898, 0x177D, 0x1DCA, + 0x2023, 0x2018, 0x1F73, 0x1F62, 0x1F52, 0x1EA8, 0x1E96, 0x1DE1, + 0x1DCF, 0x1D14, 0x1D01, 0x1C3F, 0x1C2C, 0x1B5C, 0x1A7D, 0x1994, + 0x197E, 0x1881, 0x1640, 0x2025, 0x2014, 0x1F70, 0x1F5F, 0x1F4E, + 0x1EA4, 0x1E93, 0x1DE4, 0x1DD2, 0x1DC0, 0x1D05, 0x1C43, 0x1C30, + 0x1B61, 0x1B4D, 0x1A67, 0x197E, 0x1881, 0x176E, 0x1D16, 0x201B, + 0x200B, 0x1F66, 0x1F5B, 0x1F4A, 0x1EA1, 0x1E8F, 0x1DD5, 0x1DC3, + 0x1D08, 0x1CF6, 0x1C34, 0x1C21, 0x1B52, 0x1B3E, 0x1A58, 0x196E, + 0x186A, 0x1DC2, 0x2022, 0x2012, 0x1F6E, 0x1F63, 0x1F52, 0x1E9D, + 0x1E8C, 0x1DDE, 0x1DCC, 0x1DBA, 0x1CFF, 0x1CF3, 0x1C25, 0x1C12, + 0x1B42, 0x1A64, 0x197C, 0x1966, 0x1DCA, 0x1DB8, 0x2019, 0x2008, + 0x1F6A, 0x1F59, 0x1F48, 0x1E9A, 0x1E8E, 0x1E7D, 0x1DC9, 0x1DB7, + 0x1CFC, 0x1CEA, 0x1C23, 0x1C10, 0x1B3A, 0x1A63, 0x1E8C, 0x1E7B, + 0x1DC1, 0x1DAF, 0x2014, 0x200A, 0x1F61, 0x1F50, 0x1F44, 0x1E96, + 0x1E85, 0x1DD1, 0x1DBF, 0x1DAE, 0x1CF3, 0x1CE1, 0x1C1A, 0x1C07, + 0x1B31, 0x1A53, 0x1A3F, 0x1DD5, 0x1DC3, 0x1DB2, 0x1CF2, 0x1CDF, + 0x1C19, 0x1C05, 0x1B30, 0x1E98, 0x1E87, 0x1E75, 0x1DC2, 0x1DB0, + 0x1CF0, 0x1CDE, 0x1C17, 0x1C04, 0x1B2F, 0x1A52, 0x1A43, 0x1DCC, + 0x1DBA, 0x1DA8, 0x1CEF, 0x1CE2, 0x1C1C, 0x1C09, 0x1B34, 0x1B20, + 0x1A43, 0x1E77, 0x1DBE, 0x1DAC, 0x1CF3, 0x1CE1, 0x1C1B, 0x1C08, + 0x1B33, 0x1B1F, 0x1A42, 0x1A2D, 0x1DBD, 0x1DAB, 0x1D9F, 0x1CD9, + 0x1CD3, 0x1C00, 0x1B32, 0x1B1E, 0x1A41, 0x1A2C, 0x1DC1, 0x1DAF, + 0x1CF0, 0x1CE4, 0x1CD1, 0x1C0B, 0x1BF8, 0x1B24, 0x1B10, 0x1A32, + 0x1DC5, 0x1DB3, 0x1DA1, 0x1CE8, 0x1CD6, 0x1C10, 0x1BFD, 0x1B23, + 0x1B0F, 0x1A31, 0x1A1C, 0x1DB7, 0x1DA5, 0x1CEC, 0x1CDA, 0x1CC8, + 0x1BFC, 0x1B28, 0x1B14, 0x1A37, 0x1E6D, 0x1DBB, 0x1DA9, 0x1D97, + 0x1CD9, 0x1CCC, 0x1C00, 0x1BED, 0x1B19, 0x1B05, 0x1A21, 0x193A, + 0x191D, 0x1D9B, 0x1CDD, 0x1CCB, 0x1C05, 0x1BF2, 0x1B25, 0x1B11, + 0x1A27, 0x1DC3, 0x1DB1, 0x1D9F, 0x1CE1, 0x1CD5, 0x1CC2, 0x1BF7, + 0x1BE4, 0x1B10, 0x1AFC, 0x1A1F, 0x192A, 0x1914, 0x1D98, 0x1CD9, + 0x1CC7, 0x1BFC, 0x1BE9, 0x1B15, 0x1B02, 0x1E76, 0x1DB9, 0x1DB3, + 0x1DA1, 0x1CDD, 0x1CCB, 0x1CBF, 0x1BF4, 0x1BE1, 0x1E90, 0x1E7F, + 0x1E6E, 0x1DB7, 0x1DA5, 0x1D93, 0x1CD6, 0x1F60, 0x1F50, 0x1F3F, + 0x1E94, 0x1E83, 0x1E72, 0x1DBB, 0x1DA9, 0x1D9D, 0x1CE0, 0x1CCD, + 0x1CBB, 0x1BF0, 0x1BDD, 0x1B0A, 0x1AF7, 0x1A13, 0x1DB2, 0x1DA1, + 0x1D95, 0x1CD2, 0x1CBF, 0x1F51, 0x1F45, 0x1E94, 0x1E83, 0x1E78, + 0x1E67, 0x1DB0, 0x1D9F, 0x1D8D, 0x1CD0, 0x1CBD, 0x1BF3, 0x1BE0, + 0x1B0E, 0x1AFA, 0x1AE6, 0x1A03, 0x1916, 0x1D9D, 0x1CDA, 0x1CC7, + 0x1CB5, 0x1BF1, 0x1F3B, 0x1E8A, 0x1E79, 0x1E6E, 0x1DB8, 0x1DA6, + 0x1D94, 0x1CCC, 0x1CC6, 0x1CB3, 0x1BE3, 0x1BD0, 0x1AFE, 0x1AEA, + 0x1A07, 0x19F3, 0x1905, 0x18F0, 0x1CCA, 0x1CB8, 0x1CB1, 0x1BE1, + 0x1E91, 0x1E80, 0x1E6F, 0x1DB9, 0x1DAD, 0x1D9C, 0x1CD4, 0x1CC8, + 0x1CBB, 0x1BEC, 0x1BD9, 0x1BC6, 0x1AF4, 0x1AE0, 0x19F7, 0x19E3, + 0x18F5, 0x18DF, 0x17D6, 0x1CB9, 0x1BEA, 0x1BD7, 0x1E8B, 0x1E7A, + 0x1E6F, 0x1DAE, 0x1DA3, 0x1D91, 0x1CD5, 0x1CC3, 0x1CB1, 0x1BE2, + 0x1BCF, 0x1B04, 0x1AF0, 0x1ADD, 0x19F4, 0x19E0, 0x18F3, 0x18DD, + 0x17CD, 0x16AC, 0x1565, 0x1BD3, 0x1E86, 0x1E7B, 0x1E6A, 0x1DB0, + 0x1D9E, 0x1D8D, 0x1CD1, 0x1CBF, 0x1CB3, 0x1BE4, 0x1BD1, 0x1BBE, + 0x1AE6, 0x1AD3, 0x19F8, 0x19E4, 0x18E9, 0x18D4, 0x17CB, 0x16AB, + 0x1693, 0x13FA, 0x1BC2, 0x1E7B, 0x1E6A, 0x1DB0, 0x1DA5, 0x1D93, + 0x1CD3, 0x1CC0, 0x1CAE, 0x1BE0, 0x1BD3, 0x1BC1, 0x1AE9, 0x1AD6, + 0x19EE, 0x19DA, 0x18E7, 0x18D1, 0x17C9, 0x17B3, 0x1692, 0x1554, + 0x13DF, 0x1E81, 0x1E70, 0x1DB7, 0x1DA5, 0x1D9A, 0x1CD4, 0x1CC8, + 0x1CB6, 0x1CA4, 0x1BDC, 0x1BC9, 0x1AF2, 0x1ADF, 0x1ACB, 0x19DD, + 0x19C9, 0x18D6, 0x18C0, 0x17B8, 0x1698, 0x1680, 0x153A, 0x1223, + 0x1ADD, 0x1DBD, 0x1DAC, 0x1D9A, 0x1D89, 0x1CC9, 0x1CBD, 0x1CAB, + 0x1BDD, 0x1BD1, 0x1BBE, 0x1AE2, 0x1AD4, 0x1AC1, 0x19DA, 0x19C6, + 0x18D3, 0x18BE, 0x17AF, 0x168F, 0x1677, 0x1528, 0x1AEC, 0x1AD9, + 0x1DB8, 0x1DA6, 0x1D95, 0x1CD6, 0x1CCA, 0x1CB8, 0x1CA6, 0x1BD9, + 0x1BC6, 0x1BB4, 0x1ADD, 0x1ACA, 0x1AB6, 0x19D0, 0x19BB, 0x18C9, + 0x18B3, 0x17A5, 0x167E, 0x1666, 0x151F, 0x1AE2, 0x1ACE, 0x1DB2, + 0x1DA6, 0x1D9B, 0x1CD7, 0x1CC5, 0x1CB3, 0x1CA1, 0x1BD4, 0x1BC2, + 0x1BAF, 0x1AE0, 0x1ACC, 0x1AB9, 0x19D3, 0x19BE, 0x18C6, 0x18B1, + 0x17A3, 0x1EAD, 0x1E9C, 0x1E8B, 0x1E80, 0x1DC3, 0x1DB2, 0x1DA7, + 0x1D9B, 0x1CD7, 0x1CCB, 0x1CB9, 0x1CA8, 0x1BDC, 0x1BC9, 0x1BB6, + 0x1ADB, 0x1ACF, 0x1ABB, 0x19CF, 0x19C2, 0x18CA, 0x18B5, 0x17A8, + 0x1791, 0x1663, 0x1E96, 0x1E85, 0x1DCF, 0x1DBD, 0x1DAC, 0x1DA1, + 0x1CDE, 0x1CCC, 0x1CBA, 0x1CAE, 0x1BDD, 0x1BD0, 0x1BBE, 0x1AE3, + 0x1AD0, 0x1AC3, 0x19D2, 0x19CB, 0x19B7, 0x18B8, 0x18A3, 0x1796, + 0x177F, 0x1651, 0x1BB5, 0x1AE1, 0x1DC8, 0x1DB7, 0x1DA6, 0x1D9B, + 0x1CD8, 0x1CC6, 0x1CB4, 0x1CA8, 0x1BD1, 0x1BC5, 0x1BB9, 0x1AD8, + 0x1AC5, 0x1AB8, 0x19D4, 0x19C0, 0x19AC, 0x18AE, 0x1898, 0x1784, + 0x177D, 0x164F, 0x1503, 0x1AD6, 0x1AC3, 0x1DB1, 0x1DAB, 0x1CE4, + 0x1CD2, 0x1CC0, 0x1CB5, 0x1BDF, 0x1BD8, 0x1BC6, 0x1BB3, 0x1ADA, + 0x1AC7, 0x1AB4, 0x19C9, 0x19B5, 0x19A1, 0x18B1, 0x189C, 0x1789, + 0x1772, 0x164D, 0x1635, 0x14E8, 0x1ACB, 0x1AB7, 0x19CE, 0x1CE4, + 0x1CD2, 0x1CC6, 0x1CB5, 0x1BE5, 0x1BD3, 0x1BC0, 0x1BB4, 0x1AD5, + 0x1AC2, 0x1ABB, 0x1AA8, 0x19BE, 0x19AA, 0x18AD, 0x189F, 0x188A, + 0x176F, 0x1643, 0x162B, 0x14E7, 0x1AC6, 0x1AB3, 0x1AAC, 0x19BC, + 0x19A8, 0x1CCC, 0x1CC0, 0x1CAE, 0x1BDF, 0x1BCD, 0x1BBA, 0x1ADD, + 0x1AD0, 0x1ABC, 0x1AB0, 0x19B9, 0x19AC, 0x18B0, 0x189B, 0x1886, + 0x177B, 0x1764, 0x1639, 0x1621, 0x14D4, 0x1AC0, 0x1AB4, 0x19BE, + 0x19B7, 0x19A3, 0x1CC5, 0x1CBA, 0x1BE0, 0x1BD4, 0x1BC7, 0x1BBB, + 0x1AD7, 0x1AC4, 0x1AB1, 0x19CF, 0x19BB, 0x19A7, 0x1993, 0x1897, + 0x1882, 0x1777, 0x1761, 0x162E, 0x1616, 0x1ACE, 0x1AC1, 0x1AAE, + 0x19C0, 0x19AC, 0x1997, 0x18A3, 0x1CB9, 0x1BE6, 0x1BD3, 0x1BC1, + 0x1BB5, 0x1AD2, 0x1ABF, 0x1AB8, 0x1AA5, 0x19B6, 0x19A2, 0x1995, + 0x1893, 0x187E, 0x176D, 0x1756, 0x162B, 0x1613, 0x1ACF, 0x1ABC, + 0x1AA9, 0x19C8, 0x19B4, 0x19A0, 0x189E, 0x1BF7, 0x1BE5, 0x1BD3, + 0x1BC7, 0x1AE5, 0x1AD9, 0x1AC6, 0x1AB2, 0x1AAC, 0x19B8, 0x19AA, + 0x1996, 0x1895, 0x1880, 0x1872, 0x175A, 0x1744, 0x1618, 0x1AD5, + 0x1AC9, 0x1AB6, 0x19C3, 0x19B5, 0x19A8, 0x1994, 0x188C, 0x1BF1, + 0x1BDF, 0x1BCD, 0x1BC1, 0x1ADF, 0x1AD2, 0x1ABF, 0x1AAC, 0x19C6, + 0x19B2, 0x199E, 0x189F, 0x188A, 0x187B, 0x1765, 0x174E, 0x1BBD, + 0x1ADC, 0x1ACF, 0x1AC3, 0x1AB0, 0x19BD, 0x19A9, 0x199C, 0x189C, + 0x1BF6, 0x1BF0, 0x1BDE, 0x1BD2, 0x1BC0, 0x1ADF, 0x1ACC, 0x1AB9, + 0x19D4, 0x19C0, 0x19AD, 0x1999, 0x1899, 0x1884, 0x186F, 0x1759, + 0x1752, 0x173B, 0x160A, 0x15F2, 0x1ABC, 0x19CB, 0x1CFA, 0x1CEE, + 0x1CE2, 0x1C0D, 0x1C01, 0x1BEF, 0x1BDD, 0x1BD1, 0x1AF2, 0x1ADF, + 0x1ACC, 0x1AB9, 0x1AB3, 0x19C1, 0x19B4, 0x19A0, 0x18A2, 0x188D, + 0x1878, 0x1863, 0x174D, 0x173E, 0x160E, 0x15F7, 0x149E, 0x1AB6, + 0x19C5, 0x19B1, 0x1CE6, 0x1C17, 0x1C06, 0x1BF4, 0x1BE8, 0x1BD6, + 0x1AF7, 0x1AE4, 0x1AD8, 0x1AC5, 0x1AB2, 0x19C8, 0x19B5, 0x19A8, + 0x1994, 0x1896, 0x1881, 0x186C, 0x1750, 0x1749, 0x1732, 0x15FB, + 0x15E3, 0x1493, 0x19CC, 0x19BE, 0x19B1, 0x199E, 0x189A, 0x1C04, + 0x1BF2, 0x1BE6, 0x1BD4, 0x1AF0, 0x1AEA, 0x1AD7, 0x1AC5, 0x19D6, + 0x19C2, 0x19AE, 0x19A1, 0x18A5, 0x1890, 0x187B, 0x1866, 0x1753, + 0x173D, 0x1726, 0x15EF, 0x15D8, 0x1490, 0x1476, 0x19B8, 0x19AB, + 0x1997, 0x1894, 0x1886, 0x1BFC, 0x1BEA, 0x1B08, 0x1AFC, 0x1AE9, + 0x1AD6, 0x1AC4, 0x19D5, 0x19C2, 0x19B5, 0x19A1, 0x189F, 0x188A, + 0x187D, 0x186E, 0x174E, 0x1738, 0x1730, 0x15F3, 0x15DC, 0x1485, + 0x146B, 0x19C5, 0x19B1, 0x19A4, 0x18A3, 0x188E, 0x1879, 0x186C, + 0x1B13, 0x1B01, 0x1AEE, 0x1AE2, 0x1ACF, 0x19E2, 0x19CF, 0x19BB, + 0x19AE, 0x199B, 0x1899, 0x1884, 0x1876, 0x1862, 0x1748, 0x1739, + 0x1723, 0x15E7, 0x15CF, 0x1481, 0x1468, 0x19BE, 0x19AB, 0x199E, + 0x1896, 0x1888, 0x1873, 0x1865, 0x1B12, 0x1AFF, 0x1AED, 0x1AE0, + 0x1ACE, 0x19E1, 0x19CE, 0x19C1, 0x19AE, 0x18A7, 0x1892, 0x1885, + 0x1870, 0x1862, 0x174A, 0x1734, 0x171E, 0x15EA, 0x15D3, 0x1475, + 0x19D1, 0x19BD, 0x19AA, 0x18AA, 0x1896, 0x1881, 0x1874, 0x1866, + 0x1740, 0x1B03, 0x1AF1, 0x1AE5, 0x19F4, 0x19E0, 0x19CD, 0x19C6, + 0x19B3, 0x19A6, 0x18A0, 0x188B, 0x187E, 0x1869, 0x174B, 0x173D, + 0x1727, 0x15E5, 0x15D6, 0x15BE, 0x19D6, 0x19C9, 0x19B6, 0x18B1, + 0x18A3, 0x188F, 0x187B, 0x186D, 0x174F, 0x1B13, 0x1B01, 0x1AEF, + 0x19FF, 0x19F2, 0x19DF, 0x19CC, 0x19BF, 0x19AC, 0x18AD, 0x1899, + 0x1885, 0x1877, 0x1754, 0x173E, 0x1730, 0x1721, 0x15E8, 0x19FB, + 0x19E8, 0x19D5, 0x19C8, 0x19B5, 0x18B7, 0x18A3, 0x188F, 0x1881, + 0x186D, 0x1B23, 0x1B17, 0x1B05, 0x1AF2, 0x19FD, 0x19F1, 0x19E4, + 0x19D7, 0x19C4, 0x19B0, 0x18AD, 0x1899, 0x188B, 0x1877, 0x175C, + 0x1746, 0x1730, 0x171B, 0x15E2, 0x15D3, 0x15BC, 0x1461, 0x1448, + 0x142E, 0x18B7, 0x1C43, 0x1B56, 0x1B50, 0x1B3E, 0x1B32, 0x1B20, + 0x1B0E, 0x1B02, 0x1A0E, 0x19FB, 0x19EF, 0x19DC, 0x19C8, 0x18C7, + 0x18B3, 0x18A5, 0x1891, 0x187D, 0x1763, 0x1755, 0x173F, 0x172A, + 0x171B, 0x15E4, 0x15CD, 0x15B6, 0x1454, 0x143B, 0x12A3, 0x1287, + 0x10AE, 0x1B5F, 0x1B53, 0x1B41, 0x1B2F, 0x1B23, 0x1B11, 0x1A19, + 0x1A12, 0x19FF, 0x19F3, 0x19E0, 0x19CC, 0x18C6, 0x18B1, 0x18A4, + 0x1890, 0x1889, 0x1875, 0x1755, 0x173F, 0x1731, 0x171B, 0x15DE, + 0x15C7, 0x15B0, 0x144F, 0x143F, 0x1425, 0x128D, 0x1271, 0x108D, + 0x0E03, 0x1B49, 0x1B37, 0x1B2B, 0x1A35, 0x1A29, 0x1A16, 0x1A0F, + 0x19FC, 0x19E9, 0x19DD, 0x18D8, 0x18C4, 0x18B0, 0x18A3, 0x188E, + 0x187A, 0x1763, 0x174D, 0x1738, 0x172A, 0x15E8, 0x15D0, 0x15B9, + 0x15B1, 0x144A, 0x1431, 0x1418, 0x1277, 0x10A1, 0x1081, 0x0DF8, + 0x175F, 0x1B3F, 0x1A4B, 0x1A38, 0x1A2C, 0x1A19, 0x1A13, 0x1A00, + 0x19ED, 0x18E3, 0x18D6, 0x18C2, 0x18AE, 0x18A1, 0x1893, 0x1770, + 0x1762, 0x174D, 0x1737, 0x1729, 0x15E8, 0x15D1, 0x15C2, 0x15AB, + 0x1445, 0x142C, 0x141B, 0x127D, 0x1260, 0x1080, 0x1054, 0x176C, + 0x1757, 0x1A54, 0x1A41, 0x1A3A, 0x1A28, 0x1A1C, 0x1A09, 0x19FC, + 0x18F4, 0x18E0, 0x18CD, 0x18C0, 0x18AC, 0x189F, 0x177D, 0x1768, + 0x175A, 0x1745, 0x172F, 0x15F8, 0x15E1, 0x15CA, 0x15BB, 0x1450, + 0x1437, 0x141E, 0x128B, 0x1278, 0x125C, 0x1069, 0x1779, 0x176B, + 0x1756, 0x1A5C, 0x1A49, 0x1A3D, 0x1A2A, 0x1A1E, 0x1A11, 0x1905, + 0x18F8, 0x18E4, 0x18D0, 0x18C3, 0x18B0, 0x1791, 0x1782, 0x1775, + 0x175F, 0x174A, 0x173C, 0x15F8, 0x15E1, 0x15D2, 0x15BB, 0x15A4, + 0x1441, 0x1428, 0x140F, 0x1274, 0x1258, 0x18AA, 0x1785, 0x1770, + 0x175B, 0x1A69, 0x1A57, 0x1A4B, 0x1A38, 0x1A2C, 0x1922, 0x190E, + 0x1901, 0x18EE, 0x18E7, 0x18D4, 0x18C7, 0x18B3, 0x1788, 0x1780, + 0x176B, 0x175E, 0x1748, 0x173B, 0x15F0, 0x15D9, 0x15CA, 0x15B4, + 0x15AC, 0x143A, 0x1422, 0x1411, 0x18CE, 0x18C1, 0x1797, 0x178A, + 0x1775, 0x1A7D, 0x1A71, 0x1A64, 0x1A58, 0x1A46, 0x1937, 0x192B, + 0x1917, 0x190A, 0x18F7, 0x18F0, 0x18DD, 0x18D0, 0x17A7, 0x179A, + 0x1785, 0x1777, 0x1762, 0x174D, 0x160D, 0x15FE, 0x15E8, 0x15D1, + 0x15C2, 0x1454, 0x190B, 0x18FF, 0x18EB, 0x18DE, 0x17B7, 0x17A9, + 0x1795, 0x1787, 0x1772, 0x175D, 0x1756, 0x1610, 0x15FA, 0x194D, + 0x1939, 0x1933, 0x1920, 0x1913, 0x18FF, 0x18F3, 0x18DF, 0x17C0, + 0x17AB, 0x179D, 0x1789, 0x177B, 0x1766, 0x1751, 0x160C, 0x15FD, + 0x15E7, 0x15DF, 0x15C8, 0x145D, 0x1445, 0x142C, 0x18FA, 0x18ED, + 0x17C1, 0x17B4, 0x179F, 0x1792, 0x177D, 0x176F, 0x175A, 0x1616, + 0x1600, 0x15F1, 0x15DA, 0x1941, 0x192E, 0x1921, 0x190E, 0x1901, + 0x17DE, 0x17CA, 0x17B5, 0x17A8, 0x1793, 0x178C, 0x1777, 0x176A, + 0x1620, 0x160A, 0x15FB, 0x15E5, 0x15DD, 0x15C7, 0x1455, 0x143D, + 0x1424, 0x1414, 0x1267, 0x17C4, 0x17B7, 0x17A2, 0x1795, 0x1787, + 0x1779, 0x1631, 0x161B, 0x160C, 0x15F6, 0x15E0, 0x194E, 0x193B, + 0x192F, 0x191C, 0x17F5, 0x17E7, 0x17D3, 0x17BF, 0x17B8, 0x17AA, + 0x1796, 0x1781, 0x1774, 0x162C, 0x1616, 0x1607, 0x15F1, 0x15E2, + 0x15CC, 0x145D, 0x144D, 0x1434, 0x141C, 0x140C, 0x1258, 0x17C7, + 0x17B2, 0x17AB, 0x1797, 0x1789, 0x163D, 0x1627, 0x1618, 0x1602, + 0x15FB, 0x15E4, 0x1955, 0x1948, 0x1935, 0x180A, 0x17FD, 0x17E9, + 0x17E2, 0x17D5, 0x17C1, 0x17AC, 0x179F, 0x178A, 0x1646, 0x1630, + 0x1622, 0x160C, 0x15F6, 0x15EE, 0x15D8, 0x145C, 0x144C, 0x143C, + 0x142C, 0x1413, 0x1263, 0x1247, 0x17CF, 0x17BB, 0x17AD, 0x1799, + 0x1648, 0x1640, 0x162B, 0x161C, 0x1606, 0x197A, 0x1967, 0x1961, + 0x1833, 0x1826, 0x1812, 0x1805, 0x17F7, 0x17EA, 0x17D6, 0x17C9, + 0x17B5, 0x166D, 0x1658, 0x164A, 0x163B, 0x162C, 0x1616, 0x1601, + 0x15F2, 0x147A, 0x146A, 0x1452, 0x1443, 0x142A, 0x1412, 0x1264, + 0x1252, 0x17DD, 0x17C9, 0x17B5, 0x166E, 0x1660, 0x164B, 0x1635, + 0x1627, 0x199D, 0x1991, 0x1867, 0x185B, 0x1847, 0x183A, 0x1826, + 0x181F, 0x180C, 0x17FF, 0x17EB, 0x17DD, 0x17C9, 0x1685, 0x1677, + 0x1661, 0x164C, 0x163E, 0x1628, 0x161A, 0x160B, 0x15FC, 0x1480, + 0x1470, 0x1458, 0x1448, 0x1430, 0x1418, 0x1805, 0x17F8, 0x17E4, + 0x169B, 0x1686, 0x1678, 0x1663, 0x165B, 0x19D2, 0x19C0, 0x189A, + 0x188E, 0x187A, 0x1874, 0x1860, 0x1853, 0x1840, 0x1833, 0x181F, + 0x1818, 0x1805, 0x17F8, 0x16AA, 0x1695, 0x1687, 0x1678, 0x166A, + 0x1655, 0x18BA, 0x18AD, 0x189A, 0x188D, 0x1880, 0x1873, 0x1860, + 0x1853, 0x183F, 0x1838, 0x182C, 0x1818, 0x180B, 0x16B8, 0x16AA, + 0x1695, 0x1687, 0x1672, 0x166B, 0x165D, 0x1647, 0x1632, 0x1624, + 0x14AD, 0x1496, 0x1487, 0x146F, 0x1460, 0x1448, 0x1430, 0x1283, + 0x1268, 0x1257, 0x123C, 0x122A, 0x1013, 0x0FF4, 0x1681, 0x166B, + 0x165D, 0x1648, 0x163A, 0x18B1, 0x189E, 0x1891, 0x187E, 0x1877, + 0x186B, 0x1857, 0x184A, 0x1837, 0x16E9, 0x16DB, 0x16C7, 0x16C0, + 0x16AB, 0x169D, 0x1688, 0x167A, 0x1665, 0x1657, 0x164F, 0x14C8, + 0x14B9, 0x14A1, 0x1492, 0x147B, 0x1473, 0x145B, 0x144C, 0x128A, + 0x1279, 0x125E, 0x124D, 0x1232, 0x1016, 0x1001, 0x0FE2, 0x168F, + 0x167A, 0x166C, 0x1657, 0x14D9, 0x14C9, 0x14B2, 0x18A1, 0x189B, + 0x188E, 0x187B, 0x172C, 0x171F, 0x170B, 0x16FD, 0x16F6, 0x16E1, + 0x16D4, 0x16BF, 0x16B1, 0x169C, 0x168F, 0x1680, 0x1672, 0x14F0, + 0x14E1, 0x14CA, 0x14C3, 0x14AC, 0x149C, 0x1485, 0x1476, 0x145E, + 0x12A2, 0x1288, 0x1277, 0x125C, 0x124B, 0x1239, 0x1018, 0x0FF9, + 0x0FEF, 0x169C, 0x168E, 0x150F, 0x1500, 0x14E9, 0x14DA, 0x14C4, + 0x14B4, 0x1774, 0x1767, 0x1753, 0x1745, 0x1738, 0x1724, 0x171D, + 0x1708, 0x16FB, 0x16E6, 0x16D9, 0x16D2, 0x16BD, 0x16B0, 0x169B, + 0x151F, 0x1508, 0x14F9, 0x14EA, 0x14DB, 0x14C4, 0x14B5, 0x149E, + 0x148F, 0x1478, 0x12B8, 0x12A7, 0x128D, 0x127C, 0x126B, 0x1259, + 0x123F, 0x1019, 0x0FFB, 0x16C3, 0x1544, 0x152D, 0x1526, 0x1517, + 0x1501, 0x14F2, 0x14DB, 0x17A6, 0x1792, 0x1785, 0x1777, 0x176A, + 0x1756, 0x1749, 0x173C, 0x172E, 0x1721, 0x170C, 0x16FF, 0x16EA, + 0x16DD, 0x16D6, 0x154B, 0x1543, 0x152D, 0x151E, 0x1510, 0x14F9, + 0x14EA, 0x14D4, 0x14CC, 0x14B5, 0x14A6, 0x12DE, 0x12C5, 0x12B4, + 0x12AB, 0x1292, 0x1281, 0x1267, 0x1711, 0x1704, 0x1585, 0x156F, + 0x1560, 0x1551, 0x1543, 0x1534, 0x151E, 0x150F, 0x17DC, 0x17C8, + 0x17BB, 0x17B4, 0x17A1, 0x1794, 0x1780, 0x1773, 0x176C, 0x1758, + 0x174B, 0x1737, 0x172A, 0x1723, 0x1599, 0x158B, 0x1575, 0x156D, + 0x155F, 0x1549, 0x153B, 0x1524, 0x1516, 0x150E, 0x14F8, 0x14E9, + 0x14D3, 0x1313, 0x12FA, 0x12E9, 0x12D0, 0x12C0, 0x1769, 0x175C, + 0x174F, 0x15D1, 0x15BB, 0x15AD, 0x1598, 0x1589, 0x1582, 0x156C, + 0x155E, 0x1548, 0x1539, 0x1523, 0x151C, 0x150D, 0x14F7, 0x14E8, + 0x131C, 0x130B, 0x12F2, 0x12EA, 0x12D9, 0x12C0, 0x1773, 0x15F9, + 0x15E4, 0x15D6, 0x15C1, 0x15B3, 0x15AB, 0x1596, 0x1588, 0x1572, + 0x1564, 0x154E, 0x1546, 0x1538, 0x1522, 0x1513, 0x14FD, 0x1335, + 0x132C, 0x1314, 0x1303, 0x12EB, 0x12DA, 0x12C1, 0x12B0, 0x1605, + 0x15F0, 0x15E2, 0x15D4, 0x15C6, 0x15B8, 0x15A2, 0x1594, 0x1586, + 0x1577, 0x1569, 0x1553, 0x1545, 0x1536, 0x1520, 0x135D, 0x134D, + 0x1335, 0x1324, 0x130C, 0x12FC, 0x12F3, 0x12DA, 0x12CA, 0x12B1, + 0x160A, 0x15FB, 0x15ED, 0x15E0, 0x15CA, 0x15BC, 0x15B5, 0x15A0, + 0x1591, 0x157C, 0x156E, 0x1566, 0x1551, 0x1384, 0x1375, 0x1364, + 0x1354, 0x1344, 0x132C, 0x131C, 0x1303, 0x12F3, 0x12DA, 0x12D2, + 0x12C1, 0x12A8, 0x1614, 0x15FF, 0x15F1, 0x15DC, 0x15CE, 0x15C7, + 0x15B2, 0x15A4, 0x1596, 0x1580, 0x1579, 0x13AB, 0x139B, 0x1383, + 0x1374, 0x1363, 0x1353, 0x1344, 0x132B, 0x131B, 0x1303, 0x12F3, + 0x12EA, 0x12D1, 0x1633, 0x162C, 0x161F, 0x160A, 0x15FC, 0x15F5, + 0x15E0, 0x15D2, 0x15BD, 0x15AF, 0x15A8, 0x13D8, 0x13C9, 0x13B1, + 0x13A2, 0x139A, 0x1382, 0x1372, 0x135A, 0x134A, 0x1332, 0x132A, + 0x131A, 0x1302, 0x12F1, 0x12D9, 0x10A8, 0x163D, 0x1636, 0x1621, + 0x1614, 0x1606, 0x15F8, 0x15EA, 0x15DC, 0x140C, 0x1404, 0x13F5, + 0x13DE, 0x13CE, 0x13B7, 0x13A7, 0x139F, 0x1388, 0x1378, 0x1360, + 0x1351, 0x1339, 0x1329, 0x1320, 0x1691, 0x167C, 0x166F, 0x1668, + 0x1654, 0x1646, 0x1631, 0x162A, 0x161D, 0x1455, 0x143E, 0x142F, + 0x1420, 0x1411, 0x1402, 0x13EA, 0x13DB, 0x13D3, 0x13BC, 0x13AD, + 0x1395, 0x1386, 0x1376, 0x1366, 0x1356, 0x133E, 0x132E, 0x131F, + 0x10D8, 0x168B, 0x1685, 0x1670, 0x1663, 0x149C, 0x1494, 0x147E, + 0x146F, 0x1459, 0x144A, 0x1442, 0x142C, 0x141D, 0x140E, 0x13F7, + 0x13E7, 0x13E0, 0x13C8, 0x13B9, 0x13A2, 0x1392, 0x138A, 0x16FD, + 0x16F0, 0x16DC, 0x16D5, 0x16C8, 0x16B4, 0x14EF, 0x14E1, 0x14DA, + 0x14C4, 0x14B5, 0x14A7, 0x1490, 0x1489, 0x147A, 0x1464, 0x1455, + 0x1446, 0x1437, 0x1428, 0x1419, 0x1402, 0x13F3, 0x13EB, 0x13D4, + 0x13C5, 0x13AE, 0x139E, 0x1396, 0x1717, 0x1556, 0x1548, 0x1532, + 0x1524, 0x151D, 0x1507, 0x14F9, 0x14EB, 0x14E3, 0x14CD, 0x14BF, + 0x14A9, 0x149A, 0x1493, 0x147D, 0x146E, 0x145F, 0x1450, 0x1441, + 0x1432, 0x141C, 0x140D, 0x1405, 0x13EE, 0x13DF, 0x13D0, 0x13B9, + 0x13B1, 0x1177, 0x115D, 0x114B, 0x1131, 0x111F, 0x110D, 0x10F2, + 0x10E9, 0x10CD, 0x10BB, 0x10A9, 0x108D, 0x107B, 0x105E, 0x104C, + 0x1042, 0x1495, 0x1486, 0x1478, 0x1468, 0x145A, 0x144B, 0x1435, + 0x142D, 0x141E, 0x1408, 0x13F9, 0x13EA, 0x11B2, 0x1198, 0x1186, + 0x116C, 0x158F, 0x1582, 0x156D, 0x155F, 0x1557, 0x1542, 0x1534, + 0x1526, 0x151F, 0x1509, 0x14FB, 0x14ED, 0x14DE, 0x14D0, 0x14C2, + 0x14AC, 0x14A4, 0x1496, 0x1480, 0x1471, 0x146A, 0x1454, 0x1445, + 0x1436, 0x11FB, 0x11E1, 0x11D1, 0x11C8, 0x11AE, 0x119D, 0x118C, + 0x1172, 0x1161, 0x1158, 0x113D, 0x112C, 0x111A, 0x10FF, 0x10EE, + 0x10DB, 0x10C9, 0x10B7, 0x109C, 0x108A, 0x0D69, 0x0D46, 0x0D3A, + 0x0D16, 0x14C2, 0x14B3, 0x14A5, 0x1496, 0x125A, 0x124A, 0x1239, + 0x1220, 0x1210, 0x1207, 0x11EE, 0x11DD, 0x11CD, 0x11B3, 0x11AA, + 0x15E0, 0x15D2, 0x15C4, 0x15B7, 0x15A9, 0x15A2, 0x158D, 0x1580, + 0x1572, 0x1564, 0x1556, 0x1548, 0x1541, 0x152C, 0x151E, 0x1516, + 0x1501, 0x12CE, 0x12BE, 0x12A6, 0x1296, 0x128E, 0x1275, 0x1265, + 0x1255, 0x123C, 0x1234, 0x1223, 0x120A, 0x11FA, 0x11E9, 0x11D8, + 0x11C7, 0x11B7, 0x119D, 0x118C, 0x1183, 0x1169, 0x1158, 0x1147, + 0x112D, 0x111B, 0x1112, 0x10F8, 0x10E6, 0x0DC7, 0x0DA5, 0x0D8F, + 0x0D6C, 0x1316, 0x12FE, 0x12EF, 0x12DF, 0x12C7, 0x12BF, 0x12AF, + 0x1297, 0x1287, 0x127F, 0x126F, 0x1257, 0x1246, 0x1236, 0x1680, + 0x1679, 0x1666, 0x1659, 0x1652, 0x142E, 0x141F, 0x1410, 0x1401, + 0x13F3, 0x13E4, 0x13D4, 0x13C6, 0x13B7, 0x13A8, 0x1398, 0x1389, + 0x137A, 0x1363, 0x135B, 0x134C, 0x133D, 0x132D, 0x131D, 0x130E, + 0x12F7, 0x12EF, 0x12DF, 0x12CF, 0x12B7, 0x12AF, 0x12A0, 0x1287, + 0x1278, 0x1268, 0x125F, 0x1247, 0x1237, 0x1227, 0x1216, 0x1205, + 0x11F5, 0x11DC, 0x11D3, 0x11C3, 0x11AA, 0x1199, 0x1188, 0x117F, + 0x0E52, 0x13E1, 0x13CB, 0x13C3, 0x13B4, 0x139E, 0x138F, 0x1387, + 0x1378, 0x1361, 0x1359, 0x134A, 0x133B, 0x1324, 0x156D, 0x1558, + 0x1551, 0x1544, 0x1536, 0x1528, 0x151A, 0x150C, 0x1505, 0x14F0, + 0x14E2, 0x14DB, 0x14CD, 0x14B7, 0x14B0, 0x14A2, 0x1494, 0x1485, + 0x11F5, 0x11EC, 0x0EC0, 0x0EAB, 0x0E97, 0x0E78, 0x0E63, 0x0E59, + 0x0E39, 0x0E24, 0x0E0F, 0x0DEE, 0x0DD9, 0x0DC3, 0x0DA2, 0x0D97, + 0x0D81, 0x0D5F, 0x0D48, 0x0D26, 0x0D0F, 0x0CF8, 0x1338, 0x1329, + 0x1321, 0x1311, 0x12FA, 0x12F2, 0x12E3, 0x12D3, 0x12BC, 0x152F, + 0x1521, 0x150C, 0x1505, 0x14F7, 0x14F0, 0x14DB, 0x14CD, 0x14C6, + 0x14B8, 0x14A3, 0x149C, 0x148D, 0x147F, 0x1471, 0x1462, 0x145B, + 0x144D, 0x1437, 0x1430, 0x1421, 0x1413, 0x1404, 0x13F5, 0x13E7, + 0x13DF, 0x13C9, 0x13BA, 0x13B3, 0x13A4, 0x138E, 0x1386, 0x1377, + 0x1368, 0x1360, 0x134A, 0x133B, 0x1333, 0x1029, 0x100E, 0x1004, + 0x0FF2, 0x0FE0, 0x0FC4, 0x0FB1, 0x0FA7, 0x0F8B, 0x0F78, 0x0F65, + 0x0F52, 0x0F3E, 0x0F2B, 0x0F17, 0x0EFA, 0x0EE6, 0x0EDC, 0x0EC8, + 0x0EAA, 0x0E96, 0x0E82, 0x0E63, 0x0E58, 0x0E44, 0x0E24, 0x0E0F, + 0x0DFA, 0x0DDA, 0x0DC5, 0x0DBA, 0x0DA4, 0x0D83, 0x0D6D, 0x0D4C, + 0x0D36, 0x0691, 0x065D, 0x10C0, 0x10AE, 0x10A5, 0x108B, 0x1079, + 0x1067, 0x1055, 0x1043, 0x134A, 0x133B, 0x132C, 0x1324, 0x1315, + 0x12FE, 0x12F6, 0x12E7, 0x12D8, 0x12D0, 0x12B8, 0x12A9, 0x12A1, + 0x1291, 0x127A, 0x1272, 0x1262, 0x1252, 0x1242, 0x1232, 0x1222, + 0x121A, 0x1202, 0x11F2, 0x11EA, 0x11D9, 0x11C9, 0x11B8, 0x11A8, + 0x1198, 0x118F, 0x1176, 0x1166, 0x1155, 0x114D, 0x1133, 0x1122, + 0x111A, 0x1109, 0x10EF, 0x10DE, 0x10D5, 0x10C4, 0x10AA, 0x10A1, + 0x1090, 0x107E, 0x1063, 0x105A, 0x1049, 0x1037, 0x1025, 0x1013, + 0x1001, 0x0FEF, 0x0FE5, 0x0FCA, 0x0FB7, 0x0FA5, 0x0F9B, 0x0F7F, + 0x0F6C, 0x0F5A, 0x0F47, 0x0F33, 0x0F20, 0x0F0D, 0x0EFA, 0x0EE6, + 0x0ED2, 0x0EBF, 0x0EAB, 0x0E8D, 0x0E83, 0x0E6F, 0x0E50, 0x0E3C, + 0x0E27, 0x11E9, 0x11E1, 0x11D1, 0x11C1, 0x11B0, 0x11A0, 0x1190, + 0x14AB, 0x149D, 0x148F, 0x1488, 0x147A, 0x1472, 0x145D, 0x1456, + 0x1448, 0x1441, 0x1433, 0x1424, 0x1416, 0x140E, 0x1400, 0x13F9, + 0x13E3, 0x13DC, 0x13CD, 0x13C6, 0x13B8, 0x13A9, 0x139A, 0x1393, + 0x1384, 0x137C, 0x1366, 0x135F, 0x1350, 0x1341, 0x133A, 0x1323, + 0x131B, 0x130C, 0x1305, 0x12F6, 0x12EE, 0x12D7, 0x12CF, 0x12C0, + 0x12B1, 0x12A9, 0x1292, 0x128A, 0x127B, 0x1273, 0x1263, 0x124C, + 0x1244, 0x1234, 0x122C, 0x121C, 0x120C, 0x11FC, 0x11ED, 0x11E4, + 0x05E0, 0x11C4, 0x11B4, 0x11A4, 0x119C, 0x14F1, 0x14EA, 0x14DC, + 0x14D5, 0x14C7, 0x14B9, 0x14B2, 0x14A4, 0x149D, 0x1490, 0x1481, + 0x1474, 0x146C, 0x1465, 0x1457, 0x1450, 0x143B, 0x1434, 0x1426, + 0x141E, 0x1417, 0x1409, 0x13FA, 0x13EC, 0x13E5, 0x13D7, 0x13CF, + 0x13C8, 0x13B2, 0x13AB, 0x139C, 0x1395, 0x1387, 0x1378, 0x1369, + 0x1361, 0x135A, 0x134B, 0x1344, 0x132D, 0x1326, 0x1317, 0x130F, + 0x1301, 0x12F9, 0x12E2, 0x12DB, 0x12CC, 0x12C4, 0x12B5, 0x12AD, + 0x1296, 0x128E, 0x127F, 0x1277, 0x1268, 0x1258, 0x1249, 0x1241, + 0x1231, 0x1229, 0x121A, 0x0D4C, 0x0D36, 0x0D2B, 0x0D0A, 0x0CF4, + 0x0CDE, 0x0CD3, 0x0CB1, 0x0C9B, 0x0C84, 0x0C6D, 0x0C61, 0x0C3E, + 0x0C27, 0x0C0F, 0x0C03, 0x0BDF, 0x0BC6, 0x0BAE, 0x0B95, 0x0B70, + 0x0B63, 0x0B4A, 0x0B30, 0x0B16, 0x0AEF, 0x0AD4, 0x0AC7, 0x0AAC, + 0x0A83, 0x0A67, 0x0A4C, 0x0A21, 0x0A04, 0x09F6, 0x09D8, 0x09AC, + 0x098D, 0x096F, 0x0950, 0x0920, 0x0900, 0x08E0, 0x08CF, 0x089C, + 0x087A, 0x0857, 0x0822, 0x07FD, 0x07D8, 0x079F, 0x0777, 0x074F, + 0x0711, 0x06E6, 0x06A3, 0x0675, 0x065D, 0x0614, 0x05E1, 0x0590, + 0x0558, 0x0E55, 0x0E41, 0x0E2D, 0x131F, 0x1318, 0x1301, 0x12FA, + 0x12F2, 0x12E3, 0x12DC, 0x12D4, 0x12BD, 0x12B6, 0x12A7, 0x129F, + 0x1297, 0x1288, 0x1280, 0x1271, 0x1262, 0x125A, 0x1252, 0x1243, + 0x123B, 0x1233, 0x121C, 0x1214, 0x1204, 0x11FC, 0x11F4, 0x11E5, + 0x11DD, 0x11CD, 0x11BD, 0x11B5, 0x11A5, 0x119D, 0x1195, 0x117D, + 0x1174, 0x1164, 0x115C, 0x1154, 0x1144, 0x113B, 0x1123, 0x111B, + 0x1112, 0x1102, 0x10F9, 0x10E9, 0x10E0, 0x10CF, 0x10BF, 0x10B6, + 0x10A6, 0x109D, 0x108C, 0x1084, 0x1072, 0x1061, 0x1058, 0x1047, + 0x103F, 0x102E, 0x1025, 0x100B, 0x1002, 0x0FF9, 0x0FE7, 0x0FDE, + 0x0FCD, 0x0FC4, 0x0FA9, 0x0FA0, 0x0F8E, 0x0F85, 0x0F73, 0x0F6A, + 0x0F58, 0x0F45, 0x0F33, 0x0F29, 0x0F17, 0x0F0D, 0x0EFB, 0x0EF1, + 0x0ED5, 0x0ECC, 0x0EB9, 0x0EAF, 0x0E9C, 0x0E92, 0x0E7F, 0x0E6C, + 0x0E58, 0x0E4F, 0x0E3B, 0x0E31, 0x0E1D, 0x0E13, 0x0DF5, 0x0DEB, + 0x0DD7, 0x0DC3, 0x0DB9, 0x0DA5, 0x0D9A, 0x0D7B, 0x0D71, 0x0D5C, + 0x0D47, 0x0D3D, 0x0D28, 0x0D1D, 0x0CFD, 0x0CF2, 0x0CDC, 0x0CC7, + 0x0CBB, 0x0CA6, 0x0C84, 0x0C79, 0x0C63, 0x0C57, 0x0C41, 0x0C2A, + 0x133B, 0x132C, 0x1325, 0x131D, 0x1316, 0x130F, 0x1307, 0x1300, + 0x12F8, 0x12F1, 0x12E2, 0x12DA, 0x12D2, 0x12CB, 0x12C3, 0x12BC, + 0x12B4, 0x12AC, 0x129D, 0x1296, 0x128E, 0x1286, 0x127F, 0x1277, + 0x126F, 0x1268, 0x1260, 0x1250, 0x1249, 0x1241, 0x1239, 0x1231, + 0x1229, 0x1222, 0x121A, 0x1212, 0x120A, 0x11FA, 0x11F3, 0x11EB, + 0x11E3, 0x11DB, 0x11D3, 0x11CB, 0x11C3, 0x11BB, 0x11AB, 0x11A3, + 0x119B, 0x1193, 0x118B, 0x1183, 0x117B, 0x1173, 0x116B, 0x115A, + 0x1152, 0x114A, 0x1142, 0x113A, 0x1131, 0x1129, 0x1121, 0x1119, + 0x1111, 0x1100, 0x10F8, 0x10EF, 0x10E7, 0x10DF, 0x10D6, 0x10CE, + 0x10C6, 0x10BD, 0x10B5, 0x10A4, 0x109B, 0x1093, 0x108B, 0x1082, + 0x1079, 0x1071, 0x1068, 0x1060, 0x1057, 0x1046, 0x103D, 0x1035, + 0x102C, 0x1023, 0x101B, 0x1012, 0x1009, 0x1001, 0x0FF8, 0x0FEF, + 0x0FDD, 0x0FD5, 0x0FCC, 0x0FC3, 0x0FBA, 0x0FB1, 0x0FA8, 0x0F9F, + 0x0F96, 0x0F8D, 0x0F7B, 0x0F72, 0x0F69, 0x0F60, 0x0F57, 0x0F4E, + 0x0F45, 0x0F3C, 0x0F32, 0x0F29, 0x0F20, 0x0F0D, 0x0F04, 0x0EFB, + 0x0EF2, 0x0EE8, 0x0EDF, 0x0ED6, 0x0ECC, 0x0EC3, 0x0EB9, 0x0EB0, + 0x0E9D, 0x0E93, 0x0E8A, 0x0E80, 0x0E77, 0x0E6D, 0x0E63, 0x0E5A, + 0x0E50, 0x0E46, 0x0E3D, 0x0E33, 0x0E1F, 0x0E15, 0x0E0C, 0x0E02, + 0x0DF8, 0x0DEE, 0x0DE4, 0x0DDA, 0x0DD0, 0x0DC6, 0x0DBC, 0x0DB2, + 0x0D9D, 0x0D93, 0x0D89, 0x0D7F, 0x0D75, 0x0D6A, 0x0D60, 0x0D56, + 0x0D4B, 0x0D41, 0x0D36, 0x0D2C, 0x0D21, 0x0D0C, 0x0D02, 0x0CF7, + 0x0CED, 0x0CE2, 0x0CD7, 0x0CCC, 0x0CC2, 0x0CB7, 0x0CAC, 0x0CA1, + 0x0C96, 0x0C8B, 0x0C75, 0x0C6A, 0x0C5F, 0x0C54, 0x0C49, 0x0C3E, + 0x0C32, 0x0C27, 0x0C1C, 0x0C11, 0x0C05, 0x0BFA, 0x0BEE, 0x0BD7, + 0x0BCC, 0x12A0, 0x1299, 0x1298, 0x1289, 0x1282, 0x1281, 0x1279, + 0x1272, 0x1271, 0x126A, 0x1269, 0x1262, 0x125A, 0x125A, 0x1252, + 0x1252, 0x1242, 0x123B, 0x123A, 0x1233, 0x1232, 0x122B, 0x1223, + 0x1222, 0x121B, 0x121A, 0x1213, 0x120B, 0x1203, 0x11FB, 0x11FB, + 0x11F3, 0x11EB, 0x11EB, 0x11E3, 0x11E2, 0x11DB, 0x11D3, 0x11D2, + 0x11CB, 0x11CA, 0x11BB, 0x11BA, 0x11B2, 0x11AA, 0x11AA, 0x11A2, + 0x11A2, 0x119A, 0x1192, 0x1191, 0x1189, 0x1189, 0x1181, 0x1179, + 0x1171, 0x1169, 0x1168, 0x1160, 0x1160, 0x1158, 0x1158, 0x1150, + 0x1148, 0x1147, 0x113F, 0x113F, 0x1137, 0x112E, 0x1126, 0x1126, + 0x111E, 0x1116, 0x1115, 0x110D, 0x110D, 0x1104, 0x1104, 0x10FC, + 0x10FB, 0x10F3, 0x10F3, 0x10E3, 0x10DA, 0x10DA, 0x10D2, 0x10D1, + 0x10C9, 0x10C9, 0x10C0, 0x10C0, 0x10B8, 0x10B7, 0x10AF, 0x10AF, + 0x10A6, 0x109E, 0x1095, 0x108D, 0x108D, 0x1084, 0x1084, 0x107C, + 0x107B, 0x1073, 0x1072, 0x106A, 0x1069, 0x1061, 0x1061, 0x1058, + 0x1058, 0x1047, 0x1047, 0x103E, 0x103E, 0x1035, 0x1035, 0x102C, + 0x102C, 0x1023, 0x1023, 0x101A, 0x101A, 0x1011, 0x1011, 0x1008 +}; + +// note: returns 16.16 fixed-point +static inline u32 DIVIDE(s16 n, u16 d) { + if (n >= 0 && n < d * 2) { + u32 offset = d; + int shift = 0; + u64 reciprocal; + u32 r, s; + + while (offset <= 0x8000) { + offset <<= 1; + shift++; + } + + // Newton-Raphson interation - x0, x1, x2 + // (16.16 fixed-point) + r = initial_guess[offset & 0x7fff] | 0x10000; + + s = (u64)offset * r >> 16; + r = (u64)r * (0x20000 - s) >> 16; + + s = (u64)offset * r >> 16; + r = (u64)r * (0x20000 - s) >> 16; + + reciprocal = (u64)(r) << shift; + + return (u32)(((reciprocal * n) + 0x8000) >> 16); + } + + return 0xffffffff; +} + diff --git a/libpcsxcore/ix86/iGte.h b/libpcsxcore/ix86/iGte.h new file mode 100644 index 0000000..d03705e --- /dev/null +++ b/libpcsxcore/ix86/iGte.h @@ -0,0 +1,79 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __IGTE_H__ +#define __IGTE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../r3000a.h" +#include "../psxmem.h" + +#define CP2_FUNC(f) \ +void gte##f(); \ +static void rec##f() { \ + iFlushRegs(); \ + MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code); \ + CALLFunc ((u32)gte##f); \ +/* branch = 2; */\ +} + +#define CP2_FUNCNC(f) \ +void gte##f(); \ +static void rec##f() { \ + iFlushRegs(); \ + CALLFunc ((u32)gte##f); \ +/* branch = 2; */\ +} + +CP2_FUNC(MFC2); +CP2_FUNC(MTC2); +CP2_FUNC(CFC2); +CP2_FUNC(CTC2); +CP2_FUNC(LWC2); +CP2_FUNC(SWC2); +CP2_FUNCNC(RTPS); +CP2_FUNC(OP); +CP2_FUNCNC(NCLIP); +CP2_FUNC(DPCS); +CP2_FUNC(INTPL); +CP2_FUNC(MVMVA); +CP2_FUNCNC(NCDS); +CP2_FUNCNC(NCDT); +CP2_FUNCNC(CDP); +CP2_FUNCNC(NCCS); +CP2_FUNCNC(CC); +CP2_FUNCNC(NCS); +CP2_FUNCNC(NCT); +CP2_FUNC(SQR); +CP2_FUNC(DCPL); +CP2_FUNCNC(DPCT); +CP2_FUNCNC(AVSZ3); +CP2_FUNCNC(AVSZ4); +CP2_FUNCNC(RTPT); +CP2_FUNC(GPF); +CP2_FUNC(GPL); +CP2_FUNCNC(NCCT); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/ix86/iR3000A.c b/libpcsxcore/ix86/iR3000A.c new file mode 100644 index 0000000..9216a22 --- /dev/null +++ b/libpcsxcore/ix86/iR3000A.c @@ -0,0 +1,2899 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* i386 assembly functions for R3000A core. +*/ + +#include "ix86.h" +#include + +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON +#endif + +u32 *psxRecLUT; + +#undef PC_REC +#undef PC_REC8 +#undef PC_REC16 +#undef PC_REC32 +#define PC_REC(x) (psxRecLUT[x >> 16] + (x & 0xffff)) +#define PC_REC8(x) (*(u8 *)PC_REC(x)) +#define PC_REC16(x) (*(u16*)PC_REC(x)) +#define PC_REC32(x) (*(u32*)PC_REC(x)) + +#define RECMEM_SIZE (8 * 1024 * 1024) + +static char *recMem; /* the recompiled blocks will be here */ +static char *recRAM; /* and the ptr to the blocks here */ +static char *recROM; /* and here */ + +static u32 pc; /* recompiler pc */ +static u32 pcold; /* recompiler oldpc */ +static int count; /* recompiler intruction count */ +static int branch; /* set for branch */ +static u32 target; /* branch target */ +static u32 resp; + +typedef struct { + int state; + u32 k; + int reg; +} iRegisters; + +static iRegisters iRegs[32]; +static iRegisters iRegsS[32]; + +#define ST_UNK 0 +#define ST_CONST 1 +#define ST_MAPPED 2 + +#define IsConst(reg) (iRegs[reg].state == ST_CONST) +#define IsMapped(reg) (iRegs[reg].state == ST_MAPPED) + +static void (*recBSC[64])(); +static void (*recSPC[64])(); +static void (*recREG[32])(); +static void (*recCP0[32])(); +static void (*recCP2[64])(); +static void (*recCP2BSC[32])(); + +static void MapConst(int reg, u32 _const) { + iRegs[reg].k = _const; + iRegs[reg].state = ST_CONST; +} + +static void iFlushReg(int reg) { + if (IsConst(reg)) { + MOV32ItoM((u32)&psxRegs.GPR.r[reg], iRegs[reg].k); + } + iRegs[reg].state = ST_UNK; +} + +static void iFlushRegs() { + int i; + + for (i=1; i<32; i++) { + iFlushReg(i); + } +} + +static void iRet() { + /* store cycle */ + count = ((pc - pcold) / 4) * BIAS; + ADD32ItoM((u32)&psxRegs.cycle, count); + if (resp) ADD32ItoR(ESP, resp); + RET(); +} + +static int iLoadTest() { + u32 tmp; + + // check for load delay + tmp = psxRegs.code >> 26; + switch (tmp) { + case 0x10: // COP0 + switch (_Rs_) { + case 0x00: // MFC0 + case 0x02: // CFC0 + return 1; + } + break; + case 0x12: // COP2 + switch (_Funct_) { + case 0x00: + switch (_Rs_) { + case 0x00: // MFC2 + case 0x02: // CFC2 + return 1; + } + break; + } + break; + case 0x32: // LWC2 + return 1; + default: + if (tmp >= 0x20 && tmp <= 0x26) { // LB/LH/LWL/LW/LBU/LHU/LWR + return 1; + } + break; + } + return 0; +} + +/* set a pending branch */ +static void SetBranch() { + branch = 1; + psxRegs.code = PSXMu32(pc); + pc += 4; + + if (iLoadTest() == 1) { + iFlushRegs(); + MOV32ItoM((u32)&psxRegs.code, psxRegs.code); + /* store cycle */ + count = ((pc - pcold) / 4) * BIAS; + ADD32ItoM((u32)&psxRegs.cycle, count); + if (resp) ADD32ItoR(ESP, resp); + + PUSH32M((u32)&target); + PUSH32I(_Rt_); + CALLFunc((u32)psxDelayTest); + ADD32ItoR(ESP, 2*4); + + RET(); + return; + } + + recBSC[psxRegs.code>>26](); + + iFlushRegs(); + MOV32MtoR(EAX, (u32)&target); + MOV32RtoM((u32)&psxRegs.pc, EAX); + CALLFunc((u32)psxBranchTest); + + iRet(); +} + +static void iJump(u32 branchPC) { + branch = 1; + psxRegs.code = PSXMu32(pc); + pc+=4; + + if (iLoadTest() == 1) { + iFlushRegs(); + MOV32ItoM((u32)&psxRegs.code, psxRegs.code); + /* store cycle */ + count = ((pc - pcold) / 4) * BIAS; + ADD32ItoM((u32)&psxRegs.cycle, count); + if (resp) ADD32ItoR(ESP, resp); + + PUSH32I(branchPC); + PUSH32I(_Rt_); + CALLFunc((u32)psxDelayTest); + ADD32ItoR(ESP, 2*4); + + RET(); + return; + } + + recBSC[psxRegs.code>>26](); + + iFlushRegs(); + MOV32ItoM((u32)&psxRegs.pc, branchPC); + CALLFunc((u32)psxBranchTest); + /* store cycle */ + count = ((pc - pcold) / 4) * BIAS; + ADD32ItoM((u32)&psxRegs.cycle, count); + if (resp) ADD32ItoR(ESP, resp); + + // maybe just happened an interruption, check so + CMP32ItoM((u32)&psxRegs.pc, branchPC); + j8Ptr[0] = JE8(0); + RET(); + + x86SetJ8(j8Ptr[0]); + MOV32MtoR(EAX, PC_REC(branchPC)); + TEST32RtoR(EAX, EAX); + j8Ptr[1] = JNE8(0); + RET(); + + x86SetJ8(j8Ptr[1]); + RET(); + JMP32R(EAX); +} + +static void iBranch(u32 branchPC, int savectx) { + u32 respold=0; + + if (savectx) { + respold = resp; + memcpy(iRegsS, iRegs, sizeof(iRegs)); + } + + branch = 1; + psxRegs.code = PSXMu32(pc); + + // the delay test is only made when the branch is taken + // savectx == 0 will mean that :) + if (savectx == 0 && iLoadTest() == 1) { + iFlushRegs(); + MOV32ItoM((u32)&psxRegs.code, psxRegs.code); + /* store cycle */ + count = (((pc+4) - pcold) / 4) * BIAS; + ADD32ItoM((u32)&psxRegs.cycle, count); + if (resp) ADD32ItoR(ESP, resp); + + PUSH32I(branchPC); + PUSH32I(_Rt_); + CALLFunc((u32)psxDelayTest); + ADD32ItoR(ESP, 2*4); + + RET(); + return; + } + + pc+= 4; + recBSC[psxRegs.code>>26](); + + iFlushRegs(); + MOV32ItoM((u32)&psxRegs.pc, branchPC); + CALLFunc((u32)psxBranchTest); + /* store cycle */ + count = ((pc - pcold) / 4) * BIAS; + ADD32ItoM((u32)&psxRegs.cycle, count); + if (resp) ADD32ItoR(ESP, resp); + + // maybe just happened an interruption, check so + CMP32ItoM((u32)&psxRegs.pc, branchPC); + j8Ptr[1] = JE8(0); + RET(); + + x86SetJ8(j8Ptr[1]); + MOV32MtoR(EAX, PC_REC(branchPC)); + TEST32RtoR(EAX, EAX); + j8Ptr[2] = JNE8(0); + RET(); + + x86SetJ8(j8Ptr[2]); + JMP32R(EAX); + + pc-= 4; + if (savectx) { + resp = respold; + memcpy(iRegs, iRegsS, sizeof(iRegs)); + } +} + + +char *txt0 = "EAX = %x : ECX = %x : EDX = %x\n"; +char *txt1 = "EAX = %x\n"; +char *txt2 = "M32 = %x\n"; + +void iLogX86() { + PUSHA32(); + + PUSH32R (EDX); + PUSH32R (ECX); + PUSH32R (EAX); + PUSH32M ((u32)&txt0); + CALLFunc ((u32)SysPrintf); + ADD32ItoR(ESP, 4*4); + + POPA32(); +} + +void iLogEAX() { + PUSH32R (EAX); + PUSH32M ((u32)&txt1); + CALLFunc ((u32)SysPrintf); + ADD32ItoR(ESP, 4*2); +} + +void iLogM32(u32 mem) { + PUSH32M (mem); + PUSH32M ((u32)&txt2); + CALLFunc ((u32)SysPrintf); + ADD32ItoR(ESP, 4*2); +} + +static void iDumpRegs() { + int i, j; + + printf("%x %x\n", psxRegs.pc, psxRegs.cycle); + for (i = 0; i < 4; i++) { + for (j = 0; j < 8; j++) + printf("%x ", psxRegs.GPR.r[j * i]); + printf("\n"); + } +} + +void iDumpBlock(char *ptr) { + FILE *f; + u32 i; + + SysPrintf("dump1 %x:%x, %x\n", psxRegs.pc, pc, psxRegs.cycle); + + for (i = psxRegs.pc; i < pc; i += 4) + SysPrintf("%s\n", disR3000AF(PSXMu32(i), i)); + + fflush(stdout); + f = fopen("dump1", "w"); + fwrite(ptr, 1, (u32)x86Ptr - (u32)ptr, f); + fclose(f); + system("ndisasmw -u dump1"); + fflush(stdout); +} + +#define REC_FUNC(f) \ +void psx##f(); \ +static void rec##f() { \ + iFlushRegs(); \ + MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code); \ + MOV32ItoM((u32)&psxRegs.pc, (u32)pc); \ + CALLFunc((u32)psx##f); \ +/* branch = 2; */\ +} + +#define REC_SYS(f) \ +void psx##f(); \ +static void rec##f() { \ + iFlushRegs(); \ + MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code); \ + MOV32ItoM((u32)&psxRegs.pc, (u32)pc); \ + CALLFunc((u32)psx##f); \ + branch = 2; \ + iRet(); \ +} + +#define REC_BRANCH(f) \ +void psx##f(); \ +static void rec##f() { \ + iFlushRegs(); \ + MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code); \ + MOV32ItoM((u32)&psxRegs.pc, (u32)pc); \ + CALLFunc((u32)psx##f); \ + branch = 2; \ + iRet(); \ +} + +static void recRecompile(); + +static int recInit() { + int i; + + psxRecLUT = (u32 *)malloc(0x010000 * 4); + + recMem = mmap(0, RECMEM_SIZE + 0x1000, + PROT_EXEC | PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + recRAM = (char *)malloc(0x200000); + recROM = (char *)malloc(0x080000); + if (recRAM == NULL || recROM == NULL || recMem == NULL || psxRecLUT == NULL) { + SysMessage("Error allocating memory"); return -1; + } + + for (i = 0; i < 0x80; i++) psxRecLUT[i + 0x0000] = (u32)&recRAM[(i & 0x1f) << 16]; + memcpy(psxRecLUT + 0x8000, psxRecLUT, 0x80 * 4); + memcpy(psxRecLUT + 0xa000, psxRecLUT, 0x80 * 4); + + for (i = 0; i < 0x08; i++) psxRecLUT[i + 0xbfc0] = (u32)&recROM[i << 16]; + + return 0; +} + +static void recReset() { + memset(recRAM, 0, 0x200000); + memset(recROM, 0, 0x080000); + + x86Init(); + + x86SetPtr(recMem); + + branch = 0; + memset(iRegs, 0, sizeof(iRegs)); + iRegs[0].state = ST_CONST; + iRegs[0].k = 0; +} + +static void recShutdown() { + if (recMem == NULL) return; + free(psxRecLUT); + munmap(recMem, RECMEM_SIZE + 0x1000); + free(recRAM); + free(recROM); + x86Shutdown(); +} + +static void recError() { + SysReset(); + ClosePlugins(); + SysMessage("Unrecoverable error while running recompiler\n"); + SysRunGui(); +} + +__inline static void execute() { + void (**recFunc)() = NULL; + char *p; + + p = (char *)PC_REC(psxRegs.pc); + if (p != NULL) recFunc = (void (**)()) (u32)p; + else { recError(); return; } + + if (*recFunc == 0) { + recRecompile(); + } + (*recFunc)(); +} + +static void recExecute() { + for (;;) execute(); +} + +static void recExecuteBlock() { + execute(); +} + +static void recClear(u32 Addr, u32 Size) { + memset((void*)PC_REC(Addr), 0, Size * 4); +} + +static void recNULL() { +// SysMessage("recUNK: %8.8x\n", psxRegs.code); +} + +/********************************************************* +* goes to opcodes tables... * +* Format: table[something....] * +*********************************************************/ + +//REC_SYS(SPECIAL); +static void recSPECIAL() { + recSPC[_Funct_](); +} + +static void recREGIMM() { + recREG[_Rt_](); +} + +static void recCOP0() { + recCP0[_Rs_](); +} + +//REC_SYS(COP2); +static void recCOP2() { + recCP2[_Funct_](); +} + +static void recBASIC() { + recCP2BSC[_Rs_](); +} + +//end of Tables opcodes... + +/********************************************************* +* Arithmetic with immediate operand * +* Format: OP rt, rs, immediate * +*********************************************************/ + +/*REC_FUNC(ADDI); +REC_FUNC(ADDIU); +REC_FUNC(ANDI); +REC_FUNC(ORI); +REC_FUNC(XORI); +REC_FUNC(SLTI); +REC_FUNC(SLTIU); +#if 0*/ +static void recADDIU() { +// Rt = Rs + Im + if (!_Rt_) return; + +// iFlushRegs(); + + if (_Rs_ == _Rt_) { + if (IsConst(_Rt_)) { + iRegs[_Rt_].k+= _Imm_; + } else { + if (_Imm_ == 1) { + INC32M((u32)&psxRegs.GPR.r[_Rt_]); + } else if (_Imm_ == -1) { + DEC32M((u32)&psxRegs.GPR.r[_Rt_]); + } else if (_Imm_) { + ADD32ItoM((u32)&psxRegs.GPR.r[_Rt_], _Imm_); + } + } + } else { + if (IsConst(_Rs_)) { + MapConst(_Rt_, iRegs[_Rs_].k + _Imm_); + } else { + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + if (_Imm_ == 1) { + INC32R(EAX); + } else if (_Imm_ == -1) { + DEC32R(EAX); + } else if (_Imm_) { + ADD32ItoR(EAX, _Imm_); + } + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + } + } +} + +static void recADDI() { +// Rt = Rs + Im + recADDIU(); +} + +static void recSLTI() { +// Rt = Rs < Im (signed) + if (!_Rt_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + MapConst(_Rt_, (s32)iRegs[_Rs_].k < _Imm_); + } else { + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + CMP32ItoR(EAX, _Imm_); + SETL8R (EAX); + AND32ItoR(EAX, 0xff); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + } +} + +static void recSLTIU() { +// Rt = Rs < Im (unsigned) + if (!_Rt_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + MapConst(_Rt_, iRegs[_Rs_].k < _ImmU_); + } else { + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + CMP32ItoR(EAX, _Imm_); + SETB8R (EAX); + AND32ItoR(EAX, 0xff); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + } +} + +static void recANDI() { +// Rt = Rs And Im + if (!_Rt_) return; + +// iFlushRegs(); + + if (_Rs_ == _Rt_) { + if (IsConst(_Rt_)) { + iRegs[_Rt_].k&= _ImmU_; + } else { + AND32ItoM((u32)&psxRegs.GPR.r[_Rt_], _ImmU_); + } + } else { + if (IsConst(_Rs_)) { + MapConst(_Rt_, iRegs[_Rs_].k & _ImmU_); + } else { + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + AND32ItoR(EAX, _ImmU_); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + } + } +} + +static void recORI() { +// Rt = Rs Or Im + if (!_Rt_) return; + +// iFlushRegs(); + + if (_Rs_ == _Rt_) { + if (IsConst(_Rt_)) { + iRegs[_Rt_].k|= _ImmU_; + } else { + OR32ItoM((u32)&psxRegs.GPR.r[_Rt_], _ImmU_); + } + } else { + if (IsConst(_Rs_)) { + MapConst(_Rt_, iRegs[_Rs_].k | _ImmU_); + } else { + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + if (_ImmU_) OR32ItoR (EAX, _ImmU_); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + } + } +} + +static void recXORI() { +// Rt = Rs Xor Im + if (!_Rt_) return; + +// iFlushRegs(); + + if (_Rs_ == _Rt_) { + if (IsConst(_Rt_)) { + iRegs[_Rt_].k^= _ImmU_; + } else { + XOR32ItoM((u32)&psxRegs.GPR.r[_Rt_], _ImmU_); + } + } else { + if (IsConst(_Rs_)) { + MapConst(_Rt_, iRegs[_Rs_].k ^ _ImmU_); + } else { + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + XOR32ItoR(EAX, _ImmU_); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + } + } +} +//#endif +//end of * Arithmetic with immediate operand + +/********************************************************* +* Load higher 16 bits of the first word in GPR with imm * +* Format: OP rt, immediate * +*********************************************************/ +/*REC_FUNC(LUI); +#if 0*/ +static void recLUI() { +// Rt = Imm << 16 + if (!_Rt_) return; + + MapConst(_Rt_, psxRegs.code << 16); +} +//#endif +//End of Load Higher ..... + + +/********************************************************* +* Register arithmetic * +* Format: OP rd, rs, rt * +*********************************************************/ + +/*REC_FUNC(ADD); +REC_FUNC(ADDU); +REC_FUNC(SUB); +REC_FUNC(SUBU); +REC_FUNC(AND); +REC_FUNC(OR); +REC_FUNC(XOR); +REC_FUNC(NOR); +REC_FUNC(SLT); +REC_FUNC(SLTU); + +#if 0*/ +static void recADDU() { +// Rd = Rs + Rt + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k + iRegs[_Rt_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + if (_Rt_ == _Rd_) { + if (iRegs[_Rs_].k == 1) { + INC32M((u32)&psxRegs.GPR.r[_Rd_]); + } else if (iRegs[_Rs_].k == -1) { + DEC32M((u32)&psxRegs.GPR.r[_Rd_]); + } else if (iRegs[_Rs_].k) { + ADD32ItoM((u32)&psxRegs.GPR.r[_Rd_], iRegs[_Rs_].k); + } + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + if (iRegs[_Rs_].k == 1) { + INC32R(EAX); + } else if (iRegs[_Rs_].k == 0xffffffff) { + DEC32R(EAX); + } else if (iRegs[_Rs_].k) { + ADD32ItoR(EAX, iRegs[_Rs_].k); + } + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + if (_Rs_ == _Rd_) { + if (iRegs[_Rt_].k == 1) { + INC32M((u32)&psxRegs.GPR.r[_Rd_]); + } else if (iRegs[_Rt_].k == -1) { + DEC32M((u32)&psxRegs.GPR.r[_Rd_]); + } else if (iRegs[_Rt_].k) { + ADD32ItoM((u32)&psxRegs.GPR.r[_Rd_], iRegs[_Rt_].k); + } + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + if (iRegs[_Rt_].k == 1) { + INC32R(EAX); + } else if (iRegs[_Rt_].k == 0xffffffff) { + DEC32R(EAX); + } else if (iRegs[_Rt_].k) { + ADD32ItoR(EAX, iRegs[_Rt_].k); + } + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } + } else { + iRegs[_Rd_].state = ST_UNK; + + if (_Rs_ == _Rd_) { // Rd+= Rt + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + ADD32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else if (_Rt_ == _Rd_) { // Rd+= Rs + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + ADD32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else { // Rd = Rs + Rt + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + ADD32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } + } +} + +static void recADD() { +// Rd = Rs + Rt + recADDU(); +} + +static void recSUBU() { +// Rd = Rs - Rt + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k - iRegs[_Rt_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rs_].k); + SUB32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + SUB32ItoR(EAX, iRegs[_Rt_].k); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + SUB32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recSUB() { +// Rd = Rs - Rt + recSUBU(); +} + +static void recAND() { +// Rd = Rs And Rt + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k & iRegs[_Rt_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + if (_Rd_ == _Rt_) { // Rd&= Rs + AND32ItoM((u32)&psxRegs.GPR.r[_Rd_], iRegs[_Rs_].k); + } else { + MOV32ItoR(EAX, iRegs[_Rs_].k); + AND32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + if (_Rd_ == _Rs_) { // Rd&= kRt + AND32ItoM((u32)&psxRegs.GPR.r[_Rd_], iRegs[_Rt_].k); + } else { // Rd = Rs & kRt + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + AND32ItoR(EAX, iRegs[_Rt_].k); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } + } else { + iRegs[_Rd_].state = ST_UNK; + + if (_Rs_ == _Rd_) { // Rd&= Rt + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + AND32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else if (_Rt_ == _Rd_) { // Rd&= Rs + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + AND32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else { // Rd = Rs & Rt + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + AND32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } + } +} + +static void recOR() { +// Rd = Rs Or Rt + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k | iRegs[_Rt_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rs_].k); + OR32MtoR (EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + OR32ItoR (EAX, iRegs[_Rt_].k); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + OR32MtoR (EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recXOR() { +// Rd = Rs Xor Rt + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k ^ iRegs[_Rt_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rs_].k); + XOR32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + XOR32ItoR(EAX, iRegs[_Rt_].k); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + XOR32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recNOR() { +// Rd = Rs Nor Rt + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, ~(iRegs[_Rs_].k | iRegs[_Rt_].k)); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rs_].k); + OR32MtoR (EAX, (u32)&psxRegs.GPR.r[_Rt_]); + NOT32R (EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + OR32ItoR (EAX, iRegs[_Rt_].k); + NOT32R (EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + OR32MtoR (EAX, (u32)&psxRegs.GPR.r[_Rt_]); + NOT32R (EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recSLT() { +// Rd = Rs < Rt (signed) + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, (s32)iRegs[_Rs_].k < (s32)iRegs[_Rt_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rs_].k); + CMP32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + SETL8R (EAX); + AND32ItoR(EAX, 0xff); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + CMP32ItoR(EAX, iRegs[_Rt_].k); + SETL8R (EAX); + AND32ItoR(EAX, 0xff); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + CMP32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + SETL8R (EAX); + AND32ItoR(EAX, 0xff); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recSLTU() { +// Rd = Rs < Rt (unsigned) + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k < iRegs[_Rt_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rs_].k); + CMP32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + SBB32RtoR(EAX, EAX); + NEG32R (EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + CMP32ItoR(EAX, iRegs[_Rt_].k); + SBB32RtoR(EAX, EAX); + NEG32R (EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + CMP32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + SBB32RtoR(EAX, EAX); + NEG32R (EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } +} +//#endif +//End of * Register arithmetic + +/********************************************************* +* Register mult/div & Register trap logic * +* Format: OP rs, rt * +*********************************************************/ + +/*REC_FUNC(MULT); +REC_FUNC(MULTU); +REC_FUNC(DIV); +REC_FUNC(DIVU); +#if 0*/ +static void recMULT() { +// Lo/Hi = Rs * Rt (signed) + +// iFlushRegs(); + + if ((IsConst(_Rs_) && iRegs[_Rs_].k == 0) || + (IsConst(_Rt_) && iRegs[_Rt_].k == 0)) { + XOR32RtoR(EAX, EAX); + MOV32RtoM((u32)&psxRegs.GPR.n.lo, EAX); + MOV32RtoM((u32)&psxRegs.GPR.n.hi, EAX); + return; + } + + if (IsConst(_Rs_)) { + MOV32ItoR(EAX, iRegs[_Rs_].k);// printf("multrsk %x\n", iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + } + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k);// printf("multrtk %x\n", iRegs[_Rt_].k); + IMUL32R (EDX); + } else { + IMUL32M ((u32)&psxRegs.GPR.r[_Rt_]); + } + MOV32RtoM((u32)&psxRegs.GPR.n.lo, EAX); + MOV32RtoM((u32)&psxRegs.GPR.n.hi, EDX); +} + +static void recMULTU() { +// Lo/Hi = Rs * Rt (unsigned) + +// iFlushRegs(); + + if ((IsConst(_Rs_) && iRegs[_Rs_].k == 0) || + (IsConst(_Rt_) && iRegs[_Rt_].k == 0)) { + XOR32RtoR(EAX, EAX); + MOV32RtoM((u32)&psxRegs.GPR.n.lo, EAX); + MOV32RtoM((u32)&psxRegs.GPR.n.hi, EAX); + return; + } + + if (IsConst(_Rs_)) { + MOV32ItoR(EAX, iRegs[_Rs_].k);// printf("multursk %x\n", iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + } + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k);// printf("multurtk %x\n", iRegs[_Rt_].k); + MUL32R (EDX); + } else { + MUL32M ((u32)&psxRegs.GPR.r[_Rt_]); + } + MOV32RtoM((u32)&psxRegs.GPR.n.lo, EAX); + MOV32RtoM((u32)&psxRegs.GPR.n.hi, EDX); +} + +static void recDIV() { +// Lo/Hi = Rs / Rt (signed) + +// iFlushRegs(); + + if (IsConst(_Rt_)) { + if (iRegs[_Rt_].k == 0) return; + MOV32ItoR(ECX, iRegs[_Rt_].k);// printf("divrtk %x\n", iRegs[_Rt_].k); + } else { + MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rt_]); + CMP32ItoR(ECX, 0); + j8Ptr[0] = JE8(0); + } + if (IsConst(_Rs_)) { + MOV32ItoR(EAX, iRegs[_Rs_].k);// printf("divrsk %x\n", iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + } + CDQ(); + IDIV32R (ECX); + MOV32RtoM((u32)&psxRegs.GPR.n.lo, EAX); + MOV32RtoM((u32)&psxRegs.GPR.n.hi, EDX); + if (!IsConst(_Rt_)) { + x86SetJ8(j8Ptr[0]); + } +} + +static void recDIVU() { +// Lo/Hi = Rs / Rt (unsigned) + +// iFlushRegs(); + + if (IsConst(_Rt_)) { + if (iRegs[_Rt_].k == 0) return; + MOV32ItoR(ECX, iRegs[_Rt_].k);// printf("divurtk %x\n", iRegs[_Rt_].k); + } else { + MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rt_]); + CMP32ItoR(ECX, 0); + j8Ptr[0] = JE8(0); + } + if (IsConst(_Rs_)) { + MOV32ItoR(EAX, iRegs[_Rs_].k);// printf("divursk %x\n", iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + } + XOR32RtoR(EDX, EDX); + DIV32R (ECX); + MOV32RtoM((u32)&psxRegs.GPR.n.lo, EAX); + MOV32RtoM((u32)&psxRegs.GPR.n.hi, EDX); + if (!IsConst(_Rt_)) { + x86SetJ8(j8Ptr[0]); + } +} +//#endif +//End of * Register mult/div & Register trap logic + +/*REC_FUNC(LB); +REC_FUNC(LBU); +REC_FUNC(LH); +REC_FUNC(LHU); +REC_FUNC(LW); + +REC_FUNC(SB); +REC_FUNC(SH); +REC_FUNC(SW);*/ + +//REC_FUNC(LWL); +//REC_FUNC(LWR); +//REC_FUNC(SWL); +//REC_FUNC(SWR); + +/* Push OfB for Stores/Loads */ +static void iPushOfB() { + if (IsConst(_Rs_)) { + PUSH32I (iRegs[_Rs_].k + _Imm_); + } else { + if (_Imm_) { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + ADD32ItoR(EAX, _Imm_); + PUSH32R (EAX); + } else { + PUSH32M ((u32)&psxRegs.GPR.r[_Rs_]); + } + } +} + +//#if 0 +static void recLB() { +// Rt = mem[Rs + Im] (signed) + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + if (!_Rt_) return; + // since bios is readonly it won't change + MapConst(_Rt_, psxRs8(addr)); + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVSX32M8toR(EAX, (u32)&psxM[addr & 0x1fffff]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVSX32M8toR(EAX, (u32)&psxH[addr & 0xfff]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } +// SysPrintf("unhandled r8 %x\n", addr); + } + + iPushOfB(); + CALLFunc((u32)psxMemRead8); + if (_Rt_) { + iRegs[_Rt_].state = ST_UNK; + MOVSX32R8toR(EAX, EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + } +// ADD32ItoR(ESP, 4); + resp+= 4; +} + +static void recLBU() { +// Rt = mem[Rs + Im] (unsigned) + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + if (!_Rt_) return; + // since bios is readonly it won't change + MapConst(_Rt_, psxRu8(addr)); + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVZX32M8toR(EAX, (u32)&psxM[addr & 0x1fffff]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVZX32M8toR(EAX, (u32)&psxH[addr & 0xfff]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } +// SysPrintf("unhandled r8u %x\n", addr); + } + + iPushOfB(); + CALLFunc((u32)psxMemRead8); + if (_Rt_) { + iRegs[_Rt_].state = ST_UNK; + MOVZX32R8toR(EAX, EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + } +// ADD32ItoR(ESP, 4); + resp+= 4; +} + +static void recLH() { +// Rt = mem[Rs + Im] (signed) + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + if (!_Rt_) return; + // since bios is readonly it won't change + MapConst(_Rt_, psxRs16(addr)); + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVSX32M16toR(EAX, (u32)&psxM[addr & 0x1fffff]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVSX32M16toR(EAX, (u32)&psxH[addr & 0xfff]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } +// SysPrintf("unhandled r16 %x\n", addr); + } + + iPushOfB(); + CALLFunc((u32)psxMemRead16); + if (_Rt_) { + iRegs[_Rt_].state = ST_UNK; + MOVSX32R16toR(EAX, EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + } +// ADD32ItoR(ESP, 4); + resp+= 4; +} + +static void recLHU() { +// Rt = mem[Rs + Im] (unsigned) + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + if (!_Rt_) return; + // since bios is readonly it won't change + MapConst(_Rt_, psxRu16(addr)); + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVZX32M16toR(EAX, (u32)&psxM[addr & 0x1fffff]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVZX32M16toR(EAX, (u32)&psxH[addr & 0xfff]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80) { + if (addr >= 0x1f801c00 && addr < 0x1f801e00) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + PUSH32I (addr); + CALL32M ((u32)&SPU_readRegister); + MOVZX32R16toR(EAX, EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); +#ifndef __WIN32__ + resp+= 4; +#endif + return; + } + switch (addr) { + case 0x1f801100: case 0x1f801110: case 0x1f801120: + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + PUSH32I((addr >> 4) & 0x3); + CALLFunc((u32)psxRcntRcount); + MOVZX32R16toR(EAX, EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + resp+= 4; + return; + + case 0x1f801104: case 0x1f801114: case 0x1f801124: + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + PUSH32I((addr >> 4) & 0x3); + CALLFunc((u32)psxRcntRmode); + MOVZX32R16toR(EAX, EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + resp+= 4; + return; + + case 0x1f801108: case 0x1f801118: case 0x1f801128: + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + PUSH32I((addr >> 4) & 0x3); + CALLFunc((u32)psxRcntRtarget); + MOVZX32R16toR(EAX, EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + resp+= 4; + return; + } + } +// SysPrintf("unhandled r16u %x\n", addr); + } + + iPushOfB(); + CALLFunc((u32)psxMemRead16); + if (_Rt_) { + iRegs[_Rt_].state = ST_UNK; + MOVZX32R16toR(EAX, EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + } +// ADD32ItoR(ESP, 4); + resp+= 4; +} + +static void recLW() { +// Rt = mem[Rs + Im] (unsigned) + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + if (!_Rt_) return; + // since bios is readonly it won't change + MapConst(_Rt_, psxRu32(addr)); + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxM[addr & 0x1fffff]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxH[addr & 0xfff]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80) { + switch (addr) { + case 0x1f801080: case 0x1f801084: case 0x1f801088: + case 0x1f801090: case 0x1f801094: case 0x1f801098: + case 0x1f8010a0: case 0x1f8010a4: case 0x1f8010a8: + case 0x1f8010b0: case 0x1f8010b4: case 0x1f8010b8: + case 0x1f8010c0: case 0x1f8010c4: case 0x1f8010c8: + case 0x1f8010d0: case 0x1f8010d4: case 0x1f8010d8: + case 0x1f8010e0: case 0x1f8010e4: case 0x1f8010e8: + case 0x1f801070: case 0x1f801074: + case 0x1f8010f0: case 0x1f8010f4: + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxH[addr & 0xffff]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + + case 0x1f801810: + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + CALL32M((u32)&GPU_readData); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + + case 0x1f801814: + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + CALL32M((u32)&GPU_readStatus); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + } +// SysPrintf("unhandled r32 %x\n", addr); + } + + iPushOfB(); + CALLFunc((u32)psxMemRead32); + if (_Rt_) { + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + } +// ADD32ItoR(ESP, 4); + resp+= 4; +} + +extern u32 LWL_MASK[4]; +extern u32 LWL_SHIFT[4]; + +void iLWLk(u32 shift) { + if (IsConst(_Rt_)) { + MOV32ItoR(ECX, iRegs[_Rt_].k); + } else { + MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rt_]); + } + AND32ItoR(ECX, LWL_MASK[shift]); + SHL32ItoR(EAX, LWL_SHIFT[shift]); + OR32RtoR (EAX, ECX); +} + +void recLWL() { +// Rt = Rt Merge mem[Rs + Im] + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + MOV32MtoR(EAX, (u32)&psxM[addr & 0x1ffffc]); + iLWLk(addr & 3); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + MOV32MtoR(EAX, (u32)&psxH[addr & 0xffc]); + iLWLk(addr & 3); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + } + + if (IsConst(_Rs_)) MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + PUSH32R (EAX); + AND32ItoR(EAX, ~3); + PUSH32R (EAX); + CALLFunc((u32)psxMemRead32); + + if (_Rt_) { + ADD32ItoR(ESP, 4); + POP32R (EDX); + AND32ItoR(EDX, 0x3); // shift = addr & 3; + + MOV32ItoR(ECX, (u32)LWL_SHIFT); + MOV32RmStoR(ECX, ECX, EDX, 2); + SHL32CLtoR(EAX); // mem(EAX) << LWL_SHIFT[shift] + + MOV32ItoR(ECX, (u32)LWL_MASK); + MOV32RmStoR(ECX, ECX, EDX, 2); + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k); + } else { + MOV32MtoR(EDX, (u32)&psxRegs.GPR.r[_Rt_]); + } + AND32RtoR(EDX, ECX); // _rRt_ & LWL_MASK[shift] + + OR32RtoR(EAX, EDX); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + } else { +// ADD32ItoR(ESP, 8); + resp+= 8; + } +} + +static void recLWBlock(int count) { + u32 *code = (u32 *)PSXM(pc); + int i, respsave; +// Rt = mem[Rs + Im] (unsigned) + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + // since bios is readonly it won't change + for (i = 0; i < count; i++, code++, addr += 4) { + if (_fRt_(*code)) { + MapConst(_fRt_(*code), psxRu32(addr)); + } + } + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + for (i = 0; i < count; i++, code++, addr += 4) { + if (!_fRt_(*code)) + return; + iRegs[_fRt_(*code)].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxM[addr & 0x1fffff]); + MOV32RtoM((u32)&psxRegs.GPR.r[_fRt_(*code)], EAX); + } + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + for (i = 0; i < count; i++, code++, addr += 4) { + if (!_fRt_(*code)) + return; + iRegs[_fRt_(*code)].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxH[addr & 0xfff]); + MOV32RtoM((u32)&psxRegs.GPR.r[_fRt_(*code)], EAX); + } + return; + } + } + + SysPrintf("recLWBlock %d: %d\n", count, IsConst(_Rs_)); + iPushOfB(); + CALLFunc((u32)psxMemPointer); +// ADD32ItoR(ESP, 4); + resp += 4; + + respsave = resp; resp = 0; + TEST32RtoR(EAX, EAX); + j32Ptr[4] = JZ32(0); + XOR32RtoR(ECX, ECX); + for (i = 0; i < count; i++, code++) { + if (_fRt_(*code)) { + iRegs[_fRt_(*code)].state = ST_UNK; + + MOV32RmStoR(EDX, EAX, ECX, 2); + MOV32RtoM((u32)&psxRegs.GPR.r[_fRt_(*code)], EDX); + } + if (i != (count - 1)) + INC32R(ECX); + } + j32Ptr[5] = JMP32(0); + x86SetJ32(j32Ptr[4]); + for (i = 0, code = (u32 *)PSXM(pc); i < count; i++, code++) { + psxRegs.code = *code; + recLW(); + } + ADD32ItoR(ESP, resp); + x86SetJ32(j32Ptr[5]); + resp = respsave; +} + +extern u32 LWR_MASK[4]; +extern u32 LWR_SHIFT[4]; + +void iLWRk(u32 shift) { + if (IsConst(_Rt_)) { + MOV32ItoR(ECX, iRegs[_Rt_].k); + } else { + MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rt_]); + } + AND32ItoR(ECX, LWR_MASK[shift]); + SHR32ItoR(EAX, LWR_SHIFT[shift]); + OR32RtoR(EAX, ECX); +} + +void recLWR() { +// Rt = Rt Merge mem[Rs + Im] + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + MOV32MtoR(EAX, (u32)&psxM[addr & 0x1ffffc]); + iLWRk(addr & 3); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + MOV32MtoR(EAX, (u32)&psxH[addr & 0xffc]); + iLWRk(addr & 3); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + } + + if (IsConst(_Rs_)) + MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + PUSH32R (EAX); + AND32ItoR(EAX, ~3); + PUSH32R (EAX); + CALLFunc((u32)psxMemRead32); + + if (_Rt_) { + ADD32ItoR(ESP, 4); + POP32R (EDX); + AND32ItoR(EDX, 0x3); // shift = addr & 3; + + MOV32ItoR(ECX, (u32)LWR_SHIFT); + MOV32RmStoR(ECX, ECX, EDX, 2); + SHR32CLtoR(EAX); // mem(EAX) >> LWR_SHIFT[shift] + + MOV32ItoR(ECX, (u32)LWR_MASK); + MOV32RmStoR(ECX, ECX, EDX, 2); + + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k); + } else { + MOV32MtoR(EDX, (u32)&psxRegs.GPR.r[_Rt_]); + } + AND32RtoR(EDX, ECX); // _rRt_ & LWR_MASK[shift] + + OR32RtoR(EAX, EDX); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + } else { +// ADD32ItoR(ESP, 8); + resp+= 8; + } +} + +static void recSB() { +// mem[Rs + Im] = Rt + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (IsConst(_Rt_)) { + MOV8ItoM((u32)&psxM[addr & 0x1fffff], (u8)iRegs[_Rt_].k); + } else { + MOV8MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV8RtoM((u32)&psxM[addr & 0x1fffff], EAX); + } + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (IsConst(_Rt_)) { + MOV8ItoM((u32)&psxH[addr & 0xfff], (u8)iRegs[_Rt_].k); + } else { + MOV8MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV8RtoM((u32)&psxH[addr & 0xfff], EAX); + } + return; + } +// SysPrintf("unhandled w8 %x\n", addr); + } + + if (IsConst(_Rt_)) { + PUSH32I (iRegs[_Rt_].k); + } else { + PUSH32M ((u32)&psxRegs.GPR.r[_Rt_]); + } + iPushOfB(); + CALLFunc((u32)psxMemWrite8); +// ADD32ItoR(ESP, 8); + resp+= 8; +} + +static void recSH() { +// mem[Rs + Im] = Rt + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (IsConst(_Rt_)) { + MOV16ItoM((u32)&psxM[addr & 0x1fffff], (u16)iRegs[_Rt_].k); + } else { + MOV16MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV16RtoM((u32)&psxM[addr & 0x1fffff], EAX); + } + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (IsConst(_Rt_)) { + MOV16ItoM((u32)&psxH[addr & 0xfff], (u16)iRegs[_Rt_].k); + } else { + MOV16MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV16RtoM((u32)&psxH[addr & 0xfff], EAX); + } + return; + } + if (t == 0x1f80) { + if (addr >= 0x1f801c00 && addr < 0x1f801e00) { + if (IsConst(_Rt_)) { + PUSH32I(iRegs[_Rt_].k); + } else { + PUSH32M((u32)&psxRegs.GPR.r[_Rt_]); + } + PUSH32I (addr); + CALL32M ((u32)&SPU_writeRegister); +#ifndef __WIN32__ + resp+= 8; +#endif + return; + } + } +// SysPrintf("unhandled w16 %x\n", addr); + } + + if (IsConst(_Rt_)) { + PUSH32I (iRegs[_Rt_].k); + } else { + PUSH32M ((u32)&psxRegs.GPR.r[_Rt_]); + } + iPushOfB(); + CALLFunc((u32)psxMemWrite16); +// ADD32ItoR(ESP, 8); + resp+= 8; +} + +static void recSW() { +// mem[Rs + Im] = Rt + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (IsConst(_Rt_)) { + MOV32ItoM((u32)&psxM[addr & 0x1fffff], iRegs[_Rt_].k); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((u32)&psxM[addr & 0x1fffff], EAX); + } + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (IsConst(_Rt_)) { + MOV32ItoM((u32)&psxH[addr & 0xfff], iRegs[_Rt_].k); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((u32)&psxH[addr & 0xfff], EAX); + } + return; + } + if (t == 0x1f80) { + switch (addr) { + case 0x1f801080: case 0x1f801084: + case 0x1f801090: case 0x1f801094: + case 0x1f8010a0: case 0x1f8010a4: + case 0x1f8010b0: case 0x1f8010b4: + case 0x1f8010c0: case 0x1f8010c4: + case 0x1f8010d0: case 0x1f8010d4: + case 0x1f8010e0: case 0x1f8010e4: + case 0x1f801074: + case 0x1f8010f0: + if (IsConst(_Rt_)) { + MOV32ItoM((u32)&psxH[addr & 0xffff], iRegs[_Rt_].k); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((u32)&psxH[addr & 0xffff], EAX); + } + return; + + case 0x1f801810: + if (IsConst(_Rt_)) { + PUSH32I(iRegs[_Rt_].k); + } else { + PUSH32M((u32)&psxRegs.GPR.r[_Rt_]); + } + CALL32M((u32)&GPU_writeData); +#ifndef __WIN32__ + resp+= 4; +#endif + return; + + case 0x1f801814: + if (IsConst(_Rt_)) { + PUSH32I(iRegs[_Rt_].k); + } else { + PUSH32M((u32)&psxRegs.GPR.r[_Rt_]); + } + CALL32M((u32)&GPU_writeStatus); +#ifndef __WIN32__ + resp+= 4; +#endif + } + } +// SysPrintf("unhandled w32 %x\n", addr); + } + + if (IsConst(_Rt_)) { + PUSH32I (iRegs[_Rt_].k); + } else { + PUSH32M ((u32)&psxRegs.GPR.r[_Rt_]); + } + iPushOfB(); + CALLFunc((u32)psxMemWrite32); +// ADD32ItoR(ESP, 8); + resp+= 8; +} +//#endif + +static void recSWBlock(int count) { + u32 *code; + int i, respsave; +// mem[Rs + Im] = Rt + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + code = (u32 *)PSXM(pc); + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + for (i = 0; i < count; i++, code++, addr += 4) { + if (IsConst(_fRt_(*code))) { + MOV32ItoM((u32)&psxM[addr & 0x1fffff], iRegs[_fRt_(*code)].k); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_fRt_(*code)]); + MOV32RtoM((u32)&psxM[addr & 0x1fffff], EAX); + } + } + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + for (i = 0; i < count; i++, code++, addr += 4) { + if (!_fRt_(*code)) + return; + iRegs[_fRt_(*code)].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxH[addr & 0xfff]); + MOV32RtoM((u32)&psxRegs.GPR.r[_fRt_(*code)], EAX); + } + return; + } + } + + SysPrintf("recSWBlock %d: %d\n", count, IsConst(_Rs_)); + iPushOfB(); + CALLFunc((u32)psxMemPointer); +// ADD32ItoR(ESP, 4); + resp += 4; + + respsave = resp; + resp = 0; + TEST32RtoR(EAX, EAX); + j32Ptr[4] = JZ32(0); + XOR32RtoR(ECX, ECX); + for (i = 0, code = (u32 *)PSXM(pc); i < count; i++, code++) { + if (IsConst(_fRt_(*code))) { + MOV32ItoR(EDX, iRegs[_fRt_(*code)].k); + } else { + MOV32MtoR(EDX, (u32)&psxRegs.GPR.r[_fRt_(*code)]); + } + MOV32RtoRmS(EAX, ECX, 2, EDX); + if (i != (count - 1)) + INC32R(ECX); + } + j32Ptr[5] = JMP32(0); + x86SetJ32(j32Ptr[4]); + for (i = 0, code = (u32 *)PSXM(pc); i < count; i++, code++) { + psxRegs.code = *code; + recSW(); + } + ADD32ItoR(ESP, resp); + x86SetJ32(j32Ptr[5]); + resp = respsave; +} + +extern u32 SWL_MASK[4]; +extern u32 SWL_SHIFT[4]; + +void iSWLk(u32 shift) { + if (IsConst(_Rt_)) { + MOV32ItoR(ECX, iRegs[_Rt_].k); + } else { + MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rt_]); + } + SHR32ItoR(ECX, SWL_SHIFT[shift]); + AND32ItoR(EAX, SWL_MASK[shift]); + OR32RtoR (EAX, ECX); +} + +void recSWL() { +// mem[Rs + Im] = Rt Merge mem[Rs + Im] + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + MOV32MtoR(EAX, (u32)&psxM[addr & 0x1ffffc]); + iSWLk(addr & 3); + MOV32RtoM((u32)&psxM[addr & 0x1ffffc], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + MOV32MtoR(EAX, (u32)&psxH[addr & 0xffc]); + iSWLk(addr & 3); + MOV32RtoM((u32)&psxH[addr & 0xffc], EAX); + return; + } + } + + if (IsConst(_Rs_)) { + MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + PUSH32R (EAX); + AND32ItoR(EAX, ~3); + PUSH32R (EAX); + + CALLFunc((u32)psxMemRead32); + + ADD32ItoR(ESP, 4); + POP32R (EDX); + AND32ItoR(EDX, 0x3); // shift = addr & 3; + + MOV32ItoR(ECX, (u32)SWL_MASK); + MOV32RmStoR(ECX, ECX, EDX, 2); + AND32RtoR(EAX, ECX); // mem & SWL_MASK[shift] + + MOV32ItoR(ECX, (u32)SWL_SHIFT); + MOV32RmStoR(ECX, ECX, EDX, 2); + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k); + } else { + MOV32MtoR(EDX, (u32)&psxRegs.GPR.r[_Rt_]); + } + SHR32CLtoR(EDX); // _rRt_ >> SWL_SHIFT[shift] + + OR32RtoR (EAX, EDX); + PUSH32R (EAX); + + if (IsConst(_Rs_)) MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + AND32ItoR(EAX, ~3); + PUSH32R (EAX); + + CALLFunc((u32)psxMemWrite32); +// ADD32ItoR(ESP, 8); + resp+= 8; +} + +extern u32 SWR_MASK[4]; +extern u32 SWR_SHIFT[4]; + +void iSWRk(u32 shift) { + if (IsConst(_Rt_)) { + MOV32ItoR(ECX, iRegs[_Rt_].k); + } else { + MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rt_]); + } + SHL32ItoR(ECX, SWR_SHIFT[shift]); + AND32ItoR(EAX, SWR_MASK[shift]); + OR32RtoR (EAX, ECX); +} + +void recSWR() { +// mem[Rs + Im] = Rt Merge mem[Rs + Im] + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + MOV32MtoR(EAX, (u32)&psxM[addr & 0x1ffffc]); + iSWRk(addr & 3); + MOV32RtoM((u32)&psxM[addr & 0x1ffffc], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + MOV32MtoR(EAX, (u32)&psxH[addr & 0xffc]); + iSWRk(addr & 3); + MOV32RtoM((u32)&psxH[addr & 0xffc], EAX); + return; + } + } + + if (IsConst(_Rs_)) { + MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + PUSH32R (EAX); + AND32ItoR(EAX, ~3); + PUSH32R (EAX); + + CALLFunc((u32)psxMemRead32); + + ADD32ItoR(ESP, 4); + POP32R (EDX); + AND32ItoR(EDX, 0x3); // shift = addr & 3; + + MOV32ItoR(ECX, (u32)SWR_MASK); + MOV32RmStoR(ECX, ECX, EDX, 2); + AND32RtoR(EAX, ECX); // mem & SWR_MASK[shift] + + MOV32ItoR(ECX, (u32)SWR_SHIFT); + MOV32RmStoR(ECX, ECX, EDX, 2); + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k); + } else { + MOV32MtoR(EDX, (u32)&psxRegs.GPR.r[_Rt_]); + } + SHL32CLtoR(EDX); // _rRt_ << SWR_SHIFT[shift] + + OR32RtoR (EAX, EDX); + PUSH32R (EAX); + + if (IsConst(_Rs_)) MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + AND32ItoR(EAX, ~3); + PUSH32R (EAX); + + CALLFunc((u32)psxMemWrite32); +// ADD32ItoR(ESP, 8); + resp += 8; +} + +/*REC_FUNC(SLL); +REC_FUNC(SRL); +REC_FUNC(SRA); +#if 0*/ +static void recSLL() { +// Rd = Rt << Sa + if (!_Rd_) + return; + +// iFlushRegs(); + + if (IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rt_].k << _Sa_); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + if (_Sa_) SHL32ItoR(EAX, _Sa_); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recSRL() { +// Rd = Rt >> Sa + if (!_Rd_) + return; + +// iFlushRegs(); + + if (IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rt_].k >> _Sa_); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + if (_Sa_) SHR32ItoR(EAX, _Sa_); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recSRA() { +// Rd = Rt >> Sa + if (!_Rd_) + return; + +// iFlushRegs(); + + if (IsConst(_Rt_)) { + MapConst(_Rd_, (s32)iRegs[_Rt_].k >> _Sa_); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + if (_Sa_) SAR32ItoR(EAX, _Sa_); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } +} +//#endif + +/*REC_FUNC(SLLV); +REC_FUNC(SRLV); +REC_FUNC(SRAV); +#if 0*/ +static void recSLLV() { +// Rd = Rt << Rs + if (!_Rd_) + return; + +// iFlushRegs(); + + if (IsConst(_Rt_) && IsConst(_Rs_)) { + MapConst(_Rd_, iRegs[_Rt_].k << iRegs[_Rs_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32ItoR(ECX, iRegs[_Rs_].k); + SHL32CLtoR(EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rt_].k); + MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rs_]); + SHL32CLtoR(EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rs_]); + SHL32CLtoR(EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recSRLV() { +// Rd = Rt >> Rs + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rt_) && IsConst(_Rs_)) { + MapConst(_Rd_, iRegs[_Rt_].k >> iRegs[_Rs_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32ItoR(ECX, iRegs[_Rs_].k); + SHR32CLtoR(EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rt_].k); + MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rs_]); + SHR32CLtoR(EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rs_]); + SHR32CLtoR(EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recSRAV() { +// Rd = Rt >> Rs + if (!_Rd_) + return; + +// iFlushRegs(); + + if (IsConst(_Rt_) && IsConst(_Rs_)) { + MapConst(_Rd_, (s32)iRegs[_Rt_].k >> iRegs[_Rs_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32ItoR(ECX, iRegs[_Rs_].k); + SAR32CLtoR(EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rt_].k); + MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rs_]); + SAR32CLtoR(EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rs_]); + SAR32CLtoR(EAX); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); + } +} +//#endif + +/*REC_SYS(SYSCALL); +REC_SYS(BREAK); + +#if 0*/ +int dump; +static void recSYSCALL() { +// dump = 1; + iFlushRegs(); + + MOV32ItoR(EAX, pc - 4); + MOV32RtoM((u32)&psxRegs.pc, EAX); + PUSH32I (branch == 1 ? 1 : 0); + PUSH32I (0x20); + CALLFunc ((u32)psxException); + ADD32ItoR(ESP, 8); + + branch = 2; + iRet(); +} + +static void recBREAK() { +} +//#endif + +/*REC_FUNC(MFHI); +REC_FUNC(MTHI); +REC_FUNC(MFLO); +REC_FUNC(MTLO); +#if 0*/ +static void recMFHI() { +// Rd = Hi + if (!_Rd_) + return; + + iRegs[_Rd_].state = ST_UNK; + MOV32MtoR(EAX, (u32)&psxRegs.GPR.n.hi); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); +} + +static void recMTHI() { +// Hi = Rs + + if (IsConst(_Rs_)) { + MOV32ItoM((u32)&psxRegs.GPR.n.hi, iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + MOV32RtoM((u32)&psxRegs.GPR.n.hi, EAX); + } +} + +static void recMFLO() { +// Rd = Lo + if (!_Rd_) + return; + + iRegs[_Rd_].state = ST_UNK; + MOV32MtoR(EAX, (u32)&psxRegs.GPR.n.lo); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX); +} + +static void recMTLO() { +// Lo = Rs + + if (IsConst(_Rs_)) { + MOV32ItoM((u32)&psxRegs.GPR.n.lo, iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + MOV32RtoM((u32)&psxRegs.GPR.n.lo, EAX); + } +} +//#endif + +/*REC_BRANCH(J); +REC_BRANCH(JR); +REC_BRANCH(JAL); +REC_BRANCH(JALR); +REC_BRANCH(BLTZ); +REC_BRANCH(BGTZ); +REC_BRANCH(BLTZAL); +REC_BRANCH(BGEZAL); +REC_BRANCH(BNE); +REC_BRANCH(BEQ); +REC_BRANCH(BLEZ); +REC_BRANCH(BGEZ);*/ + +//#if 0 +static void recBLTZ() { +// Branch if Rs < 0 + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + + if (bpc == pc+4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k < 0) { + iJump(bpc); + return; + } else { + iJump(pc + 4); + return; + } + } + + CMP32ItoM((u32)&psxRegs.GPR.r[_Rs_], 0); + j32Ptr[4] = JL32(0); + + iBranch(pc+4, 1); + + x86SetJ32(j32Ptr[4]); + + iBranch(bpc, 0); + pc += 4; +} + +static void recBGTZ() { +// Branch if Rs > 0 + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + if (bpc == pc + 4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k > 0) { + iJump(bpc); + return; + } else { + iJump(pc + 4); + return; + } + } + + CMP32ItoM((u32)&psxRegs.GPR.r[_Rs_], 0); + j32Ptr[4] = JG32(0); + + iBranch(pc + 4, 1); + + x86SetJ32(j32Ptr[4]); + + iBranch(bpc, 0); + pc+=4; +} + +static void recBLTZAL() { +// Branch if Rs < 0 + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + if (bpc == pc + 4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k < 0) { + MOV32ItoM((u32)&psxRegs.GPR.r[31], pc + 4); + iJump(bpc); return; + } else { + iJump(pc + 4); return; + } + } + + CMP32ItoM((u32)&psxRegs.GPR.r[_Rs_], 0); + j32Ptr[4] = JL32(0); + + iBranch(pc + 4, 1); + + x86SetJ32(j32Ptr[4]); + + MOV32ItoM((u32)&psxRegs.GPR.r[31], pc + 4); + iBranch(bpc, 0); + pc += 4; +} + +static void recBGEZAL() { +// Branch if Rs >= 0 + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + if (bpc == pc + 4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k >= 0) { + MOV32ItoM((u32)&psxRegs.GPR.r[31], pc + 4); + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } + + CMP32ItoM((u32)&psxRegs.GPR.r[_Rs_], 0); + j32Ptr[4] = JGE32(0); + + iBranch(pc+4, 1); + + x86SetJ32(j32Ptr[4]); + + MOV32ItoM((u32)&psxRegs.GPR.r[31], pc + 4); + iBranch(bpc, 0); + pc+=4; +} + +static void recJ() { +// j target + + iJump(_Target_ * 4 + (pc & 0xf0000000)); +} + +static void recJAL() { +// jal target + + MapConst(31, pc + 4); + + iJump(_Target_ * 4 + (pc & 0xf0000000)); +} + +static void recJR() { +// jr Rs + + if (IsConst(_Rs_)) { + MOV32ItoM((u32)&target, iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + MOV32RtoM((u32)&target, EAX); + } + + SetBranch(); +} + +static void recJALR() { +// jalr Rs + + if (IsConst(_Rs_)) { + MOV32ItoM((u32)&target, iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + MOV32RtoM((u32)&target, EAX); + } + + if (_Rd_) { + MapConst(_Rd_, pc + 4); + } + + SetBranch(); +} + +static void recBEQ() { +// Branch if Rs == Rt + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + if (bpc == pc + 4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (_Rs_ == _Rt_) { + iJump(bpc); + } else { + if (IsConst(_Rs_) && IsConst(_Rt_)) { + if (iRegs[_Rs_].k == iRegs[_Rt_].k) { + iJump(bpc); + return; + } else { + iJump(pc + 4); + return; + } + } else if (IsConst(_Rs_)) { + CMP32ItoM((u32)&psxRegs.GPR.r[_Rt_], iRegs[_Rs_].k); + } else if (IsConst(_Rt_)) { + CMP32ItoM((u32)&psxRegs.GPR.r[_Rs_], iRegs[_Rt_].k); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + CMP32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + } + + j32Ptr[4] = JE32(0); + + iBranch(pc + 4, 1); + + x86SetJ32(j32Ptr[4]); + + iBranch(bpc, 0); + pc += 4; + } +} + +static void recBNE() { +// Branch if Rs != Rt + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + if (bpc == pc + 4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + if (iRegs[_Rs_].k != iRegs[_Rt_].k) { + iJump(bpc); + return; + } else { + iJump(pc + 4); + return; + } + } else if (IsConst(_Rs_)) { + CMP32ItoM((u32)&psxRegs.GPR.r[_Rt_], iRegs[_Rs_].k); + } else if (IsConst(_Rt_)) { + CMP32ItoM((u32)&psxRegs.GPR.r[_Rs_], iRegs[_Rt_].k); + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + CMP32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + } + j32Ptr[4] = JNE32(0); + + iBranch(pc + 4, 1); + + x86SetJ32(j32Ptr[4]); + + iBranch(bpc, 0); + pc += 4; +} + +static void recBLEZ() { +// Branch if Rs <= 0 + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + if (bpc == pc + 4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k <= 0) { + iJump(bpc); + return; + } else { + iJump(pc + 4); + return; + } + } + + CMP32ItoM((u32)&psxRegs.GPR.r[_Rs_], 0); + j32Ptr[4] = JLE32(0); + + iBranch(pc + 4, 1); + + x86SetJ32(j32Ptr[4]); + + iBranch(bpc, 0); + pc += 4; +} + +static void recBGEZ() { +// Branch if Rs >= 0 + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + if (bpc == pc + 4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k >= 0) { + iJump(bpc); + return; + } else { + iJump(pc + 4); + return; + } + } + + CMP32ItoM((u32)&psxRegs.GPR.r[_Rs_], 0); + j32Ptr[4] = JGE32(0); + + iBranch(pc + 4, 1); + + x86SetJ32(j32Ptr[4]); + + iBranch(bpc, 0); + pc += 4; +} +//#endif + +/*REC_FUNC(MFC0); +REC_SYS(MTC0); +REC_FUNC(CFC0); +REC_SYS(CTC0); +REC_FUNC(RFE); +#if 0*/ +static void recMFC0() { +// Rt = Cop0->Rd + if (!_Rt_) return; + + iRegs[_Rt_].state = ST_UNK; + MOV32MtoR(EAX, (u32)&psxRegs.CP0.r[_Rd_]); + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); +} + +static void recCFC0() { +// Rt = Cop0->Rd + + recMFC0(); +} + +void psxMTC0(); +static void recMTC0() { +// Cop0->Rd = Rt + + if (IsConst(_Rt_)) { + switch (_Rd_) { + case 12: + MOV32ItoM((u32)&psxRegs.CP0.r[_Rd_], iRegs[_Rt_].k); + break; + case 13: + MOV32ItoM((u32)&psxRegs.CP0.r[_Rd_], iRegs[_Rt_].k & ~(0xfc00)); + break; + default: + MOV32ItoM((u32)&psxRegs.CP0.r[_Rd_], iRegs[_Rt_].k); + break; + } + } else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + switch (_Rd_) { + case 13: + AND32ItoR(EAX, ~(0xfc00)); + break; + } + MOV32RtoM((u32)&psxRegs.CP0.r[_Rd_], EAX); + } + + if (_Rd_ == 12 || _Rd_ == 13) { + iFlushRegs(); + MOV32ItoM((u32)&psxRegs.pc, (u32)pc); + CALLFunc((u32)psxTestSWInts); + if (branch == 0) { + branch = 2; + iRet(); + } + } +} + +static void recCTC0() { +// Cop0->Rd = Rt + + recMTC0(); +} + +static void recRFE() { + MOV32MtoR(EAX, (u32)&psxRegs.CP0.n.Status); + MOV32RtoR(ECX, EAX); + AND32ItoR(EAX, 0xfffffff0); + AND32ItoR(ECX, 0x3c); + SHR32ItoR(ECX, 2); + OR32RtoR (EAX, ECX); + MOV32RtoM((u32)&psxRegs.CP0.n.Status, EAX); + + iFlushRegs(); + MOV32ItoM((u32)&psxRegs.pc, (u32)pc); + CALLFunc((u32)psxTestSWInts); + if (branch == 0) { + branch = 2; + iRet(); + } +} +//#endif + +#include "iGte.h" + +// + +static void recHLE() { + iFlushRegs(); + + MOV32ItoR(EAX, (u32)psxHLEt[psxRegs.code & 0xffff]); + CALL32R(EAX); + branch = 2; + iRet(); +} + +// + +static void (*recBSC[64])() = { + recSPECIAL, recREGIMM, recJ , recJAL , recBEQ , recBNE , recBLEZ, recBGTZ, + recADDI , recADDIU , recSLTI, recSLTIU, recANDI, recORI , recXORI, recLUI , + recCOP0 , recNULL , recCOP2, recNULL , recNULL, recNULL, recNULL, recNULL, + recNULL , recNULL , recNULL, recNULL , recNULL, recNULL, recNULL, recNULL, + recLB , recLH , recLWL , recLW , recLBU , recLHU , recLWR , recNULL, + recSB , recSH , recSWL , recSW , recNULL, recNULL, recSWR , recNULL, + recNULL , recNULL , recLWC2, recNULL , recNULL, recNULL, recNULL, recNULL, + recNULL , recNULL , recSWC2, recHLE , recNULL, recNULL, recNULL, recNULL +}; + +static void (*recSPC[64])() = { + recSLL , recNULL, recSRL , recSRA , recSLLV , recNULL , recSRLV, recSRAV, + recJR , recJALR, recNULL, recNULL, recSYSCALL, recBREAK, recNULL, recNULL, + recMFHI, recMTHI, recMFLO, recMTLO, recNULL , recNULL , recNULL, recNULL, + recMULT, recMULTU, recDIV, recDIVU, recNULL , recNULL , recNULL, recNULL, + recADD , recADDU, recSUB , recSUBU, recAND , recOR , recXOR , recNOR , + recNULL, recNULL, recSLT , recSLTU, recNULL , recNULL , recNULL, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL , recNULL , recNULL, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL , recNULL , recNULL, recNULL +}; + +static void (*recREG[32])() = { + recBLTZ , recBGEZ , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recNULL , recNULL , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recBLTZAL, recBGEZAL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recNULL , recNULL , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL +}; + +static void (*recCP0[32])() = { + recMFC0, recNULL, recCFC0, recNULL, recMTC0, recNULL, recCTC0, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recRFE , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL +}; + +static void (*recCP2[64])() = { + recBASIC, recRTPS , recNULL , recNULL, recNULL, recNULL , recNCLIP, recNULL, // 00 + recNULL , recNULL , recNULL , recNULL, recOP , recNULL , recNULL , recNULL, // 08 + recDPCS , recINTPL, recMVMVA, recNCDS, recCDP , recNULL , recNCDT , recNULL, // 10 + recNULL , recNULL , recNULL , recNCCS, recCC , recNULL , recNCS , recNULL, // 18 + recNCT , recNULL , recNULL , recNULL, recNULL, recNULL , recNULL , recNULL, // 20 + recSQR , recDCPL , recDPCT , recNULL, recNULL, recAVSZ3, recAVSZ4, recNULL, // 28 + recRTPT , recNULL , recNULL , recNULL, recNULL, recNULL , recNULL , recNULL, // 30 + recNULL , recNULL , recNULL , recNULL, recNULL, recGPF , recGPL , recNCCT // 38 +}; + +static void (*recCP2BSC[32])() = { + recMFC2, recNULL, recCFC2, recNULL, recMTC2, recNULL, recCTC2, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL +}; + +static void recRecompile() { + char *p; + char *ptr; + + dump = 0; + resp = 0; + + /* if x86Ptr reached the mem limit reset whole mem */ + if (((u32)x86Ptr - (u32)recMem) >= (RECMEM_SIZE - 0x10000)) + recReset(); + + x86Align(32); + ptr = x86Ptr; + + PC_REC32(psxRegs.pc) = (u32)x86Ptr; + pc = psxRegs.pc; + pcold = pc; + + for (count = 0; count < 500;) { + p = (char *)PSXM(pc); + if (p == NULL) recError(); + psxRegs.code = *(u32 *)p; +/* + if ((psxRegs.code >> 26) == 0x23) { // LW + int i; + u32 code; + + for (i=1;; i++) { + p = (char *)PSXM(pc+i*4); + if (p == NULL) recError(); + code = *(u32 *)p; + + if ((code >> 26) != 0x23 || + _fRs_(code) != _Rs_ || + _fImm_(code) != (_Imm_+i*4)) + break; + } + if (i > 1) { + recLWBlock(i); + pc = pc + i*4; continue; + } + } + + if ((psxRegs.code >> 26) == 0x2b) { // SW + int i; + u32 code; + + for (i=1;; i++) { + p = (char *)PSXM(pc+i*4); + if (p == NULL) recError(); + code = *(u32 *)p; + + if ((code >> 26) != 0x2b || + _fRs_(code) != _Rs_ || + _fImm_(code) != (_Imm_+i*4)) + break; + } + if (i > 1) { + recSWBlock(i); + pc = pc + i*4; continue; + } + }*/ + + pc += 4; + count++; + recBSC[psxRegs.code >> 26](); + + if (branch) { + branch = 0; + if (dump) iDumpBlock(ptr); + return; + } + } + + iFlushRegs(); + + MOV32ItoM((u32)&psxRegs.pc, pc); + + iRet(); +} + +R3000Acpu psxRec = { + recInit, + recReset, + recExecute, + recExecuteBlock, + recClear, + recShutdown +}; diff --git a/libpcsxcore/ix86/ix86.c b/libpcsxcore/ix86/ix86.c new file mode 100644 index 0000000..d701e89 --- /dev/null +++ b/libpcsxcore/ix86/ix86.c @@ -0,0 +1,1723 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* + * ix86 core v0.5.1 + * Authors: linuzappz + * alexey silinov + */ + +#include "ix86.h" + +s8 *x86Ptr; +u8 *j8Ptr[32]; +u32 *j32Ptr[32]; + +void x86Init() { +} + +void x86SetPtr(char *ptr) { + x86Ptr = ptr; +} + +void x86Shutdown() { +} + +void x86SetJ8(u8 *j8) { + u32 jump = (x86Ptr - (s8*)j8) - 1; + + if (jump > 0x7f) printf("j8 greater than 0x7f!!\n"); + *j8 = (u8)jump; +} + +void x86SetJ32(u32 *j32) { + *j32 = (x86Ptr - (s8*)j32) - 4; +} + +void x86Align(int bytes) { + // fordward align + x86Ptr = (s8*)(((u32)x86Ptr + bytes) & ~(bytes - 1)); +} + +#define SIB 4 +#define DISP32 5 + +/* macros helpers */ + +#define ModRM(mod, rm, reg) \ + write8((mod << 6) | (rm << 3) | (reg)); + +#define SibSB(ss, rm, index) \ + write8((ss << 6) | (rm << 3) | (index)); + +#define SET8R(cc, to) { \ + write8(0x0F); write8(cc); \ + write8((0xC0) | (to)); } + +#define J8Rel(cc, to) { \ + write8(cc); write8(to); return x86Ptr - 1; } + +#define J32Rel(cc, to) { \ + write8(0x0F); write8(cc); write32(to); return (u32*)(x86Ptr - 4); } + +#define CMOV32RtoR(cc, to, from) { \ + write8(0x0F); write8(cc); \ + ModRM(3, to, from); } + +#define CMOV32MtoR(cc, to, from) { \ + write8(0x0F); write8(cc); \ + ModRM(0, to, DISP32); \ + write32(from); } + +/********************/ +/* IX86 intructions */ +/********************/ + +// mov instructions + +/* mov r32 to r32 */ +void MOV32RtoR(int to, int from) { + write8(0x89); + ModRM(3, from, to); +} + +/* mov r32 to m32 */ +void MOV32RtoM(u32 to, int from) { + write8(0x89); + ModRM(0, from, DISP32); + write32(to); +} + +/* mov m32 to r32 */ +void MOV32MtoR(int to, u32 from) { + write8(0x8B); + ModRM(0, to, DISP32); + write32(from); +} + +/* mov [r32] to r32 */ +void MOV32RmtoR(int to, int from) { + write8(0x8B); + ModRM(0, to, from); +} + +/* mov [r32][r32*scale] to r32 */ +void MOV32RmStoR(int to, int from, int from2, int scale) { + write8(0x8B); + ModRM(0, to, 0x4); + SibSB(scale, from2, from); +} + +/* mov r32 to [r32] */ +void MOV32RtoRm(int to, int from) { + write8(0x89); + ModRM(0, from, to); +} + +/* mov r32 to [r32][r32*scale] */ +void MOV32RtoRmS(int to, int to2, int scale, int from) { + write8(0x89); + ModRM(0, from, 0x4); + SibSB(scale, to2, to); +} + +/* mov imm32 to r32 */ +void MOV32ItoR(int to, u32 from) { + write8(0xB8 | to); + write32(from); +} + +/* mov imm32 to m32 */ +void MOV32ItoM(u32 to, u32 from) { + write8(0xC7); + ModRM(0, 0, DISP32); + write32(to); + write32(from); +} + +/* mov r16 to m16 */ +void MOV16RtoM(u32 to, int from) { + write8(0x66); + write8(0x89); + ModRM(0, from, DISP32); + write32(to); +} + +/* mov m16 to r16 */ +void MOV16MtoR(int to, u32 from) { + write8(0x66); + write8(0x8B); + ModRM(0, to, DISP32); + write32(from); +} + +/* mov imm16 to m16 */ +void MOV16ItoM(u32 to, u16 from) { + write8(0x66); + write8(0xC7); + ModRM(0, 0, DISP32); + write32(to); + write16(from); +} + +/* mov r8 to m8 */ +void MOV8RtoM(u32 to, int from) { + write8(0x88); + ModRM(0, from, DISP32); + write32(to); +} + +/* mov m8 to r8 */ +void MOV8MtoR(int to, u32 from) { + write8(0x8A); + ModRM(0, to, DISP32); + write32(from); +} + +/* mov imm8 to m8 */ +void MOV8ItoM(u32 to, u8 from) { + write8(0xC6); + ModRM(0, 0, DISP32); + write32(to); + write8(from); +} + +/* movsx r8 to r32 */ +void MOVSX32R8toR(int to, int from) { + write16(0xBE0F); + ModRM(3, to, from); +} + +/* movsx m8 to r32 */ +void MOVSX32M8toR(int to, u32 from) { + write16(0xBE0F); + ModRM(0, to, DISP32); + write32(from); +} + +/* movsx r16 to r32 */ +void MOVSX32R16toR(int to, int from) { + write16(0xBF0F); + ModRM(3, to, from); +} + +/* movsx m16 to r32 */ +void MOVSX32M16toR(int to, u32 from) { + write16(0xBF0F); + ModRM(0, to, DISP32); + write32(from); +} + +/* movzx r8 to r32 */ +void MOVZX32R8toR(int to, int from) { + write16(0xB60F); + ModRM(3, to, from); +} + +/* movzx m8 to r32 */ +void MOVZX32M8toR(int to, u32 from) { + write16(0xB60F); + ModRM(0, to, DISP32); + write32(from); +} + +/* movzx r16 to r32 */ +void MOVZX32R16toR(int to, int from) { + write16(0xB70F); + ModRM(3, to, from); +} + +/* movzx m16 to r32 */ +void MOVZX32M16toR(int to, u32 from) { + write16(0xB70F); + ModRM(0, to, DISP32); + write32(from); +} + +/* cmovne r32 to r32 */ +void CMOVNE32RtoR(int to, int from) { + CMOV32RtoR(0x45, to, from); +} + +/* cmovne m32 to r32*/ +void CMOVNE32MtoR(int to, u32 from) { + CMOV32MtoR(0x45, to, from); +} + +/* cmove r32 to r32*/ +void CMOVE32RtoR(int to, int from) { + CMOV32RtoR(0x44, to, from); +} + +/* cmove m32 to r32*/ +void CMOVE32MtoR(int to, u32 from) { + CMOV32MtoR(0x44, to, from); +} + +/* cmovg r32 to r32*/ +void CMOVG32RtoR(int to, int from) { + CMOV32RtoR(0x4F, to, from); +} + +/* cmovg m32 to r32*/ +void CMOVG32MtoR(int to, u32 from) { + CMOV32MtoR(0x4F, to, from); +} + +/* cmovge r32 to r32*/ +void CMOVGE32RtoR(int to, int from) { + CMOV32RtoR(0x4D, to, from); +} + +/* cmovge m32 to r32*/ +void CMOVGE32MtoR(int to, u32 from) { + CMOV32MtoR(0x4D, to, from); +} + +/* cmovl r32 to r32*/ +void CMOVL32RtoR(int to, int from) { + CMOV32RtoR(0x4C, to, from); +} + +/* cmovl m32 to r32*/ +void CMOVL32MtoR(int to, u32 from) { + CMOV32MtoR(0x4C, to, from); +} + +/* cmovle r32 to r32*/ +void CMOVLE32RtoR(int to, int from) { + CMOV32RtoR(0x4E, to, from); +} + +/* cmovle m32 to r32*/ +void CMOVLE32MtoR(int to, u32 from) { + CMOV32MtoR(0x4E, to, from); +} + +// arithmic instructions + +/* add imm32 to r32 */ +void ADD32ItoR(int to, u32 from) { + if (to == EAX) { + write8(0x05); + } else { + write8(0x81); + ModRM(3, 0, to); + } + write32(from); +} + +/* add imm32 to m32 */ +void ADD32ItoM(u32 to, u32 from) { + write8(0x81); + ModRM(0, 0, DISP32); + write32(to); + write32(from); +} + +/* add r32 to r32 */ +void ADD32RtoR(int to, int from) { + write8(0x01); + ModRM(3, from, to); +} + +/* add r32 to m32 */ +void ADD32RtoM(u32 to, int from) { + write8(0x01); + ModRM(0, from, DISP32); + write32(to); +} + +/* add m32 to r32 */ +void ADD32MtoR(int to, u32 from) { + write8(0x03); + ModRM(0, to, DISP32); + write32(from); +} + +/* adc imm32 to r32 */ +void ADC32ItoR(int to, u32 from) { + if (to == EAX) { + write8(0x15); + } else { + write8(0x81); + ModRM(3, 2, to); + } + write32(from); +} + +/* adc r32 to r32 */ +void ADC32RtoR(int to, int from) { + write8(0x11); + ModRM(3, from, to); +} + +/* adc m32 to r32 */ +void ADC32MtoR(int to, u32 from) { + write8(0x13); + ModRM(0, to, DISP32); + write32(from); +} + +/* inc r32 */ +void INC32R(int to) { + write8(0x40 + to); +} + +/* inc m32 */ +void INC32M(u32 to) { + write8(0xFF); + ModRM(0, 0, DISP32); + write32(to); +} + +/* sub imm32 to r32 */ +void SUB32ItoR(int to, u32 from) { + if (to == EAX) { + write8(0x2D); + } else { + write8(0x81); + ModRM(3, 5, to); + } + write32(from); +} + +/* sub r32 to r32 */ +void SUB32RtoR(int to, int from) { + write8(0x29); + ModRM(3, from, to); +} + +/* sub m32 to r32 */ +void SUB32MtoR(int to, u32 from) { + write8(0x2B); + ModRM(0, to, DISP32); + write32(from); +} + +/* sbb imm32 to r32 */ +void SBB32ItoR(int to, u32 from) { + if (to == EAX) { + write8(0x1D); + } else { + write8(0x81); + ModRM(3, 3, to); + } + write32(from); +} + +/* sbb r32 to r32 */ +void SBB32RtoR(int to, int from) { + write8(0x19); + ModRM(3, from, to); +} + +/* sbb m32 to r32 */ +void SBB32MtoR(int to, u32 from) { + write8(0x1B); + ModRM(0, to, DISP32); + write32(from); +} + +/* dec r32 */ +void DEC32R(int to) { + write8(0x48 + to); +} + +/* dec m32 */ +void DEC32M(u32 to) { + write8(0xFF); + ModRM(0, 1, DISP32); + write32(to); +} + +/* mul eax by r32 to edx:eax */ +void MUL32R(int from) { + write8(0xF7); + ModRM(3, 4, from); +} + +/* imul eax by r32 to edx:eax */ +void IMUL32R(int from) { + write8(0xF7); + ModRM(3, 5, from); +} + +/* mul eax by m32 to edx:eax */ +void MUL32M(u32 from) { + write8(0xF7); + ModRM(0, 4, DISP32); + write32(from); +} + +/* imul eax by m32 to edx:eax */ +void IMUL32M(u32 from) { + write8(0xF7); + ModRM(0, 5, DISP32); + write32(from); +} + +/* imul r32 by r32 to r32 */ +void IMUL32RtoR(int to, int from) { + write16(0xAF0F); + ModRM(3, to, from); +} + +/* div eax by r32 to edx:eax */ +void DIV32R(int from) { + write8(0xF7); + ModRM(3, 6, from); +} + +/* idiv eax by r32 to edx:eax */ +void IDIV32R(int from) { + write8(0xF7); + ModRM(3, 7, from); +} + +/* div eax by m32 to edx:eax */ +void DIV32M(u32 from) { + write8(0xF7); + ModRM(0, 6, DISP32); + write32(from); +} + +/* idiv eax by m32 to edx:eax */ +void IDIV32M(u32 from) { + write8(0xF7); + ModRM(0, 7, DISP32); + write32(from); +} + +// shifting instructions + +void RCR32ItoR(int to,int from) +{ + if (from==1) + { + write8(0xd1); + write8(0xd8 | to); + } + else + { + write8(0xc1); + write8(0xd8 | to); + write8(from); + } +} + +/* shl imm8 to r32 */ +void SHL32ItoR(int to, u8 from) { + if (from==1) + { + write8(0xd1); + write8(0xe0 | to); + return; + } + write8(0xC1); + ModRM(3, 4, to); + write8(from); +} + +/* shl cl to r32 */ +void SHL32CLtoR(int to) { + write8(0xD3); + ModRM(3, 4, to); +} + +/* shr imm8 to r32 */ +void SHR32ItoR(int to, u8 from) { + if (from==1) + { + write8(0xd1); + write8(0xe8 | to); + return; + } + write8(0xC1); + ModRM(3, 5, to); + write8(from); +} + +/* shr cl to r32 */ +void SHR32CLtoR(int to) { + write8(0xD3); + ModRM(3, 5, to); +} + +/* sar imm8 to r32 */ +void SAR32ItoR(int to, u8 from) { + write8(0xC1); + ModRM(3, 7, to); + write8(from); +} + +/* sar cl to r32 */ +void SAR32CLtoR(int to) { + write8(0xD3); + ModRM(3, 7, to); +} + + +// logical instructions + +/* or imm32 to r32 */ +void OR32ItoR(int to, u32 from) { + if (to == EAX) { + write8(0x0D); + } else { + write8(0x81); + ModRM(3, 1, to); + } + write32(from); +} + +/* or imm32 to m32 */ +void OR32ItoM(u32 to, u32 from) { + write8(0x81); + ModRM(0, 1, DISP32); + write32(to); + write32(from); +} + +/* or r32 to r32 */ +void OR32RtoR(int to, int from) { + write8(0x09); + ModRM(3, from, to); +} + +/* or r32 to m32 */ +void OR32RtoM(u32 to, int from) { + write8(0x09); + ModRM(0, from, DISP32); + write32(to); +} + +/* or m32 to r32 */ +void OR32MtoR(int to, u32 from) { + write8(0x0B); + ModRM(0, to, DISP32); + write32(from); +} + +/* xor imm32 to r32 */ +void XOR32ItoR(int to, u32 from) { + if (to == EAX) { + write8(0x35); + } else { + write8(0x81); + ModRM(3, 6, to); + } + write32(from); +} + +/* xor imm32 to m32 */ +void XOR32ItoM(u32 to, u32 from) { + write8(0x81); + ModRM(0, 6, DISP32); + write32(to); + write32(from); +} + +/* xor r32 to r32 */ +void XOR32RtoR(int to, int from) { + write8(0x31); + ModRM(3, from, to); +} + +/* xor r32 to m32 */ +void XOR32RtoM(u32 to, int from) { + write8(0x31); + ModRM(0, from, DISP32); + write32(to); +} + +/* xor m32 to r32 */ +void XOR32MtoR(int to, u32 from) { + write8(0x33); + ModRM(0, to, DISP32); + write32(from); +} + +/* and imm32 to r32 */ +void AND32ItoR(int to, u32 from) { + if (to == EAX) { + write8(0x25); + } else { + write8(0x81); + ModRM(3, 0x4, to); + } + write32(from); +} + +/* and imm32 to m32 */ +void AND32ItoM(u32 to, u32 from) { + write8(0x81); + ModRM(0, 0x4, DISP32); + write32(to); + write32(from); +} + +/* and r32 to r32 */ +void AND32RtoR(int to, int from) { + write8(0x21); + ModRM(3, from, to); +} + +/* and r32 to m32 */ +void AND32RtoM(u32 to, int from) { + write8(0x21); + ModRM(0, from, DISP32); + write32(to); +} + +/* and m32 to r32 */ +void AND32MtoR(int to, u32 from) { + write8(0x23); + ModRM(0, to, DISP32); + write32(from); +} + +/* not r32 */ +void NOT32R(int from) { + write8(0xF7); + ModRM(3, 2, from); +} + +/* neg r32 */ +void NEG32R(int from) { + write8(0xF7); + ModRM(3, 3, from); +} + +// jump instructions + +/* jmp rel8 */ +u8* JMP8(u8 to) { + write8(0xEB); + write8(to); + return x86Ptr - 1; +} + +/* jmp rel32 */ +u32* JMP32(u32 to) { + write8(0xE9); + write32(to); + return (u32*)(x86Ptr - 4); +} + +/* jmp r32 */ +void JMP32R(int to) { + write8(0xFF); + ModRM(3, 4, to); +} + +/* je rel8 */ +u8* JE8(u8 to) { + J8Rel(0x74, to); +} + +/* jz rel8 */ +u8* JZ8(u8 to) { + J8Rel(0x74, to); +} + +/* jg rel8 */ +u8* JG8(u8 to) { + J8Rel(0x7F, to); +} + +/* jge rel8 */ +u8* JGE8(u8 to) { + J8Rel(0x7D, to); +} + +/* jl rel8 */ +u8* JL8(u8 to) { + J8Rel(0x7C, to); +} + +/* jle rel8 */ +u8* JLE8(u8 to) { + J8Rel(0x7E, to); +} + +/* jne rel8 */ +u8* JNE8(u8 to) { + J8Rel(0x75, to); +} + +/* jnz rel8 */ +u8* JNZ8(u8 to) { + J8Rel(0x75, to); +} + +/* jng rel8 */ +u8* JNG8(u8 to) { + J8Rel(0x7E, to); +} + +/* jnge rel8 */ +u8* JNGE8(u8 to) { + J8Rel(0x7C, to); +} + +/* jnl rel8 */ +u8* JNL8(u8 to) { + J8Rel(0x7D, to); +} + +/* jnle rel8 */ +u8* JNLE8(u8 to) { + J8Rel(0x7F, to); +} + +/* jo rel8 */ +u8* JO8(u8 to) { + J8Rel(0x70, to); +} + +/* jno rel8 */ +u8* JNO8(u8 to) { + J8Rel(0x71, to); +} + +/* je rel32 */ +u32* JE32(u32 to) { + J32Rel(0x84, to); +} + +/* jz rel32 */ +u32* JZ32(u32 to) { + J32Rel(0x84, to); +} + +/* jg rel32 */ +u32* JG32(u32 to) { + J32Rel(0x8F, to); +} + +/* jge rel32 */ +u32* JGE32(u32 to) { + J32Rel(0x8D, to); +} + +/* jl rel32 */ +u32* JL32(u32 to) { + J32Rel(0x8C, to); +} + +/* jle rel32 */ +u32* JLE32(u32 to) { + J32Rel(0x8E, to); +} + +/* jne rel32 */ +u32* JNE32(u32 to) { + J32Rel(0x85, to); +} + +/* jnz rel32 */ +u32* JNZ32(u32 to) { + J32Rel(0x85, to); +} + +/* jng rel32 */ +u32* JNG32(u32 to) { + J32Rel(0x8E, to); +} + +/* jnge rel32 */ +u32* JNGE32(u32 to) { + J32Rel(0x8C, to); +} + +/* jnl rel32 */ +u32* JNL32(u32 to) { + J32Rel(0x8D, to); +} + +/* jnle rel32 */ +u32* JNLE32(u32 to) { + J32Rel(0x8F, to); +} + +/* jo rel32 */ +u32* JO32(u32 to) { + J32Rel(0x80, to); +} + +/* jno rel32 */ +u32* JNO32(u32 to) { + J32Rel(0x81, to); +} + +/* call func */ +void CALLFunc(u32 func) { + CALL32(func - ((u32)x86Ptr + 5)); +} + +/* call rel32 */ +void CALL32(u32 to) { + write8(0xE8); + write32(to); +} + +/* call r32 */ +void CALL32R(int to) { + write8(0xFF); + ModRM(3, 2, to); +} + +/* call m32 */ +void CALL32M(u32 to) { + write8(0xFF); + ModRM(0, 2, DISP32); + write32(to); +} + +// misc instructions + +/* cmp imm32 to r32 */ +void CMP32ItoR(int to, u32 from) { + if (to == EAX) { + write8(0x3D); + } else { + write8(0x81); + ModRM(3, 7, to); + } + write32(from); +} + +/* cmp imm32 to m32 */ +void CMP32ItoM(u32 to, u32 from) { + write8(0x81); + ModRM(0, 7, DISP32); + write32(to); + write32(from); +} + +/* cmp r32 to r32 */ +void CMP32RtoR(int to, int from) { + write8(0x39); + ModRM(3, from, to); +} + +/* cmp m32 to r32 */ +void CMP32MtoR(int to, u32 from) { + write8(0x3B); + ModRM(0, to, DISP32); + write32(from); +} + +/* test imm32 to r32 */ +void TEST32ItoR(int to, u32 from) { + if (to == EAX) { + write8(0xA9); + } else { + write8(0xF7); + ModRM(3, 0, to); + } + write32(from); +} + +/* test r32 to r32 */ +void TEST32RtoR(int to, int from) { + write8(0x85); + ModRM(3, from, to); +} + +void BT32ItoR(int to,int from) +{ + write16(0xba0f); + write8(0xe0 | to); + write8(from); +} + +/* sets r8 */ +void SETS8R(int to) { + SET8R(0x98, to); +} +/* setl r8 */ +void SETL8R(int to) { + SET8R(0x9C, to); +} + +/* setb r8 */ +void SETB8R(int to) { + SET8R(0x92, to); +} + +/* setnz r8 */ +void SETNZ8R(int to) { + SET8R(0x95,to); +} + +/* cbw */ +void CBW() { + write16(0x9866); +} + +/* cwd */ +void CWD() { + write8(0x98); +} + +/* cdq */ +void CDQ() { + write8(0x99); +} + +/* push r32 */ +void PUSH32R(int from) { + write8(0x50 | from); +} + +/* push m32 */ +void PUSH32M(u32 from) { + write8(0xFF); + ModRM(0, 6, DISP32); + write32(from); +} + +/* push imm32 */ +void PUSH32I(u32 from) { + write8(0x68); write32(from); +} + +/* pop r32 */ +void POP32R(int from) { + write8(0x58 | from); +} + +/* pushad */ +void PUSHA32() { + write8(0x60); +} + +/* popad */ +void POPA32() { + write8(0x61); +} + +/* ret */ +void RET() { + write8(0xC3); +} + +/********************/ +/* FPU instructions */ +/********************/ + +//Added:basara 14.01.2003 +/* compare m32 to fpu reg stack */ +void FCOMP32(u32 from) { + write8(0xD8); + ModRM(0, 0x3, DISP32); + write32(from); +} + +void FNSTSWtoAX() { + write16(0xE0DF); +} + +/* fild m32 to fpu reg stack */ +void FILD32(u32 from) { + write8(0xDB); + ModRM(0, 0x0, DISP32); + write32(from); +} + +/* fistp m32 from fpu reg stack */ +void FISTP32(u32 from) { + write8(0xDB); + ModRM(0, 0x3, DISP32); + write32(from); +} + +/* fld m32 to fpu reg stack */ +void FLD32(u32 from) { + write8(0xD9); + ModRM(0, 0x0, DISP32); + write32(from); +} + +/* fstp m32 from fpu reg stack */ +void FSTP32(u32 to) { + write8(0xD9); + ModRM(0, 0x3, DISP32); + write32(to); +} + +// + +/* fldcw fpu control word from m16 */ +void FLDCW(u32 from) { + write8(0xD9); + ModRM(0, 0x5, DISP32); + write32(from); +} + +/* fnstcw fpu control word to m16 */ +void FNSTCW(u32 to) { + write8(0xD9); + ModRM(0, 0x7, DISP32); + write32(to); +} + +// + +/* fadd m32 to fpu reg stack */ +void FADD32(u32 from) { + write8(0xD8); + ModRM(0, 0x0, DISP32); + write32(from); +} + +/* fsub m32 to fpu reg stack */ +void FSUB32(u32 from) { + write8(0xD8); + ModRM(0, 0x4, DISP32); + write32(from); +} + +/* fmul m32 to fpu reg stack */ +void FMUL32(u32 from) { + write8(0xD8); + ModRM(0, 0x1, DISP32); + write32(from); +} + +/* fdiv m32 to fpu reg stack */ +void FDIV32(u32 from) { + write8(0xD8); + ModRM(0, 0x6, DISP32); + write32(from); +} + +/* fabs fpu reg stack */ +void FABS() { + write16(0xE1D9); +} + +/* fsqrt fpu reg stack */ +void FSQRT() { + write16(0xFAD9); +} + +/* fchs fpu reg stack */ +void FCHS() { + write16(0xE0D9); +} + +/********************/ +/* MMX instructions */ +/********************/ + +// r64 = mm + +/* movq m64 to r64 */ +void MOVQMtoR(int to, u32 from) { + write16(0x6F0F); + ModRM(0, to, DISP32); + write32(from); +} + +/* movq r64 to m64 */ +void MOVQRtoM(u32 to, int from) { + write16(0x7F0F); + ModRM(0, from, DISP32); + write32(to); +} + +/* pand r64 to r64 */ +void PANDRtoR(int to, int from) { + write16(0xDB0F); + ModRM(3, to, from); +} + +/* pand r64 to r64 */ +void PANDNRtoR(int to, int from) { + write16(0xDF0F); + ModRM(3, to, from); +} + +/* por r64 to r64 */ +void PORRtoR(int to, int from) { + write16(0xEB0F); + ModRM(3, to, from); +} + +/* pxor r64 to r64 */ +void PXORRtoR(int to, int from) { + write16(0xEF0F); + ModRM(3, to, from); +} + +/* psllq r64 to r64 */ +void PSLLQRtoR(int to, int from) { + write16(0xF30F); + ModRM(3, to, from); +} + +/* psllq m64 to r64 */ +void PSLLQMtoR(int to, u32 from) { + write16(0xF30F); + ModRM(0, to, DISP32); + write32(from); +} + +/* psllq imm8 to r64 */ +void PSLLQItoR(int to, u8 from) { + write16(0x730F); + ModRM(3, 6, to); + write8(from); +} + +/* psrlq r64 to r64 */ +void PSRLQRtoR(int to, int from) { + write16(0xD30F); + ModRM(3, to, from); +} + +/* psrlq m64 to r64 */ +void PSRLQMtoR(int to, u32 from) { + write16(0xD30F); + ModRM(0, to, DISP32); + write32(from); +} + +/* psrlq imm8 to r64 */ +void PSRLQItoR(int to, u8 from) { + write16(0x730F); + ModRM(3, 2, to); + write8(from); +} + +/* paddusb r64 to r64 */ +void PADDUSBRtoR(int to, int from) { + write16(0xDC0F); + ModRM(3, to, from); +} + +/* paddusb m64 to r64 */ +void PADDUSBMtoR(int to, u32 from) { + write16(0xDC0F); + ModRM(0, to, DISP32); + write32(from); +} + +/* paddusw r64 to r64 */ +void PADDUSWRtoR(int to, int from) { + write16(0xDD0F); + ModRM(3, to, from); +} + +/* paddusw m64 to r64 */ +void PADDUSWMtoR(int to, u32 from) { + write16(0xDD0F); + ModRM(0, to, DISP32); + write32(from); +} + +/* paddb r64 to r64 */ +void PADDBRtoR(int to, int from) { + write16(0xFC0F); + ModRM(3, to, from); +} + +/* paddb m64 to r64 */ +void PADDBMtoR(int to, u32 from) { + write16(0xFC0F); + ModRM(0, to, DISP32); + write32(from); +} + +/* paddw r64 to r64 */ +void PADDWRtoR(int to, int from) { + write16(0xFD0F); + ModRM(3, to, from); +} + +/* paddw m64 to r64 */ +void PADDWMtoR(int to, u32 from) { + write16(0xFD0F); + ModRM(0, to, DISP32); + write32(from); +} + +/* paddd r64 to r64 */ +void PADDDRtoR(int to, int from) { + write16(0xFE0F); + ModRM(3, to, from); +} + +/* paddd m64 to r64 */ +void PADDDMtoR(int to, u32 from) { + write16(0xFE0F); + ModRM(0, to, DISP32); + write32(from); +} + +/* emms */ +void EMMS() { + //use femms if we have 3dnow + write16(0x0e0f); + return; +} + +/* femms */ +void FEMMS() { + write16(0x770F); + return; +} + +//Basara:changed +void PADDSBRtoR(int to, int from) { + write16(0xEC0F); + ModRM(3, to, from); +} + +void PADDSWRtoR(int to, int from) { + write16(0xED0F); + ModRM(3, to, from); +} + +void PADDSDRtoR(int to, int from) { + write16(0xEE0F); + ModRM(3, to, from); +} + +void PSUBSBRtoR(int to, int from) { + write16(0xE80F); + ModRM(3, to, from); +} + +void PSUBSWRtoR(int to, int from) { + write16(0xE90F); + ModRM(3, to, from); +} + +void PSUBSDRtoR(int to, int from) { + write16(0xEA0F); + ModRM(3, to, from); +} + +void PSUBBRtoR(int to, int from) { + write16(0xF80F); + ModRM(3, to, from); +} + +void PSUBWRtoR(int to, int from) { + write16(0xF90F); + ModRM(3, to, from); +} + +void PSUBDRtoR(int to, int from) { + write16(0xFA0F); + ModRM(3, to, from); +} + +//changed:basara +//P.s.It's sux.Don't use it offten. +void MOVQ64ItoR(int reg,u64 i) +{ + MOVQMtoR(reg,(u32)(x86Ptr)+2+7); + JMP8(8); + write64(i); +} + +void PSUBUSBRtoR(int to, int from) { + write16(0xD80F); + ModRM(3, to, from); +} + +void PSUBUSWRtoR(int to, int from) { + write16(0xD90F); + ModRM(3, to, from); +} + +void PMAXSWRtoR(int to,int from) +{ + write16(0xEE0F); + ModRM(3, to, from); +} + +void PMINSWRtoR(int to,int from) +{ + write16(0xEA0F); + ModRM(3, to, from); +} + +void PCMPEQBRtoR(int to,int from) +{ + write16(0x740F); + ModRM(3, to, from); +} + +void PCMPEQWRtoR(int to,int from) +{ + write16(0x750F); + ModRM(3, to, from); +} + +void PCMPEQDRtoR(int to,int from) +{ + write16(0x760F); + ModRM(3, to, from); +} + +void PCMPGTBRtoR(int to,int from) +{ + write16(0x640F); + ModRM(3, to, from); +} + +void PCMPGTWRtoR(int to,int from) +{ + write16(0x650F); + ModRM(3, to, from); +} + +void PCMPGTDRtoR(int to,int from) +{ + write16(0x660F); + ModRM(3, to, from); +} + +//Basara:Added 10.01.2003 +void PSRLWItoR(int to,int from) +{ + write16(0x710f); + ModRM(2, 2 , to); + write8(from); +} +void PSRLDItoR(int to,int from) +{ + write16(0x720f); + ModRM(2, 2 , to); + write8(from); +} + +void PSLLWItoR(int to,int from) +{ + write16(0x710f); + ModRM(3, 6 , to); + write8(from); +} + +void PSLLDItoR(int to,int from) +{ + write16(0x720f); + ModRM(3, 6 , to); + write8(from); +} + +void PSRAWItoR(int to,int from) +{ + write16(0x710f); + ModRM(3, 4 , to); + write8(from); +} + +void PSRADItoR(int to,int from) +{ + write16(0x720f); + ModRM(3, 4 , to); + write8(from); +} + +/* por m64 to r64 */ +void PORMtoR(int to, u32 from) { + write16(0xEB0F); + ModRM(0, to, DISP32); + write32(from); +} + +/* pxor m64 to r64 */ +void PXORMtoR(int to, u32 from) { + write16(0xEF0F); + ModRM(0, to, DISP32); + write32(from); +} + +/* pand m64 to r64 */ +void PANDMtoR(int to, u32 from) { + write16(0xDB0F); + ModRM(0, to, DISP32); + write32(from); +} + +/* pandn m64 to r64 */ +void PANDNMtoR(int to, u32 from) { + write16(0xDF0F); + ModRM(0, to, DISP32); + write32(from); +} + +/* movd m32 to r64 */ +void MOVDMtoR(int to, u32 from) { + write16(0x6E0F); + ModRM(0, to, DISP32); + write32(from); +} + +/* movq r64 to m32 */ +void MOVDRtoM(u32 to, int from) { + write16(0x7E0F); + ModRM(0, from, DISP32); + write32(to); +} + +/* movd r32 to r64 */ +void MOVD32RtoR(int to, int from) { + write16(0x6E0F); + ModRM(3, to,from); +} + +/* movq r64 to r32 */ +void MOVD64RtoR(int to, int from) { + write16(0x7E0F); + ModRM(3, from,to); +} + +void MOVQRtoR(int to, int from) { + write16(0x6F0F); + ModRM(3, to,from); +} + +void PUNPCKHDQRtoR(int to, int from) { + write16(0x6A0F); + ModRM(3, to,from); +} + +void PUNPCKLDQRtoR(int to, int from) { + write16(0x620F); + ModRM(3, to,from); +} + +////////////////////////////////////////////////////////////////////////// +// SSE intructions +////////////////////////////////////////////////////////////////////////// + +void MOVAPSMtoR(int to, int from) { + write16(0x280f); + ModRM(0, to, DISP32); + write32(from); +} + +void MOVAPSRtoM(int to, int from) { + write16(0x2b0f); + ModRM(0, from, DISP32); + write32(to); +} + +void MOVAPSRtoR(int to, int from) { + write16(0x290f); + ModRM(3, to,from); +} + +void ORPSMtoR(int to, int from) { + write16(0x560f); + ModRM(0, to, DISP32); + write32(from); +} + +void ORPSRtoR(int to, int from) { + write16(0x560f); + ModRM(3, to,from); +} + +void XORPSMtoR(int to, int from) { + write16(0x570f); + ModRM(0, to, DISP32); + write32(from); +} + +void XORPSRtoR(int to, int from) { + write16(0x570f); + ModRM(3, to,from); +} + +void ANDPSMtoR(int to, int from) { + write16(0x540f); + ModRM(0, to, DISP32); + write32(from); +} + +void ANDPSRtoR(int to, int from) { + write16(0x540f); + ModRM(3, to,from); +} + +/* + 3DNOW intructions +*/ + +void PFCMPEQMtoR(int to, int from) { + write16(0x0f0f); + ModRM(0, to, DISP32); + write32(from); + write8(0xb0); +} + +void PFCMPGTMtoR(int to, int from) { + write16(0x0f0f); + ModRM(0, to, DISP32); + write32(from); + write8(0xa0); +} + +void PFCMPGEMtoR(int to, int from) { + write16(0x0f0f); + ModRM(0, to, DISP32); + write32(from); + write8(0x90); +} + +void PFADDMtoR(int to, int from) { + write16(0x0f0f); + ModRM(0, to, DISP32); + write32(from); + write8(0x9e); +} + +void PFADDRtoR(int to, int from) { + write16(0x0f0f); + ModRM(3, to, from); + write8(0x9e); +} + +void PFSUBMtoR(int to, int from) { + write16(0x0f0f); + ModRM(0, to, DISP32); + write32(from); + write8(0x9a); +} + +void PFSUBRtoR(int to, int from) { + write16(0x0f0f); + ModRM(3, to, from); + write8(0x9a); +} + +void PFMULMtoR(int to, int from) { + write16(0x0f0f); + ModRM(0, to, DISP32); + write32(from); + write8(0xb4); +} + +void PFMULRtoR(int to, int from) { + write16(0x0f0f); + ModRM(3, to,from); + write8(0xb4); +} + +void PFRCPMtoR(int to, int from) { + write16(0x0f0f); + ModRM(0, to, DISP32); + write32(from); + write8(0x96); +} + +void PFRCPRtoR(int to, int from) { + write16(0x0f0f); + ModRM(3, to,from); + write8(0x96); +} + +void PFRCPIT1RtoR(int to, int from) { + write16(0x0f0f); + ModRM(3, to,from); + write8(0xa6); +} + +void PFRCPIT2RtoR(int to, int from) { + write16(0x0f0f); + ModRM(3, to,from); + write8(0xb6); +} + +void PFRSQRTRtoR(int to, int from) { + write16(0x0f0f); + ModRM(3, to,from); + write8(0x97); +} + +void PFRSQIT1RtoR(int to, int from) { + write16(0x0f0f); + ModRM(3, to,from); + write8(0xa7); +} + +void PF2IDMtoR(int to, int from) { + write16(0x0f0f); + ModRM(0, to, DISP32); + write32(from); + write8(0x1d); +} + +void PF2IDRtoR(int to, int from) { + write16(0x0f0f); + ModRM(3, to, from); + write8(0x1d); +} + +void PI2FDMtoR(int to, int from) { + write16(0x0f0f); + ModRM(0, to, DISP32); + write32(from); + write8(0x0d); +} + +void PI2FDRtoR(int to, int from) { + write16(0x0f0f); + ModRM(3, to, from); + write8(0x0d); +} + +/* + 3DNOW Extension intructions +*/ + +void PFMAXMtoR(int to, int from) { + write16(0x0f0f); + ModRM(0, to, DISP32); + write32(from); + write8(0xa4); +} + +void PFMAXRtoR(int to, int from) { + write16(0x0f0f); + ModRM(3, to, from); + write8(0xa4); +} + +void PFMINMtoR(int to, int from) { + write16(0x0f0f); + ModRM(0, to, DISP32); + write32(from); + write8(0x94); +} + +void PFMINRtoR(int to, int from) { + write16(0x0f0f); + ModRM(3, to, from); + write8(0x94); +} diff --git a/libpcsxcore/ix86/ix86.h b/libpcsxcore/ix86/ix86.h new file mode 100644 index 0000000..2b60dff --- /dev/null +++ b/libpcsxcore/ix86/ix86.h @@ -0,0 +1,673 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* + * ix86 definitions v0.5.1 + * Authors: linuzappz + * alexey silinov + */ + +#ifndef __IX86_H__ +#define __IX86_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +// include basic types +#include "../psxcommon.h" +#include "../r3000a.h" +#include "../psxhle.h" + +// x86Flags defines +#define X86FLAG_FPU 0x00000001 +#define X86FLAG_VME 0x00000002 +#define X86FLAG_DEBUGEXT 0x00000004 +#define X86FLAG_4MPAGE 0x00000008 +#define X86FLAG_TSC 0x00000010 +#define X86FLAG_MSR 0x00000020 +#define X86FLAG_PAE 0x00000040 +#define X86FLAG_MCHKXCP 0x00000080 +#define X86FLAG_CMPXCHG8B 0x00000100 +#define X86FLAG_APIC 0x00000200 +#define X86FLAG_SYSENTER 0x00000800 +#define X86FLAG_MTRR 0x00001000 +#define X86FLAG_GPE 0x00002000 +#define X86FLAG_MCHKARCH 0x00004000 +#define X86FLAG_CMOV 0x00008000 +#define X86FLAG_PAT 0x00010000 +#define X86FLAG_PSE36 0x00020000 +#define X86FLAG_PN 0x00040000 +#define X86FLAG_MMX 0x00800000 +#define X86FLAG_FXSAVE 0x01000000 +#define X86FLAG_SSE 0x02000000 + +// x86EFlags defines + +#define X86EFLAG_MMXEXT 0x00400000 +#define X86EFLAG_3DNOWEXT 0x40000000 +#define X86EFLAG_3DNOW 0x80000000 + +/* general defines */ +#define write8(val) *(u8 *)x86Ptr = val; x86Ptr++; +#define write16(val) *(u16*)x86Ptr = val; x86Ptr+=2; +#define write32(val) *(u32*)x86Ptr = val; x86Ptr+=4; +#define write64(val) *(u64*)x86Ptr = val; x86Ptr+=8; + +#define EAX 0 +#define EBX 3 +#define ECX 1 +#define EDX 2 +#define ESI 6 +#define EDI 7 +#define EBP 5 +#define ESP 4 + +#define MM0 0 +#define MM1 1 +#define MM2 2 +#define MM3 3 +#define MM4 4 +#define MM5 5 +#define MM6 6 +#define MM7 7 + +#define XMM0 0 +#define XMM1 1 +#define XMM2 2 +#define XMM3 3 +#define XMM4 4 +#define XMM5 5 +#define XMM6 6 +#define XMM7 7 + +extern s8 *x86Ptr; +extern u8 *j8Ptr[32]; +extern u32 *j32Ptr[32]; + +void x86Init(); +void x86SetPtr(char *ptr); +void x86Shutdown(); + +void x86SetJ8(u8 *j8); +void x86SetJ32(u32 *j32); +void x86Align(int bytes); + + +/********************/ +/* IX86 intructions */ +/********************/ + +/* + * scale values: + * 0 - *1 + * 1 - *2 + * 2 - *4 + * 3 - *8 + */ + +//////////////////////////////////// +// mov instructions / +//////////////////////////////////// + +/* mov r32 to r32 */ +void MOV32RtoR(int to, int from); +/* mov r32 to m32 */ +void MOV32RtoM(u32 to, int from); +/* mov m32 to r32 */ +void MOV32MtoR(int to, u32 from); +/* mov [r32] to r32 */ +void MOV32RmtoR(int to, int from); +/* mov [r32][r32*scale] to r32 */ +void MOV32RmStoR(int to, int from, int from2, int scale); +/* mov r32 to [r32] */ +void MOV32RtoRm(int to, int from); +/* mov r32 to [r32][r32*scale] */ +void MOV32RtoRmS(int to, int to2, int scale, int from); +/* mov imm32 to r32 */ +void MOV32ItoR(int to, u32 from); +/* mov imm32 to m32 */ +void MOV32ItoM(u32 to, u32 from); + +/* mov r16 to m16 */ +void MOV16RtoM(u32 to, int from); +/* mov m16 to r16 */ +void MOV16MtoR(int to, u32 from); +/* mov imm16 to m16 */ +void MOV16ItoM(u32 to, u16 from); + +/* mov r8 to m8 */ +void MOV8RtoM(u32 to, int from); +/* mov m8 to r8 */ +void MOV8MtoR(int to, u32 from); +/* mov imm8 to m8 */ +void MOV8ItoM(u32 to, u8 from); + +/* movsx r8 to r32 */ +void MOVSX32R8toR(int to, int from); +/* movsx m8 to r32 */ +void MOVSX32M8toR(int to, u32 from); +/* movsx r16 to r32 */ +void MOVSX32R16toR(int to, int from); +/* movsx m16 to r32 */ +void MOVSX32M16toR(int to, u32 from); + +/* movzx r8 to r32 */ +void MOVZX32R8toR(int to, int from); +/* movzx m8 to r32 */ +void MOVZX32M8toR(int to, u32 from); +/* movzx r16 to r32 */ +void MOVZX32R16toR(int to, int from); +/* movzx m16 to r32 */ +void MOVZX32M16toR(int to, u32 from); + +/* cmovne r32 to r32 */ +void CMOVNE32RtoR(int to, int from); +/* cmovne m32 to r32*/ +void CMOVNE32MtoR(int to, u32 from); +/* cmove r32 to r32*/ +void CMOVE32RtoR(int to, int from); +/* cmove m32 to r32*/ +void CMOVE32MtoR(int to, u32 from); +/* cmovg r32 to r32*/ +void CMOVG32RtoR(int to, int from); +/* cmovg m32 to r32*/ +void CMOVG32MtoR(int to, u32 from); +/* cmovge r32 to r32*/ +void CMOVGE32RtoR(int to, int from); +/* cmovge m32 to r32*/ +void CMOVGE32MtoR(int to, u32 from); +/* cmovl r32 to r32*/ +void CMOVL32RtoR(int to, int from); +/* cmovl m32 to r32*/ +void CMOVL32MtoR(int to, u32 from); +/* cmovle r32 to r32*/ +void CMOVLE32RtoR(int to, int from); +/* cmovle m32 to r32*/ +void CMOVLE32MtoR(int to, u32 from); + +//////////////////////////////////// +// arithmetic instructions / +//////////////////////////////////// + +/* add imm32 to r32 */ +void ADD32ItoR(int to, u32 from); +/* add imm32 to m32 */ +void ADD32ItoM(u32 to, u32 from); +/* add r32 to r32 */ +void ADD32RtoR(int to, int from); +/* add r32 to m32 */ +void ADD32RtoM(u32 to, int from); +/* add m32 to r32 */ +void ADD32MtoR(int to, u32 from); + +/* adc imm32 to r32 */ +void ADC32ItoR(int to, u32 from); +/* adc r32 to r32 */ +void ADC32RtoR(int to, int from); +/* adc m32 to r32 */ +void ADC32MtoR(int to, u32 from); + +/* inc r32 */ +void INC32R(int to); +/* inc m32 */ +void INC32M(u32 to); + +/* sub imm32 to r32 */ +void SUB32ItoR(int to, u32 from); +/* sub r32 to r32 */ +void SUB32RtoR(int to, int from); +/* sub m32 to r32 */ +void SUB32MtoR(int to, u32 from); + +/* sbb imm32 to r32 */ +void SBB32ItoR(int to, u32 from); +/* sbb r32 to r32 */ +void SBB32RtoR(int to, int from); +/* sbb m32 to r32 */ +void SBB32MtoR(int to, u32 from); + +/* dec r32 */ +void DEC32R(int to); +/* dec m32 */ +void DEC32M(u32 to); + +/* mul eax by r32 to edx:eax */ +void MUL32R(int from); +/* mul eax by m32 to edx:eax */ +void MUL32M(u32 from); + +/* imul eax by r32 to edx:eax */ +void IMUL32R(int from); +/* imul eax by m32 to edx:eax */ +void IMUL32M(u32 from); +/* imul r32 by r32 to r32 */ +void IMUL32RtoR(int to, int from); + +/* div eax by r32 to edx:eax */ +void DIV32R(int from); +/* div eax by m32 to edx:eax */ +void DIV32M(u32 from); + +/* idiv eax by r32 to edx:eax */ +void IDIV32R(int from); +/* idiv eax by m32 to edx:eax */ +void IDIV32M(u32 from); + +//////////////////////////////////// +// shifting instructions / +//////////////////////////////////// + +/* shl imm8 to r32 */ +void SHL32ItoR(int to, u8 from); +/* shl cl to r32 */ +void SHL32CLtoR(int to); + +/* shr imm8 to r32 */ +void SHR32ItoR(int to, u8 from); +/* shr cl to r32 */ +void SHR32CLtoR(int to); + +/* sar imm8 to r32 */ +void SAR32ItoR(int to, u8 from); +/* sar cl to r32 */ +void SAR32CLtoR(int to); + +/* sal imm8 to r32 */ +#define SAL32ItoR SHL32ItoR +/* sal cl to r32 */ +#define SAL32CLtoR SHL32CLtoR + +// logical instructions + +/* or imm32 to r32 */ +void OR32ItoR(int to, u32 from); +/* or imm32 to m32 */ +void OR32ItoM(u32 to, u32 from); +/* or r32 to r32 */ +void OR32RtoR(int to, int from); +/* or r32 to m32 */ +void OR32RtoM(u32 to, int from); +/* or m32 to r32 */ +void OR32MtoR(int to, u32 from); + +/* xor imm32 to r32 */ +void XOR32ItoR(int to, u32 from); +/* xor imm32 to m32 */ +void XOR32ItoM(u32 to, u32 from); +/* xor r32 to r32 */ +void XOR32RtoR(int to, int from); +/* xor r32 to m32 */ +void XOR32RtoM(u32 to, int from); +/* xor m32 to r32 */ +void XOR32MtoR(int to, u32 from); + +/* and imm32 to r32 */ +void AND32ItoR(int to, u32 from); +/* and imm32 to m32 */ +void AND32ItoM(u32 to, u32 from); +/* and r32 to r32 */ +void AND32RtoR(int to, int from); +/* and r32 to m32 */ +void AND32RtoM(u32 to, int from); +/* and m32 to r32 */ +void AND32MtoR(int to, u32 from); + +/* not r32 */ +void NOT32R(int from); +/* neg r32 */ +void NEG32R(int from); + +//////////////////////////////////// +// jump instructions / +//////////////////////////////////// + +/* jmp rel8 */ +u8* JMP8(u8 to); + +/* jmp rel32 */ +u32* JMP32(u32 to); +/* jmp r32 */ +void JMP32R(int to); + +/* je rel8 */ +u8* JE8(u8 to); +/* jz rel8 */ +u8* JZ8(u8 to); +/* jg rel8 */ +u8* JG8(u8 to); +/* jge rel8 */ +u8* JGE8(u8 to); +/* jl rel8 */ +u8* JL8(u8 to); +/* jle rel8 */ +u8* JLE8(u8 to); +/* jne rel8 */ +u8* JNE8(u8 to); +/* jnz rel8 */ +u8* JNZ8(u8 to); +/* jng rel8 */ +u8* JNG8(u8 to); +/* jnge rel8 */ +u8* JNGE8(u8 to); +/* jnl rel8 */ +u8* JNL8(u8 to); +/* jnle rel8 */ +u8* JNLE8(u8 to); +/* jo rel8 */ +u8* JO8(u8 to); +/* jno rel8 */ +u8* JNO8(u8 to); + +/* je rel32 */ +u32* JE32(u32 to); +/* jz rel32 */ +u32* JZ32(u32 to); +/* jg rel32 */ +u32* JG32(u32 to); +/* jge rel32 */ +u32* JGE32(u32 to); +/* jl rel32 */ +u32* JL32(u32 to); +/* jle rel32 */ +u32* JLE32(u32 to); +/* jne rel32 */ +u32* JNE32(u32 to); +/* jnz rel32 */ +u32* JNZ32(u32 to); +/* jng rel32 */ +u32* JNG32(u32 to); +/* jnge rel32 */ +u32* JNGE32(u32 to); +/* jnl rel32 */ +u32* JNL32(u32 to); +/* jnle rel32 */ +u32* JNLE32(u32 to); +/* jo rel32 */ +u32* JO32(u32 to); +/* jno rel32 */ +u32* JNO32(u32 to); + +/* call func */ +void CALLFunc(u32 func); // based on CALL32 +/* call rel32 */ +void CALL32(u32 to); +/* call r32 */ +void CALL32R(int to); +/* call m32 */ +void CALL32M(u32 to); + +//////////////////////////////////// +// misc instructions / +//////////////////////////////////// + +/* cmp imm32 to r32 */ +void CMP32ItoR(int to, u32 from); +/* cmp imm32 to m32 */ +void CMP32ItoM(u32 to, u32 from); +/* cmp r32 to r32 */ +void CMP32RtoR(int to, int from); +/* cmp m32 to r32 */ +void CMP32MtoR(int to, u32 from); + +/* test imm32 to r32 */ +void TEST32ItoR(int to, u32 from); +/* test r32 to r32 */ +void TEST32RtoR(int to, int from); +/* sets r8 */ +void SETS8R(int to); +/* setl r8 */ +void SETL8R(int to); +/* setb r8 */ +void SETB8R(int to); + +/* cbw */ +void CBW(); +/* cwd */ +void CWD(); +/* cdq */ +void CDQ(); + +/* push r32 */ +void PUSH32R(int from); +/* push m32 */ +void PUSH32M(u32 from); +/* push imm32 */ +void PUSH32I(u32 from); + +/* pop r32 */ +void POP32R(int from); + +/* pushad */ +void PUSHA32(); +/* popad */ +void POPA32(); + +/* ret */ +void RET(); + +/********************/ +/* FPU instructions */ +/********************/ + +/* fild m32 to fpu reg stack */ +void FILD32(u32 from); +/* fistp m32 from fpu reg stack */ +void FISTP32(u32 from); +/* fld m32 to fpu reg stack */ +void FLD32(u32 from); +/* fstp m32 from fpu reg stack */ +void FSTP32(u32 to); + +/* fldcw fpu control word from m16 */ +void FLDCW(u32 from); +/* fstcw fpu control word to m16 */ +void FNSTCW(u32 to); + +/* fadd m32 to fpu reg stack */ +void FADD32(u32 from); +/* fsub m32 to fpu reg stack */ +void FSUB32(u32 from); +/* fmul m32 to fpu reg stack */ +void FMUL32(u32 from); +/* fdiv m32 to fpu reg stack */ +void FDIV32(u32 from); +/* fabs fpu reg stack */ +void FABS(); +/* fsqrt fpu reg stack */ +void FSQRT(); +/* fchs fpu reg stack */ +void FCHS(); + +/********************/ +/* MMX instructions */ +/********************/ + +// r64 = mm + +/* movq m64 to r64 */ +void MOVQMtoR(int to, u32 from); +/* movq r64 to m64 */ +void MOVQRtoM(u32 to, int from); + +/* pand r64 to r64 */ +void PANDRtoR(int to, int from); +/* pand m64 to r64 */ +void PANDMtoR(int to, u32 from); + +/* pandn r64 to r64 */ +void PANDNRtoR(int to, int from); + +/* pandn r64 to r64 */ +void PANDNMtoR(int to, u32 from); + +/* por r64 to r64 */ +void PORRtoR(int to, int from); +/* por m64 to r64 */ +void PORMtoR(int to, u32 from); + +/* pxor r64 to r64 */ +void PXORRtoR(int to, int from); +/* pxor m64 to r64 */ +void PXORMtoR(int to, u32 from); + +/* psllq r64 to r64 */ +void PSLLQRtoR(int to, int from); +/* psllq m64 to r64 */ +void PSLLQMtoR(int to, u32 from); +/* psllq imm8 to r64 */ +void PSLLQItoR(int to, u8 from); + +/* psrlq r64 to r64 */ +void PSRLQRtoR(int to, int from); +/* psrlq m64 to r64 */ +void PSRLQMtoR(int to, u32 from); +/* psrlq imm8 to r64 */ +void PSRLQItoR(int to, u8 from); + +/* paddusb r64 to r64 */ +void PADDUSBRtoR(int to, int from); +/* paddusb m64 to r64 */ +void PADDUSBMtoR(int to, u32 from); +/* paddusw r64 to r64 */ +void PADDUSWRtoR(int to, int from); +/* paddusw m64 to r64 */ +void PADDUSWMtoR(int to, u32 from); + +/* paddb r64 to r64 */ +void PADDBRtoR(int to, int from); +/* paddb m64 to r64 */ +void PADDBMtoR(int to, u32 from); +/* paddw r64 to r64 */ +void PADDWRtoR(int to, int from); +/* paddw m64 to r64 */ +void PADDWMtoR(int to, u32 from); +/* paddd r64 to r64 */ +void PADDDRtoR(int to, int from); +/* paddd m64 to r64 */ +void PADDDMtoR(int to, u32 from); + +/* emms */ +void EMMS(); +void FEMMS(); +void BT32ItoR(int to,int from); +void RCR32ItoR(int to,int from); + +//Basara:changed +void PADDSBRtoR(int to, int from); +void PADDSWRtoR(int to, int from); +void PADDSDRtoR(int to, int from); +void PSUBSBRtoR(int to, int from); +void PSUBSWRtoR(int to, int from); +void PSUBSDRtoR(int to, int from); + +void PSUBBRtoR(int to, int from); +void PSUBWRtoR(int to, int from); +void PSUBDRtoR(int to, int from); + +void MOVQ64ItoR(int reg,u64 i); //Prototype.Todo add all consts to end of block.not after jr $+8 + +void PMAXSWRtoR(int to,int from); +void PMINSWRtoR(int to,int from); + +void PCMPEQBRtoR(int to,int from); +void PCMPEQWRtoR(int to,int from); +void PCMPEQDRtoR(int to,int from); + +void PCMPGTBRtoR(int to,int from); +void PCMPGTWRtoR(int to,int from); +void PCMPGTDRtoR(int to,int from); + +void PSRLWItoR(int to,int from); +void PSRLDItoR(int to,int from); +void PSLLWItoR(int to,int from); +void PSLLDItoR(int to,int from); +void PSRAWItoR(int to,int from); +void PSRADItoR(int to,int from); + +//Added:basara 11.01.2003 +void FCOMP32(u32 from); +void FNSTSWtoAX(); +void SETNZ8R(int to); + +//Added:basara 14.01.2003 +void PFCMPEQMtoR(int to,int from); +void PFCMPGTMtoR(int to,int from); +void PFCMPGEMtoR(int to,int from); + +void PFADDMtoR(int to,int from); +void PFADDRtoR(int to,int from); + +void PFSUBMtoR(int to,int from); +void PFSUBRtoR(int to,int from); + +void PFMULMtoR(int to,int from); +void PFMULRtoR(int to,int from); + +void PFRCPMtoR(int to,int from); +void PFRCPRtoR(int to,int from); +void PFRCPIT1RtoR(int to,int from); +void PFRCPIT2RtoR(int to,int from); + +void PFRSQRTRtoR(int to,int from); +void PFRSQIT1RtoR(int to,int from); + +void PF2IDMtoR(int to,int from); +void PF2IDRtoR(int to,int from); +void PI2FDMtoR(int to,int from); +void PI2FDRtoR(int to,int from); + +void PFMAXMtoR(int to,int from); +void PFMAXRtoR(int to,int from); +void PFMINMtoR(int to,int from); +void PFMINRtoR(int to,int from); + +void MOVDMtoR(int to, u32 from); +void MOVDRtoM(u32 to, int from); +void MOVD32RtoR(int to, int from); +void MOVD64RtoR(int to, int from); + +void MOVQRtoR(int to,int from); + +//if to==from MMLO=MMHI +void PUNPCKHDQRtoR(int to,int from); + +//if to==from MMHI=MMLO +void PUNPCKLDQRtoR(int to,int from); + +/* + SSE intructions +*/ +void MOVAPSMtoR(int to,int from); +void MOVAPSRtoM(int to,int from); +void MOVAPSRtoR(int to,int from); + +void ORPSMtoR(int to,int from); +void ORPSRtoR(int to,int from); + +void XORPSMtoR(int to,int from); +void XORPSRtoR(int to,int from); + +void ANDPSMtoR(int to,int from); +void ANDPSRtoR(int to,int from); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/ix86_64/README b/libpcsxcore/ix86_64/README new file mode 100644 index 0000000..af24e37 --- /dev/null +++ b/libpcsxcore/ix86_64/README @@ -0,0 +1,2 @@ +This is the AMD64 dynamic recompiler. +Made from opcodes from PCSX2 0.9.3 and the x86 recompiler modified to fit. ie. currently no AMD64/SSE specific code advantages. diff --git a/libpcsxcore/ix86_64/iGte.h b/libpcsxcore/ix86_64/iGte.h new file mode 100644 index 0000000..bcb2f4b --- /dev/null +++ b/libpcsxcore/ix86_64/iGte.h @@ -0,0 +1,79 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __IGTE_H__ +#define __IGTE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../r3000a.h" +#include "../psxmem.h" + +#define CP2_FUNC(f) \ +void gte##f(); \ +static void rec##f() { \ + iFlushRegs(); \ + MOV32ItoM((uptr)&psxRegs.code, (u32)psxRegs.code); \ + CALLFunc((uptr)gte##f); \ +/* branch = 2; */\ +} + +#define CP2_FUNCNC(f) \ +void gte##f(); \ +static void rec##f() { \ + iFlushRegs(); \ + CALLFunc((uptr)gte##f); \ +/* branch = 2; */\ +} + +CP2_FUNC(MFC2); +CP2_FUNC(MTC2); +CP2_FUNC(CFC2); +CP2_FUNC(CTC2); +CP2_FUNC(LWC2); +CP2_FUNC(SWC2); +CP2_FUNCNC(RTPS); +CP2_FUNC(OP); +CP2_FUNCNC(NCLIP); +CP2_FUNC(DPCS); +CP2_FUNC(INTPL); +CP2_FUNC(MVMVA); +CP2_FUNCNC(NCDS); +CP2_FUNCNC(NCDT); +CP2_FUNCNC(CDP); +CP2_FUNCNC(NCCS); +CP2_FUNCNC(CC); +CP2_FUNCNC(NCS); +CP2_FUNCNC(NCT); +CP2_FUNC(SQR); +CP2_FUNC(DCPL); +CP2_FUNCNC(DPCT); +CP2_FUNCNC(AVSZ3); +CP2_FUNCNC(AVSZ4); +CP2_FUNCNC(RTPT); +CP2_FUNC(GPF); +CP2_FUNC(GPL); +CP2_FUNCNC(NCCT); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/ix86_64/iR3000A-64.c b/libpcsxcore/ix86_64/iR3000A-64.c new file mode 100644 index 0000000..4ca3e99 --- /dev/null +++ b/libpcsxcore/ix86_64/iR3000A-64.c @@ -0,0 +1,2963 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* i386 assembly functions for R3000A core. +*/ + +#include "ix86-64.h" +#include "../r3000a.h" +#include "../psxhle.h" + +#include + +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON +#endif + +uptr* psxRecLUT; + +#define PTRMULT (sizeof(uptr) / sizeof(u32)) + +#undef PC_REC +#undef PC_REC8 +#undef PC_REC16 +#undef PC_REC32 +#define PC_REC(x) (psxRecLUT[(x) >> 16] + PTRMULT * ((x) & 0xffff)) +#define PC_RECP(x) (*(uptr *)PC_REC(x)) + +#define RECMEM_SIZE (PTRMULT * 8 * 1024 * 1024) + +static char *recMem; /* the recompiled blocks will be here */ +static char *recRAM; /* and the ptr to the blocks here */ +static char *recROM; /* and here */ + +static u32 pc; /* recompiler pc */ +static u32 pcold; /* recompiler oldpc */ +static int count; /* recompiler intruction count */ +static int branch; /* set for branch */ +static u32 target; /* branch target */ +static u32 resp; + +typedef struct { + int state; + u32 k; + int reg; +} iRegisters; + +static iRegisters iRegs[32]; +static iRegisters iRegsS[32]; + +#define ST_UNK 0 +#define ST_CONST 1 +#define ST_MAPPED 2 + +#define IsConst(reg) (iRegs[reg].state == ST_CONST) +#define IsMapped(reg) (iRegs[reg].state == ST_MAPPED) + +static void (*recBSC[64])(); +static void (*recSPC[64])(); +static void (*recREG[32])(); +static void (*recCP0[32])(); +static void (*recCP2[64])(); +static void (*recCP2BSC[32])(); + +#define STACKSIZE 0x18 +static void StackRes() +{ +#ifdef __x86_64__ + ADD64ItoR(RSP, STACKSIZE); +#else + if (resp) ADD32ItoR(ESP, resp); +#endif +} + +static void MapConst(int reg, u32 _const) { + iRegs[reg].k = _const; + iRegs[reg].state = ST_CONST; +} + +static void iFlushReg(int reg) { + if (IsConst(reg)) { + MOV32ItoM((uptr)&psxRegs.GPR.r[reg], iRegs[reg].k); + } + iRegs[reg].state = ST_UNK; +} + +static void iFlushRegs() { + int i; + + for (i=1; i<32; i++) { + iFlushReg(i); + } +} + +static void iRet() { + /* store cycle */ + count = ((pc - pcold) / 4) * BIAS; + ADD32ItoM((uptr)&psxRegs.cycle, count); + StackRes(); + RET(); +} + +static int iLoadTest() { + u32 tmp; + + // check for load delay + tmp = psxRegs.code >> 26; + switch (tmp) { + case 0x10: // COP0 + switch (_Rs_) { + case 0x00: // MFC0 + case 0x02: // CFC0 + return 1; + } + break; + case 0x12: // COP2 + switch (_Funct_) { + case 0x00: + switch (_Rs_) { + case 0x00: // MFC2 + case 0x02: // CFC2 + return 1; + } + break; + } + break; + case 0x32: // LWC2 + return 1; + default: + if (tmp >= 0x20 && tmp <= 0x26) { // LB/LH/LWL/LW/LBU/LHU/LWR + return 1; + } + break; + } + return 0; +} + +/* set a pending branch */ +static void SetBranch() { + branch = 1; + psxRegs.code = PSXMu32(pc); + pc+=4; + + if (iLoadTest() == 1) { + iFlushRegs(); + MOV32ItoM((uptr)&psxRegs.code, psxRegs.code); + /* store cycle */ + count = ((pc - pcold) / 4) * BIAS; + ADD32ItoM((uptr)&psxRegs.cycle, count); + + //PUSH64M((uptr)&target); + MOV32MtoR(X86ARG2, (uptr)&target); + //PUSHI(_Rt_); + MOV64ItoR(X86ARG1, _Rt_); + CALLFunc((uptr)psxDelayTest); + StackRes(); + RET(); + return; + } + + recBSC[psxRegs.code>>26](); + + iFlushRegs(); + MOV32MtoR(EAX, (uptr)&target); + MOV32RtoM((uptr)&psxRegs.pc, EAX); + CALLFunc((uptr)psxBranchTest); + + iRet(); +} + +static void iJump(u32 branchPC) { + branch = 1; + psxRegs.code = PSXMu32(pc); + pc+=4; + + if (iLoadTest() == 1) { + iFlushRegs(); + MOV32ItoM((uptr)&psxRegs.code, psxRegs.code); + /* store cycle */ + count = ((pc - pcold) / 4) * BIAS; + ADD32ItoM((uptr)&psxRegs.cycle, count); + + //PUSHI(branchPC); + MOV64ItoR(X86ARG2, branchPC); + //PUSHI(_Rt_); + MOV64ItoR(X86ARG1, _Rt_); + CALLFunc((uptr)psxDelayTest); + //ADD32ItoR(ESP, 2*8); + StackRes(); + RET(); + return; + } + + recBSC[psxRegs.code>>26](); + + iFlushRegs(); + MOV32ItoM((uptr)&psxRegs.pc, branchPC); + CALLFunc((uptr)psxBranchTest); + /* store cycle */ + count = ((pc - pcold) / 4) * BIAS; + ADD32ItoM((uptr)&psxRegs.cycle, count); + StackRes(); + + RET(); + //* XXX? + // maybe just happened an interruption, check so + CMP32ItoM((uptr)&psxRegs.pc, branchPC); + j8Ptr[0] = JE8(0); + + RET(); + + x86SetJ8(j8Ptr[0]); + MOV64MtoR(RAX, PC_REC(branchPC)); + TEST64RtoR(RAX,RAX); + j8Ptr[1] = JNE8(0); + + RET(); + + x86SetJ8(j8Ptr[1]); + + RET(); + //JMP32R(EAX); + JMPR(EAX); + //*/ +} + +static void iBranch(u32 branchPC, int savectx) { + u32 respold=0; + + if (savectx) { + respold = resp; + memcpy(iRegsS, iRegs, sizeof(iRegs)); + } + + branch = 1; + psxRegs.code = PSXMu32(pc); + + // the delay test is only made when the branch is taken + // savectx == 0 will mean that :) + if (savectx == 0 && iLoadTest() == 1) { + iFlushRegs(); + MOV32ItoM((uptr)&psxRegs.code, psxRegs.code); + /* store cycle */ + count = (((pc+4) - pcold) / 4) * BIAS; + ADD32ItoM((uptr)&psxRegs.cycle, count); + //if (resp) ADD32ItoR(ESP, resp); + + //PUSHI(branchPC); + MOV64ItoR(X86ARG2, branchPC); + //PUSHI(_Rt_); + MOV64ItoR(X86ARG1,_Rt_); + CALLFunc((uptr)psxDelayTest); + StackRes(); + RET(); + return; + } + + pc+= 4; + recBSC[psxRegs.code>>26](); + + iFlushRegs(); + MOV32ItoM((uptr)&psxRegs.pc, branchPC); + CALLFunc((uptr)psxBranchTest); + /* store cycle */ + count = ((pc - pcold) / 4) * BIAS; + ADD32ItoM((uptr)&psxRegs.cycle, count); + + StackRes(); + + // maybe just happened an interruption, check so + CMP32ItoM((uptr)&psxRegs.pc, branchPC); + j8Ptr[1] = JE8(0); + + RET(); + + x86SetJ8(j8Ptr[1]); + MOV64MtoR(RAX, PC_REC(branchPC)); + TEST64RtoR(RAX, RAX); + j8Ptr[2] = JNE8(0); + + RET(); + + x86SetJ8(j8Ptr[2]); + //JMP32R(EAX); + JMPR(EAX); + + pc-= 4; + if (savectx) { + resp = respold; + memcpy(iRegs, iRegsS, sizeof(iRegs)); + } +} + + +char *txt0 = "EAX = %x : ECX = %x : EDX = %x\n"; +char *txt1 = "EAX = %x\n"; +char *txt2 = "M32 = %x\n"; + +/* +void iLogX86() { + PUSHA32(); + + PUSH32R (EDX); + PUSH32R (ECX); + PUSH32R (EAX); + PUSH32M ((uptr)&txt0); + CALLFunc((uptr)SysPrintf); + ADD32ItoR(ESP, 4*4); + + POPA32(); +} +*/ + +void iLogEAX() { + PUSH64R (EAX); + PUSH64M ((uptr)&txt1); + CALLFunc((uptr)SysPrintf); + ADD32ItoR(ESP, 8*2); +} + +void iLogM32(u32 mem) { + PUSH64M (mem); + PUSH64M ((uptr)&txt2); + CALLFunc((uptr)SysPrintf); + ADD32ItoR(ESP, 8*2); +} + +static void iDumpRegs() { + int i, j; + + printf("%x %x\n", psxRegs.pc, psxRegs.cycle); + for (i = 0; i < 4; i++) { + for (j = 0; j < 8; j++) + printf("%x ", psxRegs.GPR.r[j*i]); + printf("\n"); + } +} + +void iDumpBlock(char *ptr) { + FILE *f; + u32 i; + + SysPrintf("dump1 %x:%x, %x\n", psxRegs.pc, pc, psxRegs.cycle); + + for (i = psxRegs.pc; i < pc; i+=4) + SysPrintf("%s\n", disR3000AF(PSXMu32(i), i)); + + fflush(stdout); + f = fopen("dump1", "w"); + fwrite(ptr, 1, (uptr)x86Ptr - (uptr)ptr, f); + fclose(f); + //system("ndisasm -b64 dump1"); + fflush(stdout); +} + +#define REC_FUNC(f) \ +void psx##f(); \ +static void rec##f() { \ + iFlushRegs(); \ + MOV32ItoM((uptr)&psxRegs.code, (u32)psxRegs.code); \ + MOV32ItoM((uptr)&psxRegs.pc, (u32)pc); \ + CALLFunc((uptr)psx##f); \ +/* branch = 2; */\ +} + +#define REC_SYS(f) \ +void psx##f(); \ +static void rec##f() { \ + iFlushRegs(); \ + MOV32ItoM((uptr)&psxRegs.code, (u32)psxRegs.code); \ + MOV32ItoM((uptr)&psxRegs.pc, (u32)pc); \ + CALLFunc((uptr)psx##f); \ + branch = 2; \ + iRet(); \ +} + +#define REC_BRANCH(f) \ +void psx##f(); \ +static void rec##f() { \ + iFlushRegs(); \ + MOV32ItoM((uptr)&psxRegs.code, (u32)psxRegs.code); \ + MOV32ItoM((uptr)&psxRegs.pc, (u32)pc); \ + CALLFunc((uptr)psx##f); \ + branch = 2; \ + iRet(); \ +} + +static void recRecompile(); + +static int recInit() { + int i; + + psxRecLUT = (uptr*) malloc(0x010000 * sizeof(uptr)); + + recMem = mmap(0, + RECMEM_SIZE + PTRMULT*0x1000, + PROT_EXEC | PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + recRAM = mmap(0, + 0x280000*PTRMULT, + PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + recROM = &recRAM[0x200000*PTRMULT]; + + if (recRAM == NULL || recROM == NULL || recMem == NULL || psxRecLUT == NULL) { + SysMessage("Error allocating memory"); return -1; + } + memset(recMem, 0, RECMEM_SIZE); + memset(recRAM, 0, 0x200000 * PTRMULT); + memset(recROM, 0, 0x080000 * PTRMULT); + + for (i=0; i<0x80; i++) psxRecLUT[i + 0x0000] = (uptr)&recRAM[PTRMULT*((i & 0x1f) << 16)]; + memcpy(psxRecLUT + 0x8000, psxRecLUT, 0x80 * sizeof(uptr)); + memcpy(psxRecLUT + 0xa000, psxRecLUT, 0x80 * sizeof(uptr)); + + for (i=0; i<0x08; i++) psxRecLUT[i + 0xbfc0] = (uptr)&recROM[PTRMULT*(i << 16)]; + + return 0; +} + +static void recReset() { + memset(recRAM, 0, 0x200000 * PTRMULT); + memset(recROM, 0, 0x080000 * PTRMULT); + + //x86Init(); + cpudetectInit(); + x86SetPtr(recMem); + + branch = 0; + memset(iRegs, 0, sizeof(iRegs)); + iRegs[0].state = ST_CONST; + iRegs[0].k = 0; +} + +static void recShutdown() { + if (recMem == NULL) return; + free(psxRecLUT); + munmap(recMem, RECMEM_SIZE + PTRMULT*0x1000); + munmap(recRAM, 0x280000*PTRMULT); + x86Shutdown(); +} + +static void recError() { + SysReset(); + ClosePlugins(); + SysMessage("Unrecoverable error while running recompiler\n"); + SysRunGui(); +} + +/*__inline*/ static void execute() { + void (*recFunc)(); + uptr *p; + + p = (uptr *)PC_REC(psxRegs.pc); + // if (!p) { recError(); return; } + + if (*p == 0) { + recRecompile(); + } + + if (*p < (uptr)recMem || *p >= (uptr)recMem + RECMEM_SIZE) + { + recError(); + return; + } + recFunc = (void (*)())*p; + (*recFunc)(); +} + +static void recExecute() { + for (;;) execute(); +} + +static void recExecuteBlock() { + execute(); +} + +static void recClear(u32 Addr, u32 Size) { + memset((void*)PC_REC(Addr), 0, Size * sizeof(uptr)); +} + +static void recNULL() { +// SysMessage("recUNK: %8.8x\n", psxRegs.code); +} + +/********************************************************* +* goes to opcodes tables... * +* Format: table[something....] * +*********************************************************/ + +//REC_SYS(SPECIAL); +#if 1 +static void recSPECIAL() { + recSPC[_Funct_](); +} +#endif + +static void recREGIMM() { + recREG[_Rt_](); +} + +static void recCOP0() { + recCP0[_Rs_](); +} + +//REC_SYS(COP2); +#if 1 +static void recCOP2() { + recCP2[_Funct_](); +} +#endif + +static void recBASIC() { + recCP2BSC[_Rs_](); +} + +//end of Tables opcodes... + +/********************************************************* +* Arithmetic with immediate operand * +* Format: OP rt, rs, immediate * +*********************************************************/ + +#if 0 +REC_FUNC(ADDI); +REC_FUNC(ADDIU); +REC_FUNC(ANDI); +REC_FUNC(ORI); +REC_FUNC(XORI); +REC_FUNC(SLTI); +REC_FUNC(SLTIU); +#endif + +#if 1 +static void recADDIU() { +// Rt = Rs + Im + if (!_Rt_) return; + +// iFlushRegs(); + + if (_Rs_ == _Rt_) { + if (IsConst(_Rt_)) { + iRegs[_Rt_].k+= _Imm_; + } else { + if (_Imm_ == 1) { + INC32M((uptr)&psxRegs.GPR.r[_Rt_]); + } else if (_Imm_ == -1) { + DEC32M((uptr)&psxRegs.GPR.r[_Rt_]); + } else if (_Imm_) { + ADD32ItoM((uptr)&psxRegs.GPR.r[_Rt_], _Imm_); + } + } + } else { + if (IsConst(_Rs_)) { + MapConst(_Rt_, iRegs[_Rs_].k + _Imm_); + } else { + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + if (_Imm_ == 1) { + INC32R(EAX); + } else if (_Imm_ == -1) { + DEC32R(EAX); + } else if (_Imm_) { + ADD32ItoR(EAX, _Imm_); + } + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + } + } +} + +static void recADDI() { +// Rt = Rs + Im + recADDIU(); +} + +static void recSLTI() { +// Rt = Rs < Im (signed) + if (!_Rt_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + MapConst(_Rt_, (s32)iRegs[_Rs_].k < _Imm_); + } else { + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + CMP32ItoR(EAX, _Imm_); + SETL8R (EAX); + AND32ItoR(EAX, 0xff); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + } +} + +static void recSLTIU() { +// Rt = Rs < Im (unsigned) + if (!_Rt_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + MapConst(_Rt_, iRegs[_Rs_].k < _ImmU_); + } else { + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + CMP32ItoR(EAX, _Imm_); + SETB8R (EAX); + AND32ItoR(EAX, 0xff); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + } +} + +static void recANDI() { +// Rt = Rs And Im + if (!_Rt_) return; + +// iFlushRegs(); + + if (_Rs_ == _Rt_) { + if (IsConst(_Rt_)) { + iRegs[_Rt_].k&= _ImmU_; + } else { + AND32ItoM((uptr)&psxRegs.GPR.r[_Rt_], _ImmU_); + } + } else { + if (IsConst(_Rs_)) { + MapConst(_Rt_, iRegs[_Rs_].k & _ImmU_); + } else { + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + AND32ItoR(EAX, _ImmU_); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + } + } +} + +static void recORI() { +// Rt = Rs Or Im + if (!_Rt_) return; + +// iFlushRegs(); + + if (_Rs_ == _Rt_) { + if (IsConst(_Rt_)) { + iRegs[_Rt_].k|= _ImmU_; + } else { + OR32ItoM((uptr)&psxRegs.GPR.r[_Rt_], _ImmU_); + } + } else { + if (IsConst(_Rs_)) { + MapConst(_Rt_, iRegs[_Rs_].k | _ImmU_); + } else { + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + if (_ImmU_) OR32ItoR (EAX, _ImmU_); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + } + } +} + +static void recXORI() { +// Rt = Rs Xor Im + if (!_Rt_) return; + +// iFlushRegs(); + + if (_Rs_ == _Rt_) { + if (IsConst(_Rt_)) { + iRegs[_Rt_].k^= _ImmU_; + } else { + XOR32ItoM((uptr)&psxRegs.GPR.r[_Rt_], _ImmU_); + } + } else { + if (IsConst(_Rs_)) { + MapConst(_Rt_, iRegs[_Rs_].k ^ _ImmU_); + } else { + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + XOR32ItoR(EAX, _ImmU_); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + } + } +} +#endif +//end of * Arithmetic with immediate operand + +/********************************************************* +* Load higher 16 bits of the first word in GPR with imm * +* Format: OP rt, immediate * +*********************************************************/ +//REC_FUNC(LUI); +#if 1 +static void recLUI() { +// Rt = Imm << 16 + if (!_Rt_) return; + + MapConst(_Rt_, psxRegs.code << 16); +} +#endif +//End of Load Higher ..... + + +/********************************************************* +* Register arithmetic * +* Format: OP rd, rs, rt * +*********************************************************/ + + +#if 0 +REC_FUNC(ADD); +REC_FUNC(ADDU); +REC_FUNC(SUB); +REC_FUNC(SUBU); +REC_FUNC(AND); +REC_FUNC(OR); +REC_FUNC(XOR); +REC_FUNC(NOR); +REC_FUNC(SLT); +REC_FUNC(SLTU); +#endif + +#if 1 +static void recADDU() { +// Rd = Rs + Rt + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k + iRegs[_Rt_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + if (_Rt_ == _Rd_) { + if (iRegs[_Rs_].k == 1) { + INC32M((uptr)&psxRegs.GPR.r[_Rd_]); + } else if (iRegs[_Rs_].k == -1) { + DEC32M((uptr)&psxRegs.GPR.r[_Rd_]); + } else if (iRegs[_Rs_].k) { + ADD32ItoM((uptr)&psxRegs.GPR.r[_Rd_], iRegs[_Rs_].k); + } + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + if (iRegs[_Rs_].k == 1) { + INC32R(EAX); + } else if (iRegs[_Rs_].k == 0xffffffff) { + DEC32R(EAX); + } else if (iRegs[_Rs_].k) { + ADD32ItoR(EAX, iRegs[_Rs_].k); + } + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + if (_Rs_ == _Rd_) { + if (iRegs[_Rt_].k == 1) { + INC32M((uptr)&psxRegs.GPR.r[_Rd_]); + } else if (iRegs[_Rt_].k == -1) { + DEC32M((uptr)&psxRegs.GPR.r[_Rd_]); + } else if (iRegs[_Rt_].k) { + ADD32ItoM((uptr)&psxRegs.GPR.r[_Rd_], iRegs[_Rt_].k); + } + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + if (iRegs[_Rt_].k == 1) { + INC32R(EAX); + } else if (iRegs[_Rt_].k == 0xffffffff) { + DEC32R(EAX); + } else if (iRegs[_Rt_].k) { + ADD32ItoR(EAX, iRegs[_Rt_].k); + } + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } + } else { + iRegs[_Rd_].state = ST_UNK; + + if (_Rs_ == _Rd_) { // Rd+= Rt + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + ADD32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else if (_Rt_ == _Rd_) { // Rd+= Rs + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + ADD32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else { // Rd = Rs + Rt + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + ADD32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } + } +} + +static void recADD() { +// Rd = Rs + Rt + recADDU(); +} + +static void recSUBU() { +// Rd = Rs - Rt + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k - iRegs[_Rt_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rs_].k); + SUB32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + SUB32ItoR(EAX, iRegs[_Rt_].k); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + SUB32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recSUB() { +// Rd = Rs - Rt + recSUBU(); +} + +static void recAND() { +// Rd = Rs And Rt + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k & iRegs[_Rt_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + if (_Rd_ == _Rt_) { // Rd&= Rs + AND32ItoM((uptr)&psxRegs.GPR.r[_Rd_], iRegs[_Rs_].k); + } else { + MOV32ItoR(EAX, iRegs[_Rs_].k); + AND32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + if (_Rd_ == _Rs_) { // Rd&= kRt + AND32ItoM((uptr)&psxRegs.GPR.r[_Rd_], iRegs[_Rt_].k); + } else { // Rd = Rs & kRt + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + AND32ItoR(EAX, iRegs[_Rt_].k); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } + } else { + iRegs[_Rd_].state = ST_UNK; + + if (_Rs_ == _Rd_) { // Rd&= Rt + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + AND32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else if (_Rt_ == _Rd_) { // Rd&= Rs + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + AND32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else { // Rd = Rs & Rt + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + AND32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } + } +} + +static void recOR() { +// Rd = Rs Or Rt + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k | iRegs[_Rt_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rs_].k); + OR32MtoR (EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + OR32ItoR (EAX, iRegs[_Rt_].k); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + OR32MtoR (EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recXOR() { +// Rd = Rs Xor Rt + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k ^ iRegs[_Rt_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rs_].k); + XOR32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + XOR32ItoR(EAX, iRegs[_Rt_].k); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + XOR32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recNOR() { +// Rd = Rs Nor Rt + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, ~(iRegs[_Rs_].k | iRegs[_Rt_].k)); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rs_].k); + OR32MtoR (EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + NOT32R (EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + OR32ItoR (EAX, iRegs[_Rt_].k); + NOT32R (EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + OR32MtoR (EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + NOT32R (EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recSLT() { +// Rd = Rs < Rt (signed) + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, (s32)iRegs[_Rs_].k < (s32)iRegs[_Rt_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rs_].k); + CMP32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + SETL8R (EAX); + AND32ItoR(EAX, 0xff); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + CMP32ItoR(EAX, iRegs[_Rt_].k); + SETL8R (EAX); + AND32ItoR(EAX, 0xff); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + CMP32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + SETL8R (EAX); + AND32ItoR(EAX, 0xff); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recSLTU() { +// Rd = Rs < Rt (unsigned) + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k < iRegs[_Rt_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rs_].k); + CMP32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + SBB32RtoR(EAX, EAX); + NEG32R (EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + CMP32ItoR(EAX, iRegs[_Rt_].k); + SBB32RtoR(EAX, EAX); + NEG32R (EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + CMP32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + SBB32RtoR(EAX, EAX); + NEG32R (EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } +} +#endif +//End of * Register arithmetic + +/********************************************************* +* Register mult/div & Register trap logic * +* Format: OP rs, rt * +*********************************************************/ + +#if 0 +REC_FUNC(MULT); +REC_FUNC(MULTU); +REC_FUNC(DIV); +REC_FUNC(DIVU); +#endif + +#if 1 +static void recMULT() { +// Lo/Hi = Rs * Rt (signed) + +// iFlushRegs(); + + if ((IsConst(_Rs_) && iRegs[_Rs_].k == 0) || + (IsConst(_Rt_) && iRegs[_Rt_].k == 0)) { + XOR32RtoR(EAX, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.n.lo, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.n.hi, EAX); + return; + } + + if (IsConst(_Rs_)) { + MOV32ItoR(EAX, iRegs[_Rs_].k);// printf("multrsk %x\n", iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + } + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k);// printf("multrtk %x\n", iRegs[_Rt_].k); + IMUL32R (EDX); + } else { + IMUL32M ((uptr)&psxRegs.GPR.r[_Rt_]); + } + MOV32RtoM((uptr)&psxRegs.GPR.n.lo, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.n.hi, EDX); +} + +static void recMULTU() { +// Lo/Hi = Rs * Rt (unsigned) + +// iFlushRegs(); + + if ((IsConst(_Rs_) && iRegs[_Rs_].k == 0) || + (IsConst(_Rt_) && iRegs[_Rt_].k == 0)) { + XOR32RtoR(EAX, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.n.lo, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.n.hi, EAX); + return; + } + + if (IsConst(_Rs_)) { + MOV32ItoR(EAX, iRegs[_Rs_].k);// printf("multursk %x\n", iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + } + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k);// printf("multurtk %x\n", iRegs[_Rt_].k); + MUL32R (EDX); + } else { + MUL32M ((uptr)&psxRegs.GPR.r[_Rt_]); + } + MOV32RtoM((uptr)&psxRegs.GPR.n.lo, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.n.hi, EDX); +} + +static void recDIV() { +// Lo/Hi = Rs / Rt (signed) + +// iFlushRegs(); + + if (IsConst(_Rt_)) { + if (iRegs[_Rt_].k == 0) return; + MOV32ItoR(ECX, iRegs[_Rt_].k);// printf("divrtk %x\n", iRegs[_Rt_].k); + } else { + MOV32MtoR(ECX, (uptr)&psxRegs.GPR.r[_Rt_]); + CMP32ItoR(ECX, 0); + j8Ptr[0] = JE8(0); + } + if (IsConst(_Rs_)) { + MOV32ItoR(EAX, iRegs[_Rs_].k);// printf("divrsk %x\n", iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + } + CDQ(); + IDIV32R (ECX); + MOV32RtoM((uptr)&psxRegs.GPR.n.lo, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.n.hi, EDX); + if (!IsConst(_Rt_)) { + x86SetJ8(j8Ptr[0]); + } +} + +static void recDIVU() { +// Lo/Hi = Rs / Rt (unsigned) + +// iFlushRegs(); + + if (IsConst(_Rt_)) { + if (iRegs[_Rt_].k == 0) return; + MOV32ItoR(ECX, iRegs[_Rt_].k);// printf("divurtk %x\n", iRegs[_Rt_].k); + } else { + MOV32MtoR(ECX, (uptr)&psxRegs.GPR.r[_Rt_]); + CMP32ItoR(ECX, 0); + j8Ptr[0] = JE8(0); + } + if (IsConst(_Rs_)) { + MOV32ItoR(EAX, iRegs[_Rs_].k);// printf("divursk %x\n", iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + } + XOR32RtoR(EDX, EDX); + DIV32R (ECX); + MOV32RtoM((uptr)&psxRegs.GPR.n.lo, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.n.hi, EDX); + if (!IsConst(_Rt_)) { + x86SetJ8(j8Ptr[0]); + } +} +#endif +//End of * Register mult/div & Register trap logic + +#if 0 +REC_FUNC(LB); +REC_FUNC(LBU); +REC_FUNC(LH); +REC_FUNC(LHU); +REC_FUNC(LW); + +REC_FUNC(SB); +REC_FUNC(SH); +REC_FUNC(SW); + +REC_FUNC(LWL); +REC_FUNC(LWR); +REC_FUNC(SWL); +REC_FUNC(SWR); +#endif + + +static void SetArg_OfB(x86IntRegType arg) { + if (IsConst(_Rs_)) +#ifdef __x86_64__ + MOV64ItoR(arg, iRegs[_Rs_].k + _Imm_); +#else + PUSH32I (iRegs[_Rs_].k + _Imm_); +#endif + else { +#ifdef __x86_64__ + MOV32MtoR(arg, (uptr)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) + ADD32ItoR(arg, _Imm_); +#else + if (_Imm_) { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + ADD32ItoR(EAX, _Imm_); + PUSH32R (EAX); + } else { + PUSH32M ((u32)&psxRegs.GPR.r[_Rs_]); + } +#endif + } +#ifndef __x86_64__ + resp += 4; +#endif +} + +#if 1 +static void recLB() { +// Rt = mem[Rs + Im] (signed) + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + if (!_Rt_) return; + // since bios is readonly it won't change + MapConst(_Rt_, psxRs8(addr)); + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVSX32M8toR(EAX, (uptr)&psxM[addr & 0x1fffff]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVSX32M8toR(EAX, (uptr)&psxH[addr & 0xfff]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + } +// SysPrintf("unhandled r8 %x\n", addr); + } + + SetArg_OfB(X86ARG1); + CALLFunc((uptr)psxMemRead8); + if (_Rt_) { + iRegs[_Rt_].state = ST_UNK; + MOVSX32R8toR(EAX, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + } +// ADD32ItoR(ESP, 4); +} + +static void recLBU() { +// Rt = mem[Rs + Im] (unsigned) + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + if (!_Rt_) return; + // since bios is readonly it won't change + MapConst(_Rt_, psxRu8(addr)); + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVZX32M8toR(EAX, (uptr)&psxM[addr & 0x1fffff]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVZX32M8toR(EAX, (uptr)&psxH[addr & 0xfff]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + } +// SysPrintf("unhandled r8u %x\n", addr); + } + + SetArg_OfB(X86ARG1); + CALLFunc((uptr)psxMemRead8); + if (_Rt_) { + iRegs[_Rt_].state = ST_UNK; + MOVZX32R8toR(EAX, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + } +// ADD32ItoR(ESP, 4); +} + +static void recLH() { +// Rt = mem[Rs + Im] (signed) + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + if (!_Rt_) return; + // since bios is readonly it won't change + MapConst(_Rt_, psxRs16(addr)); + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVSX32M16toR(EAX, (uptr)&psxM[addr & 0x1fffff]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVSX32M16toR(EAX, (uptr)&psxH[addr & 0xfff]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + } +// SysPrintf("unhandled r16 %x\n", addr); + } + + SetArg_OfB(X86ARG1); + CALLFunc((uptr)psxMemRead16); + if (_Rt_) { + iRegs[_Rt_].state = ST_UNK; + MOVSX32R16toR(EAX, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + } +// ADD32ItoR(ESP, 4); +} + +static void recLHU() { +// Rt = mem[Rs + Im] (unsigned) + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + if (!_Rt_) return; + // since bios is readonly it won't change + MapConst(_Rt_, psxRu16(addr)); + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVZX32M16toR(EAX, (uptr)&psxM[addr & 0x1fffff]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOVZX32M16toR(EAX, (uptr)&psxH[addr & 0xfff]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80) { + if (addr >= 0x1f801c00 && addr < 0x1f801e00) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + //PUSHI (addr); + MOV64ItoR(X86ARG1, addr); + //CALLFunc ((uptr)SPU_readRegister); + MOV64ItoR(RAX, (uptr)SPU_readRegister); + CALL64R(RAX); + MOVZX32R16toR(EAX, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); +#ifndef __WIN32__ + resp+= 4; +#endif + return; + } + switch (addr) { + case 0x1f801100: case 0x1f801110: case 0x1f801120: + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + //PUSHI((addr >> 4) & 0x3); + MOV64ItoR(X86ARG1, (addr >> 4) & 0x3); + CALLFunc((uptr)psxRcntRcount); + MOVZX32R16toR(EAX, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + resp+= 4; + return; + + case 0x1f801104: case 0x1f801114: case 0x1f801124: + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOV64ItoR(X86ARG1, (addr >> 4) & 0x3); + CALLFunc((uptr)psxRcntRmode); + MOVZX32R16toR(EAX, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + resp+= 4; + return; + + case 0x1f801108: case 0x1f801118: case 0x1f801128: + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOV64ItoR(X86ARG1, (addr >> 4) & 0x3); + CALLFunc((uptr)psxRcntRtarget); + MOVZX32R16toR(EAX, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + resp+= 4; + return; + } + } +// SysPrintf("unhandled r16u %x\n", addr); + } + + SetArg_OfB(X86ARG1); + CALLFunc((uptr)psxMemRead16); + if (_Rt_) { + iRegs[_Rt_].state = ST_UNK; + MOVZX32R16toR(EAX, EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + } +// ADD32ItoR(ESP, 4); +} + +static void recLW() { +// Rt = mem[Rs + Im] (unsigned) + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + if (!_Rt_) return; + // since bios is readonly it won't change + MapConst(_Rt_, psxRu32(addr)); + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxM[addr & 0x1fffff]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxH[addr & 0xfff]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80) { + switch (addr) { + case 0x1f801080: case 0x1f801084: case 0x1f801088: + case 0x1f801090: case 0x1f801094: case 0x1f801098: + case 0x1f8010a0: case 0x1f8010a4: case 0x1f8010a8: + case 0x1f8010b0: case 0x1f8010b4: case 0x1f8010b8: + case 0x1f8010c0: case 0x1f8010c4: case 0x1f8010c8: + case 0x1f8010d0: case 0x1f8010d4: case 0x1f8010d8: + case 0x1f8010e0: case 0x1f8010e4: case 0x1f8010e8: + case 0x1f801070: case 0x1f801074: + case 0x1f8010f0: case 0x1f8010f4: + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxH[addr & 0xffff]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + + case 0x1f801810: + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + CALLFunc((uptr)GPU_readData); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + + case 0x1f801814: + if (!_Rt_) return; + iRegs[_Rt_].state = ST_UNK; + + CALLFunc((uptr)GPU_readStatus); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + } +// SysPrintf("unhandled r32 %x\n", addr); + } + + SetArg_OfB(X86ARG1); + CALLFunc((uptr)psxMemRead32); + if (_Rt_) { + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + } +// ADD32ItoR(ESP, 4); +} + +extern u32 LWL_MASK[4]; +extern u32 LWL_SHIFT[4]; + +void iLWLk(u32 shift) { + if (IsConst(_Rt_)) { + MOV32ItoR(ECX, iRegs[_Rt_].k); + } else { + MOV32MtoR(ECX, (uptr)&psxRegs.GPR.r[_Rt_]); + } + AND32ItoR(ECX, LWL_MASK[shift]); + SHL32ItoR(EAX, LWL_SHIFT[shift]); + OR32RtoR (EAX, ECX); +} + +void recLWL() { +// Rt = Rt Merge mem[Rs + Im] + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + MOV32MtoR(EAX, (uptr)&psxM[addr & 0x1ffffc]); + iLWLk(addr & 3); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + MOV32MtoR(EAX, (uptr)&psxH[addr & 0xffc]); + iLWLk(addr & 3); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + } + + if (IsConst(_Rs_)) MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + //PUSH64R (EAX); + AND32ItoR(EAX, ~3); + //PUSH64R (EAX); + MOV32RtoR(X86ARG1, EAX); + CALLFunc((uptr)psxMemRead32); + + if (_Rt_) { + //ADD32ItoR(ESP, 4); + //POP64R (EDX); + if (IsConst(_Rs_)) MOV32ItoR(EDX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EDX, (uptr)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EDX, _Imm_); + } + + AND32ItoR(EDX, 0x3); // shift = addr & 3; + + MOV64ItoR(ECX, (uptr)LWL_SHIFT); + MOV32RmStoR(ECX, ECX, EDX, 2); + SHL32CLtoR(EAX); // mem(EAX) << LWL_SHIFT[shift] + + MOV64ItoR(ECX, (uptr)LWL_MASK); + MOV32RmStoR(ECX, ECX, EDX, 2); + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k); + } else { + MOV32MtoR(EDX, (uptr)&psxRegs.GPR.r[_Rt_]); + } + AND32RtoR(EDX, ECX); // _rRt_ & LWL_MASK[shift] + + OR32RtoR(EAX, EDX); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + //} else { + //ADD64ItoR(RSP, 8); + //resp+= 8; + } +} + +/* +static void recLWBlock(int count) { + u32 *code = PSXM(pc); + int i, respsave; +// Rt = mem[Rs + Im] (unsigned) + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + // since bios is readonly it won't change + for (i=0; i> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + MOV32MtoR(EAX, (uptr)&psxM[addr & 0x1ffffc]); + iLWRk(addr & 3); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + MOV32MtoR(EAX, (uptr)&psxH[addr & 0xffc]); + iLWRk(addr & 3); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + } + + if (IsConst(_Rs_)) MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + PUSHR(EAX); + AND32ItoR(EAX, ~3); + MOV32RtoR(X86ARG1, EAX); + CALLFunc((uptr)psxMemRead32); + + POPR (EDX); + if (_Rt_) { + AND32ItoR(EDX, 0x3); // shift = addr & 3; + + MOV64ItoR(ECX, (uptr)LWR_SHIFT); + MOV32RmStoR(ECX, ECX, EDX, 2); + SHR32CLtoR(EAX); // mem(EAX) >> LWR_SHIFT[shift] + + MOV64ItoR(ECX, (uptr)LWR_MASK); + MOV32RmStoR(ECX, ECX, EDX, 2); + + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k); + } else { + MOV32MtoR(EDX, (uptr)&psxRegs.GPR.r[_Rt_]); + } + AND32RtoR(EDX, ECX); // _rRt_ & LWR_MASK[shift] + + OR32RtoR(EAX, EDX); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); + //} else { + //resp+= 8; + } +} + +static void recSB() { +// mem[Rs + Im] = Rt + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (IsConst(_Rt_)) { + MOV8ItoM((uptr)&psxM[addr & 0x1fffff], (u8)iRegs[_Rt_].k); + } else { + MOV8MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV8RtoM((uptr)&psxM[addr & 0x1fffff], EAX); + } + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (IsConst(_Rt_)) { + MOV8ItoM((uptr)&psxH[addr & 0xfff], (u8)iRegs[_Rt_].k); + } else { + MOV8MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV8RtoM((uptr)&psxH[addr & 0xfff], EAX); + } + return; + } +// SysPrintf("unhandled w8 %x\n", addr); + } + + if (IsConst(_Rt_)) { + MOV64ItoR(X86ARG2, iRegs[_Rt_].k); + } else { + MOV32MtoR(X86ARG2, (uptr)&psxRegs.GPR.r[_Rt_]); + } + SetArg_OfB(X86ARG1); + CALLFunc((uptr)psxMemWrite8); +// ADD32ItoR(ESP, 8); +} + +static void recSH() { +// mem[Rs + Im] = Rt + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (IsConst(_Rt_)) { + MOV16ItoM((uptr)&psxM[addr & 0x1fffff], (u16)iRegs[_Rt_].k); + } else { + MOV16MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV16RtoM((uptr)&psxM[addr & 0x1fffff], EAX); + } + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (IsConst(_Rt_)) { + MOV16ItoM((uptr)&psxH[addr & 0xfff], (u16)iRegs[_Rt_].k); + } else { + MOV16MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV16RtoM((uptr)&psxH[addr & 0xfff], EAX); + } + return; + } + if (t == 0x1f80) { + if (addr >= 0x1f801c00 && addr < 0x1f801e00) { + if (IsConst(_Rt_)) { + MOV64ItoR(X86ARG2, iRegs[_Rt_].k); + } else { + MOV32MtoR(X86ARG2, (uptr)&psxRegs.GPR.r[_Rt_]); + } + MOV64ItoR(X86ARG1, addr); + CALLFunc ((uptr)SPU_writeRegister); +#ifndef __WIN32__ + //resp+= 8; +#endif + return; + } + } +// SysPrintf("unhandled w16 %x\n", addr); + } + + if (IsConst(_Rt_)) { + MOV64ItoR(X86ARG2, iRegs[_Rt_].k); + } else { + MOV32MtoR(X86ARG2, (uptr)&psxRegs.GPR.r[_Rt_]); + } + SetArg_OfB(X86ARG1); + CALLFunc((uptr)psxMemWrite16); +// ADD32ItoR(ESP, 8); +} + +static void recSW() { +// mem[Rs + Im] = Rt + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (IsConst(_Rt_)) { + MOV32ItoM((uptr)&psxM[addr & 0x1fffff], iRegs[_Rt_].k); + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((uptr)&psxM[addr & 0x1fffff], EAX); + } + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (IsConst(_Rt_)) { + MOV32ItoM((uptr)&psxH[addr & 0xfff], iRegs[_Rt_].k); + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((uptr)&psxH[addr & 0xfff], EAX); + } + return; + } + if (t == 0x1f80) { + switch (addr) { + case 0x1f801080: case 0x1f801084: + case 0x1f801090: case 0x1f801094: + case 0x1f8010a0: case 0x1f8010a4: + case 0x1f8010b0: case 0x1f8010b4: + case 0x1f8010c0: case 0x1f8010c4: + case 0x1f8010d0: case 0x1f8010d4: + case 0x1f8010e0: case 0x1f8010e4: + case 0x1f801074: + case 0x1f8010f0: + if (IsConst(_Rt_)) { + MOV32ItoM((uptr)&psxH[addr & 0xffff], iRegs[_Rt_].k); + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32RtoM((uptr)&psxH[addr & 0xffff], EAX); + } + return; + + case 0x1f801810: + if (IsConst(_Rt_)) { + MOV64ItoR(X86ARG1, iRegs[_Rt_].k); + } else { + MOV32MtoR(X86ARG1, (uptr)&psxRegs.GPR.r[_Rt_]); + } + CALLFunc((uptr)GPU_writeData); +#ifndef __WIN32__ + //resp+= 4; +#endif + return; + + case 0x1f801814: + if (IsConst(_Rt_)) { + MOV64ItoR(X86ARG1, iRegs[_Rt_].k); + } else { + MOV32MtoR(X86ARG1, (uptr)&psxRegs.GPR.r[_Rt_]); + } + CALLFunc((uptr)GPU_writeStatus); +#ifndef __WIN32__ + //resp+= 4; +#endif + } + } +// SysPrintf("unhandled w32 %x\n", addr); + } + + if (IsConst(_Rt_)) { + MOV64ItoR(X86ARG2, iRegs[_Rt_].k); + } else { + MOV32MtoR(X86ARG2, (uptr)&psxRegs.GPR.r[_Rt_]); + } + SetArg_OfB(X86ARG1); + CALLFunc((uptr)psxMemWrite32); +// ADD32ItoR(ESP, 8); + //resp+= 8; +} + +/* +static void recSWBlock(int count) { + u32 *code; + int i, respsave; +// mem[Rs + Im] = Rt + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + code = PSXM(pc); + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + for (i=0; i> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + MOV32MtoR(EAX, (uptr)&psxM[addr & 0x1ffffc]); + iSWLk(addr & 3); + MOV32RtoM((uptr)&psxM[addr & 0x1ffffc], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + MOV32MtoR(EAX, (uptr)&psxH[addr & 0xffc]); + iSWLk(addr & 3); + MOV32RtoM((uptr)&psxH[addr & 0xffc], EAX); + return; + } + } + + if (IsConst(_Rs_)) MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + PUSHR (EAX); + AND32ItoR(EAX, ~3); + MOV32RtoR(X86ARG1, EAX); + + CALLFunc((uptr)psxMemRead32); + + POPR (EDX); + AND32ItoR(EDX, 0x3); // shift = addr & 3; + + MOV64ItoR(ECX, (uptr)SWL_MASK); + MOV32RmStoR(ECX, ECX, EDX, 2); + AND32RtoR(EAX, ECX); // mem & SWL_MASK[shift] + + MOV64ItoR(ECX, (uptr)SWL_SHIFT); + MOV32RmStoR(ECX, ECX, EDX, 2); + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k); + } else { + MOV32MtoR(EDX, (uptr)&psxRegs.GPR.r[_Rt_]); + } + SHR32CLtoR(EDX); // _rRt_ >> SWL_SHIFT[shift] + + OR32RtoR (EAX, EDX); + MOV32RtoR(X86ARG2, EAX); + + if (IsConst(_Rs_)) MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + AND32ItoR(EAX, ~3); + MOV32RtoR(X86ARG1, EAX); + + CALLFunc((uptr)psxMemWrite32); +// ADD32ItoR(ESP, 8); + //resp+= 8; +} + +extern u32 SWR_MASK[4]; +extern u32 SWR_SHIFT[4]; + +void iSWRk(u32 shift) { + if (IsConst(_Rt_)) { + MOV32ItoR(ECX, iRegs[_Rt_].k); + } else { + MOV32MtoR(ECX, (uptr)&psxRegs.GPR.r[_Rt_]); + } + SHL32ItoR(ECX, SWR_SHIFT[shift]); + AND32ItoR(EAX, SWR_MASK[shift]); + OR32RtoR (EAX, ECX); +} + +void recSWR() { +// mem[Rs + Im] = Rt Merge mem[Rs + Im] + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + MOV32MtoR(EAX, (uptr)&psxM[addr & 0x1ffffc]); + iSWRk(addr & 3); + MOV32RtoM((uptr)&psxM[addr & 0x1ffffc], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + MOV32MtoR(EAX, (uptr)&psxH[addr & 0xffc]); + iSWRk(addr & 3); + MOV32RtoM((uptr)&psxH[addr & 0xffc], EAX); + return; + } + } + + if (IsConst(_Rs_)) MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + PUSHR (EAX); + + AND32ItoR(EAX, ~3); + MOV32RtoR(X86ARG1, EAX); + + CALLFunc((uptr)psxMemRead32); + + POPR (EDX); + AND32ItoR(EDX, 0x3); // shift = addr & 3; + + MOV64ItoR(ECX, (uptr)SWR_MASK); + MOV32RmStoR(ECX, ECX, EDX, 2); + AND32RtoR(EAX, ECX); // mem & SWR_MASK[shift] + + MOV64ItoR(ECX, (uptr)SWR_SHIFT); + MOV32RmStoR(ECX, ECX, EDX, 2); + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k); + } else { + MOV32MtoR(EDX, (uptr)&psxRegs.GPR.r[_Rt_]); + } + SHL32CLtoR(EDX); // _rRt_ << SWR_SHIFT[shift] + + OR32RtoR (EAX, EDX); + MOV32RtoR(X86ARG2, EAX); + + if (IsConst(_Rs_)) MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + AND32ItoR(EAX, ~3); + MOV32RtoR(X86ARG1, EAX); + CALLFunc((uptr)psxMemWrite32); +// ADD32ItoR(ESP, 8); + //resp+= 8; +} + +#endif + +#if 0 +REC_FUNC(SLL); +REC_FUNC(SRL); +REC_FUNC(SRA); +#endif +#if 1 +static void recSLL() { +// Rd = Rt << Sa + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rt_].k << _Sa_); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + if (_Sa_) SHL32ItoR(EAX, _Sa_); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recSRL() { +// Rd = Rt >> Sa + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rt_].k >> _Sa_); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + if (_Sa_) SHR32ItoR(EAX, _Sa_); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recSRA() { +// Rd = Rt >> Sa + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rt_)) { + MapConst(_Rd_, (s32)iRegs[_Rt_].k >> _Sa_); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + if (_Sa_) SAR32ItoR(EAX, _Sa_); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } +} +#endif + +#if 0 +REC_FUNC(SLLV); +REC_FUNC(SRLV); +REC_FUNC(SRAV); +#endif + +#if 1 +static void recSLLV() { +// Rd = Rt << Rs + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rt_) && IsConst(_Rs_)) { + MapConst(_Rd_, iRegs[_Rt_].k << iRegs[_Rs_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32ItoR(ECX, iRegs[_Rs_].k); + SHL32CLtoR(EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rt_].k); + MOV32MtoR(ECX, (uptr)&psxRegs.GPR.r[_Rs_]); + SHL32CLtoR(EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32MtoR(ECX, (uptr)&psxRegs.GPR.r[_Rs_]); + SHL32CLtoR(EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recSRLV() { +// Rd = Rt >> Rs + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rt_) && IsConst(_Rs_)) { + MapConst(_Rd_, iRegs[_Rt_].k >> iRegs[_Rs_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32ItoR(ECX, iRegs[_Rs_].k); + SHR32CLtoR(EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rt_].k); + MOV32MtoR(ECX, (uptr)&psxRegs.GPR.r[_Rs_]); + SHR32CLtoR(EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32MtoR(ECX, (uptr)&psxRegs.GPR.r[_Rs_]); + SHR32CLtoR(EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } +} + +static void recSRAV() { +// Rd = Rt >> Rs + if (!_Rd_) return; + +// iFlushRegs(); + + if (IsConst(_Rt_) && IsConst(_Rs_)) { + MapConst(_Rd_, (s32)iRegs[_Rt_].k >> iRegs[_Rs_].k); + } else if (IsConst(_Rs_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32ItoR(ECX, iRegs[_Rs_].k); + SAR32CLtoR(EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else if (IsConst(_Rt_)) { + iRegs[_Rd_].state = ST_UNK; + + MOV32ItoR(EAX, iRegs[_Rt_].k); + MOV32MtoR(ECX, (uptr)&psxRegs.GPR.r[_Rs_]); + SAR32CLtoR(EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } else { + iRegs[_Rd_].state = ST_UNK; + + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + MOV32MtoR(ECX, (uptr)&psxRegs.GPR.r[_Rs_]); + SAR32CLtoR(EAX); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); + } +} +#endif + +#if 0 +REC_SYS(SYSCALL); +REC_SYS(BREAK); +#endif + +int dump = 0; + +#if 1 +static void recSYSCALL() { +// dump=1; + iFlushRegs(); + + MOV32ItoR(EAX, pc - 4); + MOV32RtoM((uptr)&psxRegs.pc, EAX); + MOV64ItoR(X86ARG2, branch == 1 ? 1 : 0); + MOV64ItoR(X86ARG1, 0x20); + CALLFunc((uptr)psxException); + //ADD32ItoR(ESP, 8); + + branch = 2; + iRet(); +} + +static void recBREAK() { +} +#endif + +#if 0 +REC_FUNC(MFHI); +REC_FUNC(MTHI); +REC_FUNC(MFLO); +REC_FUNC(MTLO); +#endif +#if 1 +static void recMFHI() { +// Rd = Hi + if (!_Rd_) return; + + iRegs[_Rd_].state = ST_UNK; + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.n.hi); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); +} + +static void recMTHI() { +// Hi = Rs + + if (IsConst(_Rs_)) { + MOV32ItoM((uptr)&psxRegs.GPR.n.hi, iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + MOV32RtoM((uptr)&psxRegs.GPR.n.hi, EAX); + } +} + +static void recMFLO() { +// Rd = Lo + if (!_Rd_) return; + + iRegs[_Rd_].state = ST_UNK; + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.n.lo); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rd_], EAX); +} + +static void recMTLO() { +// Lo = Rs + + if (IsConst(_Rs_)) { + MOV32ItoM((uptr)&psxRegs.GPR.n.lo, iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + MOV32RtoM((uptr)&psxRegs.GPR.n.lo, EAX); + } +} +#endif + +#if 0 +REC_BRANCH(J); +REC_BRANCH(JR); +REC_BRANCH(JAL); +REC_BRANCH(JALR); +REC_BRANCH(BLTZ); +REC_BRANCH(BGTZ); +REC_BRANCH(BLTZAL); +REC_BRANCH(BGEZAL); +REC_BRANCH(BNE); +REC_BRANCH(BEQ); +REC_BRANCH(BLEZ); +REC_BRANCH(BGEZ); +#endif +#if 1 +static void recBLTZ() { +// Branch if Rs < 0 + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + + if (bpc == pc+4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k < 0) { + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } + + CMP32ItoM((uptr)&psxRegs.GPR.r[_Rs_], 0); + j32Ptr[4] = JL32(0); + + iBranch(pc+4, 1); + + x86SetJ32(j32Ptr[4]); + + iBranch(bpc, 0); + pc+=4; +} + +static void recBGTZ() { +// Branch if Rs > 0 + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + if (bpc == pc+4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k > 0) { + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } + + CMP32ItoM((uptr)&psxRegs.GPR.r[_Rs_], 0); + j32Ptr[4] = JG32(0); + + iBranch(pc+4, 1); + + x86SetJ32(j32Ptr[4]); + + iBranch(bpc, 0); + pc+=4; +} + +static void recBLTZAL() { +// Branch if Rs < 0 + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + if (bpc == pc+4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k < 0) { + MOV32ItoM((uptr)&psxRegs.GPR.r[31], pc + 4); + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } + + CMP32ItoM((uptr)&psxRegs.GPR.r[_Rs_], 0); + j32Ptr[4] = JL32(0); + + iBranch(pc+4, 1); + + x86SetJ32(j32Ptr[4]); + + MOV32ItoM((uptr)&psxRegs.GPR.r[31], pc + 4); + iBranch(bpc, 0); + pc+=4; +} + +static void recBGEZAL() { +// Branch if Rs >= 0 + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + if (bpc == pc+4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k >= 0) { + MOV32ItoM((uptr)&psxRegs.GPR.r[31], pc + 4); + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } + + CMP32ItoM((uptr)&psxRegs.GPR.r[_Rs_], 0); + j32Ptr[4] = JGE32(0); + + iBranch(pc+4, 1); + + x86SetJ32(j32Ptr[4]); + + MOV32ItoM((uptr)&psxRegs.GPR.r[31], pc + 4); + iBranch(bpc, 0); + pc+=4; +} + +static void recJ() { +// j target + + iJump(_Target_ * 4 + (pc & 0xf0000000)); +} + +static void recJAL() { +// jal target + + MapConst(31, pc + 4); + + iJump(_Target_ * 4 + (pc & 0xf0000000)); +} + +static void recJR() { +// jr Rs + + if (IsConst(_Rs_)) { + MOV32ItoM((uptr)&target, iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + MOV32RtoM((uptr)&target, EAX); + } + + SetBranch(); +} + +static void recJALR() { +// jalr Rs + + if (IsConst(_Rs_)) { + MOV32ItoM((uptr)&target, iRegs[_Rs_].k); + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + MOV32RtoM((uptr)&target, EAX); + } + + if (_Rd_) { + MapConst(_Rd_, pc + 4); + } + + SetBranch(); +} + +static void recBEQ() { +// Branch if Rs == Rt + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + if (bpc == pc+4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (_Rs_ == _Rt_) { + iJump(bpc); + } else { + if (IsConst(_Rs_) && IsConst(_Rt_)) { + if (iRegs[_Rs_].k == iRegs[_Rt_].k) { + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } else if (IsConst(_Rs_)) { + CMP32ItoM((uptr)&psxRegs.GPR.r[_Rt_], iRegs[_Rs_].k); + } else if (IsConst(_Rt_)) { + CMP32ItoM((uptr)&psxRegs.GPR.r[_Rs_], iRegs[_Rt_].k); + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + CMP32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + } + + j32Ptr[4] = JE32(0); + + iBranch(pc+4, 1); + + x86SetJ32(j32Ptr[4]); + + iBranch(bpc, 0); + pc+=4; + } +} + +static void recBNE() { +// Branch if Rs != Rt + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + if (bpc == pc+4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + if (iRegs[_Rs_].k != iRegs[_Rt_].k) { + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } else if (IsConst(_Rs_)) { + CMP32ItoM((uptr)&psxRegs.GPR.r[_Rt_], iRegs[_Rs_].k); + } else if (IsConst(_Rt_)) { + CMP32ItoM((uptr)&psxRegs.GPR.r[_Rs_], iRegs[_Rt_].k); + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rs_]); + CMP32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + } + j32Ptr[4] = JNE32(0); + + iBranch(pc+4, 1); + + x86SetJ32(j32Ptr[4]); + + iBranch(bpc, 0); + pc+=4; +} + +static void recBLEZ() { +// Branch if Rs <= 0 + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + if (bpc == pc+4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k <= 0) { + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } + + CMP32ItoM((uptr)&psxRegs.GPR.r[_Rs_], 0); + j32Ptr[4] = JLE32(0); + + iBranch(pc+4, 1); + + x86SetJ32(j32Ptr[4]); + + iBranch(bpc, 0); + pc+=4; +} + +static void recBGEZ() { +// Branch if Rs >= 0 + u32 bpc = _Imm_ * 4 + pc; + +// iFlushRegs(); + if (bpc == pc+4 && psxTestLoadDelay(_Rs_, PSXMu32(bpc)) == 0) { + return; + } + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k >= 0) { + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } + + CMP32ItoM((uptr)&psxRegs.GPR.r[_Rs_], 0); + j32Ptr[4] = JGE32(0); + + iBranch(pc+4, 1); + + x86SetJ32(j32Ptr[4]); + + iBranch(bpc, 0); + pc+=4; +} +#endif + +#if 0 +REC_FUNC(MFC0); +REC_SYS(MTC0); +REC_FUNC(CFC0); +REC_SYS(CTC0); +REC_FUNC(RFE); +#endif +//REC_SYS(MTC0); +#if 1 +static void recMFC0() { +// Rt = Cop0->Rd + if (!_Rt_) return; + + iRegs[_Rt_].state = ST_UNK; + MOV32MtoR(EAX, (uptr)&psxRegs.CP0.r[_Rd_]); + MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX); +} + +static void recCFC0() { +// Rt = Cop0->Rd + + recMFC0(); +} + +//* +void psxMTC0(); +static void recMTC0() { +// Cop0->Rd = Rt + + if (IsConst(_Rt_)) { + switch (_Rd_) { + case 12: + MOV32ItoM((uptr)&psxRegs.CP0.r[_Rd_], iRegs[_Rt_].k); + break; + case 13: + MOV32ItoM((uptr)&psxRegs.CP0.r[_Rd_], iRegs[_Rt_].k & ~(0xfc00)); + break; + default: + MOV32ItoM((uptr)&psxRegs.CP0.r[_Rd_], iRegs[_Rt_].k); + break; + } + } else { + MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]); + switch (_Rd_) { + case 13: + AND32ItoR(EAX, ~(0xfc00)); + break; + } + MOV32RtoM((uptr)&psxRegs.CP0.r[_Rd_], EAX); + } + + if (_Rd_ == 12 || _Rd_ == 13) { + iFlushRegs(); + MOV32ItoM((uptr)&psxRegs.pc, (u32)pc); + CALLFunc((uptr)psxTestSWInts); + if (branch == 0) { + branch = 2; + iRet(); + } + } +}//*/ + +static void recCTC0() { +// Cop0->Rd = Rt + + recMTC0(); +} + +static void recRFE() { + MOV32MtoR(EAX, (uptr)&psxRegs.CP0.n.Status); + MOV32RtoR(ECX, EAX); + AND32ItoR(EAX, 0xfffffff0); + AND32ItoR(ECX, 0x3c); + SHR32ItoR(ECX, 2); + OR32RtoR (EAX, ECX); + MOV32RtoM((uptr)&psxRegs.CP0.n.Status, EAX); + + iFlushRegs(); + MOV32ItoM((uptr)&psxRegs.pc, (u32)pc); + CALLFunc((uptr)psxTestSWInts); + if (branch == 0) { + branch = 2; + iRet(); + } +} +#endif + +#include "iGte.h" + +// + +static void recHLE() { + iFlushRegs(); + + CALLFunc((uptr)psxHLEt[psxRegs.code & 0xffff]); + branch = 2; + iRet(); +} + +// + +static void (*recBSC[64])() = { + recSPECIAL, recREGIMM, recJ , recJAL , recBEQ , recBNE , recBLEZ, recBGTZ, + recADDI , recADDIU , recSLTI, recSLTIU, recANDI, recORI , recXORI, recLUI , + recCOP0 , recNULL , recCOP2, recNULL , recNULL, recNULL, recNULL, recNULL, + recNULL , recNULL , recNULL, recNULL , recNULL, recNULL, recNULL, recNULL, + recLB , recLH , recLWL , recLW , recLBU , recLHU , recLWR , recNULL, + recSB , recSH , recSWL , recSW , recNULL, recNULL, recSWR , recNULL, + recNULL , recNULL , recLWC2, recNULL , recNULL, recNULL, recNULL, recNULL, + recNULL , recNULL , recSWC2, recHLE , recNULL, recNULL, recNULL, recNULL +}; + +static void (*recSPC[64])() = { + recSLL , recNULL, recSRL , recSRA , recSLLV , recNULL , recSRLV, recSRAV, + recJR , recJALR, recNULL, recNULL, recSYSCALL, recBREAK, recNULL, recNULL, + recMFHI, recMTHI, recMFLO, recMTLO, recNULL , recNULL , recNULL, recNULL, + recMULT, recMULTU, recDIV, recDIVU, recNULL , recNULL , recNULL, recNULL, + recADD , recADDU, recSUB , recSUBU, recAND , recOR , recXOR , recNOR , + recNULL, recNULL, recSLT , recSLTU, recNULL , recNULL , recNULL, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL , recNULL , recNULL, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL , recNULL , recNULL, recNULL +}; + +static void (*recREG[32])() = { + recBLTZ , recBGEZ , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recNULL , recNULL , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recBLTZAL, recBGEZAL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recNULL , recNULL , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL +}; + +static void (*recCP0[32])() = { + recMFC0, recNULL, recCFC0, recNULL, recMTC0, recNULL, recCTC0, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recRFE , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL +}; + +static void (*recCP2[64])() = { + recBASIC, recRTPS , recNULL , recNULL, recNULL, recNULL , recNCLIP, recNULL, // 00 + recNULL , recNULL , recNULL , recNULL, recOP , recNULL , recNULL , recNULL, // 08 + recDPCS , recINTPL, recMVMVA, recNCDS, recCDP , recNULL , recNCDT , recNULL, // 10 + recNULL , recNULL , recNULL , recNCCS, recCC , recNULL , recNCS , recNULL, // 18 + recNCT , recNULL , recNULL , recNULL, recNULL, recNULL , recNULL , recNULL, // 20 + recSQR , recDCPL , recDPCT , recNULL, recNULL, recAVSZ3, recAVSZ4, recNULL, // 28 + recRTPT , recNULL , recNULL , recNULL, recNULL, recNULL , recNULL , recNULL, // 30 + recNULL , recNULL , recNULL , recNULL, recNULL, recGPF , recGPL , recNCCT // 38 +}; + +static void (*recCP2BSC[32])() = { + recMFC2, recNULL, recCFC2, recNULL, recMTC2, recNULL, recCTC2, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL +}; + + +static void recRecompile() { + char *p; + char *ptr; + + dump = 0; + resp = 0; + + /* if x86Ptr reached the mem limit reset whole mem */ + if (((uptr)x86Ptr - (uptr)recMem) >= (RECMEM_SIZE - PTRMULT*0x10000)) + recReset(); + + x86Align(32); + ptr = x86Ptr; + + PC_RECP(psxRegs.pc) = x86Ptr; + pc = psxRegs.pc; + pcold = pc; + + //Make some stack space for function arguments spill (x86-64 calling conventions) + // 0x38 = 7 args, should be plenty... + SUB64ItoR(RSP, STACKSIZE); + + for (count=0; count<500;) { + p = (char *)PSXM(pc); + if (p == NULL) recError(); + psxRegs.code = *(u32 *)p; +/* + if ((psxRegs.code >> 26) == 0x23) { // LW + int i; + u32 code; + + for (i=1;; i++) { + p = (char *)PSXM(pc+i*4); + if (p == NULL) recError(); + code = *(u32 *)p; + + if ((code >> 26) != 0x23 || + _fRs_(code) != _Rs_ || + _fImm_(code) != (_Imm_+i*4)) + break; + } + if (i > 1) { + recLWBlock(i); + pc = pc + i*4; continue; + } + } + + if ((psxRegs.code >> 26) == 0x2b) { // SW + int i; + u32 code; + + for (i=1;; i++) { + p = (char *)PSXM(pc+i*4); + if (p == NULL) recError(); + code = *(u32 *)p; + + if ((code >> 26) != 0x2b || + _fRs_(code) != _Rs_ || + _fImm_(code) != (_Imm_+i*4)) + break; + } + if (i > 1) { + recSWBlock(i); + pc = pc + i*4; continue; + } + }*/ + + pc+=4; count++; + recBSC[psxRegs.code>>26](); + + if (branch) { + branch = 0; + if (dump) iDumpBlock(ptr); + return; + } + } + + iFlushRegs(); + + MOV32ItoM((uptr)&psxRegs.pc, pc); + iRet(); +} + + +R3000Acpu psxRec = { + recInit, + recReset, + recExecute, + recExecuteBlock, + recClear, + recShutdown +}; diff --git a/libpcsxcore/ix86_64/ix86-64.c b/libpcsxcore/ix86_64/ix86-64.c new file mode 100644 index 0000000..0582f35 --- /dev/null +++ b/libpcsxcore/ix86_64/ix86-64.c @@ -0,0 +1,3139 @@ +/* + * ix86 core v0.6.2 + * Authors: linuzappz + * alexey silinov + * goldfinger + * zerofrog(@gmail.com) + */ + +// stop compiling if NORECBUILD build (only for Visual Studio) +#if !(defined(_MSC_VER) && defined(PCSX2_NORECBUILD)) + +#include +#include +#include +#include "ix86-64.h" + +#ifdef __x86_64__ + +#ifdef _MSC_VER +// visual studio calling convention +x86IntRegType g_x86savedregs[] = { RBX, RBP, RSI, RDI, R12, R13, R14, R15 }; +x86IntRegType g_x86tempregs[] = { R8, R9, R10, R11, RDX, RCX }; + +// arranged in savedreg -> tempreg order +x86IntRegType g_x86allregs[14] = { RBX, RBP, RSI, RDI, R12, R13, R14, R15, R8, R9, R10, R11, RDX, RCX }; + +#else +// standard calling convention + +// registers saved by called functions (no need to flush them across calls) +x86IntRegType g_x86savedregs[] = { RBX, RBP, R12, R13, R14, R15 }; +// temp registers that need to be saved across calls +x86IntRegType g_x86tempregs[] = { RCX, RDX, R8, R9, R10, R11, RSI, RDI }; + +// arranged in savedreg -> tempreg order +x86IntRegType g_x86allregs[14] = { RBX, RBP, R12, R13, R14, R15, RCX, RDX, R8, R9, R10, R11, RSI, RDI }; + +#endif + +x86IntRegType g_x868bitregs[11] = { RBX, R12, R13, R14, R15, RCX, RDX, R8, R9, R10, R11 }; +x86IntRegType g_x86non8bitregs[3] = { RBP, RSI, RDI }; + +#endif // __x86_64__ + +s8 *x86Ptr; +u8 *j8Ptr[32]; +u32 *j32Ptr[32]; + +void WriteRmOffset(x86IntRegType to, int offset) +{ + if( (to&7) == ESP ) { + if( offset == 0 ) { + ModRM( 0, 0, 4 ); + ModRM( 0, ESP, 4 ); + } + else if( offset < 128 && offset >= -128 ) { + ModRM( 1, 0, 4 ); + ModRM( 0, ESP, 4 ); + write8(offset); + } + else { + ModRM( 2, 0, 4 ); + ModRM( 0, ESP, 4 ); + write32(offset); + } + } + else { + if( offset == 0 ) { + ModRM( 0, 0, to ); + } + else if( offset < 128 && offset >= -128 ) { + ModRM( 1, 0, to ); + write8(offset); + } + else { + ModRM( 2, 0, to ); + write32(offset); + } + } +} + +void WriteRmOffsetFrom(x86IntRegType to, x86IntRegType from, int offset) +{ + if ((from&7) == ESP) { + if( offset == 0 ) { + ModRM( 0, to, 0x4 ); + SibSB( 0, 0x4, 0x4 ); + } + else if( offset < 128 && offset >= -128 ) { + ModRM( 1, to, 0x4 ); + SibSB( 0, 0x4, 0x4 ); + write8(offset); + } + else { + ModRM( 2, to, 0x4 ); + SibSB( 0, 0x4, 0x4 ); + write32(offset); + } + } + else { + if( offset == 0 ) { + ModRM( 0, to, from ); + } + else if( offset < 128 && offset >= -128 ) { + ModRM( 1, to, from ); + write8(offset); + } + else { + ModRM( 2, to, from ); + write32(offset); + } + } +} + +// This function is just for rec debugging purposes +void CheckX86Ptr( void ) +{ +} + +void writeVAROP(unsigned opl, u64 op) +{ + while (opl--) + { + write8(op & 0xFF); + op >>= 8; + } +} + +#define writeVARROP(REX, opl, op) ({ \ + if (opl > 1 && ((op & 0xFF) == 0x66 || (op & 0xFF) == 0xF3 || (op & 0xFF) == 0xF2)) { \ + write8(op & 0xFF); \ + opl --; \ + op >>= 8; \ + } \ + REX; \ + writeVAROP(opl, op); \ + }) + +void MEMADDR_OP(bool w, unsigned opl, u64 op, bool isreg, int reg, uptr p, sptr off) +{ +#ifdef __x86_64__ + sptr pr = MEMADDR_(p, 5 + opl + (w || reg >= 8) + off); + if (SPTR32(pr)) + { + writeVARROP(RexR(w, reg), opl, op); + ModRM(0, reg, DISP32); + write32(pr); + } + else if (UPTR32(p)) + { + writeVARROP(RexR(w, reg), opl, op); + ModRM(0, reg, SIB); + SibSB(0, SIB, DISP32); + write32(p); + } + else + { + assert(!isreg || reg != X86_TEMP); + MOV64ItoR(X86_TEMP, p); + writeVARROP(RexRB(w, reg, X86_TEMP), opl, op); + ModRM(0, reg, X86_TEMP); + } +#else + writeVARROP(RexR(w, reg), opl, op); + ModRM(0, reg, DISP32); + write32(p); +#endif +} + +void SET8R( int cc, int to ) +{ + RexB(0, to); + write8( 0x0F ); + write8( cc ); + write8( 0xC0 | ( to ) ); +} + +u8* J8Rel( int cc, int to ) +{ + write8( cc ); + write8( to ); + return x86Ptr - 1; +} + +u16* J16Rel( int cc, u32 to ) +{ + write16( 0x0F66 ); + write8( cc ); + write16( to ); + return (u16*)( x86Ptr - 2 ); +} + +u32* J32Rel( int cc, u32 to ) +{ + write8( 0x0F ); + write8( cc ); + write32( to ); + return (u32*)( x86Ptr - 4 ); +} + +void CMOV32RtoR( int cc, int to, int from ) +{ + RexRB(0,to, from); + write8( 0x0F ); + write8( cc ); + ModRM( 3, to, from ); +} + +void CMOV32MtoR( int cc, x86IntRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, cc), true, to, from, 0); +} + +//////////////////////////////////////////////////// +void x86SetPtr( char* ptr ) +{ + x86Ptr = ptr; +} + +//////////////////////////////////////////////////// +void x86Shutdown( void ) +{ +} + +//////////////////////////////////////////////////// +void x86SetJ8( u8* j8 ) +{ + u32 jump = ( x86Ptr - (s8*)j8 ) - 1; + + if ( jump > 0x7f ) { + assert(0); + SysPrintf( "j8 greater than 0x7f!!\n" ); + } + *j8 = (u8)jump; +} + +void x86SetJ8A( u8* j8 ) +{ + u32 jump = ( x86Ptr - (s8*)j8 ) - 1; + + if ( jump > 0x7f ) { + assert(0); + SysPrintf( "j8 greater than 0x7f!!\n" ); + } + + if( ((uptr)x86Ptr&0xf) > 4 ) { + + uptr newjump = jump + 16-((uptr)x86Ptr&0xf); + + if( newjump <= 0x7f ) { + jump = newjump; + while((uptr)x86Ptr&0xf) *x86Ptr++ = 0x90; + } + } + *j8 = (u8)jump; +} + +void x86SetJ16( u16 *j16 ) +{ + // doesn't work + u32 jump = ( x86Ptr - (s8*)j16 ) - 2; + + if ( jump > 0x7fff ) { + assert(0); + SysPrintf( "j16 greater than 0x7fff!!\n" ); + } + *j16 = (u16)jump; +} + +void x86SetJ16A( u16 *j16 ) +{ + if( ((uptr)x86Ptr&0xf) > 4 ) { + while((uptr)x86Ptr&0xf) *x86Ptr++ = 0x90; + } + x86SetJ16(j16); +} + +//////////////////////////////////////////////////// +void x86SetJ32( u32* j32 ) +{ + *j32 = ( x86Ptr - (s8*)j32 ) - 4; +} + +void x86SetJ32A( u32* j32 ) +{ + while((uptr)x86Ptr&0xf) *x86Ptr++ = 0x90; + x86SetJ32(j32); +} + +//////////////////////////////////////////////////// +void x86Align( int bytes ) +{ + // fordward align + x86Ptr = (s8*)( ( (uptr)x86Ptr + bytes - 1) & ~( bytes - 1 ) ); +} + +/********************/ +/* IX86 intructions */ +/********************/ + +void STC( void ) +{ + write8( 0xF9 ); +} + +void CLC( void ) +{ + write8( 0xF8 ); +} + +//////////////////////////////////// +// mov instructions / +//////////////////////////////////// + +/* mov r64 to r64 */ +void MOV64RtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(1, from, to); + write8( 0x89 ); + ModRM( 3, from, to ); +} + +/* mov r64 to m64 */ +void MOV64RtoM( uptr to, x86IntRegType from ) +{ + if (from == RAX) + { + RexR(1, 0); + write8(0xA3); + write64(to); + } + else + { + MEMADDR_OP(1, VAROP1(0x89), true, from, to, 0); + } +} + +/* mov m64 to r64 */ +void MOV64MtoR( x86IntRegType to, uptr from ) +{ + if (to == RAX) + { + RexR(1, 0); + write8(0xA1); + write64(from); + } + else + { + MEMADDR_OP(1, VAROP1(0x8B), true, to, from, 0); + } +} + +/* mov imm32 to m64 */ +void MOV64I32toM(uptr to, u32 from ) +{ + MEMADDR_OP(1, VAROP1(0xC7), false, 0, to, 4); + write32(from); +} + +// mov imm64 to r64 +void MOV64ItoR( x86IntRegType to, u64 from) +{ + RexB(1, to); + write8( 0xB8 | (to & 0x7) ); + write64( from ); +} + +/* mov imm32 to r64 */ +void MOV64I32toR( x86IntRegType to, s32 from ) +{ + RexB(1, to); + write8( 0xC7 ); + ModRM( 0, 0, to ); + write32( from ); +} + +// mov imm64 to [r64+off] +void MOV64ItoRmOffset( x86IntRegType to, u32 from, int offset) +{ + RexB(1,to); + write8( 0xC7 ); + WriteRmOffset(to, offset); + write32(from); +} + +// mov [r64+offset] to r64 +void MOV64RmOffsettoR( x86IntRegType to, x86IntRegType from, int offset ) +{ + RexRB(1, to, from); + write8( 0x8B ); + WriteRmOffsetFrom(to, from, offset); +} + +/* mov [r64][r64*scale] to r64 */ +void MOV64RmStoR( x86IntRegType to, x86IntRegType from, x86IntRegType from2, int scale) { + RexRXB(1, to, from2, from); + write8( 0x8B ); + ModRM( 0, to, 0x4 ); + SibSB(scale, from2, from ); +} + +/* mov r64 to [r64+offset] */ +void MOV64RtoRmOffset( x86IntRegType to, x86IntRegType from, int offset ) +{ + RexRB(1,from,to); + write8( 0x89 ); + WriteRmOffsetFrom(from, to, offset); +} + +/* mov r64 to [r64][r64*scale] */ +void MOV64RtoRmS( x86IntRegType to, x86IntRegType from, x86IntRegType from2, int scale) { + RexRXB(1, to, from2, from); + write8( 0x89 ); + ModRM( 0, to, 0x4 ); + SibSB(scale, from2, from ); +} + + +/* mov r32 to r32 */ +void MOV32RtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(0, from, to); + write8( 0x89 ); + ModRM( 3, from, to ); +} + +/* mov r32 to m32 */ +void MOV32RtoM( uptr to, x86IntRegType from ) +{ + if (from == EAX) + { + write8(0xA3); + write64(to); + } + else + { + MEMADDR_OP(0, VAROP1(0x89), true, from, to, 0); + } +} + +/* mov m32 to r32 */ +void MOV32MtoR( x86IntRegType to, uptr from ) +{ + if (to == RAX) + { + write8(0xA1); + write64(from); + } + else + { + MEMADDR_OP(0, VAROP1(0x8B), true, to, from, 0); + } +} + +/* mov [r32] to r32 */ +void MOV32RmtoR( x86IntRegType to, x86IntRegType from ) { + RexRB(0, to, from); + write8(0x8B); + WriteRmOffsetFrom(to, from, 0); +} + +void MOV32RmtoROffset( x86IntRegType to, x86IntRegType from, int offset ) { + RexRB(0, to, from); + write8( 0x8B ); + WriteRmOffsetFrom(to, from, offset); +} + +/* mov [r32+r32*scale] to r32 */ +void MOV32RmStoR( x86IntRegType to, x86IntRegType from, x86IntRegType from2, int scale) { + RexRXB(0,to,from2,from); + write8( 0x8B ); + ModRM( 0, to, 0x4 ); + SibSB(scale, from2, from ); +} + +// mov r32 to [r32< 0x7f ) { + assert( to <= 0xffffffff ); + return (u8*)JMP32( to ); + } else { + return (u8*)JMP8( to ); + } +} + +/* jmp rel8 */ +u8* JMP8( u8 to ) +{ + write8( 0xEB ); + write8( to ); + return x86Ptr - 1; +} + +/* jmp rel32 */ +u32* JMP32( uptr to ) +{ + assert(SPTR32((sptr)to)); + write8( 0xE9 ); + write32( (sptr)to ); + return (u32*)(x86Ptr - 4 ); +} + +/* jmp r32/r64 */ +void JMPR( x86IntRegType to ) +{ + RexB(0, to); + write8( 0xFF ); + ModRM( 3, 4, to ); +} + +// jmp m32 +void JMP32M( uptr to ) +{ + /* FIXME */ + MEMADDR_OP(0, VAROP1(0xFF), false, 4, to, 0); +} + +/* jp rel8 */ +u8* JP8( u8 to ) { + return J8Rel( 0x7A, to ); +} + +/* jnp rel8 */ +u8* JNP8( u8 to ) { + return J8Rel( 0x7B, to ); +} + +/* je rel8 */ +u8* JE8( u8 to ) { + return J8Rel( 0x74, to ); +} + +/* jz rel8 */ +u8* JZ8( u8 to ) +{ + return J8Rel( 0x74, to ); +} + +/* js rel8 */ +u8* JS8( u8 to ) +{ + return J8Rel( 0x78, to ); +} + +/* jns rel8 */ +u8* JNS8( u8 to ) +{ + return J8Rel( 0x79, to ); +} + +/* jg rel8 */ +u8* JG8( u8 to ) +{ + return J8Rel( 0x7F, to ); +} + +/* jge rel8 */ +u8* JGE8( u8 to ) +{ + return J8Rel( 0x7D, to ); +} + +/* jl rel8 */ +u8* JL8( u8 to ) +{ + return J8Rel( 0x7C, to ); +} + +/* ja rel8 */ +u8* JA8( u8 to ) +{ + return J8Rel( 0x77, to ); +} + +u8* JAE8( u8 to ) +{ + return J8Rel( 0x73, to ); +} + +/* jb rel8 */ +u8* JB8( u8 to ) +{ + return J8Rel( 0x72, to ); +} + +/* jbe rel8 */ +u8* JBE8( u8 to ) +{ + return J8Rel( 0x76, to ); +} + +/* jle rel8 */ +u8* JLE8( u8 to ) +{ + return J8Rel( 0x7E, to ); +} + +/* jne rel8 */ +u8* JNE8( u8 to ) +{ + return J8Rel( 0x75, to ); +} + +/* jnz rel8 */ +u8* JNZ8( u8 to ) +{ + return J8Rel( 0x75, to ); +} + +/* jng rel8 */ +u8* JNG8( u8 to ) +{ + return J8Rel( 0x7E, to ); +} + +/* jnge rel8 */ +u8* JNGE8( u8 to ) +{ + return J8Rel( 0x7C, to ); +} + +/* jnl rel8 */ +u8* JNL8( u8 to ) +{ + return J8Rel( 0x7D, to ); +} + +/* jnle rel8 */ +u8* JNLE8( u8 to ) +{ + return J8Rel( 0x7F, to ); +} + +/* jo rel8 */ +u8* JO8( u8 to ) +{ + return J8Rel( 0x70, to ); +} + +/* jno rel8 */ +u8* JNO8( u8 to ) +{ + return J8Rel( 0x71, to ); +} + +// jb rel8 +u16* JB16( u16 to ) +{ + return J16Rel( 0x82, to ); +} + +// jb rel32 +u32* JB32( u32 to ) +{ + return J32Rel( 0x82, to ); +} + +/* je rel32 */ +u32* JE32( u32 to ) +{ + return J32Rel( 0x84, to ); +} + +/* jz rel32 */ +u32* JZ32( u32 to ) +{ + return J32Rel( 0x84, to ); +} + +/* jg rel32 */ +u32* JG32( u32 to ) +{ + return J32Rel( 0x8F, to ); +} + +/* jge rel32 */ +u32* JGE32( u32 to ) +{ + return J32Rel( 0x8D, to ); +} + +/* jl rel32 */ +u32* JL32( u32 to ) +{ + return J32Rel( 0x8C, to ); +} + +/* jle rel32 */ +u32* JLE32( u32 to ) +{ + return J32Rel( 0x8E, to ); +} + +/* jae rel32 */ +u32* JAE32( u32 to ) +{ + return J32Rel( 0x83, to ); +} + +/* jne rel32 */ +u32* JNE32( u32 to ) +{ + return J32Rel( 0x85, to ); +} + +/* jnz rel32 */ +u32* JNZ32( u32 to ) +{ + return J32Rel( 0x85, to ); +} + +/* jng rel32 */ +u32* JNG32( u32 to ) +{ + return J32Rel( 0x8E, to ); +} + +/* jnge rel32 */ +u32* JNGE32( u32 to ) +{ + return J32Rel( 0x8C, to ); +} + +/* jnl rel32 */ +u32* JNL32( u32 to ) +{ + return J32Rel( 0x8D, to ); +} + +/* jnle rel32 */ +u32* JNLE32( u32 to ) +{ + return J32Rel( 0x8F, to ); +} + +/* jo rel32 */ +u32* JO32( u32 to ) +{ + return J32Rel( 0x80, to ); +} + +/* jno rel32 */ +u32* JNO32( u32 to ) +{ + return J32Rel( 0x81, to ); +} + +// js rel32 +u32* JS32( u32 to ) +{ + return J32Rel( 0x88, to ); +} + + +/* call func */ +void CALLFunc( uptr func ) +{ + sptr p = MEMADDR_(func, 5); + if (SPTR32(p)) + { + CALL32(p); + } + else + { + MOV64ItoR(X86_TEMP, func); + CALL64R(X86_TEMP); + } +} + +/* call rel32 */ +void CALL32( s32 to ) +{ + write8( 0xE8 ); + write32( to ); +} + +/* call r32 */ +void CALL32R( x86IntRegType to ) +{ + RexB(0, to); + write8( 0xFF ); + ModRM( 3, 2, to ); +} + +/* call r64 */ +void CALL64R( x86IntRegType to ) +{ + RexB(0, to); + write8( 0xFF ); + ModRM( 3, 2, to ); +} + +//////////////////////////////////// +// misc instructions / +//////////////////////////////////// + +/* cmp imm32 to r64 */ +void CMP64I32toR( x86IntRegType to, u32 from ) +{ + RexB(1, to); + if ( to == EAX ) { + write8( 0x3D ); + } + else { + write8( 0x81 ); + ModRM( 3, 7, to ); + } + write32( from ); +} + +/* cmp m64 to r64 */ +void CMP64MtoR( x86IntRegType to, uptr from ) +{ + MEMADDR_OP(1, VAROP1(0x3B), true, 2, from, 0); +} + +// cmp r64 to r64 +void CMP64RtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(1,from,to); + write8( 0x39 ); + ModRM( 3, from, to ); +} + +/* cmp imm32 to r32 */ +void CMP32ItoR( x86IntRegType to, u32 from ) +{ + RexB(0,to); + if ( to == EAX ) { + write8( 0x3D ); + } + else { + write8( 0x81 ); + ModRM( 3, 7, to ); + } + write32( from ); +} + +/* cmp imm32 to m32 */ +void CMP32ItoM( uptr to, u32 from ) +{ + MEMADDR_OP(0, VAROP1(0x81), false, 7, to, 4); + write32(from); +} + +/* cmp r32 to r32 */ +void CMP32RtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(0,from,to); + write8( 0x39 ); + ModRM( 3, from, to ); +} + +/* cmp m32 to r32 */ +void CMP32MtoR( x86IntRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP1(0x3B), true, to, from, 0); +} + +// cmp imm8 to [r32] +void CMP32I8toRm( x86IntRegType to, u8 from) +{ + RexB(0,to); + write8( 0x83 ); + ModRM( 0, 7, to ); + write8(from); +} + +// cmp imm32 to [r32+off] +void CMP32I8toRmOffset8( x86IntRegType to, u8 from, u8 off) +{ + RexB(0,to); + write8( 0x83 ); + ModRM( 1, 7, to ); + write8(off); + write8(from); +} + +// cmp imm8 to [r32] +void CMP32I8toM( uptr to, u8 from) +{ + MEMADDR_OP(0, VAROP1(0x83), false, 7, to, 1); + write8( from ); +} + +/* cmp imm16 to r16 */ +void CMP16ItoR( x86IntRegType to, u16 from ) +{ + write8( 0x66 ); + RexB(0,to); + if ( to == EAX ) + { + write8( 0x3D ); + } + else + { + write8( 0x81 ); + ModRM( 3, 7, to ); + } + write16( from ); +} + +/* cmp imm16 to m16 */ +void CMP16ItoM( uptr to, u16 from ) +{ + MEMADDR_OP(0, VAROP2(0x66, 0x81), false, 7, to, 2); + write16( from ); +} + +/* cmp r16 to r16 */ +void CMP16RtoR( x86IntRegType to, x86IntRegType from ) +{ + write8( 0x66 ); + RexRB(0,from,to); + write8( 0x39 ); + ModRM( 3, from, to ); +} + +/* cmp m16 to r16 */ +void CMP16MtoR( x86IntRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x66, 0x3B), true, to, from, 0); +} + +// cmp imm8 to r8 +void CMP8ItoR( x86IntRegType to, u8 from ) +{ + RexB(0,to); + if ( to == EAX ) + { + write8( 0x3C ); + } + else + { + write8( 0x80 ); + ModRM( 3, 7, to ); + } + write8( from ); +} + +// cmp m8 to r8 +void CMP8MtoR( x86IntRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP1(0x3A), true, to, from, 0); +} + +/* test r64 to r64 */ +void TEST64RtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(1, from, to); + write8( 0x85 ); + ModRM( 3, from, to ); +} + +/* test imm32 to r32 */ +void TEST32ItoR( x86IntRegType to, u32 from ) +{ + RexB(0,to); + if ( to == EAX ) + { + write8( 0xA9 ); + } + else + { + write8( 0xF7 ); + ModRM( 3, 0, to ); + } + write32( from ); +} + +void TEST32ItoM( uptr to, u32 from ) +{ + MEMADDR_OP(0, VAROP1(0xF7), false, 0, to, 4); + write32( from ); +} + +/* test r32 to r32 */ +void TEST32RtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(0,from,to); + write8( 0x85 ); + ModRM( 3, from, to ); +} + +// test imm32 to [r32] +void TEST32ItoRm( x86IntRegType to, u32 from ) +{ + RexB(0,to); + write8( 0xF7 ); + ModRM( 0, 0, to ); + write32(from); +} + +// test imm16 to r16 +void TEST16ItoR( x86IntRegType to, u16 from ) +{ + write8(0x66); + RexB(0,to); + if ( to == EAX ) + { + write8( 0xA9 ); + } + else + { + write8( 0xF7 ); + ModRM( 3, 0, to ); + } + write16( from ); +} + +// test r16 to r16 +void TEST16RtoR( x86IntRegType to, x86IntRegType from ) +{ + write8(0x66); + RexRB(0,from,to); + write16( 0x85 ); + ModRM( 3, from, to ); +} + +// test imm8 to r8 +void TEST8ItoR( x86IntRegType to, u8 from ) +{ + RexB(0,to); + if ( to == EAX ) + { + write8( 0xA8 ); + } + else + { + write8( 0xF6 ); + ModRM( 3, 0, to ); + } + write8( from ); +} + +// test imm8 to r8 +void TEST8ItoM( uptr to, u8 from ) +{ + MEMADDR_OP(0, VAROP1(0xF6), false, 0, to, 1); + write8( from ); +} + +/* sets r8 */ +void SETS8R( x86IntRegType to ) +{ + SET8R( 0x98, to ); +} + +/* setl r8 */ +void SETL8R( x86IntRegType to ) +{ + SET8R( 0x9C, to ); +} + +// setge r8 +void SETGE8R( x86IntRegType to ) { SET8R(0x9d, to); } +// setg r8 +void SETG8R( x86IntRegType to ) { SET8R(0x9f, to); } +// seta r8 +void SETA8R( x86IntRegType to ) { SET8R(0x97, to); } +// setae r8 +void SETAE8R( x86IntRegType to ) { SET8R(0x99, to); } +/* setb r8 */ +void SETB8R( x86IntRegType to ) { SET8R( 0x92, to ); } +/* setb r8 */ +void SETNZ8R( x86IntRegType to ) { SET8R( 0x95, to ); } +// setz r8 +void SETZ8R( x86IntRegType to ) { SET8R(0x94, to); } +// sete r8 +void SETE8R( x86IntRegType to ) { SET8R(0x94, to); } + +/* push imm32 */ +void PUSH32I( u32 from ) +{ + //X86_64ASSERT(); //becomes sign extended in x86_64 + write8( 0x68 ); + write32( from ); +} + +#ifdef __x86_64__ + +/* push r64 */ +void PUSH64R( x86IntRegType from ) +{ + RexB(0,from); + //write8( 0x51 | from ); + write8( 0x50 | from ); +} + +/* push m64 */ +void PUSH64M( uptr from ) +{ + MEMADDR_OP(0, VAROP1(0xFF), false, 6, from, 0); +} + +/* pop r64 */ +void POP64R( x86IntRegType from ) { + RexB(0,from); + //write8( 0x59 | from ); + write8( 0x58 | from ); +} + +void PUSHR(x86IntRegType from) { PUSH64R(from); } +void POPR(x86IntRegType from) { POP64R(from); } + +#else + +/* push r32 */ +void PUSH32R( x86IntRegType from ) { write8( 0x50 | from ); } + +/* push m32 */ +void PUSH32M( uptr from ) +{ + MEMADDR_OP(0, VAROP1(0xFF), false, 6, from, 0); +} + +/* pop r32 */ +void POP32R( x86IntRegType from ) { write8( 0x58 | from ); } + +/* pushad */ +void PUSHA32( void ) { write8( 0x60 ); } + +/* popad */ +void POPA32( void ) { write8( 0x61 ); } + +void PUSHR(x86IntRegType from) { PUSH32R(from); } +void POPR(x86IntRegType from) { POP32R(from); } + +#endif + + +/* pushfd */ +void PUSHFD( void ) { write8( 0x9C ); } +/* popfd */ +void POPFD( void ) { write8( 0x9D ); } + +void RET( void ) { write8( 0xC3 ); } +void RET2( void ) { write16( 0xc3f3 ); } + +void CBW( void ) { write16( 0x9866 ); } +void CWD( void ) { write8( 0x98 ); } +void CDQ( void ) { write8( 0x99 ); } +void CWDE() { write8(0x98); } + +#ifdef __x86_64__ +void CDQE( void ) { RexR(1,0); write8( 0x98 ); } +#endif + +void LAHF() { write8(0x9f); } +void SAHF() { write8(0x9e); } + +void BT32ItoR( x86IntRegType to, x86IntRegType from ) +{ + write16( 0xBA0F ); + write8( 0xE0 | to ); + write8( from ); +} + +void BSRRtoR(x86IntRegType to, x86IntRegType from) +{ + write16( 0xBD0F ); + ModRM( 3, from, to ); +} + +void BSWAP32R( x86IntRegType to ) +{ + write8( 0x0F ); + write8( 0xC8 + to ); +} + +// to = from + offset +void LEA16RtoR(x86IntRegType to, x86IntRegType from, u16 offset) +{ + write8(0x66); + LEA32RtoR(to, from, offset); +} + +void LEA32RtoR(x86IntRegType to, x86IntRegType from, u32 offset) +{ + RexRB(0,to,from); + write8(0x8d); + + if( (from&7) == ESP ) { + if( offset == 0 ) { + ModRM(1, to, from); + write8(0x24); + } + else if( offset < 128 ) { + ModRM(1, to, from); + write8(0x24); + write8(offset); + } + else { + ModRM(2, to, from); + write8(0x24); + write32(offset); + } + } + else { + if( offset == 0 && from != EBP && from!=ESP ) { + ModRM(0, to, from); + } + else if( offset < 128 ) { + ModRM(1, to, from); + write8(offset); + } + else { + ModRM(2, to, from); + write32(offset); + } + } +} + +// to = from0 + from1 +void LEA16RRtoR(x86IntRegType to, x86IntRegType from0, x86IntRegType from1) +{ + write8(0x66); + LEA32RRtoR(to, from0, from1); +} + +void LEA32RRtoR(x86IntRegType to, x86IntRegType from0, x86IntRegType from1) +{ + RexRXB(0, to, from0, from1); + write8(0x8d); + + if( (from1&7) == EBP ) { + ModRM(1, to, 4); + ModRM(0, from0, from1); + write8(0); + } + else { + ModRM(0, to, 4); + ModRM(0, from0, from1); + } +} + +// to = from << scale (max is 3) +void LEA16RStoR(x86IntRegType to, x86IntRegType from, u32 scale) +{ + write8(0x66); + LEA32RStoR(to, from, scale); +} + +void LEA32RStoR(x86IntRegType to, x86IntRegType from, u32 scale) +{ + if( to == from ) { + SHL32ItoR(to, scale); + return; + } + + if( from != ESP ) { + RexRXB(0,to,from,0); + write8(0x8d); + ModRM(0, to, 4); + ModRM(scale, from, 5); + write32(0); + } + else { + assert( to != ESP ); + MOV32RtoR(to, from); + LEA32RStoR(to, to, scale); + } +} + +#endif diff --git a/libpcsxcore/ix86_64/ix86-64.h b/libpcsxcore/ix86_64/ix86-64.h new file mode 100644 index 0000000..009fa5a --- /dev/null +++ b/libpcsxcore/ix86_64/ix86-64.h @@ -0,0 +1,1776 @@ +/* + * ix86 definitions v0.6.2 + * Authors: linuzappz + * alexey silinov + * goldfinger + * shadow < shadow@pcsx2.net > + */ + +#ifndef __IX86_H__ +#define __IX86_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../psxcommon.h" // Basic types header +#include +#include + +#if defined(__MINGW32__) +#define PCSX2_ALIGNED16(x) __declspec(align(16)) x +#else +#define PCSX2_ALIGNED16(x) x __attribute((aligned(16))) +#endif + + +#ifdef __x86_64__ +#define XMMREGS 16 +#define X86REGS 16 +#else +#define XMMREGS 8 +#define X86REGS 8 +#endif + +#define MMXREGS 8 + +#define SIB 4 +#define DISP32 5 + +// general types +typedef int x86IntRegType; +#define EAX 0 +#define EBX 3 +#define ECX 1 +#define EDX 2 +#define ESI 6 +#define EDI 7 +#define EBP 5 +#define ESP 4 + +#ifdef __x86_64__ +#define RAX 0 +#define RBX 3 +#define RCX 1 +#define RDX 2 +#define RSI 6 +#define RDI 7 +#define RBP 5 +#define RSP 4 +#define R8 8 +#define R9 9 +#define R10 10 +#define R11 11 +#define R12 12 +#define R13 13 +#define R14 14 +#define R15 15 + +#define X86_TEMP RAX // don't allocate anything + +#ifdef _MSC_VER +extern x86IntRegType g_x86savedregs[8]; +extern x86IntRegType g_x86tempregs[6]; +#else +extern x86IntRegType g_x86savedregs[6]; +extern x86IntRegType g_x86tempregs[8]; +#endif + +extern x86IntRegType g_x86allregs[14]; // all registers that can be used by the recs +extern x86IntRegType g_x868bitregs[11]; +extern x86IntRegType g_x86non8bitregs[3]; + +#ifdef _MSC_VER +#define X86ARG1 RCX +#define X86ARG2 RDX +#define X86ARG3 R8 +#define X86ARG4 R9 +#else +#define X86ARG1 RDI +#define X86ARG2 RSI +#define X86ARG3 RDX +#define X86ARG4 RCX +#endif + +#else + +#define X86ARG1 EAX +#define X86ARG2 ECX +#define X86ARG3 EDX +#define X86ARG4 EBX + +#endif // __x86_64__ + +#define MM0 0 +#define MM1 1 +#define MM2 2 +#define MM3 3 +#define MM4 4 +#define MM5 5 +#define MM6 6 +#define MM7 7 + +typedef int x86MMXRegType; + +#define XMM0 0 +#define XMM1 1 +#define XMM2 2 +#define XMM3 3 +#define XMM4 4 +#define XMM5 5 +#define XMM6 6 +#define XMM7 7 +#define XMM8 8 +#define XMM9 9 +#define XMM10 10 +#define XMM11 11 +#define XMM12 12 +#define XMM13 13 +#define XMM14 14 +#define XMM15 15 + +typedef int x86SSERegType; + +typedef enum +{ + XMMT_INT = 0, // integer (sse2 only) + XMMT_FPS = 1, // floating point + //XMMT_FPD = 3, // double +} XMMSSEType; + +extern XMMSSEType g_xmmtypes[XMMREGS]; + +void cpudetectInit( void );//this is all that needs to be called and will fill up the below structs + +//cpu capabilities structure +typedef struct { + u32 hasFloatingPointUnit; + u32 hasVirtual8086ModeEnhancements; + u32 hasDebuggingExtensions; + u32 hasPageSizeExtensions; + u32 hasTimeStampCounter; + u32 hasModelSpecificRegisters; + u32 hasPhysicalAddressExtension; + u32 hasCOMPXCHG8BInstruction; + u32 hasAdvancedProgrammableInterruptController; + u32 hasSEPFastSystemCall; + u32 hasMemoryTypeRangeRegisters; + u32 hasPTEGlobalFlag; + u32 hasMachineCheckArchitecture; + u32 hasConditionalMoveAndCompareInstructions; + u32 hasFGPageAttributeTable; + u32 has36bitPageSizeExtension; + u32 hasProcessorSerialNumber; + u32 hasCFLUSHInstruction; + u32 hasDebugStore; + u32 hasACPIThermalMonitorAndClockControl; + u32 hasMultimediaExtensions; + u32 hasFastStreamingSIMDExtensionsSaveRestore; + u32 hasStreamingSIMDExtensions; + u32 hasStreamingSIMD2Extensions; + u32 hasSelfSnoop; + u32 hasHyperThreading; + u32 hasThermalMonitor; + u32 hasIntel64BitArchitecture; + u32 hasStreamingSIMD3Extensions; + //that is only for AMDs + u32 hasMultimediaExtensionsExt; + u32 hasAMD64BitArchitecture; + u32 has3DNOWInstructionExtensionsExt; + u32 has3DNOWInstructionExtensions; +} CAPABILITIES; + +extern CAPABILITIES cpucaps; + +typedef struct { + + u32 x86Family; // Processor Family + u32 x86Model; // Processor Model + u32 x86PType; // Processor Type + u32 x86StepID; // Stepping ID + u32 x86Flags; // Feature Flags + u32 x86EFlags; // Extended Feature Flags + //all the above returns hex values + s8 x86ID[16]; // Vendor ID //the vendor creator (in %s) + s8 x86Type[20]; //cpu type in char format //the cpu type (in %s) + s8 x86Fam[50]; // family in char format //the original cpu name string (in %s) + u32 cpuspeed; // speed of cpu //this will give cpu speed (in %d) +} CPUINFO; + +extern CPUINFO cpuinfo; + +extern s8 *x86Ptr; +extern u8 *j8Ptr[32]; +extern u32 *j32Ptr[32]; + + +#ifdef __x86_64__ +#define X86_64ASSERT() assert(0) +#define MEMADDR_(addr, oplen) (sptr)((uptr)(addr) - ((uptr)x86Ptr + ((u64)(oplen)))) +#define SPTR32(addr) ((addr) < 0x80000000L && (addr) >= -0x80000000L) +#define UPTR32(addr) ((addr) < 0x100000000L) +#define MEMADDR(addr, oplen) ({ sptr _a = MEMADDR_(addr, oplen); assert(SPTR32(_a)); _a; }) +#else +#define X86_64ASSERT() +#define SPTR32(a) 1 +#define UPTR32(a) 1 +#define MEMADDR(addr, oplen) (addr) +#endif + +#ifdef __x86_64__ +#define Rex( w, r, x, b ) write8( 0x40 | ((w) << 3) | ((r) << 2) | ((x) << 1) | (b) ) +#else +#define Rex(w,r,x,b) assert(0) +#endif +#define RexRXB(w, reg, index, base) if(w || (reg) >= 8 || (index) >= 8 || (base) >= 8 ) \ + Rex(w, (reg)>=8, (index)>=8, (base)>=8) +#define RexR(w, reg) RexRXB(w, reg, 0, 0) +#define RexB(w, base) RexRXB(w, 0, 0, base) +#define RexRB(w, reg, base) RexRXB(w, reg, 0, base) + +void x86SetPtr( char *ptr ); +void x86Shutdown( void ); + +void x86SetJ8( u8 *j8 ); +void x86SetJ8A( u8 *j8 ); +void x86SetJ16( u16 *j16 ); +void x86SetJ16A( u16 *j16 ); +void x86SetJ32( u32 *j32 ); +void x86SetJ32A( u32 *j32 ); + +void x86Align( int bytes ); +u64 GetCPUTick( void ); + +// General Helper functions +#define ModRM(mod, rm, reg) write8( ( mod << 6 ) | ( (rm & 7) << 3 ) | ( reg & 7 ) ) +#define SibSB(ss, rm, index) write8( ( ss << 6 ) | ( rm << 3 ) | ( index ) ) +void SET8R( int cc, int to ); +u8* J8Rel( int cc, int to ); +u32* J32Rel( int cc, u32 to ); +void CMOV32RtoR( int cc, int to, int from ); +void CMOV32MtoR( int cc, int to, uptr from ); + +void MEMADDR_OP(bool w, unsigned opl, u64 op, bool isreg, int reg, uptr p, sptr off); + +#define VAROP1(op) 1, op +#define VAROP2(op1, op2) 2, (op1) | ((op2) << 8) + +//****************** +// IX86 intructions +//****************** + +// +// * scale values: +// * 0 - *1 +// * 1 - *2 +// * 2 - *4 +// * 3 - *8 +// + +void STC( void ); +void CLC( void ); + +//////////////////////////////////// +// mov instructions // +//////////////////////////////////// + +// mov r64 to r64 +void MOV64RtoR( x86IntRegType to, x86IntRegType from ); +// mov r64 to m64 +void MOV64RtoM( uptr to, x86IntRegType from ); +// mov m64 to r64 +void MOV64MtoR( x86IntRegType to, uptr from ); +// mov sign ext imm32 to m64 +void MOV64I32toM( uptr to, u32 from ); +// mov sign ext imm32 to r64 +void MOV64I32toR( x86IntRegType to, s32 from); +// mov imm64 to r64 +void MOV64ItoR( x86IntRegType to, u64 from); +// mov imm64 to [r64+off] +void MOV64ItoRmOffset( x86IntRegType to, u32 from, int offset); +// mov [r64+offset] to r64 +void MOV64RmOffsettoR( x86IntRegType to, x86IntRegType from, int offset ); +// mov [r64][r64*scale] to r64 +void MOV64RmStoR( x86IntRegType to, x86IntRegType from, x86IntRegType from2, int scale); +// mov r64 to [r64+offset] +void MOV64RtoRmOffset( x86IntRegType to, x86IntRegType from, int offset ); +// mov r64 to [r64][r64*scale] +void MOV64RtoRmS( x86IntRegType to, x86IntRegType from, x86IntRegType from2, int scale); + +// mov r32 to r32 +void MOV32RtoR( x86IntRegType to, x86IntRegType from ); +// mov r32 to m32 +void MOV32RtoM( uptr to, x86IntRegType from ); +// mov m32 to r32 +void MOV32MtoR( x86IntRegType to, uptr from ); +// mov [r32] to r32 +void MOV32RmtoR( x86IntRegType to, x86IntRegType from ); +void MOV32RmtoROffset( x86IntRegType to, x86IntRegType from, int offset ); +// mov [r32][r32< subtract ST(0) from ST(1), store in ST(1) and POP stack +void FSUBP( void ); +// fmul ST(src) to fpu reg stack ST(0) +void FMUL32Rto0( x86IntRegType src ); +// fmul ST(0) to fpu reg stack ST(src) +void FMUL320toR( x86IntRegType src ); +// fdiv ST(src) to fpu reg stack ST(0) +void FDIV32Rto0( x86IntRegType src ); +// fdiv ST(0) to fpu reg stack ST(src) +void FDIV320toR( x86IntRegType src ); +// fdiv ST(0) to fpu reg stack ST(src), pop stack, store in ST(src) +void FDIV320toRP( x86IntRegType src ); + +// fadd m32 to fpu reg stack +void FADD32( uptr from ); +// fsub m32 to fpu reg stack +void FSUB32( uptr from ); +// fmul m32 to fpu reg stack +void FMUL32( uptr from ); +// fdiv m32 to fpu reg stack +void FDIV32( uptr from ); +// fcomi st, st( i) +void FCOMI( x86IntRegType src ); +// fcomip st, st( i) +void FCOMIP( x86IntRegType src ); +// fucomi st, st( i) +void FUCOMI( x86IntRegType src ); +// fucomip st, st( i) +void FUCOMIP( x86IntRegType src ); +// fcom m32 to fpu reg stack +void FCOM32( uptr from ); +// fabs fpu reg stack +void FABS( void ); +// fsqrt fpu reg stack +void FSQRT( void ); +// ftan fpu reg stack +void FPATAN( void ); +// fsin fpu reg stack +void FSIN( void ); +// fchs fpu reg stack +void FCHS( void ); + +// fcmovb fpu reg to fpu reg stack +void FCMOVB32( x86IntRegType from ); +// fcmove fpu reg to fpu reg stack +void FCMOVE32( x86IntRegType from ); +// fcmovbe fpu reg to fpu reg stack +void FCMOVBE32( x86IntRegType from ); +// fcmovu fpu reg to fpu reg stack +void FCMOVU32( x86IntRegType from ); +// fcmovnb fpu reg to fpu reg stack +void FCMOVNB32( x86IntRegType from ); +// fcmovne fpu reg to fpu reg stack +void FCMOVNE32( x86IntRegType from ); +// fcmovnbe fpu reg to fpu reg stack +void FCMOVNBE32( x86IntRegType from ); +// fcmovnu fpu reg to fpu reg stack +void FCMOVNU32( x86IntRegType from ); +void FCOMP32( uptr from ); +void FNSTSWtoAX( void ); + +// probably a little extreme here, but x86-64 should NOT use MMX +#ifdef __x86_64__ + +#define MMXONLY(code) + +#else + +#define MMXONLY(code) code + +//****************** +// MMX instructions +//****************** + +// r64 = mm + +// movq m64 to r64 +void MOVQMtoR( x86MMXRegType to, uptr from ); +// movq r64 to m64 +void MOVQRtoM( uptr to, x86MMXRegType from ); + +// pand r64 to r64 +void PANDRtoR( x86MMXRegType to, x86MMXRegType from ); +void PANDNRtoR( x86MMXRegType to, x86MMXRegType from ); +// pand m64 to r64 ; +void PANDMtoR( x86MMXRegType to, uptr from ); +// pandn r64 to r64 +void PANDNRtoR( x86MMXRegType to, x86MMXRegType from ); +// pandn r64 to r64 +void PANDNMtoR( x86MMXRegType to, uptr from ); +// por r64 to r64 +void PORRtoR( x86MMXRegType to, x86MMXRegType from ); +// por m64 to r64 +void PORMtoR( x86MMXRegType to, uptr from ); +// pxor r64 to r64 +void PXORRtoR( x86MMXRegType to, x86MMXRegType from ); +// pxor m64 to r64 +void PXORMtoR( x86MMXRegType to, uptr from ); + +// psllq r64 to r64 +void PSLLQRtoR( x86MMXRegType to, x86MMXRegType from ); +// psllq m64 to r64 +void PSLLQMtoR( x86MMXRegType to, uptr from ); +// psllq imm8 to r64 +void PSLLQItoR( x86MMXRegType to, u8 from ); +// psrlq r64 to r64 +void PSRLQRtoR( x86MMXRegType to, x86MMXRegType from ); +// psrlq m64 to r64 +void PSRLQMtoR( x86MMXRegType to, uptr from ); +// psrlq imm8 to r64 +void PSRLQItoR( x86MMXRegType to, u8 from ); + +// paddusb r64 to r64 +void PADDUSBRtoR( x86MMXRegType to, x86MMXRegType from ); +// paddusb m64 to r64 +void PADDUSBMtoR( x86MMXRegType to, uptr from ); +// paddusw r64 to r64 +void PADDUSWRtoR( x86MMXRegType to, x86MMXRegType from ); +// paddusw m64 to r64 +void PADDUSWMtoR( x86MMXRegType to, uptr from ); + +// paddb r64 to r64 +void PADDBRtoR( x86MMXRegType to, x86MMXRegType from ); +// paddb m64 to r64 +void PADDBMtoR( x86MMXRegType to, uptr from ); +// paddw r64 to r64 +void PADDWRtoR( x86MMXRegType to, x86MMXRegType from ); +// paddw m64 to r64 +void PADDWMtoR( x86MMXRegType to, uptr from ); +// paddd r64 to r64 +void PADDDRtoR( x86MMXRegType to, x86MMXRegType from ); +// paddd m64 to r64 +void PADDDMtoR( x86MMXRegType to, uptr from ); +void PADDSBRtoR( x86MMXRegType to, x86MMXRegType from ); +void PADDSWRtoR( x86MMXRegType to, x86MMXRegType from ); + +// paddq m64 to r64 (sse2 only?) +void PADDQMtoR( x86MMXRegType to, uptr from ); +// paddq r64 to r64 (sse2 only?) +void PADDQRtoR( x86MMXRegType to, x86MMXRegType from ); + +void PSUBSBRtoR( x86MMXRegType to, x86MMXRegType from ); +void PSUBSWRtoR( x86MMXRegType to, x86MMXRegType from ); + +void PSUBBRtoR( x86MMXRegType to, x86MMXRegType from ); +void PSUBWRtoR( x86MMXRegType to, x86MMXRegType from ); +void PSUBDRtoR( x86MMXRegType to, x86MMXRegType from ); +void PSUBDMtoR( x86MMXRegType to, uptr from ); + +// psubq m64 to r64 (sse2 only?) +void PSUBQMtoR( x86MMXRegType to, uptr from ); +// psubq r64 to r64 (sse2 only?) +void PSUBQRtoR( x86MMXRegType to, x86MMXRegType from ); + +// pmuludq m64 to r64 (sse2 only?) +void PMULUDQMtoR( x86MMXRegType to, uptr from ); +// pmuludq r64 to r64 (sse2 only?) +void PMULUDQRtoR( x86MMXRegType to, x86MMXRegType from ); + +void PCMPEQBRtoR( x86MMXRegType to, x86MMXRegType from ); +void PCMPEQWRtoR( x86MMXRegType to, x86MMXRegType from ); +void PCMPEQDRtoR( x86MMXRegType to, x86MMXRegType from ); +void PCMPEQDMtoR( x86MMXRegType to, uptr from ); +void PCMPGTBRtoR( x86MMXRegType to, x86MMXRegType from ); +void PCMPGTWRtoR( x86MMXRegType to, x86MMXRegType from ); +void PCMPGTDRtoR( x86MMXRegType to, x86MMXRegType from ); +void PCMPGTDMtoR( x86MMXRegType to, uptr from ); +void PSRLWItoR( x86MMXRegType to, u8 from ); +void PSRLDItoR( x86MMXRegType to, u8 from ); +void PSRLDRtoR( x86MMXRegType to, x86MMXRegType from ); +void PSLLWItoR( x86MMXRegType to, u8 from ); +void PSLLDItoR( x86MMXRegType to, u8 from ); +void PSLLDRtoR( x86MMXRegType to, x86MMXRegType from ); +void PSRAWItoR( x86MMXRegType to, u8 from ); +void PSRADItoR( x86MMXRegType to, u8 from ); +void PSRADRtoR( x86MMXRegType to, x86MMXRegType from ); +void PUNPCKLDQRtoR( x86MMXRegType to, x86MMXRegType from ); +void PUNPCKLDQMtoR( x86MMXRegType to, uptr from ); +void PUNPCKHDQRtoR( x86MMXRegType to, x86MMXRegType from ); +void PUNPCKHDQMtoR( x86MMXRegType to, uptr from ); +void MOVQ64ItoR( x86MMXRegType reg, u64 i ); //Prototype.Todo add all consts to end of block.not after jr $+8 +void MOVQRtoR( x86MMXRegType to, x86MMXRegType from ); +void MOVQRmtoROffset( x86MMXRegType to, x86IntRegType from, u32 offset ); +void MOVQRtoRmOffset( x86IntRegType to, x86MMXRegType from, u32 offset ); +void MOVDMtoMMX( x86MMXRegType to, uptr from ); +void MOVDMMXtoM( uptr to, x86MMXRegType from ); +void MOVD32RtoMMX( x86MMXRegType to, x86IntRegType from ); +void MOVD32RmtoMMX( x86MMXRegType to, x86IntRegType from ); +void MOVD32RmOffsettoMMX( x86MMXRegType to, x86IntRegType from, u32 offset ); +void MOVD32MMXtoR( x86IntRegType to, x86MMXRegType from ); +void MOVD32MMXtoRm( x86IntRegType to, x86MMXRegType from ); +void MOVD32MMXtoRmOffset( x86IntRegType to, x86MMXRegType from, u32 offset ); +void PINSRWRtoMMX( x86MMXRegType to, x86SSERegType from, u8 imm8 ); +void PSHUFWRtoR(x86MMXRegType to, x86MMXRegType from, u8 imm8); +void PSHUFWMtoR(x86MMXRegType to, uptr from, u8 imm8); +void MASKMOVQRtoR(x86MMXRegType to, x86MMXRegType from); + +// emms +void EMMS( void ); + +//**********************************************************************************/ +//PACKSSWB,PACKSSDW: Pack Saturate Signed Word 64bits +//********************************************************************************** +void PACKSSWBMMXtoMMX(x86MMXRegType to, x86MMXRegType from); +void PACKSSDWMMXtoMMX(x86MMXRegType to, x86MMXRegType from); + +void PMOVMSKBMMXtoR(x86IntRegType to, x86MMXRegType from); + +void SSE2_MOVDQ2Q_XMM_to_MM( x86MMXRegType to, x86SSERegType from); +void SSE2_MOVQ2DQ_MM_to_XMM( x86SSERegType to, x86MMXRegType from); + +#endif // !__x86_64__ + +//********************* +// SSE instructions * +//********************* +void SSE_MOVAPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_MOVAPS_XMM_to_M128( uptr to, x86SSERegType from ); +void SSE_MOVAPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); + +void SSE_MOVUPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_MOVUPS_XMM_to_M128( uptr to, x86SSERegType from ); + +void SSE_MOVSS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_MOVSS_XMM_to_M32( u32 to, x86SSERegType from ); +void SSE_MOVSS_XMM_to_Rm( x86IntRegType to, x86SSERegType from ); +void SSE_MOVSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_MOVSS_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset ); +void SSE_MOVSS_XMM_to_RmOffset( x86IntRegType to, x86SSERegType from, int offset ); + +void SSE2_MOVSD_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); + +void SSE2_MOVQ_M64_to_XMM( x86SSERegType to, uptr from ); +void SSE2_MOVQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_MOVQ_XMM_to_M64( u32 to, x86SSERegType from ); + +void SSE_MASKMOVDQU_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); + +void SSE_MOVLPS_M64_to_XMM( x86SSERegType to, uptr from ); +void SSE_MOVLPS_XMM_to_M64( u32 to, x86SSERegType from ); +void SSE_MOVLPS_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset ); +void SSE_MOVLPS_XMM_to_RmOffset( x86IntRegType to, x86SSERegType from, int offset ); + +void SSE_MOVHPS_M64_to_XMM( x86SSERegType to, uptr from ); +void SSE_MOVHPS_XMM_to_M64( u32 to, x86SSERegType from ); +void SSE_MOVHPS_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset ); +void SSE_MOVHPS_XMM_to_RmOffset( x86IntRegType to, x86SSERegType from, int offset ); + +void SSE_MOVLHPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_MOVHLPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_MOVLPSRmtoR( x86SSERegType to, x86IntRegType from ); +void SSE_MOVLPSRmtoROffset( x86SSERegType to, x86IntRegType from, int offset ); +void SSE_MOVLPSRtoRm( x86SSERegType to, x86IntRegType from ); +void SSE_MOVLPSRtoRmOffset( x86SSERegType to, x86IntRegType from, int offset ); + +void SSE_MOVAPSRmStoR( x86SSERegType to, x86IntRegType from, x86IntRegType from2, int scale ); +void SSE_MOVAPSRtoRmS( x86SSERegType to, x86IntRegType from, x86IntRegType from2, int scale ); +void SSE_MOVAPSRtoRmOffset( x86IntRegType to, x86SSERegType from, int offset ); +void SSE_MOVAPSRmtoROffset( x86SSERegType to, x86IntRegType from, int offset ); +void SSE_MOVUPSRmStoR( x86SSERegType to, x86IntRegType from, x86IntRegType from2, int scale ); +void SSE_MOVUPSRtoRmS( x86SSERegType to, x86IntRegType from, x86IntRegType from2, int scale ); +void SSE_MOVUPSRtoRm( x86IntRegType to, x86IntRegType from ); +void SSE_MOVUPSRmtoR( x86IntRegType to, x86IntRegType from ); + +void SSE_MOVUPSRmtoROffset( x86SSERegType to, x86IntRegType from, int offset ); +void SSE_MOVUPSRtoRmOffset( x86SSERegType to, x86IntRegType from, int offset ); + +void SSE2_MOVDQARtoRmOffset( x86IntRegType to, x86SSERegType from, int offset ); +void SSE2_MOVDQARmtoROffset( x86SSERegType to, x86IntRegType from, int offset ); + +void SSE_RCPPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_RCPPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_RCPSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_RCPSS_M32_to_XMM( x86SSERegType to, uptr from ); + +void SSE_ORPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_ORPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_XORPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_XORPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_ANDPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_ANDPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_ANDNPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_ANDNPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_ADDPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_ADDPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_ADDSS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_ADDSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_SUBPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_SUBPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_SUBSS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_SUBSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_MULPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_MULPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_MULSS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_MULSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_CMPEQSS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPEQSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_CMPLTSS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPLTSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_CMPLESS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPLESS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_CMPUNORDSS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPUNORDSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_CMPNESS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPNESS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_CMPNLTSS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPNLTSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_CMPNLESS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPNLESS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_CMPORDSS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPORDSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); + +void SSE_UCOMISS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_UCOMISS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); + +#ifndef __x86_64__ +void SSE_PMAXSW_MM_to_MM( x86MMXRegType to, x86MMXRegType from ); +void SSE_PMINSW_MM_to_MM( x86MMXRegType to, x86MMXRegType from ); +void SSE_CVTPI2PS_MM_to_XMM( x86SSERegType to, x86MMXRegType from ); +void SSE_CVTPS2PI_M64_to_MM( x86MMXRegType to, uptr from ); +void SSE_CVTPS2PI_XMM_to_MM( x86MMXRegType to, x86SSERegType from ); +#endif +void SSE_CVTPI2PS_M64_to_XMM( x86SSERegType to, uptr from ); +void SSE_CVTTSS2SI_M32_to_R32(x86IntRegType to, uptr from); +void SSE_CVTTSS2SI_XMM_to_R32(x86IntRegType to, x86SSERegType from); +void SSE_CVTSI2SS_M32_to_XMM(x86SSERegType to, uptr from); +void SSE_CVTSI2SS_R_to_XMM(x86SSERegType to, x86IntRegType from); + +void SSE2_CVTDQ2PS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_CVTDQ2PS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_CVTPS2DQ_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_CVTPS2DQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_CVTTPS2DQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); + +void SSE_MAXPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_MAXPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_MAXSS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_MAXSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_MINPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_MINPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_MINSS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_MINSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_RSQRTPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_RSQRTPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_RSQRTSS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_RSQRTSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_SQRTPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_SQRTPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_SQRTSS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_SQRTSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_UNPCKLPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_UNPCKLPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_UNPCKHPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_UNPCKHPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_SHUFPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 ); +void SSE_SHUFPS_M128_to_XMM( x86SSERegType to, uptr from, u8 imm8 ); +void SSE_SHUFPS_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset, u8 imm8 ); +void SSE_CMPEQPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPEQPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_CMPLTPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPLTPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_CMPLEPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPLEPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_CMPUNORDPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPUNORDPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_CMPNEPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPNEPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_CMPNLTPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPNLTPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_CMPNLEPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPNLEPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_CMPORDPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_CMPORDPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_DIVPS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE_DIVPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE_DIVSS_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE_DIVSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +// VectorPath +void SSE2_PSHUFD_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 ); +void SSE2_PSHUFD_M128_to_XMM( x86SSERegType to, uptr from, u8 imm8 ); + +void SSE2_PSHUFLW_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 ); +void SSE2_PSHUFLW_M128_to_XMM( x86SSERegType to, uptr from, u8 imm8 ); +void SSE2_PSHUFHW_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 ); +void SSE2_PSHUFHW_M128_to_XMM( x86SSERegType to, uptr from, u8 imm8 ); + +void SSE_STMXCSR( uptr from ); +void SSE_LDMXCSR( uptr from ); + + +//********************* +// SSE 2 Instructions* +//********************* +void SSE2_MOVDQA_M128_to_XMM(x86SSERegType to, uptr from); +void SSE2_MOVDQA_XMM_to_M128( uptr to, x86SSERegType from); +void SSE2_MOVDQA_XMM_to_XMM( x86SSERegType to, x86SSERegType from); + +void SSE2_MOVDQU_M128_to_XMM(x86SSERegType to, uptr from); +void SSE2_MOVDQU_XMM_to_M128( uptr to, x86SSERegType from); +void SSE2_MOVDQU_XMM_to_XMM( x86SSERegType to, x86SSERegType from); + +void SSE2_PSRLW_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PSRLW_M128_to_XMM(x86SSERegType to, uptr from); +void SSE2_PSRLW_I8_to_XMM(x86SSERegType to, u8 imm8); +void SSE2_PSRLD_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PSRLD_M128_to_XMM(x86SSERegType to, uptr from); +void SSE2_PSRLD_I8_to_XMM(x86SSERegType to, u8 imm8); +void SSE2_PSRLQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PSRLQ_M128_to_XMM(x86SSERegType to, uptr from); +void SSE2_PSRLQ_I8_to_XMM(x86SSERegType to, u8 imm8); +void SSE2_PSRLDQ_I8_to_XMM(x86SSERegType to, u8 imm8); +void SSE2_PSRAW_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PSRAW_M128_to_XMM(x86SSERegType to, uptr from); +void SSE2_PSRAW_I8_to_XMM(x86SSERegType to, u8 imm8); +void SSE2_PSRAD_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PSRAD_M128_to_XMM(x86SSERegType to, uptr from); +void SSE2_PSRAD_I8_to_XMM(x86SSERegType to, u8 imm8); +void SSE2_PSLLW_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PSLLW_M128_to_XMM(x86SSERegType to, uptr from); +void SSE2_PSLLW_I8_to_XMM(x86SSERegType to, u8 imm8); +void SSE2_PSLLD_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PSLLD_M128_to_XMM(x86SSERegType to, uptr from); +void SSE2_PSLLD_I8_to_XMM(x86SSERegType to, u8 imm8); +void SSE2_PSLLQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PSLLQ_M128_to_XMM(x86SSERegType to, uptr from); +void SSE2_PSLLQ_I8_to_XMM(x86SSERegType to, u8 imm8); +void SSE2_PSLLDQ_I8_to_XMM(x86SSERegType to, u8 imm8); +void SSE2_PMAXSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_PMAXSW_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_PMAXUB_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_PMAXUB_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_PMINSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_PMINSW_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_PMINUB_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_PMINUB_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_PADDSB_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_PADDSB_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_PADDSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_PADDSW_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_PSUBSB_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_PSUBSB_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_PSUBSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_PSUBSW_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_PSUBUSB_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_PSUBUSB_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_PSUBUSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_PSUBUSW_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_PAND_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_PAND_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_PANDN_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_PANDN_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_PXOR_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_PXOR_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_PADDW_XMM_to_XMM(x86SSERegType to, x86SSERegType from ); +void SSE2_PADDW_M128_to_XMM(x86SSERegType to, uptr from ); +void SSE2_PADDUSB_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_PADDUSB_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_PADDUSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_PADDUSW_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2_PADDB_XMM_to_XMM(x86SSERegType to, x86SSERegType from ); +void SSE2_PADDB_M128_to_XMM(x86SSERegType to, uptr from ); +void SSE2_PADDD_XMM_to_XMM(x86SSERegType to, x86SSERegType from ); +void SSE2_PADDD_M128_to_XMM(x86SSERegType to, uptr from ); +void SSE2_PADDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from ); +void SSE2_PADDQ_M128_to_XMM(x86SSERegType to, uptr from ); + +//**********************************************************************************/ +//PACKSSWB,PACKSSDW: Pack Saturate Signed Word +//********************************************************************************** +void SSE2_PACKSSWB_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PACKSSWB_M128_to_XMM(x86SSERegType to, uptr from); +void SSE2_PACKSSDW_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PACKSSDW_M128_to_XMM(x86SSERegType to, uptr from); + +void SSE2_PACKUSWB_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PACKUSWB_M128_to_XMM(x86SSERegType to, uptr from); + +//**********************************************************************************/ +//PUNPCKHWD: Unpack 16bit high +//********************************************************************************** +void SSE2_PUNPCKLBW_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PUNPCKLBW_M128_to_XMM(x86SSERegType to, uptr from); +void SSE2_PUNPCKHBW_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PUNPCKHBW_M128_to_XMM(x86SSERegType to, uptr from); + +void SSE2_PUNPCKLWD_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PUNPCKLWD_M128_to_XMM(x86SSERegType to, uptr from); +void SSE2_PUNPCKHWD_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PUNPCKHWD_M128_to_XMM(x86SSERegType to, uptr from); + +void SSE2_PUNPCKLDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PUNPCKLDQ_M128_to_XMM(x86SSERegType to, uptr from); +void SSE2_PUNPCKHDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PUNPCKHDQ_M128_to_XMM(x86SSERegType to, uptr from); + +void SSE2_PUNPCKLQDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PUNPCKLQDQ_M128_to_XMM(x86SSERegType to, uptr from); + +void SSE2_PUNPCKHQDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PUNPCKHQDQ_M128_to_XMM(x86SSERegType to, uptr from); + +// mult by half words +void SSE2_PMULLW_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PMULLW_M128_to_XMM(x86SSERegType to, uptr from); +void SSE2_PMULHW_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PMULHW_M128_to_XMM(x86SSERegType to, uptr from); + +void SSE2_PMULUDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE2_PMULUDQ_M128_to_XMM(x86SSERegType to, uptr from); + + +//**********************************************************************************/ +//PMOVMSKB: Create 16bit mask from signs of 8bit integers +//********************************************************************************** +void SSE2_PMOVMSKB_XMM_to_R32(x86IntRegType to, x86SSERegType from); + +void SSE_MOVMSKPS_XMM_to_R32(x86IntRegType to, x86SSERegType from); +void SSE2_MOVMSKPD_XMM_to_R32(x86IntRegType to, x86SSERegType from); + +//**********************************************************************************/ +//PEXTRW,PINSRW: Packed Extract/Insert Word * +//********************************************************************************** +void SSE_PEXTRW_XMM_to_R32(x86IntRegType to, x86SSERegType from, u8 imm8 ); +void SSE_PINSRW_R32_to_XMM(x86SSERegType from, x86IntRegType to, u8 imm8 ); + + +//**********************************************************************************/ +//PSUBx: Subtract Packed Integers * +//********************************************************************************** +void SSE2_PSUBB_XMM_to_XMM(x86SSERegType to, x86SSERegType from ); +void SSE2_PSUBB_M128_to_XMM(x86SSERegType to, uptr from ); +void SSE2_PSUBW_XMM_to_XMM(x86SSERegType to, x86SSERegType from ); +void SSE2_PSUBW_M128_to_XMM(x86SSERegType to, uptr from ); +void SSE2_PSUBD_XMM_to_XMM(x86SSERegType to, x86SSERegType from ); +void SSE2_PSUBD_M128_to_XMM(x86SSERegType to, uptr from ); +void SSE2_PSUBQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from ); +void SSE2_PSUBQ_M128_to_XMM(x86SSERegType to, uptr from ); +/////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//PCMPxx: Compare Packed Integers * +//********************************************************************************** +void SSE2_PCMPGTB_XMM_to_XMM(x86SSERegType to, x86SSERegType from ); +void SSE2_PCMPGTB_M128_to_XMM(x86SSERegType to, uptr from ); +void SSE2_PCMPGTW_XMM_to_XMM(x86SSERegType to, x86SSERegType from ); +void SSE2_PCMPGTW_M128_to_XMM(x86SSERegType to, uptr from ); +void SSE2_PCMPGTD_XMM_to_XMM(x86SSERegType to, x86SSERegType from ); +void SSE2_PCMPGTD_M128_to_XMM(x86SSERegType to, uptr from ); +void SSE2_PCMPEQB_XMM_to_XMM(x86SSERegType to, x86SSERegType from ); +void SSE2_PCMPEQB_M128_to_XMM(x86SSERegType to, uptr from ); +void SSE2_PCMPEQW_XMM_to_XMM(x86SSERegType to, x86SSERegType from ); +void SSE2_PCMPEQW_M128_to_XMM(x86SSERegType to, uptr from ); +void SSE2_PCMPEQD_XMM_to_XMM(x86SSERegType to, x86SSERegType from ); +void SSE2_PCMPEQD_M128_to_XMM(x86SSERegType to, uptr from ); +//**********************************************************************************/ +//MOVD: Move Dword(32bit) to /from XMM reg * +//********************************************************************************** +void SSE2_MOVD_M32_to_XMM( x86SSERegType to, uptr from ); +void SSE2_MOVD_R_to_XMM( x86SSERegType to, x86IntRegType from ); +void SSE2_MOVD_Rm_to_XMM( x86SSERegType to, x86IntRegType from ); +void SSE2_MOVD_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset ); +void SSE2_MOVD_XMM_to_M32( u32 to, x86SSERegType from ); +void SSE2_MOVD_XMM_to_R( x86IntRegType to, x86SSERegType from ); +void SSE2_MOVD_XMM_to_Rm( x86IntRegType to, x86SSERegType from ); +void SSE2_MOVD_XMM_to_RmOffset( x86IntRegType to, x86SSERegType from, int offset ); + +#ifdef __x86_64__ +void SSE2_MOVQ_XMM_to_R( x86IntRegType to, x86SSERegType from ); +void SSE2_MOVQ_R_to_XMM( x86SSERegType to, x86IntRegType from ); +#endif + +//**********************************************************************************/ +//POR : SSE Bitwise OR * +//********************************************************************************** +void SSE2_POR_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2_POR_M128_to_XMM( x86SSERegType to, uptr from ); + +void SSE3_HADDPS_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE3_HADDPS_M128_to_XMM(x86SSERegType to, uptr from); + +void SSE3_MOVSLDUP_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE3_MOVSLDUP_M128_to_XMM(x86SSERegType to, uptr from); +void SSE3_MOVSHDUP_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSE3_MOVSHDUP_M128_to_XMM(x86SSERegType to, uptr from); +//********************* +// SSE-X - uses both SSE,SSE2 code and tries to keep consistensies between the data +// Uses g_xmmtypes to infer the correct type. +//********************* +void SSEX_MOVDQA_M128_to_XMM( x86SSERegType to, uptr from ); +void SSEX_MOVDQA_XMM_to_M128( uptr to, x86SSERegType from ); +void SSEX_MOVDQA_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); + +void SSEX_MOVDQARmtoROffset( x86SSERegType to, x86IntRegType from, int offset ); +void SSEX_MOVDQARtoRmOffset( x86IntRegType to, x86SSERegType from, int offset ); + +void SSEX_MOVDQU_M128_to_XMM( x86SSERegType to, uptr from ); +void SSEX_MOVDQU_XMM_to_M128( uptr to, x86SSERegType from ); +void SSEX_MOVDQU_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); + +void SSEX_MOVD_M32_to_XMM( x86SSERegType to, uptr from ); +void SSEX_MOVD_XMM_to_M32( u32 to, x86SSERegType from ); +void SSEX_MOVD_XMM_to_Rm( x86IntRegType to, x86SSERegType from ); +void SSEX_MOVD_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset ); +void SSEX_MOVD_XMM_to_RmOffset( x86IntRegType to, x86SSERegType from, int offset ); + +void SSEX_POR_M128_to_XMM( x86SSERegType to, uptr from ); +void SSEX_POR_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSEX_PXOR_M128_to_XMM( x86SSERegType to, uptr from ); +void SSEX_PXOR_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSEX_PAND_M128_to_XMM( x86SSERegType to, uptr from ); +void SSEX_PAND_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSEX_PANDN_M128_to_XMM( x86SSERegType to, uptr from ); +void SSEX_PANDN_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); + +void SSEX_PUNPCKLDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSEX_PUNPCKLDQ_M128_to_XMM(x86SSERegType to, uptr from); +void SSEX_PUNPCKHDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from); +void SSEX_PUNPCKHDQ_M128_to_XMM(x86SSERegType to, uptr from); + +void SSEX_MOVHLPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); + +//********************* +// 3DNOW instructions * +//********************* +void FEMMS( void ); +void PFCMPEQMtoR( x86IntRegType to, uptr from ); +void PFCMPGTMtoR( x86IntRegType to, uptr from ); +void PFCMPGEMtoR( x86IntRegType to, uptr from ); +void PFADDMtoR( x86IntRegType to, uptr from ); +void PFADDRtoR( x86IntRegType to, x86IntRegType from ); +void PFSUBMtoR( x86IntRegType to, uptr from ); +void PFSUBRtoR( x86IntRegType to, x86IntRegType from ); +void PFMULMtoR( x86IntRegType to, uptr from ); +void PFMULRtoR( x86IntRegType to, x86IntRegType from ); +void PFRCPMtoR( x86IntRegType to, uptr from ); +void PFRCPRtoR( x86IntRegType to, x86IntRegType from ); +void PFRCPIT1RtoR( x86IntRegType to, x86IntRegType from ); +void PFRCPIT2RtoR( x86IntRegType to, x86IntRegType from ); +void PFRSQRTRtoR( x86IntRegType to, x86IntRegType from ); +void PFRSQIT1RtoR( x86IntRegType to, x86IntRegType from ); +void PF2IDMtoR( x86IntRegType to, uptr from ); +void PF2IDRtoR( x86IntRegType to, x86IntRegType from ); +void PI2FDMtoR( x86IntRegType to, uptr from ); +void PI2FDRtoR( x86IntRegType to, x86IntRegType from ); +void PFMAXMtoR( x86IntRegType to, uptr from ); +void PFMAXRtoR( x86IntRegType to, x86IntRegType from ); +void PFMINMtoR( x86IntRegType to, uptr from ); +void PFMINRtoR( x86IntRegType to, x86IntRegType from ); + +void SSE2EMU_MOVSD_XMM_to_XMM( x86SSERegType to, x86SSERegType from); +void SSE2EMU_MOVQ_M64_to_XMM( x86SSERegType to, uptr from); +void SSE2EMU_MOVQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from); +void SSE2EMU_MOVD_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset ); +void SSE2EMU_MOVD_XMM_to_RmOffset(x86IntRegType to, x86SSERegType from, int offset ); + +#ifndef __x86_64__ +void SSE2EMU_MOVDQ2Q_XMM_to_MM( x86MMXRegType to, x86SSERegType from); +void SSE2EMU_MOVQ2DQ_MM_to_XMM( x86SSERegType to, x86MMXRegType from); +#endif + +/* SSE2 emulated functions for SSE CPU's by kekko*/ + +void SSE2EMU_PSHUFD_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 ); +void SSE2EMU_MOVD_XMM_to_R( x86IntRegType to, x86SSERegType from ); +void SSE2EMU_CVTPS2DQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from ); +void SSE2EMU_CVTDQ2PS_M128_to_XMM( x86SSERegType to, uptr from ); +void SSE2EMU_MOVD_XMM_to_M32( uptr to, x86SSERegType from ); +void SSE2EMU_MOVD_R_to_XMM( x86SSERegType to, x86IntRegType from ); + +//////////////////////////////////////////////////// +#ifdef _DEBUG +#define WRITECHECK() CheckX86Ptr() +#else +#define WRITECHECK() +#endif + +#define writeVAL(val) ({ \ + WRITECHECK(); \ + *(typeof(val)*)x86Ptr = (val); \ + x86Ptr += sizeof(val); \ + (void)0; \ + }) + +#define write8(val ) writeVAL((u8)(val)) +#define write16(val ) writeVAL((u16)(val)) +#define write32( val ) writeVAL((u32)(val)) +#define write64( val ) writeVAL((u64)(val)) + +#ifdef __cplusplus +} +#endif + +#endif // __IX86_H__ diff --git a/libpcsxcore/ix86_64/ix86_3dnow.c b/libpcsxcore/ix86_64/ix86_3dnow.c new file mode 100644 index 0000000..8fd4233 --- /dev/null +++ b/libpcsxcore/ix86_64/ix86_3dnow.c @@ -0,0 +1,178 @@ +// stop compiling if NORECBUILD build (only for Visual Studio) +#if !(defined(_MSC_VER) && defined(PCSX2_NORECBUILD)) + +#include "ix86-64.h" + +/**********************/ +/* 3DNOW instructions */ +/**********************/ + +/* femms */ +void FEMMS( void ) +{ + write16( 0x0E0F ); +} + +void PFCMPEQMtoR( x86IntRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1); + write8( 0xB0 ); +} + +void PFCMPGTMtoR( x86IntRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1); + write8( 0xA0 ); +} + +void PFCMPGEMtoR( x86IntRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1); + write8( 0x90 ); +} + +void PFADDMtoR( x86IntRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1); + write8( 0x9E ); +} + +void PFADDRtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(0, to, from); + write16( 0x0F0F ); + ModRM( 3, to, from ); + write8( 0x9E ); +} + +void PFSUBMtoR( x86IntRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1); + write8( 0x9A ); +} + +void PFSUBRtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(0, to, from); + write16( 0x0F0F ); + ModRM( 3, to, from ); + write8( 0x9A ); +} + +void PFMULMtoR( x86IntRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1); + write8( 0xB4 ); +} + +void PFMULRtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(0, to, from); + write16( 0x0F0F ); + ModRM( 3, to, from ); + write8( 0xB4 ); +} + +void PFRCPMtoR( x86IntRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1); + write8( 0x96 ); +} + +void PFRCPRtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(0, to, from); + write16( 0x0F0F ); + ModRM( 3, to, from ); + write8( 0x96 ); +} + +void PFRCPIT1RtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(0, to, from); + write16( 0x0F0F ); + ModRM( 3, to, from ); + write8( 0xA6 ); +} + +void PFRCPIT2RtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(0, to, from); + write16( 0x0F0F ); + ModRM( 3, to, from ); + write8( 0xB6 ); +} + +void PFRSQRTRtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(0, to, from); + write16( 0x0F0F ); + ModRM( 3, to, from ); + write8( 0x97 ); +} + +void PFRSQIT1RtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(0, to, from); + write16( 0x0F0F ); + ModRM( 3, to, from ); + write8( 0xA7 ); +} + +void PF2IDMtoR( x86IntRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1); + write8( 0x1D ); +} + +void PF2IDRtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(0, to, from); + write16( 0x0F0F ); + ModRM( 3, to, from ); + write8( 0x1D ); +} + +void PI2FDMtoR( x86IntRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1); + write8( 0x0D ); +} + +void PI2FDRtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(0, to, from); + write16( 0x0F0F ); + ModRM( 3, to, from ); + write8( 0x0D ); +} + +void PFMAXMtoR( x86IntRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1); + write8( 0xA4 ); +} + +void PFMAXRtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(0, to, from); + write16( 0x0F0F ); + ModRM( 3, to, from ); + write8( 0xA4 ); +} + +void PFMINMtoR( x86IntRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1); + write8( 0x94 ); +} + +void PFMINRtoR( x86IntRegType to, x86IntRegType from ) +{ + RexRB(0, to, from); + write16( 0x0F0F ); + ModRM( 3, to, from ); + write8( 0x94 ); +} + +#endif diff --git a/libpcsxcore/ix86_64/ix86_cpudetect.c b/libpcsxcore/ix86_64/ix86_cpudetect.c new file mode 100644 index 0000000..3c014d8 --- /dev/null +++ b/libpcsxcore/ix86_64/ix86_cpudetect.c @@ -0,0 +1,487 @@ +/* Cpudetection lib + * Copyright (C) 2002-2003 Pcsx2 Team + * + * This program is free software; you can redistribute it and/or modify + * it 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; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA + */ +#if defined (_WIN32) +#include +#endif + +#include +#include + +#include "ix86-64.h" + +#if defined (_MSC_VER) && _MSC_VER >= 1400 + + void __cpuid(int* CPUInfo, int InfoType); + unsigned __int64 __rdtsc(); + + #pragma intrinsic(__cpuid) + #pragma intrinsic(__rdtsc) + +#endif + +CAPABILITIES cpucaps; +CPUINFO cpuinfo; + +#define cpuid(cmd,a,b,c,d) \ + __asm__ __volatile__("cpuid" \ + : "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "0" (cmd)) + +static s32 iCpuId( u32 cmd, u32 *regs ) +{ + int flag=1; + +#if defined (_MSC_VER) && _MSC_VER >= 1400 + + __cpuid( regs, cmd ); + + return 0; + +#elif defined (_MSC_VER) + +#ifdef __x86_64__ + assert(0); +#else // __x86_64__ + __asm + { + push ebx; + push edi; + + pushfd; + pop eax; + mov edx, eax; + xor eax, 1 << 21; + push eax; + popfd; + pushfd; + pop eax; + xor eax, edx; + mov flag, eax; + } + if ( ! flag ) + { + return -1; + } + + __asm + { + mov eax, cmd; + cpuid; + mov edi, [regs] + mov [edi], eax; + mov [edi+4], ebx; + mov [edi+8], ecx; + mov [edi+12], edx; + + pop edi; + pop ebx; + } +#endif // __x86_64__ + return 0; + + +#else + +#ifndef __x86_64__ + // see if we can use cpuid + __asm__ __volatile__ ( + "sub $0x18, %%esp\n" + "pushf\n" + "pop %%eax\n" + "mov %%eax, %%edx\n" + "xor $0x200000, %%eax\n" + "push %%eax\n" + "popf\n" + "pushf\n" + "pop %%eax\n" + "xor %%edx, %%eax\n" + "mov %%eax, %0\n" + "add $0x18, %%esp\n" + : "=r"(flag) : + ); +#endif + + if ( !flag ) + return -1; + + cpuid(cmd, regs[0], regs[1], regs[2], regs[3]); + return 0; +#endif // _MSC_VER +} + +u64 GetCPUTick( void ) +{ +#if defined (_MSC_VER) && _MSC_VER >= 1400 + + return __rdtsc(); + +#elif defined(__MSCW32__) && !defined(__x86_64__) + + __asm rdtsc; + +#else + + u32 _a, _d; + __asm__ __volatile__ ("rdtsc" : "=a"(_a), "=d"(_d)); + return (u64)_a | ((u64)_d << 32); + +#endif +} + +#if defined __LINUX__ + +#include +#include +//* +unsigned long timeGetTime2() +{ + struct timeval tv; + gettimeofday(&tv, 0); // well, maybe there are better ways + return (unsigned long)tv.tv_sec * 1000 + tv.tv_usec/1000; // to do that, but at least it works +} +//*/ +#endif + +s64 CPUSpeedHz( unsigned int time ) +{ + s64 timeStart, + timeStop; + s64 startTick, + endTick; + s64 overhead; + + if( ! cpucaps.hasTimeStampCounter ) + { + return 0; //check if function is supported + } + + overhead = GetCPUTick() - GetCPUTick(); + + timeStart = timeGetTime2( ); + while( timeGetTime2( ) == timeStart ) + { + timeStart = timeGetTime2( ); + } + for(;;) + { + timeStop = timeGetTime2( ); + if ( ( timeStop - timeStart ) > 1 ) + { + startTick = GetCPUTick( ); + break; + } + } + + timeStart = timeStop; + for(;;) + { + timeStop = timeGetTime2( ); + if ( ( timeStop - timeStart ) > time ) + { + endTick = GetCPUTick( ); + break; + } + } + + return (s64)( ( endTick - startTick ) + ( overhead ) ); +} + +//////////////////////////////////////////////////// +void cpudetectInit( void ) +{ + u32 regs[ 4 ]; + u32 cmds; + u32 AMDspeed; + s8 AMDspeedString[10]; + int cputype=0; // Cpu type + //AMD 64 STUFF + u32 x86_64_8BITBRANDID; + u32 x86_64_12BITBRANDID; + memset( cpuinfo.x86ID, 0, sizeof( cpuinfo.x86ID ) ); + cpuinfo.x86Family = 0; + cpuinfo.x86Model = 0; + cpuinfo.x86PType = 0; + cpuinfo.x86StepID = 0; + cpuinfo.x86Flags = 0; + cpuinfo.x86EFlags = 0; + + if ( iCpuId( 0, regs ) == -1 ) return; + + cmds = regs[ 0 ]; + ((u32*)cpuinfo.x86ID)[ 0 ] = regs[ 1 ]; + ((u32*)cpuinfo.x86ID)[ 1 ] = regs[ 3 ]; + ((u32*)cpuinfo.x86ID)[ 2 ] = regs[ 2 ]; + if ( cmds >= 0x00000001 ) + { + if ( iCpuId( 0x00000001, regs ) != -1 ) + { + cpuinfo.x86StepID = regs[ 0 ] & 0xf; + cpuinfo.x86Model = (regs[ 0 ] >> 4) & 0xf; + cpuinfo.x86Family = (regs[ 0 ] >> 8) & 0xf; + cpuinfo.x86PType = (regs[ 0 ] >> 12) & 0x3; + x86_64_8BITBRANDID = regs[1] & 0xff; + cpuinfo.x86Flags = regs[ 3 ]; + } + } + if ( iCpuId( 0x80000000, regs ) != -1 ) + { + cmds = regs[ 0 ]; + if ( cmds >= 0x80000001 ) + { + if ( iCpuId( 0x80000001, regs ) != -1 ) + { + x86_64_12BITBRANDID = regs[1] & 0xfff; + cpuinfo.x86EFlags = regs[ 3 ]; + + } + } + } + switch(cpuinfo.x86PType) + { + case 0: + strcpy( cpuinfo.x86Type, "Standard OEM"); + break; + case 1: + strcpy( cpuinfo.x86Type, "Overdrive"); + break; + case 2: + strcpy( cpuinfo.x86Type, "Dual"); + break; + case 3: + strcpy( cpuinfo.x86Type, "Reserved"); + break; + default: + strcpy( cpuinfo.x86Type, "Unknown"); + break; + } + if ( cpuinfo.x86ID[ 0 ] == 'G' ){ cputype=0;}//trick lines but if you know a way better ;p + if ( cpuinfo.x86ID[ 0 ] == 'A' ){ cputype=1;} + + if ( cputype == 0 ) //intel cpu + { + if( ( cpuinfo.x86Family >= 7 ) && ( cpuinfo.x86Family < 15 ) ) + { + strcpy( cpuinfo.x86Fam, "Intel P6 family (Not PIV and Higher then PPro" ); + } + else + { + switch( cpuinfo.x86Family ) + { + // Start at 486 because if it's below 486 there is no cpuid instruction + case 4: + strcpy( cpuinfo.x86Fam, "Intel 486" ); + break; + case 5: + switch( cpuinfo.x86Model ) + { + case 4: + case 8: // 0.25 µm + strcpy( cpuinfo.x86Fam, "Intel Pentium (MMX)"); + break; + default: + strcpy( cpuinfo.x86Fam, "Intel Pentium" ); + } + break; + case 6: + switch( cpuinfo.x86Model ) + { + case 0: // Pentium pro (P6 A-Step) + case 1: // Pentium pro + strcpy( cpuinfo.x86Fam, "Intel Pentium Pro" ); + break; + + case 2: // 66 MHz FSB + case 5: // Xeon/Celeron (0.25 µm) + case 6: // Internal L2 cache + strcpy( cpuinfo.x86Fam, "Intel Pentium II" ); + break; + + case 7: // Xeon external L2 cache + case 8: // Xeon/Celeron with 256 KB on-die L2 cache + case 10: // Xeon/Celeron with 1 or 2 MB on-die L2 cache + case 11: // Xeon/Celeron with Tualatin core, on-die cache + strcpy( cpuinfo.x86Fam, "Intel Pentium III" ); + break; + case 15: // Core 2 Duo Allendale/Conroe + strcpy( cpuinfo.x86Fam, "Intel Core 2 Duo" ); + break; + + default: + strcpy( cpuinfo.x86Fam, "Intel Pentium Pro (Unknown)" ); + } + break; + case 15: + switch( cpuinfo.x86Model ) + { + case 0: // Willamette (A-Step) + case 1: // Willamette + strcpy( cpuinfo.x86Fam, "Willamette Intel Pentium IV" ); + break; + case 2: // Northwood + strcpy( cpuinfo.x86Fam, "Northwood Intel Pentium IV" ); + break; + + default: + strcpy( cpuinfo.x86Fam, "Intel Pentium IV (Unknown)" ); + break; + } + break; + default: + strcpy( cpuinfo.x86Fam, "Unknown Intel CPU" ); + } + } + } + else if ( cputype == 1 ) //AMD cpu + { + if( cpuinfo.x86Family >= 7 ) + { + if((x86_64_12BITBRANDID !=0) || (x86_64_8BITBRANDID !=0)) + { + if(x86_64_8BITBRANDID == 0 ) + { + switch((x86_64_12BITBRANDID >>6)& 0x3f) + { + case 4: + strcpy(cpuinfo.x86Fam,"AMD Athlon(tm) 64 Processor"); + AMDspeed = 22 + (x86_64_12BITBRANDID & 0x1f); + //AMDspeedString = strtol(AMDspeed, (char**)NULL,10); + sprintf(AMDspeedString," %d",AMDspeed); + strcat(AMDspeedString,"00+"); + strcat(cpuinfo.x86Fam,AMDspeedString); + break; + case 12: + strcpy(cpuinfo.x86Fam,"AMD Opteron(tm) Processor"); + break; + case 5: + strcpy( cpuinfo.x86Fam, "AMD Athlon X2 Processor" ); + AMDspeed = 22 + (x86_64_12BITBRANDID & 0x1f); + //AMDspeedString = strtol(AMDspeed, (char**)NULL,10); + sprintf(AMDspeedString," %d",AMDspeed); + strcat(AMDspeedString,"00+"); + strcat(cpuinfo.x86Fam,AMDspeedString); + break; + case 44: + strcpy( cpuinfo.x86Fam, "AMD Opteron(tm) Dual Core Processor" ); + break; + default: + strcpy(cpuinfo.x86Fam,"Unknown AMD 64 proccesor"); + + } + } + else //8bit brand id is non zero + { + strcpy(cpuinfo.x86Fam,"Unsupported yet AMD64 cpu"); + } + } + else + { + strcpy( cpuinfo.x86Fam, "AMD K7+ Processor" ); + } + } + else + { + switch ( cpuinfo.x86Family ) + { + case 4: + switch( cpuinfo.x86Model ) + { + case 14: + case 15: // Write-back enhanced + strcpy( cpuinfo.x86Fam, "AMD 5x86 Processor" ); + break; + + case 3: // DX2 + case 7: // Write-back enhanced DX2 + case 8: // DX4 + case 9: // Write-back enhanced DX4 + strcpy( cpuinfo.x86Fam, "AMD 486 Processor" ); + break; + + + default: + strcpy( cpuinfo.x86Fam, "AMD Unknown Processor" ); + + } + break; + + case 5: + switch( cpuinfo.x86Model) + { + case 0: // SSA 5 (75, 90 and 100 Mhz) + case 1: // 5k86 (PR 120 and 133 MHz) + case 2: // 5k86 (PR 166 MHz) + case 3: // K5 5k86 (PR 200 MHz) + strcpy( cpuinfo.x86Fam, "AMD K5 Processor" ); + break; + + case 6: + case 7: // (0.25 µm) + case 8: // K6-2 + case 9: // K6-III + case 14: // K6-2+ / K6-III+ + strcpy( cpuinfo.x86Fam, "AMD K6 Series Processor" ); + break; + + default: + strcpy( cpuinfo.x86Fam, "AMD Unknown Processor" ); + } + break; + case 6: + strcpy( cpuinfo.x86Fam, "AMD Athlon XP Processor" ); + break; + default: + strcpy( cpuinfo.x86Fam, "Unknown AMD CPU" ); + } + } + } + //capabilities + cpucaps.hasFloatingPointUnit = ( cpuinfo.x86Flags >> 0 ) & 1; + cpucaps.hasVirtual8086ModeEnhancements = ( cpuinfo.x86Flags >> 1 ) & 1; + cpucaps.hasDebuggingExtensions = ( cpuinfo.x86Flags >> 2 ) & 1; + cpucaps.hasPageSizeExtensions = ( cpuinfo.x86Flags >> 3 ) & 1; + cpucaps.hasTimeStampCounter = ( cpuinfo.x86Flags >> 4 ) & 1; + cpucaps.hasModelSpecificRegisters = ( cpuinfo.x86Flags >> 5 ) & 1; + cpucaps.hasPhysicalAddressExtension = ( cpuinfo.x86Flags >> 6 ) & 1; + cpucaps.hasMachineCheckArchitecture = ( cpuinfo.x86Flags >> 7 ) & 1; + cpucaps.hasCOMPXCHG8BInstruction = ( cpuinfo.x86Flags >> 8 ) & 1; + cpucaps.hasAdvancedProgrammableInterruptController = ( cpuinfo.x86Flags >> 9 ) & 1; + cpucaps.hasSEPFastSystemCall = ( cpuinfo.x86Flags >> 11 ) & 1; + cpucaps.hasMemoryTypeRangeRegisters = ( cpuinfo.x86Flags >> 12 ) & 1; + cpucaps.hasPTEGlobalFlag = ( cpuinfo.x86Flags >> 13 ) & 1; + cpucaps.hasMachineCheckArchitecture = ( cpuinfo.x86Flags >> 14 ) & 1; + cpucaps.hasConditionalMoveAndCompareInstructions = ( cpuinfo.x86Flags >> 15 ) & 1; + cpucaps.hasFGPageAttributeTable = ( cpuinfo.x86Flags >> 16 ) & 1; + cpucaps.has36bitPageSizeExtension = ( cpuinfo.x86Flags >> 17 ) & 1; + cpucaps.hasProcessorSerialNumber = ( cpuinfo.x86Flags >> 18 ) & 1; + cpucaps.hasCFLUSHInstruction = ( cpuinfo.x86Flags >> 19 ) & 1; + cpucaps.hasDebugStore = ( cpuinfo.x86Flags >> 21 ) & 1; + cpucaps.hasACPIThermalMonitorAndClockControl = ( cpuinfo.x86Flags >> 22 ) & 1; + cpucaps.hasMultimediaExtensions = ( cpuinfo.x86Flags >> 23 ) & 1; //mmx + cpucaps.hasFastStreamingSIMDExtensionsSaveRestore = ( cpuinfo.x86Flags >> 24 ) & 1; + cpucaps.hasStreamingSIMDExtensions = ( cpuinfo.x86Flags >> 25 ) & 1; //sse + cpucaps.hasStreamingSIMD2Extensions = ( cpuinfo.x86Flags >> 26 ) & 1; //sse2 + cpucaps.hasSelfSnoop = ( cpuinfo.x86Flags >> 27 ) & 1; + cpucaps.hasHyperThreading = ( cpuinfo.x86Flags >> 28 ) & 1; + cpucaps.hasThermalMonitor = ( cpuinfo.x86Flags >> 29 ) & 1; + cpucaps.hasIntel64BitArchitecture = ( cpuinfo.x86Flags >> 30 ) & 1; + //that is only for AMDs + cpucaps.hasMultimediaExtensionsExt = ( cpuinfo.x86EFlags >> 22 ) & 1; //mmx2 + cpucaps.hasAMD64BitArchitecture = ( cpuinfo.x86EFlags >> 29 ) & 1; //64bit cpu + cpucaps.has3DNOWInstructionExtensionsExt = ( cpuinfo.x86EFlags >> 30 ) & 1; //3dnow+ + cpucaps.has3DNOWInstructionExtensions = ( cpuinfo.x86EFlags >> 31 ) & 1; //3dnow + cpuinfo.cpuspeed = (u32 )(CPUSpeedHz( 1000 ) / 1000000); +} diff --git a/libpcsxcore/ix86_64/ix86_fpu.c b/libpcsxcore/ix86_64/ix86_fpu.c new file mode 100644 index 0000000..ca49eb7 --- /dev/null +++ b/libpcsxcore/ix86_64/ix86_fpu.c @@ -0,0 +1,248 @@ +// stop compiling if NORECBUILD build (only for Visual Studio) +#if !(defined(_MSC_VER) && defined(PCSX2_NORECBUILD)) + +#include +#include +#include "ix86-64.h" + +/********************/ +/* FPU instructions */ +/********************/ + +/* fild m32 to fpu reg stack */ +void FILD32( uptr from ) +{ + MEMADDR_OP(0, VAROP1(0xDB), false, 0, from, 0); +} + +/* fistp m32 from fpu reg stack */ +void FISTP32( uptr from ) +{ + MEMADDR_OP(0, VAROP1(0xDB), false, 3, from, 0); +} + +/* fld m32 to fpu reg stack */ +void FLD32( uptr from ) +{ + MEMADDR_OP(0, VAROP1(0xD9), false, 0, from, 0); +} + +// fld st(i) +void FLD(int st) { write16(0xc0d9+(st<<8)); } + +void FLD1() { write16(0xe8d9); } +void FLDL2E() { write16(0xead9); } + +/* fst m32 from fpu reg stack */ +void FST32( uptr to ) +{ + MEMADDR_OP(0, VAROP1(0xD9), false, 2, to, 0); +} + +/* fstp m32 from fpu reg stack */ +void FSTP32( uptr to ) +{ + MEMADDR_OP(0, VAROP1(0xD9), false, 3, to, 0); +} + +// fstp st(i) +void FSTP(int st) { write16(0xd8dd+(st<<8)); } + +/* fldcw fpu control word from m16 */ +void FLDCW( uptr from ) +{ + MEMADDR_OP(0, VAROP1(0xD9), false, 5, from, 0); +} + +/* fnstcw fpu control word to m16 */ +void FNSTCW( uptr to ) +{ + MEMADDR_OP(0, VAROP1(0xD9), false, 7, to, 0); +} + +void FNSTSWtoAX( void ) +{ + write16( 0xE0DF ); +} + +void FXAM() +{ + write16(0xe5d9); +} + +void FDECSTP() { write16(0xf6d9); } +void FRNDINT() { write16(0xfcd9); } +void FXCH(int st) { write16(0xc8d9+(st<<8)); } +void F2XM1() { write16(0xf0d9); } +void FSCALE() { write16(0xfdd9); } + +/* fadd ST(src) to fpu reg stack ST(0) */ +void FADD32Rto0( x86IntRegType src ) +{ + write8( 0xD8 ); + write8( 0xC0 + src ); +} + +/* fadd ST(0) to fpu reg stack ST(src) */ +void FADD320toR( x86IntRegType src ) +{ + write8( 0xDC ); + write8( 0xC0 + src ); +} + +/* fsub ST(src) to fpu reg stack ST(0) */ +void FSUB32Rto0( x86IntRegType src ) +{ + write8( 0xD8 ); + write8( 0xE0 + src ); +} + +/* fsub ST(0) to fpu reg stack ST(src) */ +void FSUB320toR( x86IntRegType src ) +{ + write8( 0xDC ); + write8( 0xE8 + src ); +} + +/* fsubp -> substract ST(0) from ST(1), store in ST(1) and POP stack */ +void FSUBP( void ) +{ + write8( 0xDE ); + write8( 0xE9 ); +} + +/* fmul ST(src) to fpu reg stack ST(0) */ +void FMUL32Rto0( x86IntRegType src ) +{ + write8( 0xD8 ); + write8( 0xC8 + src ); +} + +/* fmul ST(0) to fpu reg stack ST(src) */ +void FMUL320toR( x86IntRegType src ) +{ + write8( 0xDC ); + write8( 0xC8 + src ); +} + +/* fdiv ST(src) to fpu reg stack ST(0) */ +void FDIV32Rto0( x86IntRegType src ) +{ + write8( 0xD8 ); + write8( 0xF0 + src ); +} + +/* fdiv ST(0) to fpu reg stack ST(src) */ +void FDIV320toR( x86IntRegType src ) +{ + write8( 0xDC ); + write8( 0xF8 + src ); +} + +void FDIV320toRP( x86IntRegType src ) +{ + write8( 0xDE ); + write8( 0xF8 + src ); +} + +/* fadd m32 to fpu reg stack */ +void FADD32( uptr from ) +{ + MEMADDR_OP(0, VAROP1(0xD8), false, 0, from, 0); +} + +/* fsub m32 to fpu reg stack */ +void FSUB32( uptr from ) +{ + MEMADDR_OP(0, VAROP1(0xD8), false, 4, from, 0); +} + +/* fmul m32 to fpu reg stack */ +void FMUL32( uptr from ) +{ + MEMADDR_OP(0, VAROP1(0xD8), false, 1, from, 0); +} + +/* fdiv m32 to fpu reg stack */ +void FDIV32( uptr from ) +{ + MEMADDR_OP(0, VAROP1(0xD8), false, 6, from, 0); +} + +/* fabs fpu reg stack */ +void FABS( void ) +{ + write16( 0xE1D9 ); +} + +/* fsqrt fpu reg stack */ +void FSQRT( void ) +{ + write16( 0xFAD9 ); +} + +void FPATAN(void) { write16(0xf3d9); } +void FSIN(void) { write16(0xfed9); } + +/* fchs fpu reg stack */ +void FCHS( void ) +{ + write16( 0xE0D9 ); +} + +/* fcomi st, st(i) */ +void FCOMI( x86IntRegType src ) +{ + write8( 0xDB ); + write8( 0xF0 + src ); +} + +/* fcomip st, st(i) */ +void FCOMIP( x86IntRegType src ) +{ + write8( 0xDF ); + write8( 0xF0 + src ); +} + +/* fucomi st, st(i) */ +void FUCOMI( x86IntRegType src ) +{ + write8( 0xDB ); + write8( 0xE8 + src ); +} + +/* fucomip st, st(i) */ +void FUCOMIP( x86IntRegType src ) +{ + write8( 0xDF ); + write8( 0xE8 + src ); +} + +/* fcom m32 to fpu reg stack */ +void FCOM32( uptr from ) +{ + MEMADDR_OP(0, VAROP1(0xD8), false, 2, from, 0); +} + +/* fcomp m32 to fpu reg stack */ +void FCOMP32( uptr from ) +{ + MEMADDR_OP(0, VAROP1(0xD8), false, 3, from, 0); +} + +#define FCMOV32( low, high ) \ + { \ + write8( low ); \ + write8( high + from ); \ + } + +void FCMOVB32( x86IntRegType from ) { FCMOV32( 0xDA, 0xC0 ); } +void FCMOVE32( x86IntRegType from ) { FCMOV32( 0xDA, 0xC8 ); } +void FCMOVBE32( x86IntRegType from ) { FCMOV32( 0xDA, 0xD0 ); } +void FCMOVU32( x86IntRegType from ) { FCMOV32( 0xDA, 0xD8 ); } +void FCMOVNB32( x86IntRegType from ) { FCMOV32( 0xDB, 0xC0 ); } +void FCMOVNE32( x86IntRegType from ) { FCMOV32( 0xDB, 0xC8 ); } +void FCMOVNBE32( x86IntRegType from ) { FCMOV32( 0xDB, 0xD0 ); } +void FCMOVNU32( x86IntRegType from ) { FCMOV32( 0xDB, 0xD8 ); } + +#endif diff --git a/libpcsxcore/ix86_64/ix86_mmx.c b/libpcsxcore/ix86_64/ix86_mmx.c new file mode 100644 index 0000000..eddbbfc --- /dev/null +++ b/libpcsxcore/ix86_64/ix86_mmx.c @@ -0,0 +1,646 @@ +// stop compiling if NORECBUILD build (only for Visual Studio) +#if !(defined(_MSC_VER) && defined(PCSX2_NORECBUILD)) + +#include "ix86-64.h" + +#include + +/********************/ +/* MMX instructions */ +/********************/ + +// r64 = mm + +/* movq m64 to r64 */ +void MOVQMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x6F), true, to, from, 0); +} + +/* movq r64 to m64 */ +void MOVQRtoM( uptr to, x86MMXRegType from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x7F), true, from, to, 0); +} + +/* pand r64 to r64 */ +void PANDRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xDB0F ); + ModRM( 3, to, from ); +} + +void PANDNRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xDF0F ); + ModRM( 3, to, from ); +} + +/* por r64 to r64 */ +void PORRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xEB0F ); + ModRM( 3, to, from ); +} + +/* pxor r64 to r64 */ +void PXORRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xEF0F ); + ModRM( 3, to, from ); +} + +/* psllq r64 to r64 */ +void PSLLQRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xF30F ); + ModRM( 3, to, from ); +} + +/* psllq m64 to r64 */ +void PSLLQMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0xF3), true, to, from, 0); +} + +/* psllq imm8 to r64 */ +void PSLLQItoR( x86MMXRegType to, u8 from ) +{ + RexB(0, to); + write16( 0x730F ); + ModRM( 3, 6, to); + write8( from ); +} + +/* psrlq r64 to r64 */ +void PSRLQRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xD30F ); + ModRM( 3, to, from ); +} + +/* psrlq m64 to r64 */ +void PSRLQMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0xD3), true, to, from, 0); +} + +/* psrlq imm8 to r64 */ +void PSRLQItoR( x86MMXRegType to, u8 from ) +{ + RexB(0, to); + write16( 0x730F ); + ModRM( 3, 2, to); + write8( from ); +} + +/* paddusb r64 to r64 */ +void PADDUSBRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xDC0F ); + ModRM( 3, to, from ); +} + +/* paddusb m64 to r64 */ +void PADDUSBMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0xDC), true, to, from, 0); +} + +/* paddusw r64 to r64 */ +void PADDUSWRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xDD0F ); + ModRM( 3, to, from ); +} + +/* paddusw m64 to r64 */ +void PADDUSWMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0xDD), true, to, from, 0); +} + +/* paddb r64 to r64 */ +void PADDBRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xFC0F ); + ModRM( 3, to, from ); +} + +/* paddb m64 to r64 */ +void PADDBMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0xFC), true, to, from, 0); +} + +/* paddw r64 to r64 */ +void PADDWRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xFD0F ); + ModRM( 3, to, from ); +} + +/* paddw m64 to r64 */ +void PADDWMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0xFD), true, to, from, 0); +} + +/* paddd r64 to r64 */ +void PADDDRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xFE0F ); + ModRM( 3, to, from ); +} + +/* paddd m64 to r64 */ +void PADDDMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0xFE), true, to, from, 0); +} + +/* emms */ +void EMMS( void ) +{ + write16( 0x770F ); +} + +void PADDSBRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xEC0F ); + ModRM( 3, to, from ); +} + +void PADDSWRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xED0F ); + ModRM( 3, to, from ); +} + +// paddq m64 to r64 (sse2 only?) +void PADDQMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0xD4), true, to, from, 0); +} + +// paddq r64 to r64 (sse2 only?) +void PADDQRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xD40F ); + ModRM( 3, to, from ); +} + +void PSUBSBRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xE80F ); + ModRM( 3, to, from ); +} + +void PSUBSWRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xE90F ); + ModRM( 3, to, from ); +} + + +void PSUBBRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xF80F ); + ModRM( 3, to, from ); +} + +void PSUBWRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xF90F ); + ModRM( 3, to, from ); +} + +void PSUBDRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xFA0F ); + ModRM( 3, to, from ); +} + +void PSUBDMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0xFA), true, to, from, 0); +} + +void PSUBUSBRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xD80F ); + ModRM( 3, to, from ); +} + +void PSUBUSWRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xD90F ); + ModRM( 3, to, from ); +} + +// psubq m64 to r64 (sse2 only?) +void PSUBQMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0xFB), true, to, from, 0); +} + +// psubq r64 to r64 (sse2 only?) +void PSUBQRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xFB0F ); + ModRM( 3, to, from ); +} + +// pmuludq m64 to r64 (sse2 only?) +void PMULUDQMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0xF4), true, to, from, 0); +} + +// pmuludq r64 to r64 (sse2 only?) +void PMULUDQRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xF40F ); + ModRM( 3, to, from ); +} + +void PCMPEQBRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0x740F ); + ModRM( 3, to, from ); +} + +void PCMPEQWRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0x750F ); + ModRM( 3, to, from ); +} + +void PCMPEQDRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0x760F ); + ModRM( 3, to, from ); +} + +void PCMPEQDMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x76), true, to, from, 0); +} + +void PCMPGTBRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0x640F ); + ModRM( 3, to, from ); +} + +void PCMPGTWRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0x650F ); + ModRM( 3, to, from ); +} + +void PCMPGTDRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0x660F ); + ModRM( 3, to, from ); +} + +void PCMPGTDMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x66), true, to, from, 0); +} + +void PSRLWItoR( x86MMXRegType to, u8 from ) +{ + RexB(0, to); + write16( 0x710F ); + ModRM( 3, 2 , to ); + write8( from ); +} + +void PSRLDItoR( x86MMXRegType to, u8 from ) +{ + RexB(0, to); + write16( 0x720F ); + ModRM( 3, 2 , to ); + write8( from ); +} + +void PSRLDRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xD20F ); + ModRM( 3, to, from ); +} + +void PSLLWItoR( x86MMXRegType to, u8 from ) +{ + RexB(0, to); + write16( 0x710F ); + ModRM( 3, 6 , to ); + write8( from ); +} + +void PSLLDItoR( x86MMXRegType to, u8 from ) +{ + RexB(0, to); + write16( 0x720F ); + ModRM( 3, 6 , to ); + write8( from ); +} + +void PSLLDRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xF20F ); + ModRM( 3, to, from ); +} + +void PSRAWItoR( x86MMXRegType to, u8 from ) +{ + RexB(0, to); + write16( 0x710F ); + ModRM( 3, 4 , to ); + write8( from ); +} + +void PSRADItoR( x86MMXRegType to, u8 from ) +{ + RexB(0, to); + write16( 0x720F ); + ModRM( 3, 4 , to ); + write8( from ); +} + +void PSRADRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0xE20F ); + ModRM( 3, to, from ); +} + +/* por m64 to r64 */ +void PORMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0xEB), true, to, from, 0); +} + +/* pxor m64 to r64 */ +void PXORMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0xEF), true, to, from, 0); +} + +/* pand m64 to r64 */ +void PANDMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0xDB), true, to, from, 0); +} + +void PANDNMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0xDF), true, to, from, 0); +} + +void PUNPCKHDQRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0x6A0F ); + ModRM( 3, to, from ); +} + +void PUNPCKHDQMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x6A), true, to, from, 0); +} + +void PUNPCKLDQRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0x620F ); + ModRM( 3, to, from ); +} + +void PUNPCKLDQMtoR( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x62), true, to, from, 0); +} + +void MOVQ64ItoR( x86MMXRegType reg, u64 i ) +{ + RexR(0, reg); + write16(0x6F0F); + ModRM(0, reg, DISP32); + write32(2); + JMP8( 8 ); + write64( i ); +} + +void MOVQRtoR( x86MMXRegType to, x86MMXRegType from ) +{ + RexRB(0, to, from); + write16( 0x6F0F ); + ModRM( 3, to, from ); +} + +void MOVQRmtoROffset( x86MMXRegType to, x86IntRegType from, u32 offset ) +{ + RexRB(0, to, from); + write16( 0x6F0F ); + + if( offset < 128 ) { + ModRM( 1, to, from ); + write8(offset); + } + else { + ModRM( 2, to, from ); + write32(offset); + } +} + +void MOVQRtoRmOffset( x86IntRegType to, x86MMXRegType from, u32 offset ) +{ + RexRB(0, from, to); + write16( 0x7F0F ); + + if( offset < 128 ) { + ModRM( 1, from , to ); + write8(offset); + } + else { + ModRM( 2, from, to ); + write32(offset); + } +} + +/* movd m32 to r64 */ +void MOVDMtoMMX( x86MMXRegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x6E), true, to, from, 0); +} + +/* movd r64 to m32 */ +void MOVDMMXtoM( uptr to, x86MMXRegType from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x7E), true, from, to, 0); +} + +void MOVD32RtoMMX( x86MMXRegType to, x86IntRegType from ) +{ + RexRB(0, to, from); + write16( 0x6E0F ); + ModRM( 3, to, from ); +} + +void MOVD32RmtoMMX( x86MMXRegType to, x86IntRegType from ) +{ + RexRB(0, to, from); + write16( 0x6E0F ); + ModRM( 0, to, from ); +} + +void MOVD32RmOffsettoMMX( x86MMXRegType to, x86IntRegType from, u32 offset ) +{ + RexRB(0, to, from); + write16( 0x6E0F ); + + if( offset < 128 ) { + ModRM( 1, to, from ); + write8(offset); + } + else { + ModRM( 2, to, from ); + write32(offset); + } +} + +void MOVD32MMXtoR( x86IntRegType to, x86MMXRegType from ) +{ + RexRB(0, from, to); + write16( 0x7E0F ); + ModRM( 3, from, to ); +} + +void MOVD32MMXtoRm( x86IntRegType to, x86MMXRegType from ) +{ + RexRB(0, from, to); + write16( 0x7E0F ); + ModRM( 0, from, to ); + if( to >= 4 ) { + // no idea why + assert( to == ESP ); + write8(0x24); + } + +} + +void MOVD32MMXtoRmOffset( x86IntRegType to, x86MMXRegType from, u32 offset ) +{ + RexRB(0, from, to); + write16( 0x7E0F ); + + if( offset < 128 ) { + ModRM( 1, from, to ); + write8(offset); + } + else { + ModRM( 2, from, to ); + write32(offset); + } +} + +///* movd r32 to r64 */ +//void MOVD32MMXtoMMX( x86MMXRegType to, x86MMXRegType from ) +//{ +// write16( 0x6E0F ); +// ModRM( 3, to, from ); +//} +// +///* movq r64 to r32 */ +//void MOVD64MMXtoMMX( x86MMXRegType to, x86MMXRegType from ) +//{ +// write16( 0x7E0F ); +// ModRM( 3, from, to ); +//} + +// untested +void PACKSSWBMMXtoMMX(x86MMXRegType to, x86MMXRegType from) +{ + RexRB(0, to, from); + write16( 0x630F ); + ModRM( 3, to, from ); +} + +void PACKSSDWMMXtoMMX(x86MMXRegType to, x86MMXRegType from) +{ + RexRB(0, to, from); + write16( 0x6B0F ); + ModRM( 3, to, from ); +} + +void PMOVMSKBMMXtoR(x86IntRegType to, x86MMXRegType from) +{ + RexRB(0, to, from); + write16( 0xD70F ); + ModRM( 3, to, from ); +} + +void PINSRWRtoMMX( x86MMXRegType to, x86SSERegType from, u8 imm8 ) +{ + RexRB(0, to, from); + write16( 0xc40f ); + ModRM( 3, to, from ); + write8( imm8 ); +} + +void PSHUFWRtoR(x86MMXRegType to, x86MMXRegType from, u8 imm8) +{ + RexRB(0, to, from); + write16(0x700f); + ModRM( 3, to, from ); + write8(imm8); +} + +void PSHUFWMtoR(x86MMXRegType to, uptr from, u8 imm8) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x70), true, to, from, 1 /* XXX was 0? */); + write8(imm8); +} + +void MASKMOVQRtoR(x86MMXRegType to, x86MMXRegType from) +{ + RexRB(0, to, from); + write16(0xf70f); + ModRM( 3, to, from ); +} + +#endif diff --git a/libpcsxcore/ix86_64/ix86_sse.c b/libpcsxcore/ix86_64/ix86_sse.c new file mode 100644 index 0000000..cb391dc --- /dev/null +++ b/libpcsxcore/ix86_64/ix86_sse.c @@ -0,0 +1,1455 @@ +// stop compiling if NORECBUILD build (only for Visual Studio) +#if !(defined(_MSC_VER) && defined(PCSX2_NORECBUILD)) + +#include +#include "ix86-64.h" + +PCSX2_ALIGNED16(static unsigned int p[4]); +PCSX2_ALIGNED16(static unsigned int p2[4]); +PCSX2_ALIGNED16(static float f[4]); + + +XMMSSEType g_xmmtypes[XMMREGS] = {0}; + +/********************/ +/* SSE instructions */ +/********************/ + +#define SSEMtoRv( nc, code, overb ) \ + assert( cpucaps.hasStreamingSIMDExtensions ); \ + assert( to < XMMREGS ) ; \ + MEMADDR_OP(0, nc, code, true, to, from, overb) + +#define SSEMtoR( code, overb ) SSEMtoRv(2, code, overb) + +#define SSERtoMv( nc, code, overb ) \ + assert( cpucaps.hasStreamingSIMDExtensions ); \ + assert( from < XMMREGS) ; \ + MEMADDR_OP(0, nc, code, true, from, to, overb) + +#define SSERtoM( code, overb ) SSERtoMv( 2, code, overb ) \ + +#define SSE_SS_MtoR( code, overb ) \ + SSEMtoRv(3, (code << 8) | 0xF3, overb) + +#define SSE_SS_RtoM( code, overb ) \ + SSERtoMv(3, (code << 8) | 0xF3, overb) + +#define SSERtoR( code ) \ + assert( cpucaps.hasStreamingSIMDExtensions ); \ + assert( to < XMMREGS && from < XMMREGS) ; \ + RexRB(0, to, from); \ + write16( code ); \ + ModRM( 3, to, from ); + +#define SSEMtoR66( code ) \ + SSEMtoRv( 3, (code << 8) | 0x66, 0 ) + +#define SSERtoM66( code ) \ + SSERtoMv( 3, (code << 8) | 0x66, 0 ) + +#define SSERtoR66( code ) \ + write8( 0x66 ); \ + SSERtoR( code ); + +#define _SSERtoR66( code ) \ + assert( cpucaps.hasStreamingSIMDExtensions ); \ + assert( to < XMMREGS && from < XMMREGS) ; \ + write8( 0x66 ); \ + RexRB(0, from, to); \ + write16( code ); \ + ModRM( 3, from, to ); + +#define SSE_SS_RtoR( code ) \ + assert( cpucaps.hasStreamingSIMDExtensions ); \ + assert( to < XMMREGS && from < XMMREGS) ; \ + write8( 0xf3 ); \ + RexRB(0, to, from); \ + write16( code ); \ + ModRM( 3, to, from ); + +#define CMPPSMtoR( op ) \ + SSEMtoR( 0xc20f, 1 ); \ + write8( op ); + +#define CMPPSRtoR( op ) \ + SSERtoR( 0xc20f ); \ + write8( op ); + +#define CMPSSMtoR( op ) \ + SSE_SS_MtoR( 0xc20f, 1 ); \ + write8( op ); + +#define CMPSSRtoR( op ) \ + SSE_SS_RtoR( 0xc20f ); \ + write8( op ); + + + +void WriteRmOffset(x86IntRegType to, int offset); +void WriteRmOffsetFrom(x86IntRegType to, x86IntRegType from, int offset); + +/* movups [r32][r32*scale] to xmm1 */ +void SSE_MOVUPSRmStoR( x86SSERegType to, x86IntRegType from, x86IntRegType from2, int scale ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + RexRXB(0, to, from2, from); + write16( 0x100f ); + ModRM( 0, to, 0x4 ); + SibSB( scale, from2, from ); +} + +/* movups xmm1 to [r32][r32*scale] */ +void SSE_MOVUPSRtoRmS( x86SSERegType to, x86IntRegType from, x86IntRegType from2, int scale ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + RexRXB(1, to, from2, from); + write16( 0x110f ); + ModRM( 0, to, 0x4 ); + SibSB( scale, from2, from ); +} + +/* movups [r32] to r32 */ +void SSE_MOVUPSRmtoR( x86IntRegType to, x86IntRegType from ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + RexRB(0, to, from); + write16( 0x100f ); + ModRM( 0, to, from ); +} + +/* movups r32 to [r32] */ +void SSE_MOVUPSRtoRm( x86IntRegType to, x86IntRegType from ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + RexRB(0, from, to); + write16( 0x110f ); + ModRM( 0, from, to ); +} + +/* movlps [r32] to r32 */ +void SSE_MOVLPSRmtoR( x86SSERegType to, x86IntRegType from ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + RexRB(1, to, from); + write16( 0x120f ); + ModRM( 0, to, from ); +} + +void SSE_MOVLPSRmtoROffset( x86SSERegType to, x86IntRegType from, int offset ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + RexRB(0, to, from); + write16( 0x120f ); + WriteRmOffsetFrom(to, from, offset); +} + +/* movaps r32 to [r32] */ +void SSE_MOVLPSRtoRm( x86IntRegType to, x86IntRegType from ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + RexRB(0, from, to); + write16( 0x130f ); + ModRM( 0, from, to ); +} + +void SSE_MOVLPSRtoRmOffset( x86SSERegType to, x86IntRegType from, int offset ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + RexRB(0, from, to); + write16( 0x130f ); + WriteRmOffsetFrom(from, to, offset); +} + +/* movaps [r32][r32*scale] to xmm1 */ +void SSE_MOVAPSRmStoR( x86SSERegType to, x86IntRegType from, x86IntRegType from2, int scale ) +{ + assert( cpucaps.hasStreamingSIMDExtensions && from != EBP ); + RexRXB(0, to, from2, from); + write16( 0x280f ); + ModRM( 0, to, 0x4 ); + SibSB( scale, from2, from ); +} + +/* movaps xmm1 to [r32][r32*scale] */ +void SSE_MOVAPSRtoRmS( x86SSERegType to, x86IntRegType from, x86IntRegType from2, int scale ) +{ + assert( cpucaps.hasStreamingSIMDExtensions && from != EBP ); + RexRXB(0, to, from2, from); + write16( 0x290f ); + ModRM( 0, to, 0x4 ); + SibSB( scale, from2, from ); +} + +// movaps [r32+offset] to r32 +void SSE_MOVAPSRmtoROffset( x86SSERegType to, x86IntRegType from, int offset ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + RexRB(0, to, from); + write16( 0x280f ); + WriteRmOffsetFrom(to, from, offset); +} + +// movaps r32 to [r32+offset] +void SSE_MOVAPSRtoRmOffset( x86IntRegType to, x86SSERegType from, int offset ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + RexRB(0, from, to); + write16( 0x290f ); + WriteRmOffsetFrom(from, to, offset); +} + +// movdqa [r32+offset] to r32 +void SSE2_MOVDQARmtoROffset( x86SSERegType to, x86IntRegType from, int offset ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + write8(0x66); + RexRB(0, to, from); + write16( 0x6f0f ); + WriteRmOffsetFrom(to, from, offset); +} + +// movdqa r32 to [r32+offset] +void SSE2_MOVDQARtoRmOffset( x86IntRegType to, x86SSERegType from, int offset ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + write8(0x66); + RexRB(0, from, to); + write16( 0x7f0f ); + WriteRmOffsetFrom(from, to, offset); +} + +// movups [r32+offset] to r32 +void SSE_MOVUPSRmtoROffset( x86SSERegType to, x86IntRegType from, int offset ) +{ + RexRB(0, to, from); + write16( 0x100f ); + WriteRmOffsetFrom(to, from, offset); +} + +// movups r32 to [r32+offset] +void SSE_MOVUPSRtoRmOffset( x86SSERegType to, x86IntRegType from, int offset ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + RexRB(0, from, to); + write16( 0x110f ); + WriteRmOffsetFrom(from, to, offset); +} + +//**********************************************************************************/ +//MOVAPS: Move aligned Packed Single Precision FP values * +//********************************************************************************** +void SSE_MOVAPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x280f, 0 ); } +void SSE_MOVAPS_XMM_to_M128( uptr to, x86SSERegType from ) { SSERtoM( 0x290f, 0 ); } +void SSE_MOVAPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x280f ); } + +void SSE_MOVUPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x100f, 0 ); } +void SSE_MOVUPS_XMM_to_M128( uptr to, x86SSERegType from ) { SSERtoM( 0x110f, 0 ); } + +void SSE2_MOVSD_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) +{ + if( !cpucaps.hasStreamingSIMD2Extensions ) SSE2EMU_MOVSD_XMM_to_XMM(to, from); + else { + write8(0xf2); + SSERtoR( 0x100f); + } +} + +void SSE2_MOVQ_M64_to_XMM( x86SSERegType to, uptr from ) +{ + if( !cpucaps.hasStreamingSIMD2Extensions ) SSE2EMU_MOVQ_M64_to_XMM(to, from); + else { + SSE_SS_MtoR( 0x7e0f, 0); + } +} + +void SSE2_MOVQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) +{ + if( !cpucaps.hasStreamingSIMD2Extensions ) SSE2EMU_MOVQ_XMM_to_XMM(to, from); + else { + SSE_SS_RtoR( 0x7e0f); + } +} + +void SSE2_MOVQ_XMM_to_M64( u32 to, x86SSERegType from ) +{ + if( !cpucaps.hasStreamingSIMD2Extensions ) SSE_MOVLPS_XMM_to_M64(to, from); + else { + SSERtoM66(0xd60f); + } +} + +#ifndef __x86_64__ +void SSE2_MOVDQ2Q_XMM_to_MM( x86MMXRegType to, x86SSERegType from) +{ + if( !cpucaps.hasStreamingSIMD2Extensions ) SSE2EMU_MOVDQ2Q_XMM_to_MM(to, from); + else { + write8(0xf2); + SSERtoR( 0xd60f); + } +} +void SSE2_MOVQ2DQ_MM_to_XMM( x86SSERegType to, x86MMXRegType from) +{ + if( !cpucaps.hasStreamingSIMD2Extensions ) SSE2EMU_MOVQ2DQ_MM_to_XMM(to, from); + else { + SSE_SS_RtoR( 0xd60f); + } +} +#endif + +//**********************************************************************************/ +//MOVSS: Move Scalar Single-Precision FP value * +//********************************************************************************** +void SSE_MOVSS_M32_to_XMM( x86SSERegType to, uptr from ) { SSE_SS_MtoR( 0x100f, 0 ); } +void SSE_MOVSS_XMM_to_M32( u32 to, x86SSERegType from ) { SSE_SS_RtoM( 0x110f, 0 ); } +void SSE_MOVSS_XMM_to_Rm( x86IntRegType to, x86SSERegType from ) +{ + write8(0xf3); + RexRB(0, from, to); + write16(0x110f); + ModRM(0, from, to); +} + +void SSE_MOVSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSE_SS_RtoR( 0x100f ); } + +void SSE_MOVSS_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset ) +{ + write8(0xf3); + RexRB(0, to, from); + write16( 0x100f ); + WriteRmOffsetFrom(to, from, offset); +} + +void SSE_MOVSS_XMM_to_RmOffset( x86IntRegType to, x86SSERegType from, int offset ) +{ + write8(0xf3); + RexRB(0, from, to); + write16(0x110f); + WriteRmOffsetFrom(from, to, offset); +} + +void SSE_MASKMOVDQU_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR66( 0xf70f ); } +//**********************************************************************************/ +//MOVLPS: Move low Packed Single-Precision FP * +//********************************************************************************** +void SSE_MOVLPS_M64_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x120f, 0 ); } +void SSE_MOVLPS_XMM_to_M64( u32 to, x86SSERegType from ) { SSERtoM( 0x130f, 0 ); } + +void SSE_MOVLPS_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + RexRB(0, to, from); + write16( 0x120f ); + WriteRmOffsetFrom(to, from, offset); +} + +void SSE_MOVLPS_XMM_to_RmOffset( x86IntRegType to, x86SSERegType from, int offset ) +{ + RexRB(0, from, to); + write16(0x130f); + WriteRmOffsetFrom(from, to, offset); +} + +///////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//MOVHPS: Move High Packed Single-Precision FP * +//********************************************************************************** +void SSE_MOVHPS_M64_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x160f, 0 ); } +void SSE_MOVHPS_XMM_to_M64( u32 to, x86SSERegType from ) { SSERtoM( 0x170f, 0 ); } + +void SSE_MOVHPS_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + RexRB(0, to, from); + write16( 0x160f ); + WriteRmOffsetFrom(to, from, offset); +} + +void SSE_MOVHPS_XMM_to_RmOffset( x86IntRegType to, x86SSERegType from, int offset ) +{ + assert( cpucaps.hasStreamingSIMDExtensions ); + RexRB(0, from, to); + write16(0x170f); + WriteRmOffsetFrom(from, to, offset); +} + +///////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//MOVLHPS: Moved packed Single-Precision FP low to high * +//********************************************************************************** +void SSE_MOVLHPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x160f ); } + +////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//MOVHLPS: Moved packed Single-Precision FP High to Low * +//********************************************************************************** +void SSE_MOVHLPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x120f ); } + +/////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//ANDPS: Logical Bit-wise AND for Single FP * +//********************************************************************************** +void SSE_ANDPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x540f, 0 ); } +void SSE_ANDPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x540f ); } + +/////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//ANDNPS : Logical Bit-wise AND NOT of Single-precision FP values * +//********************************************************************************** +void SSE_ANDNPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x550f, 0 ); } +void SSE_ANDNPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ){ SSERtoR( 0x550f ); } + +///////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//RCPPS : Packed Single-Precision FP Reciprocal * +//********************************************************************************** +void SSE_RCPPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x530f ); } +void SSE_RCPPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x530f, 0 ); } + +void SSE_RCPSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSE_SS_RtoR(0x530f); } +void SSE_RCPSS_M32_to_XMM( x86SSERegType to, uptr from ) { SSE_SS_MtoR(0x530f, 0); } + +////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//ORPS : Bit-wise Logical OR of Single-Precision FP Data * +//********************************************************************************** +void SSE_ORPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x560f, 0 ); } +void SSE_ORPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x560f ); } + +///////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//XORPS : Bitwise Logical XOR of Single-Precision FP Values * +//********************************************************************************** +void SSE_XORPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x570f, 0 ); } +void SSE_XORPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x570f ); } + +/////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//ADDPS : ADD Packed Single-Precision FP Values * +//********************************************************************************** +void SSE_ADDPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x580f, 0 ); } +void SSE_ADDPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x580f ); } + +//////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//ADDSS : ADD Scalar Single-Precision FP Values * +//********************************************************************************** +void SSE_ADDSS_M32_to_XMM( x86SSERegType to, uptr from ) { SSE_SS_MtoR( 0x580f, 0 ); } +void SSE_ADDSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSE_SS_RtoR( 0x580f ); } + +///////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//SUBPS: Packed Single-Precision FP Subtract * +//********************************************************************************** +void SSE_SUBPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x5c0f, 0 ); } +void SSE_SUBPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x5c0f ); } + +/////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//SUBSS : Scalar Single-Precision FP Subtract * +//********************************************************************************** +void SSE_SUBSS_M32_to_XMM( x86SSERegType to, uptr from ) { SSE_SS_MtoR( 0x5c0f, 0 ); } +void SSE_SUBSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSE_SS_RtoR( 0x5c0f ); } + +///////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//MULPS : Packed Single-Precision FP Multiply * +//********************************************************************************** +void SSE_MULPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x590f, 0 ); } +void SSE_MULPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x590f ); } + +//////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//MULSS : Scalar Single-Precision FP Multiply * +//********************************************************************************** +void SSE_MULSS_M32_to_XMM( x86SSERegType to, uptr from ) { SSE_SS_MtoR( 0x590f, 0 ); } +void SSE_MULSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSE_SS_RtoR( 0x590f ); } + +//////////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//Packed Single-Precission FP compare (CMPccPS) * +//********************************************************************************** +//missing SSE_CMPPS_I8_to_XMM +// SSE_CMPPS_M32_to_XMM +// SSE_CMPPS_XMM_to_XMM +void SSE_CMPEQPS_M128_to_XMM( x86SSERegType to, uptr from ) { CMPPSMtoR( 0 ); } +void SSE_CMPEQPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPPSRtoR( 0 ); } +void SSE_CMPLTPS_M128_to_XMM( x86SSERegType to, uptr from ) { CMPPSMtoR( 1 ); } +void SSE_CMPLTPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPPSRtoR( 1 ); } +void SSE_CMPLEPS_M128_to_XMM( x86SSERegType to, uptr from ) { CMPPSMtoR( 2 ); } +void SSE_CMPLEPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPPSRtoR( 2 ); } +void SSE_CMPUNORDPS_M128_to_XMM( x86SSERegType to, uptr from ) { CMPPSMtoR( 3 ); } +void SSE_CMPUNORDPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPPSRtoR( 3 ); } +void SSE_CMPNEPS_M128_to_XMM( x86SSERegType to, uptr from ) { CMPPSMtoR( 4 ); } +void SSE_CMPNEPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPPSRtoR( 4 ); } +void SSE_CMPNLTPS_M128_to_XMM( x86SSERegType to, uptr from ) { CMPPSMtoR( 5 ); } +void SSE_CMPNLTPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPPSRtoR( 5 ); } +void SSE_CMPNLEPS_M128_to_XMM( x86SSERegType to, uptr from ) { CMPPSMtoR( 6 ); } +void SSE_CMPNLEPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPPSRtoR( 6 ); } +void SSE_CMPORDPS_M128_to_XMM( x86SSERegType to, uptr from ) { CMPPSMtoR( 7 ); } +void SSE_CMPORDPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPPSRtoR( 7 ); } + +/////////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//Scalar Single-Precission FP compare (CMPccSS) * +//********************************************************************************** +//missing SSE_CMPSS_I8_to_XMM +// SSE_CMPSS_M32_to_XMM +// SSE_CMPSS_XMM_to_XMM +void SSE_CMPEQSS_M32_to_XMM( x86SSERegType to, uptr from ) { CMPSSMtoR( 0 ); } +void SSE_CMPEQSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPSSRtoR( 0 ); } +void SSE_CMPLTSS_M32_to_XMM( x86SSERegType to, uptr from ) { CMPSSMtoR( 1 ); } +void SSE_CMPLTSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPSSRtoR( 1 ); } +void SSE_CMPLESS_M32_to_XMM( x86SSERegType to, uptr from ) { CMPSSMtoR( 2 ); } +void SSE_CMPLESS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPSSRtoR( 2 ); } +void SSE_CMPUNORDSS_M32_to_XMM( x86SSERegType to, uptr from ) { CMPSSMtoR( 3 ); } +void SSE_CMPUNORDSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPSSRtoR( 3 ); } +void SSE_CMPNESS_M32_to_XMM( x86SSERegType to, uptr from ) { CMPSSMtoR( 4 ); } +void SSE_CMPNESS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPSSRtoR( 4 ); } +void SSE_CMPNLTSS_M32_to_XMM( x86SSERegType to, uptr from ) { CMPSSMtoR( 5 ); } +void SSE_CMPNLTSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPSSRtoR( 5 ); } +void SSE_CMPNLESS_M32_to_XMM( x86SSERegType to, uptr from ) { CMPSSMtoR( 6 ); } +void SSE_CMPNLESS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPSSRtoR( 6 ); } +void SSE_CMPORDSS_M32_to_XMM( x86SSERegType to, uptr from ) { CMPSSMtoR( 7 ); } +void SSE_CMPORDSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { CMPSSRtoR( 7 ); } + +void SSE_UCOMISS_M32_to_XMM( x86SSERegType to, uptr from ) +{ + MEMADDR_OP(0, VAROP2(0x0F, 0x2E), true, to, from, 0); +} + +void SSE_UCOMISS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) +{ + RexRB(0, to, from); + write16( 0x2e0f ); + ModRM( 3, to, from ); +} + +////////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//RSQRTPS : Packed Single-Precision FP Square Root Reciprocal * +//********************************************************************************** +void SSE_RSQRTPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x520f, 0 ); } +void SSE_RSQRTPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ){ SSERtoR( 0x520f ); } + +///////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//RSQRTSS : Scalar Single-Precision FP Square Root Reciprocal * +//********************************************************************************** +void SSE_RSQRTSS_M32_to_XMM( x86SSERegType to, uptr from ) { SSE_SS_MtoR( 0x520f, 0 ); } +void SSE_RSQRTSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ){ SSE_SS_RtoR( 0x520f ); } + +//////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//SQRTPS : Packed Single-Precision FP Square Root * +//********************************************************************************** +void SSE_SQRTPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x510f, 0 ); } +void SSE_SQRTPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ){ SSERtoR( 0x510f ); } + +////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//SQRTSS : Scalar Single-Precision FP Square Root * +//********************************************************************************** +void SSE_SQRTSS_M32_to_XMM( x86SSERegType to, uptr from ) { SSE_SS_MtoR( 0x510f, 0 ); } +void SSE_SQRTSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ){ SSE_SS_RtoR( 0x510f ); } + +//////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//MAXPS: Return Packed Single-Precision FP Maximum * +//********************************************************************************** +void SSE_MAXPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x5f0f, 0 ); } +void SSE_MAXPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x5f0f ); } + +///////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//MAXSS: Return Scalar Single-Precision FP Maximum * +//********************************************************************************** +void SSE_MAXSS_M32_to_XMM( x86SSERegType to, uptr from ) { SSE_SS_MtoR( 0x5f0f, 0 ); } +void SSE_MAXSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSE_SS_RtoR( 0x5f0f ); } + +#ifndef __x86_64__ +///////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//CVTPI2PS: Packed Signed INT32 to Packed Single FP Conversion * +//********************************************************************************** +void SSE_CVTPI2PS_M64_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x2a0f, 0 ); } +void SSE_CVTPI2PS_MM_to_XMM( x86SSERegType to, x86MMXRegType from ) { SSERtoR( 0x2a0f ); } + +/////////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//CVTPS2PI: Packed Single FP to Packed Signed INT32 Conversion * +//********************************************************************************** +void SSE_CVTPS2PI_M64_to_MM( x86MMXRegType to, uptr from ) { SSEMtoR( 0x2d0f, 0 ); } +void SSE_CVTPS2PI_XMM_to_MM( x86MMXRegType to, x86SSERegType from ) { SSERtoR( 0x2d0f ); } +#endif + +void SSE_CVTTSS2SI_M32_to_R32(x86IntRegType to, uptr from) { SSE_SS_MtoR(0x2c0f, 0); } +void SSE_CVTTSS2SI_XMM_to_R32(x86IntRegType to, x86SSERegType from) +{ + write8(0xf3); + RexRB(0, to, from); + write16(0x2c0f); + ModRM(3, to, from); +} + +void SSE_CVTSI2SS_M32_to_XMM(x86SSERegType to, uptr from) { SSE_SS_MtoR(0x2a0f, 0); } +void SSE_CVTSI2SS_R_to_XMM(x86SSERegType to, x86IntRegType from) +{ + write8(0xf3); + RexRB(0, to, from); + write16(0x2a0f); + ModRM(3, to, from); +} + +/////////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//CVTDQ2PS: Packed Signed INT32 to Packed Single Precision FP Conversion * +//********************************************************************************** +void SSE2_CVTDQ2PS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x5b0f, 0 ); } +void SSE2_CVTDQ2PS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x5b0f ); } + +//**********************************************************************************/ +//CVTPS2DQ: Packed Single Precision FP to Packed Signed INT32 Conversion * +//********************************************************************************** +void SSE2_CVTPS2DQ_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR66( 0x5b0f ); } +void SSE2_CVTPS2DQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR66( 0x5b0f ); } + +void SSE2_CVTTPS2DQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSE_SS_RtoR(0x5b0f); } +///////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//MINPS: Return Packed Single-Precision FP Minimum * +//********************************************************************************** +void SSE_MINPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x5d0f, 0 ); } +void SSE_MINPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x5d0f ); } + +////////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//MINSS: Return Scalar Single-Precision FP Minimum * +//********************************************************************************** +void SSE_MINSS_M32_to_XMM( x86SSERegType to, uptr from ) { SSE_SS_MtoR( 0x5d0f, 0 ); } +void SSE_MINSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSE_SS_RtoR( 0x5d0f ); } + +#ifndef __x86_64__ +/////////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//PMAXSW: Packed Signed Integer Word Maximum * +//********************************************************************************** +//missing + // SSE_PMAXSW_M64_to_MM +// SSE2_PMAXSW_M128_to_XMM +// SSE2_PMAXSW_XMM_to_XMM +void SSE_PMAXSW_MM_to_MM( x86MMXRegType to, x86MMXRegType from ){ SSERtoR( 0xEE0F ); } + +/////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//PMINSW: Packed Signed Integer Word Minimum * +//********************************************************************************** +//missing + // SSE_PMINSW_M64_to_MM +// SSE2_PMINSW_M128_to_XMM +// SSE2_PMINSW_XMM_to_XMM +void SSE_PMINSW_MM_to_MM( x86MMXRegType to, x86MMXRegType from ){ SSERtoR( 0xEA0F ); } +#endif + +////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//SHUFPS: Shuffle Packed Single-Precision FP Values * +//********************************************************************************** +void SSE_SHUFPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 ) { SSERtoR( 0xC60F ); write8( imm8 ); } +void SSE_SHUFPS_M128_to_XMM( x86SSERegType to, uptr from, u8 imm8 ) { SSEMtoR( 0xC60F, 1 ); write8( imm8 ); } + +void SSE_SHUFPS_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset, u8 imm8 ) +{ + RexRB(0, to, from); + write16(0xc60f); + WriteRmOffsetFrom(to, from, offset); + write8(imm8); +} + +//////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//PSHUFD: Shuffle Packed DoubleWords * +//********************************************************************************** +void SSE2_PSHUFD_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 ) +{ + if( !cpucaps.hasStreamingSIMD2Extensions ) { + SSE2EMU_PSHUFD_XMM_to_XMM(to, from, imm8); + } + else { + SSERtoR66( 0x700F ); + write8( imm8 ); + } +} +void SSE2_PSHUFD_M128_to_XMM( x86SSERegType to, uptr from, u8 imm8 ) { SSEMtoRv( 3, 0x700F66, 1 ); write8( imm8 ); } + +void SSE2_PSHUFLW_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 ) { write8(0xF2); SSERtoR(0x700F); write8(imm8); } +void SSE2_PSHUFLW_M128_to_XMM( x86SSERegType to, uptr from, u8 imm8 ) { SSEMtoRv(3, 0x700FF2, 1); write8(imm8); } +void SSE2_PSHUFHW_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 ) { SSE_SS_RtoR(0x700F); write8(imm8); } +void SSE2_PSHUFHW_M128_to_XMM( x86SSERegType to, uptr from, u8 imm8 ) { SSE_SS_MtoR(0x700F, 1); write8(imm8); } + +/////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//UNPCKLPS: Unpack and Interleave low Packed Single-Precision FP Data * +//********************************************************************************** +void SSE_UNPCKLPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR(0x140f, 0); } +void SSE_UNPCKLPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x140F ); } + +//////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//UNPCKHPS: Unpack and Interleave High Packed Single-Precision FP Data * +//********************************************************************************** +void SSE_UNPCKHPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR(0x150f, 0); } +void SSE_UNPCKHPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x150F ); } + +//////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//DIVPS : Packed Single-Precision FP Divide * +//********************************************************************************** +void SSE_DIVPS_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR( 0x5e0F, 0 ); } +void SSE_DIVPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR( 0x5e0F ); } + +////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//DIVSS : Scalar Single-Precision FP Divide * +//********************************************************************************** +void SSE_DIVSS_M32_to_XMM( x86SSERegType to, uptr from ) { SSE_SS_MtoR( 0x5e0F, 0 ); } +void SSE_DIVSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSE_SS_RtoR( 0x5e0F ); } + +///////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//STMXCSR : Store Streaming SIMD Extension Control/Status * +//********************************************************************************** +void SSE_STMXCSR( uptr from ) { + MEMADDR_OP(0, VAROP2(0x0F, 0xAE), false, 3, from, 0); +} + +///////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//LDMXCSR : Load Streaming SIMD Extension Control/Status * +//********************************************************************************** +void SSE_LDMXCSR( uptr from ) { + MEMADDR_OP(0, VAROP2(0x0F, 0xAE), false, 2, from, 0); +} + +///////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//PADDB,PADDW,PADDD : Add Packed Integers * +//********************************************************************************** +void SSE2_PADDB_XMM_to_XMM(x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xFC0F ); } +void SSE2_PADDB_M128_to_XMM(x86SSERegType to, uptr from ){ SSEMtoR66( 0xFC0F ); } +void SSE2_PADDW_XMM_to_XMM(x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xFD0F ); } +void SSE2_PADDW_M128_to_XMM(x86SSERegType to, uptr from ){ SSEMtoR66( 0xFD0F ); } +void SSE2_PADDD_XMM_to_XMM(x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xFE0F ); } +void SSE2_PADDD_M128_to_XMM(x86SSERegType to, uptr from ){ SSEMtoR66( 0xFE0F ); } + +void SSE2_PADDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from ) { SSERtoR66( 0xD40F ); } +void SSE2_PADDQ_M128_to_XMM(x86SSERegType to, uptr from ) { SSEMtoR66( 0xD40F ); } + +/////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//PCMPxx: Compare Packed Integers * +//********************************************************************************** +void SSE2_PCMPGTB_XMM_to_XMM(x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0x640F ); } +void SSE2_PCMPGTB_M128_to_XMM(x86SSERegType to, uptr from ){ SSEMtoR66( 0x640F ); } +void SSE2_PCMPGTW_XMM_to_XMM(x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0x650F ); } +void SSE2_PCMPGTW_M128_to_XMM(x86SSERegType to, uptr from ){ SSEMtoR66( 0x650F ); } +void SSE2_PCMPGTD_XMM_to_XMM(x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0x660F ); } +void SSE2_PCMPGTD_M128_to_XMM(x86SSERegType to, uptr from ){ SSEMtoR66( 0x660F ); } +void SSE2_PCMPEQB_XMM_to_XMM(x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0x740F ); } +void SSE2_PCMPEQB_M128_to_XMM(x86SSERegType to, uptr from ){ SSEMtoR66( 0x740F ); } +void SSE2_PCMPEQW_XMM_to_XMM(x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0x750F ); } +void SSE2_PCMPEQW_M128_to_XMM(x86SSERegType to, uptr from ){ SSEMtoR66( 0x750F ); } +void SSE2_PCMPEQD_XMM_to_XMM(x86SSERegType to, x86SSERegType from ) +{ + if( !cpucaps.hasStreamingSIMD2Extensions ) { + SSE_CMPEQPS_XMM_to_XMM(to, from); + } + else { + SSERtoR66( 0x760F ); + } +} + +void SSE2_PCMPEQD_M128_to_XMM(x86SSERegType to, uptr from ) +{ + if( !cpucaps.hasStreamingSIMD2Extensions ) { + SSE_CMPEQPS_M128_to_XMM(to, from); + } + else { + SSEMtoR66( 0x760F ); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//PEXTRW,PINSRW: Packed Extract/Insert Word * +//********************************************************************************** +void SSE_PEXTRW_XMM_to_R32(x86IntRegType to, x86SSERegType from, u8 imm8 ){ SSERtoR66(0xC50F); write8( imm8 ); } +void SSE_PINSRW_R32_to_XMM(x86SSERegType to, x86IntRegType from, u8 imm8 ){ SSERtoR66(0xC40F); write8( imm8 ); } + +//////////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//PSUBx: Subtract Packed Integers * +//********************************************************************************** +void SSE2_PSUBB_XMM_to_XMM(x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xF80F ); } +void SSE2_PSUBB_M128_to_XMM(x86SSERegType to, uptr from ){ SSEMtoR66( 0xF80F ); } +void SSE2_PSUBW_XMM_to_XMM(x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xF90F ); } +void SSE2_PSUBW_M128_to_XMM(x86SSERegType to, uptr from ){ SSEMtoR66( 0xF90F ); } +void SSE2_PSUBD_XMM_to_XMM(x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xFA0F ); } +void SSE2_PSUBD_M128_to_XMM(x86SSERegType to, uptr from ){ SSEMtoR66( 0xFA0F ); } +void SSE2_PSUBQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xFB0F ); } +void SSE2_PSUBQ_M128_to_XMM(x86SSERegType to, uptr from ){ SSEMtoR66( 0xFB0F ); } + +/////////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//MOVD: Move Dword(32bit) to /from XMM reg * +//********************************************************************************** +void SSE2_MOVD_M32_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR66(0x6E0F); } +void SSE2_MOVD_R_to_XMM( x86SSERegType to, x86IntRegType from ) +{ + if( !cpucaps.hasStreamingSIMD2Extensions ) { + SSE2EMU_MOVD_R_to_XMM(to, from); + } + else { + SSERtoR66(0x6E0F); + } +} + +void SSE2_MOVD_Rm_to_XMM( x86SSERegType to, x86IntRegType from ) +{ + write8(0x66); + RexRB(0, to, from); + write16( 0x6e0f ); + ModRM( 0, to, from); +} + +void SSE2_MOVD_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset ) +{ + write8(0x66); + RexRB(0, to, from); + write16( 0x6e0f ); + WriteRmOffsetFrom(to, from, offset); +} + +void SSE2_MOVD_XMM_to_M32( u32 to, x86SSERegType from ) { SSERtoM66(0x7E0F); } +void SSE2_MOVD_XMM_to_R( x86IntRegType to, x86SSERegType from ) { + if( !cpucaps.hasStreamingSIMD2Extensions ) { + SSE2EMU_MOVD_XMM_to_R(to, from); + } + else { + _SSERtoR66(0x7E0F); + } +} + +void SSE2_MOVD_XMM_to_Rm( x86IntRegType to, x86SSERegType from ) +{ + write8(0x66); + RexRB(0, from, to); + write16( 0x7e0f ); + ModRM( 0, from, to ); +} + +void SSE2_MOVD_XMM_to_RmOffset( x86IntRegType to, x86SSERegType from, int offset ) +{ + if( !cpucaps.hasStreamingSIMD2Extensions ) { + SSE2EMU_MOVD_XMM_to_RmOffset(to, from, offset); + } + else { + write8(0x66); + RexRB(0, from, to); + write16( 0x7e0f ); + WriteRmOffsetFrom(from, to, offset); + } +} + +#ifdef __x86_64__ +void SSE2_MOVQ_XMM_to_R( x86IntRegType to, x86SSERegType from ) +{ + assert( from < XMMREGS); + write8( 0x66 ); + RexRB(1, from, to); + write16( 0x7e0f ); + ModRM( 3, from, to ); +} + +void SSE2_MOVQ_R_to_XMM( x86SSERegType to, x86IntRegType from ) +{ + assert( to < XMMREGS); + write8(0x66); + RexRB(1, to, from); + write16( 0x6e0f ); + ModRM( 3, to, from ); +} + +#endif + +//////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//POR : SSE Bitwise OR * +//********************************************************************************** +void SSE2_POR_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR66( 0xEB0F ); } +void SSE2_POR_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR66( 0xEB0F ); } + +// logical and to &= from +void SSE2_PAND_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR66( 0xDB0F ); } +void SSE2_PAND_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR66( 0xDB0F ); } + +// to = (~to) & from +void SSE2_PANDN_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR66( 0xDF0F ); } +void SSE2_PANDN_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR66( 0xDF0F ); } + +///////////////////////////////////////////////////////////////////////////////////// +//**********************************************************************************/ +//PXOR : SSE Bitwise XOR * +//********************************************************************************** +void SSE2_PXOR_XMM_to_XMM( x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xEF0F ); } +void SSE2_PXOR_M128_to_XMM( x86SSERegType to, uptr from ){ SSEMtoR66( 0xEF0F ); } +/////////////////////////////////////////////////////////////////////////////////////// + +void SSE2_MOVDQA_M128_to_XMM(x86SSERegType to, uptr from) {SSEMtoR66(0x6F0F); } +void SSE2_MOVDQA_XMM_to_M128( uptr to, x86SSERegType from ){SSERtoM66(0x7F0F);} +void SSE2_MOVDQA_XMM_to_XMM( x86SSERegType to, x86SSERegType from) { SSERtoR66(0x6F0F); } + +void SSE2_MOVDQU_M128_to_XMM(x86SSERegType to, uptr from) { SSE_SS_MtoR(0x6F0F, 0); } +void SSE2_MOVDQU_XMM_to_M128( uptr to, x86SSERegType from) { SSE_SS_RtoM(0x7F0F, 0); } +void SSE2_MOVDQU_XMM_to_XMM( x86SSERegType to, x86SSERegType from) { SSE_SS_RtoR(0x6F0F); } + +// shift right logical + +void SSE2_PSRLW_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66(0xD10F); } +void SSE2_PSRLW_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66(0xD10F); } +void SSE2_PSRLW_I8_to_XMM(x86SSERegType to, u8 imm8) +{ + write8( 0x66 ); + RexB(0, to); + write16( 0x710F ); + ModRM( 3, 2 , to ); + write8( imm8 ); +} + +void SSE2_PSRLD_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66(0xD20F); } +void SSE2_PSRLD_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66(0xD20F); } +void SSE2_PSRLD_I8_to_XMM(x86SSERegType to, u8 imm8) +{ + write8( 0x66 ); + RexB(0, to); + write16( 0x720F ); + ModRM( 3, 2 , to ); + write8( imm8 ); +} + +void SSE2_PSRLQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66(0xD30F); } +void SSE2_PSRLQ_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66(0xD30F); } +void SSE2_PSRLQ_I8_to_XMM(x86SSERegType to, u8 imm8) +{ + write8( 0x66 ); + RexB(0, to); + write16( 0x730F ); + ModRM( 3, 2 , to ); + write8( imm8 ); +} + +void SSE2_PSRLDQ_I8_to_XMM(x86SSERegType to, u8 imm8) +{ + write8( 0x66 ); + RexB(0, to); + write16( 0x730F ); + ModRM( 3, 3 , to ); + write8( imm8 ); +} + +// shift right arithmetic + +void SSE2_PSRAW_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66(0xE10F); } +void SSE2_PSRAW_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66(0xE10F); } +void SSE2_PSRAW_I8_to_XMM(x86SSERegType to, u8 imm8) +{ + write8( 0x66 ); + RexB(0, to); + write16( 0x710F ); + ModRM( 3, 4 , to ); + write8( imm8 ); +} + +void SSE2_PSRAD_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66(0xE20F); } +void SSE2_PSRAD_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66(0xE20F); } +void SSE2_PSRAD_I8_to_XMM(x86SSERegType to, u8 imm8) +{ + write8( 0x66 ); + RexB(0, to); + write16( 0x720F ); + ModRM( 3, 4 , to ); + write8( imm8 ); +} + +// shift left logical + +void SSE2_PSLLW_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66(0xF10F); } +void SSE2_PSLLW_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66(0xF10F); } +void SSE2_PSLLW_I8_to_XMM(x86SSERegType to, u8 imm8) +{ + write8( 0x66 ); + RexB(0, to); + write16( 0x710F ); + ModRM( 3, 6 , to ); + write8( imm8 ); +} + +void SSE2_PSLLD_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66(0xF20F); } +void SSE2_PSLLD_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66(0xF20F); } +void SSE2_PSLLD_I8_to_XMM(x86SSERegType to, u8 imm8) +{ + write8( 0x66 ); + RexB(0, to); + write16( 0x720F ); + ModRM( 3, 6 , to ); + write8( imm8 ); +} + +void SSE2_PSLLQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66(0xF30F); } +void SSE2_PSLLQ_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66(0xF30F); } +void SSE2_PSLLQ_I8_to_XMM(x86SSERegType to, u8 imm8) +{ + write8( 0x66 ); + RexB(0, to); + write16( 0x730F ); + ModRM( 3, 6 , to ); + write8( imm8 ); +} + +void SSE2_PSLLDQ_I8_to_XMM(x86SSERegType to, u8 imm8) +{ + write8( 0x66 ); + RexB(0, to); + write16( 0x730F ); + ModRM( 3, 7 , to ); + write8( imm8 ); +} + + +void SSE2_PMAXSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xEE0F ); } +void SSE2_PMAXSW_M128_to_XMM( x86SSERegType to, uptr from ){ SSEMtoR66( 0xEE0F ); } + +void SSE2_PMAXUB_XMM_to_XMM( x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xDE0F ); } +void SSE2_PMAXUB_M128_to_XMM( x86SSERegType to, uptr from ){ SSEMtoR66( 0xDE0F ); } + +void SSE2_PMINSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xEA0F ); } +void SSE2_PMINSW_M128_to_XMM( x86SSERegType to, uptr from ){ SSEMtoR66( 0xEA0F ); } + +void SSE2_PMINUB_XMM_to_XMM( x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xDA0F ); } +void SSE2_PMINUB_M128_to_XMM( x86SSERegType to, uptr from ){ SSEMtoR66( 0xDA0F ); } + +// + +void SSE2_PADDSB_XMM_to_XMM( x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xEC0F ); } +void SSE2_PADDSB_M128_to_XMM( x86SSERegType to, uptr from ){ SSEMtoR66( 0xEC0F ); } + +void SSE2_PADDSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xED0F ); } +void SSE2_PADDSW_M128_to_XMM( x86SSERegType to, uptr from ){ SSEMtoR66( 0xED0F ); } + +void SSE2_PSUBSB_XMM_to_XMM( x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xE80F ); } +void SSE2_PSUBSB_M128_to_XMM( x86SSERegType to, uptr from ){ SSEMtoR66( 0xE80F ); } + +void SSE2_PSUBSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from ){ SSERtoR66( 0xE90F ); } +void SSE2_PSUBSW_M128_to_XMM( x86SSERegType to, uptr from ){ SSEMtoR66( 0xE90F ); } + +void SSE2_PSUBUSB_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR66( 0xD80F ); } +void SSE2_PSUBUSB_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR66( 0xD80F ); } +void SSE2_PSUBUSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR66( 0xD90F ); } +void SSE2_PSUBUSW_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR66( 0xD90F ); } + +void SSE2_PADDUSB_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR66( 0xDC0F ); } +void SSE2_PADDUSB_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR66( 0xDC0F ); } +void SSE2_PADDUSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { SSERtoR66( 0xDD0F ); } +void SSE2_PADDUSW_M128_to_XMM( x86SSERegType to, uptr from ) { SSEMtoR66( 0xDD0F ); } + +//**********************************************************************************/ +//PACKSSWB,PACKSSDW: Pack Saturate Signed Word +//********************************************************************************** +void SSE2_PACKSSWB_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66( 0x630F ); } +void SSE2_PACKSSWB_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66( 0x630F ); } +void SSE2_PACKSSDW_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66( 0x6B0F ); } +void SSE2_PACKSSDW_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66( 0x6B0F ); } + +void SSE2_PACKUSWB_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66( 0x670F ); } +void SSE2_PACKUSWB_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66( 0x670F ); } + +//**********************************************************************************/ +//PUNPCKHWD: Unpack 16bit high +//********************************************************************************** +void SSE2_PUNPCKLBW_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66( 0x600F ); } +void SSE2_PUNPCKLBW_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66( 0x600F ); } + +void SSE2_PUNPCKHBW_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66( 0x680F ); } +void SSE2_PUNPCKHBW_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66( 0x680F ); } + +void SSE2_PUNPCKLWD_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66( 0x610F ); } +void SSE2_PUNPCKLWD_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66( 0x610F ); } +void SSE2_PUNPCKHWD_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66( 0x690F ); } +void SSE2_PUNPCKHWD_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66( 0x690F ); } + +void SSE2_PUNPCKLDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66( 0x620F ); } +void SSE2_PUNPCKLDQ_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66( 0x620F ); } +void SSE2_PUNPCKHDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66( 0x6A0F ); } +void SSE2_PUNPCKHDQ_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66( 0x6A0F ); } + +void SSE2_PUNPCKLQDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66( 0x6C0F ); } +void SSE2_PUNPCKLQDQ_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66( 0x6C0F ); } + +void SSE2_PUNPCKHQDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66( 0x6D0F ); } +void SSE2_PUNPCKHQDQ_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66( 0x6D0F ); } + +void SSE2_PMULLW_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66( 0xD50F ); } +void SSE2_PMULLW_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66( 0xD50F ); } +void SSE2_PMULHW_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66( 0xE50F ); } +void SSE2_PMULHW_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66( 0xE50F ); } + +void SSE2_PMULUDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSERtoR66( 0xF40F ); } +void SSE2_PMULUDQ_M128_to_XMM(x86SSERegType to, uptr from) { SSEMtoR66( 0xF40F ); } + +void SSE2_PMOVMSKB_XMM_to_R32(x86IntRegType to, x86SSERegType from) { SSERtoR66(0xD70F); } + +void SSE_MOVMSKPS_XMM_to_R32(x86IntRegType to, x86SSERegType from) { SSERtoR(0x500F); } +void SSE2_MOVMSKPD_XMM_to_R32(x86IntRegType to, x86SSERegType from) { SSERtoR66(0x500F); } + +void SSE3_HADDPS_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { write8(0xf2); SSERtoR( 0x7c0f ); } +void SSE3_HADDPS_M128_to_XMM(x86SSERegType to, uptr from){ SSEMtoRv( 3, 0x7c0fF2, 0 ); } + +void SSE3_MOVSLDUP_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { + write8(0xf3); + RexRB(0, to, from); + write16( 0x120f); + ModRM( 3, to, from ); +} + +void SSE3_MOVSLDUP_M128_to_XMM(x86SSERegType to, uptr from) { SSE_SS_MtoR(0x120f, 0); } +void SSE3_MOVSHDUP_XMM_to_XMM(x86SSERegType to, x86SSERegType from) { SSE_SS_RtoR(0x160f); } +void SSE3_MOVSHDUP_M128_to_XMM(x86SSERegType to, uptr from) { SSE_SS_MtoR(0x160f, 0); } + +// SSE-X +void SSEX_MOVDQA_M128_to_XMM( x86SSERegType to, uptr from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[to] == XMMT_INT ) SSE2_MOVDQA_M128_to_XMM(to, from); + else SSE_MOVAPS_M128_to_XMM(to, from); +} + +void SSEX_MOVDQA_XMM_to_M128( uptr to, x86SSERegType from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[from] == XMMT_INT ) SSE2_MOVDQA_XMM_to_M128(to, from); + else SSE_MOVAPS_XMM_to_M128(to, from); +} + +void SSEX_MOVDQA_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[from] == XMMT_INT ) SSE2_MOVDQA_XMM_to_XMM(to, from); + else SSE_MOVAPS_XMM_to_XMM(to, from); +} + +void SSEX_MOVDQARmtoROffset( x86SSERegType to, x86IntRegType from, int offset ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[to] == XMMT_INT ) SSE2_MOVDQARmtoROffset(to, from, offset); + else SSE_MOVAPSRmtoROffset(to, from, offset); +} + +void SSEX_MOVDQARtoRmOffset( x86IntRegType to, x86SSERegType from, int offset ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[from] == XMMT_INT ) SSE2_MOVDQARtoRmOffset(to, from, offset); + else SSE_MOVAPSRtoRmOffset(to, from, offset); +} + +void SSEX_MOVDQU_M128_to_XMM( x86SSERegType to, uptr from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[to] == XMMT_INT ) SSE2_MOVDQU_M128_to_XMM(to, from); + else SSE_MOVAPS_M128_to_XMM(to, from); +} + +void SSEX_MOVDQU_XMM_to_M128( uptr to, x86SSERegType from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[from] == XMMT_INT ) SSE2_MOVDQU_XMM_to_M128(to, from); + else SSE_MOVAPS_XMM_to_M128(to, from); +} + +void SSEX_MOVDQU_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[from] == XMMT_INT ) SSE2_MOVDQU_XMM_to_XMM(to, from); + else SSE_MOVAPS_XMM_to_XMM(to, from); +} + +void SSEX_MOVD_M32_to_XMM( x86SSERegType to, uptr from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[to] == XMMT_INT ) SSE2_MOVD_M32_to_XMM(to, from); + else SSE_MOVSS_M32_to_XMM(to, from); +} + +void SSEX_MOVD_XMM_to_M32( u32 to, x86SSERegType from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[from] == XMMT_INT ) SSE2_MOVD_XMM_to_M32(to, from); + else SSE_MOVSS_XMM_to_M32(to, from); +} + +void SSEX_MOVD_XMM_to_Rm( x86IntRegType to, x86SSERegType from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[from] == XMMT_INT ) SSE2_MOVD_XMM_to_Rm(to, from); + else SSE_MOVSS_XMM_to_Rm(to, from); +} + +void SSEX_MOVD_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[to] == XMMT_INT ) SSE2_MOVD_RmOffset_to_XMM(to, from, offset); + else SSE_MOVSS_RmOffset_to_XMM(to, from, offset); +} + +void SSEX_MOVD_XMM_to_RmOffset( x86IntRegType to, x86SSERegType from, int offset ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[from] == XMMT_INT ) SSE2_MOVD_XMM_to_RmOffset(to, from, offset); + else SSE_MOVSS_XMM_to_RmOffset(to, from, offset); +} + +void SSEX_POR_M128_to_XMM( x86SSERegType to, uptr from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[to] == XMMT_INT ) SSE2_POR_M128_to_XMM(to, from); + else SSE_ORPS_M128_to_XMM(to, from); +} + +void SSEX_POR_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[from] == XMMT_INT ) SSE2_POR_XMM_to_XMM(to, from); + else SSE_ORPS_XMM_to_XMM(to, from); +} + +void SSEX_PXOR_M128_to_XMM( x86SSERegType to, uptr from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[to] == XMMT_INT ) SSE2_PXOR_M128_to_XMM(to, from); + else SSE_XORPS_M128_to_XMM(to, from); +} + +void SSEX_PXOR_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[from] == XMMT_INT ) SSE2_PXOR_XMM_to_XMM(to, from); + else SSE_XORPS_XMM_to_XMM(to, from); +} + +void SSEX_PAND_M128_to_XMM( x86SSERegType to, uptr from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[to] == XMMT_INT ) SSE2_PAND_M128_to_XMM(to, from); + else SSE_ANDPS_M128_to_XMM(to, from); +} + +void SSEX_PAND_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[from] == XMMT_INT ) SSE2_PAND_XMM_to_XMM(to, from); + else SSE_ANDPS_XMM_to_XMM(to, from); +} + +void SSEX_PANDN_M128_to_XMM( x86SSERegType to, uptr from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[to] == XMMT_INT ) SSE2_PANDN_M128_to_XMM(to, from); + else SSE_ANDNPS_M128_to_XMM(to, from); +} + +void SSEX_PANDN_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[from] == XMMT_INT ) SSE2_PANDN_XMM_to_XMM(to, from); + else SSE_ANDNPS_XMM_to_XMM(to, from); +} + +void SSEX_PUNPCKLDQ_M128_to_XMM(x86SSERegType to, uptr from) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[to] == XMMT_INT ) SSE2_PUNPCKLDQ_M128_to_XMM(to, from); + else SSE_UNPCKLPS_M128_to_XMM(to, from); +} + +void SSEX_PUNPCKLDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[from] == XMMT_INT ) SSE2_PUNPCKLDQ_XMM_to_XMM(to, from); + else SSE_UNPCKLPS_XMM_to_XMM(to, from); +} + +void SSEX_PUNPCKHDQ_M128_to_XMM(x86SSERegType to, uptr from) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[to] == XMMT_INT ) SSE2_PUNPCKHDQ_M128_to_XMM(to, from); + else SSE_UNPCKHPS_M128_to_XMM(to, from); +} + +void SSEX_PUNPCKHDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[from] == XMMT_INT ) SSE2_PUNPCKHDQ_XMM_to_XMM(to, from); + else SSE_UNPCKHPS_XMM_to_XMM(to, from); +} + +void SSEX_MOVHLPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) +{ + if( cpucaps.hasStreamingSIMD2Extensions && g_xmmtypes[from] == XMMT_INT ) { + SSE2_PUNPCKHQDQ_XMM_to_XMM(to, from); + if( to != from ) SSE2_PSHUFD_XMM_to_XMM(to, to, 0x4e); + } + else { + SSE_MOVHLPS_XMM_to_XMM(to, from); + } +} + +// SSE2 emulation +void SSE2EMU_MOVSD_XMM_to_XMM( x86SSERegType to, x86SSERegType from) +{ + SSE_SHUFPS_XMM_to_XMM(to, from, 0x4e); + SSE_SHUFPS_XMM_to_XMM(to, to, 0x4e); +} + +void SSE2EMU_MOVQ_M64_to_XMM( x86SSERegType to, uptr from) +{ + SSE_XORPS_XMM_to_XMM(to, to); + SSE_MOVLPS_M64_to_XMM(to, from); +} + +void SSE2EMU_MOVQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from) +{ + SSE_XORPS_XMM_to_XMM(to, to); + SSE2EMU_MOVSD_XMM_to_XMM(to, from); +} + +void SSE2EMU_MOVD_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset ) +{ + MOV32RmtoROffset(EAX, from, offset); + MOV32ItoM((uptr)p+4, 0); + MOV32ItoM((uptr)p+8, 0); + MOV32RtoM((uptr)p, EAX); + MOV32ItoM((uptr)p+12, 0); + SSE_MOVAPS_M128_to_XMM(to, (uptr)p); +} + +void SSE2EMU_MOVD_XMM_to_RmOffset(x86IntRegType to, x86SSERegType from, int offset ) +{ + SSE_MOVSS_XMM_to_M32((uptr)p, from); + MOV32MtoR(EAX, (uptr)p); + MOV32RtoRmOffset(to, EAX, offset); +} + +#ifndef __x86_64__ +extern void SetMMXstate(); + +void SSE2EMU_MOVDQ2Q_XMM_to_MM( x86MMXRegType to, x86SSERegType from) +{ + SSE_MOVLPS_XMM_to_M64(p, from); + MOVQMtoR(to, p); + SetMMXstate(); +} + +void SSE2EMU_MOVQ2DQ_MM_to_XMM( x86SSERegType to, x86MMXRegType from) +{ + MOVQRtoM(p, from); + SSE_MOVLPS_M64_to_XMM(to, p); + SetMMXstate(); +} +#endif + +/****************************************************************************/ +/* SSE2 Emulated functions for SSE CPU's by kekko */ +/****************************************************************************/ +void SSE2EMU_PSHUFD_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 ) { + MOV64ItoR(EAX, (uptr)&p); + MOV64ItoR(EBX, (uptr)&p2); + SSE_MOVUPSRtoRm(EAX, from); + + MOV32ItoR(ECX, (u32)imm8); + AND32ItoR(ECX, 3); + SHL32ItoR(ECX, 2); + ADD32RtoR(ECX, EAX); + MOV32RmtoR(ECX, ECX); + MOV32RtoRm(EBX, ECX); + + ADD32ItoR(EBX, 4); + MOV32ItoR(ECX, (u32)imm8); + SHR32ItoR(ECX, 2); + AND32ItoR(ECX, 3); + SHL32ItoR(ECX, 2); + ADD32RtoR(ECX, EAX); + MOV32RmtoR(ECX, ECX); + MOV32RtoRm(EBX, ECX); + + ADD32ItoR(EBX, 4); + MOV32ItoR(ECX, (u32)imm8); + SHR32ItoR(ECX, 4); + AND32ItoR(ECX, 3); + SHL32ItoR(ECX, 2); + ADD32RtoR(ECX, EAX); + MOV32RmtoR(ECX, ECX); + MOV32RtoRm(EBX, ECX); + + ADD32ItoR(EBX, 4); + MOV32ItoR(ECX, (u32)imm8); + SHR32ItoR(ECX, 6); + AND32ItoR(ECX, 3); + SHL32ItoR(ECX, 2); + ADD32RtoR(ECX, EAX); + MOV32RmtoR(ECX, ECX); + MOV32RtoRm(EBX, ECX); + + SUB32ItoR(EBX, 12); + + SSE_MOVUPSRmtoR(to, EBX); +} + +void SSE2EMU_MOVD_XMM_to_R( x86IntRegType to, x86SSERegType from ) { + /* XXX? */ + MOV64ItoR(to, (uptr)&p); + SSE_MOVUPSRtoRm(to, from); + MOV32RmtoR(to, to); +} + +#ifndef __x86_64__ +extern void SetFPUstate(); +extern void _freeMMXreg(int mmxreg); +#endif + +void SSE2EMU_CVTPS2DQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { +#ifndef __x86_64__ + SetFPUstate(); + _freeMMXreg(7); +#endif + SSE_MOVAPS_XMM_to_M128((uptr)f, from); + + FLD32((uptr)&f[0]); + FISTP32((uptr)&p2[0]); + FLD32((uptr)&f[1]); + FISTP32((uptr)&p2[1]); + FLD32((uptr)&f[2]); + FISTP32((uptr)&p2[2]); + FLD32((uptr)&f[3]); + FISTP32((uptr)&p2[3]); + + SSE_MOVAPS_M128_to_XMM(to, (uptr)p2); +} + +void SSE2EMU_CVTDQ2PS_M128_to_XMM( x86SSERegType to, uptr from ) { +#ifndef __x86_64__ + SetFPUstate(); + _freeMMXreg(7); +#endif + FILD32(from); + FSTP32((uptr)&f[0]); + FILD32(from+4); + FSTP32((uptr)&f[1]); + FILD32(from+8); + FSTP32((uptr)&f[2]); + FILD32(from+12); + FSTP32((uptr)&f[3]); + + SSE_MOVAPS_M128_to_XMM(to, (uptr)f); +} + +void SSE2EMU_MOVD_XMM_to_M32( uptr to, x86SSERegType from ) { + /* XXX? */ + MOV64ItoR(EAX, (uptr)&p); + SSE_MOVUPSRtoRm(EAX, from); + MOV32RmtoR(EAX, EAX); + MOV32RtoM(to, EAX); +} + +void SSE2EMU_MOVD_R_to_XMM( x86SSERegType to, x86IntRegType from ) { + MOV32ItoM((uptr)p+4, 0); + MOV32ItoM((uptr)p+8, 0); + MOV32RtoM((uptr)p, from); + MOV32ItoM((uptr)p+12, 0); + SSE_MOVAPS_M128_to_XMM(to, (uptr)p); +} + +#endif diff --git a/libpcsxcore/mdec.c b/libpcsxcore/mdec.c new file mode 100644 index 0000000..5e84152 --- /dev/null +++ b/libpcsxcore/mdec.c @@ -0,0 +1,565 @@ +/*************************************************************************** + * Copyright (C) 2010 Gabriele Gorla * + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#include "mdec.h" + +#define DSIZE 8 +#define DSIZE2 (DSIZE * DSIZE) + +#define SCALE(x, n) ((x) >> (n)) +#define SCALER(x, n) (((x) + ((1 << (n)) >> 1)) >> (n)) + +#define AAN_CONST_BITS 12 +#define AAN_PRESCALE_BITS 16 + +#define AAN_CONST_SIZE 24 +#define AAN_CONST_SCALE (AAN_CONST_SIZE - AAN_CONST_BITS) + +#define AAN_PRESCALE_SIZE 20 +#define AAN_PRESCALE_SCALE (AAN_PRESCALE_SIZE-AAN_PRESCALE_BITS) +#define AAN_EXTRA 12 + +#define FIX_1_082392200 SCALER(18159528, AAN_CONST_SCALE) // B6 +#define FIX_1_414213562 SCALER(23726566, AAN_CONST_SCALE) // A4 +#define FIX_1_847759065 SCALER(31000253, AAN_CONST_SCALE) // A2 +#define FIX_2_613125930 SCALER(43840978, AAN_CONST_SCALE) // B2 + +#define MULS(var, const) (SCALE((var) * (const), AAN_CONST_BITS)) + +#define RLE_RUN(a) ((a) >> 10) +#define RLE_VAL(a) (((int)(a) << (sizeof(int) * 8 - 10)) >> (sizeof(int) * 8 - 10)) + +#if 0 +static void printmatrixu8(u8 *m) { + int i; + for(i = 0; i < DSIZE2; i++) { + printf("%3d ",m[i]); + if((i+1) % 8 == 0) printf("\n"); + } +} +#endif + +static inline void fillcol(int *blk, int val) { + blk[0 * DSIZE] = blk[1 * DSIZE] = blk[2 * DSIZE] = blk[3 * DSIZE] + = blk[4 * DSIZE] = blk[5 * DSIZE] = blk[6 * DSIZE] = blk[7 * DSIZE] = val; +} + +static inline void fillrow(int *blk, int val) { + blk[0] = blk[1] = blk[2] = blk[3] + = blk[4] = blk[5] = blk[6] = blk[7] = val; +} + +void idct(int *block,int used_col) { + int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + int z5, z10, z11, z12, z13; + int *ptr; + int i; + + // the block has only the DC coefficient + if (used_col == -1) { + int v = block[0]; + for (i = 0; i < DSIZE2; i++) block[i] = v; + return; + } + + // last_col keeps track of the highest column with non zero coefficients + ptr = block; + for (i = 0; i < DSIZE; i++, ptr++) { + if ((used_col & (1 << i)) == 0) { + // the column is empty or has only the DC coefficient + if (ptr[DSIZE * 0]) { + fillcol(ptr, ptr[0]); + used_col |= (1 << i); + } + continue; + } + + // further optimization could be made by keeping track of + // last_row in rl2blk + z10 = ptr[DSIZE * 0] + ptr[DSIZE * 4]; // s04 + z11 = ptr[DSIZE * 0] - ptr[DSIZE * 4]; // d04 + z13 = ptr[DSIZE * 2] + ptr[DSIZE * 6]; // s26 + z12 = MULS(ptr[DSIZE * 2] - ptr[DSIZE * 6], FIX_1_414213562) - z13; + //^^^^ d26=d26*2*A4-s26 + + tmp0 = z10 + z13; // os07 = s04 + s26 + tmp3 = z10 - z13; // os34 = s04 - s26 + tmp1 = z11 + z12; // os16 = d04 + d26 + tmp2 = z11 - z12; // os25 = d04 - d26 + + z13 = ptr[DSIZE * 3] + ptr[DSIZE * 5]; //s53 + z10 = ptr[DSIZE * 3] - ptr[DSIZE * 5]; //-d53 + z11 = ptr[DSIZE * 1] + ptr[DSIZE * 7]; //s17 + z12 = ptr[DSIZE * 1] - ptr[DSIZE * 7]; //d17 + + tmp7 = z11 + z13; // od07 = s17 + s53 + + z5 = (z12 - z10) * (FIX_1_847759065); + tmp6 = SCALE(z10*(FIX_2_613125930) + z5, AAN_CONST_BITS) - tmp7; + tmp5 = MULS(z11 - z13, FIX_1_414213562) - tmp6; + tmp4 = SCALE(z12*(FIX_1_082392200) - z5, AAN_CONST_BITS) + tmp5; + + // path #1 + //z5 = (z12 - z10)* FIX_1_847759065; + // tmp0 = (d17 + d53) * 2*A2 + + //tmp6 = DESCALE(z10*FIX_2_613125930 + z5, CONST_BITS) - tmp7; + // od16 = (d53*-2*B2 + tmp0) - od07 + + //tmp4 = DESCALE(z12*FIX_1_082392200 - z5, CONST_BITS) + tmp5; + // od34 = (d17*2*B6 - tmp0) + od25 + + // path #2 + + // od34 = d17*2*(B6-A2) - d53*2*A2 + // od16 = d53*2*(A2-B2) + d17*2*A2 + + // end + + // tmp5 = MULS(z11 - z13, FIX_1_414213562) - tmp6; + // od25 = (s17 - s53)*2*A4 - od16 + + ptr[DSIZE * 0] = (tmp0 + tmp7); // os07 + od07 + ptr[DSIZE * 7] = (tmp0 - tmp7); // os07 - od07 + ptr[DSIZE * 1] = (tmp1 + tmp6); // os16 + od16 + ptr[DSIZE * 6] = (tmp1 - tmp6); // os16 - od16 + ptr[DSIZE * 2] = (tmp2 + tmp5); // os25 + od25 + ptr[DSIZE * 5] = (tmp2 - tmp5); // os25 - od25 + ptr[DSIZE * 4] = (tmp3 + tmp4); // os34 + od34 + ptr[DSIZE * 3] = (tmp3 - tmp4); // os34 - od34 + } + + ptr = block; + if (used_col == 1) { + for (i = 0; i < DSIZE; i++) + fillrow(block + DSIZE * i, block[DSIZE * i]); + } else { + for (i = 0; i < DSIZE; i++, ptr += DSIZE) { + z10 = ptr[0] + ptr[4]; + z11 = ptr[0] - ptr[4]; + z13 = ptr[2] + ptr[6]; + z12 = MULS(ptr[2] - ptr[6], FIX_1_414213562) - z13; + + tmp0 = z10 + z13; + tmp3 = z10 - z13; + tmp1 = z11 + z12; + tmp2 = z11 - z12; + + z13 = ptr[3] + ptr[5]; + z10 = ptr[3] - ptr[5]; + z11 = ptr[1] + ptr[7]; + z12 = ptr[1] - ptr[7]; + + tmp7 = z11 + z13; + z5 = (z12 - z10) * FIX_1_847759065; + tmp6 = SCALE(z10 * FIX_2_613125930 + z5, AAN_CONST_BITS) - tmp7; + tmp5 = MULS(z11 - z13, FIX_1_414213562) - tmp6; + tmp4 = SCALE(z12 * FIX_1_082392200 - z5, AAN_CONST_BITS) + tmp5; + + ptr[0] = tmp0 + tmp7; + + ptr[7] = tmp0 - tmp7; + ptr[1] = tmp1 + tmp6; + ptr[6] = tmp1 - tmp6; + ptr[2] = tmp2 + tmp5; + ptr[5] = tmp2 - tmp5; + ptr[4] = tmp3 + tmp4; + ptr[3] = tmp3 - tmp4; + } + } +} + +// mdec0: command register +#define MDEC0_STP 0x02000000 +#define MDEC0_RGB24 0x08000000 +#define MDEC0_SIZE_MASK 0xFFFF + +// mdec1: status register +#define MDEC1_BUSY 0x20000000 +#define MDEC1_DREQ 0x18000000 +#define MDEC1_FIFO 0xc0000000 +#define MDEC1_RGB24 0x02000000 +#define MDEC1_STP 0x00800000 +#define MDEC1_RESET 0x80000000 + +struct { + u32 reg0; + u32 reg1; + unsigned short *rl; + int rlsize; +} mdec; + +static int iq_y[DSIZE2], iq_uv[DSIZE2]; + +static int zscan[DSIZE2] = { + 0 , 1 , 8 , 16, 9 , 2 , 3 , 10, + 17, 24, 32, 25, 18, 11, 4 , 5 , + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6 , 7 , 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63 +}; + +static int aanscales[DSIZE2] = { + 1048576, 1454417, 1370031, 1232995, 1048576, 823861, 567485, 289301, + 1454417, 2017334, 1900287, 1710213, 1454417, 1142728, 787125, 401273, + 1370031, 1900287, 1790031, 1610986, 1370031, 1076426, 741455, 377991, + 1232995, 1710213, 1610986, 1449849, 1232995, 968758, 667292, 340183, + 1048576, 1454417, 1370031, 1232995, 1048576, 823861, 567485, 289301, + 823861, 1142728, 1076426, 968758, 823861, 647303, 445870, 227303, + 567485, 787125, 741455, 667292, 567485, 445870, 307121, 156569, + 289301, 401273, 377991, 340183, 289301, 227303, 156569, 79818 +}; + +static void iqtab_init(int *iqtab, unsigned char *iq_y) { + int i; + + for (i = 0; i < DSIZE2; i++) { + iqtab[i] = (iq_y[i] * SCALER(aanscales[zscan[i]], AAN_PRESCALE_SCALE)); + } +} + +#define MDEC_END_OF_DATA 0xfe00 + +unsigned short *rl2blk(int *blk, unsigned short *mdec_rl) { + int i, k, q_scale, rl, used_col; + int *iqtab; + + memset(blk, 0, 6 * DSIZE2 * sizeof(int)); + iqtab = iq_uv; + for (i = 0; i < 6; i++) { + // decode blocks (Cr,Cb,Y1,Y2,Y3,Y4) + if (i == 2) iqtab = iq_y; + + rl = SWAP16(*mdec_rl); mdec_rl++; + q_scale = RLE_RUN(rl); + blk[0] = SCALER(iqtab[0] * RLE_VAL(rl), AAN_EXTRA - 3); + for (k = 0, used_col = 0;;) { + rl = SWAP16(*mdec_rl); mdec_rl++; + if (rl == MDEC_END_OF_DATA) break; + k += RLE_RUN(rl) + 1; // skip zero-coefficients + + if (k > 63) { + // printf("run lenght exceeded 64 enties\n"); + break; + } + + // zigzag transformation + blk[zscan[k]] = SCALER(RLE_VAL(rl) * iqtab[k] * q_scale, AAN_EXTRA); + // keep track of used columns to speed up the idtc + used_col |= (zscan[k] > 7) ? 1 << (zscan[k] & 7) : 0; + } + + if (k == 0) used_col = -1; + // used_col is -1 for blocks with only the DC coefficient + // any other value is a bitmask of the columns that have + // at least one non zero cofficient in the rows 1-7 + // single coefficients in row 0 are treted specially + // in the idtc function + idct(blk, used_col); + blk += DSIZE2; + } + return mdec_rl; +} + +// full scale (JPEG) +// Y/Cb/Cr[0...255] -> R/G/B[0...255] +// R = 1.000 * (Y) + 1.400 * (Cr - 128) +// G = 1.000 * (Y) - 0.343 * (Cb - 128) - 0.711 (Cr - 128) +// B = 1.000 * (Y) + 1.765 * (Cb - 128) +#define MULR(a) ((1434 * (a))) +#define MULB(a) ((1807 * (a))) +#define MULG2(a, b) ((-351 * (a) - 728 * (b))) +#define MULY(a) ((a) << 10) + +#define MAKERGB15(r, g, b, a) (SWAP16(a | ((b) << 10) | ((g) << 5) | (r))) +#define SCALE8(c) SCALER(c, 20) +#define SCALE5(c) SCALER(c, 23) + +#define CLAMP5(c) ( ((c) < -16) ? 0 : (((c) > (31 - 16)) ? 31 : ((c) + 16)) ) +#define CLAMP8(c) ( ((c) < -128) ? 0 : (((c) > (255 - 128)) ? 255 : ((c) + 128)) ) + +#define CLAMP_SCALE8(a) (CLAMP8(SCALE8(a))) +#define CLAMP_SCALE5(a) (CLAMP5(SCALE5(a))) + +static inline void putlinebw15(unsigned short *image, int *Yblk) { + int i; + int A = (mdec.reg0 & MDEC0_STP) ? 0x8000 : 0; + + for (i = 0; i < 8; i++, Yblk++) { + int Y = *Yblk; + // missing rounding + image[i] = SWAP16((CLAMP5(Y >> 3) * 0x421) | A); + } +} + +static void putquadrgb15(unsigned short *image, int *Yblk, int Cr, int Cb) { + int Y, R, G, B; + int A = (mdec.reg0 & MDEC0_STP) ? 0x8000 : 0; + R = MULR(Cr); + G = MULG2(Cb, Cr); + B = MULB(Cb); + + // added transparency + Y = MULY(Yblk[0]); + image[0] = MAKERGB15(CLAMP_SCALE5(Y + R), CLAMP_SCALE5(Y + G), CLAMP_SCALE5(Y + B), A); + Y = MULY(Yblk[1]); + image[1] = MAKERGB15(CLAMP_SCALE5(Y + R), CLAMP_SCALE5(Y + G), CLAMP_SCALE5(Y + B), A); + Y = MULY(Yblk[8]); + image[16] = MAKERGB15(CLAMP_SCALE5(Y + R), CLAMP_SCALE5(Y + G), CLAMP_SCALE5(Y + B), A); + Y = MULY(Yblk[9]); + image[17] = MAKERGB15(CLAMP_SCALE5(Y + R), CLAMP_SCALE5(Y + G), CLAMP_SCALE5(Y + B), A); +} + +static void yuv2rgb15(int *blk, unsigned short *image) { + int x, y; + int *Yblk = blk + DSIZE2 * 2; + int *Crblk = blk; + int *Cbblk = blk + DSIZE2; + + if (!Config.Mdec) { + for (y = 0; y < 16; y += 2, Crblk += 4, Cbblk += 4, Yblk += 8, image += 24) { + if (y == 8) Yblk += DSIZE2; + for (x = 0; x < 4; x++, image += 2, Crblk++, Cbblk++, Yblk += 2) { + putquadrgb15(image, Yblk, *Crblk, *Cbblk); + putquadrgb15(image + 8, Yblk + DSIZE2, *(Crblk + 4), *(Cbblk + 4)); + } + } + } else { + for (y = 0; y < 16; y++, Yblk += 8, image += 16) { + if (y == 8) Yblk += DSIZE2; + putlinebw15(image, Yblk); + putlinebw15(image + 8, Yblk + DSIZE2); + } + } +} + +static inline void putlinebw24(unsigned char *image, int *Yblk) { + int i; + unsigned char Y; + for (i = 0; i < 8 * 3; i += 3, Yblk++) { + Y = CLAMP8(*Yblk); + image[i + 0] = Y; + image[i + 1] = Y; + image[i + 2] = Y; + } +} + +static void putquadrgb24(unsigned char *image, int *Yblk, int Cr, int Cb) { + int Y, R, G, B; + + R = MULR(Cr); + G = MULG2(Cb,Cr); + B = MULB(Cb); + + Y = MULY(Yblk[0]); + image[0 * 3 + 0] = CLAMP_SCALE8(Y + R); + image[0 * 3 + 1] = CLAMP_SCALE8(Y + G); + image[0 * 3 + 2] = CLAMP_SCALE8(Y + B); + Y = MULY(Yblk[1]); + image[1 * 3 + 0] = CLAMP_SCALE8(Y + R); + image[1 * 3 + 1] = CLAMP_SCALE8(Y + G); + image[1 * 3 + 2] = CLAMP_SCALE8(Y + B); + Y = MULY(Yblk[8]); + image[16 * 3 + 0] = CLAMP_SCALE8(Y + R); + image[16 * 3 + 1] = CLAMP_SCALE8(Y + G); + image[16 * 3 + 2] = CLAMP_SCALE8(Y + B); + Y = MULY(Yblk[9]); + image[17 * 3 + 0] = CLAMP_SCALE8(Y + R); + image[17 * 3 + 1] = CLAMP_SCALE8(Y + G); + image[17 * 3 + 2] = CLAMP_SCALE8(Y + B); +} + +static void yuv2rgb24(int *blk, unsigned char *image) { + int x, y; + int *Yblk = blk + DSIZE2 * 2; + int *Crblk = blk; + int *Cbblk = blk + DSIZE2; + + if (!Config.Mdec) { + for (y = 0; y < 16; y += 2, Crblk += 4, Cbblk += 4, Yblk += 8, image += 24 * 3) { + if (y == 8) Yblk += DSIZE2; + for (x = 0; x < 4; x++, image += 6, Crblk++, Cbblk++, Yblk += 2) { + putquadrgb24(image, Yblk, *Crblk, *Cbblk); + putquadrgb24(image + 8 * 3, Yblk + DSIZE2, *(Crblk + 4), *(Cbblk + 4)); + } + } + } else { + for (y = 0; y < 16; y++, Yblk += 8, image += 16 * 3) { + if (y == 8) Yblk += DSIZE2; + putlinebw24(image, Yblk); + putlinebw24(image + 8 * 3, Yblk + DSIZE2); + } + } +} + +void mdecInit(void) { + mdec.rl = (u16 *)&psxM[0x100000]; + mdec.reg0 = 0; + mdec.reg1 = 0; +} + +// command register +void mdecWrite0(u32 data) { +#ifdef CDR_LOG + CDR_LOG("mdec0 write %08x\n", data); +#endif + mdec.reg0 = data; +} + +u32 mdecRead0(void) { +#ifdef CDR_LOG + CDR_LOG("mdec0 read %08x\n", mdec.reg0); +#endif + // mame is returning 0 + return mdec.reg0; +} + +// status register +void mdecWrite1(u32 data) { +#ifdef CDR_LOG + CDR_LOG("mdec1 write %08x\n", data); +#endif + if (data & MDEC1_RESET) { // mdec reset + mdec.reg0 = 0; + mdec.reg1 = 0; + } +} + +u32 mdecRead1(void) { + u32 v = mdec.reg1; + v |= (mdec.reg0 & MDEC0_STP) ? MDEC1_STP : 0; + v |= (mdec.reg0 & MDEC0_RGB24) ? MDEC1_RGB24 : 0; +#ifdef CDR_LOG + CDR_LOG("mdec1 read %08x\n", v); +#endif + return v; +} + +void psxDma0(u32 adr, u32 bcr, u32 chcr) { + int cmd = mdec.reg0; + int size; + +#ifdef CDR_LOG + CDR_LOG("DMA0 %08x %08x %08x\n", adr, bcr, chcr); +#endif + + if (chcr != 0x01000201) { + // printf("chcr != 0x01000201\n"); + return; + } + + size = (bcr >> 16) * (bcr & 0xffff); + + switch (cmd >> 28) { + case 0x3: // decode + mdec.rl = (u16 *)PSXM(adr); + mdec.rlsize = mdec.reg0 & MDEC0_SIZE_MASK; + break; + + case 0x4: // quantization table upload + { + u8 *p = (u8 *)PSXM(adr); + // printf("uploading new quantization table\n"); + // printmatrixu8(p); + // printmatrixu8(p + 64); + iqtab_init(iq_y, p); + iqtab_init(iq_uv, p + 64); + } + break; + + case 0x6: // cosine table + // printf("mdec cosine table\n"); + break; + + default: + // printf("mdec unknown command\n"); + break; + } + + HW_DMA0_CHCR &= SWAP32(~0x01000000); + DMA_INTERRUPT(0); +} + +void psxDma1(u32 adr, u32 bcr, u32 chcr) { + int blk[DSIZE2 * 6]; + unsigned short *image; + int size; + +#ifdef CDR_LOG + CDR_LOG("DMA1 %08x %08x %08x (cmd = %08x)\n", adr, bcr, chcr, mdec.reg0); +#endif + + if (chcr != 0x01000200) return; + + size = (bcr >> 16) * (bcr & 0xffff); + + image = (u16 *)PSXM(adr); + + if (mdec.reg0 & MDEC0_RGB24) { // 15-b decoding + // MDECOUTDMA_INT(((size * (1000000 / 9000)) / 4) /** 4*/); + MDECOUTDMA_INT(size / 4); + size = size / ((16 * 16) / 2); + for (; size > 0; size--, image += (16 * 16)) { + mdec.rl = rl2blk(blk, mdec.rl); + yuv2rgb15(blk, image); + } + } else { // 24-b decoding + // MDECOUTDMA_INT(((size * (1000000 / 9000)) / 4) /** 4*/); + MDECOUTDMA_INT(size / 4); + size = size / ((24 * 16) / 2); + for (; size > 0; size--, image += (24 * 16)) { + mdec.rl = rl2blk(blk, mdec.rl); + yuv2rgb24(blk, (u8 *)image); + } + } + + mdec.reg1 |= MDEC1_BUSY; +} + +void mdec1Interrupt() { +#ifdef CDR_LOG + CDR_LOG("mdec1Interrupt\n"); +#endif + if (HW_DMA1_CHCR & SWAP32(0x01000000)) { + // Set a fixed value totaly arbitrarie another sound value is + // PSXCLK / 60 or PSXCLK / 50 since the bug happened at end of frame. + // PSXCLK / 1000 seems good for FF9. (for FF9 need < ~28000) + // CAUTION: commented interrupt-handling may lead to problems, keep an eye ;-) + MDECOUTDMA_INT(PSXCLK / 1000 * BIAS); +// psxRegs.interrupt |= 0x02000000; +// psxRegs.intCycle[5 + 24 + 1] *= 8; +// psxRegs.intCycle[5 + 24] = psxRegs.cycle; + HW_DMA1_CHCR &= SWAP32(~0x01000000); + DMA_INTERRUPT(1); + } else { + mdec.reg1 &= ~MDEC1_BUSY; + } +} + +int mdecFreeze(gzFile f, int Mode) { + gzfreeze(&mdec, sizeof(mdec)); + gzfreeze(iq_y, sizeof(iq_y)); + gzfreeze(iq_uv, sizeof(iq_uv)); + + return 0; +} diff --git a/libpcsxcore/mdec.h b/libpcsxcore/mdec.h new file mode 100644 index 0000000..e191b4e --- /dev/null +++ b/libpcsxcore/mdec.h @@ -0,0 +1,45 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __MDEC_H__ +#define __MDEC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" +#include "r3000a.h" +#include "psxhw.h" +#include "psxdma.h" + +void mdecInit(); +void mdecWrite0(u32 data); +void mdecWrite1(u32 data); +u32 mdecRead0(); +u32 mdecRead1(); +void psxDma0(u32 madr, u32 bcr, u32 chcr); +void psxDma1(u32 madr, u32 bcr, u32 chcr); +void mdec1Interrupt(); +int mdecFreeze(gzFile f, int Mode); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/misc.c b/libpcsxcore/misc.c new file mode 100644 index 0000000..ef49244 --- /dev/null +++ b/libpcsxcore/misc.c @@ -0,0 +1,706 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* Miscellaneous functions, including savestates and CD-ROM loading. +*/ + +#include "misc.h" +#include "cdrom.h" +#include "mdec.h" +#include "ppf.h" + +char CdromId[10] = ""; +char CdromLabel[33] = ""; + +// PSX Executable types +#define PSX_EXE 1 +#define CPE_EXE 2 +#define COFF_EXE 3 +#define INVALID_EXE 4 + +#define ISODCL(from, to) (to - from + 1) + +struct iso_directory_record { + char length [ISODCL (1, 1)]; /* 711 */ + char ext_attr_length [ISODCL (2, 2)]; /* 711 */ + char extent [ISODCL (3, 10)]; /* 733 */ + char size [ISODCL (11, 18)]; /* 733 */ + char date [ISODCL (19, 25)]; /* 7 by 711 */ + char flags [ISODCL (26, 26)]; + char file_unit_size [ISODCL (27, 27)]; /* 711 */ + char interleave [ISODCL (28, 28)]; /* 711 */ + char volume_sequence_number [ISODCL (29, 32)]; /* 723 */ + unsigned char name_len [ISODCL (33, 33)]; /* 711 */ + char name [1]; +}; + +void mmssdd( char *b, char *p ) +{ + int m, s, d; +#if defined(__BIGENDIAN__) + int block = (b[0] & 0xff) | ((b[1] & 0xff) << 8) | ((b[2] & 0xff) << 16) | (b[3] << 24); +#else + int block = *((int*)b); +#endif + + block += 150; + m = block / 4500; // minutes + block = block - m * 4500; // minutes rest + s = block / 75; // seconds + d = block - s * 75; // seconds rest + + m = ((m / 10) << 4) | m % 10; + s = ((s / 10) << 4) | s % 10; + d = ((d / 10) << 4) | d % 10; + + p[0] = m; + p[1] = s; + p[2] = d; +} + +#define incTime() \ + time[0] = btoi(time[0]); time[1] = btoi(time[1]); time[2] = btoi(time[2]); \ + time[2]++; \ + if(time[2] == 75) { \ + time[2] = 0; \ + time[1]++; \ + if (time[1] == 60) { \ + time[1] = 0; \ + time[0]++; \ + } \ + } \ + time[0] = itob(time[0]); time[1] = itob(time[1]); time[2] = itob(time[2]); + +#define READTRACK() \ + if (CDR_readTrack(time) == -1) return -1; \ + buf = CDR_getBuffer(); \ + if (buf == NULL) return -1; else CheckPPFCache(buf, time[0], time[1], time[2]); + +#define READDIR(_dir) \ + READTRACK(); \ + memcpy(_dir, buf + 12, 2048); \ + \ + incTime(); \ + READTRACK(); \ + memcpy(_dir + 2048, buf + 12, 2048); + +int GetCdromFile(u8 *mdir, u8 *time, s8 *filename) { + struct iso_directory_record *dir; + char ddir[4096]; + u8 *buf; + int i; + + // only try to scan if a filename is given + if (!strlen(filename)) return -1; + + i = 0; + while (i < 4096) { + dir = (struct iso_directory_record*) &mdir[i]; + if (dir->length[0] == 0) { + return -1; + } + i += dir->length[0]; + + if (dir->flags[0] & 0x2) { // it's a dir + if (!strnicmp((char *)&dir->name[0], filename, dir->name_len[0])) { + if (filename[dir->name_len[0]] != '\\') continue; + + filename += dir->name_len[0] + 1; + + mmssdd(dir->extent, (char *)time); + READDIR(ddir); + i = 0; + mdir = ddir; + } + } else { + if (!strnicmp((char *)&dir->name[0], filename, strlen(filename))) { + mmssdd(dir->extent, (char *)time); + break; + } + } + } + return 0; +} + +int LoadCdrom() { + EXE_HEADER tmpHead; + struct iso_directory_record *dir; + u8 time[4], *buf; + u8 mdir[4096]; + s8 exename[256]; + + if (!Config.HLE) { + psxRegs.pc = psxRegs.GPR.n.ra; + return 0; + } + + time[0] = itob(0); time[1] = itob(2); time[2] = itob(0x10); + + READTRACK(); + + // skip head and sub, and go to the root directory record + dir = (struct iso_directory_record*) &buf[12+156]; + + mmssdd(dir->extent, (char*)time); + + READDIR(mdir); + + // Load SYSTEM.CNF and scan for the main executable + if (GetCdromFile(mdir, time, "SYSTEM.CNF;1") == -1) { + // if SYSTEM.CNF is missing, start an existing PSX.EXE + if (GetCdromFile(mdir, time, "PSX.EXE;1") == -1) return -1; + + READTRACK(); + } + else { + // read the SYSTEM.CNF + READTRACK(); + + sscanf((char *)buf + 12, "BOOT = cdrom:\\%256s", exename); + if (GetCdromFile(mdir, time, exename) == -1) { + sscanf((char *)buf + 12, "BOOT = cdrom:%256s", exename); + if (GetCdromFile(mdir, time, exename) == -1) { + char *ptr = strstr(buf + 12, "cdrom:"); + if (ptr != NULL) { + ptr += 6; + while (*ptr == '\\' || *ptr == '/') ptr++; + strncpy(exename, ptr, 255); + exename[255] = '\0'; + ptr = exename; + while (*ptr != '\0' && *ptr != '\r' && *ptr != '\n') ptr++; + *ptr = '\0'; + if (GetCdromFile(mdir, time, exename) == -1) + return -1; + } else + return -1; + } + } + + // Read the EXE-Header + READTRACK(); + } + + memcpy(&tmpHead, buf + 12, sizeof(EXE_HEADER)); + + psxRegs.pc = SWAP32(tmpHead.pc0); + psxRegs.GPR.n.gp = SWAP32(tmpHead.gp0); + psxRegs.GPR.n.sp = SWAP32(tmpHead.s_addr); + if (psxRegs.GPR.n.sp == 0) psxRegs.GPR.n.sp = 0x801fff00; + + tmpHead.t_size = SWAP32(tmpHead.t_size); + tmpHead.t_addr = SWAP32(tmpHead.t_addr); + + // Read the rest of the main executable + while (tmpHead.t_size) { + void *ptr = (void *)PSXM(tmpHead.t_addr); + + incTime(); + READTRACK(); + + if (ptr != NULL) memcpy(ptr, buf+12, 2048); + + tmpHead.t_size -= 2048; + tmpHead.t_addr += 2048; + } + + return 0; +} + +int LoadCdromFile(const char *filename, EXE_HEADER *head) { + struct iso_directory_record *dir; + u8 time[4],*buf; + u8 mdir[4096], exename[256]; + u32 size, addr; + + sscanf(filename, "cdrom:\\%256s", exename); + + time[0] = itob(0); time[1] = itob(2); time[2] = itob(0x10); + + READTRACK(); + + // skip head and sub, and go to the root directory record + dir = (struct iso_directory_record *)&buf[12 + 156]; + + mmssdd(dir->extent, (char*)time); + + READDIR(mdir); + + if (GetCdromFile(mdir, time, exename) == -1) return -1; + + READTRACK(); + + memcpy(head, buf + 12, sizeof(EXE_HEADER)); + size = head->t_size; + addr = head->t_addr; + + while (size) { + incTime(); + READTRACK(); + + memcpy((void *)PSXM(addr), buf + 12, 2048); + + size -= 2048; + addr += 2048; + } + + return 0; +} + +int CheckCdrom() { + struct iso_directory_record *dir; + unsigned char time[4], *buf; + unsigned char mdir[4096]; + char exename[256]; + int i, c; + + FreePPFCache(); + + time[0] = itob(0); + time[1] = itob(2); + time[2] = itob(0x10); + + READTRACK(); + + CdromLabel[0] = '\0'; + CdromId[0] = '\0'; + + strncpy(CdromLabel, buf + 52, 32); + + // skip head and sub, and go to the root directory record + dir = (struct iso_directory_record *)&buf[12 + 156]; + + mmssdd(dir->extent, (char *)time); + + READDIR(mdir); + + if (GetCdromFile(mdir, time, "SYSTEM.CNF;1") != -1) { + READTRACK(); + + sscanf((char *)buf + 12, "BOOT = cdrom:\\%256s", exename); + if (GetCdromFile(mdir, time, exename) == -1) { + sscanf((char *)buf + 12, "BOOT = cdrom:%256s", exename); + if (GetCdromFile(mdir, time, exename) == -1) { + char *ptr = strstr(buf + 12, "cdrom:"); // possibly the executable is in some subdir + if (ptr != NULL) { + ptr += 6; + while (*ptr == '\\' || *ptr == '/') ptr++; + strncpy(exename, ptr, 255); + exename[255] = '\0'; + ptr = exename; + while (*ptr != '\0' && *ptr != '\r' && *ptr != '\n') ptr++; + *ptr = '\0'; + if (GetCdromFile(mdir, time, exename) == -1) + return -1; // main executable not found + } else + return -1; + } + } + } else if (GetCdromFile(mdir, time, "PSX.EXE;1") != -1) { + strcpy(exename, "PSX.EXE;1"); + strcpy(CdromId, "SLUS99999"); + } else + return -1; // SYSTEM.CNF and PSX.EXE not found + + if (CdromId[0] == '\0') { + i = strlen(exename); + if (i >= 2) { + if (exename[i - 2] == ';') i-= 2; + c = 8; i--; + while (i >= 0 && c >= 0) { + if (isalnum(exename[i])) CdromId[c--] = exename[i]; + i--; + } + } + } + + if (Config.PsxAuto) { // autodetect system (pal or ntsc) + if (strstr(exename, "ES") != NULL) + Config.PsxType = PSX_TYPE_PAL; // pal + else Config.PsxType = PSX_TYPE_NTSC; // ntsc + } + + if (CdromLabel[0] == ' ') { + strncpy(CdromLabel, CdromId, 9); + } + SysPrintf(_("CD-ROM Label: %.32s\n"), CdromLabel); + SysPrintf(_("CD-ROM ID: %.9s\n"), CdromId); + + BuildPPFCache(); + + return 0; +} + +static int PSXGetFileType(FILE *f) { + unsigned long current; + u8 mybuf[2048]; + EXE_HEADER *exe_hdr; + FILHDR *coff_hdr; + + current = ftell(f); + fseek(f, 0L, SEEK_SET); + fread(mybuf, 2048, 1, f); + fseek(f, current, SEEK_SET); + + exe_hdr = (EXE_HEADER *)mybuf; + if (memcmp(exe_hdr->id, "PS-X EXE", 8) == 0) + return PSX_EXE; + + if (mybuf[0] == 'C' && mybuf[1] == 'P' && mybuf[2] == 'E') + return CPE_EXE; + + coff_hdr = (FILHDR *)mybuf; + if (SWAPu16(coff_hdr->f_magic) == 0x0162) + return COFF_EXE; + + return INVALID_EXE; +} + +int Load(const char *ExePath) { + FILE *tmpFile; + EXE_HEADER tmpHead; + int type; + int retval = 0; + u8 opcode; + u32 section_address, section_size; + + strncpy(CdromId, "SLUS99999", 9); + strncpy(CdromLabel, "SLUS_999.99", 11); + + tmpFile = fopen(ExePath, "rb"); + if (tmpFile == NULL) { + SysPrintf(_("Error opening file: %s.\n"), ExePath); + retval = -1; + } else { + type = PSXGetFileType(tmpFile); + switch (type) { + case PSX_EXE: + fread(&tmpHead,sizeof(EXE_HEADER),1,tmpFile); + fseek(tmpFile, 0x800, SEEK_SET); + fread((void *)PSXM(SWAP32(tmpHead.t_addr)), SWAP32(tmpHead.t_size),1,tmpFile); + fclose(tmpFile); + psxRegs.pc = SWAP32(tmpHead.pc0); + psxRegs.GPR.n.gp = SWAP32(tmpHead.gp0); + psxRegs.GPR.n.sp = SWAP32(tmpHead.s_addr); + if (psxRegs.GPR.n.sp == 0) + psxRegs.GPR.n.sp = 0x801fff00; + retval = 0; + break; + case CPE_EXE: + fseek(tmpFile, 6, SEEK_SET); /* Something tells me we should go to 4 and read the "08 00" here... */ + do { + fread(&opcode, 1, 1, tmpFile); + switch (opcode) { + case 1: /* Section loading */ + fread(§ion_address, 4, 1, tmpFile); + fread(§ion_size, 4, 1, tmpFile); + section_address = SWAPu32(section_address); + section_size = SWAPu32(section_size); +#ifdef EMU_LOG + EMU_LOG("Loading %08X bytes from %08X to %08X\n", section_size, ftell(tmpFile), section_address); +#endif + fread(PSXM(section_address), section_size, 1, tmpFile); + break; + case 3: /* register loading (PC only?) */ + fseek(tmpFile, 2, SEEK_CUR); /* unknown field */ + fread(&psxRegs.pc, 4, 1, tmpFile); + psxRegs.pc = SWAPu32(psxRegs.pc); + break; + case 0: /* End of file */ + break; + default: + SysPrintf(_("Unknown CPE opcode %02x at position %08x.\n"), opcode, ftell(tmpFile) - 1); + retval = -1; + break; + } + } while (opcode != 0 && retval == 0); + break; + case COFF_EXE: + SysPrintf(_("COFF files not supported.\n")); + retval = -1; + break; + case INVALID_EXE: + SysPrintf(_("This file does not appear to be a valid PSX file.\n")); + retval = -1; + break; + } + } + + if (retval != 0) { + CdromId[0] = '\0'; + CdromLabel[0] = '\0'; + } + + return retval; +} + +// STATES + +static const char PcsxHeader[32] = "STv4 PCSX v" PACKAGE_VERSION; + +// Savestate Versioning! +// If you make changes to the savestate version, please increment the value below. +static const u32 SaveVersion = 0x8b410004; + +int SaveState(const char *file) { + gzFile f; + GPUFreeze_t *gpufP; + SPUFreeze_t *spufP; + int Size; + unsigned char *pMem; + + f = gzopen(file, "wb"); + if (f == NULL) return -1; + + gzwrite(f, (void *)PcsxHeader, 32); + gzwrite(f, (void *)&SaveVersion, sizeof(u32)); + gzwrite(f, (void *)&Config.HLE, sizeof(boolean)); + + pMem = (unsigned char *)malloc(128 * 96 * 3); + if (pMem == NULL) return -1; + GPU_getScreenPic(pMem); + gzwrite(f, pMem, 128 * 96 * 3); + free(pMem); + + if (Config.HLE) + psxBiosFreeze(1); + + gzwrite(f, psxM, 0x00200000); + gzwrite(f, psxR, 0x00080000); + gzwrite(f, psxH, 0x00010000); + gzwrite(f, (void *)&psxRegs, sizeof(psxRegs)); + + // gpu + gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t)); + gpufP->ulFreezeVersion = 1; + GPU_freeze(1, gpufP); + gzwrite(f, gpufP, sizeof(GPUFreeze_t)); + free(gpufP); + + // spu + spufP = (SPUFreeze_t *) malloc(16); + SPU_freeze(2, spufP); + Size = spufP->Size; gzwrite(f, &Size, 4); + free(spufP); + spufP = (SPUFreeze_t *) malloc(Size); + SPU_freeze(1, spufP); + gzwrite(f, spufP, Size); + free(spufP); + + sioFreeze(f, 1); + cdrFreeze(f, 1); + psxHwFreeze(f, 1); + psxRcntFreeze(f, 1); + mdecFreeze(f, 1); + + gzclose(f); + + return 0; +} + +int LoadState(const char *file) { + gzFile f; + GPUFreeze_t *gpufP; + SPUFreeze_t *spufP; + int Size; + char header[32]; + u32 version; + boolean hle; + + f = gzopen(file, "rb"); + if (f == NULL) return -1; + + gzread(f, header, sizeof(header)); + gzread(f, &version, sizeof(u32)); + gzread(f, &hle, sizeof(boolean)); + + if (strncmp("STv4 PCSX", header, 9) != 0 || version != SaveVersion || hle != Config.HLE) { + gzclose(f); + return -1; + } + + psxCpu->Reset(); + gzseek(f, 128 * 96 * 3, SEEK_CUR); + + gzread(f, psxM, 0x00200000); + gzread(f, psxR, 0x00080000); + gzread(f, psxH, 0x00010000); + gzread(f, (void *)&psxRegs, sizeof(psxRegs)); + + if (Config.HLE) + psxBiosFreeze(0); + + // gpu + gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t)); + gzread(f, gpufP, sizeof(GPUFreeze_t)); + GPU_freeze(0, gpufP); + free(gpufP); + + // spu + gzread(f, &Size, 4); + spufP = (SPUFreeze_t *)malloc(Size); + gzread(f, spufP, Size); + SPU_freeze(0, spufP); + free(spufP); + + sioFreeze(f, 0); + cdrFreeze(f, 0); + psxHwFreeze(f, 0); + psxRcntFreeze(f, 0); + mdecFreeze(f, 0); + + gzclose(f); + + return 0; +} + +int CheckState(const char *file) { + gzFile f; + char header[32]; + u32 version; + boolean hle; + + f = gzopen(file, "rb"); + if (f == NULL) return -1; + + gzread(f, header, sizeof(header)); + gzread(f, &version, sizeof(u32)); + gzread(f, &hle, sizeof(boolean)); + + gzclose(f); + + if (strncmp("STv4 PCSX", header, 9) != 0 || version != SaveVersion || hle != Config.HLE) + return -1; + + return 0; +} + +// NET Function Helpers + +int SendPcsxInfo() { + if (NET_recvData == NULL || NET_sendData == NULL) + return 0; + + NET_sendData(&Config.Xa, sizeof(Config.Xa), PSE_NET_BLOCKING); + NET_sendData(&Config.Sio, sizeof(Config.Sio), PSE_NET_BLOCKING); + NET_sendData(&Config.SpuIrq, sizeof(Config.SpuIrq), PSE_NET_BLOCKING); + NET_sendData(&Config.RCntFix, sizeof(Config.RCntFix), PSE_NET_BLOCKING); + NET_sendData(&Config.PsxType, sizeof(Config.PsxType), PSE_NET_BLOCKING); + NET_sendData(&Config.Cpu, sizeof(Config.Cpu), PSE_NET_BLOCKING); + + return 0; +} + +int RecvPcsxInfo() { + int tmp; + + if (NET_recvData == NULL || NET_sendData == NULL) + return 0; + + NET_recvData(&Config.Xa, sizeof(Config.Xa), PSE_NET_BLOCKING); + NET_recvData(&Config.Sio, sizeof(Config.Sio), PSE_NET_BLOCKING); + NET_recvData(&Config.SpuIrq, sizeof(Config.SpuIrq), PSE_NET_BLOCKING); + NET_recvData(&Config.RCntFix, sizeof(Config.RCntFix), PSE_NET_BLOCKING); + NET_recvData(&Config.PsxType, sizeof(Config.PsxType), PSE_NET_BLOCKING); + + SysUpdate(); + + tmp = Config.Cpu; + NET_recvData(&Config.Cpu, sizeof(Config.Cpu), PSE_NET_BLOCKING); + if (tmp != Config.Cpu) { + psxCpu->Shutdown(); +#ifdef PSXREC + if (Config.Cpu == CPU_INTERPRETER) psxCpu = &psxInt; + else psxCpu = &psxRec; +#else + psxCpu = &psxInt; +#endif + if (psxCpu->Init() == -1) { + SysClose(); return -1; + } + psxCpu->Reset(); + } + + return 0; +} + +// remove the leading and trailing spaces in a string +void trim(char *str) { + int pos = 0; + char *dest = str; + + // skip leading blanks + while (str[pos] <= ' ' && str[pos] > 0) + pos++; + + while (str[pos]) { + *(dest++) = str[pos]; + pos++; + } + + *(dest--) = '\0'; // store the null + + // remove trailing blanks + while (dest >= str && *dest <= ' ' && *dest > 0) + *(dest--) = '\0'; +} + +// lookup table for crc calculation +static unsigned short crctab[256] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, + 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, + 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, + 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, + 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, + 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, + 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, + 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, + 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, + 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, + 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, + 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, + 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, + 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, + 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, + 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, + 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, + 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, + 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, + 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, + 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, + 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, + 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, + 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, + 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, + 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 +}; + +u16 calcCrc(u8 *d, int len) { + u16 crc = 0; + int i; + + for (i = 0; i < len; i++) { + crc = crctab[(crc >> 8) ^ d[i]] ^ (crc << 8); + } + + return ~crc; +} diff --git a/libpcsxcore/misc.h b/libpcsxcore/misc.h new file mode 100644 index 0000000..ae3fc81 --- /dev/null +++ b/libpcsxcore/misc.h @@ -0,0 +1,77 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __MISC_H__ +#define __MISC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" +#include "coff.h" +#include "plugins.h" +#include "r3000a.h" +#include "psxmem.h" + +#undef s_addr + +typedef struct { + unsigned char id[8]; + u32 text; + u32 data; + u32 pc0; + u32 gp0; + u32 t_addr; + u32 t_size; + u32 d_addr; + u32 d_size; + u32 b_addr; + u32 b_size; + u32 s_addr; + u32 s_size; + u32 SavedSP; + u32 SavedFP; + u32 SavedGP; + u32 SavedRA; + u32 SavedS0; +} EXE_HEADER; + +extern char CdromId[10]; +extern char CdromLabel[33]; + +int LoadCdrom(); +int LoadCdromFile(const char *filename, EXE_HEADER *head); +int CheckCdrom(); +int Load(const char *ExePath); + +int SaveState(const char *file); +int LoadState(const char *file); +int CheckState(const char *file); + +int SendPcsxInfo(); +int RecvPcsxInfo(); + +void trim(char *str); +u16 calcCrc(u8 *d, int len); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/plugins.c b/libpcsxcore/plugins.c new file mode 100644 index 0000000..f965e0d --- /dev/null +++ b/libpcsxcore/plugins.c @@ -0,0 +1,815 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* Plugin library callback/access functions. +*/ + +#include "plugins.h" +#include "cdriso.h" + +static char IsoFile[MAXPATHLEN] = ""; +static s64 cdOpenCaseTime = 0; + +GPUupdateLace GPU_updateLace; +GPUinit GPU_init; +GPUshutdown GPU_shutdown; +GPUconfigure GPU_configure; +GPUtest GPU_test; +GPUabout GPU_about; +GPUopen GPU_open; +GPUclose GPU_close; +GPUreadStatus GPU_readStatus; +GPUreadData GPU_readData; +GPUreadDataMem GPU_readDataMem; +GPUwriteStatus GPU_writeStatus; +GPUwriteData GPU_writeData; +GPUwriteDataMem GPU_writeDataMem; +GPUdmaChain GPU_dmaChain; +GPUkeypressed GPU_keypressed; +GPUdisplayText GPU_displayText; +GPUmakeSnapshot GPU_makeSnapshot; +GPUfreeze GPU_freeze; +GPUgetScreenPic GPU_getScreenPic; +GPUshowScreenPic GPU_showScreenPic; +GPUclearDynarec GPU_clearDynarec; +GPUvBlank GPU_vBlank; + +CDRinit CDR_init; +CDRshutdown CDR_shutdown; +CDRopen CDR_open; +CDRclose CDR_close; +CDRtest CDR_test; +CDRgetTN CDR_getTN; +CDRgetTD CDR_getTD; +CDRreadTrack CDR_readTrack; +CDRgetBuffer CDR_getBuffer; +CDRplay CDR_play; +CDRstop CDR_stop; +CDRgetStatus CDR_getStatus; +CDRgetDriveLetter CDR_getDriveLetter; +CDRgetBufferSub CDR_getBufferSub; +CDRconfigure CDR_configure; +CDRabout CDR_about; +CDRsetfilename CDR_setfilename; +CDRreadCDDA CDR_readCDDA; +CDRgetTE CDR_getTE; + +SPUconfigure SPU_configure; +SPUabout SPU_about; +SPUinit SPU_init; +SPUshutdown SPU_shutdown; +SPUtest SPU_test; +SPUopen SPU_open; +SPUclose SPU_close; +SPUplaySample SPU_playSample; +SPUwriteRegister SPU_writeRegister; +SPUreadRegister SPU_readRegister; +SPUwriteDMA SPU_writeDMA; +SPUreadDMA SPU_readDMA; +SPUwriteDMAMem SPU_writeDMAMem; +SPUreadDMAMem SPU_readDMAMem; +SPUplayADPCMchannel SPU_playADPCMchannel; +SPUfreeze SPU_freeze; +SPUregisterCallback SPU_registerCallback; +SPUasync SPU_async; +SPUplayCDDAchannel SPU_playCDDAchannel; + +PADconfigure PAD1_configure; +PADabout PAD1_about; +PADinit PAD1_init; +PADshutdown PAD1_shutdown; +PADtest PAD1_test; +PADopen PAD1_open; +PADclose PAD1_close; +PADquery PAD1_query; +PADreadPort1 PAD1_readPort1; +PADkeypressed PAD1_keypressed; +PADstartPoll PAD1_startPoll; +PADpoll PAD1_poll; +PADsetSensitive PAD1_setSensitive; + +PADconfigure PAD2_configure; +PADabout PAD2_about; +PADinit PAD2_init; +PADshutdown PAD2_shutdown; +PADtest PAD2_test; +PADopen PAD2_open; +PADclose PAD2_close; +PADquery PAD2_query; +PADreadPort2 PAD2_readPort2; +PADkeypressed PAD2_keypressed; +PADstartPoll PAD2_startPoll; +PADpoll PAD2_poll; +PADsetSensitive PAD2_setSensitive; + +NETinit NET_init; +NETshutdown NET_shutdown; +NETopen NET_open; +NETclose NET_close; +NETtest NET_test; +NETconfigure NET_configure; +NETabout NET_about; +NETpause NET_pause; +NETresume NET_resume; +NETqueryPlayer NET_queryPlayer; +NETsendData NET_sendData; +NETrecvData NET_recvData; +NETsendPadData NET_sendPadData; +NETrecvPadData NET_recvPadData; +NETsetInfo NET_setInfo; +NETkeypressed NET_keypressed; + +#ifdef ENABLE_SIO1API + +SIO1init SIO1_init; +SIO1shutdown SIO1_shutdown; +SIO1open SIO1_open; +SIO1close SIO1_close; +SIO1test SIO1_test; +SIO1configure SIO1_configure; +SIO1about SIO1_about; +SIO1pause SIO1_pause; +SIO1resume SIO1_resume; +SIO1keypressed SIO1_keypressed; +SIO1writeData8 SIO1_writeData8; +SIO1writeData16 SIO1_writeData16; +SIO1writeData32 SIO1_writeData32; +SIO1writeStat16 SIO1_writeStat16; +SIO1writeStat32 SIO1_writeStat32; +SIO1writeMode16 SIO1_writeMode16; +SIO1writeMode32 SIO1_writeMode32; +SIO1writeCtrl16 SIO1_writeCtrl16; +SIO1writeCtrl32 SIO1_writeCtrl32; +SIO1writeBaud16 SIO1_writeBaud16; +SIO1writeBaud32 SIO1_writeBaud32; +SIO1readData8 SIO1_readData8; +SIO1readData16 SIO1_readData16; +SIO1readData32 SIO1_readData32; +SIO1readStat16 SIO1_readStat16; +SIO1readStat32 SIO1_readStat32; +SIO1readMode16 SIO1_readMode16; +SIO1readMode32 SIO1_readMode32; +SIO1readCtrl16 SIO1_readCtrl16; +SIO1readCtrl32 SIO1_readCtrl32; +SIO1readBaud16 SIO1_readBaud16; +SIO1readBaud32 SIO1_readBaud32; +SIO1registerCallback SIO1_registerCallback; + +#endif + +static const char *err; + +#define CheckErr(func) { \ + err = SysLibError(); \ + if (err != NULL) { SysMessage(_("Error loading %s: %s"), func, err); return -1; } \ +} + +#define LoadSym(dest, src, name, checkerr) { \ + dest = (src)SysLoadSym(drv, name); \ + if (checkerr) { CheckErr(name); } else SysLibError(); \ +} + +void *hGPUDriver = NULL; + +void CALLBACK GPU__displayText(char *pText) { + SysPrintf("%s\n", pText); +} + +long CALLBACK GPU__configure(void) { return 0; } +long CALLBACK GPU__test(void) { return 0; } +void CALLBACK GPU__about(void) {} +void CALLBACK GPU__makeSnapshot(void) {} +void CALLBACK GPU__keypressed(int key) {} +long CALLBACK GPU__getScreenPic(unsigned char *pMem) { return -1; } +long CALLBACK GPU__showScreenPic(unsigned char *pMem) { return -1; } +void CALLBACK GPU__clearDynarec(void (CALLBACK *callback)(void)) {} +void CALLBACK GPU__vBlank(int val) {} + +#define LoadGpuSym1(dest, name) \ + LoadSym(GPU_##dest, GPU##dest, name, TRUE); + +#define LoadGpuSym0(dest, name) \ + LoadSym(GPU_##dest, GPU##dest, name, FALSE); \ + if (GPU_##dest == NULL) GPU_##dest = (GPU##dest) GPU__##dest; + +#define LoadGpuSymN(dest, name) \ + LoadSym(GPU_##dest, GPU##dest, name, FALSE); + +static int LoadGPUplugin(const char *GPUdll) { + void *drv; + + hGPUDriver = SysLoadLibrary(GPUdll); + if (hGPUDriver == NULL) { + GPU_configure = NULL; + SysMessage (_("Could not load GPU plugin %s!"), GPUdll); return -1; + } + drv = hGPUDriver; + LoadGpuSym1(init, "GPUinit"); + LoadGpuSym1(shutdown, "GPUshutdown"); + LoadGpuSym1(open, "GPUopen"); + LoadGpuSym1(close, "GPUclose"); + LoadGpuSym1(readData, "GPUreadData"); + LoadGpuSym1(readDataMem, "GPUreadDataMem"); + LoadGpuSym1(readStatus, "GPUreadStatus"); + LoadGpuSym1(writeData, "GPUwriteData"); + LoadGpuSym1(writeDataMem, "GPUwriteDataMem"); + LoadGpuSym1(writeStatus, "GPUwriteStatus"); + LoadGpuSym1(dmaChain, "GPUdmaChain"); + LoadGpuSym1(updateLace, "GPUupdateLace"); + LoadGpuSym0(keypressed, "GPUkeypressed"); + LoadGpuSym0(displayText, "GPUdisplayText"); + LoadGpuSym0(makeSnapshot, "GPUmakeSnapshot"); + LoadGpuSym1(freeze, "GPUfreeze"); + LoadGpuSym0(getScreenPic, "GPUgetScreenPic"); + LoadGpuSym0(showScreenPic, "GPUshowScreenPic"); + LoadGpuSym0(clearDynarec, "GPUclearDynarec"); + LoadGpuSym0(vBlank, "GPUvBlank"); + LoadGpuSym0(configure, "GPUconfigure"); + LoadGpuSym0(test, "GPUtest"); + LoadGpuSym0(about, "GPUabout"); + + return 0; +} + +void *hCDRDriver = NULL; + +long CALLBACK CDR__play(unsigned char *sector) { return 0; } +long CALLBACK CDR__stop(void) { return 0; } + +long CALLBACK CDR__getStatus(struct CdrStat *stat) { + if (cdOpenCaseTime < 0 || cdOpenCaseTime > (s64)time(NULL)) + stat->Status = 0x10; + else + stat->Status = 0; + + return 0; +} + +char* CALLBACK CDR__getDriveLetter(void) { return NULL; } +long CALLBACK CDR__configure(void) { return 0; } +long CALLBACK CDR__test(void) { return 0; } +void CALLBACK CDR__about(void) {} +long CALLBACK CDR__setfilename(char*filename) { return 0; } + +#define LoadCdrSym1(dest, name) \ + LoadSym(CDR_##dest, CDR##dest, name, TRUE); + +#define LoadCdrSym0(dest, name) \ + LoadSym(CDR_##dest, CDR##dest, name, FALSE); \ + if (CDR_##dest == NULL) CDR_##dest = (CDR##dest) CDR__##dest; + +#define LoadCdrSymN(dest, name) \ + LoadSym(CDR_##dest, CDR##dest, name, FALSE); + +static int LoadCDRplugin(const char *CDRdll) { + void *drv; + + if (CDRdll == NULL) { + cdrIsoInit(); + return 0; + } + + hCDRDriver = SysLoadLibrary(CDRdll); + if (hCDRDriver == NULL) { + CDR_configure = NULL; + SysMessage (_("Could not load CD-ROM plugin %s!"), CDRdll); return -1; + } + drv = hCDRDriver; + LoadCdrSym1(init, "CDRinit"); + LoadCdrSym1(shutdown, "CDRshutdown"); + LoadCdrSym1(open, "CDRopen"); + LoadCdrSym1(close, "CDRclose"); + LoadCdrSym1(getTN, "CDRgetTN"); + LoadCdrSym1(getTD, "CDRgetTD"); + LoadCdrSym1(readTrack, "CDRreadTrack"); + LoadCdrSym1(getBuffer, "CDRgetBuffer"); + LoadCdrSym1(getBufferSub, "CDRgetBufferSub"); + LoadCdrSym0(play, "CDRplay"); + LoadCdrSym0(stop, "CDRstop"); + LoadCdrSym0(getStatus, "CDRgetStatus"); + LoadCdrSym0(getDriveLetter, "CDRgetDriveLetter"); + LoadCdrSym0(configure, "CDRconfigure"); + LoadCdrSym0(test, "CDRtest"); + LoadCdrSym0(about, "CDRabout"); + LoadCdrSym0(setfilename, "CDRsetfilename"); + LoadCdrSymN(readCDDA, "CDRreadCDDA"); + LoadCdrSymN(getTE, "CDRgetTE"); + + return 0; +} + +void *hSPUDriver = NULL; + +long CALLBACK SPU__configure(void) { return 0; } +void CALLBACK SPU__about(void) {} +long CALLBACK SPU__test(void) { return 0; } + +#define LoadSpuSym1(dest, name) \ + LoadSym(SPU_##dest, SPU##dest, name, TRUE); + +#define LoadSpuSym0(dest, name) \ + LoadSym(SPU_##dest, SPU##dest, name, FALSE); \ + if (SPU_##dest == NULL) SPU_##dest = (SPU##dest) SPU__##dest; + +#define LoadSpuSymN(dest, name) \ + LoadSym(SPU_##dest, SPU##dest, name, FALSE); + +static int LoadSPUplugin(const char *SPUdll) { + void *drv; + + hSPUDriver = SysLoadLibrary(SPUdll); + if (hSPUDriver == NULL) { + SPU_configure = NULL; + SysMessage (_("Could not load SPU plugin %s!"), SPUdll); return -1; + } + drv = hSPUDriver; + LoadSpuSym1(init, "SPUinit"); + LoadSpuSym1(shutdown, "SPUshutdown"); + LoadSpuSym1(open, "SPUopen"); + LoadSpuSym1(close, "SPUclose"); + LoadSpuSym0(configure, "SPUconfigure"); + LoadSpuSym0(about, "SPUabout"); + LoadSpuSym0(test, "SPUtest"); + LoadSpuSym1(writeRegister, "SPUwriteRegister"); + LoadSpuSym1(readRegister, "SPUreadRegister"); + LoadSpuSym1(writeDMA, "SPUwriteDMA"); + LoadSpuSym1(readDMA, "SPUreadDMA"); + LoadSpuSym1(writeDMAMem, "SPUwriteDMAMem"); + LoadSpuSym1(readDMAMem, "SPUreadDMAMem"); + LoadSpuSym1(playADPCMchannel, "SPUplayADPCMchannel"); + LoadSpuSym1(freeze, "SPUfreeze"); + LoadSpuSym1(registerCallback, "SPUregisterCallback"); + LoadSpuSymN(async, "SPUasync"); + LoadSpuSymN(playCDDAchannel, "SPUplayCDDAchannel"); + + return 0; +} + +void *hPAD1Driver = NULL; +void *hPAD2Driver = NULL; + +static unsigned char buf[256]; +unsigned char stdpar[10] = { 0x00, 0x41, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; +unsigned char mousepar[8] = { 0x00, 0x12, 0x5a, 0xff, 0xff, 0xff, 0xff }; +unsigned char analogpar[9] = { 0x00, 0xff, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + +static int bufcount, bufc; + +PadDataS padd1, padd2; + +unsigned char _PADstartPoll(PadDataS *pad) { + bufc = 0; + + switch (pad->controllerType) { + case PSE_PAD_TYPE_MOUSE: + mousepar[3] = pad->buttonStatus & 0xff; + mousepar[4] = pad->buttonStatus >> 8; + mousepar[5] = pad->moveX; + mousepar[6] = pad->moveY; + + memcpy(buf, mousepar, 7); + bufcount = 6; + break; + case PSE_PAD_TYPE_NEGCON: // npc101/npc104(slph00001/slph00069) + analogpar[1] = 0x23; + analogpar[3] = pad->buttonStatus & 0xff; + analogpar[4] = pad->buttonStatus >> 8; + analogpar[5] = pad->rightJoyX; + analogpar[6] = pad->rightJoyY; + analogpar[7] = pad->leftJoyX; + analogpar[8] = pad->leftJoyY; + + memcpy(buf, analogpar, 9); + bufcount = 8; + break; + case PSE_PAD_TYPE_ANALOGPAD: // scph1150 + analogpar[1] = 0x73; + analogpar[3] = pad->buttonStatus & 0xff; + analogpar[4] = pad->buttonStatus >> 8; + analogpar[5] = pad->rightJoyX; + analogpar[6] = pad->rightJoyY; + analogpar[7] = pad->leftJoyX; + analogpar[8] = pad->leftJoyY; + + memcpy(buf, analogpar, 9); + bufcount = 8; + break; + case PSE_PAD_TYPE_ANALOGJOY: // scph1110 + analogpar[1] = 0x53; + analogpar[3] = pad->buttonStatus & 0xff; + analogpar[4] = pad->buttonStatus >> 8; + analogpar[5] = pad->rightJoyX; + analogpar[6] = pad->rightJoyY; + analogpar[7] = pad->leftJoyX; + analogpar[8] = pad->leftJoyY; + + memcpy(buf, analogpar, 9); + bufcount = 8; + break; + case PSE_PAD_TYPE_STANDARD: + default: + stdpar[3] = pad->buttonStatus & 0xff; + stdpar[4] = pad->buttonStatus >> 8; + + memcpy(buf, stdpar, 5); + bufcount = 4; + } + + return buf[bufc++]; +} + +unsigned char _PADpoll(unsigned char value) { + if (bufc > bufcount) return 0; + return buf[bufc++]; +} + +unsigned char CALLBACK PAD1__startPoll(int pad) { + PadDataS padd; + + PAD1_readPort1(&padd); + + return _PADstartPoll(&padd); +} + +unsigned char CALLBACK PAD1__poll(unsigned char value) { + return _PADpoll(value); +} + +long CALLBACK PAD1__configure(void) { return 0; } +void CALLBACK PAD1__about(void) {} +long CALLBACK PAD1__test(void) { return 0; } +long CALLBACK PAD1__query(void) { return 3; } +long CALLBACK PAD1__keypressed() { return 0; } + +#define LoadPad1Sym1(dest, name) \ + LoadSym(PAD1_##dest, PAD##dest, name, TRUE); + +#define LoadPad1SymN(dest, name) \ + LoadSym(PAD1_##dest, PAD##dest, name, FALSE); + +#define LoadPad1Sym0(dest, name) \ + LoadSym(PAD1_##dest, PAD##dest, name, FALSE); \ + if (PAD1_##dest == NULL) PAD1_##dest = (PAD##dest) PAD1__##dest; + +static int LoadPAD1plugin(const char *PAD1dll) { + void *drv; + + hPAD1Driver = SysLoadLibrary(PAD1dll); + if (hPAD1Driver == NULL) { + PAD1_configure = NULL; + SysMessage (_("Could not load Controller 1 plugin %s!"), PAD1dll); return -1; + } + drv = hPAD1Driver; + LoadPad1Sym1(init, "PADinit"); + LoadPad1Sym1(shutdown, "PADshutdown"); + LoadPad1Sym1(open, "PADopen"); + LoadPad1Sym1(close, "PADclose"); + LoadPad1Sym0(query, "PADquery"); + LoadPad1Sym1(readPort1, "PADreadPort1"); + LoadPad1Sym0(configure, "PADconfigure"); + LoadPad1Sym0(test, "PADtest"); + LoadPad1Sym0(about, "PADabout"); + LoadPad1Sym0(keypressed, "PADkeypressed"); + LoadPad1Sym0(startPoll, "PADstartPoll"); + LoadPad1Sym0(poll, "PADpoll"); + LoadPad1SymN(setSensitive, "PADsetSensitive"); + + return 0; +} + +unsigned char CALLBACK PAD2__startPoll(int pad) { + PadDataS padd; + + PAD2_readPort2(&padd); + + return _PADstartPoll(&padd); +} + +unsigned char CALLBACK PAD2__poll(unsigned char value) { + return _PADpoll(value); +} + +long CALLBACK PAD2__configure(void) { return 0; } +void CALLBACK PAD2__about(void) {} +long CALLBACK PAD2__test(void) { return 0; } +long CALLBACK PAD2__query(void) { return PSE_PAD_USE_PORT1 | PSE_PAD_USE_PORT2; } +long CALLBACK PAD2__keypressed() { return 0; } + +#define LoadPad2Sym1(dest, name) \ + LoadSym(PAD2_##dest, PAD##dest, name, TRUE); + +#define LoadPad2Sym0(dest, name) \ + LoadSym(PAD2_##dest, PAD##dest, name, FALSE); \ + if (PAD2_##dest == NULL) PAD2_##dest = (PAD##dest) PAD2__##dest; + +#define LoadPad2SymN(dest, name) \ + LoadSym(PAD2_##dest, PAD##dest, name, FALSE); + +static int LoadPAD2plugin(const char *PAD2dll) { + void *drv; + + hPAD2Driver = SysLoadLibrary(PAD2dll); + if (hPAD2Driver == NULL) { + PAD2_configure = NULL; + SysMessage (_("Could not load Controller 2 plugin %s!"), PAD2dll); return -1; + } + drv = hPAD2Driver; + LoadPad2Sym1(init, "PADinit"); + LoadPad2Sym1(shutdown, "PADshutdown"); + LoadPad2Sym1(open, "PADopen"); + LoadPad2Sym1(close, "PADclose"); + LoadPad2Sym0(query, "PADquery"); + LoadPad2Sym1(readPort2, "PADreadPort2"); + LoadPad2Sym0(configure, "PADconfigure"); + LoadPad2Sym0(test, "PADtest"); + LoadPad2Sym0(about, "PADabout"); + LoadPad2Sym0(keypressed, "PADkeypressed"); + LoadPad2Sym0(startPoll, "PADstartPoll"); + LoadPad2Sym0(poll, "PADpoll"); + LoadPad2SymN(setSensitive, "PADsetSensitive"); + + return 0; +} + +void *hNETDriver = NULL; + +void CALLBACK NET__setInfo(netInfo *info) {} +void CALLBACK NET__keypressed(int key) {} +long CALLBACK NET__configure(void) { return 0; } +long CALLBACK NET__test(void) { return 0; } +void CALLBACK NET__about(void) {} + +#define LoadNetSym1(dest, name) \ + LoadSym(NET_##dest, NET##dest, name, TRUE); + +#define LoadNetSymN(dest, name) \ + LoadSym(NET_##dest, NET##dest, name, FALSE); + +#define LoadNetSym0(dest, name) \ + LoadSym(NET_##dest, NET##dest, name, FALSE); \ + if (NET_##dest == NULL) NET_##dest = (NET##dest) NET__##dest; + +static int LoadNETplugin(const char *NETdll) { + void *drv; + + hNETDriver = SysLoadLibrary(NETdll); + if (hNETDriver == NULL) { + SysMessage (_("Could not load NetPlay plugin %s!"), NETdll); return -1; + } + drv = hNETDriver; + LoadNetSym1(init, "NETinit"); + LoadNetSym1(shutdown, "NETshutdown"); + LoadNetSym1(open, "NETopen"); + LoadNetSym1(close, "NETclose"); + LoadNetSymN(sendData, "NETsendData"); + LoadNetSymN(recvData, "NETrecvData"); + LoadNetSym1(sendPadData, "NETsendPadData"); + LoadNetSym1(recvPadData, "NETrecvPadData"); + LoadNetSym1(queryPlayer, "NETqueryPlayer"); + LoadNetSym1(pause, "NETpause"); + LoadNetSym1(resume, "NETresume"); + LoadNetSym0(setInfo, "NETsetInfo"); + LoadNetSym0(keypressed, "NETkeypressed"); + LoadNetSym0(configure, "NETconfigure"); + LoadNetSym0(test, "NETtest"); + LoadNetSym0(about, "NETabout"); + + return 0; +} + +#ifdef ENABLE_SIO1API + +void *hSIO1Driver = NULL; + +long CALLBACK SIO1__init(void) { return 0; } +long CALLBACK SIO1__shutdown(void) { return 0; } +long CALLBACK SIO1__open(void) { return 0; } +long CALLBACK SIO1__close(void) { return 0; } +long CALLBACK SIO1__configure(void) { return 0; } +long CALLBACK SIO1__test(void) { return 0; } +void CALLBACK SIO1__about(void) {} +void CALLBACK SIO1__pause(void) {} +void CALLBACK SIO1__resume(void) {} +long CALLBACK SIO1__keypressed(int key) { return 0; } +void CALLBACK SIO1__writeData8(unsigned char val) {} +void CALLBACK SIO1__writeData16(unsigned short val) {} +void CALLBACK SIO1__writeData32(unsigned long val) {} +void CALLBACK SIO1__writeStat16(unsigned short val) {} +void CALLBACK SIO1__writeStat32(unsigned long val) {} +void CALLBACK SIO1__writeMode16(unsigned short val) {} +void CALLBACK SIO1__writeMode32(unsigned long val) {} +void CALLBACK SIO1__writeCtrl16(unsigned short val) {} +void CALLBACK SIO1__writeCtrl32(unsigned long val) {} +void CALLBACK SIO1__writeBaud16(unsigned short val) {} +void CALLBACK SIO1__writeBaud32(unsigned long val) {} +unsigned char CALLBACK SIO1__readData8(void) { return 0; } +unsigned short CALLBACK SIO1__readData16(void) { return 0; } +unsigned long CALLBACK SIO1__readData32(void) { return 0; } +unsigned short CALLBACK SIO1__readStat16(void) { return 0; } +unsigned long CALLBACK SIO1__readStat32(void) { return 0; } +unsigned short CALLBACK SIO1__readMode16(void) { return 0; } +unsigned long CALLBACK SIO1__readMode32(void) { return 0; } +unsigned short CALLBACK SIO1__readCtrl16(void) { return 0; } +unsigned long CALLBACK SIO1__readCtrl32(void) { return 0; } +unsigned short CALLBACK SIO1__readBaud16(void) { return 0; } +unsigned long CALLBACK SIO1__readBaud32(void) { return 0; } +void CALLBACK SIO1__registerCallback(void (CALLBACK *callback)(void)) {}; + +void CALLBACK SIO1irq(void) { + psxHu32ref(0x1070) |= SWAPu32(0x100); +} + +#define LoadSio1Sym1(dest, name) \ + LoadSym(SIO1_##dest, SIO1##dest, name, TRUE); + +#define LoadSio1SymN(dest, name) \ + LoadSym(SIO1_##dest, SIO1##dest, name, FALSE); + +#define LoadSio1Sym0(dest, name) \ + LoadSym(SIO1_##dest, SIO1##dest, name, FALSE); \ + if (SIO1_##dest == NULL) SIO1_##dest = (SIO1##dest) SIO1__##dest; + +static int LoadSIO1plugin(const char *SIO1dll) { + void *drv; + + hSIO1Driver = SysLoadLibrary(SIO1dll); + if (hSIO1Driver == NULL) { + SysMessage (_("Could not load SIO1 plugin %s!"), SIO1dll); return -1; + } + drv = hSIO1Driver; + + LoadSio1Sym0(init, "SIO1init"); + LoadSio1Sym0(shutdown, "SIO1shutdown"); + LoadSio1Sym0(open, "SIO1open"); + LoadSio1Sym0(close, "SIO1close"); + LoadSio1Sym0(pause, "SIO1pause"); + LoadSio1Sym0(resume, "SIO1resume"); + LoadSio1Sym0(keypressed, "SIO1keypressed"); + LoadSio1Sym0(configure, "SIO1configure"); + LoadSio1Sym0(test, "SIO1test"); + LoadSio1Sym0(about, "SIO1about"); + LoadSio1Sym0(writeData8, "SIO1writeData8"); + LoadSio1Sym0(writeData16, "SIO1writeData16"); + LoadSio1Sym0(writeData32, "SIO1writeData32"); + LoadSio1Sym0(writeStat16, "SIO1writeStat16"); + LoadSio1Sym0(writeStat32, "SIO1writeStat32"); + LoadSio1Sym0(writeMode16, "SIO1writeMode16"); + LoadSio1Sym0(writeMode32, "SIO1writeMode32"); + LoadSio1Sym0(writeCtrl16, "SIO1writeCtrl16"); + LoadSio1Sym0(writeCtrl32, "SIO1writeCtrl32"); + LoadSio1Sym0(writeBaud16, "SIO1writeBaud16"); + LoadSio1Sym0(writeBaud32, "SIO1writeBaud32"); + LoadSio1Sym0(readData16, "SIO1readData16"); + LoadSio1Sym0(readData32, "SIO1readData32"); + LoadSio1Sym0(readStat16, "SIO1readStat16"); + LoadSio1Sym0(readStat32, "SIO1readStat32"); + LoadSio1Sym0(readMode16, "SIO1readMode16"); + LoadSio1Sym0(readMode32, "SIO1readMode32"); + LoadSio1Sym0(readCtrl16, "SIO1readCtrl16"); + LoadSio1Sym0(readCtrl32, "SIO1readCtrl32"); + LoadSio1Sym0(readBaud16, "SIO1readBaud16"); + LoadSio1Sym0(readBaud32, "SIO1readBaud32"); + LoadSio1Sym0(registerCallback, "SIO1registerCallback"); + + return 0; +} + +#endif + +void CALLBACK clearDynarec(void) { + psxCpu->Reset(); +} + +int LoadPlugins() { + int ret; + char Plugin[MAXPATHLEN]; + + ReleasePlugins(); + + if (UsingIso()) { + LoadCDRplugin(NULL); + } else { + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Cdr); + if (LoadCDRplugin(Plugin) == -1) return -1; + } + + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Gpu); + if (LoadGPUplugin(Plugin) == -1) return -1; + + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Spu); + if (LoadSPUplugin(Plugin) == -1) return -1; + + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Pad1); + if (LoadPAD1plugin(Plugin) == -1) return -1; + + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Pad2); + if (LoadPAD2plugin(Plugin) == -1) return -1; + + if (strcmp("Disabled", Config.Net) == 0 || strcmp("", Config.Net) == 0) + Config.UseNet = FALSE; + else { + Config.UseNet = TRUE; + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Net); + if (LoadNETplugin(Plugin) == -1) Config.UseNet = FALSE; + } + +#ifdef ENABLE_SIO1API + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Sio1); + if (LoadSIO1plugin(Plugin) == -1) return -1; +#endif + + ret = CDR_init(); + if (ret < 0) { SysMessage (_("Error initializing CD-ROM plugin: %d"), ret); return -1; } + ret = GPU_init(); + if (ret < 0) { SysMessage (_("Error initializing GPU plugin: %d"), ret); return -1; } + ret = SPU_init(); + if (ret < 0) { SysMessage (_("Error initializing SPU plugin: %d"), ret); return -1; } + ret = PAD1_init(1); + if (ret < 0) { SysMessage (_("Error initializing Controller 1 plugin: %d"), ret); return -1; } + ret = PAD2_init(2); + if (ret < 0) { SysMessage (_("Error initializing Controller 2 plugin: %d"), ret); return -1; } + + if (Config.UseNet) { + ret = NET_init(); + if (ret < 0) { SysMessage (_("Error initializing NetPlay plugin: %d"), ret); return -1; } + } + +#ifdef ENABLE_SIO1API + ret = SIO1_init(); + if (ret < 0) { SysMessage (_("Error initializing SIO1 plugin: %d"), ret); return -1; } +#endif + + SysPrintf(_("Plugins loaded.\n")); + return 0; +} + +void ReleasePlugins() { + if (Config.UseNet) { + int ret = NET_close(); + if (ret < 0) Config.UseNet = FALSE; + } + NetOpened = FALSE; + + if (hCDRDriver != NULL || cdrIsoActive()) CDR_shutdown(); + if (hGPUDriver != NULL) GPU_shutdown(); + if (hSPUDriver != NULL) SPU_shutdown(); + if (hPAD1Driver != NULL) PAD1_shutdown(); + if (hPAD2Driver != NULL) PAD2_shutdown(); + + if (Config.UseNet && hNETDriver != NULL) NET_shutdown(); + + if (hCDRDriver != NULL) SysCloseLibrary(hCDRDriver); hCDRDriver = NULL; + if (hGPUDriver != NULL) SysCloseLibrary(hGPUDriver); hGPUDriver = NULL; + if (hSPUDriver != NULL) SysCloseLibrary(hSPUDriver); hSPUDriver = NULL; + if (hPAD1Driver != NULL) SysCloseLibrary(hPAD1Driver); hPAD1Driver = NULL; + if (hPAD2Driver != NULL) SysCloseLibrary(hPAD2Driver); hPAD2Driver = NULL; + + if (Config.UseNet && hNETDriver != NULL) { + SysCloseLibrary(hNETDriver); hNETDriver = NULL; + } + +#ifdef ENABLE_SIO1API + if (hSIO1Driver != NULL) { + SIO1_shutdown(); + SysCloseLibrary(hSIO1Driver); + hSIO1Driver = NULL; + } +#endif +} + +void SetIsoFile(const char *filename) { + if (filename == NULL) { + IsoFile[0] = '\0'; + return; + } + strncpy(IsoFile, filename, MAXPATHLEN); +} + +const char *GetIsoFile(void) { + return IsoFile; +} + +boolean UsingIso(void) { + return (IsoFile[0] != '\0'); +} + +void SetCdOpenCaseTime(s64 time) { + cdOpenCaseTime = time; +} diff --git a/libpcsxcore/plugins.h b/libpcsxcore/plugins.h new file mode 100644 index 0000000..9c24ece --- /dev/null +++ b/libpcsxcore/plugins.h @@ -0,0 +1,411 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __PLUGINS_H__ +#define __PLUGINS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" + +//#define ENABLE_SIO1API 1 + +#ifndef _WIN32 + +typedef void* HWND; +#define CALLBACK + +typedef long (*GPUopen)(unsigned long *, char *, char *); +typedef long (*SPUopen)(void); +typedef long (*PADopen)(unsigned long *); +typedef long (*NETopen)(unsigned long *); +typedef long (*SIO1open)(unsigned long *); + +#else + +#include + +typedef long (CALLBACK* GPUopen)(HWND); +typedef long (CALLBACK* SPUopen)(HWND); +typedef long (CALLBACK* PADopen)(HWND); +typedef long (CALLBACK* NETopen)(HWND); +typedef long (CALLBACK* SIO1open)(HWND); + +#endif + +#include "spu.h" + +#include "psemu_plugin_defs.h" +#include "decode_xa.h" + +int LoadPlugins(); +void ReleasePlugins(); +int OpenPlugins(); +void ClosePlugins(); + +typedef unsigned long (CALLBACK* PSEgetLibType)(void); +typedef unsigned long (CALLBACK* PSEgetLibVersion)(void); +typedef char *(CALLBACK* PSEgetLibName)(void); + +// GPU Functions +typedef long (CALLBACK* GPUinit)(void); +typedef long (CALLBACK* GPUshutdown)(void); +typedef long (CALLBACK* GPUclose)(void); +typedef void (CALLBACK* GPUwriteStatus)(uint32_t); +typedef void (CALLBACK* GPUwriteData)(uint32_t); +typedef void (CALLBACK* GPUwriteDataMem)(uint32_t *, int); +typedef uint32_t (CALLBACK* GPUreadStatus)(void); +typedef uint32_t (CALLBACK* GPUreadData)(void); +typedef void (CALLBACK* GPUreadDataMem)(uint32_t *, int); +typedef long (CALLBACK* GPUdmaChain)(uint32_t *,uint32_t); +typedef void (CALLBACK* GPUupdateLace)(void); +typedef long (CALLBACK* GPUconfigure)(void); +typedef long (CALLBACK* GPUtest)(void); +typedef void (CALLBACK* GPUabout)(void); +typedef void (CALLBACK* GPUmakeSnapshot)(void); +typedef void (CALLBACK* GPUkeypressed)(int); +typedef void (CALLBACK* GPUdisplayText)(char *); +typedef struct { + uint32_t ulFreezeVersion; + uint32_t ulStatus; + uint32_t ulControl[256]; + unsigned char psxVRam[1024*512*2]; +} GPUFreeze_t; +typedef long (CALLBACK* GPUfreeze)(uint32_t, GPUFreeze_t *); +typedef long (CALLBACK* GPUgetScreenPic)(unsigned char *); +typedef long (CALLBACK* GPUshowScreenPic)(unsigned char *); +typedef void (CALLBACK* GPUclearDynarec)(void (CALLBACK *callback)(void)); +typedef void (CALLBACK* GPUvBlank)(int); + +// GPU function pointers +extern GPUupdateLace GPU_updateLace; +extern GPUinit GPU_init; +extern GPUshutdown GPU_shutdown; +extern GPUconfigure GPU_configure; +extern GPUtest GPU_test; +extern GPUabout GPU_about; +extern GPUopen GPU_open; +extern GPUclose GPU_close; +extern GPUreadStatus GPU_readStatus; +extern GPUreadData GPU_readData; +extern GPUreadDataMem GPU_readDataMem; +extern GPUwriteStatus GPU_writeStatus; +extern GPUwriteData GPU_writeData; +extern GPUwriteDataMem GPU_writeDataMem; +extern GPUdmaChain GPU_dmaChain; +extern GPUkeypressed GPU_keypressed; +extern GPUdisplayText GPU_displayText; +extern GPUmakeSnapshot GPU_makeSnapshot; +extern GPUfreeze GPU_freeze; +extern GPUgetScreenPic GPU_getScreenPic; +extern GPUshowScreenPic GPU_showScreenPic; +extern GPUclearDynarec GPU_clearDynarec; +extern GPUvBlank GPU_vBlank; + +// CD-ROM Functions +typedef long (CALLBACK* CDRinit)(void); +typedef long (CALLBACK* CDRshutdown)(void); +typedef long (CALLBACK* CDRopen)(void); +typedef long (CALLBACK* CDRclose)(void); +typedef long (CALLBACK* CDRgetTN)(unsigned char *); +typedef long (CALLBACK* CDRgetTD)(unsigned char, unsigned char *); +typedef long (CALLBACK* CDRreadTrack)(unsigned char *); +typedef unsigned char* (CALLBACK* CDRgetBuffer)(void); +typedef unsigned char* (CALLBACK* CDRgetBufferSub)(void); +typedef long (CALLBACK* CDRconfigure)(void); +typedef long (CALLBACK* CDRtest)(void); +typedef void (CALLBACK* CDRabout)(void); +typedef long (CALLBACK* CDRplay)(unsigned char *); +typedef long (CALLBACK* CDRstop)(void); +typedef long (CALLBACK* CDRsetfilename)(char *); +struct CdrStat { + uint32_t Type; + uint32_t Status; + unsigned char Time[3]; +}; +typedef long (CALLBACK* CDRgetStatus)(struct CdrStat *); +typedef char* (CALLBACK* CDRgetDriveLetter)(void); +struct SubQ { + char res0[12]; + unsigned char ControlAndADR; + unsigned char TrackNumber; + unsigned char IndexNumber; + unsigned char TrackRelativeAddress[3]; + unsigned char Filler; + unsigned char AbsoluteAddress[3]; + unsigned char CRC[2]; + char res1[72]; +}; +typedef long (CALLBACK* CDRreadCDDA)(unsigned char, unsigned char, unsigned char, unsigned char *); +typedef long (CALLBACK* CDRgetTE)(unsigned char, unsigned char *, unsigned char *, unsigned char *); + +// CD-ROM function pointers +extern CDRinit CDR_init; +extern CDRshutdown CDR_shutdown; +extern CDRopen CDR_open; +extern CDRclose CDR_close; +extern CDRtest CDR_test; +extern CDRgetTN CDR_getTN; +extern CDRgetTD CDR_getTD; +extern CDRreadTrack CDR_readTrack; +extern CDRgetBuffer CDR_getBuffer; +extern CDRgetBufferSub CDR_getBufferSub; +extern CDRplay CDR_play; +extern CDRstop CDR_stop; +extern CDRgetStatus CDR_getStatus; +extern CDRgetDriveLetter CDR_getDriveLetter; +extern CDRconfigure CDR_configure; +extern CDRabout CDR_about; +extern CDRsetfilename CDR_setfilename; +extern CDRreadCDDA CDR_readCDDA; +extern CDRgetTE CDR_getTE; + +// SPU Functions +typedef long (CALLBACK* SPUinit)(void); +typedef long (CALLBACK* SPUshutdown)(void); +typedef long (CALLBACK* SPUclose)(void); +typedef void (CALLBACK* SPUplaySample)(unsigned char); +typedef void (CALLBACK* SPUwriteRegister)(unsigned long, unsigned short); +typedef unsigned short (CALLBACK* SPUreadRegister)(unsigned long); +typedef void (CALLBACK* SPUwriteDMA)(unsigned short); +typedef unsigned short (CALLBACK* SPUreadDMA)(void); +typedef void (CALLBACK* SPUwriteDMAMem)(unsigned short *, int); +typedef void (CALLBACK* SPUreadDMAMem)(unsigned short *, int); +typedef void (CALLBACK* SPUplayADPCMchannel)(xa_decode_t *); +typedef void (CALLBACK* SPUregisterCallback)(void (CALLBACK *callback)(void)); +typedef long (CALLBACK* SPUconfigure)(void); +typedef long (CALLBACK* SPUtest)(void); +typedef void (CALLBACK* SPUabout)(void); +typedef struct { + unsigned char PluginName[8]; + uint32_t PluginVersion; + uint32_t Size; + unsigned char SPUPorts[0x200]; + unsigned char SPURam[0x80000]; + xa_decode_t xa; + unsigned char *SPUInfo; +} SPUFreeze_t; +typedef long (CALLBACK* SPUfreeze)(uint32_t, SPUFreeze_t *); +typedef void (CALLBACK* SPUasync)(uint32_t); +typedef void (CALLBACK* SPUplayCDDAchannel)(short *, int); + +// SPU function pointers +extern SPUconfigure SPU_configure; +extern SPUabout SPU_about; +extern SPUinit SPU_init; +extern SPUshutdown SPU_shutdown; +extern SPUtest SPU_test; +extern SPUopen SPU_open; +extern SPUclose SPU_close; +extern SPUplaySample SPU_playSample; +extern SPUwriteRegister SPU_writeRegister; +extern SPUreadRegister SPU_readRegister; +extern SPUwriteDMA SPU_writeDMA; +extern SPUreadDMA SPU_readDMA; +extern SPUwriteDMAMem SPU_writeDMAMem; +extern SPUreadDMAMem SPU_readDMAMem; +extern SPUplayADPCMchannel SPU_playADPCMchannel; +extern SPUfreeze SPU_freeze; +extern SPUregisterCallback SPU_registerCallback; +extern SPUasync SPU_async; +extern SPUplayCDDAchannel SPU_playCDDAchannel; + +// PAD Functions +typedef long (CALLBACK* PADconfigure)(void); +typedef void (CALLBACK* PADabout)(void); +typedef long (CALLBACK* PADinit)(long); +typedef long (CALLBACK* PADshutdown)(void); +typedef long (CALLBACK* PADtest)(void); +typedef long (CALLBACK* PADclose)(void); +typedef long (CALLBACK* PADquery)(void); +typedef long (CALLBACK* PADreadPort1)(PadDataS*); +typedef long (CALLBACK* PADreadPort2)(PadDataS*); +typedef long (CALLBACK* PADkeypressed)(void); +typedef unsigned char (CALLBACK* PADstartPoll)(int); +typedef unsigned char (CALLBACK* PADpoll)(unsigned char); +typedef void (CALLBACK* PADsetSensitive)(int); + +// PAD function pointers +extern PADconfigure PAD1_configure; +extern PADabout PAD1_about; +extern PADinit PAD1_init; +extern PADshutdown PAD1_shutdown; +extern PADtest PAD1_test; +extern PADopen PAD1_open; +extern PADclose PAD1_close; +extern PADquery PAD1_query; +extern PADreadPort1 PAD1_readPort1; +extern PADkeypressed PAD1_keypressed; +extern PADstartPoll PAD1_startPoll; +extern PADpoll PAD1_poll; +extern PADsetSensitive PAD1_setSensitive; + +extern PADconfigure PAD2_configure; +extern PADabout PAD2_about; +extern PADinit PAD2_init; +extern PADshutdown PAD2_shutdown; +extern PADtest PAD2_test; +extern PADopen PAD2_open; +extern PADclose PAD2_close; +extern PADquery PAD2_query; +extern PADreadPort2 PAD2_readPort2; +extern PADkeypressed PAD2_keypressed; +extern PADstartPoll PAD2_startPoll; +extern PADpoll PAD2_poll; +extern PADsetSensitive PAD2_setSensitive; + +// NET Functions +typedef long (CALLBACK* NETinit)(void); +typedef long (CALLBACK* NETshutdown)(void); +typedef long (CALLBACK* NETclose)(void); +typedef long (CALLBACK* NETconfigure)(void); +typedef long (CALLBACK* NETtest)(void); +typedef void (CALLBACK* NETabout)(void); +typedef void (CALLBACK* NETpause)(void); +typedef void (CALLBACK* NETresume)(void); +typedef long (CALLBACK* NETqueryPlayer)(void); +typedef long (CALLBACK* NETsendData)(void *, int, int); +typedef long (CALLBACK* NETrecvData)(void *, int, int); +typedef long (CALLBACK* NETsendPadData)(void *, int); +typedef long (CALLBACK* NETrecvPadData)(void *, int); + +typedef struct { + char EmuName[32]; + char CdromID[9]; // ie. 'SCPH12345', no \0 trailing character + char CdromLabel[11]; + void *psxMem; + GPUshowScreenPic GPU_showScreenPic; + GPUdisplayText GPU_displayText; + PADsetSensitive PAD_setSensitive; + char GPUpath[256]; // paths must be absolute + char SPUpath[256]; + char CDRpath[256]; + char MCD1path[256]; + char MCD2path[256]; + char BIOSpath[256]; // 'HLE' for internal bios + char Unused[1024]; +} netInfo; + +typedef long (CALLBACK* NETsetInfo)(netInfo *); +typedef long (CALLBACK* NETkeypressed)(int); + +// NET function pointers +extern NETinit NET_init; +extern NETshutdown NET_shutdown; +extern NETopen NET_open; +extern NETclose NET_close; +extern NETtest NET_test; +extern NETconfigure NET_configure; +extern NETabout NET_about; +extern NETpause NET_pause; +extern NETresume NET_resume; +extern NETqueryPlayer NET_queryPlayer; +extern NETsendData NET_sendData; +extern NETrecvData NET_recvData; +extern NETsendPadData NET_sendPadData; +extern NETrecvPadData NET_recvPadData; +extern NETsetInfo NET_setInfo; +extern NETkeypressed NET_keypressed; + +#ifdef ENABLE_SIO1API + +// SIO1 Functions (link cable) +typedef long (CALLBACK* SIO1init)(void); +typedef long (CALLBACK* SIO1shutdown)(void); +typedef long (CALLBACK* SIO1close)(void); +typedef long (CALLBACK* SIO1configure)(void); +typedef long (CALLBACK* SIO1test)(void); +typedef void (CALLBACK* SIO1about)(void); +typedef void (CALLBACK* SIO1pause)(void); +typedef void (CALLBACK* SIO1resume)(void); +typedef long (CALLBACK* SIO1keypressed)(int); +typedef void (CALLBACK* SIO1writeData8)(unsigned char); +typedef void (CALLBACK* SIO1writeData16)(unsigned short); +typedef void (CALLBACK* SIO1writeData32)(unsigned long); +typedef void (CALLBACK* SIO1writeStat16)(unsigned short); +typedef void (CALLBACK* SIO1writeStat32)(unsigned long); +typedef void (CALLBACK* SIO1writeMode16)(unsigned short); +typedef void (CALLBACK* SIO1writeMode32)(unsigned long); +typedef void (CALLBACK* SIO1writeCtrl16)(unsigned short); +typedef void (CALLBACK* SIO1writeCtrl32)(unsigned long); +typedef void (CALLBACK* SIO1writeBaud16)(unsigned short); +typedef void (CALLBACK* SIO1writeBaud32)(unsigned long); +typedef unsigned char (CALLBACK* SIO1readData8)(void); +typedef unsigned short (CALLBACK* SIO1readData16)(void); +typedef unsigned long (CALLBACK* SIO1readData32)(void); +typedef unsigned short (CALLBACK* SIO1readStat16)(void); +typedef unsigned long (CALLBACK* SIO1readStat32)(void); +typedef unsigned short (CALLBACK* SIO1readMode16)(void); +typedef unsigned long (CALLBACK* SIO1readMode32)(void); +typedef unsigned short (CALLBACK* SIO1readCtrl16)(void); +typedef unsigned long (CALLBACK* SIO1readCtrl32)(void); +typedef unsigned short (CALLBACK* SIO1readBaud16)(void); +typedef unsigned long (CALLBACK* SIO1readBaud32)(void); +typedef void (CALLBACK* SIO1registerCallback)(void (CALLBACK *callback)(void)); + +// SIO1 function pointers +extern SIO1init SIO1_init; +extern SIO1shutdown SIO1_shutdown; +extern SIO1open SIO1_open; +extern SIO1close SIO1_close; +extern SIO1test SIO1_test; +extern SIO1configure SIO1_configure; +extern SIO1about SIO1_about; +extern SIO1pause SIO1_pause; +extern SIO1resume SIO1_resume; +extern SIO1keypressed SIO1_keypressed; +extern SIO1writeData8 SIO1_writeData8; +extern SIO1writeData16 SIO1_writeData16; +extern SIO1writeData32 SIO1_writeData32; +extern SIO1writeStat16 SIO1_writeStat16; +extern SIO1writeStat32 SIO1_writeStat32; +extern SIO1writeMode16 SIO1_writeMode16; +extern SIO1writeMode32 SIO1_writeMode32; +extern SIO1writeCtrl16 SIO1_writeCtrl16; +extern SIO1writeCtrl32 SIO1_writeCtrl32; +extern SIO1writeBaud16 SIO1_writeBaud16; +extern SIO1writeBaud32 SIO1_writeBaud32; +extern SIO1readData8 SIO1_readData8; +extern SIO1readData16 SIO1_readData16; +extern SIO1readData32 SIO1_readData32; +extern SIO1readStat16 SIO1_readStat16; +extern SIO1readStat32 SIO1_readStat32; +extern SIO1readMode16 SIO1_readMode16; +extern SIO1readMode32 SIO1_readMode32; +extern SIO1readCtrl16 SIO1_readCtrl16; +extern SIO1readCtrl32 SIO1_readCtrl32; +extern SIO1readBaud16 SIO1_readBaud16; +extern SIO1readBaud32 SIO1_readBaud32; +extern SIO1registerCallback SIO1_registerCallback; + +#endif + +void CALLBACK clearDynarec(void); + +void SetIsoFile(const char *filename); +const char *GetIsoFile(void); +boolean UsingIso(void); +void SetCdOpenCaseTime(s64 time); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/ppc/pGte.h b/libpcsxcore/ppc/pGte.h new file mode 100644 index 0000000..a968460 --- /dev/null +++ b/libpcsxcore/ppc/pGte.h @@ -0,0 +1,91 @@ +/* Pcsx - Pc Psx Emulator + * Copyright (C) 1999-2003 Pcsx Team + * + * This program is free software; you can redistribute it and/or modify + * it 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; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA + */ + +#ifndef PGET_H +#define PGET_H + +#ifdef __cplusplus +extern "C" { +#endif + +int psxCP2time[64] = { + 2, 16 , 1 , 1, 1, 1 , 8, 1, // 00 + 1 , 1 , 1 , 1, 6 , 1 , 1 , 1, // 08 + 8 , 8, 8, 19, 13 , 1 , 44 , 1, // 10 + 1 , 1 , 1 , 17, 11 , 1 , 14 , 1, // 18 + 30 , 1 , 1 , 1, 1, 1 , 1 , 1, // 20 + 5 , 8 , 17 , 1, 1, 5, 6, 1, // 28 + 23 , 1 , 1 , 1, 1, 1 , 1 , 1, // 30 + 1 , 1 , 1 , 1, 1, 6 , 5 , 39 // 38 +}; + +#define CP2_FUNC(f) \ +void gte##f(); \ +static void rec##f() { \ + if (pc < cop2readypc) idlecyclecount += (cop2readypc - pc)>>2; \ + iFlushRegs(0); \ + LIW(0, (u32)psxRegs.code); \ + STW(0, OFFSET(&psxRegs, &psxRegs.code), GetHWRegSpecial(PSXREGS)); \ + FlushAllHWReg(); \ + CALLFunc ((u32)gte##f); \ + cop2readypc = pc + psxCP2time[_fFunct_(psxRegs.code)]<<2; \ +} + +#define CP2_FUNCNC(f) \ +void gte##f(); \ +static void rec##f() { \ + if (pc < cop2readypc) idlecyclecount += (cop2readypc - pc)>>2; \ + iFlushRegs(0); \ + CALLFunc ((u32)gte##f); \ +/* branch = 2; */\ + cop2readypc = pc + psxCP2time[_fFunct_(psxRegs.code)]; \ +} + +CP2_FUNC(MFC2); +CP2_FUNC(MTC2); +CP2_FUNC(CFC2); +CP2_FUNC(CTC2); +CP2_FUNC(LWC2); +CP2_FUNC(SWC2); +CP2_FUNCNC(RTPS); +CP2_FUNC(OP); +CP2_FUNCNC(NCLIP); +CP2_FUNC(DPCS); +CP2_FUNC(INTPL); +CP2_FUNC(MVMVA); +CP2_FUNCNC(NCDS); +CP2_FUNCNC(NCDT); +CP2_FUNCNC(CDP); +CP2_FUNCNC(NCCS); +CP2_FUNCNC(CC); +CP2_FUNCNC(NCS); +CP2_FUNCNC(NCT); +CP2_FUNC(SQR); +CP2_FUNC(DCPL); +CP2_FUNCNC(DPCT); +CP2_FUNCNC(AVSZ3); +CP2_FUNCNC(AVSZ4); +CP2_FUNCNC(RTPT); +CP2_FUNC(GPF); +CP2_FUNC(GPL); +CP2_FUNCNC(NCCT); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/ppc/pR3000A.c b/libpcsxcore/ppc/pR3000A.c new file mode 100644 index 0000000..93745f8 --- /dev/null +++ b/libpcsxcore/ppc/pR3000A.c @@ -0,0 +1,3540 @@ +/* Pcsx - Pc Psx Emulator + * Copyright (C) 1999-2003 Pcsx Team + * + * This program is free software; you can redistribute it and/or modify + * it 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; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA + */ + +#ifdef _MSC_VER_ +#pragma warning(disable:4244) +#pragma warning(disable:4761) +#endif +#include +#include +#include +#include +#include + +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON +#endif + +#include "../psxcommon.h" +#include "ppc.h" +#include "reguse.h" +#include "../r3000a.h" +#include "../psxhle.h" + +//#define NO_CONSTANT + +u32 *psxRecLUT; + +#undef _Op_ +#define _Op_ _fOp_(psxRegs.code) +#undef _Funct_ +#define _Funct_ _fFunct_(psxRegs.code) +#undef _Rd_ +#define _Rd_ _fRd_(psxRegs.code) +#undef _Rt_ +#define _Rt_ _fRt_(psxRegs.code) +#undef _Rs_ +#define _Rs_ _fRs_(psxRegs.code) +#undef _Sa_ +#define _Sa_ _fSa_(psxRegs.code) +#undef _Im_ +#define _Im_ _fIm_(psxRegs.code) +#undef _Target_ +#define _Target_ _fTarget_(psxRegs.code) + +#undef _Imm_ +#define _Imm_ _fImm_(psxRegs.code) +#undef _ImmU_ +#define _ImmU_ _fImmU_(psxRegs.code) + +#undef PC_REC +#undef PC_REC8 +#undef PC_REC16 +#undef PC_REC32 +#define PC_REC(x) (psxRecLUT[x >> 16] + (x & 0xffff)) +#define PC_REC8(x) (*(u8 *)PC_REC(x)) +#define PC_REC16(x) (*(u16*)PC_REC(x)) +#define PC_REC32(x) (*(u32*)PC_REC(x)) + +#define OFFSET(X,Y) ((u32)(Y)-(u32)(X)) + +#define RECMEM_SIZE (12*1024*1024) + +static char *recMem; /* the recompiled blocks will be here */ +static char *recRAM; /* and the ptr to the blocks here */ +static char *recROM; /* and here */ + +static u32 pc; /* recompiler pc */ +static u32 pcold; /* recompiler oldpc */ +static int count; /* recompiler intruction count */ +static int branch; /* set for branch */ +static u32 target; /* branch target */ +static u32 resp; + +u32 cop2readypc = 0; +u32 idlecyclecount = 0; + +#define NUM_REGISTERS 34 +typedef struct { + int state; + u32 k; + int reg; +} iRegisters; + +static iRegisters iRegs[34]; + +#define ST_UNK 0x00 +#define ST_CONST 0x01 +#define ST_MAPPED 0x02 + +#ifdef NO_CONSTANT +#define IsConst(reg) 0 +#else +#define IsConst(reg) (iRegs[reg].state & ST_CONST) +#endif +#define IsMapped(reg) (iRegs[reg].state & ST_MAPPED) + +static void (*recBSC[64])(); +static void (*recSPC[64])(); +static void (*recREG[32])(); +static void (*recCP0[32])(); +static void (*recCP2[64])(); +static void (*recCP2BSC[32])(); + +#define REG_LO 32 +#define REG_HI 33 + +// Hardware register usage +#define HWUSAGE_NONE 0x00 + +#define HWUSAGE_READ 0x01 +#define HWUSAGE_WRITE 0x02 +#define HWUSAGE_CONST 0x04 +#define HWUSAGE_ARG 0x08 /* used as an argument for a function call */ + +#define HWUSAGE_RESERVED 0x10 /* won't get flushed when flushing all regs */ +#define HWUSAGE_SPECIAL 0x20 /* special purpose register */ +#define HWUSAGE_HARDWIRED 0x40 /* specific hardware register mapping that is never disposed */ +#define HWUSAGE_INITED 0x80 +#define HWUSAGE_PSXREG 0x100 + +// Remember to invalidate the special registers if they are modified by compiler +enum { + ARG1 = 3, + ARG2 = 4, + ARG3 = 5, + PSXREGS, // ptr + PSXMEM, // ptr + CYCLECOUNT, // ptr + PSXPC, // ptr + TARGETPTR, // ptr + TARGET, // ptr + RETVAL, + REG_RZERO, + REG_WZERO +}; + +typedef struct { + int code; + u32 k; + int usage; + int lastUsed; + + void (*flush)(int hwreg); + int private; +} HWRegister; +static HWRegister HWRegisters[NUM_HW_REGISTERS]; +static int HWRegUseCount; +static int DstCPUReg; +static int UniqueRegAlloc; + +static int GetFreeHWReg(); +static void InvalidateCPURegs(); +static void DisposeHWReg(int index); +static void FlushHWReg(int index); +static void FlushAllHWReg(); +static void MapPsxReg32(int reg); +static void FlushPsxReg32(int hwreg); +static int UpdateHWRegUsage(int hwreg, int usage); +static int GetHWReg32(int reg); +static int PutHWReg32(int reg); +static int GetSpecialIndexFromHWRegs(int which); +static int GetHWRegFromCPUReg(int cpureg); +static int MapRegSpecial(int which); +static void FlushRegSpecial(int hwreg); +static int GetHWRegSpecial(int which); +static int PutHWRegSpecial(int which); +static void recRecompile(); +static void recError(); + +#pragma mark --- Generic register mapping --- + +static int GetFreeHWReg() +{ + int i, least, index; + + if (DstCPUReg != -1) { + index = GetHWRegFromCPUReg(DstCPUReg); + DstCPUReg = -1; + } else { + // LRU algorith with a twist ;) + for (i=0; i= 13) { + index = i; + break; + } + else if (HWRegisters[i].lastUsed < least) { + least = HWRegisters[i].lastUsed; + index = i; + } + } + } + + // Cycle the registers + if (HWRegisters[index].usage == HWUSAGE_NONE) { + for (; i= 13 && + HWRegisters[i].lastUsed < least) { + least = HWRegisters[i].lastUsed; + index = i; + break; + } + } + } + } + } + +/* if (HWRegisters[index].code < 13 && HWRegisters[index].code > 3) { + SysPrintf("Allocating volatile register %i\n", HWRegisters[index].code); + } + if (HWRegisters[index].usage != HWUSAGE_NONE) { + SysPrintf("RegUse too big. Flushing %i\n", HWRegisters[index].code); + }*/ + if (HWRegisters[index].usage & (HWUSAGE_RESERVED | HWUSAGE_HARDWIRED)) { + if (HWRegisters[index].usage & HWUSAGE_RESERVED) { + SysPrintf("Error! Trying to map a new register to a reserved register (r%i)", + HWRegisters[index].code); + } + if (HWRegisters[index].usage & HWUSAGE_HARDWIRED) { + SysPrintf("Error! Trying to map a new register to a hardwired register (r%i)", + HWRegisters[index].code); + } + } + + if (HWRegisters[index].lastUsed != 0) { + UniqueRegAlloc = 0; + } + + // Make sure the register is really flushed! + FlushHWReg(index); + HWRegisters[index].usage = HWUSAGE_NONE; + HWRegisters[index].flush = NULL; + + return index; +} + +static void FlushHWReg(int index) +{ + if (index < 0) return; + if (HWRegisters[index].usage == HWUSAGE_NONE) return; + + if (HWRegisters[index].flush) { + HWRegisters[index].usage |= HWUSAGE_RESERVED; + HWRegisters[index].flush(index); + HWRegisters[index].flush = NULL; + } + + if (HWRegisters[index].usage & HWUSAGE_HARDWIRED) { + HWRegisters[index].usage &= ~(HWUSAGE_READ | HWUSAGE_WRITE); + } else { + HWRegisters[index].usage = HWUSAGE_NONE; + } +} + +// get rid of a mapped register without flushing the contents to the memory +static void DisposeHWReg(int index) +{ + if (index < 0) return; + if (HWRegisters[index].usage == HWUSAGE_NONE) return; + + HWRegisters[index].usage &= ~(HWUSAGE_READ | HWUSAGE_WRITE); + if (HWRegisters[index].usage == HWUSAGE_NONE) { + SysPrintf("Error! not correctly disposing register (r%i)", HWRegisters[index].code); + } + + FlushHWReg(index); +} + +// operated on cpu registers +__inline static void FlushCPURegRange(int start, int end) +{ + int i; + + if (end <= 0) end = 31; + if (start <= 0) start = 0; + + for (i=0; i= start && HWRegisters[i].code <= end) + if (HWRegisters[i].flush) + FlushHWReg(i); + } + + for (i=0; i= start && HWRegisters[i].code <= end) + FlushHWReg(i); + } +} + +static void FlushAllHWReg() +{ + FlushCPURegRange(0,31); +} + +static void InvalidateCPURegs() +{ + FlushCPURegRange(0,12); +} + +#pragma mark --- Mapping utility functions --- + +static void MoveHWRegToCPUReg(int cpureg, int hwreg) +{ + int dstreg; + + if (HWRegisters[hwreg].code == cpureg) + return; + + dstreg = GetHWRegFromCPUReg(cpureg); + + HWRegisters[dstreg].usage &= ~(HWUSAGE_HARDWIRED | HWUSAGE_ARG); + if (HWRegisters[hwreg].usage & (HWUSAGE_READ | HWUSAGE_WRITE)) { + FlushHWReg(dstreg); + MR(HWRegisters[dstreg].code, HWRegisters[hwreg].code); + } else { + if (HWRegisters[dstreg].usage & (HWUSAGE_READ | HWUSAGE_WRITE)) { + MR(HWRegisters[hwreg].code, HWRegisters[dstreg].code); + } + else if (HWRegisters[dstreg].usage != HWUSAGE_NONE) { + FlushHWReg(dstreg); + } + } + + HWRegisters[dstreg].code = HWRegisters[hwreg].code; + HWRegisters[hwreg].code = cpureg; +} + +static int UpdateHWRegUsage(int hwreg, int usage) +{ + HWRegisters[hwreg].lastUsed = ++HWRegUseCount; + if (usage & HWUSAGE_WRITE) { + HWRegisters[hwreg].usage &= ~HWUSAGE_CONST; + } + if (!(usage & HWUSAGE_INITED)) { + HWRegisters[hwreg].usage &= ~HWUSAGE_INITED; + } + HWRegisters[hwreg].usage |= usage; + + return HWRegisters[hwreg].code; +} + +static int GetHWRegFromCPUReg(int cpureg) +{ + int i; + for (i=0; i= 0) { + if (HWRegisters[index].usage & HWUSAGE_WRITE) + break; + } + index = MapRegSpecial(which); + HWRegisters[index].flush = NULL; + break; + default: + if (index == -1) { + usage |= HWUSAGE_INITED; + index = MapRegSpecial(which); + + HWRegisters[index].usage |= HWUSAGE_RESERVED; + switch (which) { + case ARG1: + case ARG2: + case ARG3: + MoveHWRegToCPUReg(3+(which-ARG1), index); + /*reg = GetHWRegFromCPUReg(3+(which-ARG1)); + + if (HWRegisters[reg].usage != HWUSAGE_NONE) { + HWRegisters[reg].usage &= ~(HWUSAGE_HARDWIRED | HWUSAGE_ARG); + if (HWRegisters[reg].flush != NULL && HWRegisters[reg].usage & (HWUSAGE_WRITE | HWUSAGE_READ)) { + MR(HWRegisters[index].code, HWRegisters[reg].code); + } else { + FlushHWReg(reg); + } + } + HWRegisters[reg].code = HWRegisters[index].code; + if (!(HWRegisters[index].code >= 3 && HWRegisters[index].code <=31)) + SysPrintf("Error! Register allocation"); + HWRegisters[index].code = 3+(which-ARG1);*/ + HWRegisters[index].flush = NULL; + + usage |= HWUSAGE_RESERVED | HWUSAGE_HARDWIRED | HWUSAGE_ARG; + break; + } + } + HWRegisters[index].usage &= ~HWUSAGE_RESERVED; + break; + } + + DstCPUReg = -1; + + return UpdateHWRegUsage(index, usage); +} + +#pragma mark --- --- + +static void MapConst(int reg, u32 _const) { + if (reg == 0) + return; + if (IsConst(reg) && iRegs[reg].k == _const) + return; + + DisposeHWReg(iRegs[reg].reg); + iRegs[reg].k = _const; + iRegs[reg].state = ST_CONST; +} + +static void MapCopy(int dst, int src) +{ + // do it the lazy way for now + MR(PutHWReg32(dst), GetHWReg32(src)); +} + +static void iFlushReg(u32 nextpc, int reg) { + if (!IsMapped(reg) && IsConst(reg)) { + GetHWReg32(reg); + } + if (IsMapped(reg)) { + if (nextpc) { + int use = nextPsxRegUse(nextpc, reg); + if ((use & REGUSE_RW) == REGUSE_WRITE) { + DisposeHWReg(iRegs[reg].reg); + } else { + FlushHWReg(iRegs[reg].reg); + } + } else { + FlushHWReg(iRegs[reg].reg); + } + } +} + +static void iFlushRegs(u32 nextpc) { + int i; + + for (i=1; i> 26; + switch (tmp) { + case 0x10: // COP0 + switch (_Rs_) { + case 0x00: // MFC0 + case 0x02: // CFC0 + return 1; + } + break; + case 0x12: // COP2 + switch (_Funct_) { + case 0x00: + switch (_Rs_) { + case 0x00: // MFC2 + case 0x02: // CFC2 + return 1; + } + break; + } + break; + case 0x32: // LWC2 + return 1; + default: + if (tmp >= 0x20 && tmp <= 0x26) { // LB/LH/LWL/LW/LBU/LHU/LWR + return 1; + } + break; + } + return 0; +} + +/* set a pending branch */ +static void SetBranch() { + int treg; + branch = 1; + psxRegs.code = PSXMu32(pc); + pc+=4; + + if (iLoadTest() == 1) { + iFlushRegs(0); + LIW(0, psxRegs.code); + STW(0, OFFSET(&psxRegs, &psxRegs.code), GetHWRegSpecial(PSXREGS)); + /* store cycle */ + count = (idlecyclecount + (pc - pcold) / 4) * BIAS; + ADDI(PutHWRegSpecial(CYCLECOUNT), GetHWRegSpecial(CYCLECOUNT), count); + + treg = GetHWRegSpecial(TARGET); + MR(PutHWRegSpecial(ARG2), treg); + DisposeHWReg(GetHWRegFromCPUReg(treg)); + LIW(PutHWRegSpecial(ARG1), _Rt_); + LIW(GetHWRegSpecial(PSXPC), pc); + FlushAllHWReg(); + CALLFunc((u32)psxDelayTest); + + Return(); + return; + } + + recBSC[psxRegs.code>>26](); + + iFlushRegs(0); + treg = GetHWRegSpecial(TARGET); + MR(PutHWRegSpecial(PSXPC), GetHWRegSpecial(TARGET)); // FIXME: this line should not be needed + DisposeHWReg(GetHWRegFromCPUReg(treg)); + FlushAllHWReg(); + + count = (idlecyclecount + (pc - pcold) / 4) * BIAS; + ADDI(PutHWRegSpecial(CYCLECOUNT), GetHWRegSpecial(CYCLECOUNT), count); + FlushAllHWReg(); + CALLFunc((u32)psxBranchTest); + + // TODO: don't return if target is compiled + Return(); +} + +static void iJump(u32 branchPC) { + u32 *b1, *b2; + branch = 1; + psxRegs.code = PSXMu32(pc); + pc+=4; + + if (iLoadTest() == 1) { + iFlushRegs(0); + LIW(0, psxRegs.code); + STW(0, OFFSET(&psxRegs, &psxRegs.code), GetHWRegSpecial(PSXREGS)); + /* store cycle */ + count = (idlecyclecount + (pc - pcold) / 4) * BIAS; + ADDI(PutHWRegSpecial(CYCLECOUNT), GetHWRegSpecial(CYCLECOUNT), count); + + LIW(PutHWRegSpecial(ARG2), branchPC); + LIW(PutHWRegSpecial(ARG1), _Rt_); + LIW(GetHWRegSpecial(PSXPC), pc); + FlushAllHWReg(); + CALLFunc((u32)psxDelayTest); + + Return(); + return; + } + + recBSC[psxRegs.code>>26](); + + iFlushRegs(branchPC); + LIW(PutHWRegSpecial(PSXPC), branchPC); + FlushAllHWReg(); + + count = (idlecyclecount + (pc - pcold) / 4) * BIAS; + //if (/*psxRegs.code == 0 &&*/ count == 2 && branchPC == pcold) { + // LIW(PutHWRegSpecial(CYCLECOUNT), 0); + //} else { + ADDI(PutHWRegSpecial(CYCLECOUNT), GetHWRegSpecial(CYCLECOUNT), count); + //} + FlushAllHWReg(); + CALLFunc((u32)psxBranchTest); + + if (!Config.HLE && Config.PsxOut && + ((branchPC & 0x1fffff) == 0xa0 || + (branchPC & 0x1fffff) == 0xb0 || + (branchPC & 0x1fffff) == 0xc0)) + CALLFunc((u32)psxJumpTest); + + // always return for now... + //Return(); + + // maybe just happened an interruption, check so + LIW(0, branchPC); + CMPLW(GetHWRegSpecial(PSXPC), 0); + BNE_L(b1); + + LIW(3, PC_REC(branchPC)); + LWZ(3, 0, 3); + CMPLWI(3, 0); + BNE_L(b2); + + B_DST(b1); + Return(); + + // next bit is already compiled - jump right to it + B_DST(b2); + MTCTR(3); + BCTR(); +} + +static void iBranch(u32 branchPC, int savectx) { + HWRegister HWRegistersS[NUM_HW_REGISTERS]; + iRegisters iRegsS[NUM_REGISTERS]; + int HWRegUseCountS = 0; + u32 respold=0; + u32 *b1, *b2; + + if (savectx) { + respold = resp; + memcpy(iRegsS, iRegs, sizeof(iRegs)); + memcpy(HWRegistersS, HWRegisters, sizeof(HWRegisters)); + HWRegUseCountS = HWRegUseCount; + } + + branch = 1; + psxRegs.code = PSXMu32(pc); + + // the delay test is only made when the branch is taken + // savectx == 0 will mean that :) + if (savectx == 0 && iLoadTest() == 1) { + iFlushRegs(0); + LIW(0, psxRegs.code); + STW(0, OFFSET(&psxRegs, &psxRegs.code), GetHWRegSpecial(PSXREGS)); + /* store cycle */ + count = (idlecyclecount + ((pc+4) - pcold) / 4) * BIAS; + ADDI(PutHWRegSpecial(CYCLECOUNT), GetHWRegSpecial(CYCLECOUNT), count); + + LIW(PutHWRegSpecial(ARG2), branchPC); + LIW(PutHWRegSpecial(ARG1), _Rt_); + LIW(GetHWRegSpecial(PSXPC), pc); + FlushAllHWReg(); + CALLFunc((u32)psxDelayTest); + + Return(); + return; + } + + pc+= 4; + recBSC[psxRegs.code>>26](); + + iFlushRegs(branchPC); + LIW(PutHWRegSpecial(PSXPC), branchPC); + FlushAllHWReg(); + + /* store cycle */ + count = (idlecyclecount + (pc - pcold) / 4) * BIAS; + //if (/*psxRegs.code == 0 &&*/ count == 2 && branchPC == pcold) { + // LIW(PutHWRegSpecial(CYCLECOUNT), 0); + //} else { + ADDI(PutHWRegSpecial(CYCLECOUNT), GetHWRegSpecial(CYCLECOUNT), count); + //} + FlushAllHWReg(); + CALLFunc((u32)psxBranchTest); + + // always return for now... + //Return(); + + LIW(0, branchPC); + CMPLW(GetHWRegSpecial(PSXPC), 0); + BNE_L(b1); + + LIW(3, PC_REC(branchPC)); + LWZ(3, 0, 3); + CMPLWI(3, 0); + BNE_L(b2); + + B_DST(b1); + Return(); + + B_DST(b2); + MTCTR(3); + BCTR(); + + // maybe just happened an interruption, check so +/* CMP32ItoM((u32)&psxRegs.pc, branchPC); + j8Ptr[1] = JE8(0); + RET(); + + x86SetJ8(j8Ptr[1]); + MOV32MtoR(EAX, PC_REC(branchPC)); + TEST32RtoR(EAX, EAX); + j8Ptr[2] = JNE8(0); + RET(); + + x86SetJ8(j8Ptr[2]); + JMP32R(EAX);*/ + + pc-= 4; + if (savectx) { + resp = respold; + memcpy(iRegs, iRegsS, sizeof(iRegs)); + memcpy(HWRegisters, HWRegistersS, sizeof(HWRegisters)); + HWRegUseCount = HWRegUseCountS; + } +} + + +static void iDumpRegs() { + int i, j; + + printf("%lx %lx\n", psxRegs.pc, psxRegs.cycle); + for (i=0; i<4; i++) { + for (j=0; j<8; j++) + printf("%lx ", psxRegs.GPR.r[j*i]); + printf("\n"); + } +} + +void iDumpBlock(char *ptr) { +/* FILE *f; + u32 i; + + SysPrintf("dump1 %x:%x, %x\n", psxRegs.pc, pc, psxCurrentCycle); + + for (i = psxRegs.pc; i < pc; i+=4) + SysPrintf("%s\n", disR3000AF(PSXMu32(i), i)); + + fflush(stdout); + f = fopen("dump1", "w"); + fwrite(ptr, 1, (u32)x86Ptr - (u32)ptr, f); + fclose(f); + system("ndisasmw -u dump1"); + fflush(stdout);*/ +} + +#define REC_FUNC(f) \ +void psx##f(); \ +static void rec##f() { \ + iFlushRegs(0); \ + LIW(PutHWRegSpecial(ARG1), (u32)psxRegs.code); \ + STW(GetHWRegSpecial(ARG1), OFFSET(&psxRegs, &psxRegs.code), GetHWRegSpecial(PSXREGS)); \ + LIW(PutHWRegSpecial(PSXPC), (u32)pc); \ + FlushAllHWReg(); \ + CALLFunc((u32)psx##f); \ +/* branch = 2; */\ +} + +#define REC_SYS(f) \ +void psx##f(); \ +static void rec##f() { \ + iFlushRegs(0); \ + LIW(PutHWRegSpecial(ARG1), (u32)psxRegs.code); \ + STW(GetHWRegSpecial(ARG1), OFFSET(&psxRegs, &psxRegs.code), GetHWRegSpecial(PSXREGS)); \ + LIW(PutHWRegSpecial(PSXPC), (u32)pc); \ + FlushAllHWReg(); \ + CALLFunc((u32)psx##f); \ + branch = 2; \ + iRet(); \ +} + +#define REC_BRANCH(f) \ +void psx##f(); \ +static void rec##f() { \ + iFlushRegs(0); \ + LIW(PutHWRegSpecial(ARG1), (u32)psxRegs.code); \ + STW(GetHWRegSpecial(ARG1), OFFSET(&psxRegs, &psxRegs.code), GetHWRegSpecial(PSXREGS)); \ + LIW(PutHWRegSpecial(PSXPC), (u32)pc); \ + FlushAllHWReg(); \ + CALLFunc((u32)psx##f); \ + branch = 2; \ + iRet(); \ +} + +static void freeMem(int all) +{ + if (recMem) free(recMem); + if (recRAM) free(recRAM); + if (recROM) free(recROM); + recMem = recRAM = recROM = 0; + + if (all && psxRecLUT) { + free(psxRecLUT); psxRecLUT = NULL; + } +} + +static int allocMem() { + int i; + + freeMem(0); + + if (psxRecLUT==NULL) + psxRecLUT = (u32*) malloc(0x010000 * 4); + + recMem = (char*) malloc(RECMEM_SIZE); + //recMem = mmap(NULL, RECMEM_SIZE, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0); + recRAM = (char*) malloc(0x200000); + recROM = (char*) malloc(0x080000); + if (recRAM == NULL || recROM == NULL || recMem == NULL/*(void *)-1*/ || psxRecLUT == NULL) { + freeMem(1); + SysMessage("Error allocating memory"); return -1; + } + + for (i=0; i<0x80; i++) psxRecLUT[i + 0x0000] = (u32)&recRAM[(i & 0x1f) << 16]; + memcpy(psxRecLUT + 0x8000, psxRecLUT, 0x80 * 4); + memcpy(psxRecLUT + 0xa000, psxRecLUT, 0x80 * 4); + + for (i=0; i<0x08; i++) psxRecLUT[i + 0xbfc0] = (u32)&recROM[i << 16]; + + return 0; +} + +static int recInit() { + return allocMem(); +} + +static void recReset() { + memset(recRAM, 0, 0x200000); + memset(recROM, 0, 0x080000); + + ppcInit(); + ppcSetPtr((u32 *)recMem); + + branch = 0; + memset(iRegs, 0, sizeof(iRegs)); + iRegs[0].state = ST_CONST; + iRegs[0].k = 0; +} + +static void recShutdown() { + freeMem(1); + ppcShutdown(); +} + +static void recError() { + SysReset(); + ClosePlugins(); + SysMessage("Unrecoverable error while running recompiler\n"); + SysRunGui(); +} + +__inline static void execute() { + void (**recFunc)(); + char *p; + + p = (char*)PC_REC(psxRegs.pc); + /*if (p != NULL)*/ recFunc = (void (**)()) (u32)p; + /*else { recError(); return; }*/ + + if (*recFunc == 0) { + recRecompile(); + } + recRun(*recFunc, (u32)&psxRegs, (u32)&psxM); +} + +static void recExecute() { + for (;;) execute(); +} + +static void recExecuteBlock() { + execute(); +} + +static void recClear(u32 Addr, u32 Size) { + memset((void*)PC_REC(Addr), 0, Size * 4); +} + +static void recNULL() { +// SysMessage("recUNK: %8.8x\n", psxRegs.code); +} + +/********************************************************* +* goes to opcodes tables... * +* Format: table[something....] * +*********************************************************/ + +//REC_SYS(SPECIAL); +static void recSPECIAL() { + recSPC[_Funct_](); +} + +static void recREGIMM() { + recREG[_Rt_](); +} + +static void recCOP0() { + recCP0[_Rs_](); +} + +//REC_SYS(COP2); +static void recCOP2() { + recCP2[_Funct_](); +} + +static void recBASIC() { + recCP2BSC[_Rs_](); +} + +//end of Tables opcodes... + +#pragma mark - Arithmetic with immediate operand - +/********************************************************* +* Arithmetic with immediate operand * +* Format: OP rt, rs, immediate * +*********************************************************/ + +#if 0 +/*REC_FUNC(ADDI); +REC_FUNC(ADDIU); +REC_FUNC(ANDI); +REC_FUNC(ORI); +REC_FUNC(XORI); +REC_FUNC(SLTI); +REC_FUNC(SLTIU);*/ +#else +static void recADDIU() { +// Rt = Rs + Im + if (!_Rt_) return; + + if (IsConst(_Rs_)) { + MapConst(_Rt_, iRegs[_Rs_].k + _Imm_); + } else { + if (_Imm_ == 0) { + MapCopy(_Rt_, _Rs_); + } else { + ADDI(PutHWReg32(_Rt_), GetHWReg32(_Rs_), _Imm_); + } + } +} + +static void recADDI() { +// Rt = Rs + Im + recADDIU(); +} + +//REC_FUNC(SLTI); +//REC_FUNC(SLTIU); +//CR0: SIGN | POSITIVE | ZERO | SOVERFLOW | SOVERFLOW | OVERFLOW | CARRY +static void recSLTI() { +// Rt = Rs < Im (signed) + if (!_Rt_) return; + + if (IsConst(_Rs_)) { + MapConst(_Rt_, (s32)iRegs[_Rs_].k < _Imm_); + } else { + if (_Imm_ == 0) { + SRWI(PutHWReg32(_Rt_), GetHWReg32(_Rs_), 31); + } else { + int reg; + CMPWI(GetHWReg32(_Rs_), _Imm_); + reg = PutHWReg32(_Rt_); + LI(reg, 1); + BLT(1); + LI(reg, 0); + } + } +} + +static void recSLTIU() { +// Rt = Rs < Im (unsigned) + if (!_Rt_) return; + + if (IsConst(_Rs_)) { + MapConst(_Rt_, iRegs[_Rs_].k < _ImmU_); + } else { + int reg; + CMPLWI(GetHWReg32(_Rs_), _Imm_); + reg = PutHWReg32(_Rt_); + LI(reg, 1); + BLT(1); + LI(reg, 0); + } +} + +static void recANDI() { +// Rt = Rs And Im + if (!_Rt_) return; + + if (IsConst(_Rs_)) { + MapConst(_Rt_, iRegs[_Rs_].k & _ImmU_); + } else { + ANDI_(PutHWReg32(_Rt_), GetHWReg32(_Rs_), _ImmU_); + } +} + +static void recORI() { +// Rt = Rs Or Im + if (!_Rt_) return; + + if (IsConst(_Rs_)) { + MapConst(_Rt_, iRegs[_Rs_].k | _ImmU_); + } else { + if (_Imm_ == 0) { + MapCopy(_Rt_, _Rs_); + } else { + ORI(PutHWReg32(_Rt_), GetHWReg32(_Rs_), _ImmU_); + } + } +} + +static void recXORI() { +// Rt = Rs Xor Im + if (!_Rt_) return; + + if (IsConst(_Rs_)) { + MapConst(_Rt_, iRegs[_Rs_].k ^ _ImmU_); + } else { + XORI(PutHWReg32(_Rt_), GetHWReg32(_Rs_), _ImmU_); + } +} +#endif +//end of * Arithmetic with immediate operand + +/********************************************************* +* Load higher 16 bits of the first word in GPR with imm * +* Format: OP rt, immediate * +*********************************************************/ +//REC_FUNC(LUI); +//#if 0*/ +static void recLUI() { +// Rt = Imm << 16 + if (!_Rt_) return; + + MapConst(_Rt_, psxRegs.code << 16); +} +//#endif +//End of Load Higher ..... + +#pragma mark - Register arithmetic - +/********************************************************* +* Register arithmetic * +* Format: OP rd, rs, rt * +*********************************************************/ + +#if 0 +/*REC_FUNC(ADD); +REC_FUNC(ADDU); +REC_FUNC(SUB); +REC_FUNC(SUBU); +REC_FUNC(AND); +REC_FUNC(OR); +REC_FUNC(XOR); +REC_FUNC(NOR); +REC_FUNC(SLT); +REC_FUNC(SLTU);*/ +#else +static void recADDU() { +// Rd = Rs + Rt + if (!_Rd_) return; + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k + iRegs[_Rt_].k); + } else if (IsConst(_Rs_) && !IsMapped(_Rs_)) { + if ((s32)(s16)iRegs[_Rs_].k == (s32)iRegs[_Rs_].k) { + ADDI(PutHWReg32(_Rd_), GetHWReg32(_Rt_), (s16)iRegs[_Rs_].k); + } else if ((iRegs[_Rs_].k & 0xffff) == 0) { + ADDIS(PutHWReg32(_Rd_), GetHWReg32(_Rt_), iRegs[_Rs_].k>>16); + } else { + ADD(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } else if (IsConst(_Rt_) && !IsMapped(_Rt_)) { + if ((s32)(s16)iRegs[_Rt_].k == (s32)iRegs[_Rt_].k) { + ADDI(PutHWReg32(_Rd_), GetHWReg32(_Rs_), (s16)iRegs[_Rt_].k); + } else if ((iRegs[_Rt_].k & 0xffff) == 0) { + ADDIS(PutHWReg32(_Rd_), GetHWReg32(_Rs_), iRegs[_Rt_].k>>16); + } else { + ADD(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } else { + ADD(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } +} + +static void recADD() { +// Rd = Rs + Rt + recADDU(); +} + +static void recSUBU() { +// Rd = Rs - Rt + if (!_Rd_) return; + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k - iRegs[_Rt_].k); + } else if (IsConst(_Rt_) && !IsMapped(_Rt_)) { + if ((s32)(s16)(-iRegs[_Rt_].k) == (s32)(-iRegs[_Rt_].k)) { + ADDI(PutHWReg32(_Rd_), GetHWReg32(_Rs_), -iRegs[_Rt_].k); + } else if (((-iRegs[_Rt_].k) & 0xffff) == 0) { + ADDIS(PutHWReg32(_Rd_), GetHWReg32(_Rs_), (-iRegs[_Rt_].k)>>16); + } else { + SUB(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } else { + SUB(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } +} + +static void recSUB() { +// Rd = Rs - Rt + recSUBU(); +} + +static void recAND() { +// Rd = Rs And Rt + if (!_Rd_) return; + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k & iRegs[_Rt_].k); + } else if (IsConst(_Rs_) && !IsMapped(_Rs_)) { + // TODO: implement shifted (ANDIS) versions of these + if ((iRegs[_Rs_].k & 0xffff) == iRegs[_Rs_].k) { + ANDI_(PutHWReg32(_Rd_), GetHWReg32(_Rt_), iRegs[_Rs_].k); + } else { + AND(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } else if (IsConst(_Rt_) && !IsMapped(_Rt_)) { + if ((iRegs[_Rt_].k & 0xffff) == iRegs[_Rt_].k) { + ANDI_(PutHWReg32(_Rd_), GetHWReg32(_Rs_), iRegs[_Rt_].k); + } else { + AND(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } else { + AND(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } +} + +static void recOR() { +// Rd = Rs Or Rt + if (!_Rd_) return; + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k | iRegs[_Rt_].k); + } + else { + if (_Rs_ == _Rt_) { + MapCopy(_Rd_, _Rs_); + } + else if (IsConst(_Rs_) && !IsMapped(_Rs_)) { + if ((iRegs[_Rs_].k & 0xffff) == iRegs[_Rs_].k) { + ORI(PutHWReg32(_Rd_), GetHWReg32(_Rt_), iRegs[_Rs_].k); + } else { + OR(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } + else if (IsConst(_Rt_) && !IsMapped(_Rt_)) { + if ((iRegs[_Rt_].k & 0xffff) == iRegs[_Rt_].k) { + ORI(PutHWReg32(_Rd_), GetHWReg32(_Rs_), iRegs[_Rt_].k); + } else { + OR(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } else { + OR(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } +} + +static void recXOR() { +// Rd = Rs Xor Rt + if (!_Rd_) return; + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k ^ iRegs[_Rt_].k); + } else if (IsConst(_Rs_) && !IsMapped(_Rs_)) { + if ((iRegs[_Rs_].k & 0xffff) == iRegs[_Rs_].k) { + XORI(PutHWReg32(_Rd_), GetHWReg32(_Rt_), iRegs[_Rs_].k); + } else { + XOR(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } else if (IsConst(_Rt_) && !IsMapped(_Rt_)) { + if ((iRegs[_Rt_].k & 0xffff) == iRegs[_Rt_].k) { + XORI(PutHWReg32(_Rd_), GetHWReg32(_Rs_), iRegs[_Rt_].k); + } else { + XOR(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } else { + XOR(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } +} + +static void recNOR() { +// Rd = Rs Nor Rt + if (!_Rd_) return; + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, ~(iRegs[_Rs_].k | iRegs[_Rt_].k)); + } /*else if (IsConst(_Rs_) && !IsMapped(_Rs_)) { + if ((iRegs[_Rs_].k & 0xffff) == iRegs[_Rs_].k) { + NORI(PutHWReg32(_Rd_), GetHWReg32(_Rt_), iRegs[_Rs_].k); + } else { + NOR(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } else if (IsConst(_Rt_) && !IsMapped(_Rt_)) { + if ((iRegs[_Rt_].k & 0xffff) == iRegs[_Rt_].k) { + NORI(PutHWReg32(_Rd_), GetHWReg32(_Rs_), iRegs[_Rt_].k); + } else { + NOR(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } */else { + NOR(PutHWReg32(_Rd_), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } +} + +static void recSLT() { +// Rd = Rs < Rt (signed) + if (!_Rd_) return; + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, (s32)iRegs[_Rs_].k < (s32)iRegs[_Rt_].k); + } else { // TODO: add immidiate cases + int reg; + CMPW(GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + reg = PutHWReg32(_Rd_); + LI(reg, 1); + BLT(1); + LI(reg, 0); + } +} + +static void recSLTU() { +// Rd = Rs < Rt (unsigned) + if (!_Rd_) return; + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rs_].k < iRegs[_Rt_].k); + } else { // TODO: add immidiate cases + SUBFC(PutHWReg32(_Rd_), GetHWReg32(_Rt_), GetHWReg32(_Rs_)); + SUBFE(PutHWReg32(_Rd_), GetHWReg32(_Rd_), GetHWReg32(_Rd_)); + NEG(PutHWReg32(_Rd_), GetHWReg32(_Rd_)); + } +} +#endif +//End of * Register arithmetic + +#pragma mark - mult/div & Register trap logic - +/********************************************************* +* Register mult/div & Register trap logic * +* Format: OP rs, rt * +*********************************************************/ + +#if 0 +REC_FUNC(MULT); +REC_FUNC(MULTU); +REC_FUNC(DIV); +REC_FUNC(DIVU); +#else + +int DoShift(u32 k) +{ + u32 i; + for (i=0; i<30; i++) { + if (k == (1ul << i)) + return i; + } + return -1; +} + +//REC_FUNC(MULT); + +// FIXME: doesn't work in GT - wrong way marker +static void recMULT() { +// Lo/Hi = Rs * Rt (signed) + s32 k; int r; + int usehi, uselo; + + if ((IsConst(_Rs_) && iRegs[_Rs_].k == 0) || + (IsConst(_Rt_) && iRegs[_Rt_].k == 0)) { + MapConst(REG_LO, 0); + MapConst(REG_HI, 0); + return; + } + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + u64 res = (s64)((s64)(s32)iRegs[_Rs_].k * (s64)(s32)iRegs[_Rt_].k); + MapConst(REG_LO, (res & 0xffffffff)); + MapConst(REG_HI, ((res >> 32) & 0xffffffff)); + return; + } + + if (IsConst(_Rs_)) { + k = (s32)iRegs[_Rs_].k; + r = _Rt_; + } else if (IsConst(_Rt_)) { + k = (s32)iRegs[_Rt_].k; + r = _Rs_; + } else { + r = -1; + k = 0; + } + + // FIXME: this should not be needed!!! +// uselo = isPsxRegUsed(pc, REG_LO); +// usehi = isPsxRegUsed(pc, REG_HI); + uselo = 1; //isPsxRegUsed(pc, REG_LO); + usehi = 1; //isPsxRegUsed(pc, REG_HI); + + + if (r != -1) { + int shift = DoShift(k); + if (shift != -1) { + if (uselo) { + SLWI(PutHWReg32(REG_LO), GetHWReg32(r), shift) + } + if (usehi) { + SRAWI(PutHWReg32(REG_HI), GetHWReg32(r), 31-shift); + } + } else { + //if ((s32)(s16)k == k) { + // MULLWI(PutHWReg32(REG_LO), GetHWReg32(r), k); + // MULHWI(PutHWReg32(REG_HI), GetHWReg32(r), k); + //} else + { + if (uselo) { + MULLW(PutHWReg32(REG_LO), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + if (usehi) { + MULHW(PutHWReg32(REG_HI), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } + } + } else { + if (uselo) { + MULLW(PutHWReg32(REG_LO), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + if (usehi) { + MULHW(PutHWReg32(REG_HI), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } +} + +static void recMULTU() { +// Lo/Hi = Rs * Rt (unsigned) + u32 k; int r; + int usehi, uselo; + + if ((IsConst(_Rs_) && iRegs[_Rs_].k == 0) || + (IsConst(_Rt_) && iRegs[_Rt_].k == 0)) { + MapConst(REG_LO, 0); + MapConst(REG_HI, 0); + return; + } + + if (IsConst(_Rs_) && IsConst(_Rt_)) { + u64 res = (u64)((u64)(u32)iRegs[_Rs_].k * (u64)(u32)iRegs[_Rt_].k); + MapConst(REG_LO, (res & 0xffffffff)); + MapConst(REG_HI, ((res >> 32) & 0xffffffff)); + return; + } + + if (IsConst(_Rs_)) { + k = (s32)iRegs[_Rs_].k; + r = _Rt_; + } else if (IsConst(_Rt_)) { + k = (s32)iRegs[_Rt_].k; + r = _Rs_; + } else { + r = -1; + k = 0; + } + + uselo = isPsxRegUsed(pc, REG_LO); + usehi = isPsxRegUsed(pc, REG_HI); + + if (r != -1) { + int shift = DoShift(k); + if (shift != -1) { + if (uselo) { + SLWI(PutHWReg32(REG_LO), GetHWReg32(r), shift); + } + if (usehi) { + SRWI(PutHWReg32(REG_HI), GetHWReg32(r), 31-shift); + } + } else { + { + if (uselo) { + MULLW(PutHWReg32(REG_LO), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + if (usehi) { + MULHWU(PutHWReg32(REG_HI), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } + } + } else { + if (uselo) { + MULLW(PutHWReg32(REG_LO), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + if (usehi) { + MULHWU(PutHWReg32(REG_HI), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } +} + +static void recDIV() { +// Lo/Hi = Rs / Rt (signed) + int usehi; + + if (IsConst(_Rs_) && iRegs[_Rs_].k == 0) { + MapConst(REG_LO, 0); + MapConst(REG_HI, 0); + return; + } + if (IsConst(_Rt_) && IsConst(_Rs_)) { + MapConst(REG_LO, (s32)iRegs[_Rs_].k / (s32)iRegs[_Rt_].k); + MapConst(REG_HI, (s32)iRegs[_Rs_].k % (s32)iRegs[_Rt_].k); + return; + } + + usehi = isPsxRegUsed(pc, REG_HI); + + if (IsConst(_Rt_)) { + int shift = DoShift(iRegs[_Rt_].k); + if (shift != -1) { + SRAWI(PutHWReg32(REG_LO), GetHWReg32(_Rs_), shift); + ADDZE(PutHWReg32(REG_LO), GetHWReg32(REG_LO)); + if (usehi) { + RLWINM(PutHWReg32(REG_HI), GetHWReg32(_Rs_), 0, 31-shift, 31); + } + } else if (iRegs[_Rt_].k == 3) { + // http://the.wall.riscom.net/books/proc/ppc/cwg/code2.html + LIS(PutHWReg32(REG_HI), 0x5555); + ADDI(PutHWReg32(REG_HI), GetHWReg32(REG_HI), 0x5556); + MULHW(PutHWReg32(REG_LO), GetHWReg32(REG_HI), GetHWReg32(_Rs_)); + SRWI(PutHWReg32(REG_HI), GetHWReg32(_Rs_), 31); + ADD(PutHWReg32(REG_LO), GetHWReg32(REG_LO), GetHWReg32(REG_HI)); + if (usehi) { + MULLI(PutHWReg32(REG_HI), GetHWReg32(REG_LO), 3); + SUB(PutHWReg32(REG_HI), GetHWReg32(_Rs_), GetHWReg32(REG_HI)); + } + } else { + DIVW(PutHWReg32(REG_LO), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + if (usehi) { + if ((iRegs[_Rt_].k & 0x7fff) == iRegs[_Rt_].k) { + MULLI(PutHWReg32(REG_HI), GetHWReg32(REG_LO), iRegs[_Rt_].k); + } else { + MULLW(PutHWReg32(REG_HI), GetHWReg32(REG_LO), GetHWReg32(_Rt_)); + } + SUB(PutHWReg32(REG_HI), GetHWReg32(_Rs_), GetHWReg32(REG_HI)); + } + } + } else { + DIVW(PutHWReg32(REG_LO), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + if (usehi) { + MULLW(PutHWReg32(REG_HI), GetHWReg32(REG_LO), GetHWReg32(_Rt_)); + SUB(PutHWReg32(REG_HI), GetHWReg32(_Rs_), GetHWReg32(REG_HI)); + } + } +} + +static void recDIVU() { +// Lo/Hi = Rs / Rt (unsigned) + int usehi; + + if (IsConst(_Rs_) && iRegs[_Rs_].k == 0) { + MapConst(REG_LO, 0); + MapConst(REG_HI, 0); + return; + } + if (IsConst(_Rt_) && IsConst(_Rs_)) { + MapConst(REG_LO, (u32)iRegs[_Rs_].k / (u32)iRegs[_Rt_].k); + MapConst(REG_HI, (u32)iRegs[_Rs_].k % (u32)iRegs[_Rt_].k); + return; + } + + usehi = isPsxRegUsed(pc, REG_HI); + + if (IsConst(_Rt_)) { + int shift = DoShift(iRegs[_Rt_].k); + if (shift != -1) { + SRWI(PutHWReg32(REG_LO), GetHWReg32(_Rs_), shift); + if (usehi) { + RLWINM(PutHWReg32(REG_HI), GetHWReg32(_Rs_), 0, 31-shift, 31); + } + } else { + DIVWU(PutHWReg32(REG_LO), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + if (usehi) { + MULLW(PutHWReg32(REG_HI), GetHWReg32(_Rt_), GetHWReg32(REG_LO)); + SUB(PutHWReg32(REG_HI), GetHWReg32(_Rs_), GetHWReg32(REG_HI)); + } + } + } else { + DIVWU(PutHWReg32(REG_LO), GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + if (usehi) { + MULLW(PutHWReg32(REG_HI), GetHWReg32(_Rt_), GetHWReg32(REG_LO)); + SUB(PutHWReg32(REG_HI), GetHWReg32(_Rs_), GetHWReg32(REG_HI)); + } + } +} +#endif +//End of * Register mult/div & Register trap logic + +#pragma mark - memory access - + +#if 0 +REC_FUNC(LB); +REC_FUNC(LBU); +REC_FUNC(LH); +REC_FUNC(LHU); +REC_FUNC(LW); + +REC_FUNC(SB); +REC_FUNC(SH); +REC_FUNC(SW); + +REC_FUNC(LWL); +REC_FUNC(LWR); +REC_FUNC(SWL); +REC_FUNC(SWR); +#else +static void preMemRead() +{ + int rs; + + ReserveArgs(1); + if (_Rs_ != _Rt_) { + DisposeHWReg(iRegs[_Rt_].reg); + } + rs = GetHWReg32(_Rs_); + if (rs != 3 || _Imm_ != 0) { + ADDI(PutHWRegSpecial(ARG1), rs, _Imm_); + } + if (_Rs_ == _Rt_) { + DisposeHWReg(iRegs[_Rt_].reg); + } + InvalidateCPURegs(); + //FlushAllHWReg(); +} + +static void preMemWrite(int size) +{ + int rs; + + ReserveArgs(2); + rs = GetHWReg32(_Rs_); + if (rs != 3 || _Imm_ != 0) { + ADDI(PutHWRegSpecial(ARG1), rs, _Imm_); + } + if (size == 1) { + RLWINM(PutHWRegSpecial(ARG2), GetHWReg32(_Rt_), 0, 24, 31); + //ANDI_(PutHWRegSpecial(ARG2), GetHWReg32(_Rt_), 0xff); + } else if (size == 2) { + RLWINM(PutHWRegSpecial(ARG2), GetHWReg32(_Rt_), 0, 16, 31); + //ANDI_(PutHWRegSpecial(ARG2), GetHWReg32(_Rt_), 0xffff); + } else { + MR(PutHWRegSpecial(ARG2), GetHWReg32(_Rt_)); + } + + InvalidateCPURegs(); + //FlushAllHWReg(); +} + +static void recLB() { +// Rt = mem[Rs + Im] (signed) + + /*if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + if (!_Rt_) return; + // since bios is readonly it won't change + MapConst(_Rt_, psxRs8(addr)); + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (!_Rt_) return; + + addr = (u32)&psxM[addr & 0x1fffff]; + LIW(PutHWReg32(_Rt_), ((addr>>16)<<16)+(addr&0x8000<<1)); // FIXME: is this correct? + LBZ(PutHWReg32(_Rt_), addr&0xffff, GetHWReg32(_Rt_)); + EXTSB(PutHWReg32(_Rt_), GetHWReg32(_Rt_)); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (!_Rt_) return; + + addr = (u32)&psxH[addr & 0xfff]; + LIW(PutHWReg32(_Rt_), ((addr>>16)<<16)+(addr&0x8000<<1)); // FIXME: is this correct? + LBZ(PutHWReg32(_Rt_), addr&0xffff, GetHWReg32(_Rt_)); + EXTSB(PutHWReg32(_Rt_), GetHWReg32(_Rt_)); + return; + } + // SysPrintf("unhandled r8 %x\n", addr); + }*/ + + preMemRead(); + CALLFunc((u32)psxMemRead8); + if (_Rt_) { + EXTSB(PutHWReg32(_Rt_), GetHWRegSpecial(RETVAL)); + DisposeHWReg(GetSpecialIndexFromHWRegs(RETVAL)); + } +} + +static void recLBU() { +// Rt = mem[Rs + Im] (unsigned) + + /*if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + if (!_Rt_) return; + // since bios is readonly it won't change + MapConst(_Rt_, psxRu8(addr)); + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (!_Rt_) return; + + addr = (u32)&psxM[addr & 0x1fffff]; + LIW(PutHWReg32(_Rt_), ((addr>>16)<<16)+(addr&0x8000<<1)); // FIXME: is this correct? + LBZ(PutHWReg32(_Rt_), addr&0xffff, GetHWReg32(_Rt_)); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (!_Rt_) return; + + addr = (u32)&psxH[addr & 0xfff]; + LIW(PutHWReg32(_Rt_), ((addr>>16)<<16)+(addr&0x8000<<1)); // FIXME: is this correct? + LBZ(PutHWReg32(_Rt_), addr&0xffff, GetHWReg32(_Rt_)); + return; + } + // SysPrintf("unhandled r8 %x\n", addr); + }*/ + + preMemRead(); + CALLFunc((u32)psxMemRead8); + + if (_Rt_) { + SetDstCPUReg(3); + PutHWReg32(_Rt_); + } +} + +static void recLH() { +// Rt = mem[Rs + Im] (signed) + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + if (!_Rt_) return; + // since bios is readonly it won't change + MapConst(_Rt_, psxRs16(addr)); + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (!_Rt_) return; + + LIW(PutHWReg32(_Rt_), (u32)&psxM[addr & 0x1fffff]); + LHBRX(PutHWReg32(_Rt_), 0, GetHWReg32(_Rt_)); + EXTSH(PutHWReg32(_Rt_), GetHWReg32(_Rt_)); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (!_Rt_) return; + + LIW(PutHWReg32(_Rt_), (u32)&psxH[addr & 0xfff]); + LHBRX(PutHWReg32(_Rt_), 0, GetHWReg32(_Rt_)); + EXTSH(PutHWReg32(_Rt_), GetHWReg32(_Rt_)); + return; + } + // SysPrintf("unhandled r16 %x\n", addr); + } + + preMemRead(); + CALLFunc((u32)psxMemRead16); + if (_Rt_) { + EXTSH(PutHWReg32(_Rt_), GetHWRegSpecial(RETVAL)); + DisposeHWReg(GetSpecialIndexFromHWRegs(RETVAL)); + } +} + +static void recLHU() { +// Rt = mem[Rs + Im] (unsigned) + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + if (!_Rt_) return; + // since bios is readonly it won't change + MapConst(_Rt_, psxRu16(addr)); + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (!_Rt_) return; + + LIW(PutHWReg32(_Rt_), (u32)&psxM[addr & 0x1fffff]); + LHBRX(PutHWReg32(_Rt_), 0, GetHWReg32(_Rt_)); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (!_Rt_) return; + + LIW(PutHWReg32(_Rt_), (u32)&psxH[addr & 0xfff]); + LHBRX(PutHWReg32(_Rt_), 0, GetHWReg32(_Rt_)); + return; + } + if (t == 0x1f80) { + if (addr >= 0x1f801c00 && addr < 0x1f801e00) { + if (!_Rt_) return; + + ReserveArgs(1); + LIW(PutHWRegSpecial(ARG1), addr); + DisposeHWReg(iRegs[_Rt_].reg); + InvalidateCPURegs(); + CALLFunc((u32)SPU_readRegister); + + SetDstCPUReg(3); + PutHWReg32(_Rt_); + return; + } + switch (addr) { + case 0x1f801100: case 0x1f801110: case 0x1f801120: + if (!_Rt_) return; + + ReserveArgs(1); + LIW(PutHWRegSpecial(ARG1), (addr >> 4) & 0x3); + DisposeHWReg(iRegs[_Rt_].reg); + InvalidateCPURegs(); + CALLFunc((u32)psxRcntRcount); + + SetDstCPUReg(3); + PutHWReg32(_Rt_); + return; + + case 0x1f801104: case 0x1f801114: case 0x1f801124: + if (!_Rt_) return; + + ReserveArgs(1); + LIW(PutHWRegSpecial(ARG1), (addr >> 4) & 0x3); + DisposeHWReg(iRegs[_Rt_].reg); + InvalidateCPURegs(); + CALLFunc((u32)psxRcntRmode); + + SetDstCPUReg(3); + PutHWReg32(_Rt_); + return; + + case 0x1f801108: case 0x1f801118: case 0x1f801128: + if (!_Rt_) return; + + ReserveArgs(1); + LIW(PutHWRegSpecial(ARG1), (addr >> 4) & 0x3); + DisposeHWReg(iRegs[_Rt_].reg); + InvalidateCPURegs(); + CALLFunc((u32)psxRcntRtarget); + + SetDstCPUReg(3); + PutHWReg32(_Rt_); + return; + } + } + // SysPrintf("unhandled r16u %x\n", addr); + } + + preMemRead(); + CALLFunc((u32)psxMemRead16); + if (_Rt_) { + SetDstCPUReg(3); + PutHWReg32(_Rt_); + } +} + +static void recLW() { +// Rt = mem[Rs + Im] (unsigned) + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + if (!_Rt_) return; + // since bios is readonly it won't change + MapConst(_Rt_, psxRu32(addr)); + return; + } + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (!_Rt_) return; + + LIW(PutHWReg32(_Rt_), (u32)&psxM[addr & 0x1fffff]); + LWBRX(PutHWReg32(_Rt_), 0, GetHWReg32(_Rt_)); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (!_Rt_) return; + + LIW(PutHWReg32(_Rt_), (u32)&psxH[addr & 0xfff]); + LWBRX(PutHWReg32(_Rt_), 0, GetHWReg32(_Rt_)); + return; + } + if (t == 0x1f80) { + switch (addr) { + case 0x1f801080: case 0x1f801084: case 0x1f801088: + case 0x1f801090: case 0x1f801094: case 0x1f801098: + case 0x1f8010a0: case 0x1f8010a4: case 0x1f8010a8: + case 0x1f8010b0: case 0x1f8010b4: case 0x1f8010b8: + case 0x1f8010c0: case 0x1f8010c4: case 0x1f8010c8: + case 0x1f8010d0: case 0x1f8010d4: case 0x1f8010d8: + case 0x1f8010e0: case 0x1f8010e4: case 0x1f8010e8: + case 0x1f801070: case 0x1f801074: + case 0x1f8010f0: case 0x1f8010f4: + if (!_Rt_) return; + + LIW(PutHWReg32(_Rt_), (u32)&psxH[addr & 0xffff]); + LWBRX(PutHWReg32(_Rt_), 0, GetHWReg32(_Rt_)); + return; + + case 0x1f801810: + if (!_Rt_) return; + + DisposeHWReg(iRegs[_Rt_].reg); + InvalidateCPURegs(); + CALLFunc((u32)GPU_readData); + + SetDstCPUReg(3); + PutHWReg32(_Rt_); + return; + + case 0x1f801814: + if (!_Rt_) return; + + DisposeHWReg(iRegs[_Rt_].reg); + InvalidateCPURegs(); + CALLFunc((u32)GPU_readStatus); + + SetDstCPUReg(3); + PutHWReg32(_Rt_); + return; + } + } +// SysPrintf("unhandled r32 %x\n", addr); + } + + preMemRead(); + CALLFunc((u32)psxMemRead32); + if (_Rt_) { + SetDstCPUReg(3); + PutHWReg32(_Rt_); + } +} + +REC_FUNC(LWL); +REC_FUNC(LWR); +REC_FUNC(SWL); +REC_FUNC(SWR); +/*extern u32 LWL_MASK[4]; +extern u32 LWL_SHIFT[4]; + +void iLWLk(u32 shift) { + if (IsConst(_Rt_)) { + MOV32ItoR(ECX, iRegs[_Rt_].k); + } else { + MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rt_]); + } + AND32ItoR(ECX, LWL_MASK[shift]); + SHL32ItoR(EAX, LWL_SHIFT[shift]); + OR32RtoR (EAX, ECX); +} + +void recLWL() { +// Rt = Rt Merge mem[Rs + Im] + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + MOV32MtoR(EAX, (u32)&psxM[addr & 0x1ffffc]); + iLWLk(addr & 3); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + MOV32MtoR(EAX, (u32)&psxH[addr & 0xffc]); + iLWLk(addr & 3); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + } + + if (IsConst(_Rs_)) MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + PUSH32R (EAX); + AND32ItoR(EAX, ~3); + PUSH32R (EAX); + CALLFunc((u32)psxMemRead32); + + if (_Rt_) { + ADD32ItoR(ESP, 4); + POP32R (EDX); + AND32ItoR(EDX, 0x3); // shift = addr & 3; + + MOV32ItoR(ECX, (u32)LWL_SHIFT); + MOV32RmStoR(ECX, ECX, EDX, 2); + SHL32CLtoR(EAX); // mem(EAX) << LWL_SHIFT[shift] + + MOV32ItoR(ECX, (u32)LWL_MASK); + MOV32RmStoR(ECX, ECX, EDX, 2); + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k); + } else { + MOV32MtoR(EDX, (u32)&psxRegs.GPR.r[_Rt_]); + } + AND32RtoR(EDX, ECX); // _rRt_ & LWL_MASK[shift] + + OR32RtoR(EAX, EDX); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + } else { +// ADD32ItoR(ESP, 8); + resp+= 8; + } +} + +static void recLWBlock(int count) { + u32 *code = PSXM(pc); + int i, respsave; +// Rt = mem[Rs + Im] (unsigned) + +// iFlushRegs(0); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0xfff0) == 0xbfc0) { + // since bios is readonly it won't change + for (i=0; i> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + MOV32MtoR(EAX, (u32)&psxM[addr & 0x1ffffc]); + iLWRk(addr & 3); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + MOV32MtoR(EAX, (u32)&psxH[addr & 0xffc]); + iLWRk(addr & 3); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + return; + } + } + + if (IsConst(_Rs_)) MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + PUSH32R (EAX); + AND32ItoR(EAX, ~3); + PUSH32R (EAX); + CALLFunc((u32)psxMemRead32); + + if (_Rt_) { + ADD32ItoR(ESP, 4); + POP32R (EDX); + AND32ItoR(EDX, 0x3); // shift = addr & 3; + + MOV32ItoR(ECX, (u32)LWR_SHIFT); + MOV32RmStoR(ECX, ECX, EDX, 2); + SHR32CLtoR(EAX); // mem(EAX) >> LWR_SHIFT[shift] + + MOV32ItoR(ECX, (u32)LWR_MASK); + MOV32RmStoR(ECX, ECX, EDX, 2); + + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k); + } else { + MOV32MtoR(EDX, (u32)&psxRegs.GPR.r[_Rt_]); + } + AND32RtoR(EDX, ECX); // _rRt_ & LWR_MASK[shift] + + OR32RtoR(EAX, EDX); + + iRegs[_Rt_].state = ST_UNK; + MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX); + } else { +// ADD32ItoR(ESP, 8); + resp+= 8; + } +}*/ + +static void recSB() { +// mem[Rs + Im] = Rt + + /*if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (IsConst(_Rt_)) { + MOV8ItoM((u32)&psxM[addr & 0x1fffff], (u8)iRegs[_Rt_].k); + } else { + MOV8MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV8RtoM((u32)&psxM[addr & 0x1fffff], EAX); + } + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (IsConst(_Rt_)) { + MOV8ItoM((u32)&psxH[addr & 0xfff], (u8)iRegs[_Rt_].k); + } else { + MOV8MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV8RtoM((u32)&psxH[addr & 0xfff], EAX); + } + return; + } +// SysPrintf("unhandled w8 %x\n", addr); + }*/ + + preMemWrite(1); + CALLFunc((u32)psxMemWrite8); +} + +static void recSH() { +// mem[Rs + Im] = Rt + + /*if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + if (IsConst(_Rt_)) { + MOV16ItoM((u32)&psxM[addr & 0x1fffff], (u16)iRegs[_Rt_].k); + } else { + MOV16MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV16RtoM((u32)&psxM[addr & 0x1fffff], EAX); + } + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + if (IsConst(_Rt_)) { + MOV16ItoM((u32)&psxH[addr & 0xfff], (u16)iRegs[_Rt_].k); + } else { + MOV16MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]); + MOV16RtoM((u32)&psxH[addr & 0xfff], EAX); + } + return; + } + if (t == 0x1f80) { + if (addr >= 0x1f801c00 && addr < 0x1f801e00) { + if (IsConst(_Rt_)) { + PUSH32I(iRegs[_Rt_].k); + } else { + PUSH32M((u32)&psxRegs.GPR.r[_Rt_]); + } + PUSH32I (addr); + CALL32M ((u32)&SPU_writeRegister); +#ifndef __WIN32__ + resp+= 8; +#endif + return; + } + } +// SysPrintf("unhandled w16 %x\n", addr); + }*/ + + preMemWrite(2); + CALLFunc((u32)psxMemWrite16); +} + +static void recSW() { +// mem[Rs + Im] = Rt + u32 *b1, *b2; +#if 0 + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + LIW(0, addr & 0x1fffff); + STWBRX(GetHWReg32(_Rt_), GetHWRegSpecial(PSXMEM), 0); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + LIW(0, (u32)&psxH[addr & 0xfff]); + STWBRX(GetHWReg32(_Rt_), 0, 0); + return; + } + if (t == 0x1f80) { + switch (addr) { + case 0x1f801080: case 0x1f801084: + case 0x1f801090: case 0x1f801094: + case 0x1f8010a0: case 0x1f8010a4: + case 0x1f8010b0: case 0x1f8010b4: + case 0x1f8010c0: case 0x1f8010c4: + case 0x1f8010d0: case 0x1f8010d4: + case 0x1f8010e0: case 0x1f8010e4: + case 0x1f801074: + case 0x1f8010f0: + LIW(0, (u32)&psxH[addr & 0xffff]); + STWBRX(GetHWReg32(_Rt_), 0, 0); + return; + +/* case 0x1f801810: + if (IsConst(_Rt_)) { + PUSH32I(iRegs[_Rt_].k); + } else { + PUSH32M((u32)&psxRegs.GPR.r[_Rt_]); + } + CALL32M((u32)&GPU_writeData); +#ifndef __WIN32__ + resp+= 4; +#endif + return; + + case 0x1f801814: + if (IsConst(_Rt_)) { + PUSH32I(iRegs[_Rt_].k); + } else { + PUSH32M((u32)&psxRegs.GPR.r[_Rt_]); + } + CALL32M((u32)&GPU_writeStatus); +#ifndef __WIN32__ + resp+= 4; +#endif*/ + } + } +// SysPrintf("unhandled w32 %x\n", addr); + } + +/* LIS(0, 0x0079 + ((_Imm_ <= 0) ? 1 : 0)); + CMPLW(GetHWReg32(_Rs_), 0); + BGE_L(b1); + + //SaveContext(); + ADDI(0, GetHWReg32(_Rs_), _Imm_); + RLWINM(0, GetHWReg32(_Rs_), 0, 11, 31); + STWBRX(GetHWReg32(_Rt_), GetHWRegSpecial(PSXMEM), 0); + B_L(b2); + + B_DST(b1);*/ +#endif + preMemWrite(4); + CALLFunc((u32)psxMemWrite32); + + //B_DST(b2); +} + +/* +static void recSWBlock(int count) { + u32 *code; + int i, respsave; +// mem[Rs + Im] = Rt + +// iFlushRegs(); + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + code = PSXM(pc); + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + for (i=0; i> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + MOV32MtoR(EAX, (u32)&psxM[addr & 0x1ffffc]); + iSWLk(addr & 3); + MOV32RtoM((u32)&psxM[addr & 0x1ffffc], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + MOV32MtoR(EAX, (u32)&psxH[addr & 0xffc]); + iSWLk(addr & 3); + MOV32RtoM((u32)&psxH[addr & 0xffc], EAX); + return; + } + } + + if (IsConst(_Rs_)) MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + PUSH32R (EAX); + AND32ItoR(EAX, ~3); + PUSH32R (EAX); + + CALLFunc((u32)psxMemRead32); + + ADD32ItoR(ESP, 4); + POP32R (EDX); + AND32ItoR(EDX, 0x3); // shift = addr & 3; + + MOV32ItoR(ECX, (u32)SWL_MASK); + MOV32RmStoR(ECX, ECX, EDX, 2); + AND32RtoR(EAX, ECX); // mem & SWL_MASK[shift] + + MOV32ItoR(ECX, (u32)SWL_SHIFT); + MOV32RmStoR(ECX, ECX, EDX, 2); + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k); + } else { + MOV32MtoR(EDX, (u32)&psxRegs.GPR.r[_Rt_]); + } + SHR32CLtoR(EDX); // _rRt_ >> SWL_SHIFT[shift] + + OR32RtoR (EAX, EDX); + PUSH32R (EAX); + + if (IsConst(_Rs_)) MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + AND32ItoR(EAX, ~3); + PUSH32R (EAX); + + CALLFunc((u32)psxMemWrite32); +// ADD32ItoR(ESP, 8); + resp+= 8; +} + +extern u32 SWR_MASK[4]; +extern u32 SWR_SHIFT[4]; + +void iSWRk(u32 shift) { + if (IsConst(_Rt_)) { + MOV32ItoR(ECX, iRegs[_Rt_].k); + } else { + MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rt_]); + } + SHL32ItoR(ECX, SWR_SHIFT[shift]); + AND32ItoR(EAX, SWR_MASK[shift]); + OR32RtoR (EAX, ECX); +} + +void recSWR() { +// mem[Rs + Im] = Rt Merge mem[Rs + Im] + + if (IsConst(_Rs_)) { + u32 addr = iRegs[_Rs_].k + _Imm_; + int t = addr >> 16; + + if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) { + MOV32MtoR(EAX, (u32)&psxM[addr & 0x1ffffc]); + iSWRk(addr & 3); + MOV32RtoM((u32)&psxM[addr & 0x1ffffc], EAX); + return; + } + if (t == 0x1f80 && addr < 0x1f801000) { + MOV32MtoR(EAX, (u32)&psxH[addr & 0xffc]); + iSWRk(addr & 3); + MOV32RtoM((u32)&psxH[addr & 0xffc], EAX); + return; + } + } + + if (IsConst(_Rs_)) MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + PUSH32R (EAX); + AND32ItoR(EAX, ~3); + PUSH32R (EAX); + + CALLFunc((u32)psxMemRead32); + + ADD32ItoR(ESP, 4); + POP32R (EDX); + AND32ItoR(EDX, 0x3); // shift = addr & 3; + + MOV32ItoR(ECX, (u32)SWR_MASK); + MOV32RmStoR(ECX, ECX, EDX, 2); + AND32RtoR(EAX, ECX); // mem & SWR_MASK[shift] + + MOV32ItoR(ECX, (u32)SWR_SHIFT); + MOV32RmStoR(ECX, ECX, EDX, 2); + if (IsConst(_Rt_)) { + MOV32ItoR(EDX, iRegs[_Rt_].k); + } else { + MOV32MtoR(EDX, (u32)&psxRegs.GPR.r[_Rt_]); + } + SHL32CLtoR(EDX); // _rRt_ << SWR_SHIFT[shift] + + OR32RtoR (EAX, EDX); + PUSH32R (EAX); + + if (IsConst(_Rs_)) MOV32ItoR(EAX, iRegs[_Rs_].k + _Imm_); + else { + MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]); + if (_Imm_) ADD32ItoR(EAX, _Imm_); + } + AND32ItoR(EAX, ~3); + PUSH32R (EAX); + + CALLFunc((u32)psxMemWrite32); +// ADD32ItoR(ESP, 8); + resp+= 8; +}*/ +#endif + +#if 0 +/*REC_FUNC(SLL); +REC_FUNC(SRL); +REC_FUNC(SRA);*/ +#else +static void recSLL() { +// Rd = Rt << Sa + if (!_Rd_) return; + + if (IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rt_].k << _Sa_); + } else { + SLWI(PutHWReg32(_Rd_), GetHWReg32(_Rt_), _Sa_); + } +} + +static void recSRL() { +// Rd = Rt >> Sa + if (!_Rd_) return; + + if (IsConst(_Rt_)) { + MapConst(_Rd_, iRegs[_Rt_].k >> _Sa_); + } else { + SRWI(PutHWReg32(_Rd_), GetHWReg32(_Rt_), _Sa_); + } +} + +static void recSRA() { +// Rd = Rt >> Sa + if (!_Rd_) return; + + if (IsConst(_Rt_)) { + MapConst(_Rd_, (s32)iRegs[_Rt_].k >> _Sa_); + } else { + SRAWI(PutHWReg32(_Rd_), GetHWReg32(_Rt_), _Sa_); + } +} +#endif + +#pragma mark - shift ops - +#if 0 +/*REC_FUNC(SLLV); +REC_FUNC(SRLV); +REC_FUNC(SRAV);*/ +#else +static void recSLLV() { +// Rd = Rt << Rs + if (!_Rd_) return; + + if (IsConst(_Rt_) && IsConst(_Rs_)) { + MapConst(_Rd_, iRegs[_Rt_].k << iRegs[_Rs_].k); + } else if (IsConst(_Rs_) && !IsMapped(_Rs_)) { + SLWI(PutHWReg32(_Rd_), GetHWReg32(_Rt_), iRegs[_Rs_].k); + } else { + SLW(PutHWReg32(_Rd_), GetHWReg32(_Rt_), GetHWReg32(_Rs_)); + } +} + +static void recSRLV() { +// Rd = Rt >> Rs + if (!_Rd_) return; + + if (IsConst(_Rt_) && IsConst(_Rs_)) { + MapConst(_Rd_, iRegs[_Rt_].k >> iRegs[_Rs_].k); + } else if (IsConst(_Rs_) && !IsMapped(_Rs_)) { + SRWI(PutHWReg32(_Rd_), GetHWReg32(_Rt_), iRegs[_Rs_].k); + } else { + SRW(PutHWReg32(_Rd_), GetHWReg32(_Rt_), GetHWReg32(_Rs_)); + } +} + +static void recSRAV() { +// Rd = Rt >> Rs + if (!_Rd_) return; + + if (IsConst(_Rt_) && IsConst(_Rs_)) { + MapConst(_Rd_, (s32)iRegs[_Rt_].k >> iRegs[_Rs_].k); + } else if (IsConst(_Rs_) && !IsMapped(_Rs_)) { + SRAWI(PutHWReg32(_Rd_), GetHWReg32(_Rt_), iRegs[_Rs_].k); + } else { + SRAW(PutHWReg32(_Rd_), GetHWReg32(_Rt_), GetHWReg32(_Rs_)); + } +} +#endif + +//REC_SYS(SYSCALL); +//REC_SYS(BREAK); + +//#if 0*/ +/*int dump;*/ +static void recSYSCALL() { +// dump=1; + iFlushRegs(0); + + ReserveArgs(2); + LIW(PutHWRegSpecial(PSXPC), pc - 4); + LIW(PutHWRegSpecial(ARG1), 0x20); + LIW(PutHWRegSpecial(ARG2), (branch == 1 ? 1 : 0)); + FlushAllHWReg(); + CALLFunc ((u32)psxException); + + branch = 2; + iRet(); +} + +static void recBREAK() { +} +//#endif + +#if 0 +/*REC_FUNC(MFHI); +REC_FUNC(MTHI); +REC_FUNC(MFLO); +REC_FUNC(MTLO);*/ +#else +static void recMFHI() { +// Rd = Hi + if (!_Rd_) return; + + if (IsConst(REG_HI)) { + MapConst(_Rd_, iRegs[REG_HI].k); + } else { + MapCopy(_Rd_, REG_HI); + } +} + +static void recMTHI() { +// Hi = Rs + + if (IsConst(_Rs_)) { + MapConst(REG_HI, iRegs[_Rs_].k); + } else { + MapCopy(REG_HI, _Rs_); + } +} + +static void recMFLO() { +// Rd = Lo + if (!_Rd_) return; + + if (IsConst(REG_LO)) { + MapConst(_Rd_, iRegs[REG_LO].k); + } else { + MapCopy(_Rd_, REG_LO); + } +} + +static void recMTLO() { +// Lo = Rs + + if (IsConst(_Rs_)) { + MapConst(REG_LO, iRegs[_Rs_].k); + } else { + MapCopy(REG_LO, _Rs_); + } +} +#endif + +#pragma mark - branch ops - +#if 0 +/*REC_BRANCH(J); +REC_BRANCH(JR); +REC_BRANCH(JAL); +REC_BRANCH(JALR); +REC_BRANCH(BLTZ); +REC_BRANCH(BGTZ); +REC_BRANCH(BLTZAL); +REC_BRANCH(BGEZAL); +REC_BRANCH(BNE); +REC_BRANCH(BEQ); +REC_BRANCH(BLEZ); +REC_BRANCH(BGEZ);*/ +#else +static void recBLTZ() { +// Branch if Rs < 0 + u32 bpc = _Imm_ * 4 + pc; + u32 *b; + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k < 0) { + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } + + CMPWI(GetHWReg32(_Rs_), 0); + BLT_L(b); + + iBranch(pc+4, 1); + + B_DST(b); + + iBranch(bpc, 0); + pc+=4; +} + +static void recBGTZ() { +// Branch if Rs > 0 + u32 bpc = _Imm_ * 4 + pc; + u32 *b; + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k > 0) { + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } + + CMPWI(GetHWReg32(_Rs_), 0); + BGT_L(b); + + iBranch(pc+4, 1); + + B_DST(b); + + iBranch(bpc, 0); + pc+=4; +} + +static void recBLTZAL() { +// Branch if Rs < 0 + u32 bpc = _Imm_ * 4 + pc; + u32 *b; + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k < 0) { + MapConst(31, pc + 4); + + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } + + CMPWI(GetHWReg32(_Rs_), 0); + BLT_L(b); + + iBranch(pc+4, 1); + + B_DST(b); + + MapConst(31, pc + 4); + + iBranch(bpc, 0); + pc+=4; +} + +static void recBGEZAL() { +// Branch if Rs >= 0 + u32 bpc = _Imm_ * 4 + pc; + u32 *b; + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k >= 0) { + MapConst(31, pc + 4); + + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } + + CMPWI(GetHWReg32(_Rs_), 0); + BGE_L(b); + + iBranch(pc+4, 1); + + B_DST(b); + + MapConst(31, pc + 4); + + iBranch(bpc, 0); + pc+=4; +} + +static void recJ() { +// j target + + iJump(_Target_ * 4 + (pc & 0xf0000000)); +} + +static void recJAL() { +// jal target + MapConst(31, pc + 4); + + iJump(_Target_ * 4 + (pc & 0xf0000000)); +} + +static void recJR() { +// jr Rs + + if (IsConst(_Rs_)) { + iJump(iRegs[_Rs_].k); + //LIW(PutHWRegSpecial(TARGET), iRegs[_Rs_].k); + } else { + MR(PutHWRegSpecial(TARGET), GetHWReg32(_Rs_)); + SetBranch(); + } +} + +static void recJALR() { +// jalr Rs + + if (_Rd_) { + MapConst(_Rd_, pc + 4); + } + + if (IsConst(_Rs_)) { + iJump(iRegs[_Rs_].k); + //LIW(PutHWRegSpecial(TARGET), iRegs[_Rs_].k); + } else { + MR(PutHWRegSpecial(TARGET), GetHWReg32(_Rs_)); + SetBranch(); + } +} + +static void recBEQ() { +// Branch if Rs == Rt + u32 bpc = _Imm_ * 4 + pc; + u32 *b; + + if (_Rs_ == _Rt_) { + iJump(bpc); + } + else { + if (IsConst(_Rs_) && IsConst(_Rt_)) { + if (iRegs[_Rs_].k == iRegs[_Rt_].k) { + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } + else if (IsConst(_Rs_) && !IsMapped(_Rs_)) { + if ((iRegs[_Rs_].k & 0xffff) == iRegs[_Rs_].k) { + CMPLWI(GetHWReg32(_Rt_), iRegs[_Rs_].k); + } + else if ((s32)(s16)iRegs[_Rs_].k == (s32)iRegs[_Rs_].k) { + CMPWI(GetHWReg32(_Rt_), iRegs[_Rs_].k); + } + else { + CMPLW(GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } + else if (IsConst(_Rt_) && !IsMapped(_Rt_)) { + if ((iRegs[_Rt_].k & 0xffff) == iRegs[_Rt_].k) { + CMPLWI(GetHWReg32(_Rs_), iRegs[_Rt_].k); + } + else if ((s32)(s16)iRegs[_Rt_].k == (s32)iRegs[_Rt_].k) { + CMPWI(GetHWReg32(_Rs_), iRegs[_Rt_].k); + } + else { + CMPLW(GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } + else { + CMPLW(GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + + BEQ_L(b); + + iBranch(pc+4, 1); + + B_DST(b); + + iBranch(bpc, 0); + pc+=4; + } +} + +static void recBNE() { +// Branch if Rs != Rt + u32 bpc = _Imm_ * 4 + pc; + u32 *b; + + if (_Rs_ == _Rt_) { + iJump(pc+4); + } + else { + if (IsConst(_Rs_) && IsConst(_Rt_)) { + if (iRegs[_Rs_].k != iRegs[_Rt_].k) { + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } + else if (IsConst(_Rs_) && !IsMapped(_Rs_)) { + if ((iRegs[_Rs_].k & 0xffff) == iRegs[_Rs_].k) { + CMPLWI(GetHWReg32(_Rt_), iRegs[_Rs_].k); + } + else if ((s32)(s16)iRegs[_Rs_].k == (s32)iRegs[_Rs_].k) { + CMPWI(GetHWReg32(_Rt_), iRegs[_Rs_].k); + } + else { + CMPLW(GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } + else if (IsConst(_Rt_) && !IsMapped(_Rt_)) { + if ((iRegs[_Rt_].k & 0xffff) == iRegs[_Rt_].k) { + CMPLWI(GetHWReg32(_Rs_), iRegs[_Rt_].k); + } + else if ((s32)(s16)iRegs[_Rt_].k == (s32)iRegs[_Rt_].k) { + CMPWI(GetHWReg32(_Rs_), iRegs[_Rt_].k); + } + else { + CMPLW(GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + } + else { + CMPLW(GetHWReg32(_Rs_), GetHWReg32(_Rt_)); + } + + BNE_L(b); + + iBranch(pc+4, 1); + + B_DST(b); + + iBranch(bpc, 0); + pc+=4; + } +} + +static void recBLEZ() { +// Branch if Rs <= 0 + u32 bpc = _Imm_ * 4 + pc; + u32 *b; + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k <= 0) { + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } + + CMPWI(GetHWReg32(_Rs_), 0); + BLE_L(b); + + iBranch(pc+4, 1); + + B_DST(b); + + iBranch(bpc, 0); + pc+=4; +} + +static void recBGEZ() { +// Branch if Rs >= 0 + u32 bpc = _Imm_ * 4 + pc; + u32 *b; + + if (IsConst(_Rs_)) { + if ((s32)iRegs[_Rs_].k >= 0) { + iJump(bpc); return; + } else { + iJump(pc+4); return; + } + } + + CMPWI(GetHWReg32(_Rs_), 0); + BGE_L(b); + + iBranch(pc+4, 1); + + B_DST(b); + + iBranch(bpc, 0); + pc+=4; +} +#endif + +#if 1 +//REC_FUNC(MFC0); +//REC_SYS(MTC0); +//REC_FUNC(CFC0); +//REC_SYS(CTC0); +REC_FUNC(RFE); +//#else +static void recMFC0() { +// Rt = Cop0->Rd + if (!_Rt_) return; + + LWZ(PutHWReg32(_Rt_), OFFSET(&psxRegs, &psxRegs.CP0.r[_Rd_]), GetHWRegSpecial(PSXREGS)); +} + +static void recCFC0() { +// Rt = Cop0->Rd + + recMFC0(); +} + +static void recMTC0() { +// Cop0->Rd = Rt + + /*if (IsConst(_Rt_)) { + switch (_Rd_) { + case 12: + MOV32ItoM((u32)&psxRegs.CP0.r[_Rd_], iRegs[_Rt_].k); + break; + case 13: + MOV32ItoM((u32)&psxRegs.CP0.r[_Rd_], iRegs[_Rt_].k & ~(0xfc00)); + break; + default: + MOV32ItoM((u32)&psxRegs.CP0.r[_Rd_], iRegs[_Rt_].k); + break; + } + } else*/ { + switch (_Rd_) { + case 13: + RLWINM(0,GetHWReg32(_Rt_),0,22,15); // & ~(0xfc00) + STW(0, OFFSET(&psxRegs, &psxRegs.CP0.r[_Rd_]), GetHWRegSpecial(PSXREGS)); + break; + default: + STW(GetHWReg32(_Rt_), OFFSET(&psxRegs, &psxRegs.CP0.r[_Rd_]), GetHWRegSpecial(PSXREGS)); + break; + } + } + + if (_Rd_ == 12 || _Rd_ == 13) { + iFlushRegs(0); + LIW(PutHWRegSpecial(PSXPC), (u32)pc); + FlushAllHWReg(); + CALLFunc((u32)psxTestSWInts); + if(_Rd_ == 12) { + LWZ(0, OFFSET(&psxRegs, &psxRegs.interrupt), GetHWRegSpecial(PSXREGS)); + ORIS(0, 0, 0x8000); + STW(0, OFFSET(&psxRegs, &psxRegs.interrupt), GetHWRegSpecial(PSXREGS)); + } + branch = 2; + iRet(); + } +} + +static void recCTC0() { +// Cop0->Rd = Rt + + recMTC0(); +} +#else +static void recRFE() { + // TODO: implement multiple temp registers or cop0 registers + RLWINM(t1,Status,0,0,27); + RLWINM(Status,Status,30,28,31); + OR(Status,t1,Status); + + MOV32MtoR(EAX, (u32)&psxRegs.CP0.n.Status); + MOV32RtoR(ECX, EAX); + AND32ItoR(EAX, 0xfffffff0); + AND32ItoR(ECX, 0x3c); + SHR32ItoR(ECX, 2); + OR32RtoR (EAX, ECX); + MOV32RtoM((u32)&psxRegs.CP0.n.Status, EAX); + CALLFunc((u32)psxExceptionTest); +} +#endif + +#if 0 +#define CP2_FUNC(f) \ +void gte##f(); \ +static void rec##f() { \ + iFlushRegs(0); \ + LIW(0, (u32)psxRegs.code); \ + STW(0, OFFSET(&psxRegs, &psxRegs.code), GetHWRegSpecial(PSXREGS)); \ + FlushAllHWReg(); \ + CALLFunc ((u32)gte##f); \ +} +CP2_FUNC(LWC2); +CP2_FUNC(SWC2); + +#else +#include "pGte.h" +#endif +// + +static void recHLE() { + iFlushRegs(0); + FlushAllHWReg(); + + if ((psxRegs.code & 0x3ffffff) == (psxRegs.code & 0x7)) { + CALLFunc((u32)psxHLEt[psxRegs.code & 0x7]); + } else { + // somebody else must have written to current opcode for this to happen!!!! + CALLFunc((u32)psxHLEt[0]); // call dummy function + } + + count = (idlecyclecount + (pc - pcold) / 4 + 20) * BIAS; + ADDI(PutHWRegSpecial(CYCLECOUNT), GetHWRegSpecial(CYCLECOUNT), count); + FlushAllHWReg(); + CALLFunc((u32)psxBranchTest); + Return(); + + branch = 2; +} + +// + +static void (*recBSC[64])() = { + recSPECIAL, recREGIMM, recJ , recJAL , recBEQ , recBNE , recBLEZ, recBGTZ, + recADDI , recADDIU , recSLTI, recSLTIU, recANDI, recORI , recXORI, recLUI , + recCOP0 , recNULL , recCOP2, recNULL , recNULL, recNULL, recNULL, recNULL, + recNULL , recNULL , recNULL, recNULL , recNULL, recNULL, recNULL, recNULL, + recLB , recLH , recLWL , recLW , recLBU , recLHU , recLWR , recNULL, + recSB , recSH , recSWL , recSW , recNULL, recNULL, recSWR , recNULL, + recNULL , recNULL , recLWC2, recNULL , recNULL, recNULL, recNULL, recNULL, + recNULL , recNULL , recSWC2, recHLE , recNULL, recNULL, recNULL, recNULL +}; + +static void (*recSPC[64])() = { + recSLL , recNULL, recSRL , recSRA , recSLLV , recNULL , recSRLV, recSRAV, + recJR , recJALR, recNULL, recNULL, recSYSCALL, recBREAK, recNULL, recNULL, + recMFHI, recMTHI, recMFLO, recMTLO, recNULL , recNULL , recNULL, recNULL, + recMULT, recMULTU, recDIV, recDIVU, recNULL , recNULL , recNULL, recNULL, + recADD , recADDU, recSUB , recSUBU, recAND , recOR , recXOR , recNOR , + recNULL, recNULL, recSLT , recSLTU, recNULL , recNULL , recNULL, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL , recNULL , recNULL, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL , recNULL , recNULL, recNULL +}; + +static void (*recREG[32])() = { + recBLTZ , recBGEZ , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recNULL , recNULL , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recBLTZAL, recBGEZAL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recNULL , recNULL , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL +}; + +static void (*recCP0[32])() = { + recMFC0, recNULL, recCFC0, recNULL, recMTC0, recNULL, recCTC0, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recRFE , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL +}; + +static void (*recCP2[64])() = { + recBASIC, recRTPS , recNULL , recNULL, recNULL, recNULL , recNCLIP, recNULL, // 00 + recNULL , recNULL , recNULL , recNULL, recOP , recNULL , recNULL , recNULL, // 08 + recDPCS , recINTPL, recMVMVA, recNCDS, recCDP , recNULL , recNCDT , recNULL, // 10 + recNULL , recNULL , recNULL , recNCCS, recCC , recNULL , recNCS , recNULL, // 18 + recNCT , recNULL , recNULL , recNULL, recNULL, recNULL , recNULL , recNULL, // 20 + recSQR , recDCPL , recDPCT , recNULL, recNULL, recAVSZ3, recAVSZ4, recNULL, // 28 + recRTPT , recNULL , recNULL , recNULL, recNULL, recNULL , recNULL , recNULL, // 30 + recNULL , recNULL , recNULL , recNULL, recNULL, recGPF , recGPL , recNCCT // 38 +}; + +static void (*recCP2BSC[32])() = { + recMFC2, recNULL, recCFC2, recNULL, recMTC2, recNULL, recCTC2, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, + recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL +}; + +static void recRecompile() { + //static int recCount = 0; + char *p; + u32 *ptr; + int i; + + cop2readypc = 0; + idlecyclecount = 0; + + // initialize state variables + UniqueRegAlloc = 1; + HWRegUseCount = 0; + DstCPUReg = -1; + memset(HWRegisters, 0, sizeof(HWRegisters)); + for (i=0; i= (RECMEM_SIZE - 0x10000)) + recReset(); + + ppcAlign(/*32*/4); + ptr = ppcPtr; + + // give us write access + //mprotect(recMem, RECMEM_SIZE, PROT_EXEC|PROT_READ|PROT_WRITE); + + // tell the LUT where to find us + PC_REC32(psxRegs.pc) = (u32)ppcPtr; + + pcold = pc = psxRegs.pc; + + //SysPrintf("RecCount: %i\n", recCount++); + + for (count=0; count<500;) { + p = (char *)PSXM(pc); + if (p == NULL) recError(); + psxRegs.code = SWAP32(*(u32 *)p); +/* + if ((psxRegs.code >> 26) == 0x23) { // LW + int i; + u32 code; + + for (i=1;; i++) { + p = (char *)PSXM(pc+i*4); + if (p == NULL) recError(); + code = *(u32 *)p; + + if ((code >> 26) != 0x23 || + _fRs_(code) != _Rs_ || + _fImm_(code) != (_Imm_+i*4)) + break; + } + if (i > 1) { + recLWBlock(i); + pc = pc + i*4; continue; + } + } + + if ((psxRegs.code >> 26) == 0x2b) { // SW + int i; + u32 code; + + for (i=1;; i++) { + p = (char *)PSXM(pc+i*4); + if (p == NULL) recError(); + code = *(u32 *)p; + + if ((code >> 26) != 0x2b || + _fRs_(code) != _Rs_ || + _fImm_(code) != (_Imm_+i*4)) + break; + } + if (i > 1) { + recSWBlock(i); + pc = pc + i*4; continue; + } + }*/ + + pc+=4; count++; +// iFlushRegs(0); // test + recBSC[psxRegs.code>>26](); + + if (branch) { + branch = 0; + //if (dump) iDumpBlock(ptr); + goto done; + } + } + + iFlushRegs(pc); + + LIW(PutHWRegSpecial(PSXPC), pc); + + iRet(); + +done:; +#if 0 + MakeDataExecutable(ptr, ((u8*)ppcPtr)-((u8*)ptr)); +#else + u32 a = (u32)(u8*)ptr; + while(a < (u32)(u8*)ppcPtr) { + __asm__ __volatile__("icbi 0,%0" : : "r" (a)); + __asm__ __volatile__("dcbst 0,%0" : : "r" (a)); + a += 4; + } + __asm__ __volatile__("sync"); + __asm__ __volatile__("isync"); +#endif + +#if 1 + sprintf((char *)ppcPtr, "PC=%08x", pcold); + ppcPtr += strlen((char *)ppcPtr); +#endif + + //mprotect(recMem, RECMEM_SIZE, PROT_EXEC|PROT_READ/*|PROT_WRITE*/); +} + + +R3000Acpu psxRec = { + recInit, + recReset, + recExecute, + recExecuteBlock, + recClear, + recShutdown +}; + diff --git a/libpcsxcore/ppc/pasm.s b/libpcsxcore/ppc/pasm.s new file mode 100644 index 0000000..96891b4 --- /dev/null +++ b/libpcsxcore/ppc/pasm.s @@ -0,0 +1,124 @@ + + +#define OLD_REGISTER_OFFSET (19*4) +#define SP_SIZE (OLD_REGISTER_OFFSET+4+8) + +/*asm void recRun(register void (*func)(), register u32 hw1, register u32 hw2)*/ + .text + .align 4 + .globl recRun +recRun: + /* prologue code */ + mflr r0 + stmw r13, -(32-13)*4(r1) + stw r0, 4(r1) + stwu r1, -((32-13)*4+8)(r1) + + /* execute code */ + mtctr r3 + mr r31, r4 + mr r30, r5 + bctrl +/* +} +asm void returnPC() +{*/ + .text + .align 4 + .globl returnPC +returnPC: + // end code + lwz r0, (32-13)*4+8+4(r1) + addi r1, r1, (32-13)*4+8 + mtlr r0 + lmw r13, -(32-13)*4(r1) + blr +//}*/ + +// Memory functions that only works with a linear memory + + .text + .align 4 + .globl dynMemRead8 +dynMemRead8: +// assumes that memory pointer is in r30 + addis r2,r3,-0x1f80 + srwi. r4,r2,16 + bne+ .norm8 + cmplwi r2,0x1000 + blt- .norm8 + b psxHwRead8 +.norm8: + clrlwi r5,r3,3 + lbzx r3,r5,r30 + blr + + .text + .align 4 + .globl dynMemRead16 +dynMemRead16: +// assumes that memory pointer is in r30 + addis r2,r3,-0x1f80 + srwi. r4,r2,16 + bne+ .norm16 + cmplwi r2,0x1000 + blt- .norm16 + b psxHwRead16 +.norm16: + clrlwi r5,r3,3 + lhbrx r3,r5,r30 + blr + + .text + .align 4 + .globl dynMemRead32 +dynMemRead32: +// assumes that memory pointer is in r30 + addis r2,r3,-0x1f80 + srwi. r4,r2,16 + bne+ .norm32 + cmplwi r2,0x1000 + blt- .norm32 + b psxHwRead32 +.norm32: + clrlwi r5,r3,3 + lwbrx r3,r5,r30 + blr + +/* + N P Z + 0 0 0 X +- 0 0 1 X + 1 0 0 X + 1 0 1 X + +P | (!N & Z) +P | !(N | !Z) +*/ + + .text + .align 4 + .globl dynMemWrite32 +dynMemWrite32: +// assumes that memory pointer is in r30 + addis r2,r3,-0x1f80 + srwi. r5,r2,16 + bne+ .normw32 + cmplwi r2,0x1000 + blt .normw32 + b psxHwWrite32 +.normw32: + mtcrf 0xFF, r3 + clrlwi r5,r3,3 + crandc 0, 2, 0 + cror 2, 1, 0 + bne+ .okw32 + // write test + li r2,0x0130 + addis r2,r2,0xfffe + cmplw r3,r2 + bnelr +.okw32: + stwbrx r4,r5,r30 + blr + diff --git a/libpcsxcore/ppc/ppc.c b/libpcsxcore/ppc/ppc.c new file mode 100644 index 0000000..efaf8b6 --- /dev/null +++ b/libpcsxcore/ppc/ppc.c @@ -0,0 +1,32 @@ +/* + * ix86 core v0.5.1 + * Authors: linuzappz + * alexey silinov + */ + +#include +#include + +#include "ppc.h" + +// General Purpose hardware registers +int cpuHWRegisters[NUM_HW_REGISTERS] = { + 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 +}; + +u32 *ppcPtr; + +void ppcInit() { +} +void ppcSetPtr(u32 *ptr) { + ppcPtr = ptr; +} +void ppcAlign(int bytes) { + // forward align + ppcPtr = (u32*)(((u32)ppcPtr + bytes) & ~(bytes - 1)); +} + +void ppcShutdown() { +} + diff --git a/libpcsxcore/ppc/ppc.h b/libpcsxcore/ppc/ppc.h new file mode 100644 index 0000000..a6134d4 --- /dev/null +++ b/libpcsxcore/ppc/ppc.h @@ -0,0 +1,60 @@ +/* + * ppc definitions v0.5.1 + * Authors: linuzappz + * alexey silinov + */ + +#ifndef __PPC_H__ +#define __PPC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +// include basic types +#include "../psxcommon.h" +#include "ppc_mnemonics.h" + +#define NUM_HW_REGISTERS 29 + +/* general defines */ +#define write8(val) *(u8 *)ppcPtr = val; ppcPtr++; +#define write16(val) *(u16*)ppcPtr = val; ppcPtr+=2; +#define write32(val) *(u32*)ppcPtr = val; ppcPtr+=4; +#define write64(val) *(u64*)ppcPtr = val; ppcPtr+=8; + +#define CALLFunc(FUNC) \ +{ \ + u32 _func = (FUNC); \ + ReleaseArgs(); \ + if ((_func & 0x1fffffc) == _func) { \ + BLA(_func); \ + } else { \ + LIW(0, _func); \ + MTCTR(0); \ + BCTRL(); \ + } \ +} + +extern int cpuHWRegisters[NUM_HW_REGISTERS]; + +extern u32 *ppcPtr; +extern u8 *j8Ptr[32]; +extern u32 *j32Ptr[32]; + +void ppcInit(); +void ppcSetPtr(u32 *ptr); +void ppcShutdown(); + +void ppcAlign(int bytes); +void returnPC(); +void recRun(void (*func)(), u32 hw1, u32 hw2); +u8 dynMemRead8(u32 mem); +u16 dynMemRead16(u32 mem); +u32 dynMemRead32(u32 mem); +void dynMemWrite32(u32 mem, u32 val); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/ppc/ppc_mnemonics.h b/libpcsxcore/ppc/ppc_mnemonics.h new file mode 100644 index 0000000..3cc6525 --- /dev/null +++ b/libpcsxcore/ppc/ppc_mnemonics.h @@ -0,0 +1,529 @@ +// ppc_mnemonics.h + +#define INSTR (*(ppcPtr)++) + +/* Link register related */ +#define MFLR(REG) \ + {int _reg = (REG); \ + INSTR = (0x7C0802A6 | (_reg << 21));} + +#define MTLR(REG) \ + {int _reg = (REG); \ + INSTR = (0x7C0803A6 | (_reg << 21));} + +#define MTCTR(REG) \ + {int _reg = (REG); \ + INSTR = (0x7C0903A6 | (_reg << 21));} + +#define BLR() \ + {INSTR = (0x4E800020);} + +#define BGTLR() \ + {INSTR = (0x4D810020);} + + +/* Load ops */ +#define LI(REG, IMM) \ + {int _reg = (REG); \ + INSTR = (0x38000000 | (_reg << 21) | ((IMM) & 0xffff));} + +#define LIS(REG_DST, IMM) \ + {int _dst = (REG_DST); \ + INSTR = (0x3C000000 | (_dst << 21) | ((IMM) & 0xffff));} + +#define LWZ(REG_DST, OFFSET, REG) \ + {int _reg = (REG); int _dst=(REG_DST); \ + INSTR = (0x80000000 | (_dst << 21) | (_reg << 16) | ((OFFSET) & 0xffff));} + +#define LWZX(REG_DST, REG, REG_OFF) \ + {int _reg = (REG), _off = (REG_OFF); int _dst=(REG_DST); \ + INSTR = (0x7C00002E | (_dst << 21) | (_reg << 16) | (_off << 11));} + +#define LWBRX(REG_DST, REG, REG_OFF) \ + {int _reg = (REG), _off = (REG_OFF); int _dst=(REG_DST); \ + INSTR = (0x7C00042C | (_dst << 21) | (_reg << 16) | (_off << 11));} + +#define LHZ(REG_DST, OFFSET, REG) \ + {int _reg = (REG); int _dst=(REG_DST); \ + INSTR = (0xA0000000 | (_dst << 21) | (_reg << 16) | ((OFFSET) & 0xffff));} + +#define LHA(REG_DST, OFFSET, REG) \ + {int _reg = (REG); int _dst=(REG_DST); \ + INSTR = (0xA8000000 | (_dst << 21) | (_reg << 16) | ((OFFSET) & 0xffff));} + +#define LHBRX(REG_DST, REG, REG_OFF) \ + {int _reg = (REG), _off = (REG_OFF); int _dst=(REG_DST); \ + INSTR = (0x7C00062C | (_dst << 21) | (_reg << 16) | (_off << 11));} + +#define LBZ(REG_DST, OFFSET, REG) \ + {int _reg = (REG); int _dst=(REG_DST); \ + INSTR = (0x88000000 | (_dst << 21) | (_reg << 16) | ((OFFSET) & 0xffff));} + +#define LMW(REG_DST, OFFSET, REG) \ + {int _reg = (REG); int _dst=(REG_DST); \ + INSTR = (0xB8000000 | (_dst << 21) | (_reg << 16) | ((OFFSET) & 0xffff));} + + + +/* Store ops */ +#define STMW(REG_SRC, OFFSET, REG) \ + {int _reg = (REG), _src=(REG_SRC); \ + INSTR = (0xBC000000 | (_src << 21) | (_reg << 16) | ((OFFSET) & 0xffff));} + +#define STW(REG_SRC, OFFSET, REG) \ + {int _reg = (REG), _src=(REG_SRC); \ + INSTR = (0x90000000 | (_src << 21) | (_reg << 16) | ((OFFSET) & 0xffff));} + +#define STWBRX(REG_SRC, REG, REG_OFF) \ + {int _reg = (REG), _src=(REG_SRC), _off = (REG_OFF); \ + INSTR = (0x7C00052C | (_src << 21) | (_reg << 16) | (_off << 11));} + +#define STH(REG_SRC, OFFSET, REG) \ + {int _reg = (REG), _src=(REG_SRC); \ + INSTR = (0xB0000000 | (_src << 21) | (_reg << 16) | ((OFFSET) & 0xffff));} + +#define STHBRX(REG_SRC, REG, REG_OFF) \ + {int _reg = (REG), _src=(REG_SRC), _off = (REG_OFF); \ + INSTR = (0x7C00072C | (_src << 21) | (_reg << 16) | (_off << 11));} + +#define STB(REG_SRC, OFFSET, REG) \ + {int _reg = (REG), _src=(REG_SRC); \ + INSTR = (0x98000000 | (_src << 21) | (_reg << 16) | ((OFFSET) & 0xffff));} + +#define STWU(REG_SRC, OFFSET, REG) \ + {int _reg = (REG), _src=(REG_SRC); \ + INSTR = (0x94000000 | (_src << 21) | (_reg << 16) | ((OFFSET) & 0xffff));} + + +/* Arithmic ops */ +#define ADDI(REG_DST, REG_SRC, IMM) \ + {int _src = (REG_SRC); int _dst=(REG_DST); \ + INSTR = (0x38000000 | (_dst << 21) | (_src << 16) | ((IMM) & 0xffff));} + +#define ADDIS(REG_DST, REG_SRC, IMM) \ + {int _src = (REG_SRC); int _dst=(REG_DST); \ + INSTR = (0x3C000000 | (_dst << 21) | (_src << 16) | ((IMM) & 0xffff));} + +#define MR(REG_DST, REG_SRC) \ + {int __src = (REG_SRC); int __dst=(REG_DST); \ + if (__src != __dst) {ADDI(__dst, __src, 0)}} + +#define ADD(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000214 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + +#define ADDO(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000614 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + +#define ADDEO(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000514 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + +#define ADDE(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000114 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + +#define ADDCO(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000414 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + +#define ADDIC(REG_DST, REG_SRC, IMM) \ + {int _src = (REG_SRC); int _dst=(REG_DST); \ + INSTR = (0x30000000 | (_dst << 21) | (_src << 16) | ((IMM) & 0xffff));} + +#define ADDIC_(REG_DST, REG_SRC, IMM) \ + {int _src = (REG_SRC); int _dst=(REG_DST); \ + INSTR = (0x34000000 | (_dst << 21) | (_src << 16) | ((IMM) & 0xffff));} + +#define ADDZE(REG_DST, REG_SRC) \ + {int _src = (REG_SRC); int _dst=(REG_DST); \ + INSTR = (0x7C000194 | (_dst << 21) | (_src << 16));} + +#define SUBF(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000050 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + +#define SUBFO(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000450 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + +#define SUBFC(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000010 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + +#define SUBFE(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000110 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + +#define SUBFCO(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000410 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + +#define SUBFCO_(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000411 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + +#define SUB(REG_DST, REG1, REG2) \ + {SUBF(REG_DST, REG2, REG1)} + +#define SUBO(REG_DST, REG1, REG2) \ + {SUBFO(REG_DST, REG2, REG1)} + +#define SUBCO(REG_DST, REG1, REG2) \ + {SUBFCO(REG_DST, REG2, REG1)} + +#define SUBCO_(REG_DST, REG1, REG2) \ + {SUBFCO_(REG_DST, REG2, REG1)} + +#define SRAWI(REG_DST, REG_SRC, SHIFT) \ + {int _src = (REG_SRC); int _dst=(REG_DST); \ + INSTR = (0x7C000670 | (_src << 21) | (_dst << 16) | (SHIFT << 11));} + +#define MULHW(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000096 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + +#define MULLW(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C0001D6 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + +#define MULHWU(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000016 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + +#define MULLI(REG_DST, REG_SRC, IMM) \ + {int _src = (REG_SRC); int _dst=(REG_DST); \ + INSTR = (0x1C000000 | (_dst << 21) | (_src << 16) | ((IMM) & 0xffff));} + +#define DIVW(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C0003D6 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + +#define DIVWU(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000396 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));} + + +/* Branch ops */ +#define B_FROM(VAR) VAR = ppcPtr +#define B_DST(VAR) *VAR = *VAR | (((s16)((u32)ppcPtr - (u32)VAR)) & 0xfffc) + +#define B(DST) \ + {INSTR = (0x48000000 | (((s32)(((DST)+1)<<2)) & 0x3fffffc));} + +#define B_L(VAR) \ + {B_FROM(VAR); INSTR = (0x48000000);} + +#define BA(DST) \ + {INSTR = (0x48000002 | ((s32)((DST) & 0x3fffffc)));} + +#define BLA(DST) \ + {INSTR = (0x48000003 | ((s32)((DST) & 0x3fffffc)));} + +#define BNS(DST) \ + {INSTR = (0x40830000 | (((s16)(((DST)+1)<<2)) & 0xfffc));} + +#define BNE(DST) \ + {INSTR = (0x40820000 | (((s16)(((DST)+1)<<2)) & 0xfffc));} + +#define BNE_L(VAR) \ + {B_FROM(VAR); INSTR = (0x40820000);} + +#define BEQ(DST) \ + {INSTR = (0x41820000 | (((s16)(((DST)+1)<<2)) & 0xfffc));} + +#define BEQ_L(VAR) \ + {B_FROM(VAR); INSTR = (0x41820000);} + +#define BLT(DST) \ + {INSTR = (0x41800000 | (((s16)(((DST)+1)<<2)) & 0xfffc));} + +#define BLT_L(VAR) \ + {B_FROM(VAR); INSTR = (0x41800000);} + +#define BGT(DST) \ + {INSTR = (0x41810000 | (((s16)(((DST)+1)<<2)) & 0xfffc));} + +#define BGT_L(VAR) \ + {B_FROM(VAR); INSTR = (0x41810000);} + +#define BGE(DST) \ + {INSTR = (0x40800000 | (((s16)(((DST)+1)<<2)) & 0xfffc));} + +#define BGE_L(VAR) \ + {B_FROM(VAR); INSTR = (0x40800000);} + +#define BLE(DST) \ + {INSTR = (0x40810000 | (((s16)(((DST)+1)<<2)) & 0xfffc));} + +#define BLE_L(VAR) \ + {B_FROM(VAR); INSTR = (0x40810000);} + +#define BCTRL() \ + {INSTR = (0x4E800421);} + +#define BCTR() \ + {INSTR = (0x4E800420);} + + +/* compare ops */ +#define CMPLWI(REG, IMM) \ + {int _reg = (REG); \ + INSTR = (0x28000000 | (_reg << 16) | ((IMM) & 0xffff));} + +#define CMPLWI2(REG, IMM) \ + {int _reg = (REG); \ + INSTR = (0x29000000 | (_reg << 16) | ((IMM) & 0xffff));} + +#define CMPLWI7(REG, IMM) \ + {int _reg = (REG); \ + INSTR = (0x2B800000 | (_reg << 16) | ((IMM) & 0xffff));} + +#define CMPLW(REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); \ + INSTR = (0x7C000040 | (_reg1 << 16) | (_reg2 << 11));} + +#define CMPLW1(REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); \ + INSTR = (0x7C800040 | (_reg1 << 16) | (_reg2 << 11));} + +#define CMPLW2(REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); \ + INSTR = (0x7D000040 | (_reg1 << 16) | (_reg2 << 11));} + +#define CMPW(REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); \ + INSTR = (0x7C000000 | (_reg1 << 16) | (_reg2 << 11));} + +#define CMPW1(REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); \ + INSTR = (0x7C800000 | (_reg1 << 16) | (_reg2 << 11));} + +#define CMPW2(REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); \ + INSTR = (0x7D000000 | (_reg1 << 16) | (_reg2 << 11));} + +#define CMPWI(REG, IMM) \ + {int _reg = (REG); \ + INSTR = (0x2C000000 | (_reg << 16) | ((IMM) & 0xffff));} + +#define CMPWI2(REG, IMM) \ + {int _reg = (REG); \ + INSTR = (0x2D000000 | (_reg << 16) | ((IMM) & 0xffff));} + +#define MTCRF(MASK, REG) \ + {int _reg = (REG); \ + INSTR = (0x7C000120 | (_reg << 21) | (((MASK)&0xff)<<12));} + +#define MFCR(REG) \ + {int _reg = (REG); \ + INSTR = (0x7C000026 | (_reg << 21));} + +#define CROR(CR_DST, CR1, CR2) \ + {INSTR = (0x4C000382 | ((CR_DST) << 21) | ((CR1) << 16) | ((CR2) << 11));} + +#define CRXOR(CR_DST, CR1, CR2) \ + {INSTR = (0x4C000182 | ((CR_DST) << 21) | ((CR1) << 16) | ((CR2) << 11));} + +#define CRNAND(CR_DST, CR1, CR2) \ + {INSTR = (0x4C0001C2 | ((CR_DST) << 21) | ((CR1) << 16) | ((CR2) << 11));} + +#define CRANDC(CR_DST, CR1, CR2) \ + {INSTR = (0x4C000102 | ((CR_DST) << 21) | ((CR1) << 16) | ((CR2) << 11));} + + +/* shift ops */ +#define RLWINM(REG_DST, REG_SRC, SHIFT, START, END) \ + {int _src = (REG_SRC); int _dst = (REG_DST); \ + INSTR = (0x54000000 | (_src << 21) | (_dst << 16) | (SHIFT << 11) | (START << 6) | (END << 1));} + +#define RLWINM_(REG_DST, REG_SRC, SHIFT, START, END) \ + {int _src = (REG_SRC); int _dst = (REG_DST); \ + INSTR = (0x54000001 | (_src << 21) | (_dst << 16) | (SHIFT << 11) | (START << 6) | (END << 1));} + +#define CLRRWI(REG_DST, REG_SRC, LEN) \ + RLWINM(REG_DST, REG_SRC, 0, 0, 31-LEN) + +#define SLWI(REG_DST, REG_SRC, SHIFT) \ + {int _shift = (SHIFT); \ + if (_shift==0) {MR(REG_DST, REG_SRC)} else \ + {RLWINM(REG_DST, REG_SRC, _shift, 0, 31-_shift)}} + +#define SRWI(REG_DST, REG_SRC, SHIFT) \ + {int _shift = (SHIFT); \ + if (_shift==0) {MR(REG_DST, REG_SRC)} else \ + RLWINM(REG_DST, REG_SRC, 32-_shift, _shift, 31)} + +#define SLW(REG_DST, REG_SRC, REG_SHIFT) \ + {int _src = (REG_SRC), _shift = (REG_SHIFT); int _dst = (REG_DST); \ + INSTR = (0x7C000030 | (_src << 21) | (_dst << 16) | (_shift << 11));} + +#define SRW(REG_DST, REG_SRC, REG_SHIFT) \ + {int _src = (REG_SRC), _shift = (REG_SHIFT); int _dst = (REG_DST); \ + INSTR = (0x7C000430 | (_src << 21) | (_dst << 16) | (_shift << 11));} + +#define SRAW(REG_DST, REG_SRC, REG_SHIFT) \ + {int _src = (REG_SRC), _shift = (REG_SHIFT); int _dst = (REG_DST); \ + INSTR = (0x7C000630 | (_src << 21) | (_dst << 16) | (_shift << 11));} + +#define SRAWI(REG_DST, REG_SRC, SHIFT) \ + {int _src = (REG_SRC); int _dst = (REG_DST); int _shift = (SHIFT); \ + if (_shift==0) {MR(REG_DST, REG_SRC)} else \ + INSTR = (0x7C000670 | (_src << 21) | (_dst << 16) | (_shift << 11));} + +#define RLWNM(REG_DST, REG_SRC, REG_SHIFT, START, END) \ + {int _src = (REG_SRC), _shift = (REG_SHIFT); int _dst = (REG_DST); \ + INSTR = (0x5C000000 | (_src << 21) | (_dst << 16) | (_shift << 11) | (START << 6) | (END << 1));} + +/* other ops */ +#define ORI(REG_DST, REG_SRC, IMM) \ + {int _src = (REG_SRC), _imm = (IMM); int _dst = (REG_DST); \ + if (!((_imm == 0) && ((_src^_dst) == 0))) \ + INSTR = (0x60000000 | (_src << 21) | (_dst << 16) | (_imm & 0xffff));} + +#define ORIS(REG_DST, REG_SRC, IMM) \ + {int _src = (REG_SRC), _imm = (IMM); int _dst = (REG_DST); \ + if (!((_imm == 0) && ((_src^_dst) == 0))) \ + INSTR = (0x64000000 | (_src << 21) | (_dst << 16) | (_imm & 0xffff));} + +#define OR(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000378 | (_reg1 << 21) | (_dst << 16) | (_reg2 << 11));} + +#define OR_(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000379 | (_reg1 << 21) | (_dst << 16) | (_reg2 << 11));} + +#define XORI(REG_DST, REG_SRC, IMM) \ + {int _src = (REG_SRC); int _dst=(REG_DST); \ + INSTR = (0x68000000 | (_src << 21) | (_dst << 16) | ((IMM) & 0xffff));} + +#define XOR(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000278 | (_reg1 << 21) | (_dst << 16) | (_reg2 << 11));} + +#define XOR_(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000279 | (_reg1 << 21) | (_dst << 16) | (_reg2 << 11));} + +#define ANDI_(REG_DST, REG_SRC, IMM) \ + {int _src = (REG_SRC); int _dst=(REG_DST); \ + INSTR = (0x70000000 | (_src << 21) | (_dst << 16) | ((IMM) & 0xffff));} + +#define AND(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C000038 | (_reg1 << 21) | (_dst << 16) | (_reg2 << 11));} + +#define NOR(REG_DST, REG1, REG2) \ + {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \ + INSTR = (0x7C0000f8 | (_reg1 << 21) | (_dst << 16) | (_reg2 << 11));} + +#define NEG(REG_DST, REG_SRC) \ + {int _src = (REG_SRC); int _dst=(REG_DST); \ + INSTR = (0x7C0000D0 | (_dst << 21) | (_src << 16));} + +#define NOP() \ + {INSTR = 0x60000000;} + +#define MCRXR(CR_DST) \ + {INSTR = (0x7C000400 | (CR_DST << 23));} + +#define EXTSB(REG_DST, REG_SRC) \ + {int _src = (REG_SRC); int _dst=(REG_DST); \ + INSTR = (0x7C000774 | (_src << 21) | (_dst << 16));} + +#define EXTSH(REG_DST, REG_SRC) \ + {int _src = (REG_SRC); int _dst=(REG_DST); \ + INSTR = (0x7C000734 | (_src << 21) | (_dst << 16));} + + +/* floating point ops */ +#define FDIVS(FPR_DST, FPR1, FPR2) \ + {INSTR = (0xEC000024 | (FPR_DST << 21) | (FPR1 << 16) | (FPR2 << 11));} + +#define FDIV(FPR_DST, FPR1, FPR2) \ + {INSTR = (0xFC000024 | (FPR_DST << 21) | (FPR1 << 16) | (FPR2 << 11));} + +#define FMULS(FPR_DST, FPR1, FPR2) \ + {INSTR = (0xEC000032 | (FPR_DST << 21) | (FPR1 << 16) | (FPR2 << 11));} + +#define FMUL(FPR_DST, FPR1, FPR2) \ + {INSTR = (0xFC000032 | (FPR_DST << 21) | (FPR1 << 16) | (FPR2 << 11));} + +#define FADDS(FPR_DST, FPR1, FPR2) \ + {INSTR = (0xEC00002A | (FPR_DST << 21) | (FPR1 << 16) | (FPR2 << 11));} + +#define FADD(FPR_DST, FPR1, FPR2) \ + {INSTR = (0xFC00002A | (FPR_DST << 21) | (FPR1 << 16) | (FPR2 << 11));} + +#define FRSP(FPR_DST, FPR_SRC) \ + {INSTR = (0xFC000018 | (FPR_DST << 21) | (FPR_SRC << 11));} + +#define FCTIW(FPR_DST, FPR_SRC) \ + {INSTR = (0xFC00001C | (FPR_DST << 21) | (FPR_SRC << 11));} + + +#define LFS(FPR_DST, OFFSET, REG) \ + {INSTR = (0xC0000000 | (FPR_DST << 21) | (REG << 16) | ((OFFSET) & 0xffff));} + +#define STFS(FPR_DST, OFFSET, REG) \ + {INSTR = (0xD0000000 | (FPR_DST << 21) | (REG << 16) | ((OFFSET) & 0xffff));} + +#define LFD(FPR_DST, OFFSET, REG) \ + {INSTR = (0xC8000000 | (FPR_DST << 21) | (REG << 16) | ((OFFSET) & 0xffff));} + +#define STFD(FPR_DST, OFFSET, REG) \ + {INSTR = (0xD8000000 | (FPR_DST << 21) | (REG << 16) | ((OFFSET) & 0xffff));} + + + +/* extra combined opcodes */ +#if 1 +#define LIW(REG, IMM) /* Load Immidiate Word */ \ +{ \ + int __reg = (REG); u32 __imm = (u32)(IMM); \ + if ((s32)__imm == (s32)((s16)__imm)) \ + { \ + LI(__reg, (s32)((s16)__imm)); \ + } else if (__reg == 0) { \ + LIS(__reg, (((u32)__imm)>>16)); \ + if ((((u32)__imm) & 0xffff) != 0) \ + { \ + ORI(__reg, __reg, __imm); \ + } \ + } else { \ + if ((((u32)__imm) & 0xffff) == 0) { \ + LIS(__reg, (((u32)__imm)>>16)); \ + } else { \ + LI(__reg, __imm); \ + if ((__imm & 0x8000) == 0) { \ + ADDIS(__reg, __reg, ((u32)__imm)>>16); \ + } else { \ + ADDIS(__reg, __reg, ((((u32)__imm)>>16) & 0xffff) + 1); \ + } \ + } \ + /*if ((((u32)__imm) & 0xffff) != 0) \ + { \ + ORI(__reg, __reg, __imm); \ + }*/ \ + } \ +} +#else +#define LIW(REG, IMM) /* Load Immidiate Word */ \ +{ \ + int __reg = (REG); u32 __imm = (u32)(IMM); \ + if ((s32)__imm == (s32)((s16)__imm)) \ + { \ + LI(__reg, (s32)((s16)__imm)); \ + } \ + else \ + { \ + LIS(__reg, (((u32)__imm)>>16)); \ + if ((((u32)__imm) & 0xffff) != 0) \ + { \ + ORI(__reg, __reg, __imm); \ + } \ + } \ +} +#endif diff --git a/libpcsxcore/ppc/reguse.c b/libpcsxcore/ppc/reguse.c new file mode 100644 index 0000000..47d70a5 --- /dev/null +++ b/libpcsxcore/ppc/reguse.c @@ -0,0 +1,419 @@ + +#include "../psxcommon.h" +#include "reguse.h" + +#include "../r3000a.h" + +//#define SAME_CYCLE_MODE + +static const int useBSC[64] = { + /*recSPECIAL*/ REGUSE_SUB | REGUSE_SPECIAL, + /*recREGIMM*/ REGUSE_SUB | REGUSE_REGIMM, + /*recJ*/ REGUSE_JUMP, + /*recJAL*/ REGUSE_JUMP | REGUSE_R31_W, + /*recBEQ*/ REGUSE_BRANCH | REGUSE_RS_R | REGUSE_RT_R, + /*recBNE*/ REGUSE_BRANCH | REGUSE_RS_R | REGUSE_RT_R, + /*recBLEZ*/ REGUSE_BRANCH | REGUSE_RS_R, + /*recBGTZ*/ REGUSE_BRANCH | REGUSE_RS_R, + /*recADDI*/ REGUSE_ACC | REGUSE_RS_R | REGUSE_RT_W, + /*recADDIU*/ REGUSE_ACC | REGUSE_RS_R | REGUSE_RT_W, + /*recSLTI*/ REGUSE_ACC | REGUSE_RS_R | REGUSE_RT_W, + /*recSLTIU*/ REGUSE_ACC | REGUSE_RS_R | REGUSE_RT_W, + /*recANDI*/ REGUSE_LOGIC | REGUSE_RS_R | REGUSE_RT_W, + /*recORI*/ REGUSE_LOGIC | REGUSE_RS_R | REGUSE_RT_W, + /*recXORI*/ REGUSE_LOGIC | REGUSE_RS_R | REGUSE_RT_W, + /*recLUI*/ REGUSE_ACC | REGUSE_RT_W, + /*recCOP0*/ REGUSE_SUB | REGUSE_COP0, + REGUSE_NONE, + /*recCOP2*/ REGUSE_SUB | REGUSE_COP2, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + /*recLB*/ REGUSE_MEM_R | REGUSE_RS_R | REGUSE_RT_W, + /*recLH*/ REGUSE_MEM_R | REGUSE_RS_R | REGUSE_RT_W, + /*recLWL*/ REGUSE_MEM_R | REGUSE_RS_R | REGUSE_RT, + /*recLW*/ REGUSE_MEM_R | REGUSE_RS_R | REGUSE_RT_W, + /*recLBU*/ REGUSE_MEM_R | REGUSE_RS_R | REGUSE_RT_W, + /*recLHU*/ REGUSE_MEM_R | REGUSE_RS_R | REGUSE_RT_W, + /*recLWR*/ REGUSE_MEM_R | REGUSE_RS_R | REGUSE_RT, + REGUSE_NONE, + /*recSB*/ REGUSE_MEM_W | REGUSE_RS_R | REGUSE_RT_R, + /*recSH*/ REGUSE_MEM_W | REGUSE_RS_R | REGUSE_RT_R, + /*recSWL*/ REGUSE_MEM | REGUSE_RS_R | REGUSE_RT_R, + /*recSW*/ REGUSE_MEM_W | REGUSE_RS_R | REGUSE_RT_R, + REGUSE_NONE, REGUSE_NONE, + /*recSWR*/ REGUSE_MEM | REGUSE_RS_R | REGUSE_RT_R, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + /*recLWC2*/ REGUSE_MEM_R | REGUSE_RS_R | REGUSE_COP2_RT_W, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + REGUSE_NONE, REGUSE_NONE, + /*recSWC2*/ REGUSE_MEM_W | REGUSE_RS_R | REGUSE_COP2_RT_R, + /*recHLE*/ REGUSE_UNKNOWN, // TODO: can this be done in a better way + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE +}; + +static const int useSPC[64] = { + /*recSLL*/ REGUSE_ACC | REGUSE_RT_R | REGUSE_RD_W, + REGUSE_NONE, + /*recSRL*/ REGUSE_ACC | REGUSE_RT_R | REGUSE_RD_W, + /*recSRA*/ REGUSE_ACC | REGUSE_RT_R | REGUSE_RD_W, + /*recSLLV*/ REGUSE_ACC | REGUSE_RS_R | REGUSE_RT_R | REGUSE_RD_W, + REGUSE_NONE, + /*recSRLV*/ REGUSE_ACC | REGUSE_RS_R | REGUSE_RT_R | REGUSE_RD_W, + /*recSRAV*/ REGUSE_ACC | REGUSE_RS_R | REGUSE_RT_R | REGUSE_RD_W, + /*recJR*/ REGUSE_JUMPR | REGUSE_RS_R, + /*recJALR*/ REGUSE_JUMPR | REGUSE_RS_R | REGUSE_RD_W, + REGUSE_NONE, REGUSE_NONE, + /*rSYSCALL*/ REGUSE_SYS | REGUSE_PC | REGUSE_COP0_STATUS | REGUSE_EXCEPTION, + /*recBREAK*/ REGUSE_NONE, + REGUSE_NONE, REGUSE_NONE, + /*recMFHI*/ REGUSE_LOGIC | REGUSE_RD_W | REGUSE_HI_R, + /*recMTHI*/ REGUSE_LOGIC | REGUSE_RS_R | REGUSE_HI_W, + /*recMFLO*/ REGUSE_LOGIC | REGUSE_RD_W | REGUSE_LO_R, + /*recMTLO*/ REGUSE_LOGIC | REGUSE_RS_R | REGUSE_LO_W, + REGUSE_NONE, REGUSE_NONE , REGUSE_NONE, REGUSE_NONE, + /*recMULT*/ REGUSE_MULT | REGUSE_RS_R | REGUSE_RT_R | REGUSE_LO_W | REGUSE_HI_W, + /*recMULTU*/ REGUSE_MULT | REGUSE_RS_R | REGUSE_RT_R | REGUSE_LO_W | REGUSE_HI_W, + /*recDIV*/ REGUSE_MULT | REGUSE_RS_R | REGUSE_RT_R | REGUSE_LO_W | REGUSE_HI_W, + /*recDIVU*/ REGUSE_MULT | REGUSE_RS_R | REGUSE_RT_R | REGUSE_LO_W | REGUSE_HI_W, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + /*recADD*/ REGUSE_ACC | REGUSE_RS_R | REGUSE_RT_R | REGUSE_RD_W, + /*recADDU*/ REGUSE_ACC | REGUSE_RS_R | REGUSE_RT_R | REGUSE_RD_W, + /*recSUB*/ REGUSE_ACC | REGUSE_RS_R | REGUSE_RT_R | REGUSE_RD_W, + /*recSUBU*/ REGUSE_ACC | REGUSE_RS_R | REGUSE_RT_R | REGUSE_RD_W, + /*recAND*/ REGUSE_LOGIC | REGUSE_RS_R | REGUSE_RT_R | REGUSE_RD_W, + /*recOR*/ REGUSE_LOGIC | REGUSE_RS_R | REGUSE_RT_R | REGUSE_RD_W, + /*recXOR*/ REGUSE_LOGIC | REGUSE_RS_R | REGUSE_RT_R | REGUSE_RD_W, + /*recNOR*/ REGUSE_LOGIC | REGUSE_RS_R | REGUSE_RT_R | REGUSE_RD_W, + REGUSE_NONE, REGUSE_NONE, + /*recSLT*/ REGUSE_ACC | REGUSE_RS_R | REGUSE_RT_R | REGUSE_RD_W, + /*recSLTU*/ REGUSE_ACC | REGUSE_RS_R | REGUSE_RT_R | REGUSE_RD_W, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + REGUSE_NONE, REGUSE_NONE +}; + +static const int useREGIMM[32] = { + /*recBLTZ*/ REGUSE_BRANCH | REGUSE_RS_R, + /*recBGEZ*/ REGUSE_BRANCH | REGUSE_RS_R, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + REGUSE_NONE, REGUSE_NONE, + /*recBLTZAL*/REGUSE_BRANCH | REGUSE_RS_R | REGUSE_R31_W, + /*recBGEZAL*/REGUSE_BRANCH | REGUSE_RS_R | REGUSE_R31_W, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + REGUSE_NONE, REGUSE_NONE +}; + +static const int useCP0[32] = { + /*recMFC0*/ REGUSE_LOGIC | REGUSE_RT_W | REGUSE_COP0_RD_R, + REGUSE_NONE, + /*recCFC0*/ REGUSE_LOGIC | REGUSE_RT_W | REGUSE_COP0_RD_R, + REGUSE_NONE, + /*recMTC0*/ REGUSE_LOGIC | REGUSE_RT_R | REGUSE_COP0_RD_W, + REGUSE_NONE, + /*recCTC0*/ REGUSE_LOGIC | REGUSE_RT_R | REGUSE_COP0_RD_W, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + /*recRFE*/ REGUSE_LOGIC | REGUSE_COP0_STATUS, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE +}; + +// TODO: make more explicit +static const int useCP2[64] = { + /*recBASIC*/ REGUSE_SUB | REGUSE_BASIC, + /*recRTPS*/ REGUSE_GTE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + /*recNCLIP*/ REGUSE_GTE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + /*recOP*/ REGUSE_GTE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + /*recDPCS*/ REGUSE_GTE, + /*recINTPL*/ REGUSE_GTE, + /*recMVMVA*/ REGUSE_GTE, + /*recNCDS*/ REGUSE_GTE, + /*recCDP*/ REGUSE_GTE, + REGUSE_NONE, + /*recNCDT*/ REGUSE_GTE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + /*recNCCS*/ REGUSE_GTE, + /*recCC*/ REGUSE_GTE, + REGUSE_NONE, + /*recNCS*/ REGUSE_GTE, + REGUSE_NONE, + /*recNCT*/ REGUSE_GTE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + REGUSE_NONE, + /*recSQR*/ REGUSE_GTE, + /*recDCPL*/ REGUSE_GTE, + /*recDPCT*/ REGUSE_GTE, + REGUSE_NONE, REGUSE_NONE, + /*recAVSZ3*/ REGUSE_GTE, + /*recAVSZ4*/ REGUSE_GTE, + REGUSE_NONE, + /*recRTPT*/ REGUSE_GTE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, REGUSE_NONE, + /*recGPF*/ REGUSE_GTE, + /*recGPL*/ REGUSE_GTE, + /*recNCCT*/ REGUSE_GTE +}; + +static const int useCP2BSC[32] = { + /*recMFC2*/ REGUSE_LOGIC | REGUSE_RT_W | REGUSE_COP2_RD_R, + REGUSE_NONE, + /*recCFC2*/ REGUSE_LOGIC | REGUSE_RT_W | REGUSE_COP2_RD_R, + REGUSE_NONE, + /*recMTC2*/ REGUSE_LOGIC | REGUSE_RT_R | REGUSE_COP2_RD_W, + REGUSE_NONE, + /*recCTC2*/ REGUSE_LOGIC | REGUSE_RT_R | REGUSE_COP2_RD_W, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE, + REGUSE_NONE +}; + +static int getRegUse(u32 code) __attribute__ ((__pure__)); +static int getRegUse(u32 code) +{ + int use = useBSC[code>>26]; + + switch (use & REGUSE_SUBMASK) { + case REGUSE_NONE: + break; + case REGUSE_SPECIAL: + use = useSPC[_fFunct_(code)]; + break; + case REGUSE_REGIMM: + use = useREGIMM[_fRt_(code)]; + break; + case REGUSE_COP0: + use = useCP0[_fRs_(code)]; + break; + case REGUSE_COP2: + use = useCP2[_fFunct_(code)]; + if ((use & REGUSE_SUBMASK) == REGUSE_BASIC) + use = useCP2BSC[_fRs_(code)]; + break; + default: + use = REGUSE_UNKNOWN; + break; + } + + if ((use & REGUSE_COP0_RD_W)) { + if (_fRd_(code) == 12 || _fRd_(code) == 13) { + use = REGUSE_UNKNOWN; + } + } + + return use; +} + +/* returns how psxreg is used in the code instruction */ +int useOfPsxReg(u32 code, int use, int psxreg) +{ + int retval = REGUSE_NONE; + + // get use if it wasn't supplied + if (-1 == use) use = getRegUse(code); + + // if we don't know what the usage is, assume it's read from + if (REGUSE_UNKNOWN == use) return REGUSE_READ; + + if (psxreg < 32) { + // check for 3 standard types + if ((use & REGUSE_RT) && _fRt_(code) == (u32)psxreg) { + retval |= ((use & REGUSE_RT_R) ? REGUSE_READ:0) | ((use & REGUSE_RT_W) ? REGUSE_WRITE:0); + } + if ((use & REGUSE_RS) && _fRs_(code) == (u32)psxreg) { + retval |= ((use & REGUSE_RS_R) ? REGUSE_READ:0) | ((use & REGUSE_RS_W) ? REGUSE_WRITE:0); + } + if ((use & REGUSE_RD) && _fRd_(code) == (u32)psxreg) { + retval |= ((use & REGUSE_RD_R) ? REGUSE_READ:0) | ((use & REGUSE_RD_W) ? REGUSE_WRITE:0); + } + // some instructions explicitly writes to r31 + if ((use & REGUSE_R31_W) && 31 == psxreg) { + retval |= REGUSE_WRITE; + } + } else if (psxreg == 32) { // Special register LO + retval |= ((use & REGUSE_LO_R) ? REGUSE_READ:0) | ((use & REGUSE_LO_W) ? REGUSE_WRITE:0); + } else if (psxreg == 33) { // Special register HI + retval |= ((use & REGUSE_HI_R) ? REGUSE_READ:0) | ((use & REGUSE_HI_W) ? REGUSE_WRITE:0); + } + + return retval; +} + +//#define NOREGUSE_FOLLOW + +static int _nextPsxRegUse(u32 pc, int psxreg, int numInstr) __attribute__ ((__pure__, __unused__)); +static int _nextPsxRegUse(u32 pc, int psxreg, int numInstr) +{ + u32 *ptr, code, bPC = 0; + int i, use, reguse = 0; + + for (i=0; i= 2) break; // only follow 1 branch + } + if (reguse == REGUSE_NONE) return reguse; + + if (bPC) { + reguse1 = reguse; + pc = bPC; bPC = 0; + b = 1; + goto retry; + } + + return reguse1 | reguse; +#endif +} + +int isPsxRegUsed(u32 pc, int psxreg) +{ + int use = nextPsxRegUse(pc, psxreg); + + if (use == REGUSE_NONE) + return 2; // unknown use - assume it is used + else if (use & REGUSE_READ) + return 1; // the next use is a read + else + return 0; // the next use is a write, i.e. current value is not important +} diff --git a/libpcsxcore/ppc/reguse.h b/libpcsxcore/ppc/reguse.h new file mode 100644 index 0000000..de42dec --- /dev/null +++ b/libpcsxcore/ppc/reguse.h @@ -0,0 +1,83 @@ +#ifndef __REGUSE_H__ +#define __REGUSE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +// include basic types +#include "../psxcommon.h" + +#define REGUSE_NONE 0x0000 +#define REGUSE_UNKNOWN 0x0001 + +//sub functions +#define REGUSE_SPECIAL 0x0002 +#define REGUSE_REGIMM 0x0004 +#define REGUSE_COP0 0x0006 +#define REGUSE_COP2 0x0008 +#define REGUSE_BASIC 0x000a +#define REGUSE_SUBMASK 0x000e /* sub function mask */ + +#define REGUSE_ACC 0x0010 /* accumulator */ +#define REGUSE_LOGIC 0x0020 /* logic operations */ +#define REGUSE_MULT 0x0030 /* multiplier */ +#define REGUSE_JUMP 0x0040 /* jump to dest */ +#define REGUSE_JUMPR 0x0050 /* jump to reg */ +#define REGUSE_BRANCH 0x0060 /* branch */ +#define REGUSE_MEM_R 0x0070 /* read from memory */ +#define REGUSE_MEM_W 0x0080 /* write to memory */ +#define REGUSE_MEM 0x0090 /* read and write to memory */ +#define REGUSE_SYS 0x00a0 /* syscall */ +#define REGUSE_GTE 0x00b0 /* gte operation */ +#define REGUSE_SUB 0x00f0 /* sub usage */ +#define REGUSE_TYPEM 0x00f0 /* type mask */ + + +#define REGUSE_RS_R 0x0100 +#define REGUSE_RS_W 0x0200 +#define REGUSE_RS (REGUSE_RS_R | REGUSE_RS_W) +#define REGUSE_RT_R 0x0400 +#define REGUSE_RT_W 0x0800 +#define REGUSE_RT (REGUSE_RT_R | REGUSE_RT_W) +#define REGUSE_RD_R 0x1000 +#define REGUSE_RD_W 0x2000 +#define REGUSE_RD (REGUSE_RD_R | REGUSE_RD_W) + +#define REGUSE_R31_W 0x4000 /* writes to link register (r31) */ +#define REGUSE_PC 0x8000 /* reads pc */ + +#define REGUSE_LO_R 0x10000 +#define REGUSE_LO_W 0x20000 +#define REGUSE_LO (REGUSE_LO_R | REGUSE_LO_W) +#define REGUSE_HI_R 0x40000 +#define REGUSE_HI_W 0x80000 +#define REGUSE_HI (REGUSE_HI_R | REGUSE_HI_W) + +#define REGUSE_COP0_RD_R 0x100000 +#define REGUSE_COP0_RD_W 0x200000 +#define REGUSE_COP0_RD (REGUSE_COP0_RD_R | REGUSE_COP0_RD_W) +#define REGUSE_COP0_STATUS 0x400000 +#define REGUSE_EXCEPTION 0x800000 + +#define REGUSE_COP2_RT_R 0x1000000 +#define REGUSE_COP2_RT_W 0x2000000 +#define REGUSE_COP2_RT (REGUSE_COP2_RT_R | REGUSE_COP2_RT_W) +#define REGUSE_COP2_RD_R 0x4000000 +#define REGUSE_COP2_RD_W 0x8000000 +#define REGUSE_COP2_RD (REGUSE_COP2_RD_R | REGUSE_COP2_RD_W) + + +// specific register use +#define REGUSE_READ 1 +#define REGUSE_WRITE 2 +#define REGUSE_RW 3 + +int useOfPsxReg(u32 code, int use, int psxreg) __attribute__ ((__pure__));; +int nextPsxRegUse(u32 pc, int psxreg) __attribute__ ((__pure__));; +int isPsxRegUsed(u32 pc, int psxreg) __attribute__ ((__pure__));; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/ppf.c b/libpcsxcore/ppf.c new file mode 100644 index 0000000..45c8733 --- /dev/null +++ b/libpcsxcore/ppf.c @@ -0,0 +1,332 @@ +/* PPF Patch Support for PCSX-Reloaded + * Copyright (c) 2009, Wei Mingzhi . + * + * Based on P.E.Op.S CDR Plugin by Pete Bernert. + * Copyright (c) 2002, Pete Bernert. + * + * This program is free software; you can redistribute it and/or modify + * it 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; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA + */ + +#include "psxcommon.h" +#include "ppf.h" +#include "cdrom.h" + +typedef struct tagPPF_DATA { + s32 addr; + s32 pos; + s32 anz; + struct tagPPF_DATA *pNext; +} PPF_DATA; + +typedef struct tagPPF_CACHE { + s32 addr; + struct tagPPF_DATA *pNext; +} PPF_CACHE; + +static PPF_CACHE *ppfCache = NULL; +static PPF_DATA *ppfHead = NULL, *ppfLast = NULL; +static int iPPFNum = 0; + +// using a linked data list, and address array +static void FillPPFCache() { + PPF_DATA *p; + PPF_CACHE *pc; + s32 lastaddr; + + p = ppfHead; + lastaddr = -1; + iPPFNum = 0; + + while (p != NULL) { + if (p->addr != lastaddr) iPPFNum++; + lastaddr = p->addr; + p = p->pNext; + } + + if (iPPFNum <= 0) return; + + pc = ppfCache = (PPF_CACHE *)malloc(iPPFNum * sizeof(PPF_CACHE)); + + iPPFNum--; + p = ppfHead; + lastaddr = -1; + + while (p != NULL) { + if (p->addr != lastaddr) { + pc->addr = p->addr; + pc->pNext = p; + pc++; + } + lastaddr = p->addr; + p = p->pNext; + } +} + +void FreePPFCache() { + PPF_DATA *p = ppfHead; + void *pn; + + while (p != NULL) { + pn = p->pNext; + free(p); + p = (PPF_DATA *)pn; + } + ppfHead = NULL; + ppfLast = NULL; + + if (ppfCache != NULL) free(ppfCache); + ppfCache = NULL; +} + +void CheckPPFCache(unsigned char *pB, unsigned char m, unsigned char s, unsigned char f) { + PPF_CACHE *pcstart, *pcend, *pcpos; + int addr = MSF2SECT(btoi(m), btoi(s), btoi(f)), pos, anz, start; + + if (ppfCache == NULL) return; + + pcstart = ppfCache; + if (addr < pcstart->addr) return; + pcend = ppfCache + iPPFNum; + if (addr > pcend->addr) return; + + while (1) { + if (addr == pcend->addr) { pcpos = pcend; break; } + + pcpos = pcstart + (pcend - pcstart) / 2; + if (pcpos == pcstart) break; + if (addr < pcpos->addr) { + pcend = pcpos; + continue; + } + if (addr > pcpos->addr) { + pcstart = pcpos; + continue; + } + break; + } + + if (addr == pcpos->addr) { + PPF_DATA *p = pcpos->pNext; + while (p != NULL && p->addr == addr) { + pos = p->pos - (CD_FRAMESIZE_RAW - DATA_SIZE); + anz = p->anz; + if (pos < 0) { start = -pos; pos = 0; anz -= start; } + else start = 0; + memcpy(pB + pos, (unsigned char *)(p + 1) + start, anz); + p = p->pNext; + } + } +} + +static void AddToPPF(s32 ladr, s32 pos, s32 anz, unsigned char *ppfmem) { + if (ppfHead == NULL) { + ppfHead = (PPF_DATA *)malloc(sizeof(PPF_DATA) + anz); + ppfHead->addr = ladr; + ppfHead->pNext = NULL; + ppfHead->pos = pos; + ppfHead->anz = anz; + memcpy(ppfHead + 1, ppfmem, anz); + iPPFNum = 1; + ppfLast = ppfHead; + } else { + PPF_DATA *p = ppfHead; + PPF_DATA *plast = NULL; + PPF_DATA *padd; + + if (ladr > ppfLast->addr || (ladr == ppfLast->addr && pos > ppfLast->pos)) { + p = NULL; + plast = ppfLast; + } else { + while (p != NULL) { + if (ladr < p->addr) break; + if (ladr == p->addr) { + while (p && ladr == p->addr && pos > p->pos) { + plast = p; + p = p->pNext; + } + break; + } + plast = p; + p = p->pNext; + } + } + + padd = (PPF_DATA *)malloc(sizeof(PPF_DATA) + anz); + padd->addr = ladr; + padd->pNext = p; + padd->pos = pos; + padd->anz = anz; + memcpy(padd + 1, ppfmem, anz); + iPPFNum++; + if (plast == NULL) ppfHead = padd; + else plast->pNext = padd; + + if (padd->pNext == NULL) ppfLast = padd; + } +} + +void BuildPPFCache() { + FILE *ppffile; + char buffer[12]; + char method, undo = 0, blockcheck = 0; + int dizlen, dizyn; + unsigned char ppfmem[512]; + char szPPF[MAXPATHLEN]; + int count, seekpos, pos; + u32 anz; // use 32-bit to avoid stupid overflows + s32 ladr, off, anx; + + FreePPFCache(); + + // Generate filename in the format of SLUS_123.45 + buffer[0] = toupper(CdromId[0]); + buffer[1] = toupper(CdromId[1]); + buffer[2] = toupper(CdromId[2]); + buffer[3] = toupper(CdromId[3]); + buffer[4] = '_'; + buffer[5] = CdromId[4]; + buffer[6] = CdromId[5]; + buffer[7] = CdromId[6]; + buffer[8] = '.'; + buffer[9] = CdromId[7]; + buffer[10] = CdromId[8]; + buffer[11] = '\0'; + + sprintf(szPPF, "%s%s", Config.PatchesDir, buffer); + + ppffile = fopen(szPPF, "rb"); + if (ppffile == NULL) return; + + memset(buffer, 0, 5); + fread(buffer, 3, 1, ppffile); + + if (strcmp(buffer, "PPF") != 0) { + SysPrintf(_("Invalid PPF patch: %s.\n"), szPPF); + fclose(ppffile); + return; + } + + fseek(ppffile, 5, SEEK_SET); + method = fgetc(ppffile); + + switch (method) { + case 0: // ppf1 + fseek(ppffile, 0, SEEK_END); + count = ftell(ppffile); + count -= 56; + seekpos = 56; + break; + + case 1: // ppf2 + fseek(ppffile, -8, SEEK_END); + + memset(buffer, 0, 5); + fread(buffer, 4, 1, ppffile); + + if (strcmp(".DIZ", buffer) != 0) { + dizyn = 0; + } else { + fread(&dizlen, 4, 1, ppffile); + dizlen = SWAP32(dizlen); + dizyn = 1; + } + + fseek(ppffile, 0, SEEK_END); + count = ftell(ppffile); + + if (dizyn == 0) { + count -= 1084; + seekpos = 1084; + } else { + count -= 1084; + count -= 38; + count -= dizlen; + seekpos = 1084; + } + break; + + case 2: // ppf3 + fseek(ppffile, 57, SEEK_SET); + blockcheck = fgetc(ppffile); + undo = fgetc(ppffile); + + fseek(ppffile, -6, SEEK_END); + memset(buffer, 0, 5); + fread(buffer, 4, 1, ppffile); + dizlen = 0; + + if (strcmp(".DIZ", buffer) == 0) { + fseek(ppffile, -2, SEEK_END); + fread(&dizlen, 2, 1, ppffile); + dizlen = SWAP32(dizlen); + dizlen += 36; + } + + fseek(ppffile, 0, SEEK_END); + count = ftell(ppffile); + count -= dizlen; + + if (blockcheck) { + seekpos = 1084; + count -= 1084; + } else { + seekpos = 60; + count -= 60; + } + break; + + default: + fclose(ppffile); + SysPrintf(_("Unsupported PPF version (%d).\n"), method + 1); + return; + } + + // now do the data reading + do { + fseek(ppffile, seekpos, SEEK_SET); + fread(&pos, 4, 1, ppffile); + pos = SWAP32(pos); + + if (method == 2) fread(buffer, 4, 1, ppffile); // skip 4 bytes on ppf3 (no int64 support here) + + anz = fgetc(ppffile); + fread(ppfmem, anz, 1, ppffile); + + ladr = pos / CD_FRAMESIZE_RAW; + off = pos % CD_FRAMESIZE_RAW; + + if (off + anz > CD_FRAMESIZE_RAW) { + anx = off + anz - CD_FRAMESIZE_RAW; + anz -= (unsigned char)anx; + AddToPPF(ladr + 1, 0, anx, &ppfmem[anz]); + } + + AddToPPF(ladr, off, anz, ppfmem); // add to link list + + if (method == 2) { + if (undo) anz += anz; + anz += 4; + } + + seekpos = seekpos + 5 + anz; + count = count - 5 - anz; + } while (count != 0); // loop til end + + fclose(ppffile); + + FillPPFCache(); // build address array + + SysPrintf(_("Loaded PPF %d.0 patch: %s.\n"), method + 1, szPPF); +} diff --git a/libpcsxcore/ppf.h b/libpcsxcore/ppf.h new file mode 100644 index 0000000..f578028 --- /dev/null +++ b/libpcsxcore/ppf.h @@ -0,0 +1,33 @@ +/* PPF Patch Support for PCSX-Reloaded + * Copyright (c) 2009, Wei Mingzhi . + * + * This program is free software; you can redistribute it and/or modify + * it 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; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA + */ + +#ifndef __PPF_H__ +#define __PPF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +void BuildPPFCache(); +void FreePPFCache(); +void CheckPPFCache(unsigned char *pB, unsigned char m, unsigned char s, unsigned char f); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/psemu_plugin_defs.h b/libpcsxcore/psemu_plugin_defs.h new file mode 100644 index 0000000..d1b05ac --- /dev/null +++ b/libpcsxcore/psemu_plugin_defs.h @@ -0,0 +1,285 @@ +#ifndef _PSEMU_PLUGIN_DEFS_H +#define _PSEMU_PLUGIN_DEFS_H + +#ifdef __cplusplus +extern "C" { +#endif + +// header version +#define _PPDK_HEADER_VERSION 3 + +#define PLUGIN_VERSION 1 + +// plugin type returned by PSEgetLibType (types can be merged if plugin is multi type!) +#define PSE_LT_CDR 1 +#define PSE_LT_GPU 2 +#define PSE_LT_SPU 4 +#define PSE_LT_PAD 8 +#define PSE_LT_NET 16 + +// DLL function return codes +#define PSE_ERR_SUCCESS 0 // every function in DLL if completed sucessfully should return this value +#define PSE_ERR_FATAL -1 // undefined error but fatal one, that kills all functionality + +// XXX_Init return values +// Those return values apply to all libraries +// currently obsolete - preserved for compatibilty + +#define PSE_INIT_ERR_SUCCESS 0 // initialization went OK +#define PSE_INIT_ERR_NOTCONFIGURED -2 // this driver is not configured +#define PSE_INIT_ERR_NOHARDWARE -3 // this driver can not operate properly on this hardware or hardware is not detected + +/* GPU PlugIn */ + +// GPU_Test return values + +// sucess, everything configured, and went OK. +#define PSE_GPU_ERR_SUCCESS 0 + +// ERRORS +// this error might be returned as critical error but none of below +#define PSE_GPU_ERR -20 + + +// this driver is not configured +#define PSE_GPU_ERR_NOTCONFIGURED PSE_GPU_ERR - 1 +// this driver failed Init +#define PSE_GPU_ERR_INIT PSE_GPU_ERR - 2 + +// WARNINGS +// this warning might be returned as undefined warning but allowing driver to continue +#define PSE_GPU_WARN 20 + +// GPU_Query - will be implemented soon + +typedef struct +{ + uint32_t flags; + uint32_t status; + void* window; + unsigned char reserved[100]; +} gpuQueryS; + +// gpuQueryS.flags +// if driver can operate in both modes it must support GPU_changeMode(); +#define PSE_GPU_FLAGS_FULLSCREEN 1 // this driver can operate in fullscreen mode +#define PSE_GPU_FLAGS_WINDOWED 2 // this driver can operate in windowed mode + +// gpuQueryS.status +#define PSE_GPU_STATUS_WINDOWWRONG 1 // this driver cannot operate in this windowed mode + +// GPU_Query End - will be implemented in v2 + + +/* CDR PlugIn */ + +// CDR_Test return values + +// sucess, everything configured, and went OK. +#define PSE_CDR_ERR_SUCCESS 0 + +// general failure (error undefined) +#define PSE_CDR_ERR_FAILURE -1 + +// ERRORS +#define PSE_CDR_ERR -40 +// this driver is not configured +#define PSE_CDR_ERR_NOTCONFIGURED PSE_CDR_ERR - 0 +// if this driver is unable to read data from medium +#define PSE_CDR_ERR_NOREAD PSE_CDR_ERR - 1 + +// WARNINGS +#define PSE_CDR_WARN 40 +// if this driver emulates lame mode ie. can read only 2048 tracks and sector header is emulated +// this might happen to CDROMS that do not support RAW mode reading - surelly it will kill many games +#define PSE_CDR_WARN_LAMECD PSE_CDR_WARN + 0 + + + + +/* SPU PlugIn */ + +// some info retricted (now!) + +// sucess, everything configured, and went OK. +#define PSE_SPU_ERR_SUCCESS 0 + +// ERRORS +// this error might be returned as critical error but none of below +#define PSE_SPU_ERR -60 + +// this driver is not configured +#define PSE_SPU_ERR_NOTCONFIGURED PSE_SPU_ERR - 1 +// this driver failed Init +#define PSE_SPU_ERR_INIT PSE_SPU_ERR - 2 + + +// WARNINGS +// this warning might be returned as undefined warning but allowing driver to continue +#define PSE_SPU_WARN 60 + + + + +/* PAD PlugIn */ + +/* + + functions that must be exported from PAD Plugin + + long PADinit(long flags); // called only once when PSEmu Starts + void PADshutdown(void); // called when PSEmu exits + long PADopen(PadInitS *); // called when PSEmu is running program + long PADclose(void); + long PADconfigure(void); + void PADabout(void); + long PADtest(void); // called from Configure Dialog and after PADopen(); + long PADquery(void); + + unsigned char PADstartPoll(int); + unsigned char PADpoll(unsigned char); + +*/ + +// PADquery responses (notice - values ORed) +// PSEmu will use them also in PADinit to tell Plugin which Ports will use +// notice that PSEmu will call PADinit and PADopen only once when they are from +// same plugin + +// might be used in port 1 +#define PSE_PAD_USE_PORT1 1 +// might be used in port 2 +#define PSE_PAD_USE_PORT2 2 + + + +// MOUSE SCPH-1030 +#define PSE_PAD_TYPE_MOUSE 1 +// NEGCON - 16 button analog controller SLPH-00001 +#define PSE_PAD_TYPE_NEGCON 2 +// GUN CONTROLLER - gun controller SLPH-00014 from Konami +#define PSE_PAD_TYPE_GUN 3 +// STANDARD PAD SCPH-1080, SCPH-1150 +#define PSE_PAD_TYPE_STANDARD 4 +// ANALOG JOYSTICK SCPH-1110 +#define PSE_PAD_TYPE_ANALOGJOY 5 +// GUNCON - gun controller SLPH-00034 from Namco +#define PSE_PAD_TYPE_GUNCON 6 +// ANALOG CONTROLLER SCPH-1150 +#define PSE_PAD_TYPE_ANALOGPAD 7 + + +// sucess, everything configured, and went OK. +#define PSE_PAD_ERR_SUCCESS 0 +// general plugin failure (undefined error) +#define PSE_PAD_ERR_FAILURE -1 + + +// ERRORS +// this error might be returned as critical error but none of below +#define PSE_PAD_ERR -80 +// this driver is not configured +#define PSE_PAD_ERR_NOTCONFIGURED PSE_PAD_ERR - 1 +// this driver failed Init +#define PSE_PAD_ERR_INIT PSE_PAD_ERR - 2 + + +// WARNINGS +// this warning might be returned as undefined warning but allowing driver to continue +#define PSE_PAD_WARN 80 + + +typedef struct +{ + // controler type - fill it withe predefined values above + unsigned char controllerType; + + // status of buttons - every controller fills this field + unsigned short buttonStatus; + + // for analog pad fill those next 4 bytes + // values are analog in range 0-255 where 127 is center position + unsigned char rightJoyX, rightJoyY, leftJoyX, leftJoyY; + + // for mouse fill those next 2 bytes + // values are in range -128 - 127 + unsigned char moveX, moveY; + + unsigned char reserved[91]; + +} PadDataS; + +/* NET PlugIn v2 */ +/* Added by linuzappz@pcsx.net */ + +/* Modes bits for NETsendData/NETrecvData */ +#define PSE_NET_BLOCKING 0x00000000 +#define PSE_NET_NONBLOCKING 0x00000001 + +/* note: unsupported fields should be zeroed. + +typedef struct { + char EmuName[32]; + char CdromID[9]; // ie. 'SCPH12345', no \0 trailing character + char CdromLabel[11]; + void *psxMem; + GPUshowScreenPic GPU_showScreenPic; + GPUdisplayText GPU_displayText; + PADsetSensitive PAD_setSensitive; + char GPUpath[256]; + char SPUpath[256]; + char CDRpath[256]; + char MCD1path[256]; + char MCD2path[256]; + char BIOSpath[256]; // 'HLE' for internal bios + char Unused[1024]; +} netInfo; + +*/ + +/* + basic funcs: + + long NETopen(HWND hWnd) + opens the connection. + shall return 0 on success, else -1. + -1 is also returned if the user selects offline mode. + + long NETclose() + closes the connection. + shall return 0 on success, else -1. + + void NETpause() + this is called when the user paused the emulator. + + void NETresume() + this is called when the user resumed the emulator. + + long NETqueryPlayer() + returns player number + + long NETsendPadData(void *pData, int Size) + this should be called for the first pad only on each side. + + long NETrecvPadData(void *pData, int Pad) + call this for Pad 1/2 to get the data sent by the above func. + + extended funcs: + + long NETsendData(void *pData, int Size, int Mode) + sends Size bytes from pData to the other side. + + long NETrecvData(void *pData, int Size, int Mode) + receives Size bytes from pData to the other side. + + void NETsetInfo(netInfo *info); + sets the netInfo struct. + + void NETkeypressed(int key) (linux only) + key is a XK_?? (X11) keycode. +*/ + +#ifdef __cplusplus +} +#endif +#endif // _PSEMU_PLUGIN_DEFS_H diff --git a/libpcsxcore/psxbios.c b/libpcsxcore/psxbios.c new file mode 100644 index 0000000..f2751b8 --- /dev/null +++ b/libpcsxcore/psxbios.c @@ -0,0 +1,2810 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* + * Internal simulated HLE BIOS. + */ + +// TODO: implement all system calls, count the exact CPU cycles of system calls. + +#include "psxbios.h" +#include "psxhw.h" + +char *biosA0n[256] = { +// 0x00 + "open", "lseek", "read", "write", + "close", "ioctl", "exit", "sys_a0_07", + "getc", "putc", "todigit", "atof", + "strtoul", "strtol", "abs", "labs", +// 0x10 + "atoi", "atol", "atob", "setjmp", + "longjmp", "strcat", "strncat", "strcmp", + "strncmp", "strcpy", "strncpy", "strlen", + "index", "rindex", "strchr", "strrchr", +// 0x20 + "strpbrk", "strspn", "strcspn", "strtok", + "strstr", "toupper", "tolower", "bcopy", + "bzero", "bcmp", "memcpy", "memset", + "memmove", "memcmp", "memchr", "rand", +// 0x30 + "srand", "qsort", "strtod", "malloc", + "free", "lsearch", "bsearch", "calloc", + "realloc", "InitHeap", "_exit", "getchar", + "putchar", "gets", "puts", "printf", +// 0x40 + "sys_a0_40", "LoadTest", "Load", "Exec", + "FlushCache", "InstallInterruptHandler", "GPU_dw", "mem2vram", + "SendGPUStatus", "GPU_cw", "GPU_cwb", "SendPackets", + "sys_a0_4c", "GetGPUStatus", "GPU_sync", "sys_a0_4f", +// 0x50 + "sys_a0_50", "LoadExec", "GetSysSp", "sys_a0_53", + "_96_init()", "_bu_init()", "_96_remove()", "sys_a0_57", + "sys_a0_58", "sys_a0_59", "sys_a0_5a", "dev_tty_init", + "dev_tty_open", "sys_a0_5d", "dev_tty_ioctl","dev_cd_open", +// 0x60 + "dev_cd_read", "dev_cd_close", "dev_cd_firstfile", "dev_cd_nextfile", + "dev_cd_chdir", "dev_card_open", "dev_card_read", "dev_card_write", + "dev_card_close", "dev_card_firstfile", "dev_card_nextfile","dev_card_erase", + "dev_card_undelete","dev_card_format", "dev_card_rename", "dev_card_6f", +// 0x70 + "_bu_init", "_96_init", "_96_remove", "sys_a0_73", + "sys_a0_74", "sys_a0_75", "sys_a0_76", "sys_a0_77", + "_96_CdSeekL", "sys_a0_79", "sys_a0_7a", "sys_a0_7b", + "_96_CdGetStatus", "sys_a0_7d", "_96_CdRead", "sys_a0_7f", +// 0x80 + "sys_a0_80", "sys_a0_81", "sys_a0_82", "sys_a0_83", + "sys_a0_84", "_96_CdStop", "sys_a0_86", "sys_a0_87", + "sys_a0_88", "sys_a0_89", "sys_a0_8a", "sys_a0_8b", + "sys_a0_8c", "sys_a0_8d", "sys_a0_8e", "sys_a0_8f", +// 0x90 + "sys_a0_90", "sys_a0_91", "sys_a0_92", "sys_a0_93", + "sys_a0_94", "sys_a0_95", "AddCDROMDevice", "AddMemCardDevide", + "DisableKernelIORedirection", "EnableKernelIORedirection", "sys_a0_9a", "sys_a0_9b", + "SetConf", "GetConf", "sys_a0_9e", "SetMem", +// 0xa0 + "_boot", "SystemError", "EnqueueCdIntr", "DequeueCdIntr", + "sys_a0_a4", "ReadSector", "get_cd_status", "bufs_cb_0", + "bufs_cb_1", "bufs_cb_2", "bufs_cb_3", "_card_info", + "_card_load", "_card_auto", "bufs_cd_4", "sys_a0_af", +// 0xb0 + "sys_a0_b0", "sys_a0_b1", "do_a_long_jmp", "sys_a0_b3", + "?? sub_function", +}; + +char *biosB0n[256] = { +// 0x00 + "SysMalloc", "sys_b0_01", "sys_b0_02", "sys_b0_03", + "sys_b0_04", "sys_b0_05", "sys_b0_06", "DeliverEvent", + "OpenEvent", "CloseEvent", "WaitEvent", "TestEvent", + "EnableEvent", "DisableEvent", "OpenTh", "CloseTh", +// 0x10 + "ChangeTh", "sys_b0_11", "InitPAD", "StartPAD", + "StopPAD", "PAD_init", "PAD_dr", "ReturnFromExecption", + "ResetEntryInt", "HookEntryInt", "sys_b0_1a", "sys_b0_1b", + "sys_b0_1c", "sys_b0_1d", "sys_b0_1e", "sys_b0_1f", +// 0x20 + "UnDeliverEvent", "sys_b0_21", "sys_b0_22", "sys_b0_23", + "sys_b0_24", "sys_b0_25", "sys_b0_26", "sys_b0_27", + "sys_b0_28", "sys_b0_29", "sys_b0_2a", "sys_b0_2b", + "sys_b0_2c", "sys_b0_2d", "sys_b0_2e", "sys_b0_2f", +// 0x30 + "sys_b0_30", "sys_b0_31", "open", "lseek", + "read", "write", "close", "ioctl", + "exit", "sys_b0_39", "getc", "putc", + "getchar", "putchar", "gets", "puts", +// 0x40 + "cd", "format", "firstfile", "nextfile", + "rename", "delete", "undelete", "AddDevice", + "RemoteDevice", "PrintInstalledDevices", "InitCARD", "StartCARD", + "StopCARD", "sys_b0_4d", "_card_write", "_card_read", +// 0x50 + "_new_card", "Krom2RawAdd", "sys_b0_52", "sys_b0_53", + "_get_errno", "_get_error", "GetC0Table", "GetB0Table", + "_card_chan", "sys_b0_59", "sys_b0_5a", "ChangeClearPAD", + "_card_status", "_card_wait", +}; + +char *biosC0n[256] = { +// 0x00 + "InitRCnt", "InitException", "SysEnqIntRP", "SysDeqIntRP", + "get_free_EvCB_slot", "get_free_TCB_slot", "ExceptionHandler", "InstallExeptionHandler", + "SysInitMemory", "SysInitKMem", "ChangeClearRCnt", "SystemError", + "InitDefInt", "sys_c0_0d", "sys_c0_0e", "sys_c0_0f", +// 0x10 + "sys_c0_10", "sys_c0_11", "InstallDevices", "FlushStfInOutPut", + "sys_c0_14", "_cdevinput", "_cdevscan", "_circgetc", + "_circputc", "ioabort", "sys_c0_1a", "KernelRedirect", + "PatchAOTable", +}; + +//#define r0 (psxRegs.GPR.n.r0) +#define at (psxRegs.GPR.n.at) +#define v0 (psxRegs.GPR.n.v0) +#define v1 (psxRegs.GPR.n.v1) +#define a0 (psxRegs.GPR.n.a0) +#define a1 (psxRegs.GPR.n.a1) +#define a2 (psxRegs.GPR.n.a2) +#define a3 (psxRegs.GPR.n.a3) +#define t0 (psxRegs.GPR.n.t0) +#define t1 (psxRegs.GPR.n.t1) +#define t2 (psxRegs.GPR.n.t2) +#define t3 (psxRegs.GPR.n.t3) +#define t4 (psxRegs.GPR.n.t4) +#define t5 (psxRegs.GPR.n.t5) +#define t6 (psxRegs.GPR.n.t6) +#define t7 (psxRegs.GPR.n.t7) +#define t8 (psxRegs.GPR.n.t8) +#define t9 (psxRegs.GPR.n.t9) +#define s0 (psxRegs.GPR.n.s0) +#define s1 (psxRegs.GPR.n.s1) +#define s2 (psxRegs.GPR.n.s2) +#define s3 (psxRegs.GPR.n.s3) +#define s4 (psxRegs.GPR.n.s4) +#define s5 (psxRegs.GPR.n.s5) +#define s6 (psxRegs.GPR.n.s6) +#define s7 (psxRegs.GPR.n.s7) +#define k0 (psxRegs.GPR.n.k0) +#define k1 (psxRegs.GPR.n.k1) +#define gp (psxRegs.GPR.n.gp) +#define sp (psxRegs.GPR.n.sp) +#define fp (psxRegs.GPR.n.s8) +#define ra (psxRegs.GPR.n.ra) +#define pc0 (psxRegs.pc) + +#define Ra0 ((char *)PSXM(a0)) +#define Ra1 ((char *)PSXM(a1)) +#define Ra2 ((char *)PSXM(a2)) +#define Ra3 ((char *)PSXM(a3)) +#define Rv0 ((char *)PSXM(v0)) +#define Rsp ((char *)PSXM(sp)) + +typedef struct { + u32 desc; + s32 status; + s32 mode; + u32 fhandler; +} EvCB[32]; + +#define EvStUNUSED 0x0000 +#define EvStWAIT 0x1000 +#define EvStACTIVE 0x2000 +#define EvStALREADY 0x4000 + +#define EvMdINTR 0x1000 +#define EvMdNOINTR 0x2000 + +/* +typedef struct { + s32 next; + s32 func1; + s32 func2; + s32 pad; +} SysRPst; +*/ + +typedef struct { + s32 status; + s32 mode; + u32 reg[32]; + u32 func; +} TCB; + +typedef struct { + u32 _pc0; + u32 gp0; + u32 t_addr; + u32 t_size; + u32 d_addr; + u32 d_size; + u32 b_addr; + u32 b_size; + u32 S_addr; + u32 s_size; + u32 _sp, _fp, _gp, ret, base; +} EXEC; + +struct DIRENTRY { + char name[20]; + s32 attr; + s32 size; + u32 next; + s32 head; + char system[4]; +}; + +typedef struct { + char name[32]; + u32 mode; + u32 offset; + u32 size; + u32 mcfile; +} FileDesc; + +static u32 *jmp_int = NULL; +static int *pad_buf = NULL; +static char *pad_buf1 = NULL, *pad_buf2 = NULL; +static int pad_buf1len, pad_buf2len; + +static u32 regs[35]; +static EvCB *Event; +static EvCB *HwEV; // 0xf0 +static EvCB *EvEV; // 0xf1 +static EvCB *RcEV; // 0xf2 +static EvCB *UeEV; // 0xf3 +static EvCB *SwEV; // 0xf4 +static EvCB *ThEV; // 0xff +static u32 *heap_addr = NULL; +static u32 *heap_end = NULL; +static u32 SysIntRP[8]; +static int CardState = -1; +static TCB Thread[8]; +static int CurThread = 0; +static FileDesc FDesc[32]; + +boolean hleSoftCall = FALSE; + +static inline void softCall(u32 pc) { + pc0 = pc; + ra = 0x80001000; + + hleSoftCall = TRUE; + + while (pc0 != 0x80001000) psxCpu->ExecuteBlock(); + + hleSoftCall = FALSE; +} + +static inline void softCall2(u32 pc) { + u32 sra = ra; + pc0 = pc; + ra = 0x80001000; + + hleSoftCall = TRUE; + + while (pc0 != 0x80001000) psxCpu->ExecuteBlock(); + ra = sra; + + hleSoftCall = FALSE; +} + +static inline void DeliverEvent(u32 ev, u32 spec) { + if (Event[ev][spec].status != EvStACTIVE) return; + +// Event[ev][spec].status = EvStALREADY; + if (Event[ev][spec].mode == EvMdINTR) { + softCall2(Event[ev][spec].fhandler); + } else Event[ev][spec].status = EvStALREADY; +} + +static inline void SaveRegs() { + memcpy(regs, psxRegs.GPR.r, 32*4); + regs[32] = psxRegs.GPR.n.lo; + regs[33] = psxRegs.GPR.n.hi; + regs[34] = psxRegs.pc; +} + +static inline void LoadRegs() { + memcpy(psxRegs.GPR.r, regs, 32*4); + psxRegs.GPR.n.lo = regs[32]; + psxRegs.GPR.n.hi = regs[33]; +} + +/* * +// * +// * +// System calls A0 */ + + +void psxBios_abs() { // 0x0e + if ((s32)a0 < 0) v0 = -(s32)a0; + else v0 = a0; + pc0 = ra; +} + +void psxBios_labs() { // 0x0f + psxBios_abs(); +} + +void psxBios_atoi() { // 0x10 + s32 n = 0, f = 0; + char *p = (char *)Ra0; + + for (;;p++) { + switch (*p) { + case ' ': case '\t': continue; + case '-': f++; + case '+': p++; + } + break; + } + + while (*p >= '0' && *p <= '9') { + n = n * 10 + *p++ - '0'; + } + + v0 = (f ? -n : n); + pc0 = ra; +} + +void psxBios_atol() { // 0x11 + psxBios_atoi(); +} + +void psxBios_setjmp() { // 0x13 + u32 *jmp_buf = (u32 *)Ra0; + int i; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x13]); +#endif + + jmp_buf[0] = ra; + jmp_buf[1] = sp; + jmp_buf[2] = fp; + for (i = 0; i < 8; i++) // s0-s7 + jmp_buf[3 + i] = psxRegs.GPR.r[16 + i]; + jmp_buf[11] = gp; + + v0 = 0; pc0 = ra; +} + +void psxBios_longjmp() { // 0x14 + u32 *jmp_buf = (u32 *)Ra0; + int i; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x14]); +#endif + + ra = jmp_buf[0]; /* ra */ + sp = jmp_buf[1]; /* sp */ + fp = jmp_buf[2]; /* fp */ + for (i = 0; i < 8; i++) // s0-s7 + psxRegs.GPR.r[16 + i] = jmp_buf[3 + i]; + gp = jmp_buf[11]; /* gp */ + + v0 = a1; pc0 = ra; +} + +void psxBios_strcat() { // 0x15 + char *p1 = (char *)Ra0, *p2 = (char *)Ra1; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %s, %s\n", biosA0n[0x15], Ra0, Ra1); +#endif + + while (*p1++); + --p1; + while ((*p1++ = *p2++) != '\0'); + + v0 = a0; pc0 = ra; +} + +void psxBios_strncat() { // 0x16 + char *p1 = (char *)Ra0, *p2 = (char *)Ra1; + s32 n = a2; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %s (%x), %s (%x), %d\n", biosA0n[0x16], Ra0, a0, Ra1, a1, a2); +#endif + + while (*p1++); + --p1; + while ((*p1++ = *p2++) != '\0') { + if (--n < 0) { + *--p1 = '\0'; + break; + } + } + + v0 = a0; pc0 = ra; +} + +void psxBios_strcmp() { // 0x17 + char *p1 = (char *)Ra0, *p2 = (char *)Ra1; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %s (%x), %s (%x)\n", biosA0n[0x17], Ra0, a0, Ra1, a1); +#endif + + while (*p1 == *p2++) { + if (*p1++ == '\0') { + v0 = 0; + pc0 = ra; + return; + } + } + + v0 = (*p1 - *--p2); + pc0 = ra; +} + +void psxBios_strncmp() { // 0x18 + char *p1 = (char *)Ra0, *p2 = (char *)Ra1; + s32 n = a2; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %s (%x), %s (%x), %d\n", biosA0n[0x18], Ra0, a0, Ra1, a1, a2); +#endif + + while (--n >= 0 && *p1 == *p2++) { + if (*p1++ == '\0') { + v0 = 0; + pc0 = ra; + return; + } + } + + v0 = (n < 0 ? 0 : *p1 - *--p2); + pc0 = ra; +} + +void psxBios_strcpy() { // 0x19 + char *p1 = (char *)Ra0, *p2 = (char *)Ra1; + while ((*p1++ = *p2++) != '\0'); + + v0 = a0; pc0 = ra; +} + +void psxBios_strncpy() { // 0x1a + char *p1 = (char *)Ra0, *p2 = (char *)Ra1; + s32 n = a2, i; + + for (i = 0; i < n; i++) { + if ((*p1++ = *p2++) == '\0') { + while (++i < n) { + *p1++ = '\0'; + } + v0 = a0; pc0 = ra; + return; + } + } + + v0 = a0; pc0 = ra; +} + +void psxBios_strlen() { // 0x1b + char *p = (char *)Ra0; + v0 = 0; + while (*p++) v0++; + pc0 = ra; +} + +void psxBios_index() { // 0x1c + char *p = (char *)Ra0; + + do { + if (*p == a1) { + v0 = a0 + (p - (char *)Ra0); + pc0 = ra; + return; + } + } while (*p++ != '\0'); + + v0 = 0; pc0 = ra; +} + +void psxBios_rindex() { // 0x1d + char *p = (char *)Ra0; + + v0 = 0; + + do { + if (*p == a1) + v0 = a0 + (p - (char *)Ra0); + } while (*p++ != '\0'); + + pc0 = ra; +} + +void psxBios_strchr() { // 0x1e + psxBios_index(); +} + +void psxBios_strrchr() { // 0x1f + psxBios_rindex(); +} + +void psxBios_strpbrk() { // 0x20 + char *p1 = (char *)Ra0, *p2 = (char *)Ra1, *scanp, c, sc; + + while ((c = *p1++) != '\0') { + for (scanp = p2; (sc = *scanp++) != '\0';) { + if (sc == c) { + v0 = a0 + (p1 - 1 - (char *)Ra0); + pc0 = ra; + return; + } + } + } + + // BUG: return a0 instead of NULL if not found + v0 = a0; pc0 = ra; +} + +void psxBios_strspn() { // 0x21 + char *p1, *p2; + + for (p1 = (char *)Ra0; *p1 != '\0'; p1++) { + for (p2 = (char *)Ra1; *p2 != '\0' && *p2 != *p1; p2++); + if (*p2 == '\0') break; + } + + v0 = p1 - (char *)Ra0; pc0 = ra; +} + +void psxBios_strcspn() { // 0x22 + char *p1, *p2; + + for (p1 = (char *)Ra0; *p1 != '\0'; p1++) { + for (p2 = (char *)Ra1; *p2 != '\0' && *p2 != *p1; p2++); + if (*p2 != '\0') break; + } + + v0 = p1 - (char *)Ra0; pc0 = ra; +} + +void psxBios_strtok() { // 0x23 + char *pcA0 = (char *)Ra0; + char *pcRet = strtok(pcA0, (char *)Ra1); + if (pcRet) + v0 = a0 + pcRet - pcA0; + else + v0 = 0; + pc0 = ra; +} + +void psxBios_strstr() { // 0x24 + char *p = (char *)Ra0, *p1, *p2; + + while (*p != '\0') { + p1 = p; + p2 = (char *)Ra1; + + while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2) { + p1++; p2++; + } + + if (*p2 == '\0') { + v0 = a0 + (p - (char *)Ra0); + pc0 = ra; + return; + } + + p++; + } + + v0 = 0; pc0 = ra; +} + +void psxBios_toupper() { // 0x25 + v0 = (s8)(a0 & 0xff); + if (v0 >= 'a' && v0 <= 'z') v0 -= 'a' - 'A'; + pc0 = ra; +} + +void psxBios_tolower() { // 0x26 + v0 = (s8)(a0 & 0xff); + if (v0 >= 'A' && v0 <= 'Z') v0 += 'a' - 'A'; + pc0 = ra; +} + +void psxBios_bcopy() { // 0x27 + char *p1 = (char *)Ra1, *p2 = (char *)Ra0; + while (a2-- > 0) *p1++ = *p2++; + + pc0 = ra; +} + +void psxBios_bzero() { // 0x28 + char *p = (char *)Ra0; + while (a1-- > 0) *p++ = '\0'; + + pc0 = ra; +} + +void psxBios_bcmp() { // 0x29 + char *p1 = (char *)Ra0, *p2 = (char *)Ra1; + + if (a0 == 0 || a1 == 0) { v0 = 0; pc0 = ra; return; } + + while (a2-- > 0) { + if (*p1++ != *p2++) { + v0 = *p1 - *p2; // BUG: compare the NEXT byte + pc0 = ra; + return; + } + } + + v0 = 0; pc0 = ra; +} + +void psxBios_memcpy() { // 0x2a + char *p1 = (char *)Ra0, *p2 = (char *)Ra1; + while (a2-- > 0) *p1++ = *p2++; + + v0 = a0; pc0 = ra; +} + +void psxBios_memset() { // 0x2b + char *p = (char *)Ra0; + while (a2-- > 0) *p++ = (char)a1; + + v0 = a0; pc0 = ra; +} + +void psxBios_memmove() { // 0x2c + char *p1 = (char *)Ra0, *p2 = (char *)Ra1; + + if (p2 <= p1 && p2 + a2 > p1) { + a2++; // BUG: copy one more byte here + p1 += a2; + p2 += a2; + while (a2-- > 0) *--p1 = *--p2; + } else { + while (a2-- > 0) *p1++ = *p2++; + } + + v0 = a0; pc0 = ra; +} + +void psxBios_memcmp() { // 0x2d + psxBios_bcmp(); +} + +void psxBios_memchr() { // 0x2e + char *p = (char *)Ra0; + + while (a2-- > 0) { + if (*p++ != (s8)a1) continue; + v0 = a0 + (p - (char *)Ra0 - 1); + pc0 = ra; + return; + } + + v0 = 0; pc0 = ra; +} + +void psxBios_rand() { // 0x2f + u32 s = psxMu32(0x9010) * 1103515245 + 12345; + v0 = (s >> 16) & 0x7fff; + psxMu32ref(0x9010) = SWAPu32(s); + pc0 = ra; +} + +void psxBios_srand() { // 0x30 + psxMu32ref(0x9010) = SWAPu32(a0); + pc0 = ra; +} + +static u32 qscmpfunc, qswidth; + +static inline int qscmp(char *a, char *b) { + u32 sa0 = a0; + + a0 = sa0 + (a - (char *)PSXM(sa0)); + a1 = sa0 + (b - (char *)PSXM(sa0)); + + softCall2(qscmpfunc); + + a0 = sa0; + return (s32)v0; +} + +static inline void qexchange(char *i, char *j) { + char t; + int n = qswidth; + + do { + t = *i; + *i++ = *j; + *j++ = t; + } while (--n); +} + +static inline void q3exchange(char *i, char *j, char *k) { + char t; + int n = qswidth; + + do { + t = *i; + *i++ = *k; + *k++ = *j; + *j++ = t; + } while (--n); +} + +static void qsort_main(char *a, char *l) { + char *i, *j, *lp, *hp; + int c; + unsigned int n; + +start: + if ((n = l - a) <= qswidth) + return; + n = qswidth * (n / (2 * qswidth)); + hp = lp = a + n; + i = a; + j = l - qswidth; + while (TRUE) { + if (i < lp) { + if ((c = qscmp(i, lp)) == 0) { + qexchange(i, lp -= qswidth); + continue; + } + if (c < 0) { + i += qswidth; + continue; + } + } + +loop: + if (j > hp) { + if ((c = qscmp(hp, j)) == 0) { + qexchange(hp += qswidth, j); + goto loop; + } + if (c > 0) { + if (i == lp) { + q3exchange(i, hp += qswidth, j); + i = lp += qswidth; + goto loop; + } + qexchange(i, j); + j -= qswidth; + i += qswidth; + continue; + } + j -= qswidth; + goto loop; + } + + if (i == lp) { + if (lp - a >= l - hp) { + qsort_main(hp + qswidth, l); + l = lp; + } else { + qsort_main(a, lp); + a = hp + qswidth; + } + goto start; + } + + q3exchange(j, lp -= qswidth, i); + j = hp -= qswidth; + } +} + +void psxBios_qsort() { // 0x31 + qswidth = a2; + qscmpfunc = a3; + qsort_main((char *)Ra0, (char *)Ra0 + a1 * a2); + + pc0 = ra; +} + +void psxBios_malloc() { // 0x33 + unsigned int *chunk, *newchunk; + unsigned int dsize, csize, cstat; + int colflag; +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x33]); +#endif + + // scan through heap and combine free chunks of space + chunk = heap_addr; + colflag = 0; + while(chunk < heap_end) { + // get size and status of actual chunk + csize = ((u32)*chunk) & 0xfffffffc; + cstat = ((u32)*chunk) & 1; + + // it's a free chunk + if(cstat == 1) { + if(colflag == 0) { + newchunk = chunk; + dsize = csize; + colflag = 1; // let's begin a new collection of free memory + } + else dsize += (csize+4); // add the new size including header + } + // not a free chunk: did we start a collection ? + else { + if(colflag == 1) { // collection is over + colflag = 0; + *newchunk = SWAP32(dsize | 1); + } + } + + // next chunk + chunk = (u32*)((uptr)chunk + csize + 4); + } + // if neccessary free memory on end of heap + if (colflag == 1) + *newchunk = SWAP32(dsize | 1); + + chunk = heap_addr; + csize = ((u32)*chunk) & 0xfffffffc; + cstat = ((u32)*chunk) & 1; + dsize = (a0 + 3) & 0xfffffffc; + + // exit on uninitialized heap + if (chunk == NULL) { + SysPrintf("malloc %x,%x: Uninitialized Heap!\n", v0, a0); + v0 = 0; + pc0 = ra; + return; + } + + // search an unused chunk that is big enough until the end of the heap + while ((dsize > csize || cstat == 0) && chunk < heap_end ) { + chunk = (u32*)((uptr)chunk + csize + 4); + csize = ((u32)*chunk) & 0xfffffffc; + cstat = ((u32)*chunk) & 1; + } + + // catch out of memory + if(chunk >= heap_end) { SysPrintf("malloc %x,%x: Out of memory error!\n", v0, a0); v0 = 0; pc0 = ra; return; } + + // allocate memory + if(dsize == csize) { + // chunk has same size + *chunk &= 0xfffffffc; + } + else { + // split free chunk + *chunk = SWAP32(dsize); + newchunk = (u32*)((uptr)chunk + dsize + 4); + *newchunk = SWAP32((csize - dsize - 4) & 0xfffffffc | 1); + } + + // return pointer to allocated memory + v0 = ((unsigned long)chunk - (unsigned long)psxM) + 4; + v0|= 0x80000000; + SysPrintf ("malloc %x,%x\n", v0, a0); + pc0 = ra; +} + +void psxBios_free() { // 0x34 + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x34]); +#endif + + SysPrintf("free %x: %x bytes\n", a0, *(u32*)(Ra0-4)); + + *(u32*)(Ra0-4) |= 1; // set chunk to free + pc0 = ra; +} + +void psxBios_calloc() { // 0x37 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x37]); +#endif + + a0 = a0 * a1; + psxBios_malloc(); + memset(Rv0, 0, a0); +} + +void psxBios_realloc() { // 0x38 + u32 block = a0; + u32 size = a1; +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x38]); +#endif + + a0 = block; + psxBios_free(); + a0 = size; + psxBios_malloc(); +} + + +/* InitHeap(void *block , int n) */ +void psxBios_InitHeap() { // 0x39 + unsigned int size; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x39]); +#endif + + if (((a0 & 0x1fffff) + a1)>= 0x200000) size = 0x1ffffc - (a0 & 0x1fffff); + else size = a1; + + size &= 0xfffffffc; + + heap_addr = (u32 *)Ra0; + heap_end = (u32 *)((u8 *)heap_addr + size); + *heap_addr = SWAP32(size | 1); + + SysPrintf("InitHeap %x,%x : %x %x\n",a0,a1, (uptr)heap_addr-(uptr)psxM, size); + + pc0 = ra; +} + +void psxBios_getchar() { //0x3b + v0 = getchar(); pc0 = ra; +} + +void psxBios_printf() { // 0x3f + char tmp[1024]; + char tmp2[1024]; + u32 save[4]; + char *ptmp = tmp; + int n=1, i=0, j; + + memcpy(save, (char*)PSXM(sp), 4 * 4); + psxMu32ref(sp) = SWAP32((u32)a0); + psxMu32ref(sp + 4) = SWAP32((u32)a1); + psxMu32ref(sp + 8) = SWAP32((u32)a2); + psxMu32ref(sp + 12) = SWAP32((u32)a3); + + while (Ra0[i]) { + switch (Ra0[i]) { + case '%': + j = 0; + tmp2[j++] = '%'; +_start: + switch (Ra0[++i]) { + case '.': + case 'l': + tmp2[j++] = Ra0[i]; goto _start; + default: + if (Ra0[i] >= '0' && Ra0[i] <= '9') { + tmp2[j++] = Ra0[i]; + goto _start; + } + break; + } + tmp2[j++] = Ra0[i]; + tmp2[j] = 0; + + switch (Ra0[i]) { + case 'f': case 'F': + ptmp += sprintf(ptmp, tmp2, (float)psxMu32(sp + n * 4)); n++; break; + case 'a': case 'A': + case 'e': case 'E': + case 'g': case 'G': + ptmp += sprintf(ptmp, tmp2, (double)psxMu32(sp + n * 4)); n++; break; + case 'p': + case 'i': + case 'd': case 'D': + case 'o': case 'O': + case 'x': case 'X': + ptmp += sprintf(ptmp, tmp2, (unsigned int)psxMu32(sp + n * 4)); n++; break; + case 'c': + ptmp += sprintf(ptmp, tmp2, (unsigned char)psxMu32(sp + n * 4)); n++; break; + case 's': + ptmp += sprintf(ptmp, tmp2, (char*)PSXM(psxMu32(sp + n * 4))); n++; break; + case '%': + *ptmp++ = Ra0[i]; break; + } + i++; + break; + default: + *ptmp++ = Ra0[i++]; + } + } + *ptmp = 0; + + memcpy((char*)PSXM(sp), save, 4 * 4); + + SysPrintf(tmp); + + pc0 = ra; +} + +/* + * long Load(char *name, struct EXEC *header); + */ + +void psxBios_Load() { // 0x42 + EXE_HEADER eheader; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %s, %x\n", biosA0n[0x42], Ra0, a1); +#endif + + if (LoadCdromFile(Ra0, &eheader) == 0) { + memcpy(Ra1, ((char*)&eheader)+16, sizeof(EXEC)); + v0 = 1; + } else v0 = 0; + + pc0 = ra; +} + +/* + * int Exec(struct EXEC *header , int argc , char **argv); + */ + +void psxBios_Exec() { // 43 + EXEC *header = (EXEC*)Ra0; + u32 tmp; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x, %x, %x\n", biosA0n[0x43], a0, a1, a2); +#endif + + header->_sp = sp; + header->_fp = fp; + header->_sp = sp; + header->_gp = gp; + header->ret = ra; + header->base = s0; + + if (header->S_addr != 0) { + tmp = header->S_addr + header->s_size; + sp = tmp; + fp = sp; + } + + gp = header->gp0; + + s0 = a0; + + a0 = a1; + a1 = a2; + + ra = 0x8000; + pc0 = header->_pc0; +} + +void psxBios_FlushCache() { // 44 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x44]); +#endif + + pc0 = ra; +} + +void psxBios_GPU_dw() { // 0x46 + int size; + s32 *ptr; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x46]); +#endif + + GPU_writeData(0xa0000000); + GPU_writeData((a1<<16)|(a0&0xffff)); + GPU_writeData((a3<<16)|(a2&0xffff)); + size = (a2*a3+1)/2; + ptr = (s32*)PSXM(Rsp[4]); //that is correct? + do { + GPU_writeData(SWAP32(*ptr)); + ptr++; + } while(--size); + + pc0 = ra; +} + +void psxBios_mem2vram() { // 0x47 + int size; + + GPU_writeData(0xa0000000); + GPU_writeData((a1<<16)|(a0&0xffff)); + GPU_writeData((a3<<16)|(a2&0xffff)); + size = (a2*a3+1)/2; + GPU_writeStatus(0x04000002); + psxHwWrite32(0x1f8010f4,0); + psxHwWrite32(0x1f8010f0,psxHwRead32(0x1f8010f0)|0x800); + psxHwWrite32(0x1f8010a0,Rsp[4]);//might have a buggy... + psxHwWrite32(0x1f8010a4,((size/16)<<16)|16); + psxHwWrite32(0x1f8010a8,0x01000201); + + pc0 = ra; +} + +void psxBios_SendGPU() { // 0x48 + GPU_writeStatus(a0); + pc0 = ra; +} + +void psxBios_GPU_cw() { // 0x49 + GPU_writeData(a0); + pc0 = ra; +} + +void psxBios_GPU_cwb() { // 0x4a + s32 *ptr = (s32*)Ra0; + int size = a1; + while(size--) { + GPU_writeData(SWAP32(*ptr)); + ptr++; + } + + pc0 = ra; +} + +void psxBios_GPU_SendPackets() { //4b: + GPU_writeStatus(0x04000002); + psxHwWrite32(0x1f8010f4,0); + psxHwWrite32(0x1f8010f0,psxHwRead32(0x1f8010f0)|0x800); + psxHwWrite32(0x1f8010a0,a0); + psxHwWrite32(0x1f8010a4,0); + psxHwWrite32(0x1f8010a8,0x010000401); + pc0 = ra; +} + +void psxBios_sys_a0_4c() { // 0x4c GPU relate + psxHwWrite32(0x1f8010a8,0x00000401); + GPU_writeData(0x0400000); + GPU_writeData(0x0200000); + GPU_writeData(0x0100000); + + pc0 = ra; +} + +void psxBios_GPU_GetGPUStatus() { // 0x4d + v0 = GPU_readStatus(); + pc0 = ra; +} + +#undef s_addr + +void psxBios_LoadExec() { // 51 + EXEC *header = (EXEC*)PSXM(0xf000); + u32 s_addr, s_size; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %s: %x,%x\n", biosA0n[0x51], Ra0, a1, a2); +#endif + s_addr = a1; s_size = a2; + + a1 = 0xf000; + psxBios_Load(); + + header->S_addr = s_addr; + header->s_size = s_size; + + a0 = 0xf000; a1 = 0; a2 = 0; + psxBios_Exec(); +} + +void psxBios__bu_init() { // 70 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x70]); +#endif + + DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004 + DeliverEvent(0x81, 0x2); // 0xf4000001, 0x0004 + + pc0 = ra; +} + +void psxBios__96_init() { // 71 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x71]); +#endif + + pc0 = ra; +} + +void psxBios__96_remove() { // 72 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x72]); +#endif + + pc0 = ra; +} + +void psxBios_SetMem() { // 9f + u32 new = psxHu32(0x1060); + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x, %x\n", biosA0n[0x9f], a0, a1); +#endif + + switch(a0) { + case 2: + psxHu32ref(0x1060) = SWAP32(new); + psxMu32ref(0x060) = a0; + SysPrintf("Change effective memory : %d MBytes\n",a0); + break; + + case 8: + psxHu32ref(0x1060) = SWAP32(new | 0x300); + psxMu32ref(0x060) = a0; + SysPrintf("Change effective memory : %d MBytes\n",a0); + + default: + SysPrintf("Effective memory must be 2/8 MBytes\n"); + break; + } + + pc0 = ra; +} + +void psxBios__card_info() { // ab +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x\n", biosA0n[0xab], a0); +#endif + +// DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004 + DeliverEvent(0x81, 0x2); // 0xf4000001, 0x0004 + + v0 = 1; pc0 = ra; +} + +void psxBios__card_load() { // ac +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x\n", biosA0n[0xac], a0); +#endif + +// DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004 + DeliverEvent(0x81, 0x2); // 0xf4000001, 0x0004 + + v0 = 1; pc0 = ra; +} + +/* System calls B0 */ + +void psxBios_SetRCnt() { // 02 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x02]); +#endif + + a0&= 0x3; + if (a0 != 3) { + u32 mode=0; + + psxRcntWtarget(a0, a1); + if (a2&0x1000) mode|= 0x050; // Interrupt Mode + if (a2&0x0100) mode|= 0x008; // Count to 0xffff + if (a2&0x0010) mode|= 0x001; // Timer stop mode + if (a0 == 2) { if (a2&0x0001) mode|= 0x200; } // System Clock mode + else { if (a2&0x0001) mode|= 0x100; } // System Clock mode + + psxRcntWmode(a0, mode); + } + pc0 = ra; +} + +void psxBios_GetRCnt() { // 03 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x03]); +#endif + + a0&= 0x3; + if (a0 != 3) v0 = psxRcntRcount(a0); + else v0 = 0; + pc0 = ra; +} + +void psxBios_StartRCnt() { // 04 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x04]); +#endif + + a0&= 0x3; + if (a0 != 3) psxHu32ref(0x1074)|= SWAP32((u32)((1<<(a0+4)))); + else psxHu32ref(0x1074)|= SWAPu32(0x1); + v0 = 1; pc0 = ra; +} + +void psxBios_StopRCnt() { // 05 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x05]); +#endif + + a0&= 0x3; + if (a0 != 3) psxHu32ref(0x1074)&= SWAP32((u32)(~(1<<(a0+4)))); + else psxHu32ref(0x1074)&= SWAPu32(~0x1); + pc0 = ra; +} + +void psxBios_ResetRCnt() { // 06 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x06]); +#endif + + a0&= 0x3; + if (a0 != 3) { + psxRcntWmode(a0, 0); + psxRcntWtarget(a0, 0); + psxRcntWcount(a0, 0); + } + pc0 = ra; +} + + +/* gets ev for use with Event */ +#define GetEv() \ + ev = (a0 >> 24) & 0xf; \ + if (ev == 0xf) ev = 0x5; \ + ev*= 32; \ + ev+= a0&0x1f; + +/* gets spec for use with Event */ +#define GetSpec() \ + spec = 0; \ + switch (a1) { \ + case 0x0301: spec = 16; break; \ + case 0x0302: spec = 17; break; \ + default: \ + for (i=0; i<16; i++) if (a1 & (1 << i)) { spec = i; break; } \ + break; \ + } + +void psxBios_DeliverEvent() { // 07 + int ev, spec; + int i; + + GetEv(); + GetSpec(); + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s %x,%x\n", biosB0n[0x07], ev, spec); +#endif + + DeliverEvent(ev, spec); + + pc0 = ra; +} + +void psxBios_OpenEvent() { // 08 + int ev, spec; + int i; + + GetEv(); + GetSpec(); + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s %x,%x (class:%x, spec:%x, mode:%x, func:%x)\n", biosB0n[0x08], ev, spec, a0, a1, a2, a3); +#endif + + Event[ev][spec].status = EvStWAIT; + Event[ev][spec].mode = a2; + Event[ev][spec].fhandler = a3; + + v0 = ev | (spec << 8); + pc0 = ra; +} + +void psxBios_CloseEvent() { // 09 + int ev, spec; + + ev = a0 & 0xff; + spec = (a0 >> 8) & 0xff; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s %x,%x\n", biosB0n[0x09], ev, spec); +#endif + + Event[ev][spec].status = EvStUNUSED; + + v0 = 1; pc0 = ra; +} + +void psxBios_WaitEvent() { // 0a + int ev, spec; + + ev = a0 & 0xff; + spec = (a0 >> 8) & 0xff; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s %x,%x\n", biosB0n[0x0a], ev, spec); +#endif + + Event[ev][spec].status = EvStACTIVE; + + v0 = 1; pc0 = ra; +} + +void psxBios_TestEvent() { // 0b + int ev, spec; + + ev = a0 & 0xff; + spec = (a0 >> 8) & 0xff; + + if (Event[ev][spec].status == EvStALREADY) { + Event[ev][spec].status = EvStACTIVE; v0 = 1; + } else v0 = 0; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s %x,%x: %x\n", biosB0n[0x0b], ev, spec, v0); +#endif + + pc0 = ra; +} + +void psxBios_EnableEvent() { // 0c + int ev, spec; + + ev = a0 & 0xff; + spec = (a0 >> 8) & 0xff; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s %x,%x\n", biosB0n[0x0c], ev, spec); +#endif + + Event[ev][spec].status = EvStACTIVE; + + v0 = 1; pc0 = ra; +} + +void psxBios_DisableEvent() { // 0d + int ev, spec; + + ev = a0 & 0xff; + spec = (a0 >> 8) & 0xff; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s %x,%x\n", biosB0n[0x0d], ev, spec); +#endif + + Event[ev][spec].status = EvStWAIT; + + v0 = 1; pc0 = ra; +} + +/* + * long OpenTh(long (*func)(), unsigned long sp, unsigned long gp); + */ + +void psxBios_OpenTh() { // 0e + int th; + + for (th=1; th<8; th++) + if (Thread[th].status == 0) break; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x\n", biosB0n[0x0e], th); +#endif + + Thread[th].status = 1; + Thread[th].func = a0; + Thread[th].reg[29] = a1; + Thread[th].reg[28] = a2; + + v0 = th; pc0 = ra; +} + +/* + * int CloseTh(long thread); + */ + +void psxBios_CloseTh() { // 0f + int th = a0 & 0xff; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x\n", biosB0n[0x0f], th); +#endif + + if (Thread[th].status == 0) { + v0 = 0; + } else { + Thread[th].status = 0; + v0 = 1; + } + + pc0 = ra; +} + +/* + * int ChangeTh(long thread); + */ + +void psxBios_ChangeTh() { // 10 + int th = a0 & 0xff; + +#ifdef PSXBIOS_LOG +// PSXBIOS_LOG("psxBios_%s: %x\n", biosB0n[0x10], th); +#endif + + if (Thread[th].status == 0 || CurThread == th) { + v0 = 0; + + pc0 = ra; + } else { + v0 = 1; + + if (Thread[CurThread].status == 2) { + Thread[CurThread].status = 1; + Thread[CurThread].func = ra; + memcpy(Thread[CurThread].reg, psxRegs.GPR.r, 32*4); + } + + memcpy(psxRegs.GPR.r, Thread[th].reg, 32*4); + pc0 = Thread[th].func; + Thread[th].status = 2; + CurThread = th; + } +} + +void psxBios_InitPAD() { // 0x12 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x12]); +#endif + + pad_buf1 = (char*)Ra0; + pad_buf1len = a1; + pad_buf2 = (char*)Ra2; + pad_buf2len = a3; + + v0 = 1; pc0 = ra; +} + +void psxBios_StartPAD() { // 13 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x13]); +#endif + + psxHwWrite16(0x1f801074, (unsigned short)(psxHwRead16(0x1f801074) | 0x1)); + psxRegs.CP0.n.Status |= 0x401; + pc0 = ra; +} + +void psxBios_StopPAD() { // 14 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x14]); +#endif + + pad_buf1 = NULL; + pad_buf2 = NULL; + pc0 = ra; +} + +void psxBios_PAD_init() { // 15 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x15]); +#endif + psxHwWrite16(0x1f801074, (u16)(psxHwRead16(0x1f801074) | 0x1)); + pad_buf = (int *)Ra1; + *pad_buf = -1; + psxRegs.CP0.n.Status |= 0x401; + pc0 = ra; +} + +void psxBios_PAD_dr() { // 16 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x16]); +#endif + + v0 = -1; pc0 = ra; +} + +void psxBios_ReturnFromException() { // 17 + LoadRegs(); + + pc0 = psxRegs.CP0.n.EPC; + if (psxRegs.CP0.n.Cause & 0x80000000) pc0 += 4; + + psxRegs.CP0.n.Status = (psxRegs.CP0.n.Status & 0xfffffff0) | + ((psxRegs.CP0.n.Status & 0x3c) >> 2); +} + +void psxBios_ResetEntryInt() { // 18 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x18]); +#endif + + jmp_int = NULL; + pc0 = ra; +} + +void psxBios_HookEntryInt() { // 19 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x19]); +#endif + + jmp_int = (u32*)Ra0; + pc0 = ra; +} + +void psxBios_UnDeliverEvent() { // 0x20 + int ev, spec; + int i; + + GetEv(); + GetSpec(); + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s %x,%x\n", biosB0n[0x20], ev, spec); +#endif + + if (Event[ev][spec].status == EvStALREADY && + Event[ev][spec].mode == EvMdNOINTR) + Event[ev][spec].status = EvStACTIVE; + + pc0 = ra; +} + +#define buopen(mcd) { \ + strcpy(FDesc[1 + mcd].name, Ra0+5); \ + FDesc[1 + mcd].offset = 0; \ + FDesc[1 + mcd].mode = a1; \ + \ + for (i=1; i<16; i++) { \ + ptr = Mcd##mcd##Data + 128 * i; \ + if ((*ptr & 0xF0) != 0x50) continue; \ + if (strcmp(FDesc[1 + mcd].name, ptr+0xa)) continue; \ + FDesc[1 + mcd].mcfile = i; \ + SysPrintf("open %s\n", ptr+0xa); \ + v0 = 1 + mcd; \ + break; \ + } \ + if (a1 & 0x200 && v0 == -1) { /* FCREAT */ \ + for (i=1; i<16; i++) { \ + int j, xor = 0; \ + \ + ptr = Mcd##mcd##Data + 128 * i; \ + if ((*ptr & 0xF0) == 0x50) continue; \ + ptr[0] = 0x50 | (u8)(a1 >> 16); \ + ptr[4] = 0x00; \ + ptr[5] = 0x20; \ + ptr[6] = 0x00; \ + ptr[7] = 0x00; \ + ptr[8] = 'B'; \ + ptr[9] = 'I'; \ + strcpy(ptr+0xa, FDesc[1 + mcd].name); \ + for (j=0; j<127; j++) xor^= ptr[j]; \ + ptr[127] = xor; \ + FDesc[1 + mcd].mcfile = i; \ + SysPrintf("openC %s\n", ptr); \ + v0 = 1 + mcd; \ + SaveMcd(Config.Mcd##mcd, Mcd##mcd##Data, 128 * i, 128); \ + break; \ + } \ + } \ +} + +/* + * int open(char *name , int mode); + */ + +void psxBios_open() { // 0x32 + int i; + char *ptr; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %s,%x\n", biosB0n[0x32], Ra0, a1); +#endif + + v0 = -1; + + if (!strncmp(Ra0, "bu00", 4)) { + buopen(1); + } + + if (!strncmp(Ra0, "bu10", 4)) { + buopen(2); + } + + pc0 = ra; +} + +/* + * int lseek(int fd , int offset , int whence); + */ + +void psxBios_lseek() { // 0x33 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x, %x, %x\n", biosB0n[0x33], a0, a1, a2); +#endif + + switch (a2) { + case 0: // SEEK_SET + FDesc[a0].offset = a1; + v0 = a1; +// DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004 +// DeliverEvent(0x81, 0x2); // 0xf4000001, 0x0004 + break; + + case 1: // SEEK_CUR + FDesc[a0].offset+= a1; + v0 = FDesc[a0].offset; + break; + } + + pc0 = ra; +} + +#define buread(mcd) { \ + SysPrintf("read %d: %x,%x (%s)\n", FDesc[1 + mcd].mcfile, FDesc[1 + mcd].offset, a2, Mcd##mcd##Data + 128 * FDesc[1 + mcd].mcfile + 0xa); \ + ptr = Mcd##mcd##Data + 8192 * FDesc[1 + mcd].mcfile + FDesc[1 + mcd].offset; \ + memcpy(Ra1, ptr, a2); \ + if (FDesc[1 + mcd].mode & 0x8000) v0 = 0; \ + else v0 = a2; \ + FDesc[1 + mcd].offset += v0; \ + DeliverEvent(0x11, 0x2); /* 0xf0000011, 0x0004 */ \ + DeliverEvent(0x81, 0x2); /* 0xf4000001, 0x0004 */ \ +} + +/* + * int read(int fd , void *buf , int nbytes); + */ + +void psxBios_read() { // 0x34 + char *ptr; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x, %x, %x\n", biosB0n[0x34], a0, a1, a2); +#endif + + v0 = -1; + + switch (a0) { + case 2: buread(1); break; + case 3: buread(2); break; + } + + pc0 = ra; +} + +#define buwrite(mcd) { \ + u32 offset = + 8192 * FDesc[1 + mcd].mcfile + FDesc[1 + mcd].offset; \ + SysPrintf("write %d: %x,%x\n", FDesc[1 + mcd].mcfile, FDesc[1 + mcd].offset, a2); \ + ptr = Mcd##mcd##Data + offset; \ + memcpy(ptr, Ra1, a2); \ + FDesc[1 + mcd].offset += a2; \ + SaveMcd(Config.Mcd##mcd, Mcd##mcd##Data, offset, a2); \ + if (FDesc[1 + mcd].mode & 0x8000) v0 = 0; \ + else v0 = a2; \ + DeliverEvent(0x11, 0x2); /* 0xf0000011, 0x0004 */ \ + DeliverEvent(0x81, 0x2); /* 0xf4000001, 0x0004 */ \ +} + +/* + * int write(int fd , void *buf , int nbytes); + */ + +void psxBios_write() { // 0x35/0x03 + char *ptr; + + if (a0 == 1) { // stdout + char *ptr = Ra1; + + while (a2 > 0) { + SysPrintf("%c", *ptr++); a2--; + } + pc0 = ra; return; + } +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x,%x,%x\n", biosB0n[0x35], a0, a1, a2); +#endif + + v0 = -1; + + switch (a0) { + case 2: buwrite(1); break; + case 3: buwrite(2); break; + } + + pc0 = ra; +} + +/* + * int close(int fd); + */ + +void psxBios_close() { // 0x36 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x\n", biosB0n[0x36], a0); +#endif + + v0 = a0; + pc0 = ra; +} + +void psxBios_putchar() { // 3d + SysPrintf("%c", (char)a0); + pc0 = ra; +} + +void psxBios_puts() { // 3e/3f + SysPrintf(Ra0); + pc0 = ra; +} + +char ffile[64], *pfile; +int nfile; + +#define bufile(mcd) { \ + while (nfile < 16) { \ + int match=1; \ + \ + ptr = Mcd##mcd##Data + 128 * nfile; \ + nfile++; \ + if ((*ptr & 0xF0) != 0x50) continue; \ + ptr+= 0xa; \ + if (pfile[0] == 0) { \ + strcpy(dir->name, ptr); \ + } else for (i=0; i<20; i++) { \ + if (pfile[i] == ptr[i]) { \ + dir->name[i] = ptr[i]; \ + if (ptr[i] == 0) break; else continue; } \ + if (pfile[i] == '?') { \ + dir->name[i] = ptr[i]; continue; } \ + if (pfile[i] == '*') { \ + strcpy(dir->name+i, ptr+i); break; } \ + match = 0; break; \ + } \ + SysPrintf("%d : %s = %s + %s (match=%d)\n", nfile, dir->name, pfile, ptr, match); \ + if (match == 0) continue; \ + dir->size = 8192; \ + v0 = _dir; \ + break; \ + } \ +} + +/* + * struct DIRENTRY* firstfile(char *name,struct DIRENTRY *dir); + */ + +void psxBios_firstfile() { // 42 + struct DIRENTRY *dir = (struct DIRENTRY *)Ra1; + u32 _dir = a1; + char *ptr; + int i; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %s\n", biosB0n[0x42], Ra0); +#endif + + v0 = 0; + + strcpy(ffile, Ra0); + pfile = ffile+5; + nfile = 1; + if (!strncmp(Ra0, "bu00", 4)) { + bufile(1); + v0 = _dir; + } + + if (!strncmp(Ra0, "bu10", 4)) { + bufile(2); + v0 = _dir; + } + + pc0 = ra; +} + +/* + * struct DIRENTRY* nextfile(struct DIRENTRY *dir); + */ + +void psxBios_nextfile() { // 43 + struct DIRENTRY *dir = (struct DIRENTRY *)Ra0; + u32 _dir = a0; + char *ptr; + int i; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %s\n", biosB0n[0x43], dir->name); +#endif + + v0 = 0; + + if (!strncmp(ffile, "bu00", 4)) { + bufile(1); + } + + if (!strncmp(ffile, "bu10", 4)) { + bufile(2); + } + + pc0 = ra; +} + +#define burename(mcd) { \ + for (i=1; i<16; i++) { \ + int namelen, j, xor = 0; \ + ptr = Mcd##mcd##Data + 128 * i; \ + if ((*ptr & 0xF0) != 0x50) continue; \ + if (strcmp(Ra0+5, ptr+0xa)) continue; \ + namelen = strlen(Ra1+5); \ + memcpy(ptr+0xa, Ra1+5, namelen); \ + memset(ptr+0xa+namelen, 0, 0x75-namelen); \ + for (j=0; j<127; j++) xor^= ptr[j]; \ + ptr[127] = xor; \ + SaveMcd(Config.Mcd##mcd, Mcd##mcd##Data, 128 * i + 0xa, 0x76); \ + v0 = 1; \ + break; \ + } \ +} + +/* + * int rename(char *old, char *new); + */ + +void psxBios_rename() { // 44 + char *ptr; + int i; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %s,%s\n", biosB0n[0x44], Ra0, Ra1); +#endif + + v0 = 0; + + if (!strncmp(Ra0, "bu00", 4) && !strncmp(Ra1, "bu00", 4)) { + burename(1); + } + + if (!strncmp(Ra0, "bu10", 4) && !strncmp(Ra1, "bu10", 4)) { + burename(2); + } + + pc0 = ra; +} + + +#define budelete(mcd) { \ + for (i=1; i<16; i++) { \ + ptr = Mcd##mcd##Data + 128 * i; \ + if ((*ptr & 0xF0) != 0x50) continue; \ + if (strcmp(Ra0+5, ptr+0xa)) continue; \ + *ptr = (*ptr & 0xf) | 0xA0; \ + SaveMcd(Config.Mcd##mcd, Mcd##mcd##Data, 128 * i, 1); \ + SysPrintf("delete %s\n", ptr+0xa); \ + v0 = 1; \ + break; \ + } \ +} + +/* + * int delete(char *name); + */ + +void psxBios_delete() { // 45 + char *ptr; + int i; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %s\n", biosB0n[0x45], Ra0); +#endif + + v0 = 0; + + if (!strncmp(Ra0, "bu00", 4)) { + budelete(1); + } + + if (!strncmp(Ra0, "bu10", 4)) { + budelete(2); + } + + pc0 = ra; +} + +void psxBios_InitCARD() { // 4a +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x\n", biosB0n[0x4a], a0); +#endif + + CardState = 0; + + pc0 = ra; +} + +void psxBios_StartCARD() { // 4b +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x4b]); +#endif + + if (CardState == 0) CardState = 1; + + pc0 = ra; +} + +void psxBios_StopCARD() { // 4c +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x4c]); +#endif + + if (CardState == 1) CardState = 0; + + pc0 = ra; +} + +void psxBios__card_write() { // 0x4e + int port; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x,%x,%x\n", biosB0n[0x4e], a0, a1, a2); +#endif + + port = a0 >> 4; + + if (port == 0) { + memcpy(Mcd1Data + a1 * 128, Ra2, 128); + SaveMcd(Config.Mcd1, Mcd1Data, a1 * 128, 128); + } else { + memcpy(Mcd2Data + a1 * 128, Ra2, 128); + SaveMcd(Config.Mcd2, Mcd2Data, a1 * 128, 128); + } + + DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004 +// DeliverEvent(0x81, 0x2); // 0xf4000001, 0x0004 + + v0 = 1; pc0 = ra; +} + +void psxBios__card_read() { // 0x4f + int port; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x4f]); +#endif + + port = a0 >> 4; + + if (port == 0) { + memcpy(Ra2, Mcd1Data + a1 * 128, 128); + } else { + memcpy(Ra2, Mcd2Data + a1 * 128, 128); + } + + DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004 +// DeliverEvent(0x81, 0x2); // 0xf4000001, 0x0004 + + v0 = 1; pc0 = ra; +} + +void psxBios__new_card() { // 0x50 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x50]); +#endif + + pc0 = ra; +} + +void psxBios_Krom2RawAdd() { // 0x51 + int i = 0; + + const u32 table_8140[][2] = { + {0x8140, 0x0000}, {0x8180, 0x0762}, {0x81ad, 0x0cc6}, {0x81b8, 0x0ca8}, + {0x81c0, 0x0f00}, {0x81c8, 0x0d98}, {0x81cf, 0x10c2}, {0x81da, 0x0e6a}, + {0x81e9, 0x13ce}, {0x81f0, 0x102c}, {0x81f8, 0x1590}, {0x81fc, 0x111c}, + {0x81fd, 0x1626}, {0x824f, 0x113a}, {0x8259, 0x20ee}, {0x8260, 0x1266}, + {0x827a, 0x24cc}, {0x8281, 0x1572}, {0x829b, 0x28aa}, {0x829f, 0x187e}, + {0x82f2, 0x32dc}, {0x8340, 0x2238}, {0x837f, 0x4362}, {0x8380, 0x299a}, + {0x8397, 0x4632}, {0x839f, 0x2c4c}, {0x83b7, 0x49f2}, {0x83bf, 0x2f1c}, + {0x83d7, 0x4db2}, {0x8440, 0x31ec}, {0x8461, 0x5dde}, {0x8470, 0x35ca}, + {0x847f, 0x6162}, {0x8480, 0x378c}, {0x8492, 0x639c}, {0x849f, 0x39a8}, + {0xffff, 0} + }; + + const u32 table_889f[][2] = { + {0x889f, 0x3d68}, {0x8900, 0x40ec}, {0x897f, 0x4fb0}, {0x8a00, 0x56f4}, + {0x8a7f, 0x65b8}, {0x8b00, 0x6cfc}, {0x8b7f, 0x7bc0}, {0x8c00, 0x8304}, + {0x8c7f, 0x91c8}, {0x8d00, 0x990c}, {0x8d7f, 0xa7d0}, {0x8e00, 0xaf14}, + {0x8e7f, 0xbdd8}, {0x8f00, 0xc51c}, {0x8f7f, 0xd3e0}, {0x9000, 0xdb24}, + {0x907f, 0xe9e8}, {0x9100, 0xf12c}, {0x917f, 0xfff0}, {0x9200, 0x10734}, + {0x927f, 0x115f8}, {0x9300, 0x11d3c}, {0x937f, 0x12c00}, {0x9400, 0x13344}, + {0x947f, 0x14208}, {0x9500, 0x1494c}, {0x957f, 0x15810}, {0x9600, 0x15f54}, + {0x967f, 0x16e18}, {0x9700, 0x1755c}, {0x977f, 0x18420}, {0x9800, 0x18b64}, + {0xffff, 0} + }; + + if (a0 >= 0x8140 && a0 <= 0x84be) { + while (table_8140[i][0] <= a0) i++; + a0 -= table_8140[i - 1][0]; + v0 = 0xbfc66000 + (a0 * 0x1e + table_8140[i - 1][1]); + } else if (a0 >= 0x889f && a0 <= 0x9872) { + while (table_889f[i][0] <= a0) i++; + a0 -= table_889f[i - 1][0]; + v0 = 0xbfc66000 + (a0 * 0x1e + table_889f[i - 1][1]); + } else { + v0 = 0xffffffff; + } + + pc0 = ra; +} + +void psxBios_GetC0Table() { // 56 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x56]); +#endif + + v0 = 0x674; pc0 = ra; +} + +void psxBios_GetB0Table() { // 57 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x57]); +#endif + + v0 = 0x874; pc0 = ra; +} + +void psxBios_ChangeClearPad() { // 5b +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x\n", biosB0n[0x5b], a0); +#endif + + pc0 = ra; +} + +/* System calls C0 */ + +/* + * int SysEnqIntRP(int index , long *queue); + */ + +void psxBios_SysEnqIntRP() { // 02 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x\n", biosC0n[0x02] ,a0); +#endif + + SysIntRP[a0] = a1; + + v0 = 0; pc0 = ra; +} + +/* + * int SysDeqIntRP(int index , long *queue); + */ + +void psxBios_SysDeqIntRP() { // 03 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x\n", biosC0n[0x03], a0); +#endif + + SysIntRP[a0] = 0; + + v0 = 0; pc0 = ra; +} + +void psxBios_ChangeClearRCnt() { // 0a + u32 *ptr; + +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: %x, %x\n", biosC0n[0x0a], a0, a1); +#endif + + ptr = (u32*)PSXM((a0 << 2) + 0x8600); + v0 = *ptr; + *ptr = a1; + +// psxRegs.CP0.n.Status|= 0x404; + pc0 = ra; +} + +void psxBios_dummy() { +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("unk %x call: %x\n", pc0 & 0x1fffff, t1); +#endif + pc0 = ra; +} + +void (*biosA0[256])(); +void (*biosB0[256])(); +void (*biosC0[256])(); + +#include "sjisfont.h" + +void psxBiosInit() { + u32 base, size; + u32 *ptr; + int i; + uLongf len; + + for(i = 0; i < 256; i++) { + biosA0[i] = NULL; + biosB0[i] = NULL; + biosC0[i] = NULL; + } + biosA0[0x3e] = psxBios_puts; + biosA0[0x3f] = psxBios_printf; + + biosB0[0x3d] = psxBios_putchar; + biosB0[0x3f] = psxBios_puts; + + if (!Config.HLE) return; + + for(i = 0; i < 256; i++) { + if (biosA0[i] == NULL) biosA0[i] = psxBios_dummy; + if (biosB0[i] == NULL) biosB0[i] = psxBios_dummy; + if (biosC0[i] == NULL) biosC0[i] = psxBios_dummy; + } + + biosA0[0x00] = psxBios_open; + biosA0[0x01] = psxBios_lseek; + biosA0[0x02] = psxBios_read; + biosA0[0x03] = psxBios_write; + biosA0[0x04] = psxBios_close; + //biosA0[0x05] = psxBios_ioctl; + //biosA0[0x06] = psxBios_exit; + //biosA0[0x07] = psxBios_sys_a0_07; + //biosA0[0x08] = psxBios_getc; + //biosA0[0x09] = psxBios_putc; + //biosA0[0x0a] = psxBios_todigit; + //biosA0[0x0b] = psxBios_atof; + //biosA0[0x0c] = psxBios_strtoul; + //biosA0[0x0d] = psxBios_strtol; + biosA0[0x0e] = psxBios_abs; + biosA0[0x0f] = psxBios_labs; + biosA0[0x10] = psxBios_atoi; + biosA0[0x11] = psxBios_atol; + //biosA0[0x12] = psxBios_atob; + biosA0[0x13] = psxBios_setjmp; + biosA0[0x14] = psxBios_longjmp; + biosA0[0x15] = psxBios_strcat; + biosA0[0x16] = psxBios_strncat; + biosA0[0x17] = psxBios_strcmp; + biosA0[0x18] = psxBios_strncmp; + biosA0[0x19] = psxBios_strcpy; + biosA0[0x1a] = psxBios_strncpy; + biosA0[0x1b] = psxBios_strlen; + biosA0[0x1c] = psxBios_index; + biosA0[0x1d] = psxBios_rindex; + biosA0[0x1e] = psxBios_strchr; + biosA0[0x1f] = psxBios_strrchr; + biosA0[0x20] = psxBios_strpbrk; + biosA0[0x21] = psxBios_strspn; + biosA0[0x22] = psxBios_strcspn; + biosA0[0x23] = psxBios_strtok; + biosA0[0x24] = psxBios_strstr; + biosA0[0x25] = psxBios_toupper; + biosA0[0x26] = psxBios_tolower; + biosA0[0x27] = psxBios_bcopy; + biosA0[0x28] = psxBios_bzero; + biosA0[0x29] = psxBios_bcmp; + biosA0[0x2a] = psxBios_memcpy; + biosA0[0x2b] = psxBios_memset; + biosA0[0x2c] = psxBios_memmove; + biosA0[0x2d] = psxBios_memcmp; + biosA0[0x2e] = psxBios_memchr; + biosA0[0x2f] = psxBios_rand; + biosA0[0x30] = psxBios_srand; + biosA0[0x31] = psxBios_qsort; + //biosA0[0x32] = psxBios_strtod; + biosA0[0x33] = psxBios_malloc; + biosA0[0x34] = psxBios_free; + //biosA0[0x35] = psxBios_lsearch; + //biosA0[0x36] = psxBios_bsearch; + biosA0[0x37] = psxBios_calloc; + biosA0[0x38] = psxBios_realloc; + biosA0[0x39] = psxBios_InitHeap; + //biosA0[0x3a] = psxBios__exit; + biosA0[0x3b] = psxBios_getchar; + biosA0[0x3c] = psxBios_putchar; + //biosA0[0x3d] = psxBios_gets; + //biosA0[0x40] = psxBios_sys_a0_40; + //biosA0[0x41] = psxBios_LoadTest; + biosA0[0x42] = psxBios_Load; + biosA0[0x43] = psxBios_Exec; + biosA0[0x44] = psxBios_FlushCache; + //biosA0[0x45] = psxBios_InstallInterruptHandler; + biosA0[0x46] = psxBios_GPU_dw; + biosA0[0x47] = psxBios_mem2vram; + biosA0[0x48] = psxBios_SendGPU; + biosA0[0x49] = psxBios_GPU_cw; + biosA0[0x4a] = psxBios_GPU_cwb; + biosA0[0x4b] = psxBios_GPU_SendPackets; + biosA0[0x4c] = psxBios_sys_a0_4c; + biosA0[0x4d] = psxBios_GPU_GetGPUStatus; + //biosA0[0x4e] = psxBios_GPU_sync; + //biosA0[0x4f] = psxBios_sys_a0_4f; + //biosA0[0x50] = psxBios_sys_a0_50; + biosA0[0x51] = psxBios_LoadExec; + //biosA0[0x52] = psxBios_GetSysSp; + //biosA0[0x53] = psxBios_sys_a0_53; + //biosA0[0x54] = psxBios__96_init_a54; + //biosA0[0x55] = psxBios__bu_init_a55; + //biosA0[0x56] = psxBios__96_remove_a56; + //biosA0[0x57] = psxBios_sys_a0_57; + //biosA0[0x58] = psxBios_sys_a0_58; + //biosA0[0x59] = psxBios_sys_a0_59; + //biosA0[0x5a] = psxBios_sys_a0_5a; + //biosA0[0x5b] = psxBios_dev_tty_init; + //biosA0[0x5c] = psxBios_dev_tty_open; + //biosA0[0x5d] = psxBios_sys_a0_5d; + //biosA0[0x5e] = psxBios_dev_tty_ioctl; + //biosA0[0x5f] = psxBios_dev_cd_open; + //biosA0[0x60] = psxBios_dev_cd_read; + //biosA0[0x61] = psxBios_dev_cd_close; + //biosA0[0x62] = psxBios_dev_cd_firstfile; + //biosA0[0x63] = psxBios_dev_cd_nextfile; + //biosA0[0x64] = psxBios_dev_cd_chdir; + //biosA0[0x65] = psxBios_dev_card_open; + //biosA0[0x66] = psxBios_dev_card_read; + //biosA0[0x67] = psxBios_dev_card_write; + //biosA0[0x68] = psxBios_dev_card_close; + //biosA0[0x69] = psxBios_dev_card_firstfile; + //biosA0[0x6a] = psxBios_dev_card_nextfile; + //biosA0[0x6b] = psxBios_dev_card_erase; + //biosA0[0x6c] = psxBios_dev_card_undelete; + //biosA0[0x6d] = psxBios_dev_card_format; + //biosA0[0x6e] = psxBios_dev_card_rename; + //biosA0[0x6f] = psxBios_dev_card_6f; + biosA0[0x70] = psxBios__bu_init; + biosA0[0x71] = psxBios__96_init; + biosA0[0x72] = psxBios__96_remove; + //biosA0[0x73] = psxBios_sys_a0_73; + //biosA0[0x74] = psxBios_sys_a0_74; + //biosA0[0x75] = psxBios_sys_a0_75; + //biosA0[0x76] = psxBios_sys_a0_76; + //biosA0[0x77] = psxBios_sys_a0_77; + //biosA0[0x78] = psxBios__96_CdSeekL; + //biosA0[0x79] = psxBios_sys_a0_79; + //biosA0[0x7a] = psxBios_sys_a0_7a; + //biosA0[0x7b] = psxBios_sys_a0_7b; + //biosA0[0x7c] = psxBios__96_CdGetStatus; + //biosA0[0x7d] = psxBios_sys_a0_7d; + //biosA0[0x7e] = psxBios__96_CdRead; + //biosA0[0x7f] = psxBios_sys_a0_7f; + //biosA0[0x80] = psxBios_sys_a0_80; + //biosA0[0x81] = psxBios_sys_a0_81; + //biosA0[0x82] = psxBios_sys_a0_82; + //biosA0[0x83] = psxBios_sys_a0_83; + //biosA0[0x84] = psxBios_sys_a0_84; + //biosA0[0x85] = psxBios__96_CdStop; + //biosA0[0x86] = psxBios_sys_a0_86; + //biosA0[0x87] = psxBios_sys_a0_87; + //biosA0[0x88] = psxBios_sys_a0_88; + //biosA0[0x89] = psxBios_sys_a0_89; + //biosA0[0x8a] = psxBios_sys_a0_8a; + //biosA0[0x8b] = psxBios_sys_a0_8b; + //biosA0[0x8c] = psxBios_sys_a0_8c; + //biosA0[0x8d] = psxBios_sys_a0_8d; + //biosA0[0x8e] = psxBios_sys_a0_8e; + //biosA0[0x8f] = psxBios_sys_a0_8f; + //biosA0[0x90] = psxBios_sys_a0_90; + //biosA0[0x91] = psxBios_sys_a0_91; + //biosA0[0x92] = psxBios_sys_a0_92; + //biosA0[0x93] = psxBios_sys_a0_93; + //biosA0[0x94] = psxBios_sys_a0_94; + //biosA0[0x95] = psxBios_sys_a0_95; + //biosA0[0x96] = psxBios_AddCDROMDevice; + //biosA0[0x97] = psxBios_AddMemCardDevide; + //biosA0[0x98] = psxBios_DisableKernelIORedirection; + //biosA0[0x99] = psxBios_EnableKernelIORedirection; + //biosA0[0x9a] = psxBios_sys_a0_9a; + //biosA0[0x9b] = psxBios_sys_a0_9b; + //biosA0[0x9c] = psxBios_SetConf; + //biosA0[0x9d] = psxBios_GetConf; + //biosA0[0x9e] = psxBios_sys_a0_9e; + biosA0[0x9f] = psxBios_SetMem; + //biosA0[0xa0] = psxBios__boot; + //biosA0[0xa1] = psxBios_SystemError; + //biosA0[0xa2] = psxBios_EnqueueCdIntr; + //biosA0[0xa3] = psxBios_DequeueCdIntr; + //biosA0[0xa4] = psxBios_sys_a0_a4; + //biosA0[0xa5] = psxBios_ReadSector; + //biosA0[0xa6] = psxBios_get_cd_status; + //biosA0[0xa7] = psxBios_bufs_cb_0; + //biosA0[0xa8] = psxBios_bufs_cb_1; + //biosA0[0xa9] = psxBios_bufs_cb_2; + //biosA0[0xaa] = psxBios_bufs_cb_3; + biosA0[0xab] = psxBios__card_info; + biosA0[0xac] = psxBios__card_load; + //biosA0[0axd] = psxBios__card_auto; + //biosA0[0xae] = psxBios_bufs_cd_4; + //biosA0[0xaf] = psxBios_sys_a0_af; + //biosA0[0xb0] = psxBios_sys_a0_b0; + //biosA0[0xb1] = psxBios_sys_a0_b1; + //biosA0[0xb2] = psxBios_do_a_long_jmp + //biosA0[0xb3] = psxBios_sys_a0_b3; + //biosA0[0xb4] = psxBios_sub_function; +//*******************B0 CALLS**************************** + //biosB0[0x00] = psxBios_SysMalloc; + //biosB0[0x01] = psxBios_sys_b0_01; + biosB0[0x02] = psxBios_SetRCnt; + biosB0[0x03] = psxBios_GetRCnt; + biosB0[0x04] = psxBios_StartRCnt; + biosB0[0x05] = psxBios_StopRCnt; + biosB0[0x06] = psxBios_ResetRCnt; + biosB0[0x07] = psxBios_DeliverEvent; + biosB0[0x08] = psxBios_OpenEvent; + biosB0[0x09] = psxBios_CloseEvent; + biosB0[0x0a] = psxBios_WaitEvent; + biosB0[0x0b] = psxBios_TestEvent; + biosB0[0x0c] = psxBios_EnableEvent; + biosB0[0x0d] = psxBios_DisableEvent; + biosB0[0x0e] = psxBios_OpenTh; + biosB0[0x0f] = psxBios_CloseTh; + biosB0[0x10] = psxBios_ChangeTh; + //biosB0[0x11] = psxBios_psxBios_b0_11; + biosB0[0x12] = psxBios_InitPAD; + biosB0[0x13] = psxBios_StartPAD; + biosB0[0x14] = psxBios_StopPAD; + biosB0[0x15] = psxBios_PAD_init; + biosB0[0x16] = psxBios_PAD_dr; + biosB0[0x17] = psxBios_ReturnFromException; + biosB0[0x18] = psxBios_ResetEntryInt; + biosB0[0x19] = psxBios_HookEntryInt; + //biosB0[0x1a] = psxBios_sys_b0_1a; + //biosB0[0x1b] = psxBios_sys_b0_1b; + //biosB0[0x1c] = psxBios_sys_b0_1c; + //biosB0[0x1d] = psxBios_sys_b0_1d; + //biosB0[0x1e] = psxBios_sys_b0_1e; + //biosB0[0x1f] = psxBios_sys_b0_1f; + biosB0[0x20] = psxBios_UnDeliverEvent; + //biosB0[0x21] = psxBios_sys_b0_21; + //biosB0[0x22] = psxBios_sys_b0_22; + //biosB0[0x23] = psxBios_sys_b0_23; + //biosB0[0x24] = psxBios_sys_b0_24; + //biosB0[0x25] = psxBios_sys_b0_25; + //biosB0[0x26] = psxBios_sys_b0_26; + //biosB0[0x27] = psxBios_sys_b0_27; + //biosB0[0x28] = psxBios_sys_b0_28; + //biosB0[0x29] = psxBios_sys_b0_29; + //biosB0[0x2a] = psxBios_sys_b0_2a; + //biosB0[0x2b] = psxBios_sys_b0_2b; + //biosB0[0x2c] = psxBios_sys_b0_2c; + //biosB0[0x2d] = psxBios_sys_b0_2d; + //biosB0[0x2e] = psxBios_sys_b0_2e; + //biosB0[0x2f] = psxBios_sys_b0_2f; + //biosB0[0x30] = psxBios_sys_b0_30; + //biosB0[0x31] = psxBios_sys_b0_31; + biosB0[0x32] = psxBios_open; + biosB0[0x33] = psxBios_lseek; + biosB0[0x34] = psxBios_read; + biosB0[0x35] = psxBios_write; + biosB0[0x36] = psxBios_close; + //biosB0[0x37] = psxBios_ioctl; + //biosB0[0x38] = psxBios_exit; + //biosB0[0x39] = psxBios_sys_b0_39; + //biosB0[0x3a] = psxBios_getc; + //biosB0[0x3b] = psxBios_putc; + biosB0[0x3c] = psxBios_getchar; + //biosB0[0x3e] = psxBios_gets; + //biosB0[0x40] = psxBios_cd; + //biosB0[0x41] = psxBios_format; + biosB0[0x42] = psxBios_firstfile; + biosB0[0x43] = psxBios_nextfile; + biosB0[0x44] = psxBios_rename; + biosB0[0x45] = psxBios_delete; + //biosB0[0x46] = psxBios_undelete; + //biosB0[0x47] = psxBios_AddDevice; + //biosB0[0x48] = psxBios_RemoteDevice; + //biosB0[0x49] = psxBios_PrintInstalledDevices; + biosB0[0x4a] = psxBios_InitCARD; + biosB0[0x4b] = psxBios_StartCARD; + biosB0[0x4c] = psxBios_StopCARD; + //biosB0[0x4d] = psxBios_sys_b0_4d; + biosB0[0x4e] = psxBios__card_write; + biosB0[0x4f] = psxBios__card_read; + biosB0[0x50] = psxBios__new_card; + biosB0[0x51] = psxBios_Krom2RawAdd; + //biosB0[0x52] = psxBios_sys_b0_52; + //biosB0[0x53] = psxBios_sys_b0_53; + //biosB0[0x54] = psxBios__get_errno; + //biosB0[0x55] = psxBios__get_error; + biosB0[0x56] = psxBios_GetC0Table; + biosB0[0x57] = psxBios_GetB0Table; + //biosB0[0x58] = psxBios__card_chan; + //biosB0[0x59] = psxBios_sys_b0_59; + //biosB0[0x5a] = psxBios_sys_b0_5a; + biosB0[0x5b] = psxBios_ChangeClearPad; + //biosB0[0x5c] = psxBios__card_status; + //biosB0[0x5d] = psxBios__card_wait; +//*******************C0 CALLS**************************** + //biosC0[0x00] = psxBios_InitRCnt; + //biosC0[0x01] = psxBios_InitException; + biosC0[0x02] = psxBios_SysEnqIntRP; + biosC0[0x03] = psxBios_SysDeqIntRP; + //biosC0[0x04] = psxBios_get_free_EvCB_slot; + //biosC0[0x05] = psxBios_get_free_TCB_slot; + //biosC0[0x06] = psxBios_ExceptionHandler; + //biosC0[0x07] = psxBios_InstallExeptionHandler; + //biosC0[0x08] = psxBios_SysInitMemory; + //biosC0[0x09] = psxBios_SysInitKMem; + biosC0[0x0a] = psxBios_ChangeClearRCnt; + //biosC0[0x0b] = psxBios_SystemError; + //biosC0[0x0c] = psxBios_InitDefInt; + //biosC0[0x0d] = psxBios_sys_c0_0d; + //biosC0[0x0e] = psxBios_sys_c0_0e; + //biosC0[0x0f] = psxBios_sys_c0_0f; + //biosC0[0x10] = psxBios_sys_c0_10; + //biosC0[0x11] = psxBios_sys_c0_11; + //biosC0[0x12] = psxBios_InstallDevices; + //biosC0[0x13] = psxBios_FlushStfInOutPut; + //biosC0[0x14] = psxBios_sys_c0_14; + //biosC0[0x15] = psxBios__cdevinput; + //biosC0[0x16] = psxBios__cdevscan; + //biosC0[0x17] = psxBios__circgetc; + //biosC0[0x18] = psxBios__circputc; + //biosC0[0x19] = psxBios_ioabort; + //biosC0[0x1a] = psxBios_sys_c0_1a + //biosC0[0x1b] = psxBios_KernelRedirect; + //biosC0[0x1c] = psxBios_PatchAOTable; +//************** THE END *************************************** +/**/ + base = 0x1000; + size = sizeof(EvCB) * 32; + Event = (void *)&psxR[base]; base += size * 6; + memset(Event, 0, size * 6); + HwEV = Event; + EvEV = Event + 32; + RcEV = Event + 32 * 2; + UeEV = Event + 32 * 3; + SwEV = Event + 32 * 4; + ThEV = Event + 32 * 5; + + ptr = (u32 *)&psxM[0x0874]; // b0 table + ptr[0] = SWAPu32(0x4c54 - 0x884); + + ptr = (u32 *)&psxM[0x0674]; // c0 table + ptr[6] = SWAPu32(0xc80); + + memset(SysIntRP, 0, sizeof(SysIntRP)); + memset(Thread, 0, sizeof(Thread)); + Thread[0].status = 2; // main thread + + psxMu32ref(0x0150) = SWAPu32(0x160); + psxMu32ref(0x0154) = SWAPu32(0x320); + psxMu32ref(0x0160) = SWAPu32(0x248); + strcpy((char *)&psxM[0x248], "bu"); +/* psxMu32ref(0x0ca8) = SWAPu32(0x1f410004); + psxMu32ref(0x0cf0) = SWAPu32(0x3c020000); + psxMu32ref(0x0cf4) = SWAPu32(0x2442641c); + psxMu32ref(0x09e0) = SWAPu32(0x43d0); + psxMu32ref(0x4d98) = SWAPu32(0x946f000a); +*/ + // opcode HLE + psxRu32ref(0x0000) = SWAPu32((0x3b << 26) | 4); + psxMu32ref(0x0000) = SWAPu32((0x3b << 26) | 0); + psxMu32ref(0x00a0) = SWAPu32((0x3b << 26) | 1); + psxMu32ref(0x00b0) = SWAPu32((0x3b << 26) | 2); + psxMu32ref(0x00c0) = SWAPu32((0x3b << 26) | 3); + psxMu32ref(0x4c54) = SWAPu32((0x3b << 26) | 0); + psxMu32ref(0x8000) = SWAPu32((0x3b << 26) | 5); + psxMu32ref(0x07a0) = SWAPu32((0x3b << 26) | 0); + psxMu32ref(0x0884) = SWAPu32((0x3b << 26) | 0); + psxMu32ref(0x0894) = SWAPu32((0x3b << 26) | 0); + + // initial stack pointer for BIOS interrupt + psxMu32ref(0x6c80) = SWAPu32(0x000085c8); + + // initial RNG seed + psxMu32ref(0x9010) = SWAPu32(0xac20cc00); + + // fonts + len = 0x80000 - 0x66000; + uncompress((Bytef *)(psxR + 0x66000), &len, font_8140, sizeof(font_8140)); + len = 0x80000 - 0x69d68; + uncompress((Bytef *)(psxR + 0x69d68), &len, font_889f, sizeof(font_889f)); + + // memory size 2 MB + psxHu32ref(0x1060) = SWAPu32(0x00000b88); + + hleSoftCall = FALSE; +} + +void psxBiosShutdown() { +} + +#define psxBios_PADpoll(pad) { \ + PAD##pad##_startPoll(pad); \ + pad_buf##pad[0] = 0; \ + pad_buf##pad[1] = PAD##pad##_poll(0x42); \ + if (!(pad_buf##pad[1] & 0x0f)) { \ + bufcount = 32; \ + } else { \ + bufcount = (pad_buf##pad[1] & 0x0f) * 2; \ + } \ + PAD##pad##_poll(0); \ + i = 2; \ + while (bufcount--) { \ + pad_buf##pad[i++] = PAD##pad##_poll(0); \ + } \ +} + +void biosInterrupt() { + int i, bufcount; + +// if (psxHu32(0x1070) & 0x1) { // Vsync + if (pad_buf != NULL) { + u32 *buf = (u32*)pad_buf; + + if (!Config.UseNet) { + PAD1_startPoll(1); + if (PAD1_poll(0x42) == 0x23) { + PAD1_poll(0); + *buf = PAD1_poll(0) << 8; + *buf |= PAD1_poll(0); + PAD1_poll(0); + *buf &= ~((PAD1_poll(0) > 0x20) ? 1 << 6 : 0); + *buf &= ~((PAD1_poll(0) > 0x20) ? 1 << 7 : 0); + } else { + PAD1_poll(0); + *buf = PAD1_poll(0) << 8; + *buf|= PAD1_poll(0); + } + + PAD2_startPoll(2); + if (PAD2_poll(0x42) == 0x23) { + PAD2_poll(0); + *buf |= PAD2_poll(0) << 24; + *buf |= PAD2_poll(0) << 16; + PAD2_poll(0); + *buf &= ~((PAD2_poll(0) > 0x20) ? 1 << 22 : 0); + *buf &= ~((PAD2_poll(0) > 0x20) ? 1 << 23 : 0); + } else { + PAD2_poll(0); + *buf |= PAD2_poll(0) << 24; + *buf |= PAD2_poll(0) << 16; + } + } else { + u16 data; + + PAD1_startPoll(1); + PAD1_poll(0x42); + PAD1_poll(0); + data = PAD1_poll(0) << 8; + data |= PAD1_poll(0); + + if (NET_sendPadData(&data, 2) == -1) + netError(); + + if (NET_recvPadData(&((u16*)buf)[0], 1) == -1) + netError(); + if (NET_recvPadData(&((u16*)buf)[1], 2) == -1) + netError(); + } + } + if (Config.UseNet && pad_buf1 != NULL && pad_buf2 != NULL) { + psxBios_PADpoll(1); + + if (NET_sendPadData(pad_buf1, i) == -1) + netError(); + + if (NET_recvPadData(pad_buf1, 1) == -1) + netError(); + if (NET_recvPadData(pad_buf2, 2) == -1) + netError(); + } else { + if (pad_buf1) { + psxBios_PADpoll(1); + } + + if (pad_buf2) { + psxBios_PADpoll(2); + } + } + + if (psxHu32(0x1070) & 0x1) { // Vsync + if (RcEV[3][1].status == EvStACTIVE) { + softCall(RcEV[3][1].fhandler); +// hwWrite32(0x1f801070, ~(1)); + } + } + + if (psxHu32(0x1070) & 0x70) { // Rcnt 0,1,2 + int i; + + for (i = 0; i < 3; i++) { + if (psxHu32(0x1070) & (1 << (i + 4))) { + if (RcEV[i][1].status == EvStACTIVE) { + softCall(RcEV[i][1].fhandler); + } + psxHwWrite32(0x1f801070, ~(1 << (i + 4))); + } + } + } +} + +void psxBiosException() { + int i; + + switch (psxRegs.CP0.n.Cause & 0x3c) { + case 0x00: // Interrupt +#ifdef PSXCPU_LOG +// PSXCPU_LOG("interrupt\n"); +#endif + SaveRegs(); + + sp = psxMu32(0x6c80); // create new stack for interrupt handlers + + biosInterrupt(); + + for (i = 0; i < 8; i++) { + if (SysIntRP[i]) { + u32 *queue = (u32 *)PSXM(SysIntRP[i]); + + s0 = queue[2]; + softCall(queue[1]); + } + } + + if (jmp_int != NULL) { + int i; + + psxHwWrite32(0x1f801070, 0xffffffff); + + ra = jmp_int[0]; + sp = jmp_int[1]; + fp = jmp_int[2]; + for (i = 0; i < 8; i++) // s0-s7 + psxRegs.GPR.r[16 + i] = jmp_int[3 + i]; + gp = jmp_int[11]; + + v0 = 1; + pc0 = ra; + return; + } + psxHwWrite16(0x1f801070, 0); + break; + + case 0x20: // Syscall +#ifdef PSXCPU_LOG + PSXCPU_LOG("syscall exp %x\n", a0); +#endif + switch (a0) { + case 1: // EnterCritical - disable irq's + psxRegs.CP0.n.Status &= ~0x404; +v0=1; // HDHOSHY experimental patch: Spongebob, Coldblood, fearEffect, Medievil2, Martian Gothic + break; + + case 2: // ExitCritical - enable irq's + psxRegs.CP0.n.Status |= 0x404; + break; + } + pc0 = psxRegs.CP0.n.EPC + 4; + + psxRegs.CP0.n.Status = (psxRegs.CP0.n.Status & 0xfffffff0) | + ((psxRegs.CP0.n.Status & 0x3c) >> 2); + return; + + default: +#ifdef PSXCPU_LOG + PSXCPU_LOG("unknown bios exception!\n"); +#endif + break; + } + + pc0 = psxRegs.CP0.n.EPC; + if (psxRegs.CP0.n.Cause & 0x80000000) pc0+=4; + + psxRegs.CP0.n.Status = (psxRegs.CP0.n.Status & 0xfffffff0) | + ((psxRegs.CP0.n.Status & 0x3c) >> 2); +} + +#define bfreeze(ptr, size) { \ + if (Mode == 1) memcpy(&psxR[base], ptr, size); \ + if (Mode == 0) memcpy(ptr, &psxR[base], size); \ + base += size; \ +} + +#define bfreezes(ptr) bfreeze(ptr, sizeof(ptr)) +#define bfreezel(ptr) bfreeze(ptr, sizeof(*ptr)) + +#define bfreezepsxMptr(ptr, type) { \ + if (Mode == 1) { \ + if (ptr) psxRu32ref(base) = SWAPu32((s8 *)(ptr) - psxM); \ + else psxRu32ref(base) = 0; \ + } else { \ + if (psxRu32(base) != 0) ptr = (type *)(psxM + psxRu32(base)); \ + else (ptr) = NULL; \ + } \ + base += sizeof(u32); \ +} + +void psxBiosFreeze(int Mode) { + u32 base = 0x40000; + + bfreezepsxMptr(jmp_int, u32); + bfreezepsxMptr(pad_buf, int); + bfreezepsxMptr(pad_buf1, char); + bfreezepsxMptr(pad_buf2, char); + bfreezepsxMptr(heap_addr, u32); + bfreezel(&pad_buf1len); + bfreezel(&pad_buf2len); + bfreezes(regs); + bfreezes(SysIntRP); + bfreezel(&CardState); + bfreezes(Thread); + bfreezel(&CurThread); + bfreezes(FDesc); +} diff --git a/libpcsxcore/psxbios.h b/libpcsxcore/psxbios.h new file mode 100644 index 0000000..635b35a --- /dev/null +++ b/libpcsxcore/psxbios.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __PSXBIOS_H__ +#define __PSXBIOS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" +#include "r3000a.h" +#include "psxmem.h" +#include "misc.h" +#include "sio.h" + +extern char *biosA0n[256]; +extern char *biosB0n[256]; +extern char *biosC0n[256]; + +void psxBiosInit(); +void psxBiosShutdown(); +void psxBiosException(); +void psxBiosFreeze(int Mode); + +extern void (*biosA0[256])(); +extern void (*biosB0[256])(); +extern void (*biosC0[256])(); + +extern boolean hleSoftCall; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/psxcommon.c b/libpcsxcore/psxcommon.c new file mode 100644 index 0000000..f118c2d --- /dev/null +++ b/libpcsxcore/psxcommon.c @@ -0,0 +1,76 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#include "psxcommon.h" +#include "r3000a.h" +#include "psxbios.h" + +#include "cheat.h" +#include "ppf.h" + +PcsxConfig Config; +boolean NetOpened = FALSE; + +int Log = 0; +FILE *emuLog = NULL; + +int EmuInit() { + return psxInit(); +} + +void EmuReset() { + FreeCheatSearchResults(); + FreeCheatSearchMem(); + + psxReset(); +} + +void EmuShutdown() { + ClearAllCheats(); + FreeCheatSearchResults(); + FreeCheatSearchMem(); + + FreePPFCache(); + + psxShutdown(); +} + +void EmuUpdate() { + // Do not allow hotkeys inside a softcall from HLE BIOS + if (!Config.HLE || !hleSoftCall) + SysUpdate(); + + ApplyCheats(); +} + +void __Log(char *fmt, ...) { + va_list list; +#ifdef LOG_STDOUT + char tmp[1024]; +#endif + + va_start(list, fmt); +#ifndef LOG_STDOUT + vfprintf(emuLog, fmt, list); +#else + vsprintf(tmp, fmt, list); + SysPrintf(tmp); +#endif + va_end(list); +} diff --git a/libpcsxcore/psxcommon.h b/libpcsxcore/psxcommon.h new file mode 100644 index 0000000..500c44a --- /dev/null +++ b/libpcsxcore/psxcommon.h @@ -0,0 +1,169 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* This file contains common definitions and includes for all parts of the +* emulator core. +*/ + +#ifndef __PSXCOMMON_H__ +#define __PSXCOMMON_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "config.h" + +// System includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Define types +typedef int8_t s8; +typedef int16_t s16; +typedef int32_t s32; +typedef int64_t s64; +typedef intptr_t sptr; + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; +typedef uintptr_t uptr; + +typedef uint8_t boolean; + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +// Local includes +#include "system.h" +#include "debug.h" + +#if defined (__LINUX__) || defined (__MACOSX__) +#define strnicmp strncasecmp +#endif +#define __inline inline + +// Enables NLS/internationalization if active +#ifdef ENABLE_NLS + +#include + +#undef _ +#define _(String) gettext(String) +#ifdef gettext_noop +# define N_(String) gettext_noop (String) +#else +# define N_(String) (String) +#endif + +#else + +#define _(msgid) msgid +#define N_(msgid) msgid + +#endif + +extern FILE *emuLog; +extern int Log; + +void __Log(char *fmt, ...); + +typedef struct { + char Gpu[MAXPATHLEN]; + char Spu[MAXPATHLEN]; + char Cdr[MAXPATHLEN]; + char Pad1[MAXPATHLEN]; + char Pad2[MAXPATHLEN]; + char Net[MAXPATHLEN]; + char Sio1[MAXPATHLEN]; + char Mcd1[MAXPATHLEN]; + char Mcd2[MAXPATHLEN]; + char Bios[MAXPATHLEN]; + char BiosDir[MAXPATHLEN]; + char PluginsDir[MAXPATHLEN]; + char PatchesDir[MAXPATHLEN]; + boolean Xa; + boolean Sio; + boolean Mdec; + boolean PsxAuto; + boolean Cdda; + boolean HLE; + boolean Debug; + boolean PsxOut; + boolean SpuIrq; + boolean RCntFix; + boolean UseNet; + boolean VSyncWA; + u8 Cpu; // CPU_DYNAREC or CPU_INTERPRETER + u8 PsxType; // PSX_TYPE_NTSC or PSX_TYPE_PAL +#ifdef _WIN32 + char Lang[256]; +#endif +} PcsxConfig; + +extern PcsxConfig Config; +extern boolean NetOpened; + +#define gzfreeze(ptr, size) { \ + if (Mode == 1) gzwrite(f, ptr, size); \ + if (Mode == 0) gzread(f, ptr, size); \ +} + +// Make the timing events trigger faster as we are currently assuming everything +// takes one cycle, which is not the case on real hardware. +// FIXME: Count the proper cycle and get rid of this +#define BIAS 2 +#define PSXCLK 33868800 /* 33.8688 MHz */ + +enum { + PSX_TYPE_NTSC = 0, + PSX_TYPE_PAL +}; // PSX Types + +enum { + CPU_DYNAREC = 0, + CPU_INTERPRETER +}; // CPU Types + +int EmuInit(); +void EmuReset(); +void EmuShutdown(); +void EmuUpdate(); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/psxcounters.c b/libpcsxcore/psxcounters.c new file mode 100644 index 0000000..ebfe629 --- /dev/null +++ b/libpcsxcore/psxcounters.c @@ -0,0 +1,480 @@ +/*************************************************************************** + * Copyright (C) 2010 by Blade_Arma * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* + * Internal PSX counters. + */ + +#include "psxcounters.h" + +/******************************************************************************/ + +typedef struct Rcnt +{ + u16 mode, target; + u32 rate, irq, counterState, irqState; + u32 cycle, cycleStart; +} Rcnt; + +enum +{ + Rc0Gate = 0x0001, // 0 not implemented + Rc1Gate = 0x0001, // 0 not implemented + Rc2Disable = 0x0001, // 0 partially implemented + RcUnknown1 = 0x0002, // 1 ? + RcUnknown2 = 0x0004, // 2 ? + RcCountToTarget = 0x0008, // 3 + RcIrqOnTarget = 0x0010, // 4 + RcIrqOnOverflow = 0x0020, // 5 + RcIrqRegenerate = 0x0040, // 6 + RcUnknown7 = 0x0080, // 7 ? + Rc0PixelClock = 0x0100, // 8 fake implementation + Rc1HSyncClock = 0x0100, // 8 + Rc2Unknown8 = 0x0100, // 8 ? + Rc0Unknown9 = 0x0200, // 9 ? + Rc1Unknown9 = 0x0200, // 9 ? + Rc2OneEighthClock = 0x0200, // 9 + RcUnknown10 = 0x0400, // 10 ? + RcCountEqTarget = 0x0800, // 11 + RcOverflow = 0x1000, // 12 + RcUnknown13 = 0x2000, // 13 ? (always zero) + RcUnknown14 = 0x4000, // 14 ? (always zero) + RcUnknown15 = 0x8000, // 15 ? (always zero) +}; + +#define CounterQuantity ( 4 ) +//static const u32 CounterQuantity = 4; + +static const u32 CountToOverflow = 0; +static const u32 CountToTarget = 1; + +static const u32 FrameRate[] = { 60, 50 }; +static const u32 VBlankStart[] = { 240, 256 }; +static const u32 HSyncTotal[] = { 262, 312 }; +static const u32 SpuUpdInterval[] = { 23, 22 }; + +static const s32 VerboseLevel = 0; + +/******************************************************************************/ + +static Rcnt rcnts[ CounterQuantity ]; + +static u32 hSyncCount = 0; +static u32 spuSyncCount = 0; + +u32 psxNextCounter = 0, psxNextsCounter = 0; + +/******************************************************************************/ + +static inline +void setIrq( u32 irq ) +{ + psxHu32ref(0x1070) |= SWAPu32(irq); +} + +static +void verboseLog( s32 level, const char *str, ... ) +{ + if( level <= VerboseLevel ) + { + va_list va; + char buf[ 4096 ]; + + va_start( va, str ); + vsprintf( buf, str, va ); + va_end( va ); + + printf( buf ); + fflush( stdout ); + } +} + +/******************************************************************************/ + +static inline +void _psxRcntWcount( u32 index, u32 value ) +{ + if( value > 0xffff ) + { + verboseLog( 1, "[RCNT %i] wcount > 0xffff: %x\n", index, value ); + value &= 0xffff; + } + + rcnts[index].cycleStart = psxRegs.cycle; + rcnts[index].cycleStart -= value * rcnts[index].rate; + + // TODO: <=. + if( value < rcnts[index].target ) + { + rcnts[index].cycle = rcnts[index].target * rcnts[index].rate; + rcnts[index].counterState = CountToTarget; + } + else + { + rcnts[index].cycle = 0xffff * rcnts[index].rate; + rcnts[index].counterState = CountToOverflow; + } +} + +static inline +u32 _psxRcntRcount( u32 index ) +{ + u32 count; + + count = psxRegs.cycle; + count -= rcnts[index].cycleStart; + count /= rcnts[index].rate; + + if( count > 0xffff ) + { + verboseLog( 1, "[RCNT %i] rcount > 0xffff: %x\n", index, count ); + count &= 0xffff; + } + + return count; +} + +/******************************************************************************/ + +static +void psxRcntSet() +{ + s32 countToUpdate; + u32 i; + + psxNextsCounter = psxRegs.cycle; + psxNextCounter = 0x7fffffff; + + for( i = 0; i < CounterQuantity; ++i ) + { + countToUpdate = rcnts[i].cycle - (psxNextsCounter - rcnts[i].cycleStart); + + if( countToUpdate < 0 ) + { + psxNextCounter = 0; + break; + } + + if( countToUpdate < (s32)psxNextCounter ) + { + psxNextCounter = countToUpdate; + } + } +} + +/******************************************************************************/ + +static +void psxRcntReset( u32 index ) +{ + u32 count; + + if( rcnts[index].counterState == CountToTarget ) + { + if( rcnts[index].mode & RcCountToTarget ) + { + count = psxRegs.cycle; + count -= rcnts[index].cycleStart; + count /= rcnts[index].rate; + count -= rcnts[index].target; + } + else + { + count = _psxRcntRcount( index ); + } + + _psxRcntWcount( index, count ); + + if( rcnts[index].mode & RcIrqOnTarget ) + { + if( (rcnts[index].mode & RcIrqRegenerate) || (!rcnts[index].irqState) ) + { + verboseLog( 3, "[RCNT %i] irq: %x\n", index, count ); + setIrq( rcnts[index].irq ); + rcnts[index].irqState = 1; + } + } + + rcnts[index].mode |= RcCountEqTarget; + } + else if( rcnts[index].counterState == CountToOverflow ) + { + count = psxRegs.cycle; + count -= rcnts[index].cycleStart; + count /= rcnts[index].rate; + count -= 0xffff; + + _psxRcntWcount( index, count ); + + if( rcnts[index].mode & RcIrqOnOverflow ) + { + if( (rcnts[index].mode & RcIrqRegenerate) || (!rcnts[index].irqState) ) + { + verboseLog( 3, "[RCNT %i] irq: %x\n", index, count ); + setIrq( rcnts[index].irq ); + rcnts[index].irqState = 1; + } + } + + rcnts[index].mode |= RcOverflow; + } + + rcnts[index].mode |= RcUnknown10; + + psxRcntSet(); +} + +void psxRcntUpdate() +{ + u32 cycle; + + cycle = psxRegs.cycle; + + // rcnt 0. + if( cycle - rcnts[0].cycleStart >= rcnts[0].cycle ) + { + psxRcntReset( 0 ); + } + + // rcnt 1. + if( cycle - rcnts[1].cycleStart >= rcnts[1].cycle ) + { + psxRcntReset( 1 ); + } + + // rcnt 2. + if( cycle - rcnts[2].cycleStart >= rcnts[2].cycle ) + { + psxRcntReset( 2 ); + } + + // rcnt base. + if( cycle - rcnts[3].cycleStart >= rcnts[3].cycle ) + { + psxRcntReset( 3 ); + + spuSyncCount++; + hSyncCount++; + + // Update spu. + if( spuSyncCount >= SpuUpdInterval[Config.PsxType] ) + { + spuSyncCount = 0; + + if( SPU_async ) + { + SPU_async( SpuUpdInterval[Config.PsxType] * rcnts[3].target ); + } + } + + // VSync irq. + if( hSyncCount == VBlankStart[Config.PsxType] ) + { + GPU_vBlank( 1 ); + + // For the best times. :D + //setIrq( 0x01 ); + } + + // Update lace. (with InuYasha fix) + if( hSyncCount >= (Config.VSyncWA ? HSyncTotal[Config.PsxType] / BIAS : HSyncTotal[Config.PsxType]) ) + { + hSyncCount = 0; + + GPU_vBlank( 0 ); + setIrq( 0x01 ); + + GPU_updateLace(); + EmuUpdate(); + } + } + + DebugVSync(); +} + +/******************************************************************************/ + +void psxRcntWcount( u32 index, u32 value ) +{ + verboseLog( 2, "[RCNT %i] wcount: %x\n", index, value ); + + psxRcntUpdate(); + + _psxRcntWcount( index, value ); + psxRcntSet(); +} + +void psxRcntWmode( u32 index, u32 value ) +{ + verboseLog( 1, "[RCNT %i] wmode: %x\n", index, value ); + + psxRcntUpdate(); + + rcnts[index].mode = value; + rcnts[index].irqState = 0; + + switch( index ) + { + case 0: + if( value & Rc0PixelClock ) + { + rcnts[index].rate = 5; + } + else + { + rcnts[index].rate = 1; + } + break; + case 1: + if( value & Rc1HSyncClock ) + { + rcnts[index].rate = (PSXCLK / (FrameRate[Config.PsxType] * HSyncTotal[Config.PsxType])); + } + else + { + rcnts[index].rate = 1; + } + break; + case 2: + if( value & Rc2OneEighthClock ) + { + rcnts[index].rate = 8; + } + else + { + rcnts[index].rate = 1; + } + + // TODO: wcount must work. + if( value & Rc2Disable ) + { + rcnts[index].rate = 0xffffffff; + } + break; + } + + _psxRcntWcount( index, 0 ); + psxRcntSet(); +} + +void psxRcntWtarget( u32 index, u32 value ) +{ + verboseLog( 1, "[RCNT %i] wtarget: %x\n", index, value ); + + psxRcntUpdate(); + + rcnts[index].target = value; + + _psxRcntWcount( index, _psxRcntRcount( index ) ); + psxRcntSet(); +} + +/******************************************************************************/ + +u32 psxRcntRcount( u32 index ) +{ + u32 count; + + psxRcntUpdate(); + + count = _psxRcntRcount( index ); + + // Parasite Eve 2 fix. + if( Config.RCntFix ) + { + if( index == 2 ) + { + if( rcnts[index].counterState == CountToTarget ) + { + count /= BIAS; + } + } + } + + verboseLog( 2, "[RCNT %i] rcount: %x\n", index, count ); + + return count; +} + +u32 psxRcntRmode( u32 index ) +{ + u16 mode; + + psxRcntUpdate(); + + mode = rcnts[index].mode; + rcnts[index].mode &= 0xe7ff; + + verboseLog( 2, "[RCNT %i] rmode: %x\n", index, mode ); + + return mode; +} + +u32 psxRcntRtarget( u32 index ) +{ + verboseLog( 2, "[RCNT %i] rtarget: %x\n", index, rcnts[index].target ); + + return rcnts[index].target; +} + +/******************************************************************************/ + +void psxRcntInit() +{ + s32 i; + + // rcnt 0. + rcnts[0].rate = 1; + rcnts[0].irq = 0x10; + + // rcnt 1. + rcnts[1].rate = 1; + rcnts[1].irq = 0x20; + + // rcnt 2. + rcnts[2].rate = 1; + rcnts[2].irq = 0x40; + + // rcnt base. + rcnts[3].rate = 1; + rcnts[3].mode = RcCountToTarget; + rcnts[3].target = (PSXCLK / (FrameRate[Config.PsxType] * HSyncTotal[Config.PsxType])); + + for( i = 0; i < CounterQuantity; ++i ) + { + _psxRcntWcount( i, 0 ); + } + + psxRcntSet(); +} + +/******************************************************************************/ + +s32 psxRcntFreeze( gzFile f, s32 Mode ) +{ + gzfreeze( &rcnts, sizeof(rcnts) ); + gzfreeze( &hSyncCount, sizeof(hSyncCount) ); + gzfreeze( &spuSyncCount, sizeof(spuSyncCount) ); + gzfreeze( &psxNextCounter, sizeof(psxNextCounter) ); + gzfreeze( &psxNextsCounter, sizeof(psxNextsCounter) ); + + return 0; +} + +/******************************************************************************/ diff --git a/libpcsxcore/psxcounters.h b/libpcsxcore/psxcounters.h new file mode 100644 index 0000000..bccb2e4 --- /dev/null +++ b/libpcsxcore/psxcounters.h @@ -0,0 +1,50 @@ +/*************************************************************************** + * Copyright (C) 2010 by Blade_Arma * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __PSXCOUNTERS_H__ +#define __PSXCOUNTERS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" +#include "r3000a.h" +#include "psxmem.h" +#include "plugins.h" + +extern u32 psxNextCounter, psxNextsCounter; + +void psxRcntInit(); +void psxRcntUpdate(); + +void psxRcntWcount(u32 index, u32 value); +void psxRcntWmode(u32 index, u32 value); +void psxRcntWtarget(u32 index, u32 value); + +u32 psxRcntRcount(u32 index); +u32 psxRcntRmode(u32 index); +u32 psxRcntRtarget(u32 index); + +s32 psxRcntFreeze(gzFile f, s32 Mode); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/psxdma.c b/libpcsxcore/psxdma.c new file mode 100644 index 0000000..f59f268 --- /dev/null +++ b/libpcsxcore/psxdma.c @@ -0,0 +1,174 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* Handles PSX DMA functions. +*/ + +#include "psxdma.h" + +// Dma0/1 in Mdec.c +// Dma3 in CdRom.c + +void spuInterrupt() { + HW_DMA4_CHCR &= SWAP32(~0x01000000); + DMA_INTERRUPT(4); +} + +void psxDma4(u32 madr, u32 bcr, u32 chcr) { // SPU + u16 *ptr; + u32 size; + + switch (chcr) { + case 0x01000201: //cpu to spu transfer +#ifdef PSXDMA_LOG + PSXDMA_LOG("*** DMA4 SPU - mem2spu *** %x addr = %x size = %x\n", chcr, madr, bcr); +#endif + ptr = (u16 *)PSXM(madr); + if (ptr == NULL) { +#ifdef CPU_LOG + CPU_LOG("*** DMA4 SPU - mem2spu *** NULL Pointer!!!\n"); +#endif + break; + } + SPU_writeDMAMem(ptr, (bcr >> 16) * (bcr & 0xffff) * 2); + SPUDMA_INT((bcr >> 16) * (bcr & 0xffff) / 2); + return; + + case 0x01000200: //spu to cpu transfer +#ifdef PSXDMA_LOG + PSXDMA_LOG("*** DMA4 SPU - spu2mem *** %x addr = %x size = %x\n", chcr, madr, bcr); +#endif + ptr = (u16 *)PSXM(madr); + if (ptr == NULL) { +#ifdef CPU_LOG + CPU_LOG("*** DMA4 SPU - spu2mem *** NULL Pointer!!!\n"); +#endif + break; + } + size = (bcr >> 16) * (bcr & 0xffff) * 2; + SPU_readDMAMem(ptr, size); + psxCpu->Clear(madr, size); + break; + +#ifdef PSXDMA_LOG + default: + PSXDMA_LOG("*** DMA4 SPU - unknown *** %x addr = %x size = %x\n", chcr, madr, bcr); + break; +#endif + } + + HW_DMA4_CHCR &= SWAP32(~0x01000000); + DMA_INTERRUPT(4); +} + +void psxDma2(u32 madr, u32 bcr, u32 chcr) { // GPU + u32 *ptr; + u32 size; + + switch(chcr) { + case 0x01000200: // vram2mem +#ifdef PSXDMA_LOG + PSXDMA_LOG("*** DMA2 GPU - vram2mem *** %x addr = %x size = %x\n", chcr, madr, bcr); +#endif + ptr = (u32 *)PSXM(madr); + if (ptr == NULL) { +#ifdef CPU_LOG + CPU_LOG("*** DMA2 GPU - vram2mem *** NULL Pointer!!!\n"); +#endif + break; + } + size = (bcr >> 16) * (bcr & 0xffff); + GPU_readDataMem(ptr, size); + psxCpu->Clear(madr, size); + break; + + case 0x01000201: // mem2vram +#ifdef PSXDMA_LOG + PSXDMA_LOG("*** DMA 2 - GPU mem2vram *** %x addr = %x size = %x\n", chcr, madr, bcr); +#endif + ptr = (u32 *)PSXM(madr); + if (ptr == NULL) { +#ifdef CPU_LOG + CPU_LOG("*** DMA2 GPU - mem2vram *** NULL Pointer!!!\n"); +#endif + break; + } + size = (bcr >> 16) * (bcr & 0xffff); + GPU_writeDataMem(ptr, size); + GPUDMA_INT(size / 4); + return; + + case 0x01000401: // dma chain +#ifdef PSXDMA_LOG + PSXDMA_LOG("*** DMA 2 - GPU dma chain *** %x addr = %x size = %x\n", chcr, madr, bcr); +#endif + GPU_dmaChain((u32 *)psxM, madr & 0x1fffff); + break; + +#ifdef PSXDMA_LOG + default: + PSXDMA_LOG("*** DMA 2 - GPU unknown *** %x addr = %x size = %x\n", chcr, madr, bcr); + break; +#endif + } + + HW_DMA2_CHCR &= SWAP32(~0x01000000); + DMA_INTERRUPT(2); +} + +void gpuInterrupt() { + HW_DMA2_CHCR &= SWAP32(~0x01000000); + DMA_INTERRUPT(2); +} + +void psxDma6(u32 madr, u32 bcr, u32 chcr) { + u32 *mem = (u32 *)PSXM(madr); + +#ifdef PSXDMA_LOG + PSXDMA_LOG("*** DMA6 OT *** %x addr = %x size = %x\n", chcr, madr, bcr); +#endif + + if (chcr == 0x11000002) { + if (mem == NULL) { +#ifdef CPU_LOG + CPU_LOG("*** DMA6 OT *** NULL Pointer!!!\n"); +#endif + HW_DMA6_CHCR &= SWAP32(~0x01000000); + DMA_INTERRUPT(6); + return; + } + + while (bcr--) { + *mem-- = SWAP32((madr - 4) & 0xffffff); + madr -= 4; + } + mem++; *mem = 0xffffff; + } +#ifdef PSXDMA_LOG + else { + // Unknown option + PSXDMA_LOG("*** DMA6 OT - unknown *** %x addr = %x size = %x\n", chcr, madr, bcr); + } +#endif + + HW_DMA6_CHCR &= SWAP32(~0x01000000); + DMA_INTERRUPT(6); +} + diff --git a/libpcsxcore/psxdma.h b/libpcsxcore/psxdma.h new file mode 100644 index 0000000..0db6533 --- /dev/null +++ b/libpcsxcore/psxdma.h @@ -0,0 +1,60 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __PSXDMA_H__ +#define __PSXDMA_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" +#include "r3000a.h" +#include "psxhw.h" +#include "psxmem.h" + +#define GPUDMA_INT(eCycle) { \ + psxRegs.interrupt |= 0x01000000; \ + psxRegs.intCycle[3 + 24 + 1] = eCycle; \ + psxRegs.intCycle[3 + 24] = psxRegs.cycle; \ +} + +#define SPUDMA_INT(eCycle) { \ + psxRegs.interrupt |= 0x04000000; \ + psxRegs.intCycle[1 + 24 + 1] = eCycle; \ + psxRegs.intCycle[1 + 24] = psxRegs.cycle; \ +} + +#define MDECOUTDMA_INT(eCycle) { \ + psxRegs.interrupt |= 0x02000000; \ + psxRegs.intCycle[5 + 24 + 1] = eCycle; \ + psxRegs.intCycle[5 + 24] = psxRegs.cycle; \ +} + +void psxDma2(u32 madr, u32 bcr, u32 chcr); +void psxDma3(u32 madr, u32 bcr, u32 chcr); +void psxDma4(u32 madr, u32 bcr, u32 chcr); +void psxDma6(u32 madr, u32 bcr, u32 chcr); +void gpuInterrupt(); +void spuInterrupt(); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/psxhle.c b/libpcsxcore/psxhle.c new file mode 100644 index 0000000..83362ec --- /dev/null +++ b/libpcsxcore/psxhle.c @@ -0,0 +1,96 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* Internal PSX HLE functions. +*/ + +#include "psxhle.h" + +static void hleDummy() { + psxRegs.pc = psxRegs.GPR.n.ra; + + psxBranchTest(); +} + +static void hleA0() { + u32 call = psxRegs.GPR.n.t1 & 0xff; + + if (biosA0[call]) biosA0[call](); + + psxBranchTest(); +} + +static void hleB0() { + u32 call = psxRegs.GPR.n.t1 & 0xff; + + if (biosB0[call]) biosB0[call](); + + psxBranchTest(); +} + +static void hleC0() { + u32 call = psxRegs.GPR.n.t1 & 0xff; + + if (biosC0[call]) biosC0[call](); + + psxBranchTest(); +} + +static void hleBootstrap() { // 0xbfc00000 + SysPrintf("hleBootstrap\n"); + CheckCdrom(); + LoadCdrom(); + SysPrintf("CdromLabel: \"%s\": PC = %8.8lx (SP = %8.8lx)\n", CdromLabel, psxRegs.pc, psxRegs.GPR.n.sp); +} + +typedef struct { + u32 _pc0; + u32 gp0; + u32 t_addr; + u32 t_size; + u32 d_addr; + u32 d_size; + u32 b_addr; + u32 b_size; + u32 S_addr; + u32 s_size; + u32 _sp,_fp,_gp,ret,base; +} EXEC; + +static void hleExecRet() { + EXEC *header = (EXEC*)PSXM(psxRegs.GPR.n.s0); + + SysPrintf("ExecRet %x: %x\n", psxRegs.GPR.n.s0, header->ret); + + psxRegs.GPR.n.ra = header->ret; + psxRegs.GPR.n.sp = header->_sp; + psxRegs.GPR.n.s8 = header->_fp; + psxRegs.GPR.n.gp = header->_gp; + psxRegs.GPR.n.s0 = header->base; + + psxRegs.GPR.n.v0 = 1; + psxRegs.pc = psxRegs.GPR.n.ra; +} + +void (*psxHLEt[256])() = { + hleDummy, hleA0, hleB0, hleC0, + hleBootstrap, hleExecRet, + hleDummy, hleDummy +}; diff --git a/libpcsxcore/psxhle.h b/libpcsxcore/psxhle.h new file mode 100644 index 0000000..eef78e8 --- /dev/null +++ b/libpcsxcore/psxhle.h @@ -0,0 +1,36 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __PSXHLE_H__ +#define __PSXHLE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" +#include "r3000a.h" +#include "plugins.h" + +extern void (*psxHLEt[256])(); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/psxhw.c b/libpcsxcore/psxhw.c new file mode 100644 index 0000000..9123f76 --- /dev/null +++ b/libpcsxcore/psxhw.c @@ -0,0 +1,741 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* Functions for PSX hardware control. +*/ + +#include "psxhw.h" +#include "mdec.h" +#include "cdrom.h" + +void psxHwReset() { + if (Config.Sio) psxHu32ref(0x1070) |= SWAP32(0x80); + if (Config.SpuIrq) psxHu32ref(0x1070) |= SWAP32(0x200); + + memset(psxH, 0, 0x10000); + + mdecInit(); // initialize mdec decoder + cdrReset(); + psxRcntInit(); +} + +u8 psxHwRead8(u32 add) { + unsigned char hard; + + switch (add) { + case 0x1f801040: hard = sioRead8();break; +#ifdef ENABLE_SIO1API + case 0x1f801050: hard = SIO1_readData8(); break; +#endif + case 0x1f801800: hard = cdrRead0(); break; + case 0x1f801801: hard = cdrRead1(); break; + case 0x1f801802: hard = cdrRead2(); break; + case 0x1f801803: hard = cdrRead3(); break; + default: + hard = psxHu8(add); +#ifdef PSXHW_LOG + PSXHW_LOG("*Unkwnown 8bit read at address %x\n", add); +#endif + return hard; + } + +#ifdef PSXHW_LOG + PSXHW_LOG("*Known 8bit read at address %x value %x\n", add, hard); +#endif + return hard; +} + +u16 psxHwRead16(u32 add) { + unsigned short hard; + + switch (add) { +#ifdef PSXHW_LOG + case 0x1f801070: PSXHW_LOG("IREG 16bit read %x\n", psxHu16(0x1070)); + return psxHu16(0x1070); +#endif +#ifdef PSXHW_LOG + case 0x1f801074: PSXHW_LOG("IMASK 16bit read %x\n", psxHu16(0x1074)); + return psxHu16(0x1074); +#endif + + case 0x1f801040: + hard = sioRead8(); + hard|= sioRead8() << 8; +#ifdef PAD_LOG + PAD_LOG("sio read16 %x; ret = %x\n", add&0xf, hard); +#endif + return hard; + case 0x1f801044: + hard = sioReadStat16(); +#ifdef PAD_LOG + PAD_LOG("sio read16 %x; ret = %x\n", add&0xf, hard); +#endif + return hard; + case 0x1f801048: + hard = sioReadMode16(); +#ifdef PAD_LOG + PAD_LOG("sio read16 %x; ret = %x\n", add&0xf, hard); +#endif + return hard; + case 0x1f80104a: + hard = sioReadCtrl16(); +#ifdef PAD_LOG + PAD_LOG("sio read16 %x; ret = %x\n", add&0xf, hard); +#endif + return hard; + case 0x1f80104e: + hard = sioReadBaud16(); +#ifdef PAD_LOG + PAD_LOG("sio read16 %x; ret = %x\n", add&0xf, hard); +#endif + return hard; +#ifdef ENABLE_SIO1API + case 0x1f801050: + hard = SIO1_readData16(); + return hard; + case 0x1f801054: + hard = SIO1_readStat16(); + return hard; + case 0x1f80105a: + hard = SIO1_readCtrl16(); + return hard; + case 0x1f80105e: + hard = SIO1_readBaud16(); + return hard; +#endif + case 0x1f801100: + hard = psxRcntRcount(0); +#ifdef PSXHW_LOG + PSXHW_LOG("T0 count read16: %x\n", hard); +#endif + return hard; + case 0x1f801104: + hard = psxRcntRmode(0); +#ifdef PSXHW_LOG + PSXHW_LOG("T0 mode read16: %x\n", hard); +#endif + return hard; + case 0x1f801108: + hard = psxRcntRtarget(0); +#ifdef PSXHW_LOG + PSXHW_LOG("T0 target read16: %x\n", hard); +#endif + return hard; + case 0x1f801110: + hard = psxRcntRcount(1); +#ifdef PSXHW_LOG + PSXHW_LOG("T1 count read16: %x\n", hard); +#endif + return hard; + case 0x1f801114: + hard = psxRcntRmode(1); +#ifdef PSXHW_LOG + PSXHW_LOG("T1 mode read16: %x\n", hard); +#endif + return hard; + case 0x1f801118: + hard = psxRcntRtarget(1); +#ifdef PSXHW_LOG + PSXHW_LOG("T1 target read16: %x\n", hard); +#endif + return hard; + case 0x1f801120: + hard = psxRcntRcount(2); +#ifdef PSXHW_LOG + PSXHW_LOG("T2 count read16: %x\n", hard); +#endif + return hard; + case 0x1f801124: + hard = psxRcntRmode(2); +#ifdef PSXHW_LOG + PSXHW_LOG("T2 mode read16: %x\n", hard); +#endif + return hard; + case 0x1f801128: + hard = psxRcntRtarget(2); +#ifdef PSXHW_LOG + PSXHW_LOG("T2 target read16: %x\n", hard); +#endif + return hard; + + //case 0x1f802030: hard = //int_2000???? + //case 0x1f802040: hard =//dip switches...?? + + default: + if (add >= 0x1f801c00 && add < 0x1f801e00) { + hard = SPU_readRegister(add); + } else { + hard = psxHu16(add); +#ifdef PSXHW_LOG + PSXHW_LOG("*Unkwnown 16bit read at address %x\n", add); +#endif + } + return hard; + } + +#ifdef PSXHW_LOG + PSXHW_LOG("*Known 16bit read at address %x value %x\n", add, hard); +#endif + return hard; +} + +u32 psxHwRead32(u32 add) { + u32 hard; + + switch (add) { + case 0x1f801040: + hard = sioRead8(); + hard |= sioRead8() << 8; + hard |= sioRead8() << 16; + hard |= sioRead8() << 24; +#ifdef PAD_LOG + PAD_LOG("sio read32 ;ret = %x\n", hard); +#endif + return hard; +#ifdef ENABLE_SIO1API + case 0x1f801050: + hard = SIO1_readData32(); + return hard; +#endif +#ifdef PSXHW_LOG + case 0x1f801060: + PSXHW_LOG("RAM size read %x\n", psxHu32(0x1060)); + return psxHu32(0x1060); +#endif +#ifdef PSXHW_LOG + case 0x1f801070: PSXHW_LOG("IREG 32bit read %x\n", psxHu32(0x1070)); + return psxHu32(0x1070); +#endif +#ifdef PSXHW_LOG + case 0x1f801074: PSXHW_LOG("IMASK 32bit read %x\n", psxHu32(0x1074)); + return psxHu32(0x1074); +#endif + + case 0x1f801810: + hard = GPU_readData(); +#ifdef PSXHW_LOG + PSXHW_LOG("GPU DATA 32bit read %x\n", hard); +#endif + return hard; + case 0x1f801814: + hard = GPU_readStatus(); +#ifdef PSXHW_LOG + PSXHW_LOG("GPU STATUS 32bit read %x\n", hard); +#endif + return hard; + + case 0x1f801820: hard = mdecRead0(); break; + case 0x1f801824: hard = mdecRead1(); break; + +#ifdef PSXHW_LOG + case 0x1f8010a0: + PSXHW_LOG("DMA2 MADR 32bit read %x\n", psxHu32(0x10a0)); + return SWAPu32(HW_DMA2_MADR); + case 0x1f8010a4: + PSXHW_LOG("DMA2 BCR 32bit read %x\n", psxHu32(0x10a4)); + return SWAPu32(HW_DMA2_BCR); + case 0x1f8010a8: + PSXHW_LOG("DMA2 CHCR 32bit read %x\n", psxHu32(0x10a8)); + return SWAPu32(HW_DMA2_CHCR); +#endif + +#ifdef PSXHW_LOG + case 0x1f8010b0: + PSXHW_LOG("DMA3 MADR 32bit read %x\n", psxHu32(0x10b0)); + return SWAPu32(HW_DMA3_MADR); + case 0x1f8010b4: + PSXHW_LOG("DMA3 BCR 32bit read %x\n", psxHu32(0x10b4)); + return SWAPu32(HW_DMA3_BCR); + case 0x1f8010b8: + PSXHW_LOG("DMA3 CHCR 32bit read %x\n", psxHu32(0x10b8)); + return SWAPu32(HW_DMA3_CHCR); +#endif + +#ifdef PSXHW_LOG +/* case 0x1f8010f0: + PSXHW_LOG("DMA PCR 32bit read %x\n", psxHu32(0x10f0)); + return SWAPu32(HW_DMA_PCR); // dma rest channel + case 0x1f8010f4: + PSXHW_LOG("DMA ICR 32bit read %x\n", psxHu32(0x10f4)); + return SWAPu32(HW_DMA_ICR); // interrupt enabler?*/ +#endif + + // time for rootcounters :) + case 0x1f801100: + hard = psxRcntRcount(0); +#ifdef PSXHW_LOG + PSXHW_LOG("T0 count read32: %x\n", hard); +#endif + return hard; + case 0x1f801104: + hard = psxRcntRmode(0); +#ifdef PSXHW_LOG + PSXHW_LOG("T0 mode read32: %x\n", hard); +#endif + return hard; + case 0x1f801108: + hard = psxRcntRtarget(0); +#ifdef PSXHW_LOG + PSXHW_LOG("T0 target read32: %x\n", hard); +#endif + return hard; + case 0x1f801110: + hard = psxRcntRcount(1); +#ifdef PSXHW_LOG + PSXHW_LOG("T1 count read32: %x\n", hard); +#endif + return hard; + case 0x1f801114: + hard = psxRcntRmode(1); +#ifdef PSXHW_LOG + PSXHW_LOG("T1 mode read32: %x\n", hard); +#endif + return hard; + case 0x1f801118: + hard = psxRcntRtarget(1); +#ifdef PSXHW_LOG + PSXHW_LOG("T1 target read32: %x\n", hard); +#endif + return hard; + case 0x1f801120: + hard = psxRcntRcount(2); +#ifdef PSXHW_LOG + PSXHW_LOG("T2 count read32: %x\n", hard); +#endif + return hard; + case 0x1f801124: + hard = psxRcntRmode(2); +#ifdef PSXHW_LOG + PSXHW_LOG("T2 mode read32: %x\n", hard); +#endif + return hard; + case 0x1f801128: + hard = psxRcntRtarget(2); +#ifdef PSXHW_LOG + PSXHW_LOG("T2 target read32: %x\n", hard); +#endif + return hard; + + default: + hard = psxHu32(add); +#ifdef PSXHW_LOG + PSXHW_LOG("*Unkwnown 32bit read at address %x\n", add); +#endif + return hard; + } +#ifdef PSXHW_LOG + PSXHW_LOG("*Known 32bit read at address %x\n", add); +#endif + return hard; +} + +void psxHwWrite8(u32 add, u8 value) { + switch (add) { + case 0x1f801040: sioWrite8(value); break; +#ifdef ENABLE_SIO1API + case 0x1f801050: SIO1_writeData8(value); break; +#endif + case 0x1f801800: cdrWrite0(value); break; + case 0x1f801801: cdrWrite1(value); break; + case 0x1f801802: cdrWrite2(value); break; + case 0x1f801803: cdrWrite3(value); break; + + default: + psxHu8(add) = value; +#ifdef PSXHW_LOG + PSXHW_LOG("*Unknown 8bit write at address %x value %x\n", add, value); +#endif + return; + } + psxHu8(add) = value; +#ifdef PSXHW_LOG + PSXHW_LOG("*Known 8bit write at address %x value %x\n", add, value); +#endif +} + +void psxHwWrite16(u32 add, u16 value) { + switch (add) { + case 0x1f801040: + sioWrite8((unsigned char)value); + sioWrite8((unsigned char)(value>>8)); +#ifdef PAD_LOG + PAD_LOG ("sio write16 %x, %x\n", add&0xf, value); +#endif + return; + case 0x1f801044: + sioWriteStat16(value); +#ifdef PAD_LOG + PAD_LOG ("sio write16 %x, %x\n", add&0xf, value); +#endif + return; + case 0x1f801048: + sioWriteMode16(value); +#ifdef PAD_LOG + PAD_LOG ("sio write16 %x, %x\n", add&0xf, value); +#endif + return; + case 0x1f80104a: // control register + sioWriteCtrl16(value); +#ifdef PAD_LOG + PAD_LOG ("sio write16 %x, %x\n", add&0xf, value); +#endif + return; + case 0x1f80104e: // baudrate register + sioWriteBaud16(value); +#ifdef PAD_LOG + PAD_LOG ("sio write16 %x, %x\n", add&0xf, value); +#endif + return; +#ifdef ENABLE_SIO1API + case 0x1f801050: + SIO1_writeData16(value); + return; + case 0x1f801054: + SIO1_writeStat16(value); + return; + case 0x1f80105a: + SIO1_writeCtrl16(value); + return; + case 0x1f80105e: + SIO1_writeBaud16(value); + return; +#endif + case 0x1f801070: +#ifdef PSXHW_LOG + PSXHW_LOG("IREG 16bit write %x\n", value); +#endif + if (Config.Sio) psxHu16ref(0x1070) |= SWAPu16(0x80); + if (Config.SpuIrq) psxHu16ref(0x1070) |= SWAPu16(0x200); + psxHu16ref(0x1070) &= SWAPu16((psxHu16(0x1074) & value)); + return; + + case 0x1f801074: +#ifdef PSXHW_LOG + PSXHW_LOG("IMASK 16bit write %x\n", value); +#endif + psxHu16ref(0x1074) = SWAPu16(value); + return; + + case 0x1f801100: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 0 COUNT 16bit write %x\n", value); +#endif + psxRcntWcount(0, value); return; + case 0x1f801104: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 0 MODE 16bit write %x\n", value); +#endif + psxRcntWmode(0, value); return; + case 0x1f801108: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 0 TARGET 16bit write %x\n", value); +#endif + psxRcntWtarget(0, value); return; + + case 0x1f801110: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 1 COUNT 16bit write %x\n", value); +#endif + psxRcntWcount(1, value); return; + case 0x1f801114: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 1 MODE 16bit write %x\n", value); +#endif + psxRcntWmode(1, value); return; + case 0x1f801118: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 1 TARGET 16bit write %x\n", value); +#endif + psxRcntWtarget(1, value); return; + + case 0x1f801120: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 2 COUNT 16bit write %x\n", value); +#endif + psxRcntWcount(2, value); return; + case 0x1f801124: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 2 MODE 16bit write %x\n", value); +#endif + psxRcntWmode(2, value); return; + case 0x1f801128: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 2 TARGET 16bit write %x\n", value); +#endif + psxRcntWtarget(2, value); return; + + default: + if (add>=0x1f801c00 && add<0x1f801e00) { + SPU_writeRegister(add, value); + return; + } + + psxHu16ref(add) = SWAPu16(value); +#ifdef PSXHW_LOG + PSXHW_LOG("*Unknown 16bit write at address %x value %x\n", add, value); +#endif + return; + } + psxHu16ref(add) = SWAPu16(value); +#ifdef PSXHW_LOG + PSXHW_LOG("*Known 16bit write at address %x value %x\n", add, value); +#endif +} + +#define DmaExec(n) { \ + HW_DMA##n##_CHCR = SWAPu32(value); \ +\ + if (SWAPu32(HW_DMA##n##_CHCR) & 0x01000000 && SWAPu32(HW_DMA_PCR) & (8 << (n * 4))) { \ + psxDma##n(SWAPu32(HW_DMA##n##_MADR), SWAPu32(HW_DMA##n##_BCR), SWAPu32(HW_DMA##n##_CHCR)); \ + } \ +} + +void psxHwWrite32(u32 add, u32 value) { + switch (add) { + case 0x1f801040: + sioWrite8((unsigned char)value); + sioWrite8((unsigned char)((value&0xff) >> 8)); + sioWrite8((unsigned char)((value&0xff) >> 16)); + sioWrite8((unsigned char)((value&0xff) >> 24)); +#ifdef PAD_LOG + PAD_LOG("sio write32 %x\n", value); +#endif + return; +#ifdef ENABLE_SIO1API + case 0x1f801050: + SIO1_writeData32(value); + return; +#endif +#ifdef PSXHW_LOG + case 0x1f801060: + PSXHW_LOG("RAM size write %x\n", value); + psxHu32ref(add) = SWAPu32(value); + return; // Ram size +#endif + + case 0x1f801070: +#ifdef PSXHW_LOG + PSXHW_LOG("IREG 32bit write %x\n", value); +#endif + if (Config.Sio) psxHu32ref(0x1070) |= SWAPu32(0x80); + if (Config.SpuIrq) psxHu32ref(0x1070) |= SWAPu32(0x200); + psxHu32ref(0x1070) &= SWAPu32((psxHu32(0x1074) & value)); + return; + case 0x1f801074: +#ifdef PSXHW_LOG + PSXHW_LOG("IMASK 32bit write %x\n", value); +#endif + psxHu32ref(0x1074) = SWAPu32(value); + return; + +#ifdef PSXHW_LOG + case 0x1f801080: + PSXHW_LOG("DMA0 MADR 32bit write %x\n", value); + HW_DMA0_MADR = SWAPu32(value); return; // DMA0 madr + case 0x1f801084: + PSXHW_LOG("DMA0 BCR 32bit write %x\n", value); + HW_DMA0_BCR = SWAPu32(value); return; // DMA0 bcr +#endif + case 0x1f801088: +#ifdef PSXHW_LOG + PSXHW_LOG("DMA0 CHCR 32bit write %x\n", value); +#endif + DmaExec(0); // DMA0 chcr (MDEC in DMA) + return; + +#ifdef PSXHW_LOG + case 0x1f801090: + PSXHW_LOG("DMA1 MADR 32bit write %x\n", value); + HW_DMA1_MADR = SWAPu32(value); return; // DMA1 madr + case 0x1f801094: + PSXHW_LOG("DMA1 BCR 32bit write %x\n", value); + HW_DMA1_BCR = SWAPu32(value); return; // DMA1 bcr +#endif + case 0x1f801098: +#ifdef PSXHW_LOG + PSXHW_LOG("DMA1 CHCR 32bit write %x\n", value); +#endif + DmaExec(1); // DMA1 chcr (MDEC out DMA) + return; + +#ifdef PSXHW_LOG + case 0x1f8010a0: + PSXHW_LOG("DMA2 MADR 32bit write %x\n", value); + HW_DMA2_MADR = SWAPu32(value); return; // DMA2 madr + case 0x1f8010a4: + PSXHW_LOG("DMA2 BCR 32bit write %x\n", value); + HW_DMA2_BCR = SWAPu32(value); return; // DMA2 bcr +#endif + case 0x1f8010a8: +#ifdef PSXHW_LOG + PSXHW_LOG("DMA2 CHCR 32bit write %x\n", value); +#endif + DmaExec(2); // DMA2 chcr (GPU DMA) + return; + +#ifdef PSXHW_LOG + case 0x1f8010b0: + PSXHW_LOG("DMA3 MADR 32bit write %x\n", value); + HW_DMA3_MADR = SWAPu32(value); return; // DMA3 madr + case 0x1f8010b4: + PSXHW_LOG("DMA3 BCR 32bit write %x\n", value); + HW_DMA3_BCR = SWAPu32(value); return; // DMA3 bcr +#endif + case 0x1f8010b8: +#ifdef PSXHW_LOG + PSXHW_LOG("DMA3 CHCR 32bit write %x\n", value); +#endif + DmaExec(3); // DMA3 chcr (CDROM DMA) + + return; + +#ifdef PSXHW_LOG + case 0x1f8010c0: + PSXHW_LOG("DMA4 MADR 32bit write %x\n", value); + HW_DMA4_MADR = SWAPu32(value); return; // DMA4 madr + case 0x1f8010c4: + PSXHW_LOG("DMA4 BCR 32bit write %x\n", value); + HW_DMA4_BCR = SWAPu32(value); return; // DMA4 bcr +#endif + case 0x1f8010c8: +#ifdef PSXHW_LOG + PSXHW_LOG("DMA4 CHCR 32bit write %x\n", value); +#endif + DmaExec(4); // DMA4 chcr (SPU DMA) + return; + +#if 0 + case 0x1f8010d0: break; //DMA5write_madr(); + case 0x1f8010d4: break; //DMA5write_bcr(); + case 0x1f8010d8: break; //DMA5write_chcr(); // Not needed +#endif + +#ifdef PSXHW_LOG + case 0x1f8010e0: + PSXHW_LOG("DMA6 MADR 32bit write %x\n", value); + HW_DMA6_MADR = SWAPu32(value); return; // DMA6 bcr + case 0x1f8010e4: + PSXHW_LOG("DMA6 BCR 32bit write %x\n", value); + HW_DMA6_BCR = SWAPu32(value); return; // DMA6 bcr +#endif + case 0x1f8010e8: +#ifdef PSXHW_LOG + PSXHW_LOG("DMA6 CHCR 32bit write %x\n", value); +#endif + DmaExec(6); // DMA6 chcr (OT clear) + return; + +#ifdef PSXHW_LOG + case 0x1f8010f0: + PSXHW_LOG("DMA PCR 32bit write %x\n", value); + HW_DMA_PCR = SWAPu32(value); + return; +#endif + + case 0x1f8010f4: +#ifdef PSXHW_LOG + PSXHW_LOG("DMA ICR 32bit write %x\n", value); +#endif + { + u32 tmp = (~value) & SWAPu32(HW_DMA_ICR); + HW_DMA_ICR = SWAPu32(((tmp ^ value) & 0xffffff) ^ tmp); + return; + } + + case 0x1f801810: +#ifdef PSXHW_LOG + PSXHW_LOG("GPU DATA 32bit write %x\n", value); +#endif + GPU_writeData(value); return; + case 0x1f801814: +#ifdef PSXHW_LOG + PSXHW_LOG("GPU STATUS 32bit write %x\n", value); +#endif + GPU_writeStatus(value); return; + + case 0x1f801820: + mdecWrite0(value); break; + case 0x1f801824: + mdecWrite1(value); break; + + case 0x1f801100: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 0 COUNT 32bit write %x\n", value); +#endif + psxRcntWcount(0, value & 0xffff); return; + case 0x1f801104: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 0 MODE 32bit write %x\n", value); +#endif + psxRcntWmode(0, value); return; + case 0x1f801108: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 0 TARGET 32bit write %x\n", value); +#endif + psxRcntWtarget(0, value & 0xffff); return; // HW_DMA_ICR&= SWAP32((~value)&0xff000000); + + case 0x1f801110: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 1 COUNT 32bit write %x\n", value); +#endif + psxRcntWcount(1, value & 0xffff); return; + case 0x1f801114: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 1 MODE 32bit write %x\n", value); +#endif + psxRcntWmode(1, value); return; + case 0x1f801118: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 1 TARGET 32bit write %x\n", value); +#endif + psxRcntWtarget(1, value & 0xffff); return; + + case 0x1f801120: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 2 COUNT 32bit write %x\n", value); +#endif + psxRcntWcount(2, value & 0xffff); return; + case 0x1f801124: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 2 MODE 32bit write %x\n", value); +#endif + psxRcntWmode(2, value); return; + case 0x1f801128: +#ifdef PSXHW_LOG + PSXHW_LOG("COUNTER 2 TARGET 32bit write %x\n", value); +#endif + psxRcntWtarget(2, value & 0xffff); return; + + default: + psxHu32ref(add) = SWAPu32(value); +#ifdef PSXHW_LOG + PSXHW_LOG("*Unknown 32bit write at address %x value %x\n", add, value); +#endif + return; + } + psxHu32ref(add) = SWAPu32(value); +#ifdef PSXHW_LOG + PSXHW_LOG("*Known 32bit write at address %x value %x\n", add, value); +#endif +} + +int psxHwFreeze(gzFile f, int Mode) { + return 0; +} diff --git a/libpcsxcore/psxhw.h b/libpcsxcore/psxhw.h new file mode 100644 index 0000000..cd4e928 --- /dev/null +++ b/libpcsxcore/psxhw.h @@ -0,0 +1,78 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __PSXHW_H__ +#define __PSXHW_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" +#include "r3000a.h" +#include "psxmem.h" +#include "sio.h" +#include "psxcounters.h" + +#define HW_DMA0_MADR (psxHu32ref(0x1080)) // MDEC in DMA +#define HW_DMA0_BCR (psxHu32ref(0x1084)) +#define HW_DMA0_CHCR (psxHu32ref(0x1088)) + +#define HW_DMA1_MADR (psxHu32ref(0x1090)) // MDEC out DMA +#define HW_DMA1_BCR (psxHu32ref(0x1094)) +#define HW_DMA1_CHCR (psxHu32ref(0x1098)) + +#define HW_DMA2_MADR (psxHu32ref(0x10a0)) // GPU DMA +#define HW_DMA2_BCR (psxHu32ref(0x10a4)) +#define HW_DMA2_CHCR (psxHu32ref(0x10a8)) + +#define HW_DMA3_MADR (psxHu32ref(0x10b0)) // CDROM DMA +#define HW_DMA3_BCR (psxHu32ref(0x10b4)) +#define HW_DMA3_CHCR (psxHu32ref(0x10b8)) + +#define HW_DMA4_MADR (psxHu32ref(0x10c0)) // SPU DMA +#define HW_DMA4_BCR (psxHu32ref(0x10c4)) +#define HW_DMA4_CHCR (psxHu32ref(0x10c8)) + +#define HW_DMA6_MADR (psxHu32ref(0x10e0)) // GPU DMA (OT) +#define HW_DMA6_BCR (psxHu32ref(0x10e4)) +#define HW_DMA6_CHCR (psxHu32ref(0x10e8)) + +#define HW_DMA_PCR (psxHu32ref(0x10f0)) +#define HW_DMA_ICR (psxHu32ref(0x10f4)) + +#define DMA_INTERRUPT(n) \ + if (SWAPu32(HW_DMA_ICR) & (1 << (16 + n))) { \ + HW_DMA_ICR |= SWAP32(1 << (24 + n)); \ + psxHu32ref(0x1070) |= SWAP32(8); \ + } + +void psxHwReset(); +u8 psxHwRead8(u32 add); +u16 psxHwRead16(u32 add); +u32 psxHwRead32(u32 add); +void psxHwWrite8(u32 add, u8 value); +void psxHwWrite16(u32 add, u16 value); +void psxHwWrite32(u32 add, u32 value); +int psxHwFreeze(gzFile f, int Mode); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/psxinterpreter.c b/libpcsxcore/psxinterpreter.c new file mode 100644 index 0000000..1f4b46c --- /dev/null +++ b/libpcsxcore/psxinterpreter.c @@ -0,0 +1,804 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* + * PSX assembly interpreter. + */ + +#include "psxcommon.h" +#include "r3000a.h" +#include "gte.h" +#include "psxhle.h" + +static int branch = 0; +static int branch2 = 0; +static u32 branchPC; + +// These macros are used to assemble the repassembler functions + +#ifdef PSXCPU_LOG +#define debugI() PSXCPU_LOG("%s\n", disR3000AF(psxRegs.code, psxRegs.pc)); +#else +#define debugI() +#endif + +inline void execI(); + +// Subsets +void (*psxBSC[64])(); +void (*psxSPC[64])(); +void (*psxREG[32])(); +void (*psxCP0[32])(); +void (*psxCP2[64])(); +void (*psxCP2BSC[32])(); + +static void delayRead(int reg, u32 bpc) { + u32 rold, rnew; + +// SysPrintf("delayRead at %x!\n", psxRegs.pc); + + rold = psxRegs.GPR.r[reg]; + psxBSC[psxRegs.code >> 26](); // branch delay load + rnew = psxRegs.GPR.r[reg]; + + psxRegs.pc = bpc; + + psxBranchTest(); + + psxRegs.GPR.r[reg] = rold; + execI(); // first branch opcode + psxRegs.GPR.r[reg] = rnew; + + branch = 0; +} + +static void delayWrite(int reg, u32 bpc) { + +/* SysPrintf("delayWrite at %x!\n", psxRegs.pc); + + SysPrintf("%s\n", disR3000AF(psxRegs.code, psxRegs.pc-4)); + SysPrintf("%s\n", disR3000AF(PSXMu32(bpc), bpc));*/ + + // no changes from normal behavior + + psxBSC[psxRegs.code >> 26](); + + branch = 0; + psxRegs.pc = bpc; + + psxBranchTest(); +} + +static void delayReadWrite(int reg, u32 bpc) { + +// SysPrintf("delayReadWrite at %x!\n", psxRegs.pc); + + // the branch delay load is skipped + + branch = 0; + psxRegs.pc = bpc; + + psxBranchTest(); +} + +// this defines shall be used with the tmp +// of the next func (instead of _Funct_...) +#define _tFunct_ ((tmp ) & 0x3F) // The funct part of the instruction register +#define _tRd_ ((tmp >> 11) & 0x1F) // The rd part of the instruction register +#define _tRt_ ((tmp >> 16) & 0x1F) // The rt part of the instruction register +#define _tRs_ ((tmp >> 21) & 0x1F) // The rs part of the instruction register +#define _tSa_ ((tmp >> 6) & 0x1F) // The sa part of the instruction register + +int psxTestLoadDelay(int reg, u32 tmp) { + if (tmp == 0) return 0; // NOP + switch (tmp >> 26) { + case 0x00: // SPECIAL + switch (_tFunct_) { + case 0x00: // SLL + case 0x02: case 0x03: // SRL/SRA + if (_tRd_ == reg && _tRt_ == reg) return 1; else + if (_tRt_ == reg) return 2; else + if (_tRd_ == reg) return 3; + break; + + case 0x08: // JR + if (_tRs_ == reg) return 2; + break; + case 0x09: // JALR + if (_tRd_ == reg && _tRs_ == reg) return 1; else + if (_tRs_ == reg) return 2; else + if (_tRd_ == reg) return 3; + break; + + // SYSCALL/BREAK just a break; + + case 0x20: case 0x21: case 0x22: case 0x23: + case 0x24: case 0x25: case 0x26: case 0x27: + case 0x2a: case 0x2b: // ADD/ADDU... + case 0x04: case 0x06: case 0x07: // SLLV... + if (_tRd_ == reg && (_tRt_ == reg || _tRs_ == reg)) return 1; else + if (_tRt_ == reg || _tRs_ == reg) return 2; else + if (_tRd_ == reg) return 3; + break; + + case 0x10: case 0x12: // MFHI/MFLO + if (_tRd_ == reg) return 3; + break; + case 0x11: case 0x13: // MTHI/MTLO + if (_tRs_ == reg) return 2; + break; + + case 0x18: case 0x19: + case 0x1a: case 0x1b: // MULT/DIV... + if (_tRt_ == reg || _tRs_ == reg) return 2; + break; + } + break; + + case 0x01: // REGIMM + switch (_tRt_) { + case 0x00: case 0x02: + case 0x10: case 0x12: // BLTZ/BGEZ... + if (_tRs_ == reg) return 2; + break; + } + break; + + // J would be just a break; + case 0x03: // JAL + if (31 == reg) return 3; + break; + + case 0x04: case 0x05: // BEQ/BNE + if (_tRs_ == reg || _tRt_ == reg) return 2; + break; + + case 0x06: case 0x07: // BLEZ/BGTZ + if (_tRs_ == reg) return 2; + break; + + case 0x08: case 0x09: case 0x0a: case 0x0b: + case 0x0c: case 0x0d: case 0x0e: // ADDI/ADDIU... + if (_tRt_ == reg && _tRs_ == reg) return 1; else + if (_tRs_ == reg) return 2; else + if (_tRt_ == reg) return 3; + break; + + case 0x0f: // LUI + if (_tRt_ == reg) return 3; + break; + + case 0x10: // COP0 + switch (_tFunct_) { + case 0x00: // MFC0 + if (_tRt_ == reg) return 3; + break; + case 0x02: // CFC0 + if (_tRt_ == reg) return 3; + break; + case 0x04: // MTC0 + if (_tRt_ == reg) return 2; + break; + case 0x06: // CTC0 + if (_tRt_ == reg) return 2; + break; + // RFE just a break; + } + break; + + case 0x12: // COP2 + switch (_tFunct_) { + case 0x00: + switch (_tRs_) { + case 0x00: // MFC2 + if (_tRt_ == reg) return 3; + break; + case 0x02: // CFC2 + if (_tRt_ == reg) return 3; + break; + case 0x04: // MTC2 + if (_tRt_ == reg) return 2; + break; + case 0x06: // CTC2 + if (_tRt_ == reg) return 2; + break; + } + break; + // RTPS... break; + } + break; + + case 0x22: case 0x26: // LWL/LWR + if (_tRt_ == reg) return 3; else + if (_tRs_ == reg) return 2; + break; + + case 0x20: case 0x21: case 0x23: + case 0x24: case 0x25: // LB/LH/LW/LBU/LHU + if (_tRt_ == reg && _tRs_ == reg) return 1; else + if (_tRs_ == reg) return 2; else + if (_tRt_ == reg) return 3; + break; + + case 0x28: case 0x29: case 0x2a: + case 0x2b: case 0x2e: // SB/SH/SWL/SW/SWR + if (_tRt_ == reg || _tRs_ == reg) return 2; + break; + + case 0x32: case 0x3a: // LWC2/SWC2 + if (_tRs_ == reg) return 2; + break; + } + + return 0; +} + +void psxDelayTest(int reg, u32 bpc) { + u32 *code; + u32 tmp; + + code = (u32 *)PSXM(bpc); + tmp = ((code == NULL) ? 0 : SWAP32(*code)); + branch = 1; + + switch (psxTestLoadDelay(reg, tmp)) { + case 1: + delayReadWrite(reg, bpc); return; + case 2: + delayRead(reg, bpc); return; + case 3: + delayWrite(reg, bpc); return; + } + psxBSC[psxRegs.code >> 26](); + + branch = 0; + psxRegs.pc = bpc; + + psxBranchTest(); +} + +__inline void doBranch(u32 tar) { + u32 *code; + u32 tmp; + + branch2 = branch = 1; + branchPC = tar; + + code = (u32 *)PSXM(psxRegs.pc); + psxRegs.code = ((code == NULL) ? 0 : SWAP32(*code)); + + debugI(); + + psxRegs.pc += 4; + psxRegs.cycle += BIAS; + + // check for load delay + tmp = psxRegs.code >> 26; + switch (tmp) { + case 0x10: // COP0 + switch (_Rs_) { + case 0x00: // MFC0 + case 0x02: // CFC0 + psxDelayTest(_Rt_, branchPC); + return; + } + break; + case 0x12: // COP2 + switch (_Funct_) { + case 0x00: + switch (_Rs_) { + case 0x00: // MFC2 + case 0x02: // CFC2 + psxDelayTest(_Rt_, branchPC); + return; + } + break; + } + break; + case 0x32: // LWC2 + psxDelayTest(_Rt_, branchPC); + return; + default: + if (tmp >= 0x20 && tmp <= 0x26) { // LB/LH/LWL/LW/LBU/LHU/LWR + psxDelayTest(_Rt_, branchPC); + return; + } + break; + } + + psxBSC[psxRegs.code >> 26](); + + branch = 0; + psxRegs.pc = branchPC; + + psxBranchTest(); +} + +/********************************************************* +* Arithmetic with immediate operand * +* Format: OP rt, rs, immediate * +*********************************************************/ +void psxADDI() { if (!_Rt_) return; _rRt_ = _u32(_rRs_) + _Imm_ ; } // Rt = Rs + Im (Exception on Integer Overflow) +void psxADDIU() { if (!_Rt_) return; _rRt_ = _u32(_rRs_) + _Imm_ ; } // Rt = Rs + Im +void psxANDI() { if (!_Rt_) return; _rRt_ = _u32(_rRs_) & _ImmU_; } // Rt = Rs And Im +void psxORI() { if (!_Rt_) return; _rRt_ = _u32(_rRs_) | _ImmU_; } // Rt = Rs Or Im +void psxXORI() { if (!_Rt_) return; _rRt_ = _u32(_rRs_) ^ _ImmU_; } // Rt = Rs Xor Im +void psxSLTI() { if (!_Rt_) return; _rRt_ = _i32(_rRs_) < _Imm_ ; } // Rt = Rs < Im (Signed) +void psxSLTIU() { if (!_Rt_) return; _rRt_ = _u32(_rRs_) < ((u32)_Imm_); } // Rt = Rs < Im (Unsigned) + +/********************************************************* +* Register arithmetic * +* Format: OP rd, rs, rt * +*********************************************************/ +void psxADD() { if (!_Rd_) return; _rRd_ = _u32(_rRs_) + _u32(_rRt_); } // Rd = Rs + Rt (Exception on Integer Overflow) +void psxADDU() { if (!_Rd_) return; _rRd_ = _u32(_rRs_) + _u32(_rRt_); } // Rd = Rs + Rt +void psxSUB() { if (!_Rd_) return; _rRd_ = _u32(_rRs_) - _u32(_rRt_); } // Rd = Rs - Rt (Exception on Integer Overflow) +void psxSUBU() { if (!_Rd_) return; _rRd_ = _u32(_rRs_) - _u32(_rRt_); } // Rd = Rs - Rt +void psxAND() { if (!_Rd_) return; _rRd_ = _u32(_rRs_) & _u32(_rRt_); } // Rd = Rs And Rt +void psxOR() { if (!_Rd_) return; _rRd_ = _u32(_rRs_) | _u32(_rRt_); } // Rd = Rs Or Rt +void psxXOR() { if (!_Rd_) return; _rRd_ = _u32(_rRs_) ^ _u32(_rRt_); } // Rd = Rs Xor Rt +void psxNOR() { if (!_Rd_) return; _rRd_ =~(_u32(_rRs_) | _u32(_rRt_)); }// Rd = Rs Nor Rt +void psxSLT() { if (!_Rd_) return; _rRd_ = _i32(_rRs_) < _i32(_rRt_); } // Rd = Rs < Rt (Signed) +void psxSLTU() { if (!_Rd_) return; _rRd_ = _u32(_rRs_) < _u32(_rRt_); } // Rd = Rs < Rt (Unsigned) + +/********************************************************* +* Register mult/div & Register trap logic * +* Format: OP rs, rt * +*********************************************************/ +void psxDIV() { + if (_i32(_rRt_) != 0) { + _i32(_rLo_) = _i32(_rRs_) / _i32(_rRt_); + _i32(_rHi_) = _i32(_rRs_) % _i32(_rRt_); + } +} + +void psxDIVU() { + if (_rRt_ != 0) { + _rLo_ = _rRs_ / _rRt_; + _rHi_ = _rRs_ % _rRt_; + } +} + +void psxMULT() { + u64 res = (s64)((s64)_i32(_rRs_) * (s64)_i32(_rRt_)); + + psxRegs.GPR.n.lo = (u32)(res & 0xffffffff); + psxRegs.GPR.n.hi = (u32)((res >> 32) & 0xffffffff); +} + +void psxMULTU() { + u64 res = (u64)((u64)_u32(_rRs_) * (u64)_u32(_rRt_)); + + psxRegs.GPR.n.lo = (u32)(res & 0xffffffff); + psxRegs.GPR.n.hi = (u32)((res >> 32) & 0xffffffff); +} + +/********************************************************* +* Register branch logic * +* Format: OP rs, offset * +*********************************************************/ +#define RepZBranchi32(op) if(_i32(_rRs_) op 0) doBranch(_BranchTarget_); +#define RepZBranchLinki32(op) if(_i32(_rRs_) op 0) { _SetLink(31); doBranch(_BranchTarget_); } + +void psxBGEZ() { RepZBranchi32(>=) } // Branch if Rs >= 0 +void psxBGEZAL() { RepZBranchLinki32(>=) } // Branch if Rs >= 0 and link +void psxBGTZ() { RepZBranchi32(>) } // Branch if Rs > 0 +void psxBLEZ() { RepZBranchi32(<=) } // Branch if Rs <= 0 +void psxBLTZ() { RepZBranchi32(<) } // Branch if Rs < 0 +void psxBLTZAL() { RepZBranchLinki32(<) } // Branch if Rs < 0 and link + +/********************************************************* +* Shift arithmetic with constant shift * +* Format: OP rd, rt, sa * +*********************************************************/ +void psxSLL() { if (!_Rd_) return; _u32(_rRd_) = _u32(_rRt_) << _Sa_; } // Rd = Rt << sa +void psxSRA() { if (!_Rd_) return; _i32(_rRd_) = _i32(_rRt_) >> _Sa_; } // Rd = Rt >> sa (arithmetic) +void psxSRL() { if (!_Rd_) return; _u32(_rRd_) = _u32(_rRt_) >> _Sa_; } // Rd = Rt >> sa (logical) + +/********************************************************* +* Shift arithmetic with variant register shift * +* Format: OP rd, rt, rs * +*********************************************************/ +void psxSLLV() { if (!_Rd_) return; _u32(_rRd_) = _u32(_rRt_) << _u32(_rRs_); } // Rd = Rt << rs +void psxSRAV() { if (!_Rd_) return; _i32(_rRd_) = _i32(_rRt_) >> _u32(_rRs_); } // Rd = Rt >> rs (arithmetic) +void psxSRLV() { if (!_Rd_) return; _u32(_rRd_) = _u32(_rRt_) >> _u32(_rRs_); } // Rd = Rt >> rs (logical) + +/********************************************************* +* Load higher 16 bits of the first word in GPR with imm * +* Format: OP rt, immediate * +*********************************************************/ +void psxLUI() { if (!_Rt_) return; _u32(_rRt_) = psxRegs.code << 16; } // Upper halfword of Rt = Im + +/********************************************************* +* Move from HI/LO to GPR * +* Format: OP rd * +*********************************************************/ +void psxMFHI() { if (!_Rd_) return; _rRd_ = _rHi_; } // Rd = Hi +void psxMFLO() { if (!_Rd_) return; _rRd_ = _rLo_; } // Rd = Lo + +/********************************************************* +* Move to GPR to HI/LO & Register jump * +* Format: OP rs * +*********************************************************/ +void psxMTHI() { _rHi_ = _rRs_; } // Hi = Rs +void psxMTLO() { _rLo_ = _rRs_; } // Lo = Rs + +/********************************************************* +* Special purpose instructions * +* Format: OP * +*********************************************************/ +void psxBREAK() { + // Break exception - psx rom doens't handles this +} + +void psxSYSCALL() { + psxRegs.pc -= 4; + psxException(0x20, branch); +} + +void psxRFE() { +// SysPrintf("psxRFE\n"); + psxRegs.CP0.n.Status = (psxRegs.CP0.n.Status & 0xfffffff0) | + ((psxRegs.CP0.n.Status & 0x3c) >> 2); +} + +/********************************************************* +* Register branch logic * +* Format: OP rs, rt, offset * +*********************************************************/ +#define RepBranchi32(op) if(_i32(_rRs_) op _i32(_rRt_)) doBranch(_BranchTarget_); + +void psxBEQ() { RepBranchi32(==) } // Branch if Rs == Rt +void psxBNE() { RepBranchi32(!=) } // Branch if Rs != Rt + +/********************************************************* +* Jump to target * +* Format: OP target * +*********************************************************/ +void psxJ() { doBranch(_JumpTarget_); } +void psxJAL() { _SetLink(31); doBranch(_JumpTarget_); } + +/********************************************************* +* Register jump * +* Format: OP rs, rd * +*********************************************************/ +void psxJR() { + doBranch(_u32(_rRs_)); + psxJumpTest(); +} + +void psxJALR() { + u32 temp = _u32(_rRs_); + if (_Rd_) { _SetLink(_Rd_); } + doBranch(temp); +} + +/********************************************************* +* Load and store for GPR * +* Format: OP rt, offset(base) * +*********************************************************/ + +#define _oB_ (_u32(_rRs_) + _Imm_) + +void psxLB() { + if (_Rt_) { + _i32(_rRt_) = (signed char)psxMemRead8(_oB_); + } else { + psxMemRead8(_oB_); + } +} + +void psxLBU() { + if (_Rt_) { + _u32(_rRt_) = psxMemRead8(_oB_); + } else { + psxMemRead8(_oB_); + } +} + +void psxLH() { + if (_Rt_) { + _i32(_rRt_) = (short)psxMemRead16(_oB_); + } else { + psxMemRead16(_oB_); + } +} + +void psxLHU() { + if (_Rt_) { + _u32(_rRt_) = psxMemRead16(_oB_); + } else { + psxMemRead16(_oB_); + } +} + +void psxLW() { + if (_Rt_) { + _u32(_rRt_) = psxMemRead32(_oB_); + } else { + psxMemRead32(_oB_); + } +} + +u32 LWL_MASK[4] = { 0xffffff, 0xffff, 0xff, 0 }; +u32 LWL_SHIFT[4] = { 24, 16, 8, 0 }; + +void psxLWL() { + u32 addr = _oB_; + u32 shift = addr & 3; + u32 mem = psxMemRead32(addr & ~3); + + if (!_Rt_) return; + _u32(_rRt_) = ( _u32(_rRt_) & LWL_MASK[shift]) | + ( mem << LWL_SHIFT[shift]); + + /* + Mem = 1234. Reg = abcd + + 0 4bcd (mem << 24) | (reg & 0x00ffffff) + 1 34cd (mem << 16) | (reg & 0x0000ffff) + 2 234d (mem << 8) | (reg & 0x000000ff) + 3 1234 (mem ) | (reg & 0x00000000) + */ +} + +u32 LWR_MASK[4] = { 0, 0xff000000, 0xffff0000, 0xffffff00 }; +u32 LWR_SHIFT[4] = { 0, 8, 16, 24 }; + +void psxLWR() { + u32 addr = _oB_; + u32 shift = addr & 3; + u32 mem = psxMemRead32(addr & ~3); + + if (!_Rt_) return; + _u32(_rRt_) = ( _u32(_rRt_) & LWR_MASK[shift]) | + ( mem >> LWR_SHIFT[shift]); + + /* + Mem = 1234. Reg = abcd + + 0 1234 (mem ) | (reg & 0x00000000) + 1 a123 (mem >> 8) | (reg & 0xff000000) + 2 ab12 (mem >> 16) | (reg & 0xffff0000) + 3 abc1 (mem >> 24) | (reg & 0xffffff00) + */ +} + +void psxSB() { psxMemWrite8 (_oB_, _u8 (_rRt_)); } +void psxSH() { psxMemWrite16(_oB_, _u16(_rRt_)); } +void psxSW() { psxMemWrite32(_oB_, _u32(_rRt_)); } + +u32 SWL_MASK[4] = { 0xffffff00, 0xffff0000, 0xff000000, 0 }; +u32 SWL_SHIFT[4] = { 24, 16, 8, 0 }; + +void psxSWL() { + u32 addr = _oB_; + u32 shift = addr & 3; + u32 mem = psxMemRead32(addr & ~3); + + psxMemWrite32(addr & ~3, (_u32(_rRt_) >> SWL_SHIFT[shift]) | + ( mem & SWL_MASK[shift]) ); + /* + Mem = 1234. Reg = abcd + + 0 123a (reg >> 24) | (mem & 0xffffff00) + 1 12ab (reg >> 16) | (mem & 0xffff0000) + 2 1abc (reg >> 8) | (mem & 0xff000000) + 3 abcd (reg ) | (mem & 0x00000000) + */ +} + +u32 SWR_MASK[4] = { 0, 0xff, 0xffff, 0xffffff }; +u32 SWR_SHIFT[4] = { 0, 8, 16, 24 }; + +void psxSWR() { + u32 addr = _oB_; + u32 shift = addr & 3; + u32 mem = psxMemRead32(addr & ~3); + + psxMemWrite32(addr & ~3, (_u32(_rRt_) << SWR_SHIFT[shift]) | + ( mem & SWR_MASK[shift]) ); + + /* + Mem = 1234. Reg = abcd + + 0 abcd (reg ) | (mem & 0x00000000) + 1 bcd4 (reg << 8) | (mem & 0x000000ff) + 2 cd34 (reg << 16) | (mem & 0x0000ffff) + 3 d234 (reg << 24) | (mem & 0x00ffffff) + */ +} + +/********************************************************* +* Moves between GPR and COPx * +* Format: OP rt, fs * +*********************************************************/ +void psxMFC0() { if (!_Rt_) return; _i32(_rRt_) = (int)_rFs_; } +void psxCFC0() { if (!_Rt_) return; _i32(_rRt_) = (int)_rFs_; } + +void psxTestSWInts() { + // the next code is untested, if u know please + // tell me if it works ok or not (linuzappz) + if (psxRegs.CP0.n.Cause & psxRegs.CP0.n.Status & 0x0300 && + psxRegs.CP0.n.Status & 0x1) { + psxException(psxRegs.CP0.n.Cause, branch); + } +} + +__inline void MTC0(int reg, u32 val) { +// SysPrintf("MTC0 %d: %x\n", reg, val); + switch (reg) { + case 12: // Status + psxRegs.CP0.r[12] = val; + psxTestSWInts(); + break; + + case 13: // Cause + psxRegs.CP0.n.Cause = val & ~(0xfc00); + psxTestSWInts(); + break; + + default: + psxRegs.CP0.r[reg] = val; + break; + } +} + +void psxMTC0() { MTC0(_Rd_, _u32(_rRt_)); } +void psxCTC0() { MTC0(_Rd_, _u32(_rRt_)); } + +/********************************************************* +* Unknow instruction (would generate an exception) * +* Format: ? * +*********************************************************/ +void psxNULL() { +#ifdef PSXCPU_LOG + PSXCPU_LOG("psx: Unimplemented op %x\n", psxRegs.code); +#endif +} + +void psxSPECIAL() { + psxSPC[_Funct_](); +} + +void psxREGIMM() { + psxREG[_Rt_](); +} + +void psxCOP0() { + psxCP0[_Rs_](); +} + +void psxCOP2() { + psxCP2[_Funct_](); +} + +void psxBASIC() { + psxCP2BSC[_Rs_](); +} + +void psxHLE() { +// psxHLEt[psxRegs.code & 0xffff](); + psxHLEt[psxRegs.code & 0x07](); // HDHOSHY experimental patch +} + +void (*psxBSC[64])() = { + psxSPECIAL, psxREGIMM, psxJ , psxJAL , psxBEQ , psxBNE , psxBLEZ, psxBGTZ, + psxADDI , psxADDIU , psxSLTI, psxSLTIU, psxANDI, psxORI , psxXORI, psxLUI , + psxCOP0 , psxNULL , psxCOP2, psxNULL , psxNULL, psxNULL, psxNULL, psxNULL, + psxNULL , psxNULL , psxNULL, psxNULL , psxNULL, psxNULL, psxNULL, psxNULL, + psxLB , psxLH , psxLWL , psxLW , psxLBU , psxLHU , psxLWR , psxNULL, + psxSB , psxSH , psxSWL , psxSW , psxNULL, psxNULL, psxSWR , psxNULL, + psxNULL , psxNULL , gteLWC2, psxNULL , psxNULL, psxNULL, psxNULL, psxNULL, + psxNULL , psxNULL , gteSWC2, psxHLE , psxNULL, psxNULL, psxNULL, psxNULL +}; + + +void (*psxSPC[64])() = { + psxSLL , psxNULL , psxSRL , psxSRA , psxSLLV , psxNULL , psxSRLV, psxSRAV, + psxJR , psxJALR , psxNULL, psxNULL, psxSYSCALL, psxBREAK, psxNULL, psxNULL, + psxMFHI, psxMTHI , psxMFLO, psxMTLO, psxNULL , psxNULL , psxNULL, psxNULL, + psxMULT, psxMULTU, psxDIV , psxDIVU, psxNULL , psxNULL , psxNULL, psxNULL, + psxADD , psxADDU , psxSUB , psxSUBU, psxAND , psxOR , psxXOR , psxNOR , + psxNULL, psxNULL , psxSLT , psxSLTU, psxNULL , psxNULL , psxNULL, psxNULL, + psxNULL, psxNULL , psxNULL, psxNULL, psxNULL , psxNULL , psxNULL, psxNULL, + psxNULL, psxNULL , psxNULL, psxNULL, psxNULL , psxNULL , psxNULL, psxNULL +}; + +void (*psxREG[32])() = { + psxBLTZ , psxBGEZ , psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, + psxNULL , psxNULL , psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, + psxBLTZAL, psxBGEZAL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, + psxNULL , psxNULL , psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL +}; + +void (*psxCP0[32])() = { + psxMFC0, psxNULL, psxCFC0, psxNULL, psxMTC0, psxNULL, psxCTC0, psxNULL, + psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, + psxRFE , psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, + psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL +}; + +void (*psxCP2[64])() = { + psxBASIC, gteRTPS , psxNULL , psxNULL, psxNULL, psxNULL , gteNCLIP, psxNULL, // 00 + psxNULL , psxNULL , psxNULL , psxNULL, gteOP , psxNULL , psxNULL , psxNULL, // 08 + gteDPCS , gteINTPL, gteMVMVA, gteNCDS, gteCDP , psxNULL , gteNCDT , psxNULL, // 10 + psxNULL , psxNULL , psxNULL , gteNCCS, gteCC , psxNULL , gteNCS , psxNULL, // 18 + gteNCT , psxNULL , psxNULL , psxNULL, psxNULL, psxNULL , psxNULL , psxNULL, // 20 + gteSQR , gteDCPL , gteDPCT , psxNULL, psxNULL, gteAVSZ3, gteAVSZ4, psxNULL, // 28 + gteRTPT , psxNULL , psxNULL , psxNULL, psxNULL, psxNULL , psxNULL , psxNULL, // 30 + psxNULL , psxNULL , psxNULL , psxNULL, psxNULL, gteGPF , gteGPL , gteNCCT // 38 +}; + +void (*psxCP2BSC[32])() = { + gteMFC2, psxNULL, gteCFC2, psxNULL, gteMTC2, psxNULL, gteCTC2, psxNULL, + psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, + psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, + psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL +}; + + +/////////////////////////////////////////// + +static int intInit() { + return 0; +} + +static void intReset() { +} + +static void intExecute() { + for (;;) + execI(); +} + +static void intExecuteBlock() { + branch2 = 0; + while (!branch2) execI(); +} + +static void intClear(u32 Addr, u32 Size) { +} + +static void intShutdown() { +} + +// interpreter execution +inline void execI() { + u32 *code = (u32 *)PSXM(psxRegs.pc); + psxRegs.code = ((code == NULL) ? 0 : SWAP32(*code)); + + debugI(); + + if (Config.Debug) ProcessDebug(); + + psxRegs.pc += 4; + psxRegs.cycle += BIAS; + + psxBSC[psxRegs.code >> 26](); +} + +R3000Acpu psxInt = { + intInit, + intReset, + intExecute, + intExecuteBlock, + intClear, + intShutdown +}; diff --git a/libpcsxcore/psxmem.c b/libpcsxcore/psxmem.c new file mode 100644 index 0000000..fc4a90e --- /dev/null +++ b/libpcsxcore/psxmem.c @@ -0,0 +1,348 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* PSX memory functions. +*/ + +// TODO: Implement caches & cycle penalty. + +#include "psxmem.h" +#include "r3000a.h" +#include "psxhw.h" +#include + +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON +#endif + +s8 *psxM = NULL; // Kernel & User Memory (2 Meg) +s8 *psxP = NULL; // Parallel Port (64K) +s8 *psxR = NULL; // BIOS ROM (512K) +s8 *psxH = NULL; // Scratch Pad (1K) & Hardware Registers (8K) + +u8 **psxMemWLUT = NULL; +u8 **psxMemRLUT = NULL; + +/* Playstation Memory Map (from Playstation doc by Joshua Walker) +0x0000_0000-0x0000_ffff Kernel (64K) +0x0001_0000-0x001f_ffff User Memory (1.9 Meg) + +0x1f00_0000-0x1f00_ffff Parallel Port (64K) + +0x1f80_0000-0x1f80_03ff Scratch Pad (1024 bytes) + +0x1f80_1000-0x1f80_2fff Hardware Registers (8K) + +0x1fc0_0000-0x1fc7_ffff BIOS (512K) + +0x8000_0000-0x801f_ffff Kernel and User Memory Mirror (2 Meg) Cached +0x9fc0_0000-0x9fc7_ffff BIOS Mirror (512K) Cached + +0xa000_0000-0xa01f_ffff Kernel and User Memory Mirror (2 Meg) Uncached +0xbfc0_0000-0xbfc7_ffff BIOS Mirror (512K) Uncached +*/ + +int psxMemInit() { + int i; + + psxMemRLUT = (u8 **)malloc(0x10000 * sizeof(void *)); + psxMemWLUT = (u8 **)malloc(0x10000 * sizeof(void *)); + memset(psxMemRLUT, 0, 0x10000 * sizeof(void *)); + memset(psxMemWLUT, 0, 0x10000 * sizeof(void *)); + + psxM = mmap(0, 0x00220000, + PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + psxP = &psxM[0x200000]; + psxH = &psxM[0x210000]; + + psxR = (s8 *)malloc(0x00080000); + + if (psxMemRLUT == NULL || psxMemWLUT == NULL || + psxM == NULL || psxP == NULL || psxH == NULL) { + SysMessage(_("Error allocating memory!")); + return -1; + } + +// MemR + for (i = 0; i < 0x80; i++) psxMemRLUT[i + 0x0000] = (u8 *)&psxM[(i & 0x1f) << 16]; + + memcpy(psxMemRLUT + 0x8000, psxMemRLUT, 0x80 * sizeof(void *)); + memcpy(psxMemRLUT + 0xa000, psxMemRLUT, 0x80 * sizeof(void *)); + + psxMemRLUT[0x1f00] = (u8 *)psxP; + psxMemRLUT[0x1f80] = (u8 *)psxH; + + for (i = 0; i < 0x08; i++) psxMemRLUT[i + 0x1fc0] = (u8 *)&psxR[i << 16]; + + memcpy(psxMemRLUT + 0x9fc0, psxMemRLUT + 0x1fc0, 0x08 * sizeof(void *)); + memcpy(psxMemRLUT + 0xbfc0, psxMemRLUT + 0x1fc0, 0x08 * sizeof(void *)); + +// MemW + for (i = 0; i < 0x80; i++) psxMemWLUT[i + 0x0000] = (u8 *)&psxM[(i & 0x1f) << 16]; + + memcpy(psxMemWLUT + 0x8000, psxMemWLUT, 0x80 * sizeof(void *)); + memcpy(psxMemWLUT + 0xa000, psxMemWLUT, 0x80 * sizeof(void *)); + + psxMemWLUT[0x1f00] = (u8 *)psxP; + psxMemWLUT[0x1f80] = (u8 *)psxH; + + return 0; +} + +void psxMemReset() { + FILE *f = NULL; + char bios[1024]; + + memset(psxM, 0, 0x00200000); + memset(psxP, 0, 0x00010000); + + if (strcmp(Config.Bios, "HLE") != 0) { + sprintf(bios, "%s/%s", Config.BiosDir, Config.Bios); + f = fopen(bios, "rb"); + + if (f == NULL) { + SysMessage(_("Could not open BIOS:\"%s\". Enabling HLE Bios!\n"), bios); + memset(psxR, 0, 0x80000); + Config.HLE = TRUE; + } else { + fread(psxR, 1, 0x80000, f); + fclose(f); + Config.HLE = FALSE; + } + } else Config.HLE = TRUE; +} + +void psxMemShutdown() { + munmap(psxM, 0x00220000); + + free(psxR); + free(psxMemRLUT); + free(psxMemWLUT); +} + +static int writeok = 1; + +u8 psxMemRead8(u32 mem) { + char *p; + u32 t; + + t = mem >> 16; + if (t == 0x1f80) { + if (mem < 0x1f801000) + return psxHu8(mem); + else + return psxHwRead8(mem); + } else { + p = (char *)(psxMemRLUT[t]); + if (p != NULL) { + if (Config.Debug) + DebugCheckBP((mem & 0xffffff) | 0x80000000, R1); + return *(u8 *)(p + (mem & 0xffff)); + } else { +#ifdef PSXMEM_LOG + PSXMEM_LOG("err lb %8.8lx\n", mem); +#endif + return 0; + } + } +} + +u16 psxMemRead16(u32 mem) { + char *p; + u32 t; + + t = mem >> 16; + if (t == 0x1f80) { + if (mem < 0x1f801000) + return psxHu16(mem); + else + return psxHwRead16(mem); + } else { + p = (char *)(psxMemRLUT[t]); + if (p != NULL) { + if (Config.Debug) + DebugCheckBP((mem & 0xffffff) | 0x80000000, R2); + return SWAPu16(*(u16 *)(p + (mem & 0xffff))); + } else { +#ifdef PSXMEM_LOG + PSXMEM_LOG("err lh %8.8lx\n", mem); +#endif + return 0; + } + } +} + +u32 psxMemRead32(u32 mem) { + char *p; + u32 t; + + t = mem >> 16; + if (t == 0x1f80) { + if (mem < 0x1f801000) + return psxHu32(mem); + else + return psxHwRead32(mem); + } else { + p = (char *)(psxMemRLUT[t]); + if (p != NULL) { + if (Config.Debug) + DebugCheckBP((mem & 0xffffff) | 0x80000000, R4); + return SWAPu32(*(u32 *)(p + (mem & 0xffff))); + } else { +#ifdef PSXMEM_LOG + if (writeok) { PSXMEM_LOG("err lw %8.8lx\n", mem); } +#endif + return 0; + } + } +} + +void psxMemWrite8(u32 mem, u8 value) { + char *p; + u32 t; + + t = mem >> 16; + if (t == 0x1f80) { + if (mem < 0x1f801000) + psxHu8(mem) = value; + else + psxHwWrite8(mem, value); + } else { + p = (char *)(psxMemWLUT[t]); + if (p != NULL) { + if (Config.Debug) + DebugCheckBP((mem & 0xffffff) | 0x80000000, W1); + *(u8 *)(p + (mem & 0xffff)) = value; +#ifdef PSXREC + psxCpu->Clear((mem & (~3)), 1); +#endif + } else { +#ifdef PSXMEM_LOG + PSXMEM_LOG("err sb %8.8lx\n", mem); +#endif + } + } +} + +void psxMemWrite16(u32 mem, u16 value) { + char *p; + u32 t; + + t = mem >> 16; + if (t == 0x1f80) { + if (mem < 0x1f801000) + psxHu16ref(mem) = SWAPu16(value); + else + psxHwWrite16(mem, value); + } else { + p = (char *)(psxMemWLUT[t]); + if (p != NULL) { + if (Config.Debug) + DebugCheckBP((mem & 0xffffff) | 0x80000000, W2); + *(u16 *)(p + (mem & 0xffff)) = SWAPu16(value); +#ifdef PSXREC + psxCpu->Clear((mem & (~1)), 1); +#endif + } else { +#ifdef PSXMEM_LOG + PSXMEM_LOG("err sh %8.8lx\n", mem); +#endif + } + } +} + +void psxMemWrite32(u32 mem, u32 value) { + char *p; + u32 t; + +// if ((mem&0x1fffff) == 0x71E18 || value == 0x48088800) SysPrintf("t2fix!!\n"); + t = mem >> 16; + if (t == 0x1f80) { + if (mem < 0x1f801000) + psxHu32ref(mem) = SWAPu32(value); + else + psxHwWrite32(mem, value); + } else { + p = (char *)(psxMemWLUT[t]); + if (p != NULL) { + if (Config.Debug) + DebugCheckBP((mem & 0xffffff) | 0x80000000, W4); + *(u32 *)(p + (mem & 0xffff)) = SWAPu32(value); +#ifdef PSXREC + psxCpu->Clear(mem, 1); +#endif + } else { + if (mem != 0xfffe0130) { +#ifdef PSXREC + if (!writeok) + psxCpu->Clear(mem, 1); +#endif + +#ifdef PSXMEM_LOG + if (writeok) { PSXMEM_LOG("err sw %8.8lx\n", mem); } +#endif + } else { + int i; + + switch (value) { + case 0x800: case 0x804: + if (writeok == 0) break; + writeok = 0; + memset(psxMemWLUT + 0x0000, 0, 0x80 * sizeof(void *)); + memset(psxMemWLUT + 0x8000, 0, 0x80 * sizeof(void *)); + memset(psxMemWLUT + 0xa000, 0, 0x80 * sizeof(void *)); + break; + case 0x00: case 0x1e988: + if (writeok == 1) break; + writeok = 1; + for (i = 0; i < 0x80; i++) psxMemWLUT[i + 0x0000] = (void *)&psxM[(i & 0x1f) << 16]; + memcpy(psxMemWLUT + 0x8000, psxMemWLUT, 0x80 * sizeof(void *)); + memcpy(psxMemWLUT + 0xa000, psxMemWLUT, 0x80 * sizeof(void *)); + break; + default: +#ifdef PSXMEM_LOG + PSXMEM_LOG("unk %8.8lx = %x\n", mem, value); +#endif + break; + } + } + } + } +} + +void *psxMemPointer(u32 mem) { + char *p; + u32 t; + + t = mem >> 16; + if (t == 0x1f80) { + if (mem < 0x1f801000) + return (void *)&psxH[mem]; + else + return NULL; + } else { + p = (char *)(psxMemWLUT[t]); + if (p != NULL) { + return (void *)(p + (mem & 0xffff)); + } + return NULL; + } +} diff --git a/libpcsxcore/psxmem.h b/libpcsxcore/psxmem.h new file mode 100644 index 0000000..d9fee00 --- /dev/null +++ b/libpcsxcore/psxmem.h @@ -0,0 +1,144 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __PSXMEMORY_H__ +#define __PSXMEMORY_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" + +#if defined(__BIGENDIAN__) + +#define _SWAP16(b) ((((unsigned char *)&(b))[0] & 0xff) | (((unsigned char *)&(b))[1] & 0xff) << 8) +#define _SWAP32(b) ((((unsigned char *)&(b))[0] & 0xff) | ((((unsigned char *)&(b))[1] & 0xff) << 8) | ((((unsigned char *)&(b))[2] & 0xff) << 16) | (((unsigned char *)&(b))[3] << 24)) + +#define SWAP16(v) ((((v) & 0xff00) >> 8) +(((v) & 0xff) << 8)) +#define SWAP32(v) ((((v) & 0xff000000ul) >> 24) + (((v) & 0xff0000ul) >> 8) + (((v) & 0xff00ul)<<8) +(((v) & 0xfful) << 24)) +#define SWAPu32(v) SWAP32((u32)(v)) +#define SWAPs32(v) SWAP32((s32)(v)) + +#define SWAPu16(v) SWAP16((u16)(v)) +#define SWAPs16(v) SWAP16((s16)(v)) + +#else + +#define SWAP16(b) (b) +#define SWAP32(b) (b) + +#define SWAPu16(b) (b) +#define SWAPu32(b) (b) + +#endif + +extern s8 *psxM; +#define psxMs8(mem) psxM[(mem) & 0x1fffff] +#define psxMs16(mem) (SWAP16(*(s16 *)&psxM[(mem) & 0x1fffff])) +#define psxMs32(mem) (SWAP32(*(s32 *)&psxM[(mem) & 0x1fffff])) +#define psxMu8(mem) (*(u8 *)&psxM[(mem) & 0x1fffff]) +#define psxMu16(mem) (SWAP16(*(u16 *)&psxM[(mem) & 0x1fffff])) +#define psxMu32(mem) (SWAP32(*(u32 *)&psxM[(mem) & 0x1fffff])) + +#define psxMs8ref(mem) psxM[(mem) & 0x1fffff] +#define psxMs16ref(mem) (*(s16 *)&psxM[(mem) & 0x1fffff]) +#define psxMs32ref(mem) (*(s32 *)&psxM[(mem) & 0x1fffff]) +#define psxMu8ref(mem) (*(u8 *)&psxM[(mem) & 0x1fffff]) +#define psxMu16ref(mem) (*(u16 *)&psxM[(mem) & 0x1fffff]) +#define psxMu32ref(mem) (*(u32 *)&psxM[(mem) & 0x1fffff]) + +extern s8 *psxP; +#define psxPs8(mem) psxP[(mem) & 0xffff] +#define psxPs16(mem) (SWAP16(*(s16 *)&psxP[(mem) & 0xffff])) +#define psxPs32(mem) (SWAP32(*(s32 *)&psxP[(mem) & 0xffff])) +#define psxPu8(mem) (*(u8 *)&psxP[(mem) & 0xffff]) +#define psxPu16(mem) (SWAP16(*(u16 *)&psxP[(mem) & 0xffff])) +#define psxPu32(mem) (SWAP32(*(u32 *)&psxP[(mem) & 0xffff])) + +#define psxPs8ref(mem) psxP[(mem) & 0xffff] +#define psxPs16ref(mem) (*(s16 *)&psxP[(mem) & 0xffff]) +#define psxPs32ref(mem) (*(s32 *)&psxP[(mem) & 0xffff]) +#define psxPu8ref(mem) (*(u8 *)&psxP[(mem) & 0xffff]) +#define psxPu16ref(mem) (*(u16 *)&psxP[(mem) & 0xffff]) +#define psxPu32ref(mem) (*(u32 *)&psxP[(mem) & 0xffff]) + +extern s8 *psxR; +#define psxRs8(mem) psxR[(mem) & 0x7ffff] +#define psxRs16(mem) (SWAP16(*(s16 *)&psxR[(mem) & 0x7ffff])) +#define psxRs32(mem) (SWAP32(*(s32 *)&psxR[(mem) & 0x7ffff])) +#define psxRu8(mem) (*(u8* )&psxR[(mem) & 0x7ffff]) +#define psxRu16(mem) (SWAP16(*(u16 *)&psxR[(mem) & 0x7ffff])) +#define psxRu32(mem) (SWAP32(*(u32 *)&psxR[(mem) & 0x7ffff])) + +#define psxRs8ref(mem) psxR[(mem) & 0x7ffff] +#define psxRs16ref(mem) (*(s16*)&psxR[(mem) & 0x7ffff]) +#define psxRs32ref(mem) (*(s32*)&psxR[(mem) & 0x7ffff]) +#define psxRu8ref(mem) (*(u8 *)&psxR[(mem) & 0x7ffff]) +#define psxRu16ref(mem) (*(u16*)&psxR[(mem) & 0x7ffff]) +#define psxRu32ref(mem) (*(u32*)&psxR[(mem) & 0x7ffff]) + +extern s8 *psxH; +#define psxHs8(mem) psxH[(mem) & 0xffff] +#define psxHs16(mem) (SWAP16(*(s16 *)&psxH[(mem) & 0xffff])) +#define psxHs32(mem) (SWAP32(*(s32 *)&psxH[(mem) & 0xffff])) +#define psxHu8(mem) (*(u8 *)&psxH[(mem) & 0xffff]) +#define psxHu16(mem) (SWAP16(*(u16 *)&psxH[(mem) & 0xffff])) +#define psxHu32(mem) (SWAP32(*(u32 *)&psxH[(mem) & 0xffff])) + +#define psxHs8ref(mem) psxH[(mem) & 0xffff] +#define psxHs16ref(mem) (*(s16 *)&psxH[(mem) & 0xffff]) +#define psxHs32ref(mem) (*(s32 *)&psxH[(mem) & 0xffff]) +#define psxHu8ref(mem) (*(u8 *)&psxH[(mem) & 0xffff]) +#define psxHu16ref(mem) (*(u16 *)&psxH[(mem) & 0xffff]) +#define psxHu32ref(mem) (*(u32 *)&psxH[(mem) & 0xffff]) + +extern u8 **psxMemWLUT; +extern u8 **psxMemRLUT; + +#define PSXM(mem) (psxMemRLUT[(mem) >> 16] == 0 ? NULL : (u8*)(psxMemRLUT[(mem) >> 16] + ((mem) & 0xffff))) +#define PSXMs8(mem) (*(s8 *)PSXM(mem)) +#define PSXMs16(mem) (SWAP16(*(s16 *)PSXM(mem))) +#define PSXMs32(mem) (SWAP32(*(s32 *)PSXM(mem))) +#define PSXMu8(mem) (*(u8 *)PSXM(mem)) +#define PSXMu16(mem) (SWAP16(*(u16 *)PSXM(mem))) +#define PSXMu32(mem) (SWAP32(*(u32 *)PSXM(mem))) + +#define PSXMu32ref(mem) (*(u32 *)PSXM(mem)) + +#if !defined(PSXREC) && (defined(__x86_64__) || defined(__i386__) || defined(__ppc__)) && !defined(NOPSXREC) +#define PSXREC +#endif + +int psxMemInit(); +void psxMemReset(); +void psxMemShutdown(); + +u8 psxMemRead8 (u32 mem); +u16 psxMemRead16(u32 mem); +u32 psxMemRead32(u32 mem); +void psxMemWrite8 (u32 mem, u8 value); +void psxMemWrite16(u32 mem, u16 value); +void psxMemWrite32(u32 mem, u32 value); +void *psxMemPointer(u32 mem); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/r3000a.c b/libpcsxcore/r3000a.c new file mode 100644 index 0000000..8c6289e --- /dev/null +++ b/libpcsxcore/r3000a.c @@ -0,0 +1,202 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* R3000A CPU functions. +*/ + +#include "r3000a.h" +#include "cdrom.h" +#include "mdec.h" +#include "gte.h" + +R3000Acpu *psxCpu = NULL; +psxRegisters psxRegs; + +int psxInit() { + SysPrintf(_("Running PCSX Version %s (%s).\n"), PACKAGE_VERSION, __DATE__); + +#ifdef PSXREC + if (Config.Cpu == CPU_INTERPRETER) { + psxCpu = &psxInt; + } else psxCpu = &psxRec; +#else + psxCpu = &psxInt; +#endif + + Log = 0; + + if (psxMemInit() == -1) return -1; + + return psxCpu->Init(); +} + +void psxReset() { + psxCpu->Reset(); + + psxMemReset(); + + memset(&psxRegs, 0, sizeof(psxRegs)); + + psxRegs.pc = 0xbfc00000; // Start in bootstrap + + psxRegs.CP0.r[12] = 0x10900000; // COP0 enabled | BEV = 1 | TS = 1 + psxRegs.CP0.r[15] = 0x00000002; // PRevID = Revision ID, same as R3000A + + psxHwReset(); + psxBiosInit(); + + if (!Config.HLE) + psxExecuteBios(); + +#ifdef EMU_LOG + EMU_LOG("*BIOS END*\n"); +#endif + Log = 0; +} + +void psxShutdown() { + psxMemShutdown(); + psxBiosShutdown(); + + psxCpu->Shutdown(); +} + +void psxException(u32 code, u32 bd) { + // Set the Cause + psxRegs.CP0.n.Cause = code; + + // Set the EPC & PC + if (bd) { +#ifdef PSXCPU_LOG + PSXCPU_LOG("bd set!!!\n"); +#endif + SysPrintf("bd set!!!\n"); + psxRegs.CP0.n.Cause |= 0x80000000; + psxRegs.CP0.n.EPC = (psxRegs.pc - 4); + } else + psxRegs.CP0.n.EPC = (psxRegs.pc); + + if (psxRegs.CP0.n.Status & 0x400000) + psxRegs.pc = 0xbfc00180; + else + psxRegs.pc = 0x80000080; + + // Set the Status + psxRegs.CP0.n.Status = (psxRegs.CP0.n.Status &~0x3f) | + ((psxRegs.CP0.n.Status & 0xf) << 2); + + if (!Config.HLE && (((PSXMu32(psxRegs.CP0.n.EPC) >> 24) & 0xfe) == 0x4a)) { + // "hokuto no ken" / "Crash Bandicot 2" ... fix + PSXMu32ref(psxRegs.CP0.n.EPC)&= SWAPu32(~0x02000000); + } + + if (Config.HLE) psxBiosException(); +} + +void psxBranchTest() { + if ((psxRegs.cycle - psxNextsCounter) >= psxNextCounter) + psxRcntUpdate(); + + if (psxRegs.interrupt) { + if ((psxRegs.interrupt & 0x80) && !Config.Sio) { // sio + if ((psxRegs.cycle - psxRegs.intCycle[7]) >= psxRegs.intCycle[7 + 1]) { + psxRegs.interrupt &= ~0x80; + sioInterrupt(); + } + } + if (psxRegs.interrupt & 0x04) { // cdr + if ((psxRegs.cycle - psxRegs.intCycle[2]) >= psxRegs.intCycle[2 + 1]) { + psxRegs.interrupt &= ~0x04; + cdrInterrupt(); + } + } + if (psxRegs.interrupt & 0x040000) { // cdr read + if ((psxRegs.cycle - psxRegs.intCycle[2 + 16]) >= psxRegs.intCycle[2 + 16 + 1]) { + psxRegs.interrupt &= ~0x040000; + cdrReadInterrupt(); + } + } + if (psxRegs.interrupt & 0x01000000) { // gpu dma + if ((psxRegs.cycle - psxRegs.intCycle[3 + 24]) >= psxRegs.intCycle[3 + 24 + 1]) { + psxRegs.interrupt &= ~0x01000000; + gpuInterrupt(); + } + } + if (psxRegs.interrupt & 0x02000000) { // mdec out dma + if ((psxRegs.cycle - psxRegs.intCycle[5 + 24]) >= psxRegs.intCycle[5 + 24 + 1]) { + psxRegs.interrupt &= ~0x02000000; + mdec1Interrupt(); + } + } + if (psxRegs.interrupt & 0x04000000) { // spu dma + if ((psxRegs.cycle - psxRegs.intCycle[1 + 24]) >= psxRegs.intCycle[1 + 24 + 1]) { + psxRegs.interrupt &= ~0x04000000; + spuInterrupt(); + } + } + } + + if (psxHu32(0x1070) & psxHu32(0x1074)) { + if ((psxRegs.CP0.n.Status & 0x401) == 0x401) { +#ifdef PSXCPU_LOG + PSXCPU_LOG("Interrupt: %x %x\n", psxHu32(0x1070), psxHu32(0x1074)); +#endif +// SysPrintf("Interrupt (%x): %x %x\n", psxRegs.cycle, psxHu32(0x1070), psxHu32(0x1074)); + psxException(0x400, 0); + } + } +} + +void psxJumpTest() { + if (!Config.HLE && Config.PsxOut) { + u32 call = psxRegs.GPR.n.t1 & 0xff; + switch (psxRegs.pc & 0x1fffff) { + case 0xa0: +#ifdef PSXBIOS_LOG + if (call != 0x28 && call != 0xe) { + PSXBIOS_LOG("Bios call a0: %s (%x) %x,%x,%x,%x\n", biosA0n[call], call, psxRegs.GPR.n.a0, psxRegs.GPR.n.a1, psxRegs.GPR.n.a2, psxRegs.GPR.n.a3); } +#endif + if (biosA0[call]) + biosA0[call](); + break; + case 0xb0: +#ifdef PSXBIOS_LOG + if (call != 0x17 && call != 0xb) { + PSXBIOS_LOG("Bios call b0: %s (%x) %x,%x,%x,%x\n", biosB0n[call], call, psxRegs.GPR.n.a0, psxRegs.GPR.n.a1, psxRegs.GPR.n.a2, psxRegs.GPR.n.a3); } +#endif + if (biosB0[call]) + biosB0[call](); + break; + case 0xc0: +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("Bios call c0: %s (%x) %x,%x,%x,%x\n", biosC0n[call], call, psxRegs.GPR.n.a0, psxRegs.GPR.n.a1, psxRegs.GPR.n.a2, psxRegs.GPR.n.a3); +#endif + if (biosC0[call]) + biosC0[call](); + break; + } + } +} + +void psxExecuteBios() { + while (psxRegs.pc != 0x80030000) + psxCpu->ExecuteBlock(); +} + diff --git a/libpcsxcore/r3000a.h b/libpcsxcore/r3000a.h new file mode 100644 index 0000000..51cd37c --- /dev/null +++ b/libpcsxcore/r3000a.h @@ -0,0 +1,246 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __R3000A_H__ +#define __R3000A_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" +#include "psxmem.h" +#include "psxcounters.h" +#include "psxbios.h" + +typedef struct { + int (*Init)(); + void (*Reset)(); + void (*Execute)(); /* executes up to a break */ + void (*ExecuteBlock)(); /* executes up to a jump */ + void (*Clear)(u32 Addr, u32 Size); + void (*Shutdown)(); +} R3000Acpu; + +extern R3000Acpu *psxCpu; +extern R3000Acpu psxInt; +#if (defined(__x86_64__) || defined(__i386__) || defined(__sh__) || defined(__ppc__)) && !defined(NOPSXREC) +extern R3000Acpu psxRec; +#define PSXREC +#endif + +typedef union { +#if defined(__BIGENDIAN__) + struct { u8 h3, h2, h, l; } b; + struct { s8 h3, h2, h, l; } sb; + struct { u16 h, l; } w; + struct { s16 h, l; } sw; +#else + struct { u8 l, h, h2, h3; } b; + struct { u16 l, h; } w; + struct { s8 l, h, h2, h3; } sb; + struct { s16 l, h; } sw; +#endif +} PAIR; + +typedef union { + struct { + u32 r0, at, v0, v1, a0, a1, a2, a3, + t0, t1, t2, t3, t4, t5, t6, t7, + s0, s1, s2, s3, s4, s5, s6, s7, + t8, t9, k0, k1, gp, sp, s8, ra, lo, hi; + } n; + u32 r[34]; /* Lo, Hi in r[32] and r[33] */ + PAIR p[34]; +} psxGPRRegs; + +typedef union { + struct { + u32 Index, Random, EntryLo0, EntryLo1, + Context, PageMask, Wired, Reserved0, + BadVAddr, Count, EntryHi, Compare, + Status, Cause, EPC, PRid, + Config, LLAddr, WatchLO, WatchHI, + XContext, Reserved1, Reserved2, Reserved3, + Reserved4, Reserved5, ECC, CacheErr, + TagLo, TagHi, ErrorEPC, Reserved6; + } n; + u32 r[32]; + PAIR p[32]; +} psxCP0Regs; + +typedef struct { + short x, y; +} SVector2D; + +typedef struct { + short z, pad; +} SVector2Dz; + +typedef struct { + short x, y, z, pad; +} SVector3D; + +typedef struct { + short x, y, z, pad; +} LVector3D; + +typedef struct { + unsigned char r, g, b, c; +} CBGR; + +typedef struct { + short m11, m12, m13, m21, m22, m23, m31, m32, m33, pad; +} SMatrix3D; + +typedef union { + struct { + SVector3D v0, v1, v2; + CBGR rgb; + s32 otz; + s32 ir0, ir1, ir2, ir3; + SVector2D sxy0, sxy1, sxy2, sxyp; + SVector2Dz sz0, sz1, sz2, sz3; + CBGR rgb0, rgb1, rgb2; + s32 reserved; + s32 mac0, mac1, mac2, mac3; + u32 irgb, orgb; + s32 lzcs, lzcr; + } n; + u32 r[32]; + PAIR p[32]; +} psxCP2Data; + +typedef union { + struct { + SMatrix3D rMatrix; + s32 trX, trY, trZ; + SMatrix3D lMatrix; + s32 rbk, gbk, bbk; + SMatrix3D cMatrix; + s32 rfc, gfc, bfc; + s32 ofx, ofy; + s32 h; + s32 dqa, dqb; + s32 zsf3, zsf4; + s32 flag; + } n; + u32 r[32]; + PAIR p[32]; +} psxCP2Ctrl; + +typedef struct { + psxGPRRegs GPR; /* General Purpose Registers */ + psxCP0Regs CP0; /* Coprocessor0 Registers */ + psxCP2Data CP2D; /* Cop2 data registers */ + psxCP2Ctrl CP2C; /* Cop2 control registers */ + u32 pc; /* Program counter */ + u32 code; /* The instruction */ + u32 cycle; + u32 interrupt; + u32 intCycle[32]; +} psxRegisters; + +extern psxRegisters psxRegs; + +#if defined(__BIGENDIAN__) + +#define _i32(x) *(s32 *)&x +#define _u32(x) x + +#define _i16(x) (((short *)&x)[1]) +#define _u16(x) (((unsigned short *)&x)[1]) + +#define _i8(x) (((char *)&x)[3]) +#define _u8(x) (((unsigned char *)&x)[3]) + +#else + +#define _i32(x) *(s32 *)&x +#define _u32(x) x + +#define _i16(x) *(short *)&x +#define _u16(x) *(unsigned short *)&x + +#define _i8(x) *(char *)&x +#define _u8(x) *(unsigned char *)&x + +#endif + +/**** R3000A Instruction Macros ****/ +#define _PC_ psxRegs.pc // The next PC to be executed + +#define _fOp_(code) ((code >> 26) ) // The opcode part of the instruction register +#define _fFunct_(code) ((code ) & 0x3F) // The funct part of the instruction register +#define _fRd_(code) ((code >> 11) & 0x1F) // The rd part of the instruction register +#define _fRt_(code) ((code >> 16) & 0x1F) // The rt part of the instruction register +#define _fRs_(code) ((code >> 21) & 0x1F) // The rs part of the instruction register +#define _fSa_(code) ((code >> 6) & 0x1F) // The sa part of the instruction register +#define _fIm_(code) ((u16)code) // The immediate part of the instruction register +#define _fTarget_(code) (code & 0x03ffffff) // The target part of the instruction register + +#define _fImm_(code) ((s16)code) // sign-extended immediate +#define _fImmU_(code) (code&0xffff) // zero-extended immediate + +#define _Op_ _fOp_(psxRegs.code) +#define _Funct_ _fFunct_(psxRegs.code) +#define _Rd_ _fRd_(psxRegs.code) +#define _Rt_ _fRt_(psxRegs.code) +#define _Rs_ _fRs_(psxRegs.code) +#define _Sa_ _fSa_(psxRegs.code) +#define _Im_ _fIm_(psxRegs.code) +#define _Target_ _fTarget_(psxRegs.code) + +#define _Imm_ _fImm_(psxRegs.code) +#define _ImmU_ _fImmU_(psxRegs.code) + +#define _rRs_ psxRegs.GPR.r[_Rs_] // Rs register +#define _rRt_ psxRegs.GPR.r[_Rt_] // Rt register +#define _rRd_ psxRegs.GPR.r[_Rd_] // Rd register +#define _rSa_ psxRegs.GPR.r[_Sa_] // Sa register +#define _rFs_ psxRegs.CP0.r[_Rd_] // Fs register + +#define _c2dRs_ psxRegs.CP2D.r[_Rs_] // Rs cop2 data register +#define _c2dRt_ psxRegs.CP2D.r[_Rt_] // Rt cop2 data register +#define _c2dRd_ psxRegs.CP2D.r[_Rd_] // Rd cop2 data register +#define _c2dSa_ psxRegs.CP2D.r[_Sa_] // Sa cop2 data register + +#define _rHi_ psxRegs.GPR.n.hi // The HI register +#define _rLo_ psxRegs.GPR.n.lo // The LO register + +#define _JumpTarget_ ((_Target_ * 4) + (_PC_ & 0xf0000000)) // Calculates the target during a jump instruction +#define _BranchTarget_ ((s16)_Im_ * 4 + _PC_) // Calculates the target during a branch instruction + +#define _SetLink(x) psxRegs.GPR.r[x] = _PC_ + 4; // Sets the return address in the link register + +int psxInit(); +void psxReset(); +void psxShutdown(); +void psxException(u32 code, u32 bd); +void psxBranchTest(); +void psxExecuteBios(); +int psxTestLoadDelay(int reg, u32 tmp); +void psxDelayTest(int reg, u32 bpc); +void psxTestSWInts(); +void psxJumpTest(); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/sio.c b/libpcsxcore/sio.c new file mode 100644 index 0000000..977c71d --- /dev/null +++ b/libpcsxcore/sio.c @@ -0,0 +1,775 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* SIO functions. +*/ + +#include "sio.h" +#include + +// Status Flags +#define TX_RDY 0x0001 +#define RX_RDY 0x0002 +#define TX_EMPTY 0x0004 +#define PARITY_ERR 0x0008 +#define RX_OVERRUN 0x0010 +#define FRAMING_ERR 0x0020 +#define SYNC_DETECT 0x0040 +#define DSR 0x0080 +#define CTS 0x0100 +#define IRQ 0x0200 + +// Control Flags +#define TX_PERM 0x0001 +#define DTR 0x0002 +#define RX_PERM 0x0004 +#define BREAK 0x0008 +#define RESET_ERR 0x0010 +#define RTS 0x0020 +#define SIO_RESET 0x0040 + +// *** FOR WORKS ON PADS AND MEMORY CARDS ***** + +static unsigned char buf[256]; +unsigned char cardh[4] = { 0x00, 0x00, 0x5a, 0x5d }; + +// Transfer Ready and the Buffer is Empty +// static unsigned short StatReg = 0x002b; +static unsigned short StatReg = TX_RDY | TX_EMPTY; +static unsigned short ModeReg; +static unsigned short CtrlReg; +static unsigned short BaudReg; + +static unsigned int bufcount; +static unsigned int parp; +static unsigned int mcdst, rdwr; +static unsigned char adrH, adrL; +static unsigned int padst; + +char Mcd1Data[MCD_SIZE], Mcd2Data[MCD_SIZE]; + +// clk cycle byte +// 4us * 8bits = (PSXCLK / 1000000) * 32; (linuzappz) +// TODO: add SioModePrescaler and BaudReg +static inline void SIO_INT() { + if (!Config.Sio) { + psxRegs.interrupt |= 0x80; + psxRegs.intCycle[7 + 1] = 400; + psxRegs.intCycle[7] = psxRegs.cycle; + } +} + +void sioWrite8(unsigned char value) { +#ifdef PAD_LOG + PAD_LOG("sio write8 %x\n", value); +#endif + switch (padst) { + case 1: SIO_INT(); + if ((value & 0x40) == 0x40) { + padst = 2; parp = 1; + if (!Config.UseNet) { + switch (CtrlReg & 0x2002) { + case 0x0002: + buf[parp] = PAD1_poll(value); + break; + case 0x2002: + buf[parp] = PAD2_poll(value); + break; + } + }/* else { +// SysPrintf("%x: %x, %x, %x, %x\n", CtrlReg&0x2002, buf[2], buf[3], buf[4], buf[5]); + }*/ + + if (!(buf[parp] & 0x0f)) { + bufcount = 2 + 32; + } else { + bufcount = 2 + (buf[parp] & 0x0f) * 2; + } + if (buf[parp] == 0x41) { + switch (value) { + case 0x43: + buf[1] = 0x43; + break; + case 0x45: + buf[1] = 0xf3; + break; + } + } + } + else padst = 0; + return; + case 2: + parp++; +/* if (buf[1] == 0x45) { + buf[parp] = 0; + SIO_INT(); + return; + }*/ + if (!Config.UseNet) { + switch (CtrlReg & 0x2002) { + case 0x0002: buf[parp] = PAD1_poll(value); break; + case 0x2002: buf[parp] = PAD2_poll(value); break; + } + } + + if (parp == bufcount) { padst = 0; return; } + SIO_INT(); + return; + } + + switch (mcdst) { + case 1: + SIO_INT(); + if (rdwr) { parp++; return; } + parp = 1; + switch (value) { + case 0x52: rdwr = 1; break; + case 0x57: rdwr = 2; break; + default: mcdst = 0; + } + return; + case 2: // address H + SIO_INT(); + adrH = value; + *buf = 0; + parp = 0; + bufcount = 1; + mcdst = 3; + return; + case 3: // address L + SIO_INT(); + adrL = value; + *buf = adrH; + parp = 0; + bufcount = 1; + mcdst = 4; + return; + case 4: + SIO_INT(); + parp = 0; + switch (rdwr) { + case 1: // read + buf[0] = 0x5c; + buf[1] = 0x5d; + buf[2] = adrH; + buf[3] = adrL; + switch (CtrlReg & 0x2002) { + case 0x0002: + memcpy(&buf[4], Mcd1Data + (adrL | (adrH << 8)) * 128, 128); + break; + case 0x2002: + memcpy(&buf[4], Mcd2Data + (adrL | (adrH << 8)) * 128, 128); + break; + } + { + char xor = 0; + int i; + for (i = 2; i < 128 + 4; i++) + xor ^= buf[i]; + buf[132] = xor; + } + buf[133] = 0x47; + bufcount = 133; + break; + case 2: // write + buf[0] = adrL; + buf[1] = value; + buf[129] = 0x5c; + buf[130] = 0x5d; + buf[131] = 0x47; + bufcount = 131; + break; + } + mcdst = 5; + return; + case 5: + parp++; + if (rdwr == 2) { + if (parp < 128) buf[parp + 1] = value; + } + SIO_INT(); + return; + } + + switch (value) { + case 0x01: // start pad + StatReg |= RX_RDY; // Transfer is Ready + + if (!Config.UseNet) { + switch (CtrlReg & 0x2002) { + case 0x0002: buf[0] = PAD1_startPoll(1); break; + case 0x2002: buf[0] = PAD2_startPoll(2); break; + } + } else { + if ((CtrlReg & 0x2002) == 0x0002) { + int i, j; + + PAD1_startPoll(1); + buf[0] = 0; + buf[1] = PAD1_poll(0x42); + if (!(buf[1] & 0x0f)) { + bufcount = 32; + } else { + bufcount = (buf[1] & 0x0f) * 2; + } + buf[2] = PAD1_poll(0); + i = 3; + j = bufcount; + while (j--) { + buf[i++] = PAD1_poll(0); + } + bufcount+= 3; + + if (NET_sendPadData(buf, bufcount) == -1) + netError(); + + if (NET_recvPadData(buf, 1) == -1) + netError(); + if (NET_recvPadData(buf + 128, 2) == -1) + netError(); + } else { + memcpy(buf, buf + 128, 32); + } + } + + bufcount = 2; + parp = 0; + padst = 1; + SIO_INT(); + return; + case 0x81: // start memcard + StatReg |= RX_RDY; + memcpy(buf, cardh, 4); + parp = 0; + bufcount = 3; + mcdst = 1; + rdwr = 0; + SIO_INT(); + return; + } +} + +void sioWriteStat16(unsigned short value) { +} + +void sioWriteMode16(unsigned short value) { + ModeReg = value; +} + +void sioWriteCtrl16(unsigned short value) { + CtrlReg = value & ~RESET_ERR; + if (value & RESET_ERR) StatReg &= ~IRQ; + if ((CtrlReg & SIO_RESET) || (!CtrlReg)) { + padst = 0; mcdst = 0; parp = 0; + StatReg = TX_RDY | TX_EMPTY; + psxRegs.interrupt &= ~0x80; + } +} + +void sioWriteBaud16(unsigned short value) { + BaudReg = value; +} + +unsigned char sioRead8() { + unsigned char ret = 0; + + if ((StatReg & RX_RDY)/* && (CtrlReg & RX_PERM)*/) { +// StatReg &= ~RX_OVERRUN; + ret = buf[parp]; + if (parp == bufcount) { + StatReg &= ~RX_RDY; // Receive is not Ready now + if (mcdst == 5) { + mcdst = 0; + if (rdwr == 2) { + switch (CtrlReg & 0x2002) { + case 0x0002: + memcpy(Mcd1Data + (adrL | (adrH << 8)) * 128, &buf[1], 128); + SaveMcd(Config.Mcd1, Mcd1Data, (adrL | (adrH << 8)) * 128, 128); + break; + case 0x2002: + memcpy(Mcd2Data + (adrL | (adrH << 8)) * 128, &buf[1], 128); + SaveMcd(Config.Mcd2, Mcd2Data, (adrL | (adrH << 8)) * 128, 128); + break; + } + } + } + if (padst == 2) padst = 0; + if (mcdst == 1) { + mcdst = 2; + StatReg|= RX_RDY; + } + } + } + +#ifdef PAD_LOG + PAD_LOG("sio read8 ;ret = %x\n", ret); +#endif + return ret; +} + +unsigned short sioReadStat16() { + return StatReg; +} + +unsigned short sioReadMode16() { + return ModeReg; +} + +unsigned short sioReadCtrl16() { + return CtrlReg; +} + +unsigned short sioReadBaud16() { + return BaudReg; +} + +void netError() { + ClosePlugins(); + SysMessage(_("Connection closed!\n")); + + CdromId[0] = '\0'; + CdromLabel[0] = '\0'; + + SysRunGui(); +} + +void sioInterrupt() { +#ifdef PAD_LOG + PAD_LOG("Sio Interrupt (CP0.Status = %x)\n", psxRegs.CP0.n.Status); +#endif +// SysPrintf("Sio Interrupt\n"); + StatReg |= IRQ; + psxHu32ref(0x1070) |= SWAPu32(0x80); +} + +void LoadMcd(int mcd, char *str) { + FILE *f; + char *data = NULL; + + if (mcd == 1) data = Mcd1Data; + if (mcd == 2) data = Mcd2Data; + + if (*str == 0) { + sprintf(str, "memcards/card%d.mcd", mcd); + SysPrintf(_("No memory card value was specified - creating a default card %s\n"), str); + } + f = fopen(str, "rb"); + if (f == NULL) { + SysPrintf(_("The memory card %s doesn't exist - creating it\n"), str); + CreateMcd(str); + f = fopen(str, "rb"); + if (f != NULL) { + struct stat buf; + + if (stat(str, &buf) != -1) { + if (buf.st_size == MCD_SIZE + 64) + fseek(f, 64, SEEK_SET); + else if(buf.st_size == MCD_SIZE + 3904) + fseek(f, 3904, SEEK_SET); + } + fread(data, 1, MCD_SIZE, f); + fclose(f); + } + else + SysMessage(_("Memory card %s failed to load!\n"), str); + } + else { + struct stat buf; + SysPrintf(_("Loading memory card %s\n"), str); + if (stat(str, &buf) != -1) { + if (buf.st_size == MCD_SIZE + 64) + fseek(f, 64, SEEK_SET); + else if(buf.st_size == MCD_SIZE + 3904) + fseek(f, 3904, SEEK_SET); + } + fread(data, 1, MCD_SIZE, f); + fclose(f); + } +} + +void LoadMcds(char *mcd1, char *mcd2) { + LoadMcd(1, mcd1); + LoadMcd(2, mcd2); +} + +void SaveMcd(char *mcd, char *data, uint32_t adr, int size) { + FILE *f; + + f = fopen(mcd, "r+b"); + if (f != NULL) { + struct stat buf; + + if (stat(mcd, &buf) != -1) { + if (buf.st_size == MCD_SIZE + 64) + fseek(f, adr + 64, SEEK_SET); + else if (buf.st_size == MCD_SIZE + 3904) + fseek(f, adr + 3904, SEEK_SET); + else + fseek(f, adr, SEEK_SET); + } else + fseek(f, adr, SEEK_SET); + + fwrite(data + adr, 1, size, f); + fclose(f); + return; + } + +#if 0 + // try to create it again if we can't open it + f = fopen(mcd, "wb"); + if (f != NULL) { + fwrite(data, 1, MCD_SIZE, f); + fclose(f); + } +#endif + + ConvertMcd(mcd, data); +} + +void CreateMcd(char *mcd) { + FILE *f; + struct stat buf; + int s = MCD_SIZE; + int i = 0, j; + + f = fopen(mcd, "wb"); + if (f == NULL) + return; + + if (stat(mcd, &buf) != -1) { + if ((buf.st_size == MCD_SIZE + 3904) || strstr(mcd, ".gme")) { + s = s + 3904; + fputc('1', f); + s--; + fputc('2', f); + s--; + fputc('3', f); + s--; + fputc('-', f); + s--; + fputc('4', f); + s--; + fputc('5', f); + s--; + fputc('6', f); + s--; + fputc('-', f); + s--; + fputc('S', f); + s--; + fputc('T', f); + s--; + fputc('D', f); + s--; + for (i = 0; i < 7; i++) { + fputc(0, f); + s--; + } + fputc(1, f); + s--; + fputc(0, f); + s--; + fputc(1, f); + s--; + fputc('M', f); + s--; + fputc('Q', f); + s--; + for (i = 0; i < 14; i++) { + fputc(0xa0, f); + s--; + } + fputc(0, f); + s--; + fputc(0xff, f); + while (s-- > (MCD_SIZE + 1)) + fputc(0, f); + } else if ((buf.st_size == MCD_SIZE + 64) || strstr(mcd, ".mem") || strstr(mcd, ".vgs")) { + s = s + 64; + fputc('V', f); + s--; + fputc('g', f); + s--; + fputc('s', f); + s--; + fputc('M', f); + s--; + for (i = 0; i < 3; i++) { + fputc(1, f); + s--; + fputc(0, f); + s--; + fputc(0, f); + s--; + fputc(0, f); + s--; + } + fputc(0, f); + s--; + fputc(2, f); + while (s-- > (MCD_SIZE + 1)) + fputc(0, f); + } + } + fputc('M', f); + s--; + fputc('C', f); + s--; + while (s-- > (MCD_SIZE - 127)) + fputc(0, f); + fputc(0xe, f); + s--; + + for (i = 0; i < 15; i++) { // 15 blocks + fputc(0xa0, f); + s--; + fputc(0x00, f); + s--; + fputc(0x00, f); + s--; + fputc(0x00, f); + s--; + fputc(0x00, f); + s--; + fputc(0x00, f); + s--; + fputc(0x00, f); + s--; + fputc(0x00, f); + s--; + fputc(0xff, f); + s--; + fputc(0xff, f); + s--; + for (j = 0; j < 117; j++) { + fputc(0x00, f); + s--; + } + fputc(0xa0, f); + s--; + } + + for (i = 0; i < 20; i++) { + fputc(0xff, f); + s--; + fputc(0xff, f); + s--; + fputc(0xff, f); + s--; + fputc(0xff, f); + s--; + fputc(0x00, f); + s--; + fputc(0x00, f); + s--; + fputc(0x00, f); + s--; + fputc(0x00, f); + s--; + fputc(0xff, f); + s--; + fputc(0xff, f); + s--; + for (j = 0; j < 118; j++) { + fputc(0x00, f); + s--; + } + } + + while ((s--) >= 0) + fputc(0, f); + + fclose(f); +} + +void ConvertMcd(char *mcd, char *data) { + FILE *f; + int i = 0; + int s = MCD_SIZE; + + if (strstr(mcd, ".gme")) { + f = fopen(mcd, "wb"); + if (f != NULL) { + fwrite(data - 3904, 1, MCD_SIZE + 3904, f); + fclose(f); + } + f = fopen(mcd, "r+"); + s = s + 3904; + fputc('1', f); s--; + fputc('2', f); s--; + fputc('3', f); s--; + fputc('-', f); s--; + fputc('4', f); s--; + fputc('5', f); s--; + fputc('6', f); s--; + fputc('-', f); s--; + fputc('S', f); s--; + fputc('T', f); s--; + fputc('D', f); s--; + for (i = 0; i < 7; i++) { + fputc(0, f); s--; + } + fputc(1, f); s--; + fputc(0, f); s--; + fputc(1, f); s--; + fputc('M', f); s--; + fputc('Q', f); s--; + for(i=0;i<14;i++) { + fputc(0xa0, f); s--; + } + fputc(0, f); s--; + fputc(0xff, f); + while (s-- > (MCD_SIZE+1)) fputc(0, f); + fclose(f); + } else if(strstr(mcd, ".mem") || strstr(mcd,".vgs")) { + f = fopen(mcd, "wb"); + if (f != NULL) { + fwrite(data-64, 1, MCD_SIZE+64, f); + fclose(f); + } + f = fopen(mcd, "r+"); + s = s + 64; + fputc('V', f); s--; + fputc('g', f); s--; + fputc('s', f); s--; + fputc('M', f); s--; + for(i=0;i<3;i++) { + fputc(1, f); s--; + fputc(0, f); s--; + fputc(0, f); s--; + fputc(0, f); s--; + } + fputc(0, f); s--; + fputc(2, f); + while (s-- > (MCD_SIZE+1)) fputc(0, f); + fclose(f); + } else { + f = fopen(mcd, "wb"); + if (f != NULL) { + fwrite(data, 1, MCD_SIZE, f); + fclose(f); + } + } +} + +void GetMcdBlockInfo(int mcd, int block, McdBlock *Info) { + unsigned char *data = NULL, *ptr, *str, *sstr; + unsigned short clut[16]; + unsigned short c; + int i, x; + + memset(Info, 0, sizeof(McdBlock)); + + if (mcd == 1) data = Mcd1Data; + if (mcd == 2) data = Mcd2Data; + + ptr = data + block * 8192 + 2; + + Info->IconCount = *ptr & 0x3; + + ptr += 2; + + x = 0; + + str = Info->Title; + sstr = Info->sTitle; + + for (i = 0; i < 48; i++) { + c = *(ptr) << 8; + c |= *(ptr + 1); + if (!c) break; + + // Convert ASCII characters to half-width + if (c >= 0x8281 && c <= 0x829A) + c = (c - 0x8281) + 'a'; + else if (c >= 0x824F && c <= 0x827A) + c = (c - 0x824F) + '0'; + else if (c == 0x8140) c = ' '; + else if (c == 0x8143) c = ','; + else if (c == 0x8144) c = '.'; + else if (c == 0x8146) c = ':'; + else if (c == 0x8147) c = ';'; + else if (c == 0x8148) c = '?'; + else if (c == 0x8149) c = '!'; + else if (c == 0x815E) c = '/'; + else if (c == 0x8168) c = '"'; + else if (c == 0x8169) c = '('; + else if (c == 0x816A) c = ')'; + else if (c == 0x816D) c = '['; + else if (c == 0x816E) c = ']'; + else if (c == 0x817C) c = '-'; + else { + str[i] = ' '; + sstr[x++] = *ptr++; sstr[x++] = *ptr++; + continue; + } + + str[i] = sstr[x++] = c; + ptr += 2; + } + + trim(str); + trim(sstr); + + ptr = data + block * 8192 + 0x60; // icon palette data + + for (i = 0; i < 16; i++) { + clut[i] = *((unsigned short *)ptr); + ptr += 2; + } + + for (i = 0; i < Info->IconCount; i++) { + short *icon = &Info->Icon[i * 16 * 16]; + + ptr = data + block * 8192 + 128 + 128 * i; // icon data + + for (x = 0; x < 16 * 16; x++) { + icon[x++] = clut[*ptr & 0xf]; + icon[x] = clut[*ptr >> 4]; + ptr++; + } + } + + ptr = data + block * 128; + + Info->Flags = *ptr; + + ptr += 0xa; + strncpy(Info->ID, ptr, 12); + ptr += 12; + strncpy(Info->Name, ptr, 16); +} + +int sioFreeze(gzFile f, int Mode) { + gzfreeze(buf, sizeof(buf)); + gzfreeze(&StatReg, sizeof(StatReg)); + gzfreeze(&ModeReg, sizeof(ModeReg)); + gzfreeze(&CtrlReg, sizeof(CtrlReg)); + gzfreeze(&BaudReg, sizeof(BaudReg)); + gzfreeze(&bufcount, sizeof(bufcount)); + gzfreeze(&parp, sizeof(parp)); + gzfreeze(&mcdst, sizeof(mcdst)); + gzfreeze(&rdwr, sizeof(rdwr)); + gzfreeze(&adrH, sizeof(adrH)); + gzfreeze(&adrL, sizeof(adrL)); + gzfreeze(&padst, sizeof(padst)); + + return 0; +} diff --git a/libpcsxcore/sio.h b/libpcsxcore/sio.h new file mode 100644 index 0000000..cc8d925 --- /dev/null +++ b/libpcsxcore/sio.h @@ -0,0 +1,76 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + + +#ifndef _SIO_H_ +#define _SIO_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" +#include "r3000a.h" +#include "psxmem.h" +#include "plugins.h" +#include "psemu_plugin_defs.h" + +#define MCD_SIZE (1024 * 8 * 16) + +extern char Mcd1Data[MCD_SIZE], Mcd2Data[MCD_SIZE]; + +void sioWrite8(unsigned char value); +void sioWriteStat16(unsigned short value); +void sioWriteMode16(unsigned short value); +void sioWriteCtrl16(unsigned short value); +void sioWriteBaud16(unsigned short value); + +unsigned char sioRead8(); +unsigned short sioReadStat16(); +unsigned short sioReadMode16(); +unsigned short sioReadCtrl16(); +unsigned short sioReadBaud16(); + +void netError(); + +void sioInterrupt(); +int sioFreeze(gzFile f, int Mode); + +void LoadMcd(int mcd, char *str); +void LoadMcds(char *mcd1, char *mcd2); +void SaveMcd(char *mcd, char *data, uint32_t adr, int size); +void CreateMcd(char *mcd); +void ConvertMcd(char *mcd, char *data); + +typedef struct { + char Title[48 + 1]; // Title in ASCII + char sTitle[48 * 2 + 1]; // Title in Shift-JIS + char ID[12 + 1]; + char Name[16 + 1]; + int IconCount; + short Icon[16 * 16 * 3]; + unsigned char Flags; +} McdBlock; + +void GetMcdBlockInfo(int mcd, int block, McdBlock *info); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/sjisfont.h b/libpcsxcore/sjisfont.h new file mode 100644 index 0000000..105d624 --- /dev/null +++ b/libpcsxcore/sjisfont.h @@ -0,0 +1,6956 @@ +// +// This file is adapted from: +// +// Shinonome 14dot font for JISX 0208, 1983/1990 +// +// The original is k14goth by +// Yasuyuki Furukawa , 2000. +// (Public Domain) +// +// > Donated by H. Kagotani ; +// > public domainfont from Japan +// > JIS X 0208-1990 design is made by +// > TAKADA Toshihiro . +// > Modified for gothic like by Yasuyuki Furukawa +// +// Modified and Maintained by /efont/. +// +// (c) /efont/ -- Efont Open Laboratory 2001 +// http://openlab.ring.gr.jp/efont/ +// +// Converted to binary format by Wei Mingzhi . +// + +const unsigned char font_8140[] = { + 0x78, 0xda, 0xad, 0x3b, 0x3b, 0x90, 0x1b, 0xc9, + 0x75, 0x3d, 0x9f, 0x05, 0x1a, 0xcb, 0xe1, 0x4e, + 0x03, 0x0b, 0x9f, 0x66, 0xa5, 0x3d, 0xa2, 0x77, + 0x09, 0x89, 0xb8, 0x2b, 0x07, 0x73, 0xe2, 0x95, + 0x0a, 0xb6, 0xb7, 0x84, 0xd1, 0x99, 0xb6, 0x97, + 0xf6, 0x05, 0x0c, 0x18, 0x28, 0x9c, 0x40, 0xa5, + 0x52, 0xa0, 0x2a, 0xc1, 0x55, 0x57, 0x65, 0x06, + 0xb4, 0x31, 0xe1, 0x86, 0x08, 0x18, 0x28, 0x44, + 0x78, 0xa1, 0x43, 0x87, 0x13, 0x6e, 0xa8, 0xe0, + 0x02, 0x85, 0x13, 0x28, 0x50, 0xa0, 0x60, 0x02, + 0x06, 0x08, 0x58, 0x45, 0xbf, 0xd7, 0x3d, 0x3d, + 0xdd, 0x3d, 0x3f, 0x52, 0x3e, 0xcf, 0x2b, 0x82, + 0x18, 0xbc, 0xe9, 0xe9, 0xd7, 0xaf, 0xdf, 0xff, + 0xf5, 0x12, 0xf2, 0xd7, 0x5e, 0x09, 0xe1, 0x84, + 0x01, 0x74, 0x5f, 0x31, 0xb9, 0x05, 0x88, 0x7b, + 0xb0, 0x29, 0x00, 0x87, 0x37, 0x90, 0x01, 0x7c, + 0xf3, 0x72, 0x88, 0x97, 0x39, 0x1d, 0xcf, 0x7a, + 0x00, 0xcd, 0x6f, 0x7d, 0x58, 0x87, 0xb8, 0x35, + 0x66, 0x9c, 0xd1, 0x84, 0x71, 0x04, 0x20, 0x04, + 0xde, 0x8c, 0xa0, 0x9e, 0x87, 0xef, 0x59, 0x05, + 0x44, 0x81, 0xa6, 0x80, 0xc1, 0xca, 0x78, 0x2f, + 0xed, 0xc3, 0x2b, 0x77, 0x32, 0x8f, 0xf8, 0xbd, + 0x63, 0x47, 0x38, 0x7b, 0xd6, 0x87, 0x0d, 0xd2, + 0x20, 0xed, 0xdf, 0x0f, 0x58, 0x5b, 0xe6, 0x27, + 0xb4, 0x87, 0xb0, 0xf7, 0xef, 0xc8, 0xff, 0xe9, + 0x32, 0xc7, 0x05, 0x92, 0xba, 0xa4, 0x63, 0xf1, + 0x9c, 0xec, 0x83, 0xa4, 0x17, 0xab, 0xc7, 0xe6, + 0x1d, 0x3b, 0xa8, 0xc7, 0x76, 0x61, 0xe1, 0xf2, + 0x13, 0x04, 0x9a, 0xd1, 0x6c, 0x6a, 0xad, 0x57, + 0xad, 0x98, 0xb1, 0x34, 0x08, 0x0b, 0xb5, 0x4f, + 0xbb, 0x9a, 0x62, 0x17, 0xc0, 0x2b, 0x7d, 0xee, + 0x73, 0x9a, 0xcc, 0x60, 0x2f, 0x1b, 0xb4, 0xa1, + 0xf0, 0xf2, 0x51, 0x32, 0xc9, 0x26, 0x64, 0x96, + 0xcd, 0x49, 0x84, 0xb7, 0x4a, 0x36, 0xf2, 0x28, + 0xe6, 0x14, 0x86, 0xf9, 0x0a, 0xf0, 0x2e, 0x8a, + 0xc7, 0x79, 0x53, 0x07, 0x36, 0xe5, 0xc7, 0xf1, + 0xae, 0x7d, 0x35, 0xdf, 0x85, 0x0b, 0x25, 0x54, + 0x10, 0x21, 0xe4, 0xd1, 0x35, 0x6f, 0x89, 0x62, + 0x2d, 0x83, 0xdf, 0x7c, 0xc0, 0x39, 0xf6, 0x0f, + 0xc6, 0x75, 0x49, 0xae, 0xe9, 0x2f, 0x18, 0x29, + 0xac, 0x17, 0x67, 0xfd, 0x40, 0x88, 0x33, 0x00, + 0xf6, 0xf5, 0x34, 0x7e, 0x1a, 0xf7, 0xaf, 0x88, + 0x25, 0xac, 0xa9, 0xd2, 0x72, 0x01, 0xbc, 0x5b, + 0x1d, 0x62, 0xb9, 0x05, 0x7d, 0x76, 0xe0, 0xce, + 0x61, 0x5e, 0x8c, 0xd0, 0x85, 0x7c, 0x4a, 0xa6, + 0x00, 0xd7, 0xe4, 0x59, 0xf7, 0x58, 0xc5, 0x38, + 0x64, 0x9d, 0x84, 0xa4, 0xe6, 0x56, 0xfd, 0x05, + 0x19, 0x27, 0x81, 0xd6, 0x03, 0xac, 0xb1, 0x26, + 0xb4, 0xc6, 0x9a, 0x50, 0x8f, 0x3d, 0xd6, 0xf3, + 0x35, 0xe1, 0x48, 0xc8, 0xeb, 0x7a, 0xbe, 0x26, + 0xbc, 0xc6, 0xb1, 0x91, 0x9e, 0xd5, 0xc9, 0xac, + 0x99, 0x23, 0xb4, 0x88, 0x7a, 0xd6, 0x91, 0x35, + 0x73, 0x6a, 0xd2, 0x2c, 0xe4, 0xa6, 0x21, 0x1d, + 0x0d, 0xb9, 0xb1, 0x25, 0x0b, 0x2e, 0x34, 0x57, + 0x7b, 0xb2, 0x77, 0xb8, 0xc3, 0xdd, 0xc4, 0x4d, + 0xf0, 0x7f, 0xbc, 0x17, 0xbf, 0x8b, 0x8f, 0x25, + 0xc0, 0x0c, 0x60, 0x02, 0x80, 0xff, 0xe3, 0xbd, + 0x40, 0x12, 0xe7, 0x38, 0x24, 0x39, 0x6e, 0x2f, + 0xfc, 0x17, 0x5a, 0xda, 0xa3, 0x4b, 0xdd, 0xa3, + 0x9b, 0xb5, 0xc1, 0x03, 0x99, 0x1c, 0x93, 0x93, + 0x0e, 0xf8, 0x4f, 0xf2, 0x0b, 0xb2, 0x93, 0x7c, + 0x2e, 0x41, 0xc2, 0x0b, 0x92, 0x1b, 0x80, 0xf7, + 0xa5, 0xe4, 0xf3, 0x0d, 0x68, 0xc1, 0x25, 0xd8, + 0x1c, 0x0d, 0x78, 0x7f, 0x23, 0xf9, 0x6c, 0xd0, + 0xb8, 0x39, 0xf6, 0xcb, 0x3a, 0x01, 0x6c, 0x97, + 0x95, 0x6d, 0x8e, 0x34, 0x9f, 0xe3, 0x94, 0x31, + 0xca, 0xfd, 0xc4, 0xcd, 0xb4, 0x6d, 0xe2, 0xb4, + 0xed, 0xc1, 0xe4, 0x88, 0x2e, 0x8f, 0xa6, 0xde, + 0xd5, 0x9a, 0x5b, 0x48, 0x91, 0x9a, 0x75, 0x73, + 0x94, 0x7c, 0xac, 0x2d, 0x59, 0x4a, 0x84, 0x5f, + 0x89, 0x84, 0xb0, 0xf8, 0xd2, 0xd6, 0xa6, 0xd2, + 0x39, 0x37, 0x7e, 0x31, 0x9e, 0xac, 0x94, 0x30, + 0xf7, 0x80, 0x3f, 0xb1, 0xb4, 0xd0, 0x39, 0x6a, + 0x2a, 0xce, 0x2d, 0xe7, 0x37, 0x7e, 0xad, 0x9e, + 0x32, 0xb1, 0xb5, 0xc5, 0xd9, 0xfe, 0xec, 0x8f, + 0x8f, 0xef, 0x1e, 0xdf, 0xfd, 0xec, 0x8f, 0x97, + 0xdb, 0x21, 0x9f, 0xcd, 0xd8, 0x7a, 0xcd, 0xea, + 0x80, 0xc1, 0x3b, 0x02, 0x11, 0x2b, 0x10, 0xa3, + 0xbb, 0x4f, 0x29, 0x58, 0x2c, 0x82, 0x70, 0x0d, + 0xbb, 0x54, 0x61, 0x05, 0xf7, 0x10, 0xfc, 0xc4, + 0x13, 0x5e, 0x78, 0x51, 0xea, 0x5d, 0x8a, 0x84, + 0x0c, 0x46, 0x3d, 0x76, 0x28, 0xb2, 0x6c, 0x79, + 0xf3, 0xfa, 0x11, 0x00, 0xca, 0x70, 0xaf, 0xf7, + 0xfe, 0xf3, 0xf3, 0xe8, 0xa7, 0x54, 0xeb, 0xa6, + 0x4b, 0x9d, 0xda, 0x9a, 0x6e, 0xb7, 0x9c, 0x33, + 0xf0, 0x44, 0xbb, 0xf2, 0x04, 0xb8, 0xbf, 0x2b, + 0xe5, 0x2e, 0x8c, 0xeb, 0xd5, 0x8e, 0xf3, 0x09, + 0x9f, 0xb2, 0x29, 0x7b, 0x88, 0xeb, 0x4e, 0xf1, + 0xdb, 0x84, 0x8f, 0x95, 0x57, 0x83, 0xfd, 0xf3, + 0xb2, 0x93, 0x04, 0x9e, 0xe0, 0x53, 0xa0, 0xe0, + 0x14, 0x7c, 0xcf, 0x38, 0xf3, 0x95, 0xf1, 0xce, + 0x41, 0xfb, 0x98, 0x2b, 0x66, 0xdc, 0x14, 0x3e, + 0xf9, 0x92, 0x7c, 0x4d, 0xff, 0x8d, 0xc5, 0xd5, + 0xbc, 0x11, 0x5d, 0xb2, 0xaf, 0xf8, 0x57, 0xc9, + 0x32, 0xbb, 0x20, 0x6e, 0xea, 0xef, 0x27, 0x74, + 0x4a, 0xf9, 0x3e, 0xa9, 0xa2, 0x01, 0x97, 0x23, + 0x2c, 0x8e, 0xca, 0x59, 0x6d, 0x4a, 0xf4, 0x95, + 0x08, 0x88, 0x3d, 0x13, 0x96, 0x72, 0x4a, 0x4e, + 0x89, 0xbf, 0x3e, 0x65, 0x53, 0xce, 0x73, 0x9e, + 0x4f, 0xf9, 0x59, 0x64, 0xee, 0xd1, 0x45, 0xfc, + 0xe9, 0xd6, 0x03, 0xea, 0x3e, 0xdd, 0x5e, 0xc4, + 0xe6, 0x8e, 0x79, 0x59, 0x90, 0x32, 0xf6, 0xf8, + 0x7e, 0x79, 0xff, 0xec, 0xfe, 0xf6, 0xee, 0xf9, + 0xfe, 0x49, 0xaa, 0xbd, 0x20, 0xee, 0x90, 0x9f, + 0x60, 0xc4, 0x02, 0xdf, 0xf2, 0x11, 0xee, 0x12, + 0x78, 0x70, 0xfc, 0xcd, 0xcb, 0xb4, 0x7f, 0x76, + 0xb3, 0xd7, 0xaf, 0xe3, 0x28, 0x48, 0x7d, 0x58, + 0xf7, 0xe9, 0xe1, 0x72, 0xab, 0xf6, 0xdf, 0x11, + 0xf3, 0x7a, 0xd9, 0xee, 0xdd, 0xe6, 0x18, 0x16, + 0xe3, 0x3c, 0x2c, 0xce, 0x0a, 0x8d, 0x55, 0x33, + 0xa3, 0xf6, 0x20, 0xe0, 0xb7, 0x20, 0xf5, 0x32, + 0x8d, 0x0d, 0x8b, 0x45, 0xb9, 0x28, 0x37, 0x47, + 0x04, 0xfc, 0x16, 0x16, 0x26, 0x36, 0x48, 0xcf, + 0xf7, 0xf3, 0x17, 0x2b, 0x71, 0xcd, 0x5f, 0x9c, + 0xef, 0xf5, 0x58, 0x53, 0x2f, 0xd1, 0xab, 0x6b, + 0x7d, 0x55, 0xbc, 0x40, 0x5a, 0xf0, 0xcd, 0x48, + 0x19, 0xbe, 0x77, 0x9c, 0x2b, 0x8e, 0xec, 0x8e, + 0x09, 0x6d, 0xc3, 0xae, 0xd2, 0x85, 0xdd, 0xb1, + 0x1b, 0xcc, 0x68, 0xc5, 0x15, 0x3c, 0xc3, 0x25, + 0xe1, 0x8a, 0xb4, 0x16, 0x29, 0x6e, 0x8c, 0x73, + 0x9c, 0x5d, 0xad, 0x4d, 0xdb, 0x04, 0x7c, 0x5a, + 0xea, 0x02, 0xd2, 0xea, 0x66, 0xa6, 0xb5, 0x52, + 0xeb, 0x47, 0x4a, 0x91, 0x56, 0x2f, 0xb3, 0x6d, + 0xd9, 0x15, 0x3d, 0xdf, 0x4f, 0x60, 0xe4, 0x6c, + 0xff, 0x77, 0xeb, 0xd9, 0x1e, 0xf7, 0xe1, 0x7c, + 0x7f, 0x55, 0xd9, 0xa4, 0x4d, 0x29, 0xe3, 0x17, + 0xa4, 0xd3, 0x23, 0x1a, 0x4c, 0x0d, 0x46, 0xbb, + 0x01, 0xab, 0x48, 0x49, 0x47, 0xf4, 0xed, 0x0a, + 0x4b, 0xb2, 0x3b, 0x46, 0xc2, 0xb7, 0x34, 0xed, + 0xa4, 0x57, 0xc9, 0x7b, 0xdb, 0xc6, 0x9a, 0xbf, + 0x4c, 0xf8, 0x49, 0xd2, 0xa6, 0x5a, 0xd3, 0xa6, + 0xfe, 0x37, 0x62, 0xfa, 0x32, 0x10, 0xfa, 0xbd, + 0x29, 0xd1, 0xaf, 0x81, 0x85, 0xb2, 0xf0, 0x1b, + 0xb4, 0x57, 0x80, 0x80, 0x51, 0xf8, 0x50, 0xbe, + 0xb1, 0xc6, 0x86, 0xa5, 0x0c, 0x48, 0x70, 0x64, + 0x58, 0xbd, 0xdf, 0x18, 0x9b, 0x57, 0x49, 0x0d, + 0x3c, 0xb4, 0xc9, 0x9b, 0x58, 0x35, 0xaf, 0x1a, + 0x6f, 0xcf, 0xac, 0xe6, 0x55, 0xe3, 0xed, 0x99, + 0x39, 0xd3, 0x80, 0x1f, 0x14, 0x74, 0x9f, 0xb4, + 0x72, 0x11, 0xf3, 0xa9, 0x66, 0xa4, 0x6b, 0xcb, + 0x8e, 0x11, 0x75, 0x0d, 0xc8, 0x86, 0xc9, 0xcd, + 0x9a, 0x32, 0xd6, 0x4c, 0xe3, 0x76, 0x25, 0xa1, + 0xf0, 0xaf, 0x23, 0x10, 0x43, 0xaa, 0x36, 0x65, + 0x42, 0x37, 0x25, 0x52, 0x6c, 0x05, 0xed, 0x42, + 0x2b, 0x17, 0x65, 0xf7, 0xcc, 0x8b, 0x42, 0xb1, + 0xc9, 0xfa, 0x66, 0xc6, 0xde, 0x8d, 0x28, 0xd7, + 0xe4, 0x73, 0x3b, 0x96, 0xd0, 0xba, 0x10, 0x16, + 0x71, 0x94, 0xf4, 0x26, 0x50, 0x4e, 0xee, 0x62, + 0x62, 0xc9, 0xbd, 0xc3, 0x28, 0xf5, 0x21, 0x5b, + 0x0a, 0x92, 0x20, 0x3f, 0xc9, 0x3c, 0x4b, 0x57, + 0x22, 0xe0, 0x56, 0x00, 0x34, 0x8f, 0x12, 0xb7, + 0x25, 0x75, 0x9b, 0xb2, 0xf9, 0x69, 0x86, 0x94, + 0x97, 0xf0, 0xaf, 0xc6, 0x25, 0xe0, 0x13, 0x6a, + 0x8e, 0x38, 0xcc, 0xe5, 0x98, 0xa1, 0x60, 0x44, + 0x3a, 0x25, 0x14, 0x76, 0xca, 0xe5, 0x4e, 0xcd, + 0x67, 0xf3, 0x37, 0xfd, 0x5c, 0x3d, 0xb6, 0xf2, + 0xe9, 0xd2, 0x97, 0x5c, 0x93, 0x6f, 0x44, 0xe4, + 0xe2, 0x37, 0x32, 0x3f, 0x06, 0x3a, 0x7b, 0x45, + 0x67, 0xac, 0x2b, 0x03, 0x1c, 0xc5, 0x93, 0x84, + 0x65, 0x2c, 0x9b, 0x24, 0xa3, 0x46, 0xac, 0x6c, + 0x7b, 0x5c, 0xcb, 0x1b, 0xe7, 0x72, 0x46, 0x91, + 0x15, 0x0b, 0xcb, 0x0d, 0x20, 0xe2, 0x65, 0xe4, + 0xd6, 0x28, 0x45, 0x1a, 0xa7, 0xe4, 0x22, 0xbb, + 0xc8, 0x82, 0x3c, 0xc8, 0x47, 0xe9, 0x28, 0x45, + 0x1f, 0xe3, 0x27, 0x17, 0x19, 0xe6, 0xc8, 0x98, + 0x37, 0x78, 0x96, 0x54, 0x86, 0x05, 0xce, 0x55, + 0x79, 0x2b, 0xbe, 0x4c, 0x7e, 0x9d, 0xfd, 0x3a, + 0xfb, 0x31, 0xf9, 0x21, 0xf1, 0xd8, 0xe8, 0xdb, + 0xb3, 0xbf, 0x7c, 0xf2, 0x97, 0xd9, 0xb7, 0x57, + 0x92, 0x0e, 0xcc, 0x39, 0x8a, 0x71, 0xb1, 0xc8, + 0x2e, 0xed, 0x6f, 0x75, 0x0a, 0xa4, 0xe0, 0x24, + 0xc7, 0x3d, 0x84, 0xb7, 0x67, 0x27, 0x10, 0xf1, + 0x12, 0x95, 0x95, 0xe7, 0x4e, 0x0a, 0x11, 0x6a, + 0xec, 0x30, 0x84, 0x31, 0x0f, 0x49, 0x58, 0x63, + 0x71, 0x75, 0x13, 0xbe, 0x28, 0x27, 0x5c, 0xd9, + 0x13, 0x3b, 0x77, 0x57, 0x38, 0xa7, 0x71, 0x27, + 0x74, 0x3b, 0x1f, 0x27, 0x08, 0x5e, 0xe2, 0x58, + 0xf0, 0x31, 0xf9, 0xa0, 0x8e, 0x55, 0x14, 0x28, + 0x1f, 0xa8, 0xa4, 0x79, 0xdc, 0x90, 0x67, 0x8d, + 0x55, 0x9a, 0x2f, 0x39, 0x2f, 0x75, 0x41, 0x6b, + 0x8a, 0xc6, 0xc2, 0x88, 0xa4, 0x65, 0x37, 0x12, + 0xd8, 0x45, 0x88, 0xd8, 0x61, 0x76, 0xc8, 0xbc, + 0x16, 0xa5, 0xd8, 0xbf, 0x42, 0x6b, 0x8a, 0xcc, + 0x10, 0x1e, 0x64, 0x41, 0x22, 0x35, 0xd0, 0x1c, + 0xeb, 0xe5, 0xb0, 0x04, 0xc0, 0x9e, 0xe7, 0x73, + 0x1e, 0xa1, 0x05, 0x61, 0x3e, 0xf7, 0x72, 0x6d, + 0x25, 0xc1, 0xca, 0x88, 0xdc, 0xa9, 0x2b, 0x3e, + 0xae, 0xa8, 0x02, 0x39, 0x56, 0xf4, 0x99, 0x6f, + 0xd6, 0x75, 0x15, 0x9a, 0x8e, 0x0f, 0xa4, 0x81, + 0x75, 0x5a, 0x52, 0xa3, 0xe5, 0x06, 0xec, 0x46, + 0x46, 0x53, 0x0a, 0xb4, 0xd0, 0x34, 0xcc, 0x69, + 0x4c, 0xf1, 0x8a, 0x17, 0x35, 0x55, 0xde, 0x1f, + 0x82, 0x18, 0x8c, 0xa7, 0xb6, 0xc0, 0x2c, 0x30, + 0x68, 0xde, 0x10, 0x96, 0x33, 0x61, 0x1b, 0xab, + 0x8b, 0x33, 0xc3, 0x02, 0x6f, 0x72, 0x86, 0x54, + 0x41, 0x8e, 0xba, 0xc0, 0x6f, 0x68, 0x06, 0xf9, + 0xa6, 0x68, 0x61, 0xb3, 0x05, 0xe8, 0x91, 0x34, + 0x92, 0x6b, 0x6d, 0xf7, 0x0f, 0xa0, 0x7f, 0x5c, + 0xcc, 0x79, 0xe4, 0x1c, 0x8d, 0x34, 0xc4, 0x13, + 0x07, 0x15, 0x60, 0xae, 0xb7, 0xca, 0x64, 0x2f, + 0x0a, 0xf5, 0x6d, 0x5d, 0xc7, 0xc1, 0xe3, 0x8e, + 0xec, 0x67, 0xac, 0x15, 0xb4, 0xb0, 0xb3, 0x4c, + 0x8a, 0x3c, 0xad, 0x91, 0xeb, 0x02, 0xa8, 0x02, + 0x3d, 0xfc, 0x04, 0xf4, 0x68, 0x0a, 0xb4, 0x21, + 0x8d, 0xfa, 0xcd, 0x6b, 0xc3, 0xa0, 0xcb, 0xf5, + 0xb0, 0x64, 0x53, 0x73, 0x23, 0x8d, 0xe2, 0x38, + 0x7e, 0xb1, 0x7a, 0xb1, 0xda, 0x2f, 0xf7, 0x3f, + 0x66, 0xd7, 0x00, 0x9c, 0x6d, 0xeb, 0x25, 0xc5, + 0xdb, 0x88, 0x47, 0x7c, 0xce, 0x67, 0x18, 0x8b, + 0x72, 0x76, 0x60, 0x29, 0x4b, 0xd7, 0xdc, 0x8e, + 0xbd, 0xb4, 0x38, 0xdb, 0xb1, 0x57, 0xc5, 0x67, + 0xe0, 0xee, 0xa2, 0x9e, 0x7b, 0x4d, 0xba, 0xc7, + 0x3e, 0xa1, 0x11, 0xc6, 0x5e, 0x85, 0x0a, 0xd5, + 0xad, 0xb1, 0xb8, 0x1e, 0x6b, 0x45, 0xe3, 0x03, + 0x4d, 0x31, 0x5d, 0x1a, 0x81, 0x9e, 0x13, 0x11, + 0xfd, 0x45, 0xfc, 0x07, 0x7a, 0x7f, 0x8b, 0x6b, + 0xfe, 0x15, 0xeb, 0xe3, 0xa4, 0xde, 0x05, 0x05, + 0xa6, 0xd4, 0xa1, 0x15, 0xec, 0xf7, 0x92, 0xff, + 0x7e, 0x89, 0xb6, 0xf5, 0x8a, 0xcd, 0xf6, 0xb3, + 0xfd, 0x7c, 0x3f, 0x07, 0xbf, 0x81, 0x4f, 0x9a, + 0x6f, 0x06, 0xc5, 0xaf, 0xec, 0x9d, 0x8c, 0x1d, + 0xb5, 0xc4, 0xe2, 0x1e, 0xd1, 0xec, 0xa4, 0x87, + 0xaa, 0x05, 0xf8, 0x4d, 0x5e, 0x55, 0x17, 0x85, + 0xa7, 0x03, 0x5e, 0x36, 0xfd, 0x0a, 0xea, 0x0b, + 0x4d, 0xbc, 0x3c, 0x40, 0x6e, 0xe4, 0x21, 0xd7, + 0x59, 0x0c, 0xea, 0xe7, 0x24, 0x3f, 0x05, 0x6f, + 0x25, 0xd9, 0x19, 0x24, 0x3f, 0xca, 0xda, 0x63, + 0x85, 0xdc, 0x92, 0x86, 0x65, 0x48, 0x51, 0x9a, + 0xc6, 0x09, 0xcd, 0x05, 0x8f, 0x01, 0x68, 0x3e, + 0x4e, 0xbb, 0xc6, 0x82, 0xcc, 0xc2, 0xd8, 0xc0, + 0xb4, 0x57, 0x19, 0x58, 0x14, 0xa0, 0x75, 0x91, + 0x6b, 0x5b, 0x7c, 0xd6, 0xac, 0x5d, 0x71, 0x9a, + 0x4b, 0x59, 0xa5, 0x24, 0xcc, 0x40, 0x7a, 0x78, + 0x98, 0x1b, 0x34, 0x67, 0xa7, 0x49, 0x50, 0x8b, + 0x8f, 0xce, 0x09, 0x65, 0xc6, 0x3a, 0xea, 0xe1, + 0x95, 0xaa, 0xbf, 0xda, 0x96, 0x72, 0x5a, 0xcd, + 0x8d, 0xbe, 0x97, 0x6e, 0x71, 0xce, 0x09, 0x79, + 0x40, 0x02, 0xe4, 0x99, 0xf1, 0xe6, 0xd1, 0xb0, + 0x96, 0x89, 0xeb, 0xb7, 0xf9, 0x53, 0x7e, 0x5d, + 0xc3, 0x7f, 0x34, 0x32, 0xd5, 0x0b, 0x83, 0xcf, + 0xe6, 0x9b, 0x9b, 0x36, 0xad, 0x19, 0xb9, 0xe1, + 0x85, 0x16, 0x96, 0xd6, 0x7b, 0xf4, 0x20, 0xa3, + 0x75, 0x16, 0x2b, 0xc6, 0xda, 0xbb, 0x60, 0xd9, + 0x68, 0x22, 0x79, 0x95, 0xa8, 0x6a, 0xce, 0x65, + 0x83, 0xe6, 0x10, 0x24, 0x42, 0xc4, 0x99, 0x60, + 0xfd, 0xe3, 0x24, 0xcc, 0xcc, 0x52, 0x61, 0x63, + 0x8f, 0x8c, 0x1d, 0x54, 0x59, 0xb9, 0xe1, 0x8f, + 0x52, 0xef, 0xbf, 0x6d, 0xac, 0x94, 0x6a, 0x94, + 0x6b, 0x94, 0xec, 0x66, 0xdd, 0x7c, 0xbd, 0xc6, + 0xdc, 0xf5, 0x74, 0x7f, 0x7a, 0x38, 0x3d, 0xa0, + 0xc6, 0x34, 0xf2, 0xeb, 0x54, 0xea, 0x03, 0xc6, + 0x01, 0x34, 0x89, 0xd2, 0xf6, 0xbc, 0x3e, 0xe6, + 0x54, 0x98, 0x55, 0x89, 0x08, 0x2f, 0x30, 0x57, + 0x94, 0x33, 0x15, 0xf5, 0x71, 0xb4, 0xc5, 0xcd, + 0x02, 0xe8, 0x02, 0x22, 0x01, 0xcc, 0xa2, 0x2f, + 0xd8, 0xe7, 0x6c, 0xc9, 0x2f, 0xb1, 0x12, 0x86, + 0xab, 0x03, 0x7b, 0x01, 0x11, 0x01, 0x19, 0x17, + 0x0f, 0xd9, 0x05, 0xfd, 0x9c, 0xfe, 0x04, 0xf2, + 0xe1, 0x1f, 0x42, 0x84, 0xdd, 0x2e, 0xfb, 0x51, + 0x2e, 0x7d, 0xc0, 0xa9, 0x11, 0x41, 0x49, 0xfd, + 0x90, 0x9b, 0x87, 0x30, 0xb3, 0x28, 0x92, 0x92, + 0x89, 0xf3, 0xe0, 0x2e, 0xab, 0x9a, 0xa1, 0x88, + 0x82, 0xaa, 0x5f, 0xd7, 0x95, 0xff, 0x54, 0xf1, + 0x51, 0xd0, 0xa8, 0xd9, 0x3b, 0x62, 0x5d, 0x32, + 0x9a, 0x1d, 0x93, 0x09, 0x61, 0xa5, 0x1a, 0x2b, + 0x22, 0xe1, 0x6a, 0xbd, 0x98, 0x87, 0x5f, 0x81, + 0x07, 0x69, 0xd0, 0x9b, 0xfc, 0x9c, 0xa3, 0x0e, + 0x45, 0xc9, 0x2a, 0x89, 0xeb, 0x48, 0x15, 0x56, + 0x1c, 0x8f, 0xef, 0x6e, 0x7c, 0xe0, 0x45, 0x11, + 0xb0, 0x39, 0x5d, 0x02, 0x44, 0xb1, 0x5a, 0x2f, + 0x8e, 0xa2, 0x7c, 0xc7, 0xe8, 0x9e, 0xde, 0xb1, + 0x3b, 0x96, 0xf1, 0xec, 0x8a, 0x3c, 0xaf, 0xa2, + 0x20, 0xc0, 0xce, 0xe9, 0xcb, 0x3e, 0xac, 0xd0, + 0xa9, 0x34, 0xc4, 0x5a, 0x52, 0xb9, 0x80, 0x55, + 0x8d, 0xff, 0x00, 0x5e, 0x16, 0x69, 0xcd, 0x2b, + 0xfd, 0x5c, 0xb9, 0x7f, 0x5e, 0xac, 0xe0, 0x99, + 0xe2, 0xe7, 0x20, 0x71, 0x21, 0xfa, 0x05, 0x29, + 0x7d, 0x32, 0xda, 0x30, 0x22, 0x76, 0xa3, 0x06, + 0x9d, 0xd4, 0xd8, 0x6f, 0x9d, 0x95, 0xbb, 0xea, + 0xc4, 0x4a, 0xdd, 0xb9, 0x79, 0x5c, 0xf0, 0xea, + 0x5a, 0x89, 0xa8, 0x46, 0xf2, 0x88, 0xbc, 0x64, + 0x2f, 0x41, 0x3b, 0xd6, 0x3d, 0x58, 0x51, 0xc3, + 0x70, 0x0a, 0xab, 0x70, 0xcf, 0x42, 0x7d, 0x3f, + 0x3f, 0x9b, 0x3b, 0x6f, 0xbb, 0xb1, 0xa2, 0x16, + 0xba, 0x5d, 0x54, 0x15, 0x60, 0xe1, 0x5f, 0x64, + 0xde, 0xa6, 0xd6, 0x3b, 0x77, 0xbe, 0x59, 0xbc, + 0xe9, 0xc6, 0x92, 0x66, 0x95, 0x17, 0xe3, 0x12, + 0x23, 0xb2, 0xa3, 0x2f, 0x04, 0x98, 0x78, 0x8d, + 0x15, 0x15, 0xdf, 0x0d, 0x7c, 0x8e, 0xb2, 0x89, + 0xa8, 0xc4, 0x8c, 0x33, 0x19, 0x4d, 0x89, 0x7d, + 0x78, 0x03, 0xf0, 0xae, 0x17, 0x4b, 0x44, 0x1c, + 0xf0, 0xea, 0x41, 0xfe, 0x5a, 0x16, 0x18, 0x32, + 0xe4, 0xa7, 0xa7, 0xd6, 0x3b, 0x27, 0x2f, 0x61, + 0x7f, 0xfb, 0xb0, 0xb5, 0x1c, 0xfa, 0xe5, 0xa6, + 0xda, 0x2b, 0xb1, 0x17, 0x72, 0x45, 0xf3, 0xf0, + 0x3b, 0xf2, 0xa6, 0x17, 0x2b, 0x6b, 0x4f, 0xa0, + 0x7f, 0x34, 0xa2, 0x05, 0x15, 0x5a, 0x63, 0x4a, + 0xac, 0x3f, 0xf7, 0xe7, 0x9b, 0x37, 0xdd, 0x58, + 0x69, 0x83, 0x36, 0xb9, 0x5f, 0x79, 0xac, 0x4b, + 0xcc, 0x50, 0x19, 0x49, 0xa5, 0xa5, 0xf4, 0xe5, + 0xd8, 0xef, 0xba, 0xb1, 0x56, 0x66, 0x9f, 0xdf, + 0x70, 0x95, 0x3d, 0x9b, 0xf6, 0xdb, 0x03, 0x2d, + 0xd8, 0xd6, 0x05, 0x6f, 0xcb, 0xd2, 0xcd, 0xc9, + 0xdc, 0x7b, 0xdb, 0x8b, 0x5d, 0x8f, 0x8b, 0x57, + 0x99, 0xce, 0xae, 0xaa, 0xda, 0x78, 0x51, 0x63, + 0xf3, 0x57, 0x6f, 0x9c, 0xb9, 0x33, 0xef, 0xc2, + 0x56, 0xd5, 0x3f, 0xe2, 0x6e, 0xbd, 0x6c, 0x44, + 0xe4, 0x8a, 0x29, 0x19, 0x97, 0x35, 0x16, 0xd6, + 0xe4, 0xce, 0xbb, 0xb0, 0x15, 0x1f, 0x31, 0x7e, + 0x15, 0x56, 0x9f, 0x83, 0x77, 0x87, 0x4c, 0xe6, + 0x85, 0xa2, 0x4c, 0xd8, 0xa3, 0xed, 0x79, 0xa6, + 0xe2, 0xd8, 0x6b, 0xe0, 0xe3, 0xea, 0x58, 0xa7, + 0x69, 0x18, 0x81, 0x66, 0x3f, 0x28, 0x2e, 0xd8, + 0x17, 0xf4, 0xa7, 0x60, 0xeb, 0xbe, 0xa6, 0x5f, + 0xff, 0xe6, 0xcb, 0x3d, 0xf9, 0x8d, 0x29, 0x91, + 0xaf, 0x8b, 0x07, 0x2c, 0x00, 0x79, 0x8c, 0x00, + 0x56, 0xe5, 0x73, 0xd8, 0x11, 0xcd, 0xc1, 0x87, + 0x58, 0x81, 0xa4, 0xd7, 0x00, 0x60, 0x35, 0x00, + 0x4f, 0xd2, 0x4a, 0x8f, 0xa4, 0x0e, 0xae, 0xcf, + 0x6b, 0x2d, 0xbb, 0x2a, 0xae, 0xd7, 0x9f, 0x2f, + 0xa7, 0x72, 0xf7, 0x5f, 0xf2, 0x97, 0xfc, 0x19, + 0xdf, 0x3e, 0xc9, 0x93, 0xea, 0xfa, 0xc7, 0xfc, + 0xd9, 0xf6, 0xe5, 0xed, 0x63, 0x39, 0xf6, 0x97, + 0xfc, 0x57, 0x00, 0xaf, 0x7a, 0xb0, 0x04, 0x25, + 0xf7, 0x46, 0xda, 0xde, 0x18, 0x94, 0x17, 0x62, + 0x1e, 0x0e, 0x91, 0x6b, 0xa8, 0x3c, 0xfb, 0x7c, + 0x34, 0xbf, 0x99, 0xf7, 0x60, 0x23, 0x67, 0x39, + 0x5a, 0xde, 0x44, 0x7d, 0x63, 0x7d, 0xb4, 0x3e, + 0x42, 0x56, 0x1d, 0xc2, 0xf6, 0xec, 0x96, 0x3f, + 0x4b, 0x9e, 0xe9, 0x18, 0xd9, 0x5f, 0x79, 0xdf, + 0x82, 0xd5, 0xe9, 0xc3, 0xc6, 0xde, 0x3d, 0xb9, + 0x77, 0xe2, 0x6e, 0xac, 0xb2, 0xde, 0x60, 0xaf, + 0x33, 0x9e, 0x24, 0x71, 0xcb, 0x29, 0xac, 0xc8, + 0x6a, 0xb4, 0xea, 0xc1, 0x8a, 0x26, 0x2f, 0xe4, + 0xdd, 0x9d, 0xd8, 0xf3, 0xa3, 0xe4, 0xb4, 0xb2, + 0x67, 0x16, 0x9f, 0xe7, 0x4f, 0xde, 0x02, 0xa7, + 0x13, 0xfe, 0xea, 0x5f, 0xf2, 0x0e, 0x4e, 0x46, + 0x4f, 0xfe, 0x04, 0x7c, 0xfe, 0x25, 0xdf, 0x76, + 0x62, 0x81, 0x13, 0x90, 0xe5, 0xa1, 0xad, 0x28, + 0xa4, 0x4d, 0x83, 0xd8, 0xab, 0x60, 0xfb, 0x50, + 0xc7, 0x9b, 0x32, 0xbf, 0x62, 0x2e, 0x0b, 0xcb, + 0x2f, 0xa3, 0x67, 0xcb, 0x5b, 0x1e, 0xcb, 0xe6, + 0xa1, 0x94, 0x49, 0xe0, 0x88, 0x4f, 0x2f, 0x7d, + 0xac, 0x9d, 0xff, 0x2d, 0x64, 0x7d, 0x68, 0xd1, + 0xc6, 0x85, 0x29, 0x75, 0xe7, 0xf9, 0xe5, 0x61, + 0xca, 0x3e, 0x03, 0xa9, 0xfb, 0x67, 0xfa, 0x8c, + 0xfe, 0x2b, 0x8b, 0x53, 0x52, 0xf7, 0x71, 0x16, + 0x19, 0x7c, 0x26, 0x68, 0x1f, 0x7c, 0x0a, 0xc0, + 0x5c, 0xee, 0xe4, 0x76, 0xc5, 0x0f, 0x62, 0xb3, + 0xe2, 0x8c, 0xdd, 0x30, 0x3f, 0x75, 0xab, 0x4e, + 0x53, 0x55, 0x3f, 0xc4, 0x7c, 0xab, 0x7c, 0x40, + 0x2f, 0xe9, 0xaf, 0xa8, 0xbb, 0xad, 0x30, 0x99, + 0xd9, 0xe7, 0xc6, 0x5f, 0xae, 0x8a, 0x27, 0xec, + 0x33, 0xf6, 0x05, 0x7b, 0xcc, 0xaf, 0x72, 0xd5, + 0xa7, 0x77, 0x08, 0x78, 0xaf, 0xe2, 0x7a, 0xbf, + 0xbc, 0x5b, 0xdd, 0xc5, 0x77, 0x5f, 0xde, 0x5d, + 0xef, 0xaf, 0x2a, 0x7f, 0x6a, 0xd5, 0x8a, 0xaa, + 0xde, 0x6f, 0x48, 0xa6, 0x58, 0xd9, 0x36, 0x6b, + 0x48, 0xb1, 0x93, 0xab, 0x48, 0x72, 0x91, 0x5d, + 0xa5, 0x57, 0xec, 0x91, 0xf2, 0xf7, 0x58, 0xad, + 0x93, 0x56, 0xac, 0xf8, 0x84, 0x61, 0x06, 0x8c, + 0x36, 0xa7, 0xf2, 0xbf, 0x09, 0xf6, 0x8c, 0xfd, + 0x2a, 0x76, 0x3a, 0x85, 0x6f, 0xba, 0x32, 0x52, + 0x75, 0x6e, 0xa5, 0xaf, 0xcf, 0x03, 0x51, 0xcc, + 0xf3, 0xf6, 0x58, 0xa7, 0xa8, 0xfd, 0x42, 0x65, + 0xe5, 0x5e, 0x8b, 0x78, 0x12, 0xf3, 0xac, 0x15, + 0xbf, 0x05, 0xf7, 0x2d, 0x4b, 0xae, 0x61, 0xa6, + 0xc6, 0x8a, 0x1a, 0x74, 0x87, 0xad, 0x93, 0x76, + 0xe7, 0x51, 0x71, 0xc2, 0x46, 0xa0, 0xe3, 0xe0, + 0xfd, 0xb9, 0x9f, 0x68, 0xdd, 0xbf, 0x2c, 0x7e, + 0xc7, 0x02, 0x30, 0x2c, 0x11, 0xc0, 0x0a, 0x44, + 0x1a, 0xe2, 0x70, 0x65, 0xf9, 0xab, 0x6c, 0xdd, + 0x83, 0x3d, 0x98, 0x89, 0x88, 0x61, 0x75, 0x7f, + 0x11, 0x2b, 0x6b, 0x16, 0x66, 0x8e, 0x9c, 0x93, + 0x8f, 0xf8, 0x24, 0x1f, 0x8b, 0x37, 0x3d, 0x66, + 0xc9, 0xba, 0xee, 0x93, 0xe7, 0x97, 0xc4, 0x8f, + 0x42, 0x1e, 0xe5, 0x57, 0x98, 0x9d, 0x67, 0x38, + 0x97, 0x94, 0x0d, 0x5d, 0x9d, 0x42, 0xba, 0x42, + 0xd8, 0x65, 0x90, 0x94, 0x3b, 0xbe, 0xe7, 0xad, + 0x4a, 0x14, 0xd6, 0xfa, 0x5c, 0xe0, 0x83, 0x8c, + 0x10, 0xd4, 0xb5, 0x2b, 0x09, 0xc8, 0x8a, 0xfc, + 0xdd, 0xad, 0xba, 0xad, 0x71, 0xf3, 0x04, 0x80, + 0xe0, 0xee, 0xa7, 0xcd, 0x4a, 0x03, 0x57, 0x98, + 0x87, 0xe4, 0x8b, 0x9e, 0x3e, 0x9d, 0xd8, 0xd9, + 0x42, 0x9f, 0xe3, 0xf0, 0xac, 0x1a, 0xe2, 0xa6, + 0xac, 0x6a, 0xa9, 0xe2, 0x4d, 0x4e, 0x36, 0x6a, + 0xd5, 0xce, 0xf4, 0xb9, 0x01, 0xec, 0x30, 0x19, + 0x6b, 0x29, 0xbb, 0xeb, 0x8f, 0x66, 0x3f, 0x4e, + 0xc4, 0x76, 0x82, 0x5b, 0x91, 0x96, 0x66, 0x11, + 0x41, 0xc2, 0xf3, 0xb9, 0xae, 0xcd, 0x80, 0x0e, + 0xe6, 0x3a, 0x1e, 0x71, 0x81, 0x2a, 0xd4, 0x50, + 0x97, 0xf9, 0x00, 0x90, 0x10, 0x72, 0xae, 0xb0, + 0xe8, 0x4f, 0xe6, 0xbd, 0xd8, 0xca, 0x17, 0x09, + 0x2e, 0xbd, 0xf2, 0xb2, 0x1b, 0xd5, 0xd5, 0x4e, + 0xea, 0xb1, 0xdf, 0xf4, 0x61, 0xc5, 0x2a, 0x4a, + 0x7c, 0x27, 0xad, 0xcf, 0xbb, 0x8c, 0xea, 0xfe, + 0x19, 0x8e, 0xf5, 0xde, 0xa2, 0xbc, 0xa3, 0xaf, + 0x22, 0x55, 0xcc, 0x1e, 0x13, 0x33, 0x0a, 0x0a, + 0x8f, 0x54, 0x54, 0x99, 0x34, 0x5e, 0x5a, 0x33, + 0x8a, 0xd0, 0x87, 0x6d, 0x57, 0x9e, 0x65, 0x55, + 0xbe, 0xf6, 0xdc, 0x64, 0xbe, 0xab, 0xeb, 0xc3, + 0x08, 0xe2, 0xae, 0xae, 0x3d, 0x4b, 0xd8, 0x1d, + 0xd5, 0x37, 0x23, 0x42, 0xc2, 0x99, 0x31, 0x0e, + 0xea, 0xc3, 0x02, 0x05, 0x60, 0x23, 0x40, 0x47, + 0x7c, 0x75, 0xc4, 0x00, 0x24, 0xa3, 0xce, 0xae, + 0xe6, 0x01, 0xac, 0x18, 0xbb, 0x6a, 0x3e, 0xed, + 0xc0, 0xca, 0x3e, 0x40, 0x95, 0x07, 0x88, 0x6c, + 0x18, 0x6c, 0x65, 0x6a, 0x50, 0xbd, 0xf9, 0xae, + 0x0f, 0x5b, 0xe5, 0x62, 0xaf, 0x20, 0x76, 0x67, + 0x98, 0x03, 0x55, 0xf1, 0x55, 0xa9, 0x23, 0x28, + 0x80, 0x26, 0xf6, 0x68, 0x96, 0xf2, 0x29, 0xee, + 0x3b, 0x27, 0xad, 0x3d, 0xc2, 0x79, 0x21, 0x11, + 0x10, 0x76, 0x49, 0x45, 0xe2, 0x1a, 0x2b, 0xf4, + 0xbe, 0x44, 0x79, 0x79, 0xca, 0xc9, 0xa1, 0x81, + 0x9d, 0x63, 0x84, 0xd3, 0x8b, 0x25, 0xa8, 0x17, + 0xd2, 0x6f, 0xec, 0x4a, 0xa7, 0x3e, 0x1f, 0xa0, + 0xc6, 0x92, 0x6f, 0x9c, 0x37, 0xbd, 0x58, 0xd3, + 0x6a, 0xf1, 0x19, 0x58, 0x4a, 0x6a, 0xd9, 0x49, + 0x90, 0x2c, 0x3a, 0xa3, 0x53, 0x3a, 0xa1, 0x94, + 0x91, 0xb6, 0x0e, 0x82, 0xe4, 0xdc, 0xce, 0x9f, + 0xf1, 0x25, 0x56, 0x48, 0x12, 0x15, 0xff, 0x46, + 0x46, 0xa7, 0xa6, 0xee, 0x84, 0x57, 0xd1, 0xb1, + 0x96, 0x3a, 0x88, 0x64, 0xdf, 0xf6, 0x62, 0x8d, + 0x1a, 0xf2, 0x18, 0x32, 0x47, 0xe0, 0x58, 0x7d, + 0x6f, 0xc7, 0xed, 0x67, 0x90, 0x7d, 0xd3, 0x44, + 0x47, 0xf0, 0x66, 0x9f, 0x5d, 0xbd, 0xb5, 0xbd, + 0x5e, 0xb3, 0x8f, 0xb1, 0x3b, 0xb6, 0x2d, 0x20, + 0xc1, 0x6a, 0x0a, 0xf2, 0x38, 0x71, 0xb9, 0xcf, + 0xa2, 0xfa, 0x24, 0x9b, 0x2b, 0x2c, 0x95, 0xda, + 0x59, 0x2f, 0x79, 0x18, 0x7f, 0x41, 0x1b, 0xb6, + 0x8e, 0xeb, 0x33, 0x2b, 0xb6, 0x0e, 0x56, 0x1a, + 0x21, 0xaa, 0x1e, 0xb4, 0x2a, 0x65, 0x25, 0x35, + 0xc9, 0x52, 0x93, 0x7a, 0xb0, 0x55, 0xab, 0xbc, + 0x77, 0xac, 0x52, 0xcc, 0x42, 0x57, 0xf3, 0x42, + 0xc3, 0x0e, 0xb2, 0x15, 0xc2, 0xb4, 0x78, 0xd4, + 0x85, 0x8d, 0xd9, 0x2d, 0x40, 0xdc, 0x83, 0xd5, + 0xba, 0xdf, 0x23, 0xcf, 0xbb, 0xb7, 0x7a, 0xc5, + 0x8d, 0xf5, 0x02, 0xd5, 0xbb, 0x3f, 0x91, 0x75, + 0x0f, 0xd6, 0x8e, 0xdc, 0x64, 0x2b, 0xae, 0x2f, + 0x72, 0x6b, 0x62, 0xed, 0xc8, 0xad, 0x81, 0x35, + 0xcf, 0x76, 0x4c, 0xf8, 0x84, 0x4d, 0x20, 0x92, + 0x9e, 0xd2, 0xab, 0xaa, 0x3e, 0xe2, 0x08, 0x4d, + 0xea, 0xc5, 0x42, 0x24, 0xeb, 0x2c, 0xfb, 0xb0, + 0x95, 0xac, 0x56, 0xd6, 0x28, 0xc8, 0xaa, 0xb3, + 0x72, 0x3a, 0xca, 0x15, 0xdd, 0xc3, 0xaa, 0xf6, + 0x99, 0x30, 0x75, 0xee, 0x82, 0xdb, 0x1e, 0xd8, + 0x45, 0xfd, 0x67, 0x34, 0x7e, 0x70, 0x7f, 0xa3, + 0x77, 0x50, 0xc8, 0x4d, 0xc0, 0x3d, 0xf4, 0x32, + 0x07, 0xb2, 0x6f, 0xf2, 0x6a, 0x51, 0x54, 0x5e, + 0xe7, 0x58, 0xe7, 0x38, 0x65, 0xbb, 0x8f, 0x0b, + 0x9e, 0x65, 0xff, 0x88, 0x3b, 0x49, 0x15, 0x99, + 0xd5, 0x31, 0xa3, 0x0b, 0xd6, 0xea, 0xef, 0x31, + 0xd6, 0x4b, 0xea, 0xa8, 0xad, 0x95, 0xb5, 0x85, + 0xb5, 0xb5, 0x5c, 0x34, 0xde, 0xac, 0xed, 0x28, + 0xc9, 0x76, 0x1d, 0xa7, 0x69, 0xe4, 0xc8, 0x6a, + 0x7c, 0x12, 0x1a, 0xb5, 0xde, 0x66, 0xf7, 0x70, + 0x63, 0x78, 0x06, 0xa9, 0x81, 0xb5, 0x6c, 0x59, + 0xd6, 0xdb, 0xee, 0xc3, 0x68, 0x4b, 0xa9, 0xfd, + 0x76, 0x75, 0xee, 0xed, 0x0e, 0x60, 0x4f, 0xf7, + 0xf4, 0xc0, 0x72, 0x4e, 0x3a, 0xf2, 0x7d, 0x91, + 0xed, 0xd3, 0x64, 0x92, 0x9d, 0x59, 0xf2, 0x6c, + 0x96, 0x98, 0xf1, 0xae, 0x63, 0x4d, 0xa5, 0x1c, + 0x6b, 0xc4, 0x93, 0xd6, 0x48, 0x1d, 0xd5, 0x04, + 0xd6, 0xd9, 0x9e, 0x45, 0x7d, 0x6a, 0x43, 0x59, + 0x1f, 0x63, 0xde, 0x02, 0x23, 0x28, 0x37, 0x93, + 0xfb, 0x67, 0x73, 0x72, 0x51, 0xf9, 0xd7, 0xb0, + 0xe8, 0xd0, 0x32, 0xa1, 0x4a, 0x23, 0x5a, 0x25, + 0xa8, 0x0d, 0x5e, 0x55, 0xf2, 0x3c, 0x18, 0x23, + 0x89, 0xc8, 0xbf, 0x10, 0xbd, 0x3f, 0x11, 0x11, + 0xb3, 0xbc, 0x55, 0x71, 0xc3, 0x4e, 0x53, 0x86, + 0x75, 0x26, 0xcd, 0xe7, 0xef, 0xd3, 0xe5, 0x59, + 0x14, 0x68, 0xa7, 0xec, 0xda, 0xcb, 0xe5, 0x60, + 0x2f, 0xdc, 0x38, 0x29, 0x31, 0xd8, 0xe5, 0x19, + 0xae, 0xc6, 0x0f, 0xf7, 0x71, 0x54, 0x5f, 0x63, + 0x79, 0xfb, 0xe4, 0x1e, 0xd2, 0xaa, 0x46, 0x4f, + 0x64, 0xb8, 0xcb, 0x33, 0xdc, 0xc7, 0xe9, 0x5a, + 0x91, 0xe6, 0xd5, 0xf7, 0xe9, 0xe3, 0x88, 0xf5, + 0xc2, 0x9d, 0x5c, 0x51, 0x15, 0x60, 0xd4, 0xfc, + 0xf8, 0x40, 0x97, 0xa7, 0x6c, 0xf6, 0x53, 0x4c, + 0x9a, 0x87, 0x7b, 0x40, 0xb8, 0x0b, 0x10, 0xa9, + 0xe8, 0xd3, 0x86, 0xa0, 0x0d, 0x46, 0xaf, 0x6d, + 0xb8, 0x8f, 0x53, 0xfc, 0x13, 0xeb, 0xc7, 0x7a, + 0x22, 0x8b, 0xb9, 0x88, 0x45, 0xbf, 0x86, 0x5e, + 0xc4, 0x78, 0xb6, 0x4a, 0xd3, 0x3c, 0xdc, 0xa9, + 0x19, 0x93, 0xaf, 0xd8, 0x35, 0x9f, 0x25, 0x08, + 0xa7, 0xd9, 0xb8, 0xf9, 0x66, 0x12, 0xe4, 0xea, + 0xfc, 0x85, 0x7c, 0xcb, 0x72, 0x7f, 0x63, 0x5b, + 0x33, 0xee, 0x71, 0xff, 0x20, 0x2b, 0x3a, 0x2c, + 0xb7, 0x7a, 0xed, 0x85, 0x23, 0x23, 0x76, 0x7e, + 0x92, 0x4b, 0x2d, 0xc1, 0x2e, 0x80, 0x7d, 0xd0, + 0x02, 0x7b, 0xf4, 0x8e, 0x55, 0x89, 0xaa, 0xcf, + 0xb9, 0xa5, 0x90, 0x4b, 0xcb, 0x1e, 0x72, 0x22, + 0xfb, 0x1b, 0xcd, 0x2c, 0x45, 0x9c, 0xb4, 0xc2, + 0x4f, 0x51, 0xf9, 0xd5, 0x55, 0x33, 0xb8, 0xcf, + 0xc7, 0x75, 0x4e, 0xa5, 0x7c, 0xc7, 0xc8, 0xea, + 0x04, 0x04, 0xf9, 0x79, 0xa5, 0xbb, 0xe2, 0xfd, + 0xda, 0xae, 0x08, 0x9a, 0x31, 0xd6, 0x0c, 0x0b, + 0x11, 0x10, 0x24, 0xcd, 0xca, 0x08, 0x31, 0xb2, + 0x3e, 0x80, 0xac, 0xd9, 0x23, 0xf0, 0x63, 0x3f, + 0x3f, 0xc1, 0x18, 0x0a, 0x60, 0x6a, 0xd8, 0x05, + 0x4f, 0xe6, 0x1d, 0x39, 0x76, 0xcf, 0x5d, 0x79, + 0x72, 0x3b, 0xa1, 0x71, 0x33, 0x5a, 0x14, 0xf1, + 0xaf, 0x58, 0x71, 0x70, 0xff, 0x20, 0xb6, 0x79, + 0x45, 0x2b, 0xac, 0xec, 0xfc, 0xd3, 0x7a, 0x87, + 0xfc, 0x54, 0xe6, 0x96, 0xbe, 0xe4, 0x56, 0xbd, + 0x62, 0xab, 0x8e, 0x98, 0x7b, 0xe8, 0x21, 0x65, + 0xaf, 0x2f, 0xb7, 0x69, 0x0e, 0xe8, 0x79, 0x79, + 0x2d, 0xde, 0x2b, 0xed, 0x6c, 0xdc, 0xcc, 0x60, + 0x6b, 0x9e, 0x04, 0x1d, 0x3b, 0xe8, 0x94, 0xa3, + 0xac, 0xda, 0xfd, 0x6c, 0xda, 0xea, 0x88, 0xc1, + 0xfe, 0xe6, 0x53, 0xc5, 0xaf, 0x36, 0xaf, 0x92, + 0xaa, 0x9a, 0xd0, 0xe4, 0x73, 0x26, 0x4f, 0x05, + 0x3e, 0x4c, 0x50, 0x7f, 0x67, 0x5c, 0x4a, 0xa6, + 0x8a, 0x54, 0x47, 0x10, 0x43, 0x38, 0xe8, 0x79, + 0x31, 0x5e, 0x14, 0xe7, 0x5f, 0x27, 0x58, 0x73, + 0x55, 0x19, 0xa1, 0x18, 0x1b, 0x1f, 0x9e, 0x33, + 0x8c, 0x35, 0x70, 0xec, 0x39, 0xf8, 0x2a, 0xdf, + 0x3a, 0x39, 0x82, 0x1a, 0x30, 0x45, 0xab, 0xc1, + 0xaf, 0xf9, 0x4f, 0xc4, 0xd9, 0x8d, 0x8f, 0xb2, + 0xcf, 0xb5, 0x05, 0xee, 0xb4, 0xcf, 0xdf, 0xc3, + 0x7a, 0x87, 0xa5, 0xac, 0xac, 0x28, 0x40, 0x9e, + 0x6c, 0x8e, 0xf8, 0xdf, 0x87, 0xac, 0x37, 0x4a, + 0xd9, 0x26, 0x6f, 0xf4, 0xe8, 0x0d, 0xab, 0xf2, + 0xf4, 0xf7, 0x9f, 0xad, 0x20, 0xea, 0xe2, 0x78, + 0xde, 0x52, 0x9c, 0xb1, 0x84, 0x75, 0x3f, 0xfd, + 0xbd, 0x6d, 0xbd, 0x45, 0x75, 0x38, 0xc7, 0x53, + 0xb0, 0xb6, 0xad, 0x5b, 0xc7, 0x68, 0x37, 0xd9, + 0x41, 0xec, 0x00, 0x58, 0x53, 0xb4, 0xa9, 0x6c, + 0xab, 0x4e, 0xce, 0x7b, 0x12, 0x7f, 0x90, 0x78, + 0x1b, 0x0b, 0x63, 0x53, 0xb6, 0xc7, 0xd3, 0x9c, + 0xdd, 0xb6, 0xdd, 0x3b, 0xca, 0x5c, 0x5e, 0xc1, + 0x12, 0x20, 0xd2, 0xd6, 0x3b, 0x66, 0x3c, 0x4a, + 0xa3, 0xc3, 0xfc, 0xf0, 0x37, 0xfc, 0x71, 0xcb, + 0xb6, 0x7f, 0x9c, 0x3f, 0xfa, 0xff, 0xb7, 0xde, + 0x1f, 0x38, 0x65, 0x31, 0x6c, 0xbd, 0xd7, 0x4c, + 0x76, 0x49, 0xe4, 0x49, 0xf2, 0x3a, 0x83, 0x0a, + 0xbe, 0xb7, 0xf5, 0x6e, 0xf7, 0xf7, 0x61, 0xf7, + 0x8f, 0x2a, 0x6d, 0x33, 0xb0, 0x29, 0x3d, 0x8c, + 0x25, 0xe1, 0xf5, 0x7a, 0xff, 0xe1, 0x7f, 0x50, + 0x1a, 0x6c, 0xd0, 0x31, 0x43, 0x0f, 0xb6, 0x7a, + 0xf3, 0x02, 0xf6, 0xf6, 0x5a, 0xd4, 0xc7, 0xdc, + 0xd8, 0xa5, 0x02, 0x8c, 0xbf, 0x02, 0x51, 0xf3, + 0x3e, 0x92, 0xde, 0x17, 0xe0, 0x9c, 0xdf, 0x6c, + 0x75, 0xd7, 0xaa, 0xca, 0x42, 0x85, 0x8d, 0x17, + 0x90, 0x86, 0x59, 0x53, 0x26, 0x47, 0x74, 0xb2, + 0x26, 0xf7, 0x2d, 0x99, 0x2c, 0x90, 0x8e, 0x19, + 0xe4, 0xcf, 0x8f, 0x28, 0x7e, 0xe2, 0xdd, 0xba, + 0x30, 0x4e, 0x22, 0x8a, 0x79, 0x61, 0x67, 0x0a, + 0xa9, 0x45, 0xe6, 0xfe, 0x0e, 0x9e, 0x2b, 0x60, + 0xa4, 0xc0, 0x73, 0x46, 0x27, 0xd9, 0x99, 0xd4, + 0x62, 0x80, 0x51, 0xea, 0x64, 0xcd, 0xb8, 0x1c, + 0xb5, 0x73, 0x8c, 0x9f, 0x40, 0x75, 0x58, 0x34, + 0xb2, 0xdc, 0x5c, 0xe4, 0x92, 0x3d, 0x3d, 0xeb, + 0x71, 0x69, 0xea, 0xf7, 0x46, 0xd4, 0xc0, 0x3f, + 0x7c, 0xea, 0x40, 0xfe, 0x25, 0x4a, 0x1f, 0x56, + 0xe9, 0xb8, 0x3c, 0x2b, 0x8a, 0xfa, 0x3d, 0xe1, + 0x5a, 0xbb, 0xeb, 0x37, 0xa7, 0x0c, 0x25, 0x35, + 0xed, 0xea, 0xd1, 0xc3, 0x4e, 0xa5, 0x5a, 0x83, + 0x4d, 0x5e, 0x09, 0x0d, 0xef, 0xc5, 0x8a, 0x8e, + 0x36, 0xc8, 0xd4, 0x44, 0x54, 0x3e, 0xed, 0x53, + 0x07, 0x6a, 0xbd, 0xf2, 0xfc, 0xb5, 0xcb, 0x97, + 0x00, 0xd1, 0xb6, 0xd9, 0x49, 0x8f, 0xe2, 0xf9, + 0x8b, 0xf9, 0x0b, 0x3c, 0x5b, 0x32, 0x35, 0xe4, + 0xd9, 0xec, 0xd1, 0x0b, 0x0f, 0xfc, 0x57, 0x9f, + 0x3a, 0x90, 0x67, 0x2f, 0xfb, 0x4e, 0x2c, 0x7c, + 0xe0, 0x4c, 0x42, 0xdf, 0xb9, 0x91, 0xaa, 0x26, + 0x8a, 0xf6, 0xb3, 0x7d, 0x56, 0x6d, 0xb8, 0xbf, + 0x2f, 0xcf, 0xd5, 0x3d, 0x4c, 0xcf, 0xf7, 0x52, + 0xbf, 0xf1, 0xdc, 0xf1, 0xc3, 0xd4, 0x1e, 0xff, + 0xe1, 0x93, 0x03, 0x1a, 0xaa, 0xbc, 0xa6, 0x89, + 0x15, 0x67, 0xca, 0x4c, 0xed, 0xee, 0xd2, 0xe2, + 0xc5, 0xf1, 0x03, 0x58, 0xa3, 0xfe, 0xa1, 0x74, + 0x5c, 0x68, 0x38, 0x73, 0x5b, 0x7f, 0xe3, 0x25, + 0xe7, 0x3d, 0xe3, 0x93, 0x03, 0x48, 0xc1, 0xe1, + 0x51, 0x63, 0xde, 0x33, 0xad, 0xe1, 0xdc, 0xd4, + 0x6e, 0x4b, 0x26, 0xb7, 0xfe, 0xbe, 0x53, 0x26, + 0x73, 0x90, 0x38, 0xf6, 0x88, 0xcd, 0x00, 0xa6, + 0x7c, 0xdd, 0x98, 0x77, 0x5c, 0xc8, 0xba, 0x26, + 0x68, 0x21, 0x7c, 0x5e, 0x16, 0x1f, 0xf3, 0x17, + 0x66, 0x1f, 0xff, 0x97, 0x5c, 0xf0, 0xec, 0xbb, + 0x21, 0xec, 0x7b, 0xd2, 0x3c, 0x3f, 0x69, 0xc2, + 0x7b, 0x32, 0x38, 0xef, 0x30, 0x55, 0xc3, 0xf3, + 0xbe, 0x1b, 0x9e, 0x77, 0x10, 0x3b, 0x38, 0xef, + 0xfb, 0x81, 0x79, 0xdf, 0xbf, 0x6b, 0x8e, 0xf5, + 0x06, 0xa0, 0xf1, 0xe4, 0x3b, 0x80, 0x5e, 0xec, + 0x7b, 0x00, 0x1b, 0x6b, 0xde, 0xbd, 0x6f, 0x71, + 0xd2, 0x9a, 0x09, 0xde, 0x3c, 0x8c, 0x1d, 0x98, + 0x17, 0x56, 0x34, 0x3c, 0xef, 0x00, 0x76, 0x90, + 0x1b, 0xc3, 0x6f, 0x16, 0x74, 0x0d, 0x52, 0x65, + 0xef, 0x82, 0xd7, 0xa0, 0xcb, 0x1e, 0x6b, 0xef, + 0xdf, 0xd0, 0xfe, 0xb6, 0xdf, 0xdc, 0x90, 0xb9, + 0x0f, 0x48, 0xdd, 0xc0, 0xbc, 0x2d, 0xa9, 0x6b, + 0xd0, 0x3c, 0x28, 0x39, 0xf6, 0x9b, 0xff, 0x17, + 0x09, 0x45, 0x3c, 0x28 +}; + +const unsigned char font_889f[] = { + 0x78, 0xda, 0x74, 0xbd, 0x3f, 0x78, 0xdb, 0x46, + 0xb6, 0x36, 0x0e, 0x52, 0xb0, 0x35, 0x94, 0x68, + 0x6b, 0x48, 0x82, 0x22, 0xf5, 0xc7, 0xe2, 0x88, + 0x82, 0x24, 0x88, 0xb2, 0x63, 0xf8, 0xbf, 0xec, + 0x48, 0x24, 0x6c, 0x33, 0x09, 0x64, 0x7b, 0xd7, + 0x88, 0x23, 0x6d, 0xfc, 0xdd, 0x9b, 0xbd, 0xa1, + 0xb3, 0xde, 0xbd, 0xbe, 0xf7, 0xd9, 0xef, 0x5b, + 0xc5, 0xf1, 0xfd, 0x2e, 0x9d, 0xd0, 0x22, 0x0b, + 0x15, 0x28, 0x52, 0xa0, 0x50, 0xe1, 0x62, 0x0b, + 0x16, 0x2a, 0x50, 0xa4, 0x50, 0xb1, 0x85, 0x8b, + 0x2d, 0x54, 0xa4, 0x60, 0x91, 0x42, 0x45, 0x8a, + 0x14, 0x5b, 0xe8, 0xf9, 0x1e, 0x17, 0x2a, 0xb6, + 0x60, 0xe1, 0x62, 0x0a, 0x14, 0xbf, 0x73, 0x66, + 0x00, 0x92, 0x72, 0xee, 0xcf, 0xf3, 0x40, 0x92, + 0x05, 0x91, 0x04, 0x66, 0xce, 0x9c, 0xf3, 0x9e, + 0x73, 0xde, 0x73, 0xa0, 0x28, 0x4d, 0xae, 0xb6, + 0xd4, 0x56, 0xa5, 0xab, 0x7b, 0x38, 0x2a, 0x5d, + 0xfc, 0x9f, 0xda, 0x6a, 0x72, 0x45, 0xfc, 0x1b, + 0x0e, 0xea, 0x6d, 0xbb, 0x7d, 0x9f, 0xdf, 0xf3, + 0x71, 0xdc, 0xe7, 0x76, 0xbb, 0xde, 0x56, 0xda, + 0x63, 0x01, 0x9e, 0x23, 0x4c, 0x0c, 0xbe, 0xcd, + 0xd2, 0x2c, 0x13, 0xa4, 0xd9, 0x2a, 0xd3, 0xf9, + 0x69, 0x36, 0xc2, 0x52, 0x01, 0x13, 0xaf, 0xad, + 0x04, 0x3a, 0x31, 0xc8, 0xa5, 0xe3, 0x25, 0x63, + 0x1e, 0xc7, 0xb1, 0x4e, 0x56, 0xe4, 0x4b, 0xf2, + 0x8a, 0x12, 0x83, 0xd1, 0x84, 0x77, 0x19, 0x3b, + 0xc2, 0x5f, 0x8c, 0x1d, 0x0f, 0x91, 0xa4, 0xf7, + 0xa2, 0xad, 0x5a, 0xc3, 0xe6, 0x4a, 0x12, 0x5e, + 0x6a, 0x56, 0x0e, 0xd3, 0x34, 0xc1, 0x9a, 0xc1, + 0x47, 0x3b, 0x1b, 0x1b, 0x99, 0x4e, 0x91, 0x0c, + 0x1f, 0xdd, 0xb2, 0x62, 0xad, 0xd3, 0x47, 0xf5, + 0x69, 0x45, 0xa1, 0x2d, 0xda, 0xa6, 0xde, 0xcb, + 0x95, 0x5c, 0x27, 0xa5, 0xa4, 0xf8, 0xa4, 0xf5, + 0xc2, 0xca, 0x05, 0xd4, 0xa2, 0xed, 0x0c, 0x5d, + 0x4d, 0xf6, 0xae, 0xca, 0xd9, 0x76, 0xd2, 0x2e, + 0x5c, 0x95, 0x72, 0x99, 0x9f, 0x77, 0x55, 0x77, + 0xc4, 0xa5, 0xbc, 0x86, 0x17, 0xd5, 0x9a, 0xe5, + 0xe3, 0x1e, 0xad, 0xc5, 0xba, 0x67, 0x1f, 0x7c, + 0xc3, 0xa9, 0x95, 0x81, 0x23, 0x17, 0xe4, 0xad, + 0x05, 0xeb, 0x36, 0x5c, 0x8d, 0x6a, 0x35, 0x03, + 0xb8, 0x06, 0x96, 0x32, 0x46, 0x3a, 0xaa, 0x53, + 0xe8, 0x3e, 0x49, 0x16, 0xba, 0x31, 0x25, 0xde, + 0x4a, 0xd6, 0xcc, 0x3c, 0x9e, 0x95, 0xe7, 0xe1, + 0x68, 0x55, 0xb8, 0xee, 0xea, 0xae, 0x51, 0x37, + 0xe1, 0xa3, 0x2a, 0x62, 0xae, 0x54, 0x6b, 0xa2, + 0xfb, 0x7f, 0x59, 0xaa, 0x9b, 0x72, 0x5e, 0xc1, + 0x31, 0xc5, 0xaf, 0xdb, 0x37, 0xf8, 0x23, 0x3b, + 0x13, 0xd0, 0x2a, 0x5d, 0x15, 0xb3, 0xc1, 0xe3, + 0xad, 0x42, 0x37, 0xed, 0x15, 0xba, 0xf1, 0x56, + 0x33, 0x88, 0x29, 0x9a, 0xa7, 0xb9, 0xba, 0x5e, + 0xd5, 0x87, 0x8e, 0xe0, 0x8e, 0x94, 0x0c, 0x4f, + 0x93, 0x26, 0x4f, 0xe3, 0xf7, 0xda, 0xa4, 0xf7, + 0xcd, 0xb1, 0x66, 0xe5, 0x78, 0x1e, 0xae, 0xcc, + 0x54, 0xf0, 0xec, 0x28, 0x1f, 0x21, 0x77, 0x79, + 0x51, 0x99, 0x0b, 0xe2, 0x4e, 0xfc, 0x75, 0xe6, + 0x6d, 0xda, 0x9a, 0xe7, 0xba, 0xf5, 0x30, 0xb0, + 0x70, 0x15, 0x14, 0xc2, 0x89, 0x4b, 0xdc, 0x6d, + 0x77, 0x84, 0x8f, 0xb8, 0x62, 0xf0, 0x74, 0x2b, + 0xad, 0x16, 0xd5, 0xe8, 0x8e, 0x4e, 0x59, 0x63, + 0x47, 0x71, 0x98, 0x4b, 0x98, 0xe7, 0x23, 0xc5, + 0x1a, 0xeb, 0x12, 0xf8, 0x9d, 0x62, 0xc1, 0xe8, + 0xdd, 0x11, 0xde, 0x41, 0xa1, 0x4b, 0xe1, 0x1f, + 0x7c, 0x85, 0xcf, 0x63, 0x8a, 0x25, 0xd7, 0xd7, + 0x9c, 0xb1, 0xe7, 0xdf, 0x6d, 0xb3, 0xe5, 0xa0, + 0xec, 0x94, 0x5e, 0x57, 0x9e, 0xaa, 0xf4, 0xf2, + 0xd3, 0x12, 0x31, 0xcc, 0xdb, 0x07, 0x72, 0x9e, + 0x13, 0xc1, 0xb6, 0x4b, 0xec, 0x69, 0x67, 0x2a, + 0x98, 0x64, 0x06, 0x5b, 0x0a, 0x6c, 0x39, 0xf7, + 0x62, 0xf9, 0x0b, 0x01, 0xac, 0x93, 0x18, 0x39, + 0x2e, 0xbf, 0x33, 0x18, 0x0f, 0x7b, 0x92, 0xd3, + 0x74, 0x88, 0x5b, 0xd9, 0x28, 0x9a, 0x65, 0xaf, + 0xe8, 0x94, 0x1d, 0x32, 0xdd, 0xec, 0x12, 0x8a, + 0x43, 0xcc, 0x46, 0x37, 0x45, 0x5f, 0xb1, 0x14, + 0x4b, 0xf1, 0x94, 0x7b, 0xce, 0x7d, 0xee, 0xa4, + 0x9d, 0x34, 0xd3, 0x9c, 0xac, 0x5b, 0x56, 0x23, + 0xc9, 0xb1, 0x55, 0x5b, 0x3d, 0xcb, 0xd3, 0x6e, + 0xda, 0x2d, 0xb9, 0xd5, 0x7d, 0xb5, 0x45, 0x76, + 0xe8, 0x4e, 0xad, 0x31, 0x38, 0x1b, 0x69, 0x71, + 0x76, 0x15, 0xd6, 0xe9, 0x34, 0xfc, 0x3f, 0x13, + 0xd4, 0x7a, 0x12, 0x5b, 0x86, 0xfb, 0x29, 0xb5, + 0x4a, 0xad, 0x72, 0xcb, 0x68, 0x25, 0x5b, 0x23, + 0xad, 0xb1, 0xd6, 0xd7, 0x2d, 0xa5, 0x2e, 0xcf, + 0x6a, 0xac, 0xe4, 0xd8, 0x76, 0xf9, 0xaf, 0x73, + 0x6f, 0xcb, 0x4a, 0x91, 0x97, 0x5d, 0x03, 0x56, + 0xf9, 0x16, 0xff, 0x0a, 0x5e, 0x0b, 0xb2, 0xa6, + 0x64, 0x95, 0x3f, 0xf2, 0x49, 0x92, 0x01, 0x89, + 0x7e, 0x75, 0x9c, 0x35, 0x26, 0x8c, 0x6b, 0xc7, + 0x57, 0x89, 0x43, 0x28, 0x2c, 0x12, 0xc8, 0x1f, + 0xac, 0xc9, 0x33, 0x6b, 0x2a, 0xa0, 0xed, 0x25, + 0x7d, 0xfb, 0xaf, 0xb4, 0xfb, 0xbf, 0xbc, 0xdf, + 0xb5, 0x37, 0xac, 0x4f, 0xf7, 0xc7, 0x43, 0x99, + 0x9c, 0x61, 0xfa, 0xea, 0x36, 0x2b, 0xc1, 0xa7, + 0x97, 0xe0, 0x7d, 0x55, 0xf7, 0x32, 0x5c, 0xb9, + 0xc1, 0x71, 0x9e, 0x15, 0x4f, 0x71, 0x15, 0x17, + 0xd6, 0xa4, 0x35, 0x03, 0x57, 0x9c, 0xb6, 0x67, + 0x1c, 0x6a, 0x0e, 0xe9, 0xc9, 0x8d, 0xaf, 0xbf, + 0x3f, 0xad, 0xe2, 0xe9, 0x66, 0x20, 0x25, 0x07, + 0x65, 0x27, 0xc1, 0x4e, 0xc1, 0x8a, 0x0d, 0xb5, + 0xce, 0xd4, 0xbe, 0x9e, 0x8e, 0x29, 0xf2, 0x73, + 0x69, 0xbb, 0xd1, 0x4e, 0xd0, 0x51, 0x9e, 0x56, + 0x57, 0x95, 0xcd, 0x6e, 0x86, 0xa6, 0x70, 0xc0, + 0x3a, 0x46, 0x73, 0x75, 0x47, 0xbd, 0xa3, 0xc6, + 0x15, 0x5c, 0x67, 0xd5, 0x1a, 0xb3, 0xc8, 0x41, + 0x8c, 0x9d, 0xa6, 0x2b, 0x04, 0xf7, 0x82, 0xd2, + 0x2a, 0x04, 0x29, 0x58, 0xa9, 0x74, 0x5b, 0xf3, + 0x0a, 0x81, 0xe6, 0xe5, 0x40, 0x0b, 0x2c, 0x76, + 0xad, 0x1d, 0xa5, 0x21, 0xdf, 0x39, 0x17, 0x34, + 0x54, 0xad, 0x2a, 0x76, 0x88, 0xb7, 0xe5, 0xa5, + 0xbc, 0x54, 0x8d, 0x9a, 0xb4, 0x73, 0x03, 0xaf, + 0x0a, 0xe4, 0xe7, 0x3b, 0xbe, 0x4e, 0xed, 0xf6, + 0xc3, 0xa0, 0xae, 0xac, 0x77, 0xd7, 0x29, 0x1e, + 0x2f, 0x69, 0xac, 0xab, 0x0c, 0x7c, 0xee, 0x97, + 0xef, 0xe0, 0x13, 0x5b, 0x43, 0xb5, 0x73, 0x74, + 0xf0, 0x9a, 0x15, 0xa5, 0xcc, 0x8b, 0x6e, 0x99, + 0x97, 0xf9, 0x2c, 0xb9, 0x78, 0x5c, 0x74, 0x61, + 0x2f, 0xd9, 0x8b, 0x1d, 0x3c, 0x50, 0x33, 0x68, + 0xb0, 0x06, 0xcd, 0x20, 0xab, 0x9e, 0xd3, 0x09, + 0xab, 0x04, 0x25, 0xbb, 0x6c, 0x93, 0xee, 0xb6, + 0x07, 0x8a, 0xa4, 0x9a, 0xd8, 0x89, 0xde, 0x79, + 0xa8, 0x75, 0xca, 0x9a, 0x30, 0x9f, 0x24, 0x63, + 0xa1, 0xd4, 0xa2, 0xdc, 0xe2, 0xfb, 0xe2, 0x4f, + 0x69, 0xb8, 0x7b, 0xea, 0xc1, 0x90, 0xff, 0xcc, + 0x71, 0x23, 0x6f, 0x3f, 0xd9, 0xc1, 0x99, 0x24, + 0xb0, 0x8f, 0x88, 0x4d, 0x6d, 0xd8, 0x55, 0xb6, + 0x63, 0xe3, 0xce, 0x87, 0x01, 0x72, 0x99, 0x52, + 0xd2, 0x28, 0x1b, 0x2d, 0x1c, 0x14, 0x66, 0xc4, + 0xa4, 0x8f, 0xe4, 0x1c, 0x82, 0x04, 0x52, 0x0b, + 0xe4, 0x18, 0xcf, 0x5a, 0x38, 0x40, 0xcf, 0xb4, + 0xcc, 0xce, 0xa7, 0x76, 0xc6, 0xc9, 0xa2, 0x74, + 0xd2, 0x94, 0x93, 0x72, 0xc7, 0xf1, 0x9d, 0xad, + 0xd1, 0x2e, 0xf1, 0xe0, 0xac, 0x72, 0xa5, 0xfb, + 0x88, 0x66, 0xba, 0x94, 0xc1, 0x3e, 0x66, 0xf0, + 0x4a, 0x46, 0x99, 0xdc, 0xfb, 0x8c, 0x14, 0xed, + 0xa2, 0x0d, 0x77, 0x0b, 0x5f, 0x2b, 0xbc, 0x68, + 0xeb, 0xb6, 0x61, 0x4b, 0xbd, 0x21, 0xef, 0x28, + 0xa6, 0x54, 0xba, 0x31, 0x5a, 0xe9, 0xce, 0x82, + 0xd6, 0x9c, 0x53, 0xe3, 0x3b, 0xea, 0xe3, 0xbc, + 0x59, 0x13, 0x9a, 0xb0, 0x70, 0x20, 0xef, 0x18, + 0x67, 0x4f, 0xae, 0xe2, 0x98, 0x45, 0x0f, 0x86, + 0xcc, 0x55, 0x5c, 0x41, 0x47, 0xb1, 0xe1, 0x53, + 0xac, 0x42, 0x27, 0x6d, 0x17, 0x3a, 0xda, 0xa1, + 0xb6, 0x5f, 0x30, 0x53, 0x7a, 0xf1, 0xe7, 0xf3, + 0xdf, 0x5b, 0xb8, 0x46, 0xa4, 0x42, 0x66, 0xe1, + 0x60, 0x41, 0x99, 0x30, 0xbb, 0x62, 0xe8, 0xc6, + 0x07, 0xe4, 0x02, 0xb9, 0x46, 0xaa, 0x24, 0x09, + 0xf3, 0x8c, 0x73, 0x94, 0x62, 0x13, 0xc1, 0x0d, + 0x76, 0x8d, 0x5d, 0xe2, 0x9f, 0xca, 0xdd, 0x86, + 0x5f, 0x03, 0x29, 0x39, 0x15, 0x8e, 0xba, 0x41, + 0x6a, 0x68, 0x79, 0xcc, 0x13, 0x7d, 0x47, 0xea, + 0x2b, 0x85, 0x56, 0xe8, 0x2c, 0xad, 0x04, 0x1f, + 0x78, 0xcc, 0xa9, 0x38, 0xbf, 0xa3, 0xf3, 0xf4, + 0x37, 0xa6, 0xea, 0xea, 0x7b, 0xba, 0x7e, 0x17, + 0xcf, 0x0e, 0xbc, 0x26, 0xae, 0x0c, 0xf3, 0x09, + 0xe3, 0x2b, 0x3b, 0xe9, 0x5e, 0x22, 0xa7, 0xa9, + 0x72, 0xd4, 0xd3, 0x1b, 0x35, 0xe2, 0x4c, 0xbb, + 0xa0, 0x37, 0xc8, 0x12, 0xec, 0xa6, 0xf5, 0x63, + 0x82, 0xff, 0xf2, 0xb8, 0xcb, 0x12, 0x30, 0x2a, + 0xa0, 0xaf, 0xe2, 0xd6, 0x70, 0x57, 0xa5, 0x63, + 0x01, 0x51, 0xb3, 0xd5, 0xcb, 0x7b, 0xf7, 0xf6, + 0xf0, 0x2c, 0x6a, 0xa9, 0x14, 0x95, 0x07, 0xee, + 0x8b, 0x04, 0x25, 0x1e, 0x69, 0x8f, 0x5a, 0x49, + 0x73, 0x2b, 0x79, 0xf2, 0x2c, 0xea, 0x34, 0xa9, + 0xdd, 0xe2, 0x70, 0xd6, 0x84, 0xb9, 0x82, 0xef, + 0xf5, 0x15, 0x37, 0xe1, 0x10, 0xb6, 0x6d, 0x25, + 0xda, 0xd3, 0xab, 0x93, 0xd5, 0x92, 0xbf, 0x9e, + 0x07, 0x8d, 0x53, 0x1b, 0x6d, 0xc1, 0x55, 0xd9, + 0xc4, 0x1e, 0xf1, 0x9e, 0x07, 0x59, 0x8f, 0x78, + 0x1a, 0xdf, 0xf6, 0x46, 0xbc, 0xf3, 0xbc, 0xe4, + 0x95, 0x3c, 0x3b, 0x20, 0x42, 0x6f, 0x24, 0xf8, + 0x88, 0xfd, 0x4d, 0xa0, 0x29, 0x49, 0xd0, 0x2a, + 0xdb, 0x9c, 0x50, 0x3c, 0xbb, 0x1c, 0xd8, 0x42, + 0x5f, 0xe1, 0xfa, 0xc2, 0x3c, 0x8b, 0x43, 0xea, + 0xd1, 0xe8, 0x40, 0xcd, 0x20, 0x34, 0x6c, 0x4d, + 0xae, 0x22, 0x4a, 0xed, 0x57, 0x49, 0xbc, 0x32, + 0xdc, 0x15, 0xab, 0x54, 0xae, 0xbe, 0x5c, 0xff, + 0x21, 0xa2, 0xba, 0xd3, 0xde, 0xd3, 0x1a, 0x5c, + 0x35, 0x3b, 0xe5, 0x9d, 0x26, 0x2b, 0x62, 0xef, + 0xaf, 0x05, 0x31, 0x1d, 0xce, 0xea, 0x6b, 0xb0, + 0x12, 0xab, 0x5c, 0x11, 0xfa, 0x4c, 0xe7, 0xab, + 0xae, 0xf2, 0x1a, 0xf7, 0xe0, 0x5c, 0x97, 0x82, + 0xd4, 0xc5, 0x40, 0x72, 0xbe, 0x06, 0x99, 0xc3, + 0xf5, 0x83, 0x9d, 0xca, 0x16, 0x18, 0x6a, 0x7e, + 0x3c, 0x9b, 0x76, 0x32, 0xdd, 0xb1, 0x20, 0x4e, + 0xbf, 0xe9, 0xa6, 0x41, 0x2a, 0xf1, 0x98, 0xa2, + 0x0b, 0x44, 0x9c, 0x85, 0x6b, 0x2e, 0x2a, 0x45, + 0x65, 0xb1, 0xab, 0x83, 0x16, 0x84, 0x6b, 0xb7, + 0x66, 0x59, 0x91, 0x9e, 0x07, 0x71, 0xad, 0x04, + 0xd2, 0x2e, 0xe0, 0x90, 0x73, 0x28, 0x6d, 0x04, + 0xca, 0x3f, 0xb5, 0x98, 0xd5, 0x97, 0xd8, 0xb8, + 0x35, 0x69, 0xa9, 0xde, 0x10, 0xac, 0x54, 0xf2, + 0x20, 0x05, 0x3a, 0x25, 0x4f, 0x6a, 0x38, 0x59, + 0x16, 0x75, 0x70, 0x8f, 0x51, 0xab, 0xd9, 0x49, + 0x77, 0xd2, 0x7e, 0xc6, 0x1f, 0x37, 0xf3, 0xbb, + 0x7f, 0xb8, 0x9a, 0x7c, 0xa0, 0xf4, 0xf6, 0x6f, + 0x9c, 0xa9, 0x5b, 0x15, 0xb7, 0x2f, 0x25, 0x42, + 0x2f, 0x83, 0x82, 0x56, 0x15, 0xb5, 0xde, 0xec, + 0x80, 0x4a, 0x75, 0x0a, 0xb5, 0x94, 0x53, 0xb1, + 0x3f, 0xad, 0x16, 0xaa, 0xa9, 0xa7, 0xa9, 0xc7, + 0x29, 0x2b, 0x83, 0x9f, 0xeb, 0xbc, 0x72, 0xd2, + 0xcf, 0xc6, 0x7f, 0x49, 0x39, 0xb7, 0x8e, 0x2f, + 0xbe, 0x78, 0xe6, 0x80, 0x16, 0x37, 0x3e, 0x34, + 0xe2, 0xbb, 0xea, 0x79, 0xf2, 0xa3, 0x72, 0xe2, + 0x5f, 0x33, 0x50, 0xde, 0xfb, 0x17, 0x5d, 0xb3, + 0x94, 0x9b, 0xaa, 0x5a, 0x7d, 0x3a, 0xdc, 0x82, + 0x4f, 0x23, 0x2a, 0x19, 0x82, 0x35, 0xd3, 0x41, + 0x6b, 0xa4, 0xd9, 0x58, 0x70, 0x87, 0x15, 0x99, + 0x4e, 0xc7, 0x78, 0x76, 0x23, 0xeb, 0xcc, 0xc3, + 0xf8, 0x52, 0x58, 0x58, 0xa5, 0xc5, 0xba, 0x29, + 0x96, 0xb6, 0x86, 0x79, 0xdc, 0x7e, 0x8e, 0x7a, + 0xe3, 0x80, 0x1e, 0xa4, 0xaa, 0x93, 0xab, 0x0b, + 0x0a, 0xce, 0x64, 0x3c, 0x3f, 0xf6, 0xf6, 0x56, + 0x35, 0x61, 0x24, 0xcc, 0x6d, 0x65, 0xa2, 0x7e, + 0xce, 0x5e, 0xb6, 0x97, 0xeb, 0xeb, 0x76, 0xc2, + 0x4e, 0xd4, 0x13, 0x4a, 0xdf, 0xc2, 0x9e, 0xb2, + 0x66, 0x95, 0x54, 0x90, 0xb2, 0xe3, 0x8e, 0x6a, + 0xe5, 0xdb, 0x4f, 0xe8, 0x69, 0x92, 0x57, 0xfb, + 0x67, 0x51, 0x6a, 0xa2, 0x2b, 0x94, 0x63, 0x48, + 0x58, 0xf6, 0x04, 0x9f, 0x01, 0x4d, 0xd1, 0xe4, + 0xcb, 0xac, 0xc2, 0x4b, 0x76, 0xe5, 0x99, 0xfa, + 0xcb, 0xe5, 0x5f, 0x96, 0x9f, 0x19, 0xf6, 0xed, + 0x7d, 0xf8, 0x5c, 0x98, 0x7f, 0xd5, 0x24, 0xcf, + 0x9a, 0x3b, 0x12, 0xb1, 0x49, 0xed, 0x45, 0x77, + 0xd8, 0x8e, 0xd5, 0xc0, 0xfb, 0x3d, 0xad, 0xac, + 0x70, 0xe6, 0x32, 0xb7, 0xec, 0x32, 0x37, 0xfc, + 0xde, 0x45, 0x8d, 0x0f, 0x03, 0xfe, 0x0d, 0xf1, + 0x6f, 0xed, 0x7b, 0x30, 0x00, 0xd9, 0xe1, 0x77, + 0xff, 0xde, 0xeb, 0xef, 0xf2, 0x71, 0x31, 0x17, + 0xfd, 0xfd, 0x7b, 0x52, 0x96, 0x0b, 0xdd, 0xd3, + 0xb5, 0x15, 0xb1, 0x07, 0x9b, 0xfc, 0x0e, 0xc1, + 0x21, 0xbf, 0x7f, 0x44, 0x6c, 0xd7, 0x79, 0x86, + 0xe2, 0x81, 0x98, 0x91, 0x02, 0x22, 0x4b, 0xd9, + 0x29, 0xfb, 0x95, 0x3d, 0xcf, 0xe7, 0xed, 0x79, + 0xfb, 0xe5, 0xb3, 0xf5, 0xd7, 0x67, 0x5e, 0x67, + 0xc9, 0xac, 0xb4, 0x74, 0xb4, 0x49, 0x63, 0x30, + 0x2a, 0xa8, 0x18, 0xe1, 0x6b, 0x2c, 0x1c, 0x71, + 0x3a, 0x4d, 0xa5, 0x8e, 0xd5, 0x40, 0xa6, 0x96, + 0x82, 0xed, 0xbd, 0x39, 0xa3, 0x0c, 0x6b, 0x51, + 0xae, 0x19, 0x8e, 0xee, 0x7d, 0x48, 0xbe, 0x82, + 0xb9, 0xa2, 0x49, 0xf2, 0x62, 0x6c, 0xa7, 0xea, + 0x16, 0x9d, 0xe2, 0xca, 0xd0, 0x01, 0xea, 0xee, + 0x0c, 0x67, 0x20, 0x8f, 0x12, 0x05, 0xa1, 0x2e, + 0x9e, 0x71, 0xd2, 0x5e, 0x0a, 0x50, 0x1b, 0x35, + 0x73, 0x87, 0x9a, 0x83, 0xc7, 0xe2, 0xcf, 0xfa, + 0x46, 0xf5, 0xa7, 0x08, 0xd7, 0xad, 0xb6, 0x17, + 0xbb, 0xe7, 0x93, 0x97, 0xba, 0x06, 0x03, 0xf4, + 0xa4, 0x2c, 0x06, 0x2b, 0xed, 0x59, 0x73, 0xae, + 0x83, 0x12, 0xbb, 0x6a, 0x2d, 0x06, 0x25, 0xf5, + 0xb2, 0xba, 0x2c, 0x7e, 0xaf, 0xb7, 0xf5, 0xf6, + 0x4d, 0x36, 0xab, 0x17, 0x75, 0x7d, 0x5a, 0x9e, + 0xd5, 0xdb, 0x4b, 0xf4, 0xf2, 0xb1, 0xa1, 0xce, + 0x77, 0x75, 0x06, 0x07, 0xec, 0x11, 0x06, 0xaf, + 0x5d, 0xc4, 0xd7, 0xe6, 0x2b, 0x6f, 0x17, 0xaa, + 0x4b, 0xc6, 0x25, 0x6e, 0x10, 0x78, 0x57, 0x3c, + 0xac, 0x5b, 0x7e, 0x71, 0x4f, 0xdf, 0x65, 0x5b, + 0x12, 0x8d, 0x34, 0xdd, 0x22, 0xd7, 0x60, 0xce, + 0xe4, 0xde, 0x0d, 0xf7, 0x6f, 0x67, 0x48, 0x15, + 0xc0, 0x8e, 0xd6, 0xa9, 0x4d, 0x1f, 0x82, 0x1e, + 0x01, 0x4b, 0xea, 0xc1, 0x80, 0xff, 0xe3, 0x6f, + 0x15, 0x53, 0xac, 0xaf, 0x22, 0xf4, 0x3d, 0xec, + 0x0a, 0xa2, 0x8c, 0x75, 0xf3, 0x34, 0x4f, 0x0d, + 0xf8, 0xeb, 0xb1, 0x01, 0x0b, 0x8b, 0x9b, 0xf3, + 0x7f, 0x92, 0x1c, 0xd8, 0x9b, 0x11, 0xb2, 0x3e, + 0x82, 0xd7, 0x82, 0x0e, 0x1b, 0xe3, 0x4b, 0xb6, + 0xee, 0xeb, 0xc4, 0x32, 0xe5, 0x0a, 0xc6, 0x49, + 0x9c, 0x14, 0x01, 0x6b, 0xa4, 0xed, 0x38, 0x39, + 0x9d, 0x9f, 0x7c, 0xf6, 0x07, 0x17, 0x7f, 0x73, + 0x5a, 0xac, 0xef, 0x9c, 0xb0, 0x8c, 0x8a, 0x35, + 0x1c, 0x6c, 0x59, 0x34, 0x1c, 0xf9, 0x03, 0x29, + 0xed, 0x4a, 0xf8, 0x49, 0x15, 0x78, 0x3f, 0x44, + 0xf5, 0xb3, 0x24, 0xfa, 0x3e, 0x9b, 0xc7, 0x6b, + 0x4e, 0x2a, 0x26, 0xd8, 0xf6, 0xfe, 0x28, 0xbb, + 0x4f, 0xbb, 0xaa, 0x90, 0x4c, 0xd8, 0x65, 0x4c, + 0xb3, 0xf2, 0x1c, 0x71, 0x2a, 0xe0, 0x2a, 0x5e, + 0x0e, 0x6e, 0xb5, 0x26, 0x83, 0x0f, 0x36, 0xd6, + 0x7f, 0x48, 0x54, 0x47, 0x84, 0x47, 0x00, 0xfb, + 0x72, 0xc7, 0xae, 0x4f, 0x74, 0x13, 0x60, 0x07, + 0x13, 0xb4, 0x09, 0x47, 0xb6, 0xab, 0xed, 0xcd, + 0xea, 0x1f, 0x4f, 0x0b, 0xdd, 0x8e, 0x36, 0x41, + 0x0c, 0xd0, 0x4a, 0x2c, 0x1a, 0xe1, 0x4e, 0xf7, + 0xb6, 0x3d, 0xda, 0x86, 0xfd, 0xc5, 0x2a, 0xb0, + 0xb6, 0x7f, 0x64, 0xf3, 0xf0, 0x75, 0x9e, 0xad, + 0xb1, 0x58, 0x20, 0xe7, 0x4a, 0xec, 0x85, 0xd0, + 0x31, 0x28, 0xf7, 0x7e, 0x92, 0xf6, 0x17, 0xd0, + 0x75, 0x77, 0x84, 0xde, 0xe9, 0x16, 0xbd, 0xa2, + 0x37, 0xcc, 0x35, 0x92, 0x05, 0x64, 0x87, 0xde, + 0x4a, 0x95, 0x54, 0xf3, 0x02, 0x23, 0xf1, 0xad, + 0xd6, 0xe7, 0xc1, 0x06, 0xff, 0xdc, 0xdd, 0xa8, + 0x6f, 0xb4, 0x7f, 0xe7, 0xff, 0x97, 0x9f, 0xd8, + 0x27, 0xed, 0x5c, 0xa8, 0x61, 0x62, 0x7c, 0x8d, + 0xcc, 0xc3, 0xaa, 0xcf, 0xf7, 0xbe, 0xae, 0x71, + 0xc5, 0x03, 0x6f, 0x06, 0xd6, 0x37, 0xed, 0xbd, + 0x0a, 0x6e, 0xbd, 0xd9, 0xfc, 0x59, 0xa2, 0xfe, + 0x32, 0x9d, 0x0b, 0xca, 0x5e, 0xd9, 0xd1, 0x9d, + 0x32, 0xad, 0x45, 0x76, 0xc1, 0x12, 0x16, 0x3a, + 0x60, 0xe4, 0x03, 0x9b, 0x19, 0x15, 0x61, 0x9f, + 0x37, 0x85, 0x75, 0x46, 0xc9, 0x99, 0x01, 0x49, + 0xd9, 0x76, 0x97, 0x83, 0xca, 0x06, 0xe0, 0x6f, + 0x45, 0xe5, 0x97, 0x9d, 0x12, 0x33, 0x0e, 0xef, + 0x26, 0x05, 0x36, 0xb3, 0x53, 0x9c, 0x3a, 0x0d, + 0x07, 0xa4, 0x95, 0xe9, 0x07, 0xf5, 0xd7, 0xeb, + 0x47, 0x67, 0x5b, 0x5a, 0xb8, 0xf7, 0xd1, 0xf3, + 0x62, 0xca, 0xc5, 0xfa, 0x92, 0x73, 0xd1, 0x81, + 0x23, 0x30, 0xcc, 0x92, 0xb9, 0xe4, 0x2c, 0x6f, + 0x3c, 0xd8, 0xbd, 0x84, 0xaf, 0x75, 0x88, 0x3d, + 0x16, 0x58, 0xd6, 0x1c, 0xa0, 0x90, 0xb8, 0x0d, + 0x9e, 0x85, 0x3d, 0x02, 0x3a, 0x2d, 0x0d, 0xb8, + 0xa4, 0xf8, 0x58, 0x4c, 0xc7, 0xd1, 0x18, 0x4b, + 0xf4, 0x07, 0x4d, 0xc0, 0x9e, 0x4a, 0x1d, 0x7f, + 0x60, 0x08, 0x44, 0x11, 0x22, 0x37, 0x3c, 0x18, + 0x60, 0xb7, 0x59, 0xb2, 0xd8, 0x41, 0x0c, 0x17, + 0xfa, 0x74, 0x54, 0x69, 0x03, 0x32, 0x17, 0xde, + 0xe2, 0xfd, 0x95, 0xfb, 0x1c, 0xbc, 0x45, 0xc0, + 0x7d, 0xf0, 0x5b, 0x4f, 0x31, 0xa5, 0x75, 0x8e, + 0xb4, 0xb3, 0x90, 0x54, 0x0b, 0xd6, 0x92, 0xa2, + 0x1d, 0x50, 0xd0, 0x6a, 0xc0, 0xbe, 0xd3, 0xaa, + 0x85, 0x77, 0x8a, 0x35, 0xc4, 0x9f, 0x8b, 0xeb, + 0x91, 0x9e, 0xd9, 0x79, 0xeb, 0x6e, 0x20, 0x5f, + 0x8b, 0xf2, 0x71, 0x5b, 0x7d, 0xf9, 0xe2, 0xdc, + 0x8a, 0x12, 0x6a, 0x71, 0xb0, 0x22, 0xdd, 0x0a, + 0xe9, 0x6b, 0x51, 0x92, 0x1f, 0x3d, 0x42, 0x59, + 0xbd, 0x11, 0x38, 0x96, 0xd4, 0x0f, 0x02, 0xb9, + 0x29, 0x67, 0x82, 0xb4, 0x5d, 0xb2, 0xed, 0x7a, + 0x19, 0xee, 0xb1, 0x5c, 0x87, 0xe3, 0x81, 0x5e, + 0x5f, 0x74, 0x6f, 0x09, 0x6b, 0x75, 0x16, 0x77, + 0x28, 0xf9, 0xbd, 0xfd, 0x2f, 0xf6, 0x05, 0xe7, + 0x91, 0x53, 0x30, 0x2f, 0xb3, 0x7f, 0x33, 0xd3, + 0xce, 0x8c, 0x9d, 0x76, 0x0b, 0xb8, 0x82, 0xc2, + 0x07, 0xb5, 0xd4, 0x87, 0x6f, 0xe5, 0x5e, 0x8a, + 0xbf, 0x87, 0x37, 0xfb, 0xb3, 0x81, 0x47, 0xd6, + 0x81, 0xab, 0x60, 0x63, 0x56, 0xec, 0xa8, 0x8c, + 0x92, 0x43, 0x0b, 0x80, 0x20, 0x0b, 0x2c, 0x65, + 0x17, 0x88, 0x4a, 0x9b, 0x5e, 0x4a, 0x2f, 0xa8, + 0x59, 0x02, 0x3e, 0x9f, 0x97, 0x64, 0x12, 0x3f, + 0xd7, 0x2d, 0xa9, 0x7d, 0xbf, 0xb5, 0x41, 0x03, + 0x58, 0xe8, 0x59, 0x83, 0x26, 0x14, 0x92, 0x13, + 0x13, 0x48, 0x46, 0x62, 0x19, 0xf8, 0xca, 0x71, + 0x66, 0x95, 0x83, 0xa1, 0xea, 0xea, 0x55, 0xd8, + 0x60, 0x78, 0x55, 0xe1, 0x75, 0xdd, 0x56, 0x4f, + 0xa2, 0x61, 0x44, 0xd7, 0x43, 0x28, 0xb3, 0xca, + 0x98, 0x12, 0x23, 0x31, 0xb7, 0xe9, 0x9d, 0xaa, + 0x9d, 0xb2, 0x12, 0x80, 0x54, 0xf1, 0x2c, 0x6a, + 0x06, 0x7a, 0x00, 0x77, 0xa2, 0xdc, 0x3d, 0x60, + 0x36, 0xb3, 0x87, 0xbb, 0xf4, 0x08, 0xd6, 0xd6, + 0x01, 0x34, 0x5a, 0xb5, 0x2c, 0xeb, 0x00, 0xe5, + 0x0a, 0x90, 0x2c, 0xbf, 0x03, 0xf3, 0x34, 0xc7, + 0x51, 0x36, 0x00, 0x15, 0x99, 0xa0, 0xa8, 0x7f, + 0x5e, 0x4c, 0x32, 0xbc, 0x2a, 0xd0, 0xd4, 0xcd, + 0x00, 0xd0, 0x35, 0xcc, 0xec, 0x36, 0x68, 0x0e, + 0xb4, 0xf1, 0xd3, 0xb5, 0x5a, 0x28, 0xed, 0xb0, + 0x2a, 0x07, 0xc2, 0xc3, 0xe0, 0x49, 0x37, 0x03, + 0xba, 0xe5, 0xc1, 0x96, 0xf4, 0x59, 0xe4, 0x0e, + 0x65, 0xca, 0x7c, 0xb0, 0xc2, 0x8a, 0xd6, 0x34, + 0x8f, 0x83, 0x0e, 0x04, 0xff, 0x8c, 0xe7, 0xdd, + 0x69, 0x0e, 0xbe, 0x96, 0x3b, 0xaa, 0xf6, 0xcf, + 0xce, 0x80, 0x96, 0x2c, 0xc3, 0xd1, 0x84, 0xf7, + 0x28, 0x89, 0xb3, 0x53, 0x03, 0x56, 0x32, 0x9a, + 0x95, 0x14, 0x45, 0x8f, 0x08, 0xec, 0xa8, 0x40, + 0xc8, 0x29, 0x25, 0xf7, 0xa6, 0xd8, 0x7a, 0x78, + 0x40, 0x1a, 0x39, 0x4f, 0xf3, 0x6e, 0x78, 0x9f, + 0xd2, 0x9c, 0x97, 0xa5, 0x85, 0x43, 0xf8, 0x3b, + 0x53, 0x68, 0x6f, 0xa6, 0xb0, 0xed, 0x23, 0xc5, + 0x58, 0x35, 0x62, 0xdd, 0xd5, 0x2d, 0x65, 0x7f, + 0xd5, 0x9f, 0x37, 0x16, 0x74, 0xf8, 0x2d, 0xe0, + 0x0d, 0xf0, 0x14, 0x6d, 0xcd, 0x49, 0xc3, 0xea, + 0x7d, 0x81, 0x3e, 0x23, 0x27, 0x4e, 0xc9, 0x99, + 0xf6, 0xf2, 0xbb, 0x63, 0xda, 0xf3, 0xa4, 0x9c, + 0x8d, 0xb1, 0xe0, 0xb6, 0x35, 0x0b, 0x32, 0x13, + 0xf7, 0xc7, 0x5f, 0x4f, 0x81, 0x1f, 0x5a, 0x64, + 0x45, 0xe7, 0x8e, 0x7b, 0x57, 0x95, 0xde, 0xd3, + 0x58, 0x60, 0x2b, 0x4b, 0x47, 0x4b, 0x7a, 0x42, + 0x9f, 0x9c, 0xbe, 0x08, 0xfe, 0x0f, 0x6d, 0x53, + 0x6b, 0x76, 0xff, 0xb7, 0xc2, 0xe3, 0x03, 0xed, + 0x64, 0xa1, 0xcf, 0x4d, 0x18, 0x4a, 0x4b, 0xc9, + 0xbf, 0xb7, 0x37, 0xd2, 0x1e, 0x69, 0x47, 0xc8, + 0xa4, 0xc2, 0x0d, 0x17, 0xbd, 0xcb, 0x32, 0x37, + 0xda, 0xe5, 0x76, 0xbc, 0x8d, 0x58, 0x73, 0x19, + 0x6c, 0xe9, 0xa4, 0x8a, 0xb6, 0x0c, 0xb0, 0x79, + 0x7b, 0x8a, 0x5f, 0x27, 0xd7, 0xc9, 0x15, 0xee, + 0xb4, 0x41, 0xb3, 0x01, 0x2e, 0x4f, 0xeb, 0x9a, + 0x9e, 0x17, 0x9a, 0x70, 0x0d, 0xf0, 0x5e, 0x13, + 0x8e, 0x35, 0xb0, 0xe7, 0x6b, 0x7c, 0xc8, 0x58, + 0xeb, 0xcc, 0x1b, 0xfa, 0x31, 0xf8, 0x03, 0xa6, + 0x40, 0xd7, 0x46, 0x59, 0x4f, 0x04, 0x20, 0x1f, + 0x46, 0xc2, 0x58, 0x32, 0x41, 0x03, 0xec, 0x7e, + 0x78, 0xde, 0xa8, 0x7e, 0x1c, 0x6a, 0xef, 0x06, + 0xaf, 0xba, 0xf2, 0xb0, 0xed, 0xaa, 0xfb, 0xb0, + 0x63, 0xdb, 0x0f, 0x3b, 0x55, 0xd7, 0xf6, 0x9d, + 0xba, 0xf0, 0x8f, 0x02, 0x62, 0x35, 0x79, 0x82, + 0x9c, 0xe3, 0x53, 0x64, 0x8a, 0x2f, 0x91, 0x25, + 0x7e, 0xdf, 0x23, 0xb5, 0xc4, 0xfe, 0xd9, 0x64, + 0x4f, 0xab, 0x18, 0x4b, 0xfa, 0x45, 0xc6, 0x82, + 0x8b, 0x6c, 0x89, 0xc1, 0xb1, 0x05, 0xef, 0xef, + 0xde, 0x57, 0x23, 0x0c, 0x1c, 0x8d, 0x4a, 0x4f, + 0xc7, 0x4a, 0xcd, 0x20, 0xcf, 0xa2, 0xbe, 0xa8, + 0x70, 0xe1, 0xe9, 0x1d, 0xcf, 0xf9, 0x17, 0xec, + 0x59, 0xa3, 0x12, 0xe2, 0x0d, 0x8c, 0xd3, 0xa4, + 0x79, 0xe8, 0xb3, 0xf3, 0x71, 0x36, 0x15, 0x7c, + 0x75, 0x18, 0x37, 0xe3, 0x9d, 0xa1, 0xa0, 0x87, + 0x18, 0x85, 0xff, 0xd3, 0xc7, 0xf7, 0x31, 0x35, + 0xa6, 0x2a, 0x81, 0x12, 0x5a, 0x41, 0xdc, 0x9f, + 0x12, 0xb3, 0xc4, 0x84, 0x87, 0x74, 0xb6, 0x35, + 0x74, 0xb0, 0x2a, 0x74, 0x4e, 0x7d, 0x1a, 0x74, + 0x02, 0x80, 0x8d, 0x35, 0x76, 0x6a, 0x05, 0xac, + 0x02, 0xcb, 0xc2, 0x7b, 0xe7, 0x15, 0x69, 0xcb, + 0x40, 0xc7, 0x2a, 0x05, 0x9e, 0x02, 0x3f, 0xfc, + 0xe3, 0x7d, 0x75, 0x27, 0xdf, 0x78, 0x72, 0x32, + 0x26, 0x83, 0x1a, 0x24, 0x68, 0xb4, 0x53, 0x0e, + 0xf8, 0x56, 0xa0, 0x41, 0xae, 0x60, 0x34, 0x07, + 0x2d, 0x63, 0xd5, 0x5c, 0x85, 0xb3, 0xe0, 0xf5, + 0x67, 0x3a, 0xdb, 0x76, 0x8a, 0xc2, 0xef, 0xc0, + 0x67, 0xfc, 0x1a, 0x70, 0x4f, 0xda, 0xd3, 0x6a, + 0xf9, 0xee, 0x15, 0x94, 0x1c, 0xb8, 0x96, 0x04, + 0xbb, 0xcd, 0x66, 0x69, 0x11, 0x76, 0x74, 0xee, + 0x1d, 0xa0, 0x4b, 0xf8, 0xa9, 0x48, 0xef, 0x76, + 0x2d, 0x25, 0x92, 0xab, 0xaa, 0x7a, 0x11, 0xf0, + 0xcb, 0x90, 0xd0, 0x74, 0x69, 0xd8, 0x6f, 0xcc, + 0xbb, 0x4b, 0x1e, 0x88, 0x5d, 0x86, 0xbb, 0x3b, + 0xa3, 0xc4, 0x0f, 0x92, 0xe6, 0x25, 0x12, 0x03, + 0x69, 0xcf, 0xb0, 0x62, 0x4f, 0xda, 0x11, 0x23, + 0x8d, 0xd4, 0x47, 0xdc, 0x65, 0x7a, 0x9e, 0x2d, + 0x09, 0x9c, 0x79, 0xa6, 0x9e, 0xb1, 0x33, 0xf6, + 0x6c, 0xfd, 0xb6, 0x50, 0xde, 0xb0, 0x27, 0xdb, + 0x39, 0x7e, 0xdd, 0xbf, 0xe5, 0x83, 0xe4, 0x58, + 0x79, 0x2b, 0x07, 0x78, 0x84, 0x59, 0x9f, 0x04, + 0xca, 0x00, 0x16, 0x1d, 0x7b, 0x5b, 0x37, 0x46, + 0xf7, 0x27, 0xdb, 0xff, 0xb9, 0x37, 0xfa, 0x57, + 0xcd, 0x03, 0xcd, 0x5f, 0xb5, 0x84, 0x0f, 0x7b, + 0x9f, 0x9b, 0x22, 0xe2, 0xb4, 0x0e, 0x96, 0x77, + 0xa2, 0x6b, 0x74, 0x1e, 0xda, 0x09, 0x33, 0x41, + 0x2f, 0x75, 0xd0, 0xc3, 0x05, 0x5c, 0xd7, 0xd5, + 0xe8, 0x1f, 0x01, 0x85, 0x4c, 0x05, 0xba, 0xd5, + 0x78, 0x9b, 0x79, 0xb6, 0xb2, 0x7f, 0x63, 0xeb, + 0xaa, 0xff, 0x99, 0x4e, 0x0f, 0xd0, 0x67, 0x6f, + 0xb2, 0xcd, 0x7a, 0xd3, 0xdb, 0x64, 0x80, 0x73, + 0xfc, 0xa6, 0x0f, 0xfa, 0xb0, 0x55, 0x6e, 0xe9, + 0x3b, 0x33, 0x22, 0x26, 0xd3, 0xd3, 0xcf, 0xc2, + 0xa6, 0xa5, 0x01, 0x15, 0x6c, 0xec, 0x27, 0x45, + 0xc4, 0x86, 0x35, 0x7a, 0x76, 0x90, 0xa3, 0x2d, + 0x11, 0x91, 0x00, 0x90, 0x8d, 0x0f, 0xec, 0x62, + 0x24, 0x1b, 0xd6, 0x9c, 0xb0, 0x03, 0x88, 0x58, + 0x9f, 0x13, 0x98, 0x6b, 0x37, 0x75, 0x38, 0xb3, + 0x9f, 0x77, 0x17, 0x5a, 0x62, 0x05, 0xb7, 0x08, + 0x85, 0x3b, 0xf0, 0x8a, 0xee, 0xef, 0x49, 0x42, + 0x85, 0xfd, 0x0b, 0x6b, 0x39, 0xed, 0xe6, 0xdd, + 0xb3, 0x7c, 0x4b, 0x68, 0xfe, 0x02, 0x7f, 0xee, + 0x26, 0xf7, 0xf3, 0x3b, 0x5f, 0x35, 0xc6, 0x0e, + 0x60, 0xce, 0x39, 0xe2, 0xa0, 0x2c, 0xe0, 0x15, + 0x44, 0x41, 0x31, 0x8c, 0xe8, 0x80, 0xdc, 0x35, + 0xbb, 0x59, 0x11, 0x2d, 0xc9, 0xf1, 0x49, 0xff, + 0x2b, 0x3f, 0xee, 0x0f, 0xc6, 0x36, 0x9b, 0xe0, + 0x89, 0x10, 0x77, 0xac, 0x3a, 0xc2, 0x46, 0x18, + 0x48, 0xa8, 0x55, 0x64, 0x77, 0x68, 0x92, 0xca, + 0x88, 0x1c, 0x01, 0x95, 0xb9, 0x18, 0x30, 0xd0, + 0x02, 0x09, 0x8e, 0xce, 0x2b, 0x06, 0xaf, 0xe0, + 0x25, 0x02, 0xf5, 0x2d, 0x73, 0x8c, 0x5b, 0x2c, + 0x83, 0x76, 0x1f, 0x01, 0x2f, 0x1f, 0x75, 0x6a, + 0xd2, 0xce, 0xbb, 0x4f, 0xc8, 0x69, 0x21, 0x93, + 0xab, 0x75, 0xdd, 0x8e, 0xc6, 0x62, 0xe7, 0x24, + 0x1a, 0x91, 0x18, 0x2e, 0xd2, 0x73, 0xa8, 0xe9, + 0x86, 0x94, 0xbe, 0xae, 0x43, 0x5c, 0x57, 0xe8, + 0x4e, 0x38, 0x59, 0x27, 0x0b, 0x88, 0x22, 0xe3, + 0x65, 0x9d, 0x09, 0x13, 0xf7, 0x86, 0x8c, 0x4f, + 0x82, 0x07, 0x00, 0x32, 0xbb, 0x18, 0x54, 0x85, + 0xaf, 0x36, 0xc5, 0x0d, 0xcb, 0x16, 0x3f, 0x8d, + 0x09, 0x1f, 0x56, 0x46, 0x7b, 0xc0, 0x43, 0xb0, + 0x50, 0x9b, 0x64, 0x49, 0x56, 0xcd, 0xaa, 0x4b, + 0xea, 0x12, 0xbd, 0x4d, 0x95, 0x6e, 0x18, 0x81, + 0xb4, 0xb7, 0x85, 0x2c, 0x82, 0xbc, 0xf3, 0x3e, + 0xf2, 0x33, 0x2d, 0x69, 0xb3, 0xab, 0x16, 0x8e, + 0x86, 0xf5, 0x09, 0x8f, 0x7e, 0x42, 0x84, 0x28, + 0x10, 0x14, 0x68, 0xa8, 0x0c, 0x6f, 0xb4, 0xd1, + 0x1e, 0x7c, 0x18, 0xc6, 0x3d, 0x3f, 0xe3, 0xa0, + 0xb5, 0xe8, 0xb8, 0xf0, 0x07, 0x2b, 0x56, 0xd1, + 0x2a, 0x06, 0x97, 0xf7, 0x96, 0x0d, 0xdd, 0x5c, + 0x60, 0x25, 0xb6, 0x54, 0xbb, 0xe4, 0x30, 0xaf, + 0x42, 0xe2, 0x52, 0x6f, 0x6c, 0x01, 0xa2, 0x77, + 0x2e, 0x6f, 0x94, 0x76, 0xe7, 0x93, 0x3a, 0xcc, + 0x5b, 0xc9, 0x31, 0x4d, 0x66, 0x96, 0x25, 0x42, + 0x06, 0xbd, 0x11, 0xeb, 0xcd, 0x49, 0xf4, 0x53, + 0x2c, 0xf4, 0xef, 0x4e, 0x1d, 0xa9, 0x6c, 0x82, + 0x3e, 0xf9, 0x29, 0x5e, 0xab, 0x78, 0x88, 0x69, + 0x11, 0xcf, 0x4a, 0x2c, 0x8b, 0x38, 0x16, 0x63, + 0x3b, 0x19, 0xde, 0x7c, 0x3c, 0x72, 0x3c, 0xca, + 0xc7, 0x8f, 0xa7, 0x1e, 0x5f, 0xb7, 0x3f, 0x0f, + 0xa3, 0xc4, 0xd3, 0xc9, 0xc8, 0xb2, 0xdf, 0xe9, + 0x6b, 0x8e, 0x1e, 0x46, 0x16, 0x08, 0x99, 0x55, + 0x2c, 0x86, 0x38, 0x96, 0x5f, 0x76, 0xcf, 0x73, + 0x3d, 0x58, 0x68, 0x95, 0x02, 0x73, 0x63, 0xf6, + 0x87, 0x4a, 0xb5, 0x18, 0xc6, 0x81, 0x65, 0x74, + 0x24, 0x76, 0x22, 0xe2, 0x00, 0x6b, 0x44, 0x42, + 0xdd, 0x8e, 0x6b, 0xeb, 0xa2, 0x4c, 0x2f, 0x19, + 0x38, 0x04, 0x42, 0x12, 0x9a, 0x90, 0x8a, 0x15, + 0xb9, 0xcb, 0x31, 0x0e, 0x14, 0x07, 0xe9, 0x00, + 0xfc, 0x25, 0x66, 0x99, 0x09, 0xcf, 0x3a, 0xda, + 0x29, 0x2a, 0xbb, 0x6a, 0x10, 0x3f, 0xbf, 0xff, + 0x47, 0x76, 0xa6, 0xa6, 0x39, 0x4f, 0xbd, 0x53, + 0xc2, 0x2e, 0xa0, 0x1c, 0x21, 0xf2, 0xa4, 0xca, + 0xa5, 0xee, 0xa7, 0x20, 0xb3, 0x18, 0xe5, 0xcb, + 0xda, 0x59, 0x7d, 0x42, 0xa3, 0x02, 0x8d, 0x14, + 0x38, 0x25, 0x70, 0xa0, 0x4e, 0xb3, 0xd2, 0x66, + 0xa1, 0x43, 0x5b, 0x8b, 0x5d, 0xd6, 0xfa, 0x52, + 0xae, 0x11, 0xd8, 0xec, 0x14, 0xcd, 0x05, 0x2b, + 0xca, 0xb5, 0xee, 0x35, 0xfa, 0xe9, 0xfb, 0xaf, + 0x65, 0x95, 0x40, 0xf7, 0x16, 0x83, 0x55, 0x05, + 0x31, 0xec, 0x1a, 0xe2, 0x58, 0xae, 0xfb, 0xf3, + 0x7b, 0x0b, 0xbb, 0x0f, 0xb6, 0xa4, 0x6c, 0x50, + 0xaf, 0x51, 0x43, 0xd9, 0xb8, 0x05, 0xab, 0x7b, + 0xdd, 0xc6, 0xf5, 0x45, 0x39, 0x49, 0x3f, 0x96, + 0x1a, 0xc9, 0x80, 0x51, 0xb6, 0x96, 0x84, 0xc4, + 0x9d, 0x05, 0x5c, 0x83, 0xbf, 0x1b, 0x95, 0x52, + 0xa7, 0x54, 0x8e, 0x00, 0xeb, 0xb4, 0x50, 0x72, + 0xd1, 0x8f, 0xa1, 0x8a, 0x94, 0xf6, 0x82, 0x90, + 0x76, 0xf4, 0x59, 0xc7, 0xf0, 0x6a, 0xdb, 0x57, + 0x5f, 0x7f, 0xf9, 0x0e, 0xe3, 0x8f, 0x78, 0x50, + 0xd0, 0x0c, 0xb4, 0x21, 0xdd, 0xa3, 0x02, 0xcc, + 0x64, 0xd5, 0x6e, 0x76, 0x54, 0x7b, 0x51, 0xee, + 0x97, 0xad, 0x55, 0xab, 0x26, 0x62, 0xd7, 0xfd, + 0x68, 0x4f, 0xfa, 0x70, 0xda, 0x44, 0xe9, 0x38, + 0x19, 0x51, 0x47, 0x54, 0x7f, 0xb7, 0x5b, 0xa4, + 0x73, 0x42, 0xba, 0x73, 0x5c, 0xa0, 0x7a, 0x43, + 0x7a, 0x8b, 0x6a, 0x7e, 0xea, 0xf8, 0x39, 0xe8, + 0xee, 0x14, 0x6f, 0x90, 0x14, 0xcf, 0x93, 0x6b, + 0xfc, 0xaa, 0xf5, 0xc8, 0x4f, 0xef, 0x68, 0xbb, + 0x74, 0x4b, 0xee, 0x41, 0xd8, 0xb5, 0xec, 0x64, + 0xfc, 0x4b, 0x7a, 0xc4, 0x03, 0xf8, 0xb5, 0x15, + 0xb3, 0x62, 0x4c, 0xf8, 0xaf, 0x3d, 0xb9, 0x84, + 0x77, 0x46, 0x5f, 0x1c, 0xb0, 0x04, 0xf1, 0xf2, + 0x6d, 0xe3, 0xc0, 0x6e, 0xc9, 0xa8, 0x22, 0xd9, + 0x81, 0xd1, 0x90, 0x16, 0x76, 0x44, 0xc1, 0x28, + 0xff, 0x65, 0xf7, 0x91, 0x9b, 0x96, 0x71, 0x6d, + 0xa6, 0x39, 0x13, 0x32, 0x8a, 0x88, 0x9e, 0x1a, + 0x68, 0x91, 0x4c, 0xe7, 0x32, 0xcc, 0x30, 0xce, + 0x6f, 0xa6, 0x43, 0x65, 0x50, 0x1c, 0x24, 0x67, + 0x04, 0xc7, 0x4a, 0xc1, 0x4f, 0xfb, 0x97, 0x7d, + 0xb8, 0x56, 0x31, 0x34, 0x18, 0x13, 0x6f, 0x24, + 0xca, 0x85, 0xd7, 0xb6, 0x71, 0x27, 0x82, 0x9d, + 0x0a, 0xcf, 0xe2, 0x08, 0x31, 0xb0, 0x58, 0x11, + 0xb4, 0x5e, 0xa6, 0x25, 0x76, 0x81, 0x25, 0xa3, + 0x9f, 0x39, 0x19, 0xdb, 0x94, 0xa3, 0xd1, 0xac, + 0x26, 0x7a, 0x23, 0x55, 0x4d, 0x35, 0x66, 0x95, + 0x8f, 0xa3, 0x68, 0x0a, 0x15, 0x68, 0x36, 0x1c, + 0x05, 0xe9, 0xa3, 0x0a, 0x2f, 0x35, 0x26, 0x76, + 0x28, 0xa2, 0x61, 0x39, 0x4f, 0x42, 0x7e, 0x95, + 0x4a, 0x3d, 0x61, 0x5f, 0xa9, 0x47, 0x73, 0x35, + 0x18, 0xe7, 0x19, 0x3b, 0x5a, 0xb5, 0x86, 0xa2, + 0x3c, 0x8e, 0xb0, 0xb0, 0x69, 0xb5, 0xf9, 0x4e, + 0xb7, 0xf4, 0xb7, 0x8b, 0xcf, 0xea, 0xfb, 0xf7, + 0xb7, 0x92, 0x7e, 0x4e, 0xaf, 0x31, 0xe5, 0xa0, + 0xef, 0xe1, 0x7e, 0xf9, 0x2e, 0xae, 0x9c, 0xb1, + 0xaf, 0x74, 0xce, 0xec, 0x5f, 0x6e, 0xab, 0x5e, + 0xde, 0xad, 0xed, 0x48, 0x0f, 0x57, 0x9e, 0x53, + 0x7b, 0xef, 0xde, 0x0c, 0xc6, 0x8e, 0x9e, 0x7f, + 0xa1, 0x5a, 0x13, 0x80, 0x7e, 0xe3, 0x34, 0xe9, + 0xad, 0x80, 0xee, 0x4e, 0xd0, 0x6d, 0x8f, 0x78, + 0xd3, 0xd3, 0x93, 0x5b, 0xcb, 0x9e, 0x4d, 0xa3, + 0xfc, 0x82, 0xa2, 0x0c, 0xbf, 0x79, 0xe1, 0x6e, + 0xb8, 0x9f, 0xbf, 0xd9, 0x50, 0x5e, 0x28, 0x9f, + 0xd7, 0x37, 0xec, 0x0d, 0xe3, 0x73, 0xf3, 0x05, + 0x55, 0x0d, 0xf5, 0xc7, 0x48, 0xae, 0x7a, 0x38, + 0xe3, 0x04, 0xbe, 0x16, 0x32, 0x89, 0x38, 0x45, + 0x58, 0xb1, 0xdf, 0xf0, 0xf7, 0xcf, 0x2a, 0x56, + 0xd3, 0x8a, 0x5b, 0xb7, 0xac, 0x52, 0x70, 0xcb, + 0x1f, 0x32, 0x9b, 0xe0, 0xab, 0xde, 0xaa, 0x95, + 0x9c, 0x5b, 0x80, 0x90, 0x4f, 0x0b, 0x1b, 0x8a, + 0xeb, 0x6b, 0x91, 0xb9, 0x0e, 0xee, 0x7d, 0xb1, + 0xfb, 0x3b, 0xa1, 0xd5, 0x08, 0x33, 0x62, 0x31, + 0x92, 0x22, 0x18, 0x77, 0x9e, 0x6d, 0x15, 0x5b, + 0x71, 0x74, 0xee, 0x19, 0xa1, 0x94, 0xd4, 0x84, + 0x26, 0x1c, 0x0a, 0x1a, 0xf0, 0xb7, 0xa9, 0xe3, + 0x94, 0xf1, 0xca, 0x48, 0xe1, 0x38, 0x9e, 0x46, + 0x0f, 0x86, 0x28, 0x79, 0x69, 0x9d, 0x53, 0xf4, + 0xd5, 0x56, 0xc2, 0x49, 0x38, 0x19, 0x3e, 0x49, + 0xae, 0x1f, 0xff, 0x0e, 0x57, 0xff, 0x38, 0x4d, + 0xd2, 0x88, 0xbe, 0xcc, 0xd8, 0x41, 0xa1, 0x1f, + 0x67, 0x1c, 0xf0, 0x16, 0x84, 0xc4, 0x02, 0x4a, + 0xf8, 0x06, 0x56, 0x21, 0xc7, 0x1b, 0x16, 0x7d, + 0xfb, 0xe1, 0xb3, 0xab, 0xfb, 0x9f, 0x6f, 0x39, + 0x7e, 0x46, 0x07, 0xd4, 0x24, 0x3c, 0x82, 0x42, + 0x60, 0xb4, 0x3f, 0xa2, 0x11, 0x7e, 0x0b, 0xe3, + 0xf4, 0xbd, 0x9c, 0x57, 0xa8, 0xaf, 0x2c, 0xf0, + 0xf1, 0x51, 0xe6, 0x8f, 0x8c, 0x96, 0xdd, 0x93, + 0xf6, 0x7e, 0x74, 0x0b, 0x25, 0xa8, 0x30, 0x28, + 0x3b, 0x66, 0xff, 0xac, 0x66, 0x51, 0x65, 0x5b, + 0xe4, 0x6a, 0xe4, 0xac, 0x16, 0xf9, 0x03, 0x65, + 0x10, 0x33, 0x8c, 0x06, 0x94, 0x66, 0x0e, 0x2f, + 0x83, 0x77, 0x96, 0x39, 0x94, 0x11, 0xfd, 0xfe, + 0x59, 0xcc, 0x87, 0x34, 0x01, 0xeb, 0x16, 0x78, + 0x3f, 0x02, 0x12, 0x21, 0x8a, 0x01, 0xac, 0xa8, + 0x9c, 0xc8, 0x98, 0x28, 0xa9, 0x5f, 0x30, 0x3e, + 0xb5, 0xf9, 0xcb, 0xa6, 0xb2, 0xa9, 0xbc, 0xe2, + 0x29, 0x63, 0xc2, 0xc8, 0x1e, 0x9e, 0xa3, 0x7f, + 0x34, 0x62, 0x55, 0x81, 0xae, 0x79, 0xcc, 0x6e, + 0xda, 0xe0, 0xd7, 0xc3, 0x01, 0xb2, 0x1a, 0xac, + 0x1e, 0xcd, 0x3b, 0x0b, 0xf6, 0x6a, 0x15, 0x75, + 0x8e, 0xf4, 0x80, 0xd6, 0xe9, 0x7d, 0xbe, 0xee, + 0x3c, 0x0c, 0xd6, 0x9d, 0xfb, 0xbc, 0x0e, 0xd6, + 0x55, 0xe4, 0xd2, 0x2c, 0xb1, 0xf7, 0xbf, 0xcf, + 0x77, 0x9f, 0xc1, 0xbd, 0x9f, 0x94, 0x78, 0x19, + 0x37, 0x8b, 0x2b, 0x45, 0x25, 0x0d, 0xfb, 0x37, + 0x0e, 0xe3, 0x79, 0xb8, 0x77, 0xf3, 0x6f, 0xa6, + 0x8c, 0x28, 0xae, 0x32, 0xd7, 0x05, 0x94, 0xd8, + 0x8d, 0x7b, 0xc3, 0xfc, 0x85, 0x88, 0x41, 0xc0, + 0x38, 0x9e, 0xce, 0x47, 0x67, 0x23, 0xff, 0xf7, + 0xf7, 0x2f, 0x62, 0xe8, 0x75, 0x92, 0x32, 0x5f, + 0xe3, 0xcc, 0x59, 0xdd, 0x9a, 0xfd, 0x3e, 0xc2, + 0x2a, 0x95, 0xa0, 0xe4, 0xe2, 0x28, 0x83, 0xdc, + 0x27, 0x01, 0xaf, 0x8c, 0x39, 0x5b, 0x6e, 0x0c, + 0xb5, 0x4a, 0x2d, 0xe1, 0x8f, 0xe9, 0x29, 0x3d, + 0x05, 0x7f, 0xf1, 0x29, 0x4b, 0xf9, 0x29, 0x23, + 0x43, 0xcf, 0xd1, 0xd4, 0xd5, 0xcc, 0x83, 0x14, + 0xca, 0x55, 0x8d, 0xfa, 0x99, 0x3d, 0xba, 0xb7, + 0xd1, 0xfe, 0x3c, 0xd8, 0xd8, 0xdb, 0xf0, 0x37, + 0x7e, 0xd9, 0xf4, 0xb6, 0xf7, 0x95, 0x9f, 0x94, + 0xef, 0x63, 0x3b, 0x0a, 0x22, 0x0f, 0x6f, 0x05, + 0xb5, 0x59, 0x0b, 0x3c, 0x19, 0xf8, 0x7e, 0xd6, + 0xa9, 0x3b, 0x44, 0x27, 0x3f, 0x8f, 0x26, 0xf3, + 0x42, 0x26, 0x31, 0x97, 0x28, 0x07, 0xac, 0xf0, + 0x01, 0x78, 0xf4, 0x16, 0x4a, 0x13, 0xe8, 0xe7, + 0x83, 0xbe, 0x9e, 0xbc, 0x78, 0x2c, 0x2d, 0x60, + 0x64, 0x07, 0x43, 0x5c, 0xc7, 0x2a, 0x6d, 0x9d, + 0xe9, 0xac, 0xc2, 0x66, 0x71, 0xd4, 0x2a, 0x8e, + 0xee, 0xe8, 0x1e, 0xd8, 0x4c, 0x81, 0x0a, 0xfa, + 0xeb, 0xdb, 0x7f, 0xef, 0xd3, 0xbd, 0x77, 0xa6, + 0x35, 0xba, 0x9f, 0xf1, 0x1b, 0xbe, 0xb8, 0xe6, + 0x76, 0xc3, 0x77, 0x8e, 0xa7, 0xf6, 0x35, 0x6f, + 0xe6, 0x6f, 0xb5, 0x9f, 0xf0, 0x9a, 0x11, 0x65, + 0xe2, 0x0e, 0x1d, 0xe7, 0x17, 0x8f, 0xec, 0x5f, + 0xad, 0x82, 0x02, 0xb8, 0x0c, 0x3e, 0x27, 0x98, + 0xf7, 0xb6, 0xbd, 0x64, 0x90, 0x04, 0x8f, 0x51, + 0x03, 0xcb, 0x57, 0xf5, 0xd4, 0x20, 0x29, 0x51, + 0xdf, 0xb3, 0xdc, 0xde, 0xe4, 0x9e, 0x01, 0x7e, + 0x9a, 0xde, 0x5e, 0xf5, 0xf5, 0xe3, 0x8a, 0x67, + 0xec, 0xea, 0x3f, 0x94, 0x7f, 0x7a, 0x22, 0xde, + 0x59, 0xca, 0xe9, 0x02, 0xb7, 0x50, 0x47, 0x28, + 0x85, 0x23, 0x38, 0x00, 0xb1, 0x44, 0x78, 0x32, + 0x16, 0x22, 0xb5, 0xa7, 0x0f, 0xa2, 0xf8, 0xf9, + 0xc9, 0x98, 0xb9, 0x3c, 0xfb, 0xef, 0x3f, 0x85, + 0xd9, 0x60, 0x2b, 0xce, 0xd4, 0xc3, 0x0a, 0xee, + 0x60, 0x05, 0x6d, 0xb6, 0x6e, 0xdb, 0x6e, 0xc5, + 0x2c, 0xb5, 0x4b, 0xbc, 0x02, 0x18, 0xa9, 0x12, + 0x80, 0xa7, 0x09, 0xe3, 0xe3, 0x5e, 0xfe, 0x88, + 0x89, 0xbd, 0x37, 0x88, 0x1a, 0x23, 0x84, 0x8c, + 0x38, 0x27, 0x6d, 0x37, 0x85, 0x45, 0x06, 0xbd, + 0x7e, 0x78, 0xce, 0x79, 0xf2, 0x2c, 0xde, 0x50, + 0xab, 0x04, 0xf3, 0xce, 0x22, 0x37, 0x0e, 0xfe, + 0xba, 0xb4, 0x05, 0x98, 0xc9, 0xeb, 0xfc, 0xc1, + 0x39, 0xc3, 0x62, 0x87, 0xa7, 0x93, 0x61, 0x1c, + 0x98, 0x8c, 0x1c, 0xa3, 0xa5, 0xb8, 0xe5, 0x8f, + 0xf8, 0xf7, 0x8e, 0x4b, 0x80, 0xb1, 0x23, 0xff, + 0x88, 0x86, 0x51, 0x94, 0x15, 0xfb, 0x2a, 0x8c, + 0xcf, 0x02, 0x98, 0xf7, 0x36, 0xf5, 0xc0, 0xde, + 0x12, 0x4d, 0x95, 0x36, 0x15, 0x3c, 0xd5, 0xf6, + 0xca, 0xc1, 0x0d, 0xf3, 0xea, 0x03, 0x27, 0xb4, + 0x28, 0x91, 0x4d, 0x49, 0x09, 0x74, 0x3d, 0x89, + 0x68, 0xc3, 0xb9, 0xe4, 0x7c, 0x1e, 0xa0, 0xad, + 0xcb, 0x05, 0x1a, 0xee, 0xdf, 0x9a, 0x40, 0x14, + 0xe8, 0xf1, 0xb1, 0x5b, 0xc6, 0x75, 0xff, 0xfa, + 0xfe, 0xa3, 0x76, 0x86, 0xa5, 0x59, 0xda, 0xd1, + 0xbc, 0x29, 0x32, 0x8d, 0xef, 0x2c, 0xae, 0x19, + 0xfc, 0x5f, 0xff, 0xba, 0xf0, 0x62, 0xe0, 0x7f, + 0x9d, 0x8c, 0x73, 0x8e, 0xa5, 0x0e, 0x31, 0x97, + 0xda, 0xcf, 0x96, 0x0a, 0x8d, 0xe1, 0x34, 0x0f, + 0xe1, 0xb5, 0x7a, 0x71, 0xa3, 0xf8, 0xfd, 0x6d, + 0x35, 0xca, 0xa4, 0x6f, 0xa3, 0xa7, 0x20, 0x66, + 0x75, 0xcb, 0xa5, 0x30, 0x52, 0x24, 0x4d, 0xae, + 0x22, 0xae, 0x6b, 0x35, 0xd0, 0x3e, 0x07, 0xa7, + 0xe8, 0x2b, 0xef, 0x8e, 0x67, 0x39, 0x56, 0xad, + 0xca, 0xaa, 0xb5, 0xd5, 0x30, 0x82, 0x41, 0x3c, + 0xea, 0x94, 0x9d, 0x65, 0x5a, 0x06, 0x5f, 0xbc, + 0x3c, 0x7d, 0xa6, 0x7b, 0x86, 0x9e, 0xa1, 0xe3, + 0x5e, 0xee, 0x67, 0x5d, 0xbd, 0x1b, 0xfa, 0xa1, + 0x2f, 0x83, 0x7b, 0xca, 0x6f, 0xba, 0xeb, 0xce, + 0x4b, 0xd8, 0xfd, 0xf7, 0x9c, 0x7b, 0xce, 0x77, + 0x41, 0x1c, 0x3f, 0x06, 0xef, 0x88, 0x51, 0x83, + 0xea, 0xcd, 0x80, 0x32, 0x9c, 0xc9, 0xeb, 0xfe, + 0x8d, 0xee, 0x23, 0xef, 0xd1, 0xae, 0xf6, 0x43, + 0xfe, 0x01, 0xdd, 0x91, 0x59, 0xad, 0xd1, 0xe0, + 0x8e, 0x32, 0xdf, 0x9d, 0x75, 0x62, 0x4e, 0x41, + 0xcc, 0xc6, 0x62, 0xa0, 0xe3, 0x74, 0xd5, 0xc2, + 0x5c, 0x39, 0xb2, 0x1a, 0xf0, 0x7e, 0x3c, 0xad, + 0x4d, 0x5b, 0x29, 0x6b, 0x16, 0x7c, 0x8d, 0x07, + 0xd4, 0x7c, 0x2f, 0xab, 0x25, 0xb9, 0x08, 0x2f, + 0xbe, 0x90, 0xb2, 0x85, 0xc8, 0x9c, 0xb5, 0xd8, + 0xeb, 0xf2, 0x11, 0xdb, 0x61, 0x3b, 0x6b, 0x8d, + 0xff, 0x07, 0x12, 0x89, 0xbe, 0x6e, 0xf4, 0x55, + 0x6a, 0x86, 0x11, 0xe7, 0xb9, 0xa3, 0xb9, 0x67, + 0x5e, 0xa4, 0x95, 0x6d, 0x25, 0x11, 0x9c, 0xb7, + 0x4a, 0x4e, 0xe9, 0xf5, 0xfa, 0x5b, 0xa2, 0x0e, + 0xe6, 0x26, 0x50, 0x32, 0xa7, 0xb7, 0x50, 0x6e, + 0xfb, 0x12, 0x4b, 0x95, 0x73, 0x80, 0x63, 0xb7, + 0x5f, 0x2f, 0xb7, 0xcb, 0x98, 0x7f, 0x08, 0xe6, + 0xd8, 0x97, 0x47, 0x09, 0xf4, 0xb0, 0x69, 0xe5, + 0xf8, 0x64, 0x24, 0xc1, 0x22, 0x5f, 0x1e, 0x57, + 0xdd, 0x26, 0xfc, 0x6c, 0xbb, 0x8e, 0x6b, 0xa1, + 0x2d, 0x63, 0x6b, 0xfa, 0x3c, 0x5f, 0x62, 0x97, + 0xf4, 0xa5, 0xbf, 0x2f, 0x58, 0x22, 0x2e, 0xca, + 0x6f, 0x62, 0x64, 0x80, 0x4b, 0x66, 0x48, 0x8f, + 0x6b, 0x30, 0xf0, 0x35, 0xc2, 0xcf, 0x44, 0x29, + 0x75, 0x61, 0xfe, 0x3d, 0x8c, 0xe9, 0x2a, 0xf0, + 0xbd, 0x08, 0x87, 0xee, 0x69, 0xbb, 0x05, 0xed, + 0xab, 0xd0, 0xff, 0x6d, 0xc2, 0x15, 0x66, 0xf9, + 0x53, 0x3b, 0x0f, 0x16, 0x34, 0x0d, 0xbb, 0x21, + 0x09, 0xf3, 0x36, 0x4b, 0xee, 0x88, 0x68, 0x0f, + 0x78, 0x3b, 0x56, 0x02, 0x46, 0xca, 0x9a, 0xa8, + 0x2d, 0x3c, 0xbe, 0x53, 0x95, 0x33, 0x25, 0xef, + 0x08, 0xb5, 0x74, 0x33, 0xb0, 0xad, 0x7b, 0xf6, + 0xba, 0x67, 0xb7, 0x6d, 0xdb, 0xf6, 0xee, 0xb3, + 0x7a, 0x2d, 0x8a, 0xd6, 0x4a, 0xfd, 0xfa, 0xe5, + 0xbb, 0x58, 0xa8, 0x6b, 0x7b, 0xdc, 0x94, 0x23, + 0xe9, 0x97, 0xc9, 0x9c, 0x23, 0x7a, 0x50, 0x80, + 0x50, 0x5b, 0x80, 0xb3, 0x07, 0xd1, 0x35, 0xe2, + 0x4b, 0xf0, 0xca, 0x2a, 0xce, 0x9a, 0x73, 0x2d, + 0xf8, 0x9c, 0x66, 0x4d, 0x6d, 0x3f, 0x7b, 0x38, + 0xbe, 0x31, 0xbd, 0x9b, 0x4a, 0x4a, 0xaf, 0x3c, + 0x4b, 0x5f, 0x39, 0x39, 0xf8, 0x8b, 0xb5, 0xe0, + 0x86, 0x79, 0xdd, 0xdc, 0x34, 0x37, 0x0f, 0xc7, + 0x7f, 0x8e, 0xce, 0x02, 0x26, 0x64, 0x77, 0x58, + 0x91, 0x17, 0xd9, 0x50, 0x10, 0xc7, 0x9d, 0xc0, + 0x51, 0x33, 0xde, 0x97, 0xb9, 0x27, 0xb4, 0x50, + 0x80, 0x51, 0x53, 0x80, 0xca, 0x75, 0xe5, 0x8f, + 0x5c, 0xa7, 0x8b, 0xc1, 0x3c, 0x5d, 0xf5, 0x64, + 0x4c, 0x55, 0xb2, 0x3b, 0xe4, 0xf5, 0xc6, 0xad, + 0x4a, 0x57, 0x21, 0x83, 0x31, 0x37, 0xd8, 0x81, + 0xab, 0x8b, 0x07, 0xeb, 0x20, 0x7b, 0xb9, 0x20, + 0x45, 0x2e, 0x91, 0xcf, 0x3b, 0x29, 0xc4, 0x17, + 0x9d, 0x71, 0x81, 0x27, 0x31, 0xaf, 0x01, 0x98, + 0xc2, 0x52, 0x9c, 0x35, 0x4f, 0x69, 0xaf, 0x3e, + 0x53, 0xec, 0x55, 0x6f, 0xde, 0xd4, 0xed, 0xb5, + 0x1d, 0xd4, 0xc0, 0x70, 0xe7, 0x60, 0x9f, 0xd2, + 0xbc, 0xa8, 0xfc, 0x3e, 0x40, 0xbd, 0x07, 0x9e, + 0x35, 0x07, 0xcf, 0xda, 0x19, 0x0b, 0xb6, 0x84, + 0xf6, 0x2e, 0xb3, 0xb9, 0xe0, 0x03, 0x90, 0xa5, + 0xa6, 0x77, 0xa7, 0xbd, 0xfd, 0xac, 0x68, 0xc3, + 0x3a, 0x99, 0x65, 0xbb, 0xb8, 0xb3, 0xa8, 0x86, + 0x7c, 0x15, 0xfb, 0x8e, 0x1d, 0x45, 0x98, 0xd1, + 0x6f, 0xa1, 0xc2, 0x33, 0xc5, 0xd5, 0x27, 0x5b, + 0xcd, 0x0d, 0xf2, 0xd7, 0x66, 0xb7, 0xe4, 0x94, + 0xb7, 0x16, 0x7f, 0xba, 0xad, 0xc8, 0x3b, 0xf8, + 0xf7, 0x9f, 0x54, 0x6b, 0xf8, 0xa0, 0xc7, 0xd0, + 0xe0, 0x25, 0xd0, 0x81, 0xcb, 0x41, 0x19, 0x7e, + 0x4e, 0xf2, 0x11, 0x76, 0x96, 0x7d, 0x13, 0xc6, + 0xcd, 0x50, 0xbb, 0xa4, 0xba, 0xaf, 0x04, 0xc3, + 0x21, 0x45, 0xb3, 0x14, 0xfc, 0x3f, 0xc4, 0x9e, + 0x83, 0x3e, 0x7b, 0x00, 0x70, 0x8a, 0x9d, 0x0b, + 0xa6, 0xf4, 0x65, 0x7d, 0x49, 0x5f, 0xd7, 0x13, + 0xe7, 0x25, 0x23, 0x05, 0x14, 0x6d, 0x40, 0x5a, + 0x65, 0xf0, 0xe4, 0x40, 0xc7, 0xb6, 0xcb, 0x7f, + 0x2f, 0xed, 0x25, 0xf7, 0x46, 0xab, 0x63, 0xd5, + 0xe7, 0x3b, 0x31, 0xe9, 0x3b, 0xb7, 0xb4, 0x56, + 0x9a, 0xcf, 0x91, 0x7f, 0xb3, 0x89, 0xbd, 0xdd, + 0x21, 0xfe, 0xf2, 0x2f, 0xd3, 0x24, 0x4f, 0xce, + 0x92, 0x2d, 0x8c, 0xaa, 0x91, 0x8a, 0x9d, 0x00, + 0x2f, 0x24, 0x61, 0x57, 0xe0, 0x6c, 0xb3, 0xb3, + 0x04, 0xdf, 0xe1, 0x20, 0xc3, 0xa4, 0x8e, 0x96, + 0x9d, 0xc6, 0x01, 0x15, 0x3c, 0xa2, 0x8f, 0xe8, + 0x97, 0xc1, 0xa6, 0xb1, 0xf9, 0xec, 0xf7, 0xff, + 0xfc, 0xfd, 0x0f, 0xff, 0xf5, 0xe7, 0x04, 0xbc, + 0x22, 0xf3, 0x5a, 0xe6, 0x71, 0x86, 0xbb, 0x49, + 0x96, 0xb6, 0x66, 0x5b, 0x43, 0x56, 0xd2, 0x6c, + 0xfe, 0x53, 0x5e, 0x67, 0xe8, 0x4d, 0x84, 0x0c, + 0x0c, 0xaa, 0xe7, 0x7c, 0x6d, 0x3f, 0xe7, 0xc3, + 0xf7, 0xbd, 0xd9, 0xbd, 0x8b, 0x2b, 0xb7, 0xd9, + 0x10, 0x13, 0x5a, 0x85, 0xa5, 0x82, 0x57, 0x8a, + 0xc8, 0xcb, 0xb3, 0x73, 0xec, 0x6b, 0x86, 0xd1, + 0xa8, 0x74, 0x23, 0xb7, 0x83, 0xd9, 0xe1, 0xb4, + 0x9b, 0x72, 0x90, 0xa1, 0x91, 0x7d, 0x87, 0xb3, + 0x71, 0x8e, 0x7e, 0x2d, 0xbc, 0x3a, 0xba, 0x97, + 0xd2, 0xaf, 0x4f, 0x87, 0x98, 0xbf, 0xbe, 0xed, + 0x26, 0x9c, 0x3c, 0x9b, 0x76, 0x26, 0xdd, 0xe5, + 0xc0, 0x80, 0xfd, 0x09, 0x56, 0x9c, 0x13, 0xa5, + 0x97, 0x85, 0x67, 0x09, 0x7b, 0xda, 0x9d, 0x74, + 0x26, 0x99, 0x61, 0x2f, 0x79, 0xb6, 0x49, 0xec, + 0xc4, 0xce, 0x59, 0xe1, 0x89, 0xc0, 0x2a, 0x39, + 0x64, 0xa3, 0xbc, 0xa1, 0x7c, 0x5f, 0x51, 0x8a, + 0xfc, 0x0b, 0x57, 0x73, 0x34, 0x67, 0x9c, 0xe9, + 0x22, 0xfb, 0x90, 0xa0, 0x0f, 0x83, 0x4b, 0x66, + 0x2a, 0xb8, 0xc2, 0x7e, 0xc3, 0x13, 0x6c, 0x22, + 0x30, 0x94, 0xfb, 0x9c, 0x78, 0xa4, 0x66, 0x1e, + 0xe6, 0x50, 0x5f, 0x59, 0xdb, 0x88, 0xea, 0xab, + 0x69, 0x6f, 0xb5, 0x3d, 0x1f, 0xfc, 0xbb, 0xc8, + 0xc4, 0xcc, 0xf3, 0x28, 0x17, 0xa3, 0x7a, 0xa3, + 0xc1, 0xd6, 0x7e, 0x2a, 0xc8, 0x30, 0x90, 0x6b, + 0x78, 0xed, 0x55, 0xe5, 0x06, 0x77, 0x3c, 0xb0, + 0x2c, 0xdd, 0x5c, 0xf2, 0x64, 0xbc, 0x7d, 0x80, + 0x43, 0xb0, 0x93, 0xdc, 0xd9, 0x6a, 0xe0, 0x4c, + 0x0e, 0x1f, 0xe5, 0x5b, 0x4f, 0x7a, 0xfa, 0x30, + 0x15, 0xea, 0x0e, 0x46, 0x2d, 0x19, 0xf9, 0x04, + 0xb9, 0x91, 0x12, 0xa0, 0x39, 0xd7, 0x0f, 0xaf, + 0xfd, 0xb2, 0xb9, 0x31, 0xbe, 0x81, 0x9c, 0xb6, + 0xdf, 0x84, 0x67, 0x9b, 0x70, 0xc7, 0x65, 0xa7, + 0xe4, 0x56, 0x76, 0x41, 0xbf, 0x38, 0xa4, 0xd6, + 0x64, 0x18, 0xdd, 0x49, 0xa0, 0x26, 0xc4, 0xfc, + 0x9c, 0x5d, 0x70, 0x52, 0x4e, 0xa1, 0xa6, 0x38, + 0x15, 0x3b, 0x5e, 0x1d, 0xae, 0x36, 0x9e, 0xaa, + 0x8f, 0x55, 0x2b, 0x69, 0x9d, 0x8c, 0xf3, 0xcf, + 0x75, 0x3e, 0xb0, 0x67, 0xdd, 0x62, 0x27, 0xe4, + 0xac, 0x3c, 0x96, 0xd6, 0x59, 0x57, 0x96, 0xba, + 0x4b, 0xf4, 0x52, 0xd7, 0x50, 0x16, 0xf9, 0x82, + 0xbf, 0xb8, 0x72, 0x4b, 0xf8, 0xf7, 0x98, 0x4f, + 0x89, 0x74, 0xec, 0xf0, 0x41, 0x14, 0x2b, 0x18, + 0x44, 0xaa, 0xfd, 0x48, 0xfe, 0xc3, 0xb7, 0xd2, + 0x4b, 0x8e, 0xce, 0x0d, 0xc9, 0xa0, 0xf9, 0xc1, + 0x18, 0x7a, 0x76, 0x5c, 0xa2, 0x20, 0xd4, 0x41, + 0xe1, 0x5d, 0x0b, 0x8d, 0x54, 0x24, 0xb9, 0x8e, + 0xe6, 0x0c, 0x1f, 0x4d, 0x3f, 0xfe, 0xf7, 0x1f, + 0xdf, 0xf7, 0x44, 0x08, 0xe8, 0xfa, 0x26, 0x5b, + 0xb7, 0x7e, 0x0b, 0x88, 0xe5, 0x2a, 0x07, 0x0d, + 0xc9, 0x2b, 0xee, 0x23, 0x9e, 0x76, 0x66, 0x04, + 0x26, 0x54, 0x94, 0xff, 0x0e, 0x36, 0xd9, 0xa6, + 0xf5, 0xdf, 0xbd, 0x78, 0x3b, 0x75, 0x67, 0x78, + 0xd1, 0x89, 0xbb, 0x63, 0x22, 0xfe, 0x9c, 0xa2, + 0xb9, 0xc3, 0x97, 0xf8, 0x95, 0x4f, 0x68, 0x29, + 0xed, 0x06, 0x46, 0x1b, 0x68, 0xea, 0x70, 0x86, + 0x9a, 0x54, 0xa2, 0x82, 0x42, 0x90, 0x6f, 0xcf, + 0xd3, 0x8f, 0x28, 0x7a, 0x7f, 0xe8, 0xd0, 0x23, + 0xfe, 0x6f, 0x86, 0x9a, 0x10, 0xec, 0xaf, 0xdf, + 0x3c, 0x4e, 0x03, 0x5a, 0xbf, 0xe5, 0xdf, 0xf8, + 0xf1, 0xaa, 0xf5, 0x19, 0x77, 0x7a, 0xa8, 0x40, + 0xc4, 0x27, 0x15, 0xe4, 0xc7, 0x4d, 0x00, 0x2e, + 0xb8, 0xc1, 0x4d, 0xe5, 0xd3, 0xee, 0xa7, 0x0e, + 0x72, 0xe6, 0x72, 0x81, 0xcc, 0x77, 0x27, 0x08, + 0xc6, 0x9f, 0x27, 0xba, 0xe7, 0xc0, 0xfe, 0x2f, + 0x5b, 0x4b, 0xc1, 0xba, 0x35, 0x52, 0x1d, 0xa9, + 0x26, 0x01, 0xc9, 0x10, 0x33, 0x71, 0x38, 0xe3, + 0xe9, 0xbb, 0xdb, 0x7f, 0x5b, 0x7e, 0x57, 0x7e, + 0x53, 0x3a, 0xac, 0x74, 0x4f, 0x81, 0x27, 0x5c, + 0xea, 0x18, 0x3f, 0x5a, 0x3b, 0xc8, 0x09, 0x1c, + 0x5d, 0x19, 0x21, 0x77, 0xdf, 0x14, 0xc9, 0x1c, + 0xf8, 0x02, 0x99, 0x60, 0x5c, 0x2f, 0xed, 0xce, + 0x6f, 0x7c, 0x54, 0xb5, 0x55, 0xb4, 0x47, 0x84, + 0x34, 0xed, 0x75, 0x40, 0xf5, 0x04, 0xd9, 0x44, + 0xf0, 0x1d, 0x51, 0x20, 0xac, 0x0f, 0x01, 0x1c, + 0x2d, 0xa2, 0xd3, 0x43, 0xdd, 0x6f, 0xe9, 0xfd, + 0xee, 0x3d, 0x38, 0xec, 0xd6, 0x3a, 0xff, 0xed, + 0xb3, 0xfb, 0xee, 0xb7, 0x24, 0x6e, 0xc4, 0x8e, + 0x15, 0x33, 0x62, 0x58, 0xe5, 0xdb, 0xd7, 0xe8, + 0x0d, 0x7e, 0x55, 0x75, 0x84, 0xa7, 0xd5, 0x67, + 0x58, 0x89, 0x38, 0xf0, 0x41, 0x43, 0xde, 0xa1, + 0x35, 0x6d, 0x7d, 0x03, 0xe8, 0x03, 0x47, 0x86, + 0x0b, 0xe6, 0x1e, 0x21, 0xe6, 0xe8, 0x81, 0x05, + 0xd6, 0x67, 0x11, 0xbc, 0x04, 0xc4, 0x52, 0x69, + 0x82, 0x9f, 0x7a, 0x57, 0x64, 0xc3, 0x07, 0x63, + 0x14, 0x70, 0xcd, 0x7c, 0xdc, 0x9e, 0x72, 0xe1, + 0xac, 0x71, 0xfb, 0x18, 0xe5, 0xb9, 0x9f, 0x97, + 0x5c, 0x0c, 0x54, 0xf0, 0xce, 0x26, 0x69, 0x46, + 0xfc, 0xe5, 0x1d, 0x7a, 0xa7, 0x97, 0x3d, 0xec, + 0xef, 0x91, 0x61, 0x9e, 0xef, 0xfc, 0x85, 0x10, + 0x7b, 0xb8, 0xa3, 0x6c, 0xf5, 0xfc, 0xc1, 0x6e, + 0x82, 0x8e, 0x76, 0xb5, 0xd6, 0x04, 0xbf, 0x61, + 0x6c, 0xa2, 0xee, 0x37, 0xe8, 0x31, 0x8d, 0xf6, + 0x42, 0x90, 0xd0, 0x2b, 0xa0, 0x65, 0x51, 0xd3, + 0x56, 0x40, 0xc3, 0x37, 0x05, 0x6b, 0x8e, 0xf0, + 0x28, 0xfb, 0x1f, 0xe6, 0x8e, 0x7b, 0x5f, 0x49, + 0x98, 0x69, 0x45, 0xb9, 0x2a, 0x54, 0xe7, 0xdf, + 0x35, 0x8d, 0xe5, 0xe3, 0xca, 0xc6, 0xf2, 0xdb, + 0x32, 0x53, 0xf9, 0x2d, 0xf6, 0x01, 0x5b, 0x92, + 0xd6, 0x4a, 0x64, 0xb5, 0x6c, 0x18, 0x22, 0xa3, + 0x25, 0x46, 0xdd, 0x8a, 0xfc, 0x23, 0xd0, 0x11, + 0xb0, 0xfb, 0xc1, 0x23, 0xb7, 0xa6, 0x9f, 0x4e, + 0xee, 0x4d, 0xf9, 0x4b, 0xfb, 0xa5, 0xb6, 0xdd, + 0x26, 0x7b, 0x30, 0xfe, 0x1a, 0x4a, 0x5d, 0xf0, + 0x8a, 0x66, 0xf8, 0x84, 0x73, 0x23, 0xb8, 0xe6, + 0x20, 0xf2, 0x93, 0xb1, 0x0a, 0x0a, 0xaf, 0xd5, + 0xc0, 0x4f, 0x6c, 0x72, 0xcd, 0x3d, 0x77, 0x4c, + 0x8c, 0xb2, 0x51, 0x3a, 0x2e, 0xef, 0x83, 0x4f, + 0xd2, 0x8f, 0xab, 0x30, 0xd2, 0x26, 0x6d, 0x90, + 0x1c, 0x36, 0xc9, 0x0a, 0xc1, 0x64, 0xad, 0xb4, + 0x65, 0xec, 0xaf, 0x1b, 0x23, 0x7a, 0xc8, 0x45, + 0x6c, 0x25, 0x40, 0xcb, 0x48, 0x8e, 0xd9, 0x8d, + 0x5f, 0x18, 0x09, 0xf9, 0x12, 0x21, 0x63, 0x10, + 0x65, 0xf8, 0x82, 0xfd, 0xdf, 0x7f, 0xaf, 0x70, + 0x44, 0x37, 0xe0, 0x4b, 0x4a, 0xed, 0xa2, 0x15, + 0xde, 0x29, 0x41, 0x6f, 0xff, 0x3a, 0xd4, 0x1e, + 0x83, 0x3b, 0x9a, 0x03, 0xb4, 0x3f, 0x2a, 0x22, + 0xf6, 0x72, 0x77, 0x23, 0xb7, 0xe8, 0xb2, 0x1d, + 0x6b, 0x61, 0xac, 0xbe, 0xf9, 0x4f, 0xdc, 0xe1, + 0x09, 0x76, 0x4a, 0x30, 0xf4, 0x84, 0xfd, 0x05, + 0x74, 0x3c, 0x05, 0x7e, 0xc4, 0x22, 0xaf, 0xfb, + 0x99, 0xa0, 0x01, 0xf8, 0x7b, 0xc3, 0xbf, 0xb9, + 0x7f, 0xd9, 0x9f, 0xde, 0xab, 0xb5, 0x71, 0xae, + 0x62, 0xd6, 0xcb, 0xfa, 0x3a, 0xcc, 0xd4, 0xfd, + 0xc7, 0xf7, 0x7e, 0xb9, 0x77, 0x7c, 0x9f, 0xdf, + 0x3b, 0xfe, 0xee, 0x71, 0xdc, 0x0e, 0x39, 0x18, + 0xac, 0x61, 0x6d, 0x76, 0x37, 0x61, 0x0d, 0x37, + 0x29, 0x7c, 0x47, 0x1b, 0x10, 0xa4, 0x36, 0xd2, + 0x3f, 0xa4, 0x77, 0xb4, 0x7c, 0x98, 0xa9, 0x41, + 0x1e, 0x13, 0x9f, 0x20, 0xe7, 0xc8, 0x14, 0x59, + 0xe6, 0x4b, 0x64, 0x9d, 0x24, 0x48, 0x42, 0xe8, + 0xf6, 0xbe, 0xf7, 0xa4, 0x1e, 0x0c, 0xa1, 0x46, + 0xc9, 0x0f, 0xd5, 0x4e, 0x29, 0x13, 0xca, 0x13, + 0xa1, 0x55, 0x24, 0x66, 0x90, 0xd1, 0x93, 0x41, + 0xa6, 0x96, 0x64, 0xcd, 0xc4, 0x94, 0xaf, 0x57, + 0x26, 0xec, 0xac, 0xfd, 0x5f, 0x6f, 0x6e, 0xb3, + 0x87, 0x47, 0x5f, 0xaf, 0x7c, 0xe6, 0x67, 0xe0, + 0x7f, 0x13, 0x80, 0x1b, 0x9e, 0x20, 0x27, 0x81, + 0x60, 0xdc, 0xa2, 0x08, 0xa8, 0x2b, 0x69, 0xab, + 0xf6, 0x69, 0xc0, 0x5f, 0x09, 0x3b, 0x65, 0x63, + 0x04, 0xc3, 0xca, 0x0f, 0x46, 0x03, 0xe2, 0x24, + 0xfa, 0x9b, 0x24, 0x7c, 0x2f, 0x8a, 0xb3, 0x4a, + 0xc8, 0x65, 0x18, 0x16, 0x59, 0xc2, 0xd3, 0x02, + 0xa5, 0x11, 0x2b, 0xf1, 0xe3, 0xd9, 0xea, 0xd6, + 0xaa, 0xb4, 0xbf, 0x60, 0xb9, 0x5b, 0x68, 0x6d, + 0xca, 0xb4, 0xc8, 0xca, 0xa8, 0xf1, 0x06, 0xe3, + 0x66, 0x7c, 0x44, 0xec, 0x2b, 0x90, 0x0a, 0x05, + 0x11, 0x0e, 0x0e, 0x6d, 0x57, 0xdb, 0xcd, 0x27, + 0xe5, 0x3b, 0x5b, 0xea, 0xb6, 0xa6, 0xd0, 0x58, + 0xd0, 0xa4, 0x1a, 0xfa, 0x74, 0x54, 0xa3, 0xfa, + 0xd5, 0x08, 0xb7, 0x37, 0x83, 0x6a, 0x15, 0x99, + 0x88, 0x88, 0x31, 0xf1, 0xfa, 0xa6, 0xcc, 0xda, + 0xf7, 0xa7, 0x95, 0x58, 0x4b, 0x92, 0x5c, 0x51, + 0x2b, 0xc8, 0xd1, 0xff, 0x29, 0x62, 0xa3, 0xa5, + 0xad, 0x34, 0xa0, 0xcd, 0x34, 0x9f, 0x81, 0xbb, + 0xc0, 0xa3, 0xd9, 0x39, 0x6f, 0x5f, 0xb0, 0xaf, + 0xb8, 0x15, 0x37, 0x16, 0x6a, 0x86, 0x8a, 0x65, + 0xf0, 0x2f, 0x6d, 0x0d, 0xf0, 0xc0, 0x53, 0x38, + 0x74, 0x3c, 0xc2, 0xb3, 0x29, 0xa1, 0xdb, 0x91, + 0xf5, 0x2b, 0xd7, 0xa2, 0xf6, 0x60, 0xec, 0x00, + 0xe3, 0x4f, 0xc3, 0x32, 0x0b, 0xde, 0x52, 0xba, + 0x2f, 0xd9, 0x3d, 0xeb, 0xa1, 0x64, 0x56, 0xbf, + 0xb9, 0x6f, 0xdc, 0xb3, 0x61, 0xfe, 0xdb, 0x43, + 0x79, 0x81, 0x45, 0x61, 0x27, 0xa0, 0x86, 0x79, + 0x25, 0x50, 0x4e, 0x2e, 0x48, 0xb7, 0x27, 0xfd, + 0x3f, 0xe4, 0xe3, 0xca, 0x50, 0x10, 0xe5, 0x08, + 0x30, 0xfe, 0x8c, 0x59, 0xae, 0x69, 0x13, 0x77, + 0x66, 0xda, 0xbe, 0x7a, 0x98, 0x34, 0x27, 0x9f, + 0x3d, 0xd9, 0xe9, 0xc7, 0xcd, 0xc0, 0xa2, 0xc8, + 0x39, 0x7f, 0x4f, 0xda, 0xfb, 0x19, 0x33, 0xc9, + 0x0e, 0x41, 0x6e, 0x09, 0x5e, 0x17, 0xf2, 0x4a, + 0xfa, 0x73, 0x25, 0x64, 0xa2, 0x3d, 0x7a, 0xc2, + 0xfe, 0x0e, 0x46, 0xe3, 0xfb, 0x7c, 0x93, 0xc8, + 0x96, 0xf5, 0x38, 0xbd, 0x2a, 0xac, 0x20, 0x78, + 0xae, 0xa0, 0x55, 0xc0, 0xe2, 0x46, 0x7c, 0x60, + 0x8c, 0x02, 0x0a, 0xef, 0xa1, 0x67, 0x05, 0x07, + 0xa3, 0xb5, 0xe8, 0xd3, 0x01, 0x06, 0x72, 0x0b, + 0x36, 0x75, 0x2e, 0xb2, 0xa5, 0x8d, 0x87, 0xdf, + 0xc7, 0x54, 0xdd, 0xd5, 0xf7, 0xa2, 0x58, 0x2e, + 0x72, 0x8a, 0x72, 0xc1, 0x2d, 0xb0, 0x18, 0x97, + 0xc9, 0x67, 0x1c, 0xb5, 0x2b, 0x1e, 0xa9, 0xd7, + 0x22, 0x33, 0x65, 0x20, 0xf7, 0x7c, 0xea, 0xf8, + 0xba, 0x71, 0xe3, 0xf0, 0xca, 0xc6, 0xe6, 0x3f, + 0xf3, 0x3b, 0x29, 0x27, 0x6b, 0x67, 0x35, 0x19, + 0xd9, 0x06, 0xaf, 0xaa, 0x9b, 0x62, 0xe0, 0x1b, + 0xa3, 0xff, 0x6b, 0x4c, 0x3e, 0x7e, 0x6e, 0x4b, + 0xae, 0x78, 0x8a, 0x5e, 0x4f, 0xca, 0xdc, 0x84, + 0x94, 0xda, 0xb4, 0x5b, 0x00, 0x5f, 0x72, 0xc6, + 0xc9, 0xb0, 0x19, 0xf6, 0x15, 0xd8, 0x41, 0xcc, + 0x3e, 0x08, 0x8d, 0xe8, 0x62, 0xe4, 0x23, 0xef, + 0x02, 0x4a, 0xe2, 0x25, 0xf7, 0x04, 0x82, 0x02, + 0x4d, 0x28, 0x91, 0x31, 0x66, 0xb2, 0x27, 0x05, + 0x9b, 0xd7, 0x96, 0x3b, 0x33, 0x8c, 0xb8, 0x82, + 0xae, 0x53, 0x47, 0xdf, 0x4d, 0xd0, 0x73, 0x74, + 0xaa, 0xbb, 0xac, 0x2c, 0xf1, 0xfe, 0x0e, 0x95, + 0x5e, 0x0c, 0xb1, 0xca, 0x81, 0xe2, 0x57, 0x4c, + 0x05, 0xe6, 0x29, 0x59, 0x03, 0xbf, 0xcc, 0x5b, + 0x17, 0x71, 0x7e, 0x61, 0x61, 0x2d, 0x03, 0xae, + 0x4a, 0xf3, 0x0b, 0xe6, 0x55, 0xf6, 0x25, 0xd3, + 0x58, 0x01, 0xf0, 0x57, 0x41, 0xd8, 0xee, 0x28, + 0xf7, 0x84, 0x19, 0x83, 0xe1, 0x80, 0x84, 0x1e, + 0x5b, 0x94, 0x41, 0x48, 0x31, 0x98, 0xe5, 0xe0, + 0x36, 0x43, 0xec, 0x3d, 0x14, 0xf2, 0xdb, 0x01, + 0x77, 0xb7, 0x6f, 0xd3, 0x8f, 0x93, 0x08, 0x28, + 0x0a, 0xf5, 0x09, 0xfb, 0x61, 0x7d, 0xc9, 0xbe, + 0x58, 0x27, 0x64, 0xf4, 0x78, 0xd2, 0x98, 0x3a, + 0x2e, 0x81, 0x26, 0x07, 0x91, 0x0f, 0xb9, 0x97, + 0xa3, 0xfc, 0x4e, 0x6b, 0x31, 0x58, 0x02, 0x4f, + 0x24, 0xcd, 0x72, 0x60, 0x1b, 0xe6, 0xf8, 0x1d, + 0x76, 0x37, 0xf4, 0x44, 0x86, 0xf8, 0xb6, 0x88, + 0x27, 0x83, 0x96, 0x46, 0x1b, 0xc8, 0xb5, 0xce, + 0xc4, 0xfe, 0x9f, 0x3c, 0xe5, 0x7b, 0xe4, 0x1b, + 0x44, 0xc9, 0x5e, 0x99, 0xf1, 0xee, 0x5b, 0x8d, + 0x10, 0xe5, 0xc2, 0x3c, 0xeb, 0x70, 0xb7, 0x45, + 0xd8, 0xdf, 0x7a, 0xbd, 0x22, 0x3c, 0xc0, 0xbe, + 0x9f, 0x82, 0x1c, 0xd7, 0x38, 0x46, 0x44, 0x84, + 0x86, 0x00, 0xac, 0x0c, 0xb2, 0xa8, 0xd1, 0xc5, + 0x6e, 0x55, 0xec, 0x15, 0x89, 0x37, 0x0c, 0xc0, + 0x1b, 0x77, 0xa8, 0x94, 0xbf, 0xbe, 0xec, 0xc9, + 0xf8, 0xe4, 0x52, 0xfb, 0x23, 0x3a, 0x80, 0x1a, + 0x07, 0xe4, 0x39, 0x8a, 0x5e, 0x46, 0xf8, 0xed, + 0x24, 0xd3, 0x98, 0x4c, 0x27, 0xde, 0x8e, 0xf8, + 0xcf, 0x01, 0x7b, 0x24, 0x01, 0xb1, 0x6e, 0x5b, + 0xc9, 0x7a, 0xa9, 0x53, 0xda, 0x5f, 0x32, 0xef, + 0x75, 0x46, 0xd5, 0x28, 0x2a, 0x5e, 0xe0, 0x29, + 0x65, 0x56, 0xe9, 0x63, 0xaf, 0x54, 0xc8, 0xfc, + 0x10, 0x2b, 0xd8, 0x26, 0x5e, 0x85, 0xcc, 0x05, + 0x65, 0x7b, 0xee, 0x59, 0xf9, 0x17, 0xf2, 0x4b, + 0xf3, 0x59, 0xe2, 0x19, 0xe8, 0x8e, 0x5f, 0x42, + 0x4c, 0x68, 0xe1, 0x40, 0x66, 0x19, 0x7e, 0xd5, + 0xc3, 0xf1, 0x00, 0xed, 0x20, 0xec, 0xea, 0x35, + 0x67, 0x3e, 0xb8, 0x66, 0x5e, 0x38, 0xba, 0xf0, + 0x45, 0xf3, 0x48, 0x57, 0x2e, 0xf0, 0x0b, 0xcf, + 0x2e, 0x3c, 0x9b, 0x7f, 0xf6, 0x30, 0x18, 0x64, + 0x3b, 0x44, 0xbb, 0xb8, 0x82, 0x6c, 0x87, 0x9d, + 0xbc, 0xd8, 0xbf, 0x18, 0x7f, 0x2e, 0x83, 0x14, + 0xa2, 0x2d, 0xac, 0xf0, 0x67, 0xc8, 0x1f, 0x70, + 0xca, 0x8e, 0xb1, 0x5b, 0xd1, 0xe2, 0xc9, 0xbe, + 0x4f, 0x27, 0xa3, 0x97, 0x22, 0x82, 0x39, 0x10, + 0xbd, 0x54, 0xc4, 0x1e, 0x04, 0x59, 0xb7, 0x0a, + 0xff, 0x43, 0x7c, 0x52, 0x01, 0xec, 0x9a, 0x35, + 0x72, 0x1c, 0xbd, 0x29, 0xc1, 0x17, 0xe5, 0xb4, + 0x93, 0xeb, 0x65, 0x5a, 0x31, 0x06, 0x3b, 0xe9, + 0x2d, 0xfe, 0x63, 0xa1, 0xf6, 0xdd, 0x41, 0xfa, + 0xaf, 0xcd, 0x83, 0xb4, 0xb2, 0xc9, 0x6f, 0x3e, + 0xbb, 0xf4, 0xac, 0x20, 0x78, 0xf5, 0x27, 0xa3, + 0x01, 0x92, 0x55, 0x00, 0xfe, 0x35, 0x7c, 0x95, + 0x9a, 0xbf, 0x7f, 0x16, 0x19, 0x83, 0x5f, 0x1e, + 0x7f, 0x42, 0xee, 0xb9, 0x8f, 0x9e, 0xdd, 0x21, + 0xef, 0x9f, 0xb5, 0xdd, 0x8f, 0xe0, 0xd5, 0x77, + 0x44, 0x3c, 0xc1, 0xb6, 0x9d, 0xd0, 0x4b, 0xd5, + 0xb9, 0xe1, 0x5d, 0xa2, 0x25, 0x36, 0x5f, 0x47, + 0x46, 0xe1, 0x7c, 0xfd, 0xa6, 0x3d, 0x6b, 0xcf, + 0xd6, 0x67, 0xa5, 0xce, 0xe1, 0xdb, 0x06, 0xa0, + 0x7a, 0xc1, 0xd5, 0x47, 0xcb, 0x01, 0xff, 0xf7, + 0x60, 0x5f, 0x8a, 0x38, 0x3f, 0xca, 0x5f, 0x36, + 0x98, 0x52, 0x8d, 0x77, 0xdb, 0x18, 0x45, 0xe8, + 0x16, 0x5b, 0x65, 0xae, 0xbb, 0x0b, 0xee, 0x4d, + 0xb7, 0xc6, 0xa3, 0xb3, 0x19, 0xb5, 0xf8, 0x0e, + 0x73, 0x04, 0xdb, 0x5d, 0xf0, 0x0d, 0x05, 0x73, + 0x0d, 0xf0, 0x70, 0x2b, 0x62, 0xdf, 0x81, 0x44, + 0x1e, 0xc4, 0x2d, 0xe4, 0xb9, 0x9e, 0xb6, 0x4e, + 0x59, 0xe4, 0x47, 0x5a, 0x65, 0x55, 0x6b, 0xb5, + 0x1f, 0xcd, 0x03, 0xad, 0x9e, 0x2c, 0x88, 0xfc, + 0x56, 0x14, 0xc5, 0x88, 0x62, 0x05, 0xbd, 0x68, + 0x81, 0x82, 0xd1, 0x02, 0xda, 0xba, 0xc8, 0x59, + 0xcb, 0x12, 0xdc, 0x4b, 0x38, 0x4b, 0x0a, 0x3c, + 0x41, 0x2b, 0xc1, 0x45, 0xd4, 0x92, 0x7f, 0x87, + 0xbd, 0xe8, 0x2f, 0xd1, 0x8b, 0xfb, 0x37, 0xed, + 0xdb, 0x3b, 0x92, 0x51, 0xd6, 0x10, 0x21, 0x72, + 0xe4, 0x1e, 0x50, 0xc1, 0xfd, 0x38, 0xc7, 0xbe, + 0xd2, 0x55, 0x9d, 0x20, 0xf7, 0xa3, 0x85, 0x79, + 0xca, 0x75, 0xf0, 0x35, 0x96, 0xba, 0x63, 0x7f, + 0x9f, 0xde, 0xbb, 0xf8, 0x77, 0xdb, 0xc2, 0xa8, + 0x5f, 0xd1, 0xbe, 0x2b, 0x50, 0xc3, 0x4b, 0xe4, + 0xe1, 0xd3, 0xf0, 0x2b, 0x5f, 0xb7, 0xd7, 0x9d, + 0x97, 0x2c, 0xe6, 0xc4, 0xdc, 0xd3, 0xea, 0xe0, + 0x55, 0x49, 0x3b, 0x3c, 0x06, 0xfb, 0x0c, 0xac, + 0x24, 0xfd, 0x24, 0x62, 0x65, 0xf1, 0x07, 0xad, + 0x52, 0x6b, 0xaa, 0xf5, 0xe7, 0x60, 0x62, 0x9f, + 0x98, 0x15, 0x73, 0xd6, 0xac, 0x38, 0xb3, 0x1b, + 0x95, 0xdd, 0x59, 0x19, 0x83, 0x02, 0x0d, 0xa9, + 0x05, 0xe7, 0xbc, 0x71, 0xae, 0x79, 0x60, 0x8f, + 0x42, 0x2c, 0x7a, 0xd7, 0x9c, 0x8e, 0xce, 0xda, + 0x69, 0x47, 0x0b, 0x34, 0x4f, 0xfe, 0x85, 0xc6, + 0xd1, 0xef, 0xaa, 0x82, 0xed, 0x11, 0x77, 0x04, + 0x7e, 0x3c, 0xcc, 0x11, 0x6f, 0xba, 0x1a, 0x48, + 0xad, 0xc6, 0xb3, 0xee, 0x1c, 0x67, 0xce, 0x6d, + 0x57, 0x72, 0xf2, 0xd1, 0x4f, 0x29, 0x5a, 0x1a, + 0xf8, 0x27, 0xb0, 0xce, 0xee, 0x65, 0x58, 0xa1, + 0x9b, 0xe0, 0x89, 0x3c, 0x70, 0xaf, 0xc8, 0xfc, + 0x6f, 0x50, 0xa4, 0x3a, 0xbb, 0x28, 0x34, 0x16, + 0x1e, 0x0b, 0xf6, 0x85, 0xfa, 0x35, 0xb3, 0x6a, + 0x9f, 0xd9, 0xe9, 0xaf, 0x82, 0xf4, 0x79, 0x12, + 0x4a, 0xa2, 0x9b, 0x10, 0xec, 0xf1, 0x10, 0xa9, + 0x46, 0x8c, 0x7d, 0xcb, 0x04, 0x1f, 0x04, 0xf3, + 0x2a, 0xc8, 0xaa, 0xa1, 0x56, 0x4a, 0x54, 0x64, + 0x08, 0x5f, 0xf2, 0xe0, 0x89, 0x58, 0x21, 0x64, + 0x46, 0x8b, 0x51, 0x2b, 0x86, 0x55, 0x33, 0x7d, + 0xae, 0x70, 0x3f, 0xab, 0x15, 0xb1, 0x61, 0xf1, + 0xbd, 0x67, 0x84, 0xf6, 0x9a, 0xe9, 0x4a, 0xb6, + 0x49, 0xde, 0xdc, 0x0e, 0xe4, 0xff, 0x95, 0x5e, + 0xf6, 0x01, 0x51, 0x0e, 0x1e, 0x22, 0x3b, 0xd1, + 0xc5, 0xeb, 0xeb, 0xe7, 0xf7, 0x11, 0x13, 0xc0, + 0xab, 0xd8, 0x7b, 0x59, 0x11, 0x33, 0x8a, 0x7c, + 0x66, 0xf8, 0x2b, 0x99, 0x81, 0xf5, 0xbe, 0x0b, + 0x6c, 0xe5, 0x0c, 0xcf, 0x92, 0x27, 0x03, 0x95, + 0x02, 0x18, 0xa3, 0x02, 0xdc, 0x89, 0xaf, 0x46, + 0x76, 0x19, 0x1c, 0x8a, 0xe0, 0x32, 0x29, 0x61, + 0xf4, 0x75, 0xc3, 0xda, 0xb0, 0x3e, 0xe7, 0x9b, + 0x64, 0xc3, 0xdb, 0xf0, 0x1a, 0x35, 0xa5, 0x16, + 0xf3, 0x30, 0xd2, 0x7b, 0x9a, 0xc5, 0x0e, 0x86, + 0x6b, 0x37, 0xa9, 0xd0, 0xb1, 0xad, 0x31, 0x9e, + 0x8f, 0x6c, 0xd9, 0x3e, 0xca, 0x64, 0x8a, 0x65, + 0x8d, 0x3f, 0x76, 0x26, 0xcc, 0x84, 0x99, 0xb5, + 0xbf, 0x7b, 0x17, 0x03, 0xd9, 0x24, 0x5e, 0xb2, + 0x9d, 0xae, 0xce, 0xfe, 0xed, 0x63, 0xb9, 0xbe, + 0x47, 0xf0, 0x19, 0x32, 0xae, 0x48, 0xc6, 0xf8, + 0xfb, 0x99, 0xd6, 0x5c, 0xa0, 0x55, 0x5f, 0xbd, + 0x13, 0xde, 0x8d, 0x5d, 0x10, 0xec, 0x3d, 0x1a, + 0xce, 0xbb, 0xd0, 0xa2, 0x5d, 0xe2, 0x35, 0x31, + 0x0b, 0xe7, 0x4d, 0xc2, 0x30, 0x60, 0xac, 0xd3, + 0x84, 0x36, 0xa2, 0x25, 0x93, 0xc2, 0x3a, 0xb7, + 0x52, 0xe0, 0x11, 0x64, 0x02, 0xea, 0x4d, 0x77, + 0xe1, 0x5d, 0xe1, 0x00, 0x7d, 0xe9, 0x54, 0x05, + 0xef, 0x0b, 0xfc, 0xee, 0x00, 0xb9, 0x01, 0x65, + 0x38, 0x40, 0xcb, 0x9a, 0x86, 0xa9, 0x3b, 0x0b, + 0xce, 0xad, 0xdd, 0x27, 0x42, 0xd7, 0xa5, 0x95, + 0x74, 0x1d, 0x11, 0x59, 0xba, 0x2e, 0xd0, 0x99, + 0xf8, 0x59, 0xb3, 0x31, 0x83, 0x74, 0x3b, 0x2f, + 0x7d, 0x0d, 0xf8, 0x5c, 0xb8, 0x8f, 0xe9, 0x2e, + 0x7c, 0x6e, 0xd7, 0x40, 0xb6, 0xbe, 0x87, 0xde, + 0xfe, 0x48, 0x18, 0xeb, 0x8b, 0x83, 0x16, 0x4c, + 0x98, 0xb8, 0x3e, 0x92, 0x35, 0xd4, 0xcf, 0x10, + 0x21, 0x7f, 0x79, 0xfc, 0xdd, 0xf6, 0xcf, 0x29, + 0x7b, 0xf2, 0xe7, 0x1b, 0x8d, 0xab, 0xce, 0x95, + 0xe0, 0x11, 0xfb, 0xcc, 0xd0, 0xf6, 0xb5, 0x07, + 0x13, 0x3b, 0x61, 0x15, 0x09, 0xd8, 0x71, 0x03, + 0x50, 0xb7, 0xa1, 0x3c, 0x0c, 0x92, 0x55, 0x8c, + 0x76, 0x61, 0x2e, 0x9c, 0xc9, 0xfb, 0xdd, 0xaa, + 0x38, 0x69, 0x27, 0xb9, 0xd1, 0xdc, 0x9d, 0x48, + 0xfe, 0x6f, 0xf0, 0xe9, 0xfe, 0xb7, 0x93, 0x35, + 0x9f, 0x9a, 0x6a, 0x67, 0x4a, 0x8d, 0x18, 0x47, + 0x54, 0xb9, 0x78, 0x64, 0x29, 0x95, 0xa3, 0x18, + 0x8b, 0x81, 0xbf, 0x72, 0x5a, 0x3b, 0xa5, 0xe5, + 0x93, 0x98, 0xe3, 0x0b, 0xed, 0xaf, 0x32, 0xdf, + 0x65, 0x60, 0x05, 0x15, 0x91, 0xad, 0x84, 0x2d, + 0x9a, 0x64, 0x82, 0x7d, 0x17, 0xad, 0x51, 0xd6, + 0xf8, 0xee, 0x5d, 0x7c, 0xaf, 0x19, 0x94, 0xdd, + 0x92, 0x5d, 0x76, 0xc0, 0x83, 0xdb, 0x88, 0x61, + 0x0e, 0x08, 0x3c, 0x4d, 0x72, 0xb0, 0x8d, 0x48, + 0x2f, 0x48, 0xc2, 0x3c, 0x97, 0x3c, 0xdb, 0x03, + 0xfc, 0x49, 0x47, 0x04, 0x5f, 0x45, 0xa9, 0x15, + 0x5a, 0xfd, 0x08, 0xc1, 0x5f, 0xfe, 0x09, 0xbe, + 0x47, 0x4b, 0x5a, 0xd1, 0x61, 0x45, 0x64, 0x4b, + 0x0f, 0x57, 0xcc, 0x44, 0x07, 0x63, 0x0c, 0xa4, + 0x3d, 0xcd, 0xa7, 0xfc, 0x92, 0x6f, 0xfb, 0xe4, + 0x4d, 0x2f, 0x6e, 0x06, 0xd8, 0xfb, 0x39, 0xd1, + 0x48, 0x92, 0xa7, 0x5b, 0xaf, 0x00, 0xa7, 0x9f, + 0x07, 0x3d, 0x51, 0xda, 0xb1, 0x1b, 0x88, 0x64, + 0xd2, 0x6c, 0xb2, 0x5d, 0x6a, 0x3f, 0x6c, 0x6b, + 0x8d, 0xac, 0xbd, 0xd6, 0xf9, 0xca, 0x98, 0x37, + 0x2a, 0xfb, 0x25, 0x6f, 0xd9, 0xbc, 0xdc, 0x29, + 0xee, 0x44, 0x1e, 0x3d, 0x78, 0x56, 0x30, 0x5f, + 0x4d, 0x89, 0x7e, 0xda, 0x59, 0x96, 0xd5, 0x8b, + 0x7a, 0x75, 0x5a, 0xc6, 0x55, 0x00, 0x7f, 0xc3, + 0x07, 0xa0, 0xce, 0x2d, 0xb7, 0xf0, 0x28, 0xb6, + 0x8a, 0x3b, 0xe5, 0x86, 0x94, 0xf6, 0x08, 0x31, + 0xca, 0xca, 0xb5, 0x93, 0xd6, 0x0a, 0xaf, 0xaa, + 0x2c, 0x60, 0x3a, 0x78, 0xae, 0x2d, 0xa3, 0x75, + 0xb1, 0x65, 0xec, 0xac, 0xec, 0x18, 0x8d, 0x90, + 0xd9, 0x25, 0xf0, 0x55, 0xa2, 0x0b, 0xf3, 0xe3, + 0xc8, 0x83, 0x38, 0x20, 0x83, 0xbb, 0x20, 0x77, + 0x49, 0xa9, 0x73, 0xee, 0xeb, 0xcb, 0xc1, 0x79, + 0xb0, 0x1e, 0x4d, 0x1f, 0x74, 0x92, 0x9f, 0xe5, + 0xe3, 0x6c, 0x3e, 0x60, 0x00, 0xa1, 0xa4, 0xc4, + 0x6a, 0x42, 0x52, 0x85, 0xd5, 0x10, 0x87, 0xe1, + 0xcd, 0x6b, 0x1f, 0x8a, 0xf8, 0xb3, 0xc2, 0x2a, + 0xe0, 0xeb, 0x96, 0x19, 0x58, 0x5d, 0x17, 0xbe, + 0x93, 0xf8, 0x71, 0x09, 0x66, 0xab, 0x78, 0x7c, + 0x47, 0xb0, 0x76, 0x25, 0x3f, 0xa7, 0x9f, 0x3d, + 0x06, 0x5f, 0x90, 0x25, 0x9c, 0x44, 0x90, 0x52, + 0x19, 0x56, 0x0a, 0x28, 0x43, 0x07, 0xc9, 0x56, + 0xf3, 0xe8, 0x84, 0x9f, 0x49, 0x0b, 0xef, 0x24, + 0x93, 0x6d, 0x44, 0x78, 0x44, 0x60, 0x2d, 0x3c, + 0xd3, 0xfb, 0x14, 0xf4, 0x55, 0x26, 0xc8, 0x6e, + 0x4c, 0x83, 0xbf, 0x97, 0x56, 0x31, 0x5a, 0x9b, + 0xa0, 0xa4, 0x3d, 0x26, 0x74, 0x03, 0x66, 0xf0, + 0x33, 0x7e, 0x4a, 0x2f, 0x04, 0x29, 0x3f, 0x47, + 0x53, 0x7f, 0xce, 0xa8, 0x51, 0x34, 0x0f, 0x3c, + 0x42, 0xac, 0x3b, 0xc2, 0xaa, 0x37, 0x47, 0x77, + 0x4e, 0xb3, 0x11, 0xe7, 0x92, 0x1b, 0x57, 0x07, + 0x30, 0xff, 0x8f, 0x82, 0x0d, 0x74, 0x20, 0x0f, + 0x12, 0x7a, 0xa9, 0xaa, 0x39, 0x6c, 0xa8, 0x46, + 0xa5, 0xbd, 0xb8, 0xba, 0x76, 0x34, 0x67, 0x94, + 0x8c, 0xd2, 0xfe, 0x87, 0xf4, 0xd6, 0xd5, 0xe5, + 0x07, 0x0f, 0xbe, 0x37, 0xd5, 0x28, 0x07, 0xd4, + 0x0c, 0x39, 0x03, 0xe7, 0xc8, 0x16, 0x56, 0x56, + 0xd5, 0x68, 0x2d, 0xe5, 0x21, 0x7e, 0xd6, 0x94, + 0x6c, 0x30, 0x6e, 0x34, 0xbc, 0x8c, 0x97, 0x6e, + 0x64, 0x5e, 0x9f, 0x73, 0xfe, 0xfb, 0x1f, 0x29, + 0x27, 0xe3, 0xa4, 0x61, 0xfe, 0x6e, 0x26, 0xa5, + 0xf7, 0x24, 0xfc, 0xa7, 0xc6, 0x8c, 0x9f, 0x31, + 0x67, 0x58, 0x1a, 0x70, 0x6e, 0xda, 0x49, 0x79, + 0xb3, 0xe4, 0x8e, 0x2a, 0xef, 0x68, 0x39, 0x30, + 0xac, 0x35, 0x6e, 0x58, 0xf7, 0x83, 0x33, 0xc7, + 0xf9, 0xbd, 0xbf, 0x04, 0xe4, 0x78, 0x74, 0x97, + 0xfc, 0x90, 0xf8, 0x11, 0x91, 0xea, 0x22, 0x5f, + 0xf1, 0x8a, 0xb5, 0x19, 0x96, 0x0a, 0x66, 0x0c, + 0x63, 0x7f, 0xbb, 0x4d, 0xde, 0x68, 0xed, 0x4c, + 0xad, 0x68, 0x56, 0x93, 0x32, 0xea, 0x92, 0x3a, + 0x7a, 0x85, 0xb3, 0x0b, 0xf7, 0x3d, 0xc1, 0xae, + 0xd1, 0x4d, 0x2d, 0xa5, 0xa5, 0x7e, 0x1a, 0x4f, + 0x52, 0x91, 0xd7, 0x90, 0x9c, 0x04, 0xbc, 0xeb, + 0xd3, 0xde, 0x0a, 0x22, 0x78, 0xfb, 0xac, 0x53, + 0xd7, 0xc9, 0xcf, 0x53, 0xf8, 0x5a, 0xd4, 0x36, + 0xd6, 0x2b, 0x0e, 0x5a, 0x32, 0xd8, 0x78, 0xf6, + 0x6a, 0x2f, 0x13, 0xe4, 0x7d, 0xed, 0x97, 0xc2, + 0x6e, 0xed, 0x9f, 0x98, 0x3d, 0x94, 0x08, 0x6a, + 0x5b, 0x1d, 0xea, 0xae, 0x51, 0x64, 0x58, 0xe2, + 0x31, 0x4f, 0xe7, 0x69, 0x45, 0x7a, 0x5e, 0x74, + 0xa5, 0x8d, 0xf8, 0x6a, 0x88, 0xaf, 0x00, 0xf6, + 0xbe, 0xe9, 0x0f, 0xe9, 0x95, 0x60, 0xc9, 0xbf, + 0xa8, 0xdd, 0xfc, 0xf3, 0x90, 0x1a, 0xe6, 0xbc, + 0xc0, 0x8e, 0x82, 0xa5, 0x04, 0x6f, 0x63, 0xb2, + 0xf3, 0xdf, 0x3c, 0xd5, 0x49, 0xf9, 0xe9, 0xd7, + 0x9a, 0x6b, 0xee, 0x47, 0xb8, 0x2e, 0x69, 0xa1, + 0x06, 0x40, 0x3e, 0xf2, 0x3d, 0xb7, 0x72, 0x3c, + 0x4c, 0x46, 0x3a, 0x97, 0x8d, 0x38, 0x68, 0x7e, + 0xad, 0xa5, 0xb5, 0x00, 0xd3, 0x75, 0xce, 0x3d, + 0x1e, 0x7d, 0x5c, 0x3e, 0x5e, 0xe6, 0xe5, 0x63, + 0xc0, 0x93, 0x8f, 0x47, 0xd0, 0x17, 0x35, 0x95, + 0x13, 0x3e, 0x57, 0xbf, 0x56, 0xb3, 0x8f, 0x37, + 0xa2, 0xdc, 0x14, 0x66, 0xa7, 0x6c, 0x66, 0x5b, + 0x76, 0xeb, 0xa5, 0x12, 0x57, 0xe3, 0x6a, 0x4c, + 0x48, 0x5d, 0x1c, 0xa4, 0xfc, 0x91, 0xf1, 0x25, + 0x1c, 0x9f, 0x75, 0xfe, 0xed, 0xb1, 0xd3, 0xfa, + 0x32, 0xd8, 0x6a, 0xc5, 0xac, 0xd3, 0x66, 0x3e, + 0x19, 0x59, 0x49, 0x98, 0x21, 0x6b, 0xda, 0x9a, + 0xe2, 0x93, 0xe0, 0xa5, 0xf4, 0x22, 0x09, 0x44, + 0x56, 0x62, 0xd2, 0x36, 0xac, 0x7e, 0x67, 0xca, + 0xb9, 0x7a, 0x00, 0xde, 0x97, 0xff, 0xd9, 0xca, + 0xa3, 0x63, 0xc1, 0x2c, 0x08, 0xb1, 0x99, 0x22, + 0x6a, 0x49, 0x57, 0x01, 0x71, 0xae, 0x46, 0x5c, + 0x78, 0x64, 0xc0, 0xcb, 0x0c, 0x2f, 0x7a, 0x00, + 0xab, 0x84, 0x51, 0xf0, 0xa9, 0x2e, 0xf3, 0x47, + 0x22, 0xbf, 0x3f, 0xe3, 0x2a, 0x3d, 0xe6, 0x0f, + 0x7a, 0xfc, 0x18, 0xb1, 0x99, 0x66, 0x53, 0x41, + 0x89, 0x19, 0x6c, 0xa0, 0x7a, 0xf4, 0x44, 0xd5, + 0x1b, 0x7e, 0x7d, 0xb9, 0x3a, 0x7c, 0x70, 0xa6, + 0x76, 0x29, 0x2f, 0xeb, 0x62, 0x48, 0x9d, 0x88, + 0x48, 0x3c, 0xc6, 0xe2, 0x89, 0x88, 0x31, 0x64, + 0xb6, 0x5e, 0x59, 0x31, 0x11, 0x65, 0x8a, 0x6a, + 0x0f, 0x3f, 0x79, 0x9b, 0xb4, 0x2e, 0xb7, 0x86, + 0x5a, 0xc9, 0xad, 0xc1, 0x88, 0x7b, 0x4c, 0xb9, + 0xb9, 0x82, 0x79, 0xe8, 0x9b, 0x46, 0xf4, 0x15, + 0xf6, 0x2f, 0xbf, 0x08, 0x9f, 0xfe, 0x58, 0x78, + 0xa9, 0x31, 0x94, 0x9c, 0x20, 0x7d, 0x5c, 0x08, + 0x39, 0x81, 0x1a, 0xc8, 0xa1, 0xae, 0x7c, 0x22, + 0xae, 0x39, 0x4e, 0x67, 0x29, 0x56, 0x58, 0x29, + 0x16, 0x46, 0x41, 0x04, 0x4b, 0x1d, 0x2b, 0x23, + 0x5a, 0x8b, 0x32, 0x47, 0x1f, 0x46, 0x6b, 0xa3, + 0x78, 0xed, 0x40, 0x66, 0x5c, 0x89, 0xf0, 0xe4, + 0xd0, 0x11, 0xd6, 0x2c, 0x88, 0x7c, 0xd4, 0x41, + 0x8c, 0xc5, 0x99, 0x8a, 0x35, 0x53, 0xb8, 0x17, + 0xc4, 0x00, 0xe9, 0x39, 0xaa, 0x30, 0x51, 0x89, + 0x27, 0xf8, 0xbe, 0x11, 0xe3, 0x37, 0xf2, 0xf1, + 0x72, 0x81, 0x69, 0x39, 0x47, 0x92, 0xb3, 0x9d, + 0xb6, 0xb1, 0x2e, 0x93, 0x5a, 0x92, 0x61, 0x85, + 0x5c, 0x63, 0xd5, 0x3a, 0xdd, 0x1d, 0x11, 0x31, + 0x07, 0xd2, 0x46, 0x0f, 0x77, 0x8e, 0x3e, 0x10, + 0xb6, 0x7b, 0xb8, 0xfb, 0x92, 0xae, 0x33, 0x18, + 0x7c, 0xdd, 0x5d, 0x77, 0xef, 0x39, 0xdf, 0x3a, + 0xf0, 0xb9, 0x4e, 0x42, 0x30, 0x8e, 0xde, 0x8f, + 0x06, 0x48, 0xfd, 0xd5, 0x97, 0x2c, 0xf8, 0x8a, + 0xcc, 0x9f, 0xae, 0xcc, 0xa5, 0x46, 0x44, 0x21, + 0x45, 0xd4, 0xf1, 0x01, 0x82, 0x3a, 0x20, 0xad, + 0x0a, 0xfc, 0x05, 0x78, 0x5a, 0xbf, 0xf2, 0xe8, + 0x89, 0x85, 0xfa, 0xac, 0xd9, 0x20, 0xee, 0x3d, + 0x77, 0xd9, 0x39, 0xef, 0x4c, 0x9b, 0x93, 0xac, + 0x64, 0xda, 0x0e, 0x71, 0xa7, 0x42, 0xd4, 0x27, + 0x3d, 0x60, 0xf0, 0x9c, 0xc9, 0x24, 0x59, 0x22, + 0x46, 0x18, 0x74, 0x11, 0xd2, 0xce, 0x24, 0xcf, + 0x02, 0xae, 0xce, 0xbd, 0xe4, 0x26, 0x9c, 0xa1, + 0xda, 0x29, 0xe4, 0xf9, 0x91, 0x98, 0x3a, 0x24, + 0xa6, 0x39, 0x07, 0x78, 0x0d, 0x2b, 0xb5, 0xe6, + 0xea, 0x43, 0x44, 0x44, 0x82, 0x6a, 0x3a, 0xd3, + 0x1d, 0xdb, 0xfd, 0x4c, 0x8d, 0xf8, 0x75, 0x9f, + 0x04, 0x0c, 0x99, 0xb7, 0x38, 0x1b, 0xa2, 0x8a, + 0x73, 0x96, 0xc9, 0xdc, 0x53, 0x4c, 0x68, 0xe0, + 0x4b, 0xad, 0xb8, 0x75, 0xc6, 0xfc, 0x3a, 0x89, + 0xdc, 0xda, 0x74, 0xbb, 0x68, 0xa9, 0x2c, 0x4f, + 0x45, 0xad, 0xa5, 0xa3, 0xd8, 0x0d, 0xac, 0xd8, + 0x06, 0x4c, 0xfd, 0xea, 0x59, 0x6a, 0x8b, 0x3a, + 0xda, 0xe1, 0x84, 0xfd, 0x27, 0xf4, 0x9d, 0x7a, + 0x7c, 0xa4, 0xea, 0x4e, 0x75, 0x47, 0x75, 0x13, + 0xf5, 0x94, 0x52, 0x11, 0x9e, 0x81, 0x5a, 0x25, + 0x82, 0x0f, 0x1c, 0x56, 0xaf, 0xec, 0x6a, 0x5b, + 0x80, 0x0d, 0xe9, 0x4c, 0x77, 0xa6, 0x95, 0xe6, + 0xdb, 0xe4, 0x34, 0xdc, 0xdb, 0x9f, 0x4c, 0xb9, + 0x82, 0x85, 0x40, 0x83, 0x35, 0xf9, 0x52, 0xac, + 0x95, 0x58, 0x29, 0x46, 0x0f, 0xe6, 0x6a, 0x0f, + 0xa6, 0x43, 0x0b, 0xeb, 0x3e, 0xf7, 0x34, 0x2f, + 0xf9, 0x26, 0xdd, 0xc1, 0xdc, 0xd3, 0x79, 0x61, + 0x43, 0xd7, 0xed, 0x11, 0xb4, 0xa1, 0x94, 0x78, + 0x23, 0x9e, 0x38, 0x0b, 0xf7, 0xfa, 0xca, 0x23, + 0x7f, 0x3d, 0xdf, 0x5d, 0xf6, 0x4a, 0xd4, 0xee, + 0xf9, 0x38, 0x61, 0x86, 0x37, 0xc0, 0x0c, 0x2f, + 0xe1, 0xe7, 0x05, 0x0b, 0xc4, 0x16, 0x71, 0x06, + 0x86, 0xf5, 0x7d, 0x54, 0x8e, 0xfe, 0x4f, 0xf8, + 0xb3, 0x9c, 0x0d, 0x29, 0x77, 0xc8, 0x65, 0x98, + 0x7d, 0x2f, 0xa6, 0xa3, 0xbc, 0xc7, 0xba, 0x04, + 0xbc, 0x84, 0xf5, 0x66, 0x8c, 0x74, 0x25, 0x63, + 0xa1, 0xc7, 0x36, 0x14, 0x15, 0xb3, 0xa2, 0xca, + 0x5b, 0xbc, 0x7f, 0xe4, 0x4d, 0x54, 0x38, 0xc2, + 0xd2, 0xca, 0x11, 0x13, 0xff, 0xe0, 0xbb, 0x22, + 0xfe, 0xdf, 0x8b, 0x21, 0x03, 0x4a, 0x17, 0xd8, + 0x20, 0x41, 0xc6, 0xc8, 0x4b, 0x2e, 0xaf, 0x23, + 0x11, 0x88, 0xb2, 0x09, 0x25, 0xbd, 0x95, 0x06, + 0x29, 0xc5, 0x6c, 0x69, 0xd6, 0x99, 0x72, 0x9e, + 0x7b, 0xe9, 0xdd, 0xac, 0x36, 0x91, 0xa4, 0x07, + 0x38, 0xcf, 0x51, 0xc6, 0x44, 0xb5, 0x48, 0xad, + 0xf0, 0xfa, 0x89, 0xa8, 0x7e, 0x92, 0x51, 0x81, + 0xa1, 0xb0, 0x52, 0xfe, 0x9e, 0x32, 0x07, 0xbe, + 0xc9, 0x68, 0x77, 0x44, 0xc9, 0xf0, 0xd9, 0x13, + 0xb8, 0x2e, 0xda, 0xdd, 0xa9, 0xe3, 0x02, 0x66, + 0x54, 0x2d, 0x8c, 0x73, 0xce, 0x3b, 0xb3, 0x96, + 0xcc, 0xe1, 0x2a, 0xad, 0x55, 0x40, 0x20, 0x4d, + 0x1e, 0xb3, 0xca, 0xa0, 0x47, 0x2a, 0x42, 0xab, + 0x49, 0x0f, 0x5e, 0xfa, 0xce, 0x18, 0xbd, 0x40, + 0x0f, 0x92, 0x00, 0x72, 0xfe, 0xc0, 0x35, 0xb8, + 0x01, 0xa8, 0xe3, 0x83, 0xd6, 0x8a, 0xac, 0x2b, + 0x87, 0x7b, 0xc9, 0x92, 0x0c, 0x99, 0xe3, 0xbf, + 0x67, 0xe8, 0xcf, 0x24, 0xd8, 0x32, 0x3f, 0xe7, + 0x4e, 0x84, 0x3c, 0x64, 0x0a, 0x9a, 0x2e, 0xd1, + 0xbd, 0x0d, 0x5e, 0xce, 0x22, 0x8f, 0x87, 0xb5, + 0x2d, 0x4c, 0x99, 0xb7, 0xab, 0x7b, 0xf6, 0x9e, + 0x22, 0xd8, 0x80, 0x17, 0x8c, 0x87, 0xc7, 0x29, + 0xe3, 0xda, 0xf1, 0xa6, 0x91, 0xe5, 0x33, 0x4c, + 0xfa, 0x68, 0x13, 0xe6, 0x1f, 0x92, 0x8a, 0x88, + 0x97, 0x92, 0x16, 0x48, 0x5b, 0xf7, 0xd3, 0x5e, + 0xce, 0x4b, 0x51, 0x74, 0xb7, 0x58, 0xbd, 0x53, + 0x55, 0x06, 0x7a, 0x28, 0x88, 0x6a, 0xbd, 0x23, + 0xc4, 0x75, 0x83, 0x55, 0x60, 0xbf, 0x3e, 0x2b, + 0xd7, 0x78, 0x48, 0xf9, 0x55, 0x07, 0x06, 0xd8, + 0xfb, 0x58, 0xed, 0x93, 0x22, 0xb3, 0x04, 0xcf, + 0xca, 0xea, 0x1f, 0xd0, 0x76, 0xfc, 0x92, 0xd0, + 0x48, 0xe8, 0x27, 0x61, 0xc5, 0x73, 0x1a, 0x70, + 0x60, 0xdf, 0xb7, 0x4a, 0xdb, 0x97, 0xec, 0x4f, + 0x9d, 0x82, 0x88, 0xa8, 0x61, 0x4c, 0x4d, 0x32, + 0x43, 0x30, 0xe7, 0x41, 0x30, 0xaf, 0xc9, 0xae, + 0x74, 0x37, 0x8d, 0x89, 0xb7, 0xb9, 0xb0, 0xaa, + 0x2a, 0x7b, 0xac, 0x89, 0x8a, 0x2a, 0xe6, 0x5d, + 0xa0, 0x73, 0xb4, 0x08, 0x1e, 0xa2, 0x41, 0x65, + 0xbf, 0x09, 0xd2, 0xaf, 0xdf, 0x47, 0x26, 0x13, + 0xc7, 0x6c, 0x23, 0x5e, 0x9b, 0x8c, 0xdb, 0x68, + 0x20, 0x07, 0x0b, 0xbb, 0x1f, 0xf5, 0xac, 0x15, + 0xd6, 0x28, 0xf4, 0x75, 0x2b, 0x7c, 0x67, 0x98, + 0x03, 0x94, 0xd9, 0x07, 0xcb, 0x7e, 0xec, 0x7e, + 0xec, 0xde, 0x26, 0xb7, 0xdd, 0x3b, 0x76, 0xd5, + 0xb0, 0x0d, 0x27, 0xac, 0x4b, 0x0c, 0xd9, 0x86, + 0x9c, 0xda, 0x0d, 0x64, 0x83, 0x98, 0x69, 0x0a, + 0x5a, 0x7e, 0x37, 0xbd, 0xab, 0xed, 0x69, 0x7b, + 0x13, 0x3f, 0xf5, 0xaa, 0x1b, 0x38, 0xf6, 0x28, + 0xc0, 0xbc, 0x3e, 0x0e, 0xf8, 0x5f, 0x4f, 0x62, + 0xaf, 0xbc, 0x29, 0x02, 0xce, 0x5b, 0xf6, 0x4b, + 0xf2, 0xab, 0xf1, 0xa1, 0xf1, 0x9f, 0x7e, 0xa6, + 0x3b, 0x0e, 0xb2, 0x2d, 0x49, 0x81, 0xa0, 0x63, + 0xfb, 0x63, 0x7a, 0xbd, 0xdb, 0x8c, 0x38, 0x92, + 0x80, 0xbd, 0xc7, 0x5a, 0xd2, 0x4f, 0x2c, 0x74, + 0x9f, 0x3e, 0x18, 0x3e, 0x40, 0x2e, 0x4f, 0x3f, + 0x06, 0xa5, 0x20, 0x2f, 0x97, 0x09, 0x1b, 0x2b, + 0x72, 0x36, 0xd9, 0xae, 0xc8, 0x68, 0xb7, 0x87, + 0xf4, 0xe4, 0xb4, 0xf4, 0xe9, 0xd0, 0x9b, 0xfa, + 0x9d, 0xbd, 0x69, 0x6f, 0x3a, 0x9f, 0xa3, 0x6f, + 0xd7, 0x6e, 0x78, 0x51, 0x95, 0x90, 0x62, 0xd5, + 0x91, 0x9d, 0x1e, 0xd4, 0xab, 0x77, 0xf9, 0x1d, + 0xfb, 0x5b, 0xe4, 0x12, 0x3b, 0xa0, 0x46, 0x1b, + 0xb9, 0x1f, 0x25, 0x63, 0xf0, 0x3b, 0x0e, 0xd8, + 0xb3, 0xfb, 0xd2, 0xb9, 0xdd, 0xb5, 0xc2, 0x9f, + 0xf1, 0xc8, 0x09, 0x89, 0xed, 0x71, 0x7b, 0xac, + 0xab, 0x30, 0x44, 0x9e, 0xc5, 0xa3, 0x6e, 0x6a, + 0x25, 0xf7, 0x23, 0x95, 0x3d, 0x07, 0xba, 0xa8, + 0x3b, 0x13, 0xde, 0xd8, 0xc6, 0xf3, 0x0d, 0x35, + 0x79, 0x52, 0xb7, 0xf7, 0x2b, 0x83, 0xf1, 0xae, + 0x46, 0x58, 0x9a, 0x7e, 0x95, 0x4c, 0x63, 0x1d, + 0x81, 0x7d, 0x5a, 0x89, 0xfa, 0x06, 0xd4, 0x41, + 0x87, 0x82, 0x1f, 0x05, 0xb2, 0xb1, 0x65, 0x45, + 0xac, 0xa1, 0xab, 0x82, 0xc3, 0x9c, 0xb0, 0x2a, + 0x60, 0x1b, 0x46, 0x82, 0xa6, 0x9b, 0x70, 0x0b, + 0x76, 0xd1, 0xf9, 0xc4, 0x5c, 0x05, 0x7b, 0x74, + 0xca, 0xc5, 0xbc, 0x33, 0xcd, 0x67, 0x8e, 0x04, + 0xda, 0x6c, 0x4f, 0x74, 0xaf, 0xfb, 0x57, 0xdf, + 0x5e, 0xe1, 0x8f, 0x48, 0x1f, 0x6f, 0xc8, 0x3e, + 0x18, 0x77, 0x08, 0xe6, 0xf8, 0x94, 0x30, 0x36, + 0x32, 0xcb, 0xc0, 0x97, 0xd0, 0x6d, 0xa1, 0x45, + 0x1f, 0x82, 0x7d, 0x44, 0xaf, 0xd3, 0xb6, 0x46, + 0x79, 0xde, 0x8a, 0xd8, 0xef, 0x15, 0x91, 0x79, + 0x54, 0xad, 0x2a, 0xfc, 0x26, 0x17, 0x5c, 0xb6, + 0xd7, 0xed, 0x04, 0x5c, 0x15, 0x9c, 0x6d, 0x93, + 0x76, 0x82, 0x5e, 0x96, 0x5c, 0x26, 0xf1, 0xb9, + 0x95, 0xc0, 0x68, 0xaf, 0x77, 0x47, 0xfc, 0xed, + 0xb7, 0xa3, 0xfc, 0x2c, 0x19, 0x87, 0xcf, 0x05, + 0x5c, 0x9f, 0x97, 0x9a, 0x41, 0x6f, 0xcd, 0x07, + 0xf3, 0x7a, 0x59, 0x9f, 0xff, 0x79, 0xfe, 0xc5, + 0xda, 0xdf, 0xe6, 0xb5, 0xf9, 0x77, 0xf3, 0x9a, + 0xae, 0x3e, 0x10, 0xbc, 0xbe, 0xb1, 0x03, 0xac, + 0x80, 0x46, 0xfe, 0xd5, 0xc2, 0xeb, 0x87, 0x83, + 0x35, 0xcd, 0x58, 0x61, 0x14, 0x66, 0x9e, 0x56, + 0xeb, 0x8b, 0x9d, 0xb2, 0xa8, 0x7d, 0x41, 0x99, + 0x55, 0x6b, 0x60, 0x71, 0xc8, 0x60, 0x6d, 0x78, + 0x85, 0x9f, 0x3e, 0x40, 0xf9, 0x28, 0x74, 0x65, + 0xed, 0xaa, 0xe8, 0x29, 0xa1, 0x64, 0xde, 0x8c, + 0xfb, 0x7f, 0xf2, 0x97, 0xf7, 0x27, 0xf7, 0xd3, + 0xfe, 0x94, 0xbf, 0xac, 0x7f, 0xbb, 0x97, 0x7e, + 0x9b, 0xa9, 0x9f, 0x97, 0x7e, 0x0a, 0x4b, 0x70, + 0x0d, 0xb0, 0x6c, 0x51, 0xf9, 0x42, 0xd4, 0x53, + 0x09, 0x86, 0x86, 0x93, 0xdf, 0x38, 0xbb, 0xfb, + 0x0d, 0xec, 0x94, 0xcc, 0x9b, 0xff, 0xf4, 0x97, + 0xdf, 0x14, 0xf6, 0xfe, 0x93, 0x67, 0x6a, 0xb3, + 0x4c, 0xb2, 0xd5, 0xfb, 0x99, 0x9e, 0xcc, 0x9b, + 0x7f, 0x81, 0x77, 0x1d, 0xf7, 0x9b, 0x7b, 0xa3, + 0x2b, 0x57, 0xda, 0xa7, 0x42, 0xc9, 0x54, 0xf7, + 0x87, 0x85, 0x6f, 0xa5, 0x81, 0x65, 0xd6, 0x82, + 0x8a, 0xfd, 0xad, 0x59, 0xfa, 0xa9, 0xd2, 0x25, + 0x2d, 0x78, 0x55, 0x6b, 0xac, 0xc7, 0x73, 0x83, + 0x39, 0x6d, 0x8d, 0xd6, 0x31, 0xea, 0xd4, 0x67, + 0x29, 0xcf, 0x6c, 0x45, 0x79, 0x3a, 0xd4, 0xed, + 0xbf, 0x25, 0xc6, 0xfe, 0xa2, 0xa7, 0x36, 0x72, + 0xaf, 0x27, 0x9d, 0xe2, 0x17, 0x95, 0xc3, 0x8f, + 0x9d, 0x8f, 0xb6, 0x6c, 0x2f, 0x95, 0x8c, 0xa2, + 0x1f, 0xa8, 0x69, 0x64, 0x9c, 0x58, 0x66, 0x27, + 0xa2, 0xbd, 0x2f, 0x7b, 0x4a, 0xd8, 0x16, 0x72, + 0x2b, 0x71, 0x3f, 0x3d, 0x0c, 0xec, 0xb6, 0xdd, + 0x7e, 0xa9, 0xc7, 0xc5, 0x5e, 0x88, 0xb7, 0xd2, + 0x1e, 0xd6, 0x4f, 0x0d, 0xa2, 0xfb, 0xc1, 0x9e, + 0x12, 0x68, 0x8f, 0x42, 0xfe, 0x7b, 0x40, 0xd5, + 0xcc, 0x5b, 0xc4, 0x4f, 0x73, 0x6f, 0x99, 0x1a, + 0x65, 0xa6, 0xf0, 0x75, 0x92, 0x3d, 0x17, 0x7d, + 0xd7, 0xed, 0xa8, 0x02, 0x14, 0xfb, 0x3a, 0x34, + 0x5a, 0xa9, 0x7f, 0xa4, 0xf4, 0x0f, 0xff, 0x86, + 0xac, 0xb3, 0xcf, 0xfe, 0xf6, 0x48, 0x8f, 0x72, + 0xd6, 0xbf, 0xaa, 0x41, 0x08, 0x39, 0xdf, 0x03, + 0xf9, 0x6e, 0xc1, 0x37, 0x4b, 0x93, 0x5b, 0xc7, + 0xf8, 0xda, 0x47, 0xfe, 0xa3, 0x63, 0x91, 0x03, + 0x16, 0x79, 0xe7, 0x7b, 0xb4, 0x74, 0x04, 0x7e, + 0x26, 0x78, 0x66, 0x89, 0x60, 0x1a, 0xb0, 0x6e, + 0x69, 0x00, 0xe5, 0xe2, 0x0e, 0x1b, 0x0b, 0xb0, + 0x82, 0xe8, 0x32, 0xd6, 0x4b, 0x88, 0x9d, 0x1e, + 0xc6, 0x4e, 0x94, 0x70, 0x15, 0xc0, 0x16, 0xc9, + 0x5a, 0x12, 0x12, 0x1d, 0xee, 0x59, 0xf7, 0x65, + 0x54, 0xbd, 0xa2, 0xa4, 0x00, 0x63, 0x64, 0x88, + 0x86, 0x1c, 0x37, 0x43, 0xeb, 0x4c, 0x49, 0x3e, + 0x70, 0xcf, 0x5f, 0x18, 0xac, 0xc8, 0x12, 0xc3, + 0xec, 0x65, 0x6a, 0x2c, 0x0d, 0xbc, 0x14, 0xe4, + 0x75, 0x60, 0xf7, 0x9e, 0x44, 0xb0, 0xac, 0x9f, + 0xd3, 0x27, 0xf4, 0xb1, 0x95, 0x2d, 0xa9, 0xcd, + 0x40, 0x63, 0x11, 0xc9, 0x28, 0x1f, 0xc8, 0x2e, + 0x58, 0x12, 0x5d, 0x03, 0xe6, 0x99, 0xc6, 0xdf, + 0x04, 0x05, 0x3f, 0x6b, 0x62, 0xaf, 0x0e, 0xad, + 0x86, 0xcc, 0xcd, 0x8f, 0x04, 0xc3, 0x59, 0x56, + 0x70, 0xa7, 0xad, 0x62, 0xf0, 0x85, 0x9f, 0x30, + 0xb7, 0xe1, 0x2e, 0x4b, 0x35, 0x90, 0x49, 0x6f, + 0x8c, 0x3c, 0x0f, 0xab, 0x47, 0x25, 0x47, 0x63, + 0x2c, 0x78, 0x1e, 0x46, 0x4f, 0xc7, 0xc2, 0xea, + 0x80, 0x28, 0x2b, 0x3d, 0x5d, 0x9b, 0xdc, 0x2a, + 0xf9, 0xeb, 0xba, 0xcc, 0x47, 0x8a, 0xca, 0x45, + 0x12, 0x56, 0x34, 0xb7, 0x50, 0x4e, 0xff, 0xf3, + 0x87, 0x44, 0xfb, 0x6c, 0x4d, 0xe6, 0x91, 0xd2, + 0x5e, 0xe1, 0x90, 0x3a, 0xf4, 0x04, 0xbe, 0xb2, + 0xac, 0x19, 0x98, 0x43, 0x99, 0xaf, 0xc3, 0x68, + 0xee, 0x27, 0x66, 0x18, 0x8d, 0x77, 0xcb, 0x4e, + 0x91, 0x95, 0x0f, 0x2b, 0xc9, 0x59, 0x76, 0xb6, + 0x16, 0x7b, 0xdd, 0x7c, 0x7b, 0x06, 0xab, 0xab, + 0x06, 0x39, 0xcc, 0x5b, 0xe0, 0x15, 0x87, 0xf7, + 0xdc, 0xbb, 0xe3, 0x5e, 0x75, 0x12, 0x7b, 0x76, + 0xd1, 0xc5, 0xea, 0xb5, 0x39, 0x77, 0xde, 0xbe, + 0x69, 0xcc, 0x46, 0xb5, 0xc3, 0xf8, 0x97, 0xb5, + 0x46, 0x9b, 0x78, 0x61, 0xf7, 0x15, 0x9e, 0x96, + 0x84, 0x14, 0xd1, 0xf7, 0x03, 0x3b, 0x6c, 0x64, + 0x82, 0xc6, 0x61, 0xe2, 0xcd, 0xc8, 0xcf, 0x9a, + 0x37, 0xc1, 0xaf, 0x2a, 0x9f, 0x07, 0x29, 0x23, + 0x05, 0x72, 0x89, 0x1c, 0x48, 0xc5, 0x5b, 0xf5, + 0xc0, 0x97, 0xf4, 0x86, 0x78, 0xd9, 0x1e, 0x42, + 0xa6, 0x31, 0x1c, 0xe0, 0x6b, 0x58, 0xd2, 0xe2, + 0x28, 0x94, 0xd5, 0x32, 0xad, 0x34, 0xfa, 0x0c, + 0x41, 0x9c, 0x3d, 0x67, 0xa2, 0x4e, 0x80, 0xe5, + 0x99, 0x8c, 0x6f, 0x0c, 0xb2, 0x49, 0xa3, 0x1d, + 0x85, 0x79, 0xe7, 0x88, 0x11, 0x0a, 0x96, 0x01, + 0x76, 0x0e, 0xf2, 0x94, 0x1f, 0xa8, 0xb6, 0x72, + 0x9f, 0xdb, 0xa4, 0x2e, 0xdb, 0xfa, 0x84, 0xf1, + 0x1c, 0xcd, 0x0d, 0x57, 0x1f, 0xf5, 0xc6, 0x5e, + 0xc9, 0x9f, 0xf6, 0xf2, 0xfb, 0x67, 0x3b, 0xdf, + 0xa8, 0xef, 0xc7, 0xbd, 0xe3, 0x92, 0xc5, 0x5a, + 0x8d, 0xe2, 0xde, 0x44, 0x70, 0x12, 0x30, 0xfa, + 0x7b, 0x99, 0x7e, 0x26, 0xfa, 0x49, 0xe0, 0x6e, + 0x03, 0x5f, 0x85, 0x4e, 0x93, 0x7e, 0xc6, 0x84, + 0x92, 0x8b, 0x32, 0xb6, 0x08, 0x63, 0xcc, 0x55, + 0x42, 0x99, 0x14, 0x98, 0x10, 0xff, 0x59, 0xe7, + 0xad, 0x39, 0xb0, 0xae, 0xc8, 0x70, 0xd4, 0x99, + 0x11, 0x59, 0xd8, 0x96, 0xdd, 0x32, 0x5b, 0x29, + 0x7e, 0x89, 0xdc, 0x23, 0x67, 0x8e, 0x27, 0xc0, + 0x2f, 0x5b, 0x37, 0x12, 0xc7, 0x18, 0xd4, 0xa2, + 0xa6, 0xac, 0x5d, 0x6a, 0x60, 0x26, 0x0f, 0xf0, + 0xcf, 0x36, 0xce, 0x6e, 0x4d, 0xab, 0xe5, 0xbd, + 0x27, 0xa1, 0x1d, 0x84, 0x5b, 0x83, 0xfd, 0x5b, + 0x69, 0x19, 0x1c, 0x3f, 0xb5, 0x09, 0x32, 0x9d, + 0x44, 0x2e, 0x57, 0xab, 0x28, 0x6b, 0x3d, 0x7a, + 0x2c, 0xc7, 0x08, 0xe1, 0x0e, 0xf2, 0xfa, 0xc0, + 0x99, 0x09, 0xca, 0x2d, 0xac, 0x53, 0x2f, 0x76, + 0xca, 0xfb, 0x73, 0x5e, 0xd9, 0xfb, 0x93, 0x3f, + 0xd2, 0x49, 0xb7, 0xbe, 0x0a, 0x4e, 0x87, 0x3d, + 0xac, 0x44, 0x9d, 0x26, 0x9c, 0x33, 0xe0, 0x5c, + 0x1c, 0xed, 0xff, 0x41, 0xa9, 0x75, 0x47, 0xb0, + 0x85, 0x15, 0x52, 0xa1, 0xc6, 0x11, 0x76, 0x11, + 0x2a, 0x07, 0xe2, 0xac, 0x57, 0x12, 0xe3, 0xae, + 0x3c, 0x8b, 0xb9, 0x61, 0xab, 0xcc, 0x0d, 0xf0, + 0xf3, 0x0d, 0xbf, 0xec, 0xc3, 0x6b, 0x8f, 0x4b, + 0xa4, 0x04, 0xf6, 0x2b, 0x69, 0xf6, 0x59, 0x16, + 0x27, 0xf3, 0xef, 0x91, 0x5d, 0x50, 0xc2, 0xd8, + 0x17, 0x1e, 0xb0, 0x8b, 0xed, 0x8b, 0xc7, 0xb3, + 0x2b, 0x5a, 0x2f, 0x1f, 0x0a, 0xf7, 0xd0, 0x95, + 0x28, 0x96, 0xf2, 0x6c, 0x37, 0x0b, 0x98, 0x21, + 0x07, 0x38, 0xbb, 0x12, 0x7c, 0x2c, 0x3c, 0x7a, + 0xb9, 0xfa, 0xeb, 0xdd, 0xdf, 0x26, 0xa3, 0xae, + 0x3c, 0xeb, 0xfc, 0xa5, 0x1d, 0x33, 0x63, 0xbf, + 0x8c, 0xa9, 0x83, 0x5e, 0x0c, 0x71, 0x69, 0x5d, + 0x19, 0xc0, 0xf7, 0x72, 0x36, 0x60, 0x7d, 0xbd, + 0x0c, 0xec, 0xac, 0x2b, 0x5d, 0xa7, 0x05, 0xb8, + 0xcd, 0xd7, 0x78, 0x2e, 0xaf, 0x01, 0xe6, 0xd3, + 0xf2, 0xfd, 0x5a, 0xcb, 0xe8, 0xca, 0x84, 0x86, + 0x81, 0x6b, 0x03, 0xe7, 0x39, 0x1f, 0x32, 0xd8, + 0xe1, 0xb5, 0x71, 0x6f, 0xa8, 0xbb, 0x15, 0xbd, + 0x96, 0xf4, 0x19, 0xec, 0x6b, 0x7c, 0xde, 0x5e, + 0xb2, 0x2f, 0x61, 0xdf, 0x00, 0x90, 0xf2, 0xc5, + 0x60, 0x61, 0xe3, 0x56, 0x63, 0xee, 0xfb, 0xa2, + 0x5a, 0x0c, 0xed, 0x42, 0x84, 0x6e, 0x23, 0xbd, + 0x15, 0x69, 0x5d, 0x8c, 0x31, 0x66, 0x82, 0x8c, + 0xd9, 0xe8, 0x50, 0x65, 0xea, 0xcd, 0x75, 0xff, + 0x86, 0x7f, 0xd9, 0xff, 0xcc, 0xff, 0xcc, 0x48, + 0xef, 0x67, 0x8e, 0xa6, 0x99, 0x88, 0x7c, 0x8a, + 0x78, 0x4b, 0xd1, 0xff, 0xc2, 0x27, 0xfe, 0x36, + 0x1c, 0x25, 0xff, 0x9c, 0x31, 0x61, 0x9c, 0x25, + 0x2f, 0x06, 0xfc, 0x14, 0xcd, 0x4b, 0xb7, 0x73, + 0x5d, 0x8d, 0xe6, 0x44, 0x66, 0x51, 0xa7, 0x55, + 0xaa, 0x9a, 0x83, 0x5e, 0x0c, 0xb2, 0x06, 0x30, + 0x53, 0x83, 0x71, 0x71, 0xc3, 0x7d, 0x28, 0xbc, + 0x27, 0xc1, 0x52, 0x56, 0x9b, 0x01, 0x58, 0x12, + 0x78, 0xff, 0x19, 0xfe, 0xdc, 0xcf, 0xe8, 0x59, + 0x18, 0x13, 0xa2, 0x2b, 0x17, 0xce, 0xc6, 0xc7, + 0x3b, 0x8f, 0x1b, 0xd1, 0xfb, 0xe3, 0xeb, 0xe5, + 0x6b, 0xc3, 0x98, 0x0c, 0xa9, 0x78, 0xa7, 0x6a, + 0xa8, 0xc1, 0xfe, 0x90, 0x7c, 0xbf, 0x86, 0x48, + 0x03, 0xf9, 0x6d, 0xd6, 0xb4, 0xbd, 0xe9, 0xbd, + 0x84, 0x5f, 0xde, 0x2f, 0xb5, 0xcb, 0xc8, 0x5e, + 0xe9, 0x31, 0x61, 0x66, 0xe9, 0xc5, 0x9f, 0x1f, + 0xbe, 0xbd, 0xf6, 0xf8, 0xe2, 0xcf, 0xaf, 0x1a, + 0x37, 0x7e, 0xf9, 0xf2, 0x5d, 0x8a, 0x9e, 0x64, + 0xa2, 0x86, 0xeb, 0x57, 0xa7, 0x80, 0x73, 0x6c, + 0xcc, 0xee, 0x62, 0x5d, 0x18, 0x58, 0x0d, 0xc1, + 0xae, 0x04, 0xdc, 0xd5, 0xdc, 0x8a, 0x55, 0xcb, + 0xab, 0x45, 0xab, 0xfc, 0xa0, 0xb8, 0x55, 0xb6, + 0x8a, 0xd5, 0x85, 0x55, 0xcd, 0x2b, 0xda, 0x77, + 0xaa, 0xbd, 0x55, 0xe0, 0x97, 0xe0, 0xc0, 0x4e, + 0x17, 0xf3, 0xf6, 0xbc, 0x79, 0x93, 0xcd, 0x3a, + 0xb3, 0xee, 0x82, 0x90, 0x8d, 0xe1, 0xa3, 0xbc, + 0x15, 0x3b, 0x18, 0x36, 0x5f, 0x9e, 0x4f, 0x08, + 0x6d, 0x72, 0xa2, 0xb6, 0xe5, 0x44, 0x1f, 0xaa, + 0x5f, 0xf3, 0xcd, 0x84, 0x0f, 0xcb, 0x35, 0xe5, + 0xcc, 0x3f, 0x32, 0x1b, 0xcd, 0x7f, 0x10, 0x76, + 0x21, 0x28, 0x09, 0x4d, 0x1e, 0x76, 0x03, 0x3b, + 0x52, 0xad, 0x21, 0xf0, 0x9e, 0xd2, 0xf6, 0x19, + 0x73, 0xaa, 0xf3, 0x44, 0xc5, 0xf7, 0xee, 0x55, + 0x64, 0x38, 0xd4, 0x9b, 0xf2, 0xf4, 0x5d, 0xfd, + 0x6f, 0xdf, 0xbd, 0xa3, 0x6f, 0x5e, 0x1d, 0xa6, + 0xf6, 0x37, 0x5f, 0xdf, 0xf2, 0x4d, 0x7f, 0xfa, + 0xc7, 0x1a, 0xd6, 0x20, 0x80, 0x07, 0x86, 0x88, + 0x1f, 0xad, 0x60, 0x09, 0x39, 0x1a, 0xa0, 0x53, + 0xd0, 0x02, 0xea, 0xae, 0xbc, 0x23, 0xd9, 0x17, + 0x02, 0xbb, 0x01, 0xc4, 0x19, 0x7c, 0x8a, 0x82, + 0xb9, 0xe3, 0xc8, 0x0f, 0x15, 0x5c, 0x97, 0xa3, + 0x82, 0x82, 0xb5, 0x41, 0x51, 0xd4, 0x15, 0xaf, + 0x3c, 0x6d, 0x3f, 0xd1, 0xf1, 0xa2, 0xcb, 0x2e, + 0x56, 0xab, 0x2a, 0xb0, 0x3b, 0xa3, 0xa3, 0xe8, + 0xcf, 0x91, 0xd0, 0xc3, 0x75, 0xcb, 0x76, 0xda, + 0xc9, 0x80, 0x37, 0x97, 0x06, 0x9b, 0x85, 0x31, + 0xac, 0x2b, 0xc1, 0x65, 0xf6, 0x08, 0xbe, 0x2b, + 0x4c, 0xce, 0x46, 0xc4, 0x16, 0x1e, 0xac, 0x33, + 0x91, 0x12, 0xab, 0x88, 0x0a, 0xa8, 0x84, 0xd3, + 0x3c, 0x4c, 0xd4, 0x2a, 0xd8, 0x6f, 0xa1, 0x3a, + 0x51, 0x9d, 0x78, 0xba, 0xf4, 0xf8, 0xa1, 0xac, + 0x13, 0x11, 0x9d, 0x2b, 0x2a, 0x6d, 0xf8, 0x6a, + 0x36, 0x8f, 0x55, 0x5d, 0xd5, 0xc5, 0xcf, 0x6c, + 0xb8, 0xdd, 0x60, 0x27, 0x2a, 0x8c, 0xf8, 0x6f, + 0x5c, 0x31, 0xcf, 0x34, 0xd9, 0x7e, 0x11, 0x76, + 0xc6, 0x93, 0xfd, 0xcd, 0xb6, 0x41, 0xd7, 0xa8, + 0x60, 0x75, 0xa6, 0xdd, 0xd2, 0xce, 0xbd, 0x1d, + 0xf2, 0x23, 0x79, 0x83, 0xd1, 0x34, 0x38, 0x9b, + 0x27, 0x47, 0x63, 0x68, 0x75, 0x98, 0x79, 0xe8, + 0xbc, 0x4e, 0xbd, 0xcd, 0x59, 0x14, 0xf9, 0xa2, + 0x55, 0x8c, 0x15, 0x85, 0x51, 0x17, 0xaa, 0xb1, + 0x6c, 0xfd, 0x9a, 0xfd, 0xbb, 0xba, 0x66, 0x6b, + 0xf5, 0xac, 0x9d, 0xad, 0x67, 0x4c, 0x6a, 0xa7, + 0x76, 0x84, 0x36, 0xeb, 0x88, 0x9a, 0x3e, 0xc1, + 0x73, 0x89, 0x7e, 0x42, 0xb6, 0xda, 0x1d, 0xd9, + 0x79, 0xe9, 0x48, 0xda, 0xb5, 0xc2, 0xd1, 0x29, + 0x05, 0x07, 0xf8, 0xeb, 0x04, 0xbd, 0x45, 0x8b, + 0xcb, 0xba, 0x27, 0x25, 0xa8, 0x78, 0x45, 0xaf, + 0x58, 0x2b, 0xd7, 0xe6, 0x3c, 0x96, 0x7c, 0x78, + 0x42, 0x62, 0x63, 0x27, 0xfa, 0xdb, 0x44, 0x3b, + 0x3b, 0xcc, 0xfe, 0x63, 0x0c, 0x31, 0xac, 0x46, + 0x6b, 0x08, 0x9f, 0x44, 0x13, 0x95, 0x1e, 0x92, + 0xd3, 0x1b, 0x5d, 0x95, 0xbc, 0xa2, 0x62, 0xfe, + 0x76, 0xef, 0x9d, 0xc2, 0x48, 0x02, 0x0f, 0x59, + 0x7d, 0xee, 0x18, 0xf9, 0xda, 0x94, 0x95, 0xe2, + 0x51, 0xb5, 0x2c, 0x76, 0xa9, 0x4a, 0x23, 0x9f, + 0xda, 0x4e, 0x93, 0xa6, 0x97, 0xa6, 0xb0, 0x8f, + 0x55, 0xc1, 0xbf, 0xa3, 0x77, 0x98, 0xcc, 0xe3, + 0xa4, 0xa8, 0xde, 0x56, 0xad, 0x44, 0x77, 0xe6, + 0x81, 0x61, 0xdd, 0x0f, 0x7d, 0x4a, 0x59, 0x2d, + 0x1b, 0x65, 0x00, 0xfb, 0x6b, 0xab, 0x7a, 0x7a, + 0x9f, 0xaf, 0x02, 0xde, 0x6d, 0xda, 0x2a, 0x88, + 0x7c, 0x17, 0x5a, 0xc0, 0xec, 0x63, 0xed, 0xdd, + 0xb2, 0xce, 0x0e, 0xee, 0xd6, 0xa6, 0xd1, 0x13, + 0x11, 0xe8, 0x16, 0x71, 0x0e, 0x7e, 0x1f, 0x3e, + 0x52, 0x64, 0xef, 0xac, 0x50, 0x7b, 0xc7, 0x19, + 0xf6, 0x3f, 0x40, 0xbe, 0x5d, 0xd8, 0x47, 0x03, + 0xe6, 0xf2, 0x3d, 0xae, 0x0b, 0x91, 0x9c, 0x6f, + 0xda, 0x3a, 0x17, 0x7c, 0x73, 0x35, 0xfb, 0x63, + 0x4a, 0x4d, 0x69, 0xf4, 0x1d, 0x56, 0xf8, 0x62, + 0x77, 0xae, 0x0c, 0x6b, 0xf2, 0xac, 0xe8, 0xf5, + 0x94, 0x0d, 0x0a, 0x47, 0x5f, 0xb3, 0xd4, 0x6a, + 0x4a, 0x4d, 0xab, 0x57, 0xf3, 0x21, 0x47, 0xce, + 0xd2, 0x1a, 0xd4, 0x9d, 0x71, 0xe7, 0xec, 0x6f, + 0x9d, 0x92, 0x59, 0x62, 0xb7, 0xcc, 0xb8, 0x13, + 0x77, 0xcf, 0xa8, 0x27, 0xbb, 0x72, 0xc5, 0xc4, + 0x8e, 0xc0, 0x9f, 0x40, 0x43, 0xd1, 0x2b, 0xa1, + 0x47, 0x9f, 0xe0, 0xdb, 0x58, 0x37, 0x1c, 0x4c, + 0x5b, 0x93, 0x80, 0x3a, 0xa5, 0xff, 0x24, 0x67, + 0x83, 0x12, 0xb2, 0x35, 0x0a, 0x1e, 0x35, 0x68, + 0x0a, 0xa6, 0x84, 0x18, 0x95, 0x1d, 0x44, 0xac, + 0x12, 0xb9, 0x82, 0x22, 0xef, 0x08, 0x2b, 0x88, + 0xd9, 0xc7, 0x0d, 0xab, 0x01, 0x56, 0x57, 0x56, + 0x07, 0xc7, 0x8d, 0x33, 0x41, 0xbd, 0x46, 0xf6, + 0x12, 0x7f, 0xdd, 0xee, 0x92, 0x9d, 0xe9, 0x06, + 0xf2, 0x68, 0x6c, 0x1e, 0xb1, 0x68, 0x94, 0x95, + 0xca, 0x01, 0xee, 0xdc, 0x69, 0x6b, 0xc8, 0x8b, + 0x11, 0x98, 0x73, 0x35, 0x8a, 0x42, 0x84, 0x2c, + 0x56, 0xd4, 0x2a, 0x8e, 0xc6, 0x92, 0x5b, 0x99, + 0x1f, 0x9a, 0x2c, 0x29, 0x78, 0xe1, 0x06, 0xbb, + 0x1f, 0x75, 0xe5, 0x62, 0xa3, 0xfe, 0x37, 0xcf, + 0xb2, 0x5b, 0x67, 0x18, 0xee, 0xd3, 0xc4, 0xd6, + 0x05, 0x7f, 0xd9, 0x58, 0x66, 0xeb, 0xf2, 0xac, + 0xd2, 0xdc, 0x2a, 0x6f, 0x94, 0xbe, 0xaf, 0xf0, + 0x92, 0x57, 0xae, 0x35, 0xf7, 0x47, 0x1e, 0x9c, + 0x3d, 0x88, 0x6d, 0x35, 0x5d, 0xc4, 0x7d, 0x21, + 0x26, 0xb4, 0xb1, 0x93, 0x4c, 0x05, 0x77, 0xa1, + 0x0f, 0x7b, 0x50, 0xc7, 0x1d, 0x58, 0x17, 0xbb, + 0x7b, 0x80, 0x41, 0x57, 0x93, 0x7a, 0x0a, 0xe7, + 0x2c, 0x92, 0xba, 0x7e, 0x5d, 0x5b, 0xe5, 0xc4, + 0x6e, 0x91, 0x3b, 0x25, 0x8a, 0x50, 0xdd, 0x56, + 0x6f, 0xab, 0xa8, 0x71, 0xa4, 0xde, 0x01, 0x8f, + 0x81, 0x97, 0x45, 0x48, 0x4e, 0xf4, 0xa3, 0x60, + 0xb1, 0x00, 0xbf, 0xcb, 0x03, 0xd9, 0xfe, 0xab, + 0x52, 0xab, 0xb4, 0x56, 0x5f, 0x2b, 0x47, 0xdb, + 0x2d, 0x65, 0x67, 0xb5, 0x31, 0xd0, 0xef, 0x0b, + 0xbe, 0xe2, 0xe7, 0xa6, 0x91, 0xa7, 0xd4, 0xa9, + 0x38, 0x9b, 0xe6, 0xcc, 0x83, 0x61, 0xc1, 0xb7, + 0x45, 0xc6, 0x7c, 0x84, 0x1e, 0x70, 0xae, 0xb6, + 0x5d, 0xe2, 0x94, 0x59, 0xa9, 0x5b, 0x39, 0x5f, + 0x92, 0xf2, 0x27, 0xf3, 0x42, 0x91, 0xf6, 0x66, + 0x57, 0xad, 0x24, 0x9f, 0x74, 0x97, 0x00, 0x27, + 0x95, 0xc5, 0x0a, 0x9c, 0x75, 0xb6, 0x04, 0xd3, + 0x29, 0xce, 0x92, 0xd6, 0x73, 0x7e, 0xcf, 0x3d, + 0x2f, 0xa4, 0x92, 0x04, 0xdb, 0x2d, 0x12, 0x68, + 0x1b, 0x99, 0x1f, 0x66, 0xab, 0x77, 0x56, 0x06, + 0x79, 0x7d, 0x32, 0x2a, 0x8c, 0xb9, 0xd3, 0xb0, + 0xf7, 0x8a, 0xa8, 0xef, 0x66, 0xad, 0x0c, 0xf8, + 0x83, 0x32, 0x26, 0x1e, 0x79, 0x83, 0x51, 0x47, + 0x4d, 0xd4, 0x02, 0x85, 0x40, 0x57, 0xb6, 0x61, + 0xd5, 0xcb, 0xe0, 0xa1, 0x96, 0x99, 0xba, 0x7f, + 0xcb, 0xff, 0x60, 0x6f, 0x49, 0xc7, 0xca, 0x17, + 0x95, 0x0c, 0xfb, 0x95, 0xe3, 0x05, 0xff, 0x43, + 0xbf, 0xe2, 0x2f, 0xf8, 0xab, 0xfe, 0xa2, 0xf1, + 0xa1, 0xb1, 0xe0, 0xdf, 0x72, 0x65, 0x36, 0x0d, + 0x64, 0xd2, 0x81, 0xdd, 0xfd, 0x45, 0xe5, 0xa8, + 0x88, 0x7c, 0x5d, 0xa7, 0x8c, 0x5c, 0xb7, 0x1a, + 0xd9, 0x4d, 0x24, 0x89, 0x7a, 0x62, 0x7d, 0x9d, + 0xa6, 0x49, 0x7e, 0x1a, 0x53, 0x22, 0x0d, 0x8c, + 0xfe, 0xc2, 0x2c, 0xec, 0xfb, 0x5c, 0xbb, 0xda, + 0x5e, 0x0c, 0xf4, 0xce, 0xb0, 0x9f, 0x36, 0x0a, + 0xc7, 0x19, 0xec, 0x6f, 0xea, 0xdf, 0xb7, 0x1d, + 0x91, 0xe5, 0x59, 0x73, 0xe6, 0xc1, 0x9a, 0x5c, + 0xea, 0x2e, 0xd1, 0x79, 0xcc, 0xef, 0x74, 0xe7, + 0x9d, 0x9b, 0x76, 0xb1, 0xaa, 0x57, 0xd9, 0x81, + 0xc8, 0x4d, 0xf0, 0x04, 0xc6, 0x52, 0x5b, 0xd3, + 0xc1, 0x14, 0x9d, 0xa2, 0x4b, 0x30, 0xd6, 0x45, + 0x2c, 0x39, 0x01, 0x76, 0x07, 0x63, 0x96, 0xa3, + 0x41, 0xda, 0xcf, 0xfa, 0x97, 0x1a, 0x8f, 0x6c, + 0x0d, 0xfb, 0xef, 0x1d, 0x45, 0xf1, 0xf8, 0x5e, + 0x2d, 0x2d, 0xa2, 0x62, 0x32, 0x4b, 0x6f, 0xb3, + 0x58, 0x2b, 0x8e, 0x95, 0x9c, 0x61, 0x84, 0x99, + 0x8a, 0xac, 0xc7, 0x27, 0x5d, 0xe6, 0x31, 0x4f, + 0xf1, 0xe0, 0x95, 0x07, 0x22, 0x82, 0x41, 0xab, + 0xc4, 0x86, 0x3b, 0x2a, 0x62, 0x66, 0xc8, 0x78, + 0xe8, 0x17, 0x8d, 0xb9, 0x5f, 0x92, 0xed, 0x14, + 0xcb, 0x39, 0xf4, 0xcd, 0xc5, 0x4e, 0x71, 0xff, + 0x81, 0x6b, 0xb5, 0x06, 0x3b, 0x3e, 0xc5, 0x0e, + 0xc2, 0xea, 0x32, 0xd1, 0x5b, 0x04, 0x9c, 0xb9, + 0x30, 0x03, 0x38, 0xc2, 0xbe, 0x09, 0x60, 0xa7, + 0xb0, 0x34, 0x7f, 0x3f, 0x0e, 0x2c, 0xf5, 0x6d, + 0x3c, 0x64, 0x5d, 0xf5, 0x47, 0xa4, 0x81, 0x45, + 0x1e, 0x87, 0x2b, 0xf6, 0xaa, 0xad, 0xd8, 0x22, + 0xf2, 0xd9, 0xd6, 0xdb, 0xf3, 0xb4, 0x4c, 0xd4, + 0xa8, 0xca, 0x8f, 0x4a, 0x46, 0x55, 0xf4, 0x75, + 0x80, 0x75, 0x2f, 0xb2, 0x96, 0x98, 0x09, 0xb9, + 0x6a, 0x39, 0xb2, 0x0f, 0x6b, 0x6f, 0xc8, 0x2c, + 0x4f, 0xc2, 0x82, 0x95, 0xe8, 0xae, 0xb8, 0x9f, + 0x77, 0x65, 0x7d, 0x77, 0xca, 0x42, 0x7f, 0x41, + 0x46, 0x11, 0x47, 0x6c, 0xac, 0x57, 0x15, 0x1d, + 0x7b, 0xda, 0xa9, 0x6e, 0xda, 0xc8, 0xbe, 0x05, + 0x0d, 0x07, 0x56, 0x85, 0x4a, 0x7e, 0x0e, 0x3f, + 0x8b, 0xdc, 0x3e, 0xe3, 0x2a, 0xff, 0x12, 0xf4, + 0x5d, 0x16, 0xf4, 0x1d, 0x20, 0x41, 0xa6, 0x1d, + 0xe4, 0x57, 0x45, 0x7f, 0x15, 0xd9, 0x87, 0xb5, + 0xab, 0xc2, 0x5d, 0xa8, 0xd8, 0xb7, 0xf6, 0x60, + 0x7a, 0xff, 0xe9, 0xf7, 0x18, 0x4f, 0x90, 0x5c, + 0x97, 0x3e, 0xf7, 0x32, 0x6f, 0xfe, 0xe5, 0x9f, + 0xa8, 0x63, 0x54, 0x98, 0x23, 0xf3, 0x40, 0x11, + 0x5d, 0xdf, 0x46, 0xec, 0x94, 0xa8, 0x2a, 0xaf, + 0xd8, 0xf3, 0x82, 0xb7, 0x09, 0x57, 0x02, 0x9f, + 0x5b, 0xcb, 0x47, 0x51, 0x88, 0x7b, 0x04, 0xbc, + 0xa6, 0x7e, 0x5f, 0xcb, 0x5e, 0x8d, 0x09, 0xf2, + 0x64, 0xd6, 0x6d, 0x59, 0xef, 0x64, 0xdb, 0x5f, + 0xfa, 0xb5, 0xd7, 0x0f, 0x5d, 0xdb, 0xf8, 0xe4, + 0x38, 0xea, 0x97, 0x1b, 0x7a, 0x9a, 0xb0, 0x0b, + 0x75, 0xf4, 0x35, 0x4f, 0x58, 0x2b, 0xb8, 0x2f, + 0xcc, 0x3d, 0xb6, 0x5f, 0x71, 0xdd, 0x07, 0xb9, + 0xf4, 0x5f, 0x72, 0xbb, 0x7d, 0x66, 0x7f, 0xdc, + 0x7f, 0xba, 0xa7, 0xb4, 0xa3, 0xcf, 0x25, 0xc8, + 0x4f, 0xb4, 0x3f, 0xe4, 0xd8, 0x8d, 0xc3, 0x18, + 0xe8, 0x4c, 0xdb, 0xaf, 0x4e, 0x92, 0x4c, 0x14, + 0xc4, 0x60, 0x7d, 0x9b, 0x32, 0x93, 0x7f, 0x74, + 0xf4, 0x6f, 0xc6, 0xa3, 0xc3, 0x7f, 0x33, 0x3e, + 0x0b, 0xb6, 0x9f, 0x96, 0xfc, 0x25, 0x7d, 0x9d, + 0xa9, 0x2d, 0xb4, 0x57, 0x77, 0xdf, 0x0a, 0x26, + 0x2a, 0x93, 0x5d, 0x67, 0x61, 0x2f, 0xfe, 0xf2, + 0xab, 0x98, 0x39, 0x46, 0xea, 0x1c, 0xb0, 0xc0, + 0x6d, 0xe4, 0x9c, 0x66, 0x8e, 0xa7, 0xf5, 0xaf, + 0x8f, 0x52, 0x0a, 0xae, 0x82, 0xc9, 0xc3, 0x88, + 0x6b, 0xbb, 0x49, 0x47, 0x79, 0xbe, 0x7a, 0x8e, + 0x4f, 0x01, 0x82, 0x07, 0xed, 0x51, 0x03, 0x7f, + 0x57, 0x7a, 0x5e, 0xc8, 0xdf, 0xe0, 0x58, 0xef, + 0x61, 0x7a, 0x37, 0x83, 0x1b, 0x6c, 0x13, 0xfb, + 0x48, 0xf2, 0x7e, 0x0f, 0x49, 0x19, 0xd7, 0x1a, + 0x92, 0xac, 0xd2, 0xb7, 0x09, 0xc0, 0xb1, 0xa9, + 0x1e, 0x46, 0x8a, 0x0d, 0xe4, 0x79, 0xb0, 0xc7, + 0x05, 0xda, 0x6d, 0x55, 0xc4, 0x72, 0x71, 0xa7, + 0x00, 0x1e, 0x32, 0x9a, 0x7b, 0xa0, 0x95, 0x83, + 0x2b, 0xec, 0x02, 0xab, 0x98, 0xf3, 0x4e, 0x05, + 0x76, 0xec, 0xbc, 0x3b, 0xbf, 0x33, 0x17, 0xf6, + 0x85, 0x90, 0x0c, 0x0f, 0x0a, 0xbb, 0xe8, 0xb2, + 0xf7, 0x48, 0x48, 0x73, 0x41, 0x74, 0x92, 0x93, + 0x6b, 0x24, 0x2a, 0x9d, 0x44, 0xd5, 0xd4, 0x3c, + 0xf9, 0x23, 0xc7, 0x8e, 0x6e, 0x6b, 0x7a, 0x5c, + 0x57, 0xfb, 0xd9, 0x16, 0x57, 0xe3, 0x49, 0xd1, + 0x73, 0x46, 0xec, 0x14, 0xb4, 0x49, 0x2e, 0x79, + 0x2d, 0xf3, 0x65, 0x32, 0x57, 0x22, 0x0f, 0x8c, + 0x00, 0xcf, 0xd7, 0x26, 0xf2, 0x4f, 0xd4, 0x10, + 0xd7, 0x05, 0x72, 0x3f, 0xc0, 0x21, 0x90, 0x26, + 0x66, 0x3d, 0x3e, 0xe9, 0xaa, 0xa1, 0x37, 0xf1, + 0xbe, 0x4f, 0x27, 0xee, 0x2a, 0x64, 0xee, 0x85, + 0xb9, 0xe3, 0xf6, 0x10, 0x5f, 0xf1, 0x87, 0x83, + 0x15, 0x1f, 0xbe, 0xb7, 0x97, 0xf6, 0x4b, 0xfe, + 0xea, 0x1e, 0x6b, 0x87, 0x92, 0x03, 0x76, 0x4a, + 0xf7, 0x2a, 0xff, 0xfc, 0x9f, 0xd9, 0x0e, 0x4d, + 0xd1, 0xb9, 0x16, 0xd9, 0xfa, 0xd8, 0x43, 0x76, + 0x90, 0x5b, 0x8b, 0x3d, 0x52, 0x30, 0xa7, 0xa0, + 0x80, 0xb5, 0xfe, 0x1a, 0x19, 0xc3, 0x02, 0x43, + 0x4c, 0xf0, 0xb0, 0x8a, 0x13, 0x30, 0xdb, 0x14, + 0x76, 0x73, 0x08, 0x5e, 0x1a, 0xd8, 0xa5, 0x23, + 0xcd, 0x7f, 0xd7, 0xbe, 0x19, 0x5c, 0x62, 0x93, + 0xed, 0xa7, 0x8d, 0x7e, 0x77, 0xbb, 0x65, 0x6e, + 0x56, 0x97, 0xf9, 0x82, 0xbd, 0x60, 0x2f, 0xf2, + 0x15, 0x8b, 0xb5, 0x67, 0xe9, 0x42, 0xd8, 0xf3, + 0x07, 0xb9, 0xd8, 0xc8, 0xae, 0x43, 0xde, 0xd6, + 0x26, 0xbf, 0xee, 0x5e, 0xe5, 0xe3, 0x4e, 0xde, + 0xfd, 0x83, 0x2a, 0x33, 0xbc, 0x21, 0x0f, 0x82, + 0x19, 0x5c, 0x78, 0xb8, 0xbc, 0x54, 0x2b, 0x39, + 0x77, 0x04, 0xde, 0xc0, 0xcf, 0x9d, 0x71, 0xa8, + 0xdb, 0x0c, 0x1e, 0xb1, 0xdf, 0xf2, 0xff, 0xeb, + 0xff, 0x1f, 0xff, 0x5f, 0xf8, 0xff, 0x65, 0xf7, + 0x9c, 0x6d, 0x57, 0x76, 0xf6, 0xe8, 0x77, 0x03, + 0xeb, 0xf5, 0x2f, 0xdc, 0xa1, 0xbd, 0x0e, 0x66, + 0x98, 0x53, 0xca, 0xf4, 0xba, 0x56, 0xd2, 0x56, + 0xba, 0x5d, 0x04, 0xfc, 0x65, 0xbb, 0xb1, 0x16, + 0x6a, 0x60, 0x15, 0x75, 0x27, 0x2b, 0xb4, 0xd3, + 0xac, 0xf0, 0xf7, 0xac, 0x9d, 0xf3, 0x73, 0xe6, + 0x3c, 0xad, 0x98, 0xb7, 0xed, 0x58, 0xc8, 0x39, + 0x21, 0x04, 0x19, 0x2b, 0x69, 0x02, 0x86, 0x02, + 0x0e, 0x64, 0x8e, 0xbf, 0x22, 0x31, 0x19, 0x85, + 0x00, 0x64, 0x32, 0x8c, 0xbd, 0x00, 0xed, 0x45, + 0x97, 0x79, 0xab, 0x8e, 0xc0, 0xe2, 0x8e, 0xea, + 0x8e, 0xbe, 0x13, 0x6c, 0x07, 0x46, 0x0c, 0xa2, + 0x7f, 0x12, 0xe8, 0x6c, 0xf1, 0x58, 0x35, 0x72, + 0xfe, 0xf8, 0xfe, 0xb8, 0xb7, 0xf8, 0xb7, 0xd2, + 0x03, 0xfb, 0xfb, 0x4f, 0xd5, 0x5e, 0xa5, 0x1e, + 0xcc, 0x46, 0xd1, 0x8d, 0x8b, 0x4e, 0x45, 0x69, + 0xa6, 0xfb, 0xfa, 0xde, 0xba, 0xb0, 0x65, 0x3d, + 0x7c, 0x0b, 0x9a, 0x06, 0xf9, 0x82, 0x70, 0xa5, + 0xd8, 0xcf, 0xab, 0xde, 0xdc, 0x51, 0x54, 0xc9, + 0xeb, 0x7b, 0x15, 0xca, 0x64, 0x88, 0xee, 0xda, + 0xd3, 0xed, 0x27, 0xfa, 0x69, 0x99, 0xe1, 0xed, + 0x69, 0xef, 0x33, 0x46, 0xba, 0xb3, 0xed, 0x24, + 0x01, 0xb9, 0x95, 0x4c, 0xc3, 0x06, 0x9c, 0x83, + 0x7c, 0x06, 0xd1, 0x3d, 0x38, 0x13, 0x4c, 0xb2, + 0x71, 0x23, 0xd7, 0x69, 0x3a, 0x69, 0x73, 0x92, + 0x4e, 0x1a, 0x25, 0x7b, 0xee, 0xdd, 0xc7, 0x21, + 0xae, 0x53, 0xc2, 0x4c, 0x4e, 0x74, 0x0c, 0x30, + 0x6f, 0x01, 0x59, 0x80, 0xd4, 0xb9, 0x8a, 0xb3, + 0x16, 0xc4, 0xe8, 0x1a, 0x8b, 0x75, 0xd6, 0xe8, + 0xfc, 0xd3, 0x05, 0x52, 0x36, 0x4f, 0x1d, 0xc8, + 0x5e, 0x52, 0xf3, 0x14, 0x2b, 0x97, 0x84, 0x1d, + 0xb4, 0x4f, 0xfa, 0x83, 0x8a, 0x59, 0x39, 0xc0, + 0x1c, 0x29, 0x60, 0x18, 0xeb, 0x64, 0x76, 0x50, + 0x66, 0xe1, 0xb1, 0xd3, 0x97, 0xe6, 0xe6, 0xf8, + 0x55, 0x77, 0x33, 0xac, 0x57, 0xc7, 0x48, 0x41, + 0x8e, 0x53, 0x45, 0x79, 0x8f, 0x25, 0x1e, 0xf1, + 0x15, 0xa2, 0xbc, 0xb2, 0x92, 0x1f, 0x3a, 0xaa, + 0xdb, 0xf7, 0xec, 0x75, 0x67, 0xbd, 0x16, 0xd5, + 0x8a, 0x84, 0x75, 0x22, 0x07, 0xfd, 0x0e, 0x93, + 0xf2, 0x6b, 0x8f, 0x49, 0x1a, 0x66, 0x72, 0xa4, + 0xd4, 0x63, 0xed, 0x9a, 0xc0, 0xf6, 0x7c, 0xd5, + 0xc5, 0x0e, 0xcf, 0x23, 0xae, 0x29, 0x35, 0x30, + 0xdc, 0xd9, 0xd0, 0xe1, 0x29, 0xe7, 0x94, 0x93, + 0x70, 0xce, 0x38, 0x13, 0xce, 0x7f, 0x38, 0x89, + 0x67, 0x23, 0x8f, 0x47, 0xea, 0x63, 0xbb, 0xb2, + 0x62, 0xbd, 0xd2, 0x95, 0x79, 0x99, 0x4a, 0x57, + 0x66, 0x24, 0xd9, 0x60, 0x3f, 0x12, 0x91, 0xc9, + 0xc4, 0x68, 0x40, 0xae, 0x1b, 0xf5, 0x22, 0x61, + 0xad, 0x4a, 0x20, 0x79, 0x9b, 0x0a, 0x69, 0x98, + 0xa7, 0xe0, 0x9d, 0xd7, 0x1c, 0x98, 0x1f, 0xf8, + 0x0a, 0x9f, 0xf1, 0xec, 0xd4, 0xe3, 0xd3, 0x8d, + 0xd1, 0xdd, 0xab, 0x5a, 0xa4, 0x19, 0x64, 0x0c, + 0x5a, 0x46, 0xa1, 0xa3, 0x80, 0x9b, 0xa5, 0x0c, + 0xb0, 0x2c, 0xbc, 0x84, 0x37, 0xe2, 0x81, 0x7d, + 0xa8, 0x15, 0x19, 0x78, 0x4a, 0xde, 0x10, 0x51, + 0xd4, 0x93, 0x1c, 0x8c, 0x49, 0x4b, 0xf4, 0xdd, + 0x1a, 0xa8, 0xe6, 0x60, 0x82, 0xe7, 0x76, 0xc7, + 0x06, 0x24, 0x50, 0x8f, 0xdb, 0x63, 0xf6, 0x84, + 0x3d, 0x81, 0x4c, 0x48, 0xd7, 0x12, 0x3c, 0x37, + 0x95, 0x54, 0xcd, 0xa5, 0xc3, 0x94, 0x73, 0xc9, + 0x59, 0x87, 0x3b, 0x9e, 0x70, 0x96, 0x9c, 0xf5, + 0x67, 0x09, 0xb8, 0xdf, 0x2b, 0xbb, 0xb2, 0x46, + 0x7b, 0x73, 0xe5, 0x9a, 0x71, 0xd3, 0xc8, 0x1d, + 0xbf, 0x5a, 0x49, 0x19, 0x53, 0xfe, 0xf5, 0x37, + 0xd7, 0xfd, 0x47, 0x9d, 0x4c, 0x87, 0xba, 0xa9, + 0x7c, 0x54, 0x5d, 0xd8, 0x70, 0x88, 0x0b, 0x78, + 0x46, 0x59, 0x0b, 0x36, 0xac, 0x74, 0x3d, 0x6c, + 0x92, 0x21, 0xfb, 0x14, 0x89, 0x9e, 0xf0, 0xab, + 0xbb, 0xf3, 0xda, 0x42, 0x72, 0x0d, 0x71, 0xa8, + 0xa7, 0xd7, 0xf4, 0xda, 0xbc, 0xf7, 0xdb, 0x9e, + 0x1f, 0x8a, 0xb1, 0x36, 0x8c, 0xf2, 0x95, 0xc3, + 0x9e, 0x8f, 0x15, 0xd8, 0x65, 0xf1, 0x81, 0x4a, + 0x10, 0x25, 0x5f, 0xe9, 0xf6, 0x56, 0x02, 0xd6, + 0x61, 0xf4, 0xdd, 0xb4, 0x36, 0x90, 0x87, 0x25, + 0xa9, 0x2e, 0xc6, 0xb0, 0x90, 0x25, 0x54, 0xb4, + 0xf4, 0xaa, 0x2d, 0x3b, 0xa5, 0x4b, 0x0e, 0x33, + 0xec, 0x9d, 0x32, 0x57, 0xd4, 0x35, 0xd0, 0x6a, + 0xab, 0x75, 0x9d, 0xe8, 0x44, 0xf6, 0x37, 0x93, + 0x95, 0xa7, 0x60, 0x5f, 0xdd, 0xc4, 0x0b, 0x43, + 0xb9, 0x18, 0x18, 0x96, 0x51, 0x37, 0xc8, 0x07, + 0x64, 0x85, 0xd4, 0xcc, 0xa8, 0x83, 0x77, 0x1a, + 0xfe, 0xe2, 0x0b, 0x8c, 0xb9, 0xbf, 0xd7, 0x0f, + 0xaa, 0xbf, 0x46, 0x80, 0xb3, 0x58, 0x0e, 0xfc, + 0x1c, 0xd0, 0xde, 0xd6, 0x62, 0xb7, 0x1a, 0x7a, + 0x2a, 0xc8, 0xc7, 0xac, 0xb0, 0xd9, 0x7a, 0xc5, + 0x2e, 0xd5, 0x2f, 0x76, 0x6e, 0xd5, 0x2f, 0xc2, + 0xf7, 0x87, 0xe6, 0x3d, 0x7b, 0x6c, 0x27, 0x8a, + 0x4e, 0xa3, 0x06, 0x8e, 0x21, 0xd3, 0x18, 0x6d, + 0xfc, 0x96, 0xc6, 0x7a, 0x9a, 0x50, 0xb0, 0xd7, + 0xe5, 0x10, 0x6c, 0x0c, 0x81, 0x35, 0xa2, 0x9a, + 0xa9, 0xe8, 0xec, 0x70, 0x78, 0x46, 0xc4, 0xbc, + 0x25, 0x73, 0x26, 0xdc, 0x47, 0xa2, 0x73, 0x6b, + 0xcb, 0x6c, 0x7d, 0xde, 0xeb, 0xfb, 0x04, 0x3e, + 0x67, 0xaf, 0x37, 0xcb, 0x18, 0x6a, 0xf4, 0x5f, + 0x65, 0xe8, 0xa5, 0x3d, 0x1a, 0x12, 0xdc, 0x55, + 0x11, 0x87, 0x15, 0x92, 0x3d, 0x98, 0x5d, 0x8a, + 0x3e, 0xb7, 0x70, 0x14, 0x75, 0xca, 0x1c, 0xe4, + 0x76, 0x80, 0xa7, 0x59, 0x0f, 0x3b, 0xb5, 0xda, + 0xf3, 0xf5, 0x79, 0xe5, 0x65, 0xd7, 0xa6, 0x63, + 0x81, 0xe6, 0x3d, 0x91, 0xbd, 0x4a, 0x2c, 0xea, + 0xcc, 0x79, 0x76, 0x9b, 0x80, 0x06, 0xcf, 0xbd, + 0x33, 0x77, 0x3e, 0xe5, 0x39, 0x2a, 0xd9, 0xb3, + 0x33, 0x92, 0x7b, 0xb9, 0x32, 0x77, 0xfc, 0x1b, + 0x23, 0x01, 0x92, 0x95, 0x32, 0xae, 0x19, 0x62, + 0xff, 0xd7, 0xb3, 0xed, 0x19, 0x19, 0xf7, 0x56, + 0x90, 0x43, 0x91, 0xb7, 0xae, 0x75, 0xaf, 0x7a, + 0xa6, 0xf7, 0x79, 0x20, 0x7d, 0x5a, 0xa1, 0xf3, + 0x94, 0xa8, 0xcb, 0xdc, 0x36, 0x78, 0xdd, 0xc8, + 0x08, 0x9d, 0x0a, 0x8c, 0x13, 0x95, 0x11, 0x58, + 0xfb, 0x9e, 0xde, 0x07, 0x3f, 0x67, 0x7f, 0xd2, + 0xb9, 0xb1, 0x7f, 0xa3, 0x0b, 0x73, 0xc2, 0x37, + 0x8d, 0xdc, 0x2f, 0x32, 0x02, 0x09, 0x77, 0x53, + 0xff, 0xd6, 0xce, 0xa1, 0xbf, 0x55, 0x6f, 0xda, + 0x18, 0xbd, 0xc8, 0xda, 0x05, 0xb7, 0xe6, 0x46, + 0x52, 0x27, 0x99, 0xb7, 0x92, 0x77, 0x0b, 0x58, + 0xa7, 0xfb, 0x55, 0x72, 0xec, 0xe8, 0x2a, 0x7a, + 0xe0, 0x8a, 0x8c, 0x7d, 0x61, 0x6d, 0x6a, 0xac, + 0x8b, 0xd5, 0xd3, 0x28, 0x09, 0x6b, 0x7c, 0x80, + 0xad, 0xa4, 0xac, 0xd6, 0x45, 0xdf, 0x8f, 0xfa, + 0x9a, 0xe0, 0x31, 0x29, 0xa4, 0x12, 0xe8, 0x8e, + 0x6e, 0xaf, 0xee, 0x88, 0x7a, 0x49, 0xef, 0xc3, + 0x40, 0xd9, 0x7f, 0x15, 0x0c, 0xb1, 0x35, 0x1e, + 0x63, 0xd8, 0x8b, 0x19, 0xad, 0xb5, 0x5e, 0x5b, + 0xed, 0x0e, 0xa1, 0x95, 0x6c, 0x35, 0xdf, 0x24, + 0xfd, 0x24, 0x78, 0x32, 0xa5, 0x37, 0x25, 0xff, + 0xc6, 0xf1, 0x8d, 0xfa, 0xdc, 0xb3, 0xca, 0xf1, + 0x1c, 0xf8, 0x2c, 0xd8, 0xa5, 0xb9, 0x17, 0x15, + 0x87, 0x9d, 0xfc, 0xf0, 0xa0, 0xd7, 0x07, 0x89, + 0x20, 0x93, 0x36, 0xec, 0xf3, 0xe9, 0xeb, 0x3e, + 0xf8, 0x47, 0x7e, 0xd9, 0x17, 0xfe, 0xd1, 0x40, + 0x3d, 0x9d, 0xd4, 0xa1, 0xa2, 0x0f, 0x8c, 0xa3, + 0x61, 0xc7, 0xa8, 0x56, 0x0c, 0x46, 0x3c, 0xec, + 0x77, 0x2d, 0xa3, 0x15, 0x98, 0x95, 0xbf, 0x6c, + 0x6c, 0x1a, 0x29, 0x86, 0x7d, 0x89, 0xd1, 0xa3, + 0x18, 0xa7, 0x18, 0x07, 0x4e, 0x08, 0xb4, 0x0e, + 0x98, 0x4e, 0xb9, 0xa4, 0x7c, 0x0a, 0x7b, 0x4c, + 0x43, 0x74, 0x5e, 0x03, 0x04, 0x2a, 0x7a, 0x2c, + 0xe0, 0xd9, 0x24, 0x9c, 0xbd, 0xda, 0xda, 0x00, + 0x64, 0x3d, 0x0e, 0xbb, 0x41, 0xab, 0x69, 0x0e, + 0xa0, 0x73, 0x32, 0x1e, 0x6a, 0x24, 0x59, 0xb3, + 0x7d, 0x23, 0xf8, 0x54, 0x70, 0x9e, 0xfa, 0x3d, + 0x83, 0xe4, 0x55, 0xc9, 0xea, 0xa6, 0xd8, 0x7b, + 0xd6, 0x5b, 0xe0, 0x9c, 0x03, 0x71, 0xbd, 0x8c, + 0xa0, 0x17, 0xaf, 0xde, 0x56, 0xe2, 0x27, 0xfb, + 0x7c, 0xb6, 0x64, 0x2c, 0x1f, 0x3b, 0xb9, 0xc9, + 0x91, 0x25, 0x13, 0xe4, 0x09, 0x89, 0x13, 0xd5, + 0xec, 0x69, 0x42, 0xcc, 0x4e, 0xd9, 0x73, 0xf6, + 0x23, 0x51, 0x41, 0x36, 0xd2, 0xab, 0xee, 0x8f, + 0x66, 0x12, 0x63, 0x38, 0x77, 0x08, 0xf6, 0xcb, + 0x3e, 0xd5, 0x29, 0xdb, 0xfd, 0xfc, 0x42, 0x21, + 0x18, 0x40, 0x0c, 0xc8, 0x5c, 0x63, 0x17, 0x03, + 0x91, 0xc5, 0x39, 0x08, 0x77, 0x61, 0x97, 0xd1, + 0xc1, 0x51, 0xe9, 0x46, 0xdd, 0xa1, 0xe3, 0x62, + 0x55, 0x9a, 0x1c, 0x3f, 0x5e, 0xda, 0x9b, 0xc8, + 0xe2, 0x88, 0x0a, 0x85, 0x95, 0xc2, 0x81, 0x60, + 0x40, 0x05, 0x82, 0x97, 0xdf, 0xed, 0x77, 0xf3, + 0x0b, 0xa3, 0x5b, 0xdd, 0x97, 0xf4, 0x7e, 0x70, + 0xcf, 0xfa, 0xad, 0x75, 0x2f, 0xb8, 0xd7, 0xbe, + 0xcf, 0xbe, 0xc3, 0x58, 0x64, 0x58, 0x43, 0xa4, + 0x84, 0xb5, 0xaf, 0x0d, 0x25, 0x75, 0x14, 0x55, + 0x71, 0x7f, 0xc5, 0xe2, 0x11, 0x9f, 0x3f, 0x9f, + 0x39, 0x82, 0xbd, 0x84, 0x11, 0x49, 0xdc, 0x53, + 0x1c, 0xf9, 0x71, 0x4f, 0x5d, 0x35, 0xac, 0xc3, + 0x94, 0x48, 0x86, 0xd0, 0x6d, 0x11, 0xc5, 0xca, + 0x04, 0x18, 0x29, 0xc0, 0xe7, 0x6b, 0x50, 0xc6, + 0x04, 0xdf, 0xbb, 0x1c, 0xe5, 0x67, 0x60, 0x44, + 0x5d, 0xb7, 0x08, 0xb6, 0xad, 0x95, 0x15, 0x0a, + 0x18, 0xb5, 0x62, 0x31, 0x51, 0x37, 0x8c, 0x71, + 0xdd, 0x1a, 0x58, 0x36, 0x9c, 0xfb, 0x58, 0x6b, + 0xf0, 0xb9, 0x00, 0xa8, 0x21, 0xe4, 0xfa, 0x81, + 0x27, 0x6a, 0x3e, 0xec, 0x48, 0x6e, 0xcf, 0x60, + 0xce, 0xf3, 0x64, 0xcf, 0x35, 0xf9, 0x4c, 0x10, + 0x91, 0x8d, 0x69, 0x51, 0xb1, 0xab, 0x29, 0x09, + 0xfb, 0x10, 0x11, 0xac, 0x3c, 0x3d, 0xc9, 0x0d, + 0x18, 0x3b, 0xa2, 0xce, 0x60, 0xdd, 0x5b, 0x3f, + 0x0e, 0x28, 0xfd, 0xb7, 0xc1, 0x68, 0x60, 0xaf, + 0x43, 0x9d, 0x12, 0x3d, 0x37, 0x02, 0x74, 0x01, + 0xc8, 0x76, 0x71, 0xe5, 0xe2, 0x8f, 0x96, 0xda, + 0xef, 0x5f, 0x87, 0x0c, 0x59, 0xf8, 0x2e, 0xa2, + 0xf5, 0x29, 0xd1, 0xb5, 0x5c, 0xf0, 0xdc, 0x7e, + 0x75, 0x76, 0xba, 0x33, 0xb7, 0xbf, 0xe0, 0x3d, + 0xfe, 0x1e, 0xef, 0x17, 0x23, 0x2e, 0xe8, 0x01, + 0x62, 0x5d, 0x1a, 0x83, 0x79, 0x2b, 0x5a, 0xb8, + 0x3e, 0xea, 0xeb, 0xe1, 0xb7, 0x2b, 0x61, 0xcf, + 0x10, 0x64, 0x5f, 0xdc, 0xa4, 0xd7, 0xe8, 0x35, + 0x59, 0xeb, 0x2c, 0x18, 0x6f, 0x61, 0xcd, 0xb2, + 0x60, 0xa7, 0xe7, 0x61, 0x27, 0x5c, 0x83, 0x9d, + 0xe4, 0x70, 0x64, 0xdf, 0xc1, 0xd8, 0x48, 0x6f, + 0x68, 0xc9, 0x5e, 0x97, 0x48, 0xd4, 0xa6, 0xb0, + 0xbe, 0x59, 0x36, 0x81, 0x35, 0xfa, 0x82, 0xbb, + 0x77, 0x75, 0x7a, 0x80, 0x11, 0x0a, 0xb8, 0x28, + 0x03, 0x5a, 0x6b, 0x12, 0x59, 0x83, 0xa2, 0xe7, + 0x93, 0x69, 0xf6, 0x9e, 0xb0, 0xb0, 0xa7, 0xb5, + 0xe9, 0x5e, 0x6a, 0x7a, 0x5c, 0x99, 0x0a, 0xbb, + 0xee, 0xc9, 0xa7, 0x7e, 0xc8, 0x9d, 0xb2, 0x8d, + 0x75, 0x80, 0xe0, 0xdb, 0x50, 0x47, 0xab, 0xe5, + 0x59, 0xad, 0xd7, 0xad, 0x62, 0xb0, 0x37, 0x77, + 0xd4, 0xe9, 0x7b, 0xc1, 0x5d, 0xe9, 0xb2, 0xb0, + 0xbf, 0x77, 0xdf, 0x83, 0x48, 0x85, 0xf1, 0x28, + 0xf4, 0x44, 0xc8, 0x8e, 0xd9, 0x88, 0x3a, 0xf3, + 0xf4, 0x63, 0x9b, 0x13, 0xca, 0x29, 0x40, 0x74, + 0xea, 0x41, 0xbf, 0xc3, 0xa4, 0x40, 0x23, 0x8a, + 0x60, 0xce, 0x0b, 0xc6, 0xbe, 0xed, 0x25, 0xb4, + 0x90, 0x3b, 0x1d, 0x55, 0x79, 0x79, 0x79, 0xf7, + 0xdc, 0xee, 0xe4, 0x6e, 0xc9, 0x31, 0x6a, 0x36, + 0x68, 0xa7, 0x84, 0xe4, 0x6f, 0x28, 0xa2, 0xef, + 0xbb, 0xf0, 0x46, 0x44, 0xa7, 0x38, 0xeb, 0x53, + 0xcb, 0x69, 0xd1, 0x83, 0x8c, 0xa8, 0x13, 0x21, + 0x6d, 0xd0, 0xfc, 0xed, 0x26, 0x27, 0x6d, 0x8c, + 0x31, 0x4e, 0xf1, 0x65, 0xf0, 0x25, 0xd7, 0xed, + 0xd1, 0x00, 0x74, 0x7f, 0xfe, 0x64, 0x5d, 0x9b, + 0x62, 0xf5, 0x33, 0xcf, 0x92, 0xb9, 0x97, 0x12, + 0x7c, 0xa4, 0xdb, 0x6c, 0x91, 0xcf, 0x32, 0xe4, + 0xcd, 0x63, 0xd7, 0x84, 0x30, 0x72, 0x82, 0x3c, + 0x55, 0x11, 0x85, 0xb8, 0xcb, 0x01, 0x45, 0x88, + 0xb8, 0xf1, 0xc9, 0x3a, 0x6b, 0x51, 0x13, 0xc7, + 0x6f, 0x83, 0x36, 0x98, 0x05, 0x4d, 0x94, 0xfb, + 0x67, 0x9e, 0x65, 0x8e, 0x8a, 0x0a, 0xea, 0x90, + 0xdb, 0xb0, 0xcf, 0x52, 0xd6, 0x18, 0x4f, 0x58, + 0x9f, 0x74, 0x67, 0xad, 0x8b, 0x20, 0xd7, 0x19, + 0x91, 0xc3, 0x2a, 0x7a, 0x17, 0x03, 0x59, 0x67, + 0xad, 0xf4, 0xb2, 0x51, 0x83, 0x39, 0xa9, 0x3e, + 0x47, 0x2e, 0x3e, 0xb0, 0x0e, 0x8a, 0xd2, 0x67, + 0x26, 0x44, 0xbe, 0x8d, 0xac, 0x8a, 0x98, 0xe3, + 0x65, 0xfb, 0xdf, 0xf9, 0x82, 0x35, 0x6f, 0xe9, + 0xad, 0xd5, 0x83, 0x21, 0x13, 0x6b, 0x1f, 0x54, + 0x98, 0x81, 0xad, 0xb0, 0x4e, 0x9b, 0x2a, 0xa2, + 0xdb, 0xeb, 0xf1, 0xa3, 0x5e, 0xcf, 0x2e, 0x6a, + 0x7d, 0x1e, 0x5c, 0x67, 0xb7, 0x78, 0xda, 0x00, + 0xdd, 0x60, 0x4c, 0xf2, 0x1b, 0x3a, 0x20, 0xb7, + 0x2d, 0xcd, 0xcf, 0xe9, 0xf9, 0x9a, 0xd4, 0x0c, + 0x94, 0x3d, 0x65, 0x79, 0x8c, 0xf6, 0xb0, 0x57, + 0xb0, 0x22, 0xe7, 0x19, 0x46, 0x46, 0xef, 0xf7, + 0x6a, 0x0f, 0xa9, 0xf5, 0xc7, 0x20, 0x6f, 0x25, + 0xad, 0xb4, 0xf3, 0x0a, 0xbc, 0xe4, 0xf3, 0xed, + 0x65, 0x73, 0xc9, 0xbe, 0xff, 0x2e, 0x19, 0x46, + 0x8a, 0x32, 0xc1, 0x53, 0x58, 0xbf, 0x33, 0xbb, + 0xe9, 0xdd, 0x57, 0x0e, 0xa9, 0xc1, 0x2b, 0x6b, + 0x58, 0x7b, 0x38, 0x12, 0xee, 0x85, 0x39, 0xe3, + 0x3f, 0xfd, 0x74, 0x67, 0x0a, 0xbc, 0xc1, 0xef, + 0x1e, 0x67, 0x1e, 0xff, 0xeb, 0xe3, 0xcf, 0xf9, + 0xef, 0xc8, 0x23, 0xc9, 0x67, 0x90, 0x55, 0xb2, + 0x41, 0x39, 0xac, 0x96, 0x3d, 0x17, 0x4c, 0xda, + 0xe8, 0x39, 0x27, 0xc0, 0xc7, 0xea, 0xeb, 0x1c, + 0xec, 0xcd, 0x33, 0x04, 0xa8, 0xe6, 0x39, 0xa0, + 0x93, 0x90, 0x05, 0x75, 0x14, 0xb2, 0x0d, 0xbb, + 0x09, 0xe5, 0xe4, 0x33, 0x25, 0xa2, 0xce, 0xff, + 0x92, 0x6d, 0x17, 0xd6, 0xca, 0x81, 0xb7, 0xbe, + 0xda, 0x9e, 0x37, 0xe7, 0xed, 0x85, 0xc7, 0xf3, + 0x6f, 0x1f, 0xa8, 0x51, 0x87, 0xf6, 0x85, 0x3d, + 0xec, 0xc9, 0x34, 0x9f, 0x5f, 0xe8, 0x55, 0xd7, + 0x2d, 0x06, 0x0f, 0xc2, 0x58, 0x7d, 0x94, 0x41, + 0xad, 0x56, 0x07, 0x7b, 0x47, 0x88, 0x67, 0x0a, + 0x44, 0xde, 0x93, 0x32, 0xbe, 0x35, 0xee, 0x80, + 0xf7, 0xe4, 0x4c, 0x3a, 0x93, 0x5e, 0x69, 0x77, + 0x4e, 0xfb, 0x38, 0x19, 0x21, 0x55, 0x99, 0x1b, + 0x46, 0x15, 0x36, 0xdc, 0x15, 0xcc, 0x37, 0x3d, + 0xa5, 0xd7, 0xa6, 0xc3, 0x79, 0x56, 0x74, 0xa5, + 0x2a, 0xea, 0xad, 0x29, 0x33, 0x99, 0xc3, 0x3c, + 0x69, 0x3c, 0x6a, 0x82, 0xb9, 0xf7, 0x77, 0xbd, + 0xb5, 0xae, 0x8c, 0x05, 0x59, 0xfb, 0x46, 0x67, + 0x13, 0x70, 0x49, 0x8a, 0x14, 0x8e, 0x53, 0x6e, + 0xda, 0x16, 0x3c, 0xb7, 0x76, 0x85, 0x2b, 0x20, + 0xed, 0xf0, 0x3d, 0x50, 0x2c, 0xec, 0x2a, 0x86, + 0xb9, 0xb7, 0xc5, 0x60, 0x8d, 0xc4, 0xf2, 0xfd, + 0x8e, 0x5e, 0x8a, 0xf2, 0x3f, 0xf5, 0x0a, 0xc3, + 0xd7, 0x60, 0xdd, 0xf8, 0x6a, 0x7b, 0x31, 0x58, + 0xc5, 0xfe, 0x39, 0xf0, 0xda, 0x09, 0x3b, 0x17, + 0xcc, 0x13, 0x81, 0xf9, 0x15, 0xb5, 0xae, 0xda, + 0xcd, 0xc3, 0xb4, 0x93, 0xaa, 0x15, 0x0f, 0x1f, + 0x75, 0x92, 0x55, 0xb5, 0x3a, 0xf2, 0x14, 0xeb, + 0x4f, 0x90, 0xb1, 0xa0, 0xb0, 0xa6, 0x9e, 0x0c, + 0x92, 0x46, 0xc5, 0xb8, 0x10, 0x5c, 0x60, 0xd7, + 0xf8, 0x0d, 0x17, 0x9f, 0xd4, 0x01, 0x07, 0x55, + 0xfa, 0x08, 0x39, 0x28, 0xb6, 0xbe, 0x68, 0x93, + 0xf6, 0x36, 0x1c, 0xa5, 0xfd, 0x73, 0xf6, 0xc4, + 0xe3, 0xb1, 0xb7, 0x82, 0xa1, 0xc1, 0xb6, 0x85, + 0x4f, 0x90, 0x52, 0xd6, 0xd8, 0x3c, 0x13, 0x7d, + 0xd4, 0x61, 0x15, 0xca, 0xf6, 0xd0, 0x3b, 0x35, + 0x94, 0x8d, 0x29, 0x63, 0xc1, 0x5f, 0xe8, 0x7c, + 0x87, 0xfd, 0xa6, 0x40, 0x36, 0x3e, 0x7f, 0xfc, + 0x21, 0xbf, 0x4c, 0x66, 0xc8, 0x57, 0xf9, 0x93, + 0x5d, 0x32, 0x66, 0x49, 0xd1, 0xbd, 0x78, 0x6c, + 0xe6, 0x07, 0x79, 0x6e, 0x80, 0xe2, 0xdd, 0x25, + 0xe7, 0xb2, 0x69, 0xfc, 0x63, 0x91, 0xea, 0xa2, + 0x3e, 0xec, 0xc3, 0x40, 0x4e, 0x65, 0x68, 0x53, + 0xac, 0x46, 0x2b, 0x15, 0xf6, 0xba, 0xc9, 0xf2, + 0x09, 0xac, 0x79, 0x8a, 0x74, 0x5d, 0x8f, 0x0d, + 0x2e, 0xab, 0x57, 0x4e, 0xe6, 0x52, 0x63, 0xef, + 0xf1, 0x1c, 0x4f, 0xf2, 0xeb, 0x98, 0x05, 0x56, + 0xa2, 0x3b, 0x46, 0x3f, 0x12, 0x51, 0xde, 0x53, + 0x41, 0x16, 0x34, 0xd4, 0xcd, 0x8d, 0xe2, 0x0f, + 0x77, 0x76, 0x44, 0x77, 0x77, 0x52, 0xc1, 0x1e, + 0x12, 0xfe, 0x79, 0xbf, 0x02, 0x18, 0xec, 0x9a, + 0x18, 0x15, 0x1f, 0x75, 0xe9, 0xec, 0xeb, 0x48, + 0x13, 0x96, 0x2d, 0xb0, 0xc2, 0x42, 0xda, 0x91, + 0x67, 0x3e, 0xee, 0xbe, 0x44, 0xb4, 0x79, 0x22, + 0xda, 0x23, 0x2b, 0xea, 0x86, 0xe1, 0x7f, 0xd2, + 0xe1, 0x8b, 0x2c, 0xac, 0xcc, 0x44, 0xfd, 0xe5, + 0x9f, 0x27, 0x7b, 0x2a, 0xc8, 0x88, 0xab, 0xac, + 0xef, 0x6e, 0x60, 0xed, 0x94, 0x9a, 0xe3, 0x5a, + 0xa7, 0xb0, 0xf5, 0x87, 0x7d, 0xe5, 0x78, 0x58, + 0x17, 0xfd, 0xcd, 0x04, 0xd6, 0x6a, 0xd8, 0xd4, + 0x11, 0x3d, 0x25, 0xf8, 0xd7, 0xad, 0x34, 0xd7, + 0xdc, 0xbe, 0xd5, 0x18, 0x0b, 0x12, 0xf4, 0x36, + 0xf8, 0xaf, 0x17, 0x03, 0xa2, 0x8e, 0x61, 0x95, + 0xe6, 0xd6, 0x5c, 0x77, 0xd6, 0xff, 0x58, 0xb7, + 0x0e, 0x4e, 0xee, 0x05, 0x4b, 0x6d, 0xf2, 0x61, + 0xf7, 0xd6, 0xe1, 0xb9, 0xa3, 0xd3, 0xfb, 0x2b, + 0xdf, 0x4b, 0x16, 0x4d, 0xa1, 0x7b, 0x0a, 0x10, + 0x32, 0xe6, 0x76, 0xd1, 0x26, 0x00, 0xe6, 0x44, + 0xdc, 0xc9, 0xf1, 0x35, 0x61, 0xd5, 0x4c, 0x40, + 0xf6, 0x2a, 0xe7, 0xc9, 0xdf, 0x9a, 0x4f, 0x49, + 0x30, 0xf3, 0x22, 0xfd, 0xc3, 0x85, 0xf3, 0xd5, + 0x95, 0x29, 0xa5, 0x16, 0x0c, 0x3e, 0x41, 0x43, + 0xfa, 0x10, 0x18, 0xdb, 0xea, 0x47, 0xb7, 0x30, + 0xa6, 0x8a, 0x5c, 0xfc, 0x11, 0xfb, 0x32, 0xcc, + 0xd3, 0x29, 0x3b, 0x01, 0x73, 0xb5, 0x40, 0xa2, + 0x98, 0x6a, 0x6c, 0x80, 0x67, 0x2c, 0x75, 0xe3, + 0x7b, 0x1d, 0x35, 0x45, 0x0f, 0x29, 0xf9, 0x54, + 0x09, 0xf1, 0xdd, 0xbe, 0x63, 0x7c, 0x79, 0x1c, + 0xfa, 0xfb, 0x4a, 0xb3, 0x4b, 0xbc, 0xf2, 0xae, + 0xb2, 0x5b, 0x49, 0x2e, 0x28, 0x2f, 0xd1, 0xeb, + 0x74, 0xa6, 0x9d, 0x12, 0xb3, 0x0f, 0x47, 0x45, + 0x8e, 0xaf, 0x79, 0x98, 0x74, 0x92, 0x8d, 0x8a, + 0x77, 0x81, 0x5e, 0x00, 0x0b, 0x7d, 0xa3, 0x3e, + 0x6b, 0x57, 0x6c, 0x38, 0xea, 0xb2, 0x23, 0x10, + 0xf8, 0x87, 0xe2, 0x69, 0x03, 0x58, 0x31, 0xab, + 0x20, 0xd3, 0x23, 0x28, 0x6e, 0x54, 0x7e, 0x88, + 0x55, 0xe3, 0xf9, 0xf7, 0x3b, 0x6b, 0x55, 0xb8, + 0x94, 0xa3, 0x88, 0x5b, 0x4b, 0xe8, 0xfd, 0xd7, + 0xa6, 0x56, 0xf8, 0xd9, 0x04, 0x6c, 0x47, 0xe8, + 0x94, 0x67, 0xd0, 0xfb, 0xfe, 0x08, 0x8c, 0x2b, + 0x3f, 0x62, 0x47, 0x2f, 0x26, 0xec, 0x74, 0x15, + 0xf6, 0xa8, 0xee, 0xab, 0x7e, 0x0e, 0xa3, 0xd3, + 0xc7, 0xf3, 0xe6, 0xd2, 0xd3, 0xf5, 0xbd, 0xdf, + 0x4d, 0x87, 0xbc, 0x91, 0xf6, 0x32, 0xcc, 0xed, + 0x2d, 0x1f, 0x33, 0x69, 0xf0, 0x3f, 0x6f, 0xe9, + 0xd0, 0x60, 0xc6, 0xe1, 0xbf, 0x12, 0x8c, 0xf3, + 0x6b, 0x41, 0xd3, 0x5a, 0xb7, 0x9a, 0xf5, 0x75, + 0xbb, 0xf9, 0x4c, 0x79, 0x5c, 0x7e, 0x2c, 0xf8, + 0x27, 0xff, 0xac, 0x7c, 0xaf, 0xf4, 0x6a, 0xc4, + 0x90, 0x4d, 0x59, 0x05, 0xcf, 0x3a, 0x66, 0x9e, + 0xcc, 0x3c, 0x4a, 0xd6, 0xd7, 0xa4, 0x7f, 0xd5, + 0xbf, 0x66, 0x5c, 0xb6, 0x9d, 0x7d, 0x90, 0xee, + 0x81, 0x6a, 0x77, 0x39, 0xaf, 0x89, 0xa3, 0x5f, + 0x77, 0xd1, 0x11, 0x9a, 0x10, 0x39, 0x90, 0x82, + 0x63, 0x83, 0xfe, 0xd6, 0x44, 0x54, 0xe9, 0x41, + 0x2e, 0x71, 0xc9, 0x73, 0x9b, 0x3d, 0x90, 0xcf, + 0x7d, 0x50, 0x0e, 0xb6, 0xda, 0x82, 0xeb, 0x4b, + 0x35, 0x92, 0x57, 0x65, 0x14, 0x31, 0xec, 0x68, + 0x87, 0xbd, 0xe7, 0x0e, 0xf5, 0x9a, 0xd4, 0xbe, + 0xf3, 0xd6, 0x42, 0x75, 0xa5, 0x5a, 0x5b, 0x95, + 0xdd, 0xfb, 0xc1, 0x6e, 0xb7, 0x16, 0xb1, 0xcb, + 0x17, 0xec, 0x7e, 0xec, 0xf8, 0x75, 0x8e, 0xf7, + 0x3b, 0x6b, 0x9d, 0xec, 0x7d, 0x27, 0xaa, 0x09, + 0xf1, 0x73, 0x5a, 0x43, 0xca, 0x49, 0x0b, 0x3b, + 0xe7, 0x22, 0xbf, 0x6a, 0xc9, 0xb8, 0x94, 0x9f, + 0xed, 0x77, 0xb7, 0xb3, 0xa2, 0x7e, 0xf3, 0x68, + 0x49, 0xc7, 0xed, 0x29, 0x5e, 0xeb, 0x75, 0x14, + 0x49, 0x82, 0x3c, 0x2c, 0xb8, 0x79, 0xfe, 0x67, + 0xf7, 0x3a, 0x76, 0x6f, 0xf6, 0xce, 0xfc, 0x34, + 0x68, 0x7f, 0x69, 0x5e, 0x60, 0xee, 0xe0, 0x15, + 0x83, 0xbd, 0xff, 0xf3, 0x62, 0xf2, 0x65, 0xb0, + 0x4e, 0xb0, 0x9a, 0x72, 0x36, 0xec, 0xbe, 0x82, + 0xb6, 0x77, 0x82, 0x62, 0x3f, 0xdc, 0x4b, 0xf4, + 0xd3, 0x77, 0xa9, 0x6a, 0xca, 0x48, 0x99, 0xd1, + 0x13, 0x9d, 0x92, 0x4a, 0x5d, 0xbc, 0x73, 0xdd, + 0x9d, 0xe6, 0x7f, 0xde, 0xd3, 0xde, 0xfc, 0xb1, + 0x33, 0xa1, 0xca, 0x75, 0xc0, 0x88, 0xba, 0xb2, + 0x35, 0x86, 0x9d, 0x6b, 0xc1, 0x8f, 0x1d, 0xd3, + 0xb7, 0xa6, 0xc7, 0xde, 0xf5, 0x73, 0x23, 0xca, + 0x7b, 0xfd, 0xcd, 0x0a, 0x58, 0xfd, 0xfb, 0xba, + 0x70, 0x84, 0x4f, 0x66, 0x99, 0x09, 0x9f, 0x50, + 0x96, 0x10, 0xdc, 0xda, 0x66, 0x57, 0x74, 0x06, + 0x78, 0xb7, 0x5c, 0x5d, 0x32, 0xd6, 0xcd, 0x44, + 0x0f, 0x41, 0xc9, 0x3e, 0xcc, 0x12, 0x41, 0x5d, + 0x3f, 0xbe, 0xfe, 0xcb, 0x67, 0x8f, 0x1f, 0xc9, + 0xbe, 0x7e, 0xfd, 0x67, 0x55, 0x50, 0x64, 0xb8, + 0x83, 0xe7, 0x6f, 0xc1, 0xef, 0xbb, 0x45, 0xab, + 0x58, 0xbd, 0xfb, 0xe3, 0x83, 0xd5, 0x7e, 0x47, + 0xfa, 0xe5, 0x6e, 0x89, 0x8e, 0x76, 0x27, 0x29, + 0xf6, 0x9f, 0xc6, 0x0e, 0xb3, 0x73, 0x1e, 0x22, + 0x64, 0x8c, 0xd3, 0x50, 0xf0, 0x2e, 0x72, 0x01, + 0x71, 0x35, 0x37, 0x8c, 0x7b, 0xf7, 0x32, 0x44, + 0xca, 0xc9, 0xde, 0x71, 0xc7, 0xa2, 0x5e, 0xb6, + 0x9d, 0xb1, 0xa6, 0xe5, 0x93, 0x95, 0x60, 0xad, + 0xc0, 0x53, 0xb0, 0x87, 0x38, 0x76, 0x88, 0x9e, + 0xec, 0x68, 0x87, 0x8b, 0xce, 0x77, 0xcf, 0xe2, + 0x8d, 0xa4, 0xa8, 0x7d, 0xc0, 0x2c, 0x8f, 0xf1, + 0xfa, 0xe2, 0x91, 0xd1, 0x32, 0x76, 0x3e, 0x10, + 0x9d, 0x22, 0xa2, 0x3c, 0x61, 0xbf, 0xd2, 0x47, + 0x3c, 0x39, 0xab, 0xe5, 0xa0, 0x86, 0x17, 0x5c, + 0x36, 0xc0, 0x60, 0x11, 0xbb, 0xb2, 0x2b, 0xea, + 0x34, 0x44, 0xbf, 0xfc, 0xb8, 0xe0, 0xaf, 0x0f, + 0x64, 0xf0, 0x5b, 0x8a, 0xf7, 0x32, 0xff, 0xf0, + 0xed, 0x3a, 0x5b, 0xd7, 0xef, 0xfd, 0xf5, 0x41, + 0x77, 0x9d, 0xde, 0x67, 0x8d, 0x36, 0x68, 0x58, + 0xd1, 0x91, 0x3e, 0x26, 0xf3, 0x29, 0xd6, 0xa6, + 0xac, 0xe5, 0x6a, 0x6d, 0xf2, 0x4d, 0xb0, 0x5f, + 0x2a, 0x1b, 0x1d, 0xa8, 0xb8, 0x11, 0x75, 0x0b, + 0xc8, 0xa2, 0xef, 0xca, 0xe7, 0xe3, 0x44, 0x1d, + 0xdb, 0x64, 0x7f, 0xfe, 0x3e, 0x5e, 0xc3, 0x28, + 0x4c, 0xff, 0xec, 0xe0, 0x53, 0xc6, 0xfe, 0x32, + 0x10, 0x8f, 0x0f, 0xe5, 0x4a, 0xd8, 0x85, 0x3b, + 0x0e, 0xf6, 0x78, 0x52, 0x1f, 0x68, 0x1b, 0xf9, + 0x43, 0x5a, 0x43, 0x5e, 0xdb, 0xed, 0xd6, 0x6f, + 0x45, 0x8d, 0x98, 0xe2, 0x35, 0xda, 0xe8, 0x2b, + 0x83, 0x7e, 0x47, 0x3d, 0x0f, 0x2b, 0x3a, 0x69, + 0x3d, 0xb5, 0xe4, 0x55, 0x85, 0x55, 0x51, 0xfb, + 0xc4, 0xa7, 0x7e, 0x41, 0xbf, 0x72, 0xfe, 0xd1, + 0x33, 0xf4, 0x26, 0x67, 0x98, 0x72, 0x30, 0xd4, + 0xab, 0x41, 0xd8, 0x0e, 0x62, 0xd6, 0x9a, 0x15, + 0x6f, 0x60, 0x56, 0x6e, 0xb5, 0xd1, 0xaf, 0x41, + 0x80, 0x9d, 0xad, 0x6b, 0x7b, 0x69, 0x3f, 0xe4, + 0x6d, 0xc2, 0x51, 0x02, 0xe9, 0xcc, 0x3b, 0x67, + 0xdd, 0x6f, 0x44, 0xc4, 0x26, 0xe1, 0xac, 0xdb, + 0xc5, 0x07, 0xe7, 0x7f, 0x26, 0xb5, 0x5c, 0x0b, + 0xf5, 0x6c, 0xdc, 0x4b, 0x7a, 0x2f, 0x6a, 0x92, + 0x37, 0x12, 0x0b, 0x19, 0xfd, 0x13, 0xb5, 0xac, + 0x33, 0xe7, 0xde, 0x56, 0xdf, 0xe3, 0x60, 0x84, + 0x9e, 0x17, 0xb2, 0x98, 0xc6, 0x5f, 0x4f, 0xec, + 0xd1, 0x1f, 0x73, 0x82, 0x03, 0x6f, 0xc1, 0x6f, + 0xa5, 0x3d, 0x4a, 0x39, 0xaf, 0xd0, 0xeb, 0x79, + 0x9c, 0x7e, 0x3b, 0x5d, 0xdd, 0xea, 0xf5, 0x7a, + 0xbc, 0x21, 0xf8, 0xf7, 0x58, 0xef, 0x84, 0xbf, + 0xa9, 0x04, 0x8f, 0x68, 0xdf, 0x03, 0xcf, 0x48, + 0x4e, 0xa0, 0x15, 0x3e, 0x5f, 0xe4, 0xf5, 0x25, + 0xf6, 0x59, 0x30, 0xce, 0xa6, 0x78, 0x5a, 0x3c, + 0x1b, 0x0d, 0xfd, 0xd9, 0xc8, 0xcf, 0x1c, 0x7c, + 0xd6, 0x05, 0x20, 0x66, 0x1a, 0x75, 0x79, 0x55, + 0x06, 0x7a, 0xfb, 0xa6, 0x95, 0x19, 0xf4, 0x8e, + 0xed, 0xb4, 0x39, 0xe3, 0x7c, 0x23, 0xaa, 0x1a, + 0x61, 0x3d, 0xbd, 0x4a, 0xd8, 0x9b, 0x54, 0xf4, + 0x73, 0x72, 0x8a, 0x66, 0x91, 0x61, 0xc7, 0x32, + 0x45, 0x8d, 0x3a, 0x99, 0x34, 0x79, 0xd4, 0xf5, + 0x45, 0xae, 0x64, 0x74, 0xbf, 0x91, 0x25, 0x13, + 0xd9, 0x27, 0xb4, 0x65, 0xca, 0xe0, 0x93, 0x3b, + 0xfa, 0x75, 0xd6, 0xff, 0x93, 0x97, 0x7a, 0x1a, + 0xb9, 0xfe, 0xac, 0x64, 0xe8, 0x36, 0xf1, 0x08, + 0x6d, 0xea, 0xd3, 0x55, 0xac, 0x5f, 0x92, 0x4d, + 0x70, 0x22, 0xaf, 0x0d, 0x3b, 0xb9, 0x80, 0x25, + 0xc7, 0x58, 0x4d, 0x2b, 0x09, 0x72, 0x1f, 0xf9, + 0xdd, 0x34, 0x9f, 0x39, 0x4e, 0xdb, 0x30, 0x93, + 0x4c, 0x76, 0xb5, 0xd8, 0x3a, 0x8a, 0x72, 0xc7, + 0xa2, 0x56, 0xda, 0x22, 0x8e, 0xa8, 0x6a, 0x43, + 0x2b, 0x0c, 0x88, 0x63, 0xda, 0x99, 0x34, 0x97, + 0x74, 0x7b, 0x83, 0x7c, 0x9f, 0x10, 0x77, 0x84, + 0xe8, 0x19, 0xb0, 0xa4, 0x13, 0x3e, 0xf1, 0xcd, + 0xc8, 0x99, 0xe3, 0x5e, 0xe9, 0x6f, 0x97, 0x1f, + 0x7c, 0xbc, 0xd3, 0x7b, 0x56, 0x05, 0x65, 0x6d, + 0x76, 0x34, 0x3c, 0x0d, 0xfb, 0x09, 0x74, 0x4c, + 0xaa, 0x8b, 0x71, 0x0a, 0x9d, 0xca, 0xbd, 0x0f, + 0x9e, 0x34, 0xe8, 0x74, 0xb0, 0x28, 0xa2, 0xcb, + 0x70, 0xda, 0xeb, 0x3f, 0x53, 0x40, 0xc9, 0x2b, + 0xc7, 0x15, 0xd8, 0xef, 0xa4, 0x4d, 0xac, 0x5f, + 0x3f, 0x4f, 0xa4, 0xc7, 0x91, 0x73, 0xc7, 0xc1, + 0xda, 0x8c, 0xef, 0xa7, 0xc1, 0xc7, 0x36, 0x5a, + 0x17, 0x79, 0x18, 0x15, 0xb7, 0x2a, 0x56, 0xa2, + 0x4b, 0x1c, 0xb2, 0x4b, 0x77, 0x0b, 0x49, 0xe4, + 0x47, 0x61, 0x37, 0x96, 0x19, 0x16, 0x72, 0x4d, + 0x5b, 0xc4, 0xbd, 0xe8, 0x19, 0x6f, 0x41, 0x2f, + 0x34, 0xb6, 0x44, 0x34, 0x72, 0xb8, 0x3b, 0x4d, + 0x9f, 0x86, 0x3d, 0x70, 0x70, 0xcf, 0xa5, 0xdc, + 0x92, 0x03, 0x7e, 0x0c, 0x2d, 0xfc, 0xb3, 0x06, + 0x9f, 0x33, 0x58, 0x81, 0x12, 0xc5, 0xbe, 0x86, + 0x5a, 0xa7, 0x0f, 0xea, 0xab, 0xb9, 0x43, 0xd4, + 0xa5, 0x59, 0x2f, 0xeb, 0x2c, 0x39, 0x77, 0xa9, + 0x8c, 0x9b, 0x51, 0xff, 0xa9, 0x9f, 0xf7, 0x93, + 0x7e, 0x9a, 0xbf, 0xf2, 0x09, 0x60, 0x38, 0xac, + 0xcd, 0xb0, 0xc3, 0x0e, 0x48, 0xf0, 0xca, 0xad, + 0x8a, 0x87, 0xfd, 0xe4, 0xde, 0xbf, 0xa7, 0xfe, + 0x3c, 0x63, 0xc4, 0x1d, 0x71, 0xdd, 0x84, 0x73, + 0xdd, 0x7c, 0xa4, 0x67, 0x37, 0x26, 0xbe, 0xaf, + 0x89, 0xea, 0xd1, 0x82, 0x03, 0xe8, 0x1a, 0x9f, + 0xf3, 0xd9, 0x29, 0xd8, 0x59, 0xbb, 0xe0, 0x64, + 0xcd, 0x82, 0xde, 0xfc, 0x59, 0xfd, 0x5e, 0x15, + 0xab, 0x80, 0x28, 0xbe, 0x74, 0x7c, 0x79, 0xff, + 0x82, 0x37, 0xcf, 0x17, 0x54, 0x64, 0xec, 0xde, + 0x74, 0x66, 0x41, 0x13, 0x30, 0x99, 0x59, 0xb6, + 0x9b, 0x9d, 0x94, 0x7d, 0xd6, 0x9e, 0xea, 0x7c, + 0x6d, 0x17, 0xec, 0x94, 0x38, 0xf0, 0x8e, 0x6e, + 0xe7, 0x07, 0x9e, 0xe8, 0x04, 0x7e, 0x19, 0x19, + 0xa8, 0x51, 0x90, 0x1c, 0x1b, 0x19, 0x78, 0x87, + 0x6b, 0xa2, 0xd3, 0xe6, 0xa4, 0x39, 0xe9, 0x18, + 0x0e, 0x56, 0xca, 0x8b, 0xdf, 0x46, 0x1c, 0x66, + 0xc1, 0x58, 0x8f, 0x5b, 0xe5, 0xba, 0x3c, 0xa6, + 0x1b, 0x4f, 0x85, 0xa7, 0x87, 0x2a, 0xa9, 0x2c, + 0x22, 0x52, 0x95, 0xa0, 0x68, 0x96, 0x4d, 0x51, + 0x33, 0xef, 0x65, 0x45, 0x94, 0x4a, 0x3e, 0xef, + 0x69, 0x88, 0xcf, 0x8a, 0x98, 0x72, 0x8c, 0x8e, + 0x05, 0xd4, 0xa4, 0xc2, 0x8d, 0xb9, 0x4b, 0x1f, + 0xc8, 0x9e, 0x03, 0xd8, 0x59, 0x0a, 0x50, 0xc5, + 0x2b, 0x58, 0x0b, 0x18, 0xb0, 0xcb, 0x67, 0xd8, + 0x57, 0x35, 0xd5, 0x1b, 0x25, 0x34, 0x7c, 0x02, + 0xdd, 0xbc, 0xb2, 0xa4, 0x2c, 0xf1, 0x4b, 0xee, + 0x92, 0x8b, 0xcf, 0x44, 0x9b, 0x67, 0xb7, 0x58, + 0xd1, 0x99, 0x77, 0x3f, 0x10, 0x67, 0x65, 0x35, + 0xd3, 0xb6, 0x7c, 0x32, 0x46, 0xfb, 0x9c, 0xf9, + 0x8d, 0x71, 0x46, 0x17, 0x95, 0x8d, 0x4c, 0x51, + 0xa2, 0x27, 0x18, 0xd0, 0x9f, 0xf3, 0x3f, 0x5f, + 0x6b, 0x5c, 0xdb, 0xb8, 0xf2, 0xf3, 0x66, 0xe3, + 0x7f, 0x85, 0xd1, 0x6d, 0xe4, 0x9c, 0xc4, 0x0e, + 0x0a, 0x35, 0xdc, 0x81, 0xa2, 0x3f, 0x22, 0xcd, + 0x75, 0x51, 0x2e, 0x54, 0x2a, 0x73, 0xa9, 0x71, + 0xb8, 0xd6, 0x97, 0xec, 0x3e, 0xb7, 0xfb, 0xdd, + 0xc4, 0xc4, 0xf3, 0x71, 0xe4, 0x73, 0xd3, 0x64, + 0x06, 0x08, 0xfc, 0x56, 0xa7, 0xe4, 0x2e, 0x07, + 0x25, 0x52, 0x12, 0x55, 0xd8, 0xe5, 0x63, 0xd9, + 0x0d, 0x3b, 0xac, 0x9a, 0xa9, 0x35, 0xbc, 0x0c, + 0x01, 0xbb, 0x43, 0x72, 0x9d, 0x49, 0xfb, 0x2b, + 0x7b, 0xa8, 0x13, 0x9d, 0x6d, 0x58, 0x19, 0x11, + 0x09, 0x5d, 0xa3, 0x8b, 0xc1, 0x53, 0x32, 0x7f, + 0x8c, 0x7d, 0xe1, 0xd7, 0x7a, 0xaf, 0x2d, 0xd7, + 0x8b, 0x87, 0x15, 0x93, 0x74, 0x2e, 0xbe, 0xb8, + 0xe5, 0xfc, 0xa5, 0x1b, 0x3d, 0x19, 0xa0, 0xe4, + 0x7e, 0xb4, 0x15, 0xd5, 0x69, 0x82, 0x84, 0xb7, + 0xae, 0xb6, 0x1e, 0xcb, 0xa7, 0x9a, 0xf2, 0x28, + 0x56, 0x85, 0x4c, 0xd4, 0x75, 0x7b, 0xc9, 0x2e, + 0x09, 0x3e, 0x5a, 0xb1, 0x77, 0x60, 0x1c, 0x62, + 0x21, 0xd4, 0x2a, 0x2f, 0x95, 0xfb, 0xc1, 0xbd, + 0xd6, 0x83, 0x96, 0xcd, 0xed, 0x16, 0x0c, 0x5e, + 0x6f, 0x45, 0x4f, 0x64, 0xeb, 0xc5, 0x82, 0xfc, + 0x54, 0x3e, 0xa3, 0x4c, 0x04, 0xcf, 0x2d, 0xad, + 0x0e, 0xbf, 0xab, 0xcb, 0x2e, 0x0a, 0xf2, 0xb5, + 0xeb, 0xc1, 0x3d, 0xeb, 0x9e, 0xd5, 0x68, 0x88, + 0x39, 0x69, 0xf4, 0x32, 0x66, 0xd8, 0x57, 0x1a, + 0xfc, 0x83, 0xa6, 0x4b, 0x44, 0x1e, 0xbb, 0x84, + 0x2c, 0x1b, 0xc1, 0xbd, 0x4e, 0x91, 0x62, 0x3e, + 0xea, 0xc8, 0x87, 0xfd, 0x7f, 0x27, 0xfd, 0x5c, + 0x70, 0x7d, 0xa0, 0x7b, 0x7c, 0x3a, 0x3f, 0xc8, + 0x07, 0x1e, 0xa9, 0xa7, 0xc1, 0x0b, 0x9b, 0x50, + 0x9e, 0x70, 0x99, 0x9f, 0x89, 0x9e, 0x2e, 0x2a, + 0x3b, 0xe8, 0x44, 0x11, 0xa3, 0xcc, 0x51, 0x7f, + 0x1f, 0x45, 0x1e, 0x41, 0x33, 0xb8, 0x53, 0x7d, + 0xb0, 0x33, 0x64, 0xc5, 0xcd, 0x66, 0x47, 0x9c, + 0x95, 0xdc, 0x2d, 0x87, 0x38, 0x9a, 0x93, 0x09, + 0x8a, 0xce, 0x17, 0x4e, 0x22, 0x40, 0x46, 0x8a, + 0xb0, 0x56, 0xd1, 0xb3, 0x39, 0x5c, 0xec, 0x1d, + 0xd6, 0xa4, 0xa4, 0x36, 0x6d, 0x4d, 0x05, 0x18, + 0x65, 0x5a, 0x3a, 0x5c, 0x67, 0x04, 0xe6, 0x7d, + 0x94, 0x84, 0xcf, 0x4b, 0xe5, 0x3a, 0x13, 0x4f, + 0x9e, 0xc5, 0x67, 0xa6, 0x72, 0x95, 0x5d, 0xc6, + 0x27, 0x47, 0x04, 0x51, 0x36, 0x4d, 0xb2, 0xfd, + 0xd7, 0x99, 0xec, 0xff, 0x0d, 0x03, 0xfb, 0xfe, + 0x84, 0x88, 0xb1, 0x60, 0xa5, 0x2c, 0xb1, 0xf7, + 0x1c, 0xa5, 0xd6, 0x3c, 0x50, 0xad, 0x5c, 0x55, + 0xab, 0x4e, 0xaf, 0xf6, 0x3b, 0x69, 0x0f, 0xf2, + 0x5f, 0xfa, 0x3f, 0x0b, 0x8b, 0x43, 0xd0, 0x77, + 0x98, 0x15, 0x8c, 0x10, 0xec, 0xe5, 0x75, 0x0d, + 0xeb, 0xae, 0xec, 0x1c, 0xd1, 0x88, 0x1a, 0xf2, + 0x9f, 0x6d, 0xf5, 0x21, 0x9f, 0xf0, 0xfe, 0x54, + 0xd3, 0x4c, 0xd4, 0x58, 0x15, 0x2e, 0xef, 0x17, + 0xf5, 0x55, 0x4a, 0x4f, 0xe9, 0x69, 0xbb, 0xe1, + 0xa5, 0xed, 0xd4, 0x1e, 0x85, 0xd5, 0xcb, 0xbb, + 0x5f, 0x7b, 0x69, 0x07, 0xbb, 0xa8, 0x5f, 0x51, + 0xfa, 0x1d, 0xf9, 0x30, 0xaf, 0xa3, 0xb5, 0x0a, + 0xfc, 0x85, 0x9b, 0xeb, 0x68, 0x7e, 0xce, 0x9b, + 0x3e, 0x36, 0x77, 0x64, 0xdf, 0x8f, 0xac, 0xfa, + 0x8a, 0x67, 0x9e, 0x8d, 0x77, 0x53, 0xde, 0x14, + 0x7f, 0xa1, 0x66, 0xb8, 0xb0, 0x0b, 0x36, 0xf2, + 0x55, 0xa2, 0xa8, 0x38, 0xb1, 0xf2, 0x22, 0x43, + 0xb8, 0x04, 0xc3, 0x16, 0x91, 0x5e, 0xec, 0xf0, + 0x0c, 0x3a, 0xa5, 0x7b, 0xd5, 0x4b, 0xee, 0x4e, + 0xee, 0xfe, 0x47, 0x72, 0x04, 0x3c, 0x29, 0xec, + 0xe7, 0x59, 0x72, 0x6c, 0x46, 0x84, 0x7f, 0x24, + 0x2b, 0x8c, 0x2a, 0x81, 0xee, 0x1a, 0xce, 0xa5, + 0x60, 0xa9, 0x26, 0xbb, 0x71, 0xde, 0x62, 0x3a, + 0x9b, 0x0d, 0x64, 0x3c, 0xa7, 0xe1, 0x69, 0x41, + 0xd6, 0x9b, 0xf3, 0x40, 0x73, 0x7a, 0x4d, 0x6f, + 0x9a, 0x4f, 0x7a, 0x4b, 0x9e, 0xed, 0x11, 0x51, + 0x39, 0xae, 0x0e, 0x44, 0x27, 0xce, 0x6d, 0xc5, + 0x14, 0x3c, 0x22, 0xfe, 0x06, 0xee, 0xc0, 0x19, + 0xa6, 0x73, 0xb1, 0x46, 0x8a, 0x78, 0xa6, 0x2d, + 0xbf, 0xe5, 0x7e, 0xc0, 0x0d, 0xd7, 0x7a, 0x8d, + 0x8c, 0xc1, 0x9c, 0xaf, 0xf9, 0x0d, 0x38, 0x72, + 0x7e, 0xda, 0x98, 0x34, 0xbe, 0x91, 0x1d, 0xcf, + 0xdd, 0xbc, 0x7b, 0x25, 0x2f, 0x5f, 0xab, 0xb1, + 0x34, 0x2f, 0xb2, 0x13, 0xdd, 0x65, 0xf9, 0x59, + 0x77, 0xeb, 0x75, 0xf4, 0xb4, 0xdc, 0xf9, 0x60, + 0xdb, 0x29, 0xd9, 0xe5, 0xdd, 0xe5, 0x8d, 0xb2, + 0x03, 0xab, 0x6f, 0x96, 0x1c, 0x43, 0x3e, 0x77, + 0xe9, 0xbd, 0x35, 0x7c, 0x8f, 0xcb, 0x34, 0xf0, + 0xc4, 0xea, 0x6f, 0xe5, 0x33, 0xab, 0x57, 0xee, + 0x91, 0x6f, 0x7b, 0x4f, 0x36, 0x8c, 0x9e, 0x38, + 0xd4, 0xe7, 0x1f, 0xf4, 0x91, 0xaa, 0xac, 0x31, + 0x99, 0x30, 0xff, 0xe3, 0x7c, 0x82, 0x65, 0x9d, + 0x65, 0x1f, 0xbf, 0xce, 0xb9, 0xd1, 0xfd, 0xc6, + 0x11, 0x97, 0xd6, 0x2a, 0x9e, 0xd0, 0xe0, 0x07, + 0x09, 0x36, 0xee, 0x3c, 0xf9, 0xfe, 0xac, 0xf0, + 0xf6, 0x67, 0x7a, 0xf9, 0xee, 0xf7, 0xea, 0x6d, + 0xc8, 0x40, 0x9d, 0x08, 0xe8, 0x9b, 0xa9, 0xe3, + 0xab, 0x80, 0x98, 0xcc, 0xf6, 0xa7, 0x74, 0xfc, + 0x41, 0xaa, 0x4d, 0xed, 0x94, 0x47, 0x6b, 0x19, + 0xd8, 0xfb, 0xe9, 0x76, 0xba, 0x9d, 0x3b, 0xfa, + 0xf6, 0xef, 0x69, 0xbf, 0xd0, 0xa1, 0x46, 0xc1, + 0x7f, 0xb1, 0x8f, 0x4f, 0xb2, 0x82, 0xf9, 0xeb, + 0x5c, 0xdb, 0x91, 0xac, 0xce, 0x8a, 0xa5, 0x35, + 0x70, 0x87, 0xc7, 0xec, 0x32, 0xa0, 0x9c, 0x32, + 0x83, 0xc3, 0x29, 0xba, 0xd8, 0x6b, 0x97, 0x38, + 0x24, 0xb4, 0x64, 0x13, 0x1c, 0x77, 0x52, 0xc9, + 0x30, 0x0c, 0xc0, 0x22, 0x57, 0xc9, 0x4f, 0xa3, + 0xb2, 0x23, 0x01, 0x4f, 0x19, 0xb9, 0xe3, 0xeb, + 0xde, 0x9a, 0xff, 0x69, 0x75, 0xdc, 0xc6, 0x3e, + 0x9b, 0xf9, 0xa3, 0x25, 0x67, 0xe1, 0x81, 0x88, + 0x14, 0x89, 0x8e, 0x5e, 0x52, 0x17, 0xc0, 0x4e, + 0x10, 0xdf, 0x67, 0xc4, 0x33, 0x70, 0xe2, 0x42, + 0xda, 0x2b, 0x80, 0x89, 0xe2, 0xb0, 0xd3, 0xd2, + 0x2d, 0xb0, 0xf9, 0x3c, 0xdf, 0x92, 0x98, 0x30, + 0x7a, 0x9e, 0x48, 0x21, 0xd0, 0xbd, 0x87, 0x27, + 0x62, 0x57, 0x32, 0xe6, 0x9f, 0xb7, 0x7e, 0x7d, + 0xb6, 0x19, 0x8c, 0x7b, 0x7f, 0xf8, 0x73, 0xa5, + 0x8b, 0x15, 0xfc, 0xfd, 0xf8, 0x73, 0x3c, 0xc4, + 0xd7, 0x3d, 0x8e, 0x64, 0x17, 0x19, 0x92, 0x31, + 0xfa, 0x21, 0x17, 0x56, 0xc1, 0xaf, 0xbc, 0x1b, + 0xe8, 0xc0, 0xd0, 0x5d, 0xf3, 0xe2, 0x82, 0x17, + 0x84, 0x9c, 0xcd, 0x66, 0x30, 0xe2, 0x14, 0x8e, + 0x9f, 0xe9, 0xbf, 0x8a, 0x9b, 0xb1, 0xe6, 0x7e, + 0xd2, 0x48, 0x06, 0x15, 0xe7, 0xc2, 0xc6, 0x85, + 0x1f, 0xae, 0xad, 0xdc, 0xb0, 0x67, 0x9d, 0xca, + 0xfe, 0xac, 0x59, 0x09, 0x99, 0x21, 0x63, 0xbc, + 0x60, 0x3f, 0x37, 0xcf, 0xd8, 0x57, 0x76, 0xce, + 0xd4, 0xfe, 0xfb, 0x1f, 0x22, 0x57, 0x78, 0xa8, + 0xb6, 0x65, 0xd5, 0x1b, 0x66, 0x5a, 0x9a, 0x47, + 0xb2, 0x43, 0xb0, 0xe8, 0x00, 0x8e, 0xfd, 0x63, + 0x44, 0x07, 0x15, 0x51, 0x67, 0x9d, 0x6f, 0x1e, + 0x45, 0x67, 0x9a, 0x5e, 0x82, 0x0e, 0x46, 0x7d, + 0xb1, 0x72, 0x7c, 0xdb, 0x46, 0x9b, 0x33, 0x2d, + 0x2a, 0x78, 0x3e, 0x0f, 0xf2, 0x06, 0x31, 0x00, + 0xc3, 0x5e, 0x65, 0x3f, 0xdd, 0x55, 0xfb, 0xf5, + 0xfb, 0xfd, 0x27, 0xd3, 0xd1, 0x13, 0xcf, 0xa7, + 0x1b, 0xe5, 0x44, 0xd2, 0xe9, 0xde, 0x67, 0xd0, + 0x1d, 0x84, 0xd9, 0x61, 0x92, 0x3b, 0x06, 0x10, + 0x40, 0x3e, 0x0b, 0x79, 0xa6, 0xe1, 0x53, 0x41, + 0xf2, 0x51, 0x06, 0x10, 0xdf, 0x09, 0x6b, 0xf1, + 0x90, 0x85, 0x97, 0xc2, 0x27, 0x1a, 0x87, 0xf1, + 0x76, 0x89, 0x46, 0x24, 0xc7, 0x6d, 0xde, 0x5e, + 0xb4, 0x93, 0x80, 0x4b, 0xb2, 0xf6, 0x3c, 0xa8, + 0x0d, 0x35, 0x7c, 0x8e, 0x27, 0xb2, 0xab, 0x11, + 0x4a, 0x15, 0xc2, 0x5c, 0x5c, 0xa1, 0x57, 0xad, + 0x73, 0xf2, 0x39, 0x44, 0x18, 0xb9, 0x19, 0x51, + 0x4e, 0x2b, 0xc3, 0x4a, 0xfe, 0x40, 0xfa, 0xfb, + 0xe5, 0xa0, 0xa8, 0x16, 0x5f, 0x94, 0x55, 0xe5, + 0x45, 0x73, 0x63, 0x13, 0x06, 0x7c, 0x7d, 0xb1, + 0xa9, 0x6e, 0xaa, 0x77, 0x65, 0x3f, 0x46, 0x5e, + 0x75, 0xe5, 0xb0, 0x5f, 0xdb, 0xaf, 0x9d, 0x7a, + 0xad, 0x57, 0x85, 0xab, 0x9c, 0xc8, 0x28, 0x0d, + 0x46, 0xd3, 0x07, 0x2a, 0xaa, 0x2c, 0xea, 0x34, + 0x5c, 0xfd, 0xaf, 0x8b, 0x6f, 0x75, 0xe5, 0xbf, + 0x38, 0xf8, 0xec, 0x24, 0xea, 0x80, 0xd4, 0xef, + 0x73, 0x92, 0x16, 0x1d, 0xfd, 0x56, 0x7d, 0xdd, + 0x3f, 0xed, 0x8f, 0xec, 0x9b, 0x02, 0x6d, 0xc6, + 0x94, 0x4b, 0xca, 0x68, 0x10, 0xb7, 0x93, 0x07, + 0x29, 0xf3, 0x4f, 0x49, 0xf9, 0x9c, 0xd9, 0x61, + 0x8b, 0x44, 0xcf, 0x4a, 0x46, 0xee, 0x07, 0x93, + 0xd5, 0x66, 0xbf, 0x66, 0xb3, 0x0c, 0x3c, 0x3d, + 0x27, 0x48, 0x5b, 0x99, 0x8e, 0xd6, 0x3d, 0x67, + 0xcd, 0x81, 0x67, 0xfd, 0x40, 0x78, 0xb8, 0x7d, + 0x4f, 0xb2, 0xd2, 0x2d, 0xd2, 0xde, 0xa8, 0xe1, + 0x6f, 0x24, 0xaf, 0x1e, 0x33, 0x4b, 0x45, 0x5e, + 0xf6, 0x19, 0x0c, 0xac, 0x22, 0x28, 0xee, 0x83, + 0x2f, 0x22, 0xaa, 0x83, 0x07, 0xef, 0x55, 0xf2, + 0xc8, 0x35, 0x57, 0x53, 0x75, 0xbd, 0xca, 0x04, + 0x93, 0xfc, 0xe4, 0x93, 0xfe, 0xde, 0xeb, 0xa2, + 0x00, 0xfb, 0x37, 0x9f, 0x3a, 0x7a, 0xa5, 0xa4, + 0x54, 0x1a, 0x60, 0x3f, 0xf6, 0xaf, 0x43, 0x06, + 0x51, 0x8a, 0x9b, 0xef, 0x71, 0x6c, 0x44, 0x8e, + 0x5f, 0xf8, 0xcf, 0x43, 0xd1, 0xd3, 0x90, 0x5b, + 0xdb, 0x18, 0x9f, 0x0b, 0xb0, 0x8a, 0xf7, 0xac, + 0x57, 0x77, 0x48, 0x8d, 0x60, 0xbf, 0x63, 0xc0, + 0x75, 0x98, 0xff, 0x4d, 0x13, 0xec, 0x77, 0xd5, + 0x3c, 0x48, 0x5b, 0x33, 0x8d, 0xb0, 0xb7, 0xa5, + 0x8d, 0x55, 0x61, 0x73, 0xb0, 0x52, 0xa1, 0xcf, + 0x1e, 0x34, 0x59, 0xaa, 0x9d, 0x7e, 0x33, 0x7d, + 0x9c, 0x13, 0xcf, 0xaa, 0xd0, 0xdf, 0xe8, 0xed, + 0xea, 0x4e, 0xbe, 0x81, 0x8c, 0x14, 0xb6, 0x55, + 0x69, 0x45, 0xac, 0x19, 0x8c, 0x18, 0xf4, 0x3b, + 0xce, 0xbf, 0xdf, 0x51, 0x64, 0x8a, 0x88, 0xfc, + 0x51, 0x8d, 0xd4, 0xe0, 0x2a, 0x92, 0xd1, 0x35, + 0xcb, 0x28, 0x56, 0x4a, 0xe9, 0x8f, 0x7e, 0xc6, + 0x04, 0x3f, 0xfb, 0xac, 0xe8, 0x84, 0x5f, 0x6a, + 0x57, 0x0f, 0xc4, 0xb3, 0x43, 0x23, 0x56, 0x58, + 0x2d, 0xd6, 0x2a, 0xc8, 0xbf, 0xaf, 0x17, 0x10, + 0x73, 0xa1, 0xa4, 0xe8, 0x19, 0x6d, 0x5a, 0x74, + 0x4f, 0x4a, 0x2b, 0x8f, 0x82, 0xab, 0x74, 0x91, + 0x5e, 0x6b, 0x6c, 0x6e, 0xe4, 0x36, 0xae, 0x6e, + 0xdc, 0x00, 0xa9, 0xcc, 0x7e, 0x91, 0x73, 0x34, + 0xd1, 0xb5, 0x58, 0x46, 0x5f, 0xb7, 0x99, 0xda, + 0x26, 0x7f, 0x4f, 0xb6, 0xb1, 0x67, 0x11, 0xd6, + 0xff, 0x8a, 0x8c, 0x14, 0xce, 0x24, 0x3b, 0xcd, + 0x56, 0xe5, 0xf3, 0x44, 0x59, 0xd2, 0x3a, 0x6b, + 0x65, 0xc1, 0x4b, 0xd6, 0xdd, 0xea, 0xeb, 0xe1, + 0xb7, 0x12, 0xf3, 0xc7, 0x24, 0x43, 0xbd, 0x05, + 0xdf, 0xf3, 0xcd, 0xb7, 0xfd, 0x4a, 0x79, 0x61, + 0x07, 0x09, 0x31, 0x47, 0x8e, 0x9e, 0xb7, 0xb5, + 0x76, 0x32, 0x48, 0x63, 0x44, 0xdd, 0x3b, 0xef, + 0x95, 0x76, 0x4b, 0x3f, 0xd8, 0x42, 0x03, 0xc3, + 0xdd, 0x84, 0x91, 0x91, 0x8b, 0x8d, 0xe7, 0x56, + 0x12, 0x64, 0x71, 0x10, 0x23, 0x45, 0x59, 0x0f, + 0xf1, 0x95, 0xaf, 0x11, 0x8c, 0x8a, 0xf7, 0x39, + 0x36, 0xe0, 0x6b, 0xe4, 0xe7, 0x8f, 0xe6, 0xd5, + 0x79, 0x75, 0x35, 0xd0, 0x15, 0x7c, 0xea, 0xb3, + 0x2e, 0xd8, 0xe0, 0xba, 0x78, 0x42, 0x8a, 0x12, + 0xf5, 0x64, 0x30, 0x2b, 0x9d, 0x93, 0x9d, 0x1a, + 0x42, 0x76, 0x87, 0x60, 0x9a, 0x21, 0xaf, 0x22, + 0x45, 0x26, 0xc8, 0x35, 0xbe, 0x81, 0x31, 0x3d, + 0xec, 0x29, 0x32, 0x1d, 0x72, 0x21, 0xc8, 0x36, + 0x89, 0xf1, 0x55, 0x12, 0x3b, 0x5e, 0x33, 0x62, + 0x80, 0x7f, 0x07, 0x38, 0x36, 0xa2, 0x9f, 0xcb, + 0xb6, 0xec, 0x82, 0x40, 0x57, 0xe9, 0x50, 0xb0, + 0x46, 0x05, 0x13, 0x48, 0xf8, 0x0b, 0x8a, 0xb9, + 0x6a, 0x28, 0x06, 0x76, 0x1f, 0x5b, 0x05, 0x09, + 0x5e, 0x6d, 0x2b, 0xde, 0xea, 0xbe, 0xfe, 0xf3, + 0x62, 0x72, 0x35, 0xa9, 0xa8, 0x27, 0x7b, 0xc2, + 0x60, 0x45, 0xa3, 0xb2, 0xbf, 0xe6, 0xcf, 0xef, + 0x2c, 0xec, 0xc2, 0xab, 0xb7, 0x64, 0xce, 0x3a, + 0xd6, 0x78, 0xb5, 0xa7, 0x18, 0xab, 0xfb, 0x43, + 0xce, 0xaa, 0xad, 0xec, 0x48, 0x0e, 0x86, 0x64, + 0x61, 0xa4, 0x90, 0xed, 0xef, 0xa8, 0x47, 0x27, + 0x63, 0x2e, 0xfd, 0xfe, 0x84, 0xd1, 0xb3, 0xaf, + 0xe1, 0xb0, 0xf4, 0x60, 0x7e, 0xa3, 0xbc, 0x91, + 0xdf, 0xcd, 0xc2, 0x56, 0x41, 0xd6, 0x3d, 0x46, + 0x19, 0x46, 0x9c, 0x91, 0xa0, 0xe4, 0x5d, 0xf4, + 0x4a, 0xe2, 0xc9, 0xdd, 0x25, 0x7e, 0xd1, 0xfb, + 0xd0, 0x7b, 0xd2, 0xab, 0x13, 0xd1, 0xc8, 0x24, + 0x2f, 0x91, 0xed, 0xe3, 0xa2, 0xd8, 0x9f, 0x65, + 0x5f, 0x3f, 0x5e, 0x20, 0xb7, 0xfa, 0xd1, 0x69, + 0x8e, 0x99, 0xa9, 0x25, 0x63, 0xde, 0x96, 0x35, + 0x9e, 0x4b, 0xbd, 0x1a, 0xcf, 0x58, 0xf8, 0x0c, + 0xa3, 0xa8, 0x7b, 0x69, 0x14, 0x33, 0x08, 0x59, + 0x70, 0x60, 0x1f, 0x46, 0x29, 0xe0, 0x0f, 0xe7, + 0xb2, 0xf3, 0x88, 0x86, 0x7d, 0xe4, 0xf6, 0x33, + 0xc6, 0x74, 0x15, 0xa3, 0xc4, 0x83, 0x3c, 0x0a, + 0x07, 0x0c, 0x02, 0x76, 0xce, 0xc3, 0x7d, 0x1e, + 0xc5, 0x37, 0x32, 0x21, 0x7b, 0x27, 0xe4, 0xf0, + 0xfc, 0xff, 0x74, 0x6a, 0x95, 0x5d, 0x1d, 0xde, + 0x7f, 0xc2, 0x6f, 0x14, 0x93, 0x68, 0x06, 0x92, + 0x4b, 0x44, 0x44, 0x84, 0x56, 0x32, 0xe8, 0x48, + 0xf8, 0xec, 0xc9, 0xcb, 0x9d, 0xa4, 0x09, 0x3b, + 0x3b, 0x88, 0xfd, 0xfa, 0xc9, 0x86, 0x3c, 0xec, + 0x59, 0x8d, 0x71, 0xca, 0xe0, 0x6b, 0xec, 0x8d, + 0xe7, 0xc1, 0x45, 0x99, 0xfd, 0x2a, 0x6c, 0xf4, + 0xba, 0xe4, 0xd3, 0x89, 0xf1, 0xd9, 0xc4, 0x75, + 0x2f, 0x7a, 0xde, 0x13, 0xa0, 0x1c, 0xf1, 0x6c, + 0x8f, 0x78, 0x35, 0x6e, 0x6b, 0x58, 0x27, 0xdb, + 0x16, 0x75, 0x20, 0xc2, 0x2f, 0x4b, 0x89, 0xe7, + 0xb1, 0x7f, 0x12, 0xcc, 0xd2, 0x59, 0x1a, 0xdb, + 0x38, 0xfd, 0x34, 0xed, 0xa7, 0x5e, 0xcf, 0xd2, + 0xa2, 0xff, 0x30, 0xb0, 0xaa, 0x11, 0xfb, 0xdd, + 0x6a, 0xc3, 0xd9, 0x95, 0xb1, 0x1f, 0xdf, 0xcf, + 0xd2, 0xa2, 0x3c, 0xe3, 0x73, 0x4a, 0x61, 0xfe, + 0xf3, 0x17, 0x9e, 0x2d, 0x3f, 0xbe, 0xf2, 0xfa, + 0xc2, 0xb3, 0x79, 0x63, 0xf9, 0xf1, 0x25, 0x77, + 0x36, 0x1f, 0x9d, 0xad, 0xf0, 0x7f, 0xfd, 0x5b, + 0xd6, 0x99, 0xda, 0xcf, 0x3a, 0x61, 0xe4, 0x8e, + 0xf5, 0xe3, 0x57, 0xd8, 0x9f, 0xd9, 0xb0, 0x96, + 0x39, 0xfa, 0x06, 0x06, 0x5c, 0x35, 0xce, 0xf4, + 0xac, 0xf0, 0x7f, 0x63, 0xb4, 0xe1, 0x49, 0x76, + 0xf3, 0x2c, 0xbd, 0xb9, 0xf1, 0x7f, 0x9e, 0x2e, + 0xbd, 0x36, 0xdc, 0x25, 0x7a, 0xcb, 0x1f, 0x0e, + 0x94, 0xea, 0xfb, 0xcf, 0xa5, 0x95, 0x3b, 0x5b, + 0x30, 0x57, 0xd4, 0xa1, 0x30, 0x37, 0x11, 0x13, + 0x7a, 0x5f, 0xec, 0xcd, 0x81, 0xc1, 0xcc, 0x50, + 0x5f, 0x9d, 0xec, 0x94, 0xbd, 0x32, 0x76, 0x54, + 0x0f, 0xa3, 0x1f, 0x31, 0x65, 0xb0, 0x9f, 0xce, + 0xe0, 0xd7, 0x13, 0x55, 0x24, 0xd6, 0x9a, 0xa8, + 0x87, 0x5c, 0x3d, 0xf1, 0x64, 0x07, 0xf4, 0xa0, + 0x6f, 0xe2, 0x33, 0x77, 0xec, 0x6d, 0x27, 0x21, + 0x78, 0x67, 0x73, 0xe2, 0x89, 0x30, 0x65, 0xf1, + 0xce, 0xe1, 0x4c, 0x8a, 0xb8, 0x79, 0xdc, 0x4b, + 0x3a, 0xa2, 0x12, 0x00, 0x2c, 0xff, 0x9c, 0x72, + 0xbe, 0x17, 0xcd, 0x93, 0xf5, 0x49, 0x58, 0xa1, + 0xa4, 0x59, 0xb9, 0x8e, 0xbe, 0xa5, 0x57, 0x3f, + 0x11, 0xcc, 0x10, 0xec, 0x72, 0xa3, 0xd8, 0x52, + 0x6a, 0x2a, 0x07, 0xe1, 0x73, 0x94, 0xb5, 0xe1, + 0xdd, 0xba, 0xd8, 0xbf, 0x31, 0x76, 0xd3, 0x1c, + 0x3e, 0xfe, 0xd6, 0x8f, 0x63, 0xd6, 0xd2, 0xf8, + 0xd0, 0x8f, 0xef, 0x7f, 0xe8, 0x95, 0xfe, 0xb6, + 0xfc, 0xc3, 0x8a, 0x78, 0x7a, 0x3b, 0x5a, 0xcf, + 0xb0, 0x23, 0x35, 0x76, 0xa6, 0x0e, 0x36, 0x95, + 0xcd, 0xe0, 0xd5, 0x46, 0xfc, 0x87, 0xf8, 0x8e, + 0x9a, 0x8f, 0x6c, 0x77, 0xa1, 0x61, 0xb4, 0x75, + 0xef, 0x23, 0x3a, 0x38, 0xaf, 0x91, 0xed, 0x6e, + 0xca, 0x67, 0x3b, 0x20, 0xd3, 0xc9, 0x2f, 0x73, + 0xe2, 0x37, 0x7d, 0xe2, 0x93, 0x5e, 0x85, 0xc2, + 0xff, 0x47, 0xd8, 0xbb, 0x83, 0xb5, 0x71, 0xae, + 0xfb, 0xe2, 0x23, 0x31, 0x36, 0x23, 0x90, 0xcd, + 0xe8, 0x06, 0x02, 0x64, 0x34, 0x88, 0x01, 0x06, + 0x81, 0x8d, 0xe2, 0xf8, 0x82, 0x6d, 0x21, 0x8d, + 0xb1, 0x9c, 0x7c, 0x60, 0xaf, 0x64, 0x6c, 0xe3, + 0x84, 0xbd, 0xb6, 0xd7, 0x8e, 0x9c, 0xe5, 0xac, + 0xc5, 0x59, 0x67, 0x9f, 0xb3, 0x65, 0x27, 0xe7, + 0x44, 0x4e, 0x30, 0x52, 0x41, 0x31, 0x45, 0x8a, + 0x29, 0x5c, 0xb8, 0x58, 0x85, 0x0a, 0x8a, 0x29, + 0x52, 0x50, 0xac, 0xc2, 0x45, 0x0a, 0x15, 0x2e, + 0x54, 0xa4, 0xa0, 0x48, 0xe1, 0x62, 0x15, 0x14, + 0x2e, 0x28, 0x56, 0xa1, 0xc2, 0xc5, 0x14, 0xf3, + 0x3c, 0xe7, 0xff, 0xbe, 0xef, 0x37, 0xa3, 0x0b, + 0xce, 0x7e, 0xfe, 0xd1, 0x33, 0x02, 0x22, 0xeb, + 0x36, 0xf3, 0x5d, 0xde, 0xcb, 0xef, 0xe2, 0x3b, + 0xda, 0xf2, 0x35, 0xac, 0xe3, 0x7e, 0x25, 0xf9, + 0x75, 0x42, 0xee, 0x7f, 0x34, 0xb2, 0x42, 0x57, + 0xaa, 0x1e, 0x28, 0x73, 0xe7, 0x35, 0xea, 0x87, + 0xf2, 0x5b, 0x7e, 0xb0, 0xb9, 0xd3, 0xfd, 0xcb, + 0xf3, 0x76, 0xe7, 0x78, 0x23, 0x8a, 0x46, 0xac, + 0x12, 0xec, 0x28, 0x9f, 0xd6, 0x4b, 0xf0, 0x37, + 0x7c, 0x9b, 0x3d, 0x61, 0x87, 0xcf, 0xd0, 0x82, + 0x1e, 0x6a, 0xd7, 0x8c, 0x8c, 0x11, 0x3d, 0x8c, + 0x1b, 0xb5, 0x8a, 0x74, 0x50, 0xe8, 0x28, 0xc5, + 0xf5, 0x2b, 0xe4, 0x90, 0xe7, 0x7d, 0xbd, 0x5b, + 0x9d, 0xe6, 0xf8, 0xc9, 0x84, 0xfe, 0xa3, 0xbe, + 0x58, 0x5d, 0x68, 0x2c, 0x28, 0x3f, 0xba, 0x0f, + 0x95, 0x89, 0x5c, 0xd4, 0x78, 0x62, 0x86, 0xc4, + 0x3e, 0xff, 0x32, 0xca, 0x1b, 0x02, 0x7d, 0x5c, + 0x00, 0x21, 0x87, 0x0e, 0xb5, 0x98, 0xbd, 0xfa, + 0x3c, 0xc8, 0x13, 0xee, 0x75, 0xce, 0x10, 0xcc, + 0x0b, 0x9c, 0x1d, 0x03, 0x8e, 0xdc, 0x20, 0x7e, + 0xeb, 0x81, 0xd2, 0xe0, 0xee, 0x75, 0xbc, 0xd6, + 0xa7, 0x1f, 0x4d, 0x43, 0x1c, 0x2f, 0x34, 0x62, + 0x5b, 0x53, 0x77, 0x23, 0x86, 0x02, 0x7f, 0x7d, + 0x72, 0x17, 0x3b, 0x80, 0x7c, 0x2e, 0xac, 0x0b, + 0x0b, 0xc2, 0xa2, 0x33, 0x04, 0x7b, 0xf0, 0xb2, + 0xcb, 0x9a, 0xa8, 0xcd, 0x92, 0x21, 0x77, 0xd1, + 0xd3, 0xb9, 0x95, 0x26, 0x7a, 0xfd, 0xcd, 0xca, + 0x9f, 0xff, 0x4e, 0xdf, 0xd9, 0xaf, 0x7c, 0xde, + 0x24, 0x8e, 0x00, 0xe7, 0x89, 0x75, 0xbf, 0x6f, + 0xc7, 0xc5, 0xb3, 0x5a, 0x63, 0x19, 0x54, 0x68, + 0x61, 0x42, 0xa9, 0x50, 0xca, 0x94, 0x0a, 0x5b, + 0x19, 0xbd, 0xab, 0xb5, 0x2b, 0xe9, 0x61, 0x07, + 0xf2, 0x97, 0xa3, 0xab, 0x8f, 0x1e, 0x3a, 0xf1, + 0xa3, 0x84, 0x31, 0x7a, 0x97, 0xf3, 0x62, 0xb8, + 0x4a, 0xa2, 0x1f, 0xa9, 0xa2, 0x0b, 0x65, 0x42, + 0x4b, 0x88, 0xbc, 0x6f, 0xe5, 0xed, 0x92, 0x7b, + 0x58, 0x27, 0x7c, 0x2a, 0x9c, 0xac, 0xd7, 0xf5, + 0x32, 0xb8, 0x61, 0x4d, 0x46, 0x20, 0x5d, 0x33, + 0x26, 0xa4, 0x84, 0x4e, 0x46, 0xdf, 0x61, 0xf8, + 0xa6, 0xdd, 0xd8, 0x51, 0xea, 0x15, 0x32, 0xd2, + 0x67, 0x1a, 0xca, 0xd1, 0xe7, 0x1d, 0x4c, 0xa0, + 0x77, 0x76, 0xb5, 0x01, 0xf8, 0xae, 0x57, 0xde, + 0x5e, 0xfe, 0xed, 0x5e, 0xe9, 0xa1, 0x11, 0x26, + 0xbc, 0xd9, 0x30, 0xc4, 0x55, 0x4f, 0xda, 0x49, + 0x2b, 0xdc, 0x8e, 0x0a, 0xb8, 0x5b, 0x9e, 0x3f, + 0x5e, 0xb4, 0x17, 0x8f, 0xd7, 0x09, 0x91, 0xd2, + 0x55, 0x17, 0xe5, 0x5c, 0xe7, 0x0f, 0xba, 0x96, + 0x6e, 0x49, 0x2c, 0x89, 0x83, 0x6d, 0xae, 0x69, + 0xce, 0x77, 0x3d, 0xbf, 0xab, 0x25, 0x42, 0x58, + 0x90, 0x86, 0x75, 0x04, 0x51, 0xae, 0x69, 0x16, + 0xb1, 0xd3, 0xda, 0xb7, 0xd2, 0x29, 0x42, 0xba, + 0x0d, 0xf8, 0x33, 0xa5, 0xf1, 0x02, 0xce, 0x4d, + 0xa4, 0x4d, 0x75, 0x60, 0xdf, 0x55, 0xa0, 0x9d, + 0x13, 0xfc, 0x31, 0x29, 0xed, 0x48, 0x26, 0xc4, + 0x64, 0xec, 0x8a, 0x71, 0x39, 0xf7, 0x50, 0x89, + 0xe7, 0x54, 0x88, 0x48, 0xfe, 0x20, 0x72, 0x3d, + 0xa8, 0xb8, 0x11, 0x35, 0x66, 0xc8, 0xdb, 0x6e, + 0x37, 0x25, 0x55, 0xce, 0x5b, 0x59, 0x19, 0xf5, + 0xa0, 0x92, 0xb2, 0xd0, 0x41, 0x60, 0x20, 0xe6, + 0x2b, 0xa5, 0xfc, 0x15, 0xa2, 0x42, 0x44, 0x3f, + 0x76, 0x7a, 0x9a, 0x14, 0x9b, 0xed, 0xc2, 0xf9, + 0x0c, 0x39, 0x61, 0x7d, 0x42, 0xcf, 0x7a, 0x1a, + 0x29, 0x9e, 0x66, 0x35, 0xa1, 0xd0, 0x9f, 0x1d, + 0xc4, 0xb1, 0xa6, 0xba, 0x5f, 0x53, 0x43, 0xda, + 0x52, 0x15, 0x5e, 0x59, 0x61, 0xcd, 0x61, 0xe1, + 0x03, 0x44, 0x59, 0x3b, 0x25, 0xff, 0x95, 0xaa, + 0x75, 0x9e, 0x9e, 0xb9, 0x79, 0x4d, 0x1a, 0x68, + 0xed, 0xb2, 0x01, 0xf7, 0x3a, 0x1b, 0x38, 0xbe, + 0x5e, 0x1d, 0x7c, 0xbb, 0xd2, 0x5a, 0x60, 0x17, + 0xd8, 0x0a, 0x53, 0xde, 0x76, 0x77, 0xab, 0x0f, + 0xb9, 0xb2, 0x3c, 0x0a, 0x52, 0xd0, 0x31, 0xc4, + 0x1a, 0x70, 0x83, 0xd6, 0x33, 0xc8, 0xec, 0xe3, + 0x42, 0xc2, 0x1e, 0xdf, 0x9c, 0xd8, 0xf4, 0xb4, + 0x1c, 0x3d, 0x77, 0xb3, 0x45, 0x71, 0x51, 0x27, + 0x25, 0x0c, 0x23, 0x5c, 0x1e, 0xd2, 0x47, 0x4a, + 0x4f, 0x4b, 0x02, 0x65, 0x22, 0x69, 0xd4, 0x22, + 0x81, 0xf3, 0x51, 0x2b, 0x9f, 0x36, 0x4e, 0x33, + 0x74, 0x8b, 0x88, 0x3e, 0xc9, 0x6c, 0xad, 0xe9, + 0xa7, 0x75, 0x5f, 0xc5, 0x68, 0xcc, 0x89, 0x28, + 0x1f, 0x29, 0x5f, 0x79, 0x4a, 0xaf, 0xfe, 0x6e, + 0xeb, 0xe3, 0x09, 0x47, 0x08, 0xb3, 0xad, 0x4a, + 0x6b, 0x52, 0x00, 0x39, 0x02, 0x52, 0x17, 0x4f, + 0xd8, 0xe5, 0x3d, 0xe1, 0x1a, 0x40, 0xfd, 0x23, + 0x5d, 0x56, 0x60, 0xa1, 0x0d, 0x77, 0xf4, 0xeb, + 0x60, 0xc4, 0x4c, 0x48, 0x29, 0x73, 0x82, 0x65, + 0x59, 0xaf, 0x82, 0x19, 0x7f, 0x74, 0xc8, 0xc9, + 0x9a, 0xe7, 0xa5, 0x05, 0x73, 0x83, 0x14, 0xe5, + 0xe3, 0x12, 0xee, 0x76, 0x54, 0x8f, 0xad, 0x16, + 0xad, 0xa8, 0xc2, 0xf9, 0x87, 0x53, 0x72, 0xcc, + 0x9d, 0xb2, 0x50, 0x79, 0x3c, 0x2e, 0x4f, 0xc9, + 0x8f, 0x69, 0xff, 0xad, 0x35, 0xc3, 0x7a, 0xb8, + 0x5a, 0x34, 0xcf, 0x9b, 0xe7, 0xd9, 0x65, 0xed, + 0x2a, 0x46, 0x22, 0xbc, 0x96, 0x90, 0x43, 0x77, + 0xef, 0xb0, 0xf3, 0xdc, 0x5c, 0x37, 0xb3, 0xe6, + 0x92, 0x53, 0x83, 0xf8, 0x35, 0x85, 0xb1, 0x2c, + 0x2a, 0xaa, 0x12, 0x7a, 0xc7, 0xd3, 0xa1, 0x72, + 0x66, 0xa4, 0x3f, 0x39, 0x52, 0x7d, 0xd7, 0x0d, + 0x6d, 0x66, 0x37, 0x53, 0x2f, 0xc7, 0xd5, 0xb3, + 0xa5, 0x4a, 0xb2, 0x57, 0x59, 0x9a, 0xeb, 0x79, + 0xf1, 0x5a, 0xbc, 0x7f, 0x05, 0x03, 0x5e, 0x7d, + 0x8b, 0x89, 0x67, 0xb1, 0xc7, 0x0e, 0xe7, 0x39, + 0x9b, 0x5b, 0x50, 0xd6, 0x0d, 0xc9, 0x1c, 0xa7, + 0xaa, 0xcb, 0xae, 0x13, 0x94, 0x82, 0x52, 0xc1, + 0x51, 0x48, 0x27, 0x39, 0xca, 0xce, 0xae, 0x4c, + 0x6c, 0x7f, 0x6d, 0x06, 0x49, 0xcd, 0xc0, 0x47, + 0xd1, 0x20, 0x0e, 0x22, 0x4d, 0x75, 0xdc, 0x40, + 0x0f, 0xa7, 0x35, 0x28, 0xf4, 0x76, 0x50, 0xba, + 0x3e, 0xae, 0x9d, 0x98, 0x1f, 0x23, 0x01, 0x13, + 0x9d, 0x81, 0x21, 0x13, 0x21, 0x4f, 0xcc, 0xa9, + 0xf2, 0xd7, 0xd6, 0x80, 0xd4, 0xab, 0x5d, 0x09, + 0xf1, 0x03, 0xcd, 0xaf, 0x4e, 0x94, 0xc3, 0x51, + 0x9d, 0xb0, 0x12, 0xa4, 0xfb, 0x62, 0xa1, 0xfe, + 0x18, 0x09, 0xaf, 0xdb, 0x88, 0xb7, 0x76, 0x9f, + 0xf4, 0x3d, 0x44, 0xce, 0x72, 0x44, 0x8f, 0x38, + 0x53, 0x14, 0x81, 0x6f, 0x1e, 0x49, 0x47, 0x21, + 0x63, 0x88, 0xc5, 0x4b, 0xdc, 0x5d, 0x54, 0x82, + 0x99, 0xf1, 0xb1, 0x1b, 0x15, 0x2f, 0xc6, 0x11, + 0x15, 0x9d, 0x94, 0x17, 0x20, 0x06, 0xc2, 0x7e, + 0x4f, 0x8e, 0x47, 0x6e, 0x7a, 0x40, 0x7f, 0x01, + 0xcf, 0x45, 0x54, 0x6d, 0xcd, 0x95, 0xa9, 0x8b, + 0x33, 0xc5, 0x9e, 0x94, 0x3c, 0x1f, 0x40, 0x69, + 0xbc, 0x5d, 0xd1, 0x7d, 0x24, 0xdc, 0x24, 0x39, + 0xe2, 0x1a, 0x1e, 0x6b, 0x16, 0xa7, 0xd9, 0x8d, + 0xb6, 0x06, 0xab, 0xf2, 0x0a, 0x29, 0xbb, 0xdc, + 0x80, 0x03, 0x11, 0x02, 0x78, 0x7c, 0xee, 0x72, + 0x74, 0xf4, 0xaa, 0x1e, 0xaa, 0x86, 0x5a, 0xb5, + 0xed, 0xd0, 0xd6, 0xc2, 0xe1, 0xf2, 0xd6, 0xc2, + 0xf6, 0x8d, 0x77, 0x5a, 0x89, 0xb3, 0xc0, 0xd0, + 0x41, 0x32, 0xa4, 0xdf, 0x84, 0x5c, 0x61, 0x96, + 0x9d, 0x62, 0x89, 0xad, 0xd1, 0x95, 0xb8, 0x34, + 0xef, 0xa8, 0xd2, 0xa7, 0x14, 0x41, 0xf9, 0xdd, + 0xaa, 0x5e, 0x4c, 0x5a, 0x37, 0xde, 0xe0, 0xda, + 0x26, 0x69, 0x37, 0x59, 0xba, 0xf1, 0xc8, 0x10, + 0xb8, 0xce, 0xb0, 0x57, 0x07, 0x7e, 0x4d, 0x1e, + 0x91, 0x87, 0x05, 0x39, 0xaa, 0x84, 0xb8, 0x33, + 0xc4, 0x3b, 0xac, 0xfc, 0x20, 0xd6, 0xd8, 0x8f, + 0xbd, 0xd1, 0x27, 0x6e, 0x43, 0x22, 0x56, 0x5c, + 0x83, 0x54, 0x79, 0x94, 0x00, 0xa1, 0x58, 0x91, + 0xbd, 0xd2, 0x9d, 0xdd, 0xbc, 0x8f, 0x86, 0x31, + 0x51, 0x1c, 0x62, 0x95, 0x35, 0xd2, 0x25, 0xee, + 0xf6, 0xbc, 0x10, 0xeb, 0x12, 0x79, 0x9f, 0xb2, + 0x2a, 0x8d, 0xae, 0x82, 0x28, 0xc6, 0x5a, 0x63, + 0xad, 0xe7, 0xf9, 0xb1, 0x96, 0xac, 0xdd, 0x78, + 0x7b, 0x65, 0xeb, 0x6a, 0x6b, 0x93, 0xdd, 0x37, + 0x63, 0xad, 0x29, 0x5e, 0xdf, 0x90, 0x42, 0xef, + 0x87, 0x4b, 0xcf, 0xec, 0xb8, 0x75, 0xc6, 0x8d, + 0x89, 0xb5, 0xf7, 0x61, 0x8c, 0xeb, 0xcb, 0x5a, + 0x79, 0xdd, 0xf2, 0x1c, 0xc9, 0x9d, 0xae, 0x2b, + 0x22, 0x8e, 0xe8, 0x8e, 0xb2, 0xcf, 0xd6, 0x49, + 0x47, 0x72, 0x64, 0x27, 0xa8, 0x4c, 0xd3, 0x3a, + 0xce, 0x95, 0xc2, 0x2c, 0xcf, 0xa5, 0xf0, 0x66, + 0xa8, 0xc6, 0x5c, 0x39, 0xaf, 0xbc, 0x2b, 0x8b, + 0xd6, 0xa0, 0xc7, 0x79, 0x2c, 0xd2, 0xde, 0xbb, + 0xdc, 0xca, 0x48, 0xc5, 0x63, 0x05, 0x7e, 0x6a, + 0x4c, 0x23, 0x44, 0x70, 0x3d, 0xf9, 0xa1, 0xc3, + 0x42, 0xbf, 0x72, 0x1a, 0x67, 0xad, 0x22, 0x8f, + 0x32, 0xa3, 0x23, 0x1b, 0x5e, 0x2a, 0x2f, 0x41, + 0xb6, 0xb9, 0xa8, 0x6e, 0x70, 0xa6, 0x8f, 0xc4, + 0x75, 0x51, 0x96, 0x5a, 0xd4, 0xad, 0x32, 0x79, + 0x57, 0x5e, 0x36, 0x95, 0x4e, 0xde, 0x1d, 0x76, + 0x13, 0xf2, 0x68, 0xe3, 0xd2, 0xd1, 0x97, 0xf9, + 0xb8, 0x9e, 0xb0, 0xe2, 0xe5, 0x84, 0x19, 0x97, + 0x79, 0x9d, 0x30, 0xa8, 0xe4, 0x55, 0x69, 0x7f, + 0xd7, 0x3e, 0x67, 0x64, 0x8d, 0x0d, 0x88, 0x31, + 0x3e, 0x8c, 0xea, 0xe5, 0xc6, 0x4e, 0x03, 0xf5, + 0x84, 0xe2, 0x62, 0x4a, 0x78, 0xda, 0xe1, 0x12, + 0x7c, 0xd4, 0xc6, 0x7c, 0x1f, 0x33, 0xa4, 0x35, + 0x36, 0xbf, 0x3d, 0xf7, 0x76, 0xe8, 0x6d, 0x90, + 0xea, 0x48, 0x78, 0xa6, 0x18, 0x33, 0xa4, 0x0f, + 0x10, 0x56, 0xbf, 0x06, 0xf5, 0x60, 0x15, 0x16, + 0x02, 0x29, 0x29, 0x95, 0x2b, 0xc4, 0x0e, 0x56, + 0x56, 0x14, 0x89, 0xde, 0x5b, 0x3a, 0x38, 0x87, + 0x2a, 0x46, 0x65, 0x78, 0x9a, 0xe5, 0xad, 0x39, + 0x58, 0xdb, 0xaa, 0x3e, 0x69, 0x8d, 0xe7, 0xc2, + 0x4a, 0xf4, 0xf0, 0x85, 0x24, 0x3d, 0x59, 0x92, + 0xb3, 0x42, 0xb6, 0xc9, 0x72, 0xa4, 0x20, 0x8a, + 0x7c, 0x7e, 0xf6, 0x57, 0x57, 0x63, 0x88, 0x27, + 0xac, 0x6d, 0x45, 0x8f, 0x6f, 0x38, 0x57, 0x8e, + 0xaf, 0x6e, 0xdd, 0xdf, 0x8a, 0x33, 0x1e, 0x5d, + 0x67, 0xcc, 0xd1, 0x2d, 0xee, 0xd9, 0x7c, 0xb2, + 0x92, 0x80, 0x23, 0xb9, 0x1f, 0x1d, 0xc7, 0xe3, + 0x11, 0xee, 0x76, 0xcd, 0x1f, 0x1d, 0xa2, 0x15, + 0x5e, 0xf2, 0xba, 0x00, 0x5c, 0xeb, 0x91, 0x98, + 0xc5, 0xb4, 0x1e, 0x05, 0x7b, 0x76, 0x9c, 0x53, + 0xca, 0x29, 0x52, 0xe2, 0xe5, 0x58, 0xa6, 0x60, + 0xd7, 0x81, 0x40, 0x0f, 0x99, 0x63, 0xd6, 0xe3, + 0x72, 0x48, 0x8f, 0x74, 0xe2, 0x8d, 0xe2, 0x4e, + 0xb4, 0x5a, 0x33, 0xa7, 0xaa, 0x51, 0x7d, 0xaa, + 0x12, 0x2d, 0x8d, 0xe5, 0x51, 0x47, 0x76, 0xc7, + 0xeb, 0xa4, 0x43, 0x44, 0xbd, 0x73, 0xe9, 0xf0, + 0xab, 0x6a, 0xdc, 0x48, 0xef, 0xf0, 0xd8, 0xb6, + 0x97, 0x85, 0x1d, 0x90, 0x57, 0x93, 0xf3, 0xbf, + 0xa9, 0xf1, 0xa2, 0xc5, 0x73, 0xd1, 0x85, 0xdc, + 0xe2, 0xc1, 0x62, 0x65, 0x75, 0xf3, 0xf1, 0xcb, + 0x01, 0x8f, 0x35, 0x83, 0x9c, 0x99, 0x82, 0xb0, + 0xe8, 0x16, 0x78, 0x9f, 0xc6, 0xa9, 0xfd, 0x24, + 0x39, 0xc3, 0xa6, 0x44, 0x51, 0x2e, 0xe7, 0xf1, + 0x21, 0xce, 0xe2, 0x99, 0x14, 0x23, 0xc5, 0xbc, + 0x71, 0x2d, 0x99, 0xf4, 0xf7, 0x41, 0x91, 0xe6, + 0x37, 0xd7, 0xe0, 0x88, 0x1f, 0x24, 0x2b, 0x7d, + 0x15, 0x48, 0x69, 0xd7, 0x4c, 0xda, 0x49, 0x7b, + 0xd7, 0xfe, 0x77, 0xe7, 0xdf, 0x9d, 0x3f, 0xda, + 0xff, 0xdb, 0x5e, 0x83, 0xdf, 0x6f, 0x69, 0x35, + 0x2d, 0x48, 0xe3, 0x6a, 0xc4, 0x49, 0xc2, 0xf3, + 0xb4, 0xfa, 0xe7, 0xa8, 0xe7, 0xe5, 0x9c, 0xd0, + 0xce, 0x52, 0x6a, 0x10, 0xb3, 0x85, 0xed, 0xa2, + 0x73, 0xde, 0x3e, 0xef, 0x5c, 0x2e, 0x5f, 0xdd, + 0x9e, 0xde, 0x2e, 0xfe, 0x63, 0xfa, 0x97, 0xa2, + 0x1a, 0x48, 0xf9, 0xc8, 0x1f, 0xde, 0x73, 0xf1, + 0x35, 0xd5, 0xfc, 0x1b, 0xf7, 0x1c, 0xf7, 0x55, + 0xd6, 0xbb, 0x1e, 0x90, 0xbe, 0x86, 0x95, 0xb7, + 0xd3, 0x20, 0x5b, 0xbc, 0x52, 0x34, 0x7b, 0xf5, + 0x84, 0xca, 0x79, 0xe1, 0x04, 0xba, 0xfc, 0xa4, + 0x9f, 0x08, 0xe5, 0x6f, 0xca, 0xe7, 0x2e, 0x56, + 0x4e, 0xa3, 0xfa, 0xc5, 0xea, 0x7d, 0xb8, 0x8f, + 0xe9, 0xf1, 0x66, 0xbc, 0x8c, 0xf3, 0xa8, 0xeb, + 0x02, 0x89, 0x33, 0x68, 0xd8, 0xd8, 0xc1, 0x1c, + 0xa8, 0x2c, 0xbf, 0x8c, 0x90, 0x56, 0x36, 0x44, + 0x05, 0x4d, 0x11, 0xe2, 0xb0, 0x9a, 0x33, 0x90, + 0x3b, 0xa3, 0x7f, 0x7c, 0xd2, 0xc3, 0x97, 0x3e, + 0xbb, 0xef, 0xca, 0x74, 0xd2, 0x41, 0x03, 0x1f, + 0x1d, 0xd2, 0xd7, 0xaa, 0x30, 0x7b, 0xb1, 0xb6, + 0x2a, 0x8c, 0x4a, 0x11, 0x2c, 0x2f, 0x36, 0x6e, + 0x25, 0xef, 0x92, 0x0a, 0xf7, 0xba, 0x96, 0x51, + 0x0b, 0xaa, 0xcf, 0xc3, 0x84, 0x73, 0x57, 0x16, + 0x8c, 0x82, 0x35, 0x23, 0x15, 0x10, 0x83, 0x61, + 0xca, 0xad, 0x84, 0xf6, 0x4d, 0x2e, 0xeb, 0x26, + 0x21, 0x43, 0x7c, 0x61, 0xc4, 0x1e, 0x5d, 0x33, + 0x2e, 0x1b, 0x97, 0x0f, 0xee, 0x91, 0xfa, 0x99, + 0x3f, 0xcb, 0x02, 0xbf, 0x8b, 0x3b, 0xe3, 0x7e, + 0x04, 0x51, 0x23, 0xc3, 0x1e, 0xfd, 0x3d, 0xf4, + 0x7e, 0xd7, 0x80, 0xfd, 0xd7, 0x48, 0x59, 0xc9, + 0x97, 0x23, 0xf1, 0x67, 0x61, 0x8f, 0x0b, 0x60, + 0x8e, 0xe0, 0x7a, 0x61, 0xa0, 0x2b, 0xfd, 0x90, + 0xb2, 0xa0, 0x2c, 0x60, 0x87, 0x98, 0x1c, 0x43, + 0x7c, 0x34, 0x38, 0xba, 0x74, 0x61, 0x2c, 0x94, + 0x30, 0x92, 0x96, 0xfc, 0x72, 0x3a, 0x9c, 0x09, + 0x97, 0x7a, 0xf6, 0x50, 0x86, 0x68, 0xc1, 0x3a, + 0x6a, 0x37, 0xdd, 0xef, 0x89, 0x82, 0xa2, 0xc2, + 0x10, 0xaa, 0x8e, 0xb3, 0x0c, 0x5b, 0x6e, 0x05, + 0xb5, 0x58, 0x0e, 0x39, 0x8f, 0xd9, 0x5c, 0x96, + 0xad, 0x99, 0x9f, 0x8a, 0x9d, 0x3a, 0x12, 0xf1, + 0x73, 0xd0, 0x05, 0xeb, 0x52, 0xa3, 0xb7, 0x8e, + 0x84, 0x73, 0x35, 0xe1, 0x7e, 0x23, 0x66, 0xf7, + 0x92, 0x8e, 0xda, 0x78, 0x51, 0x8d, 0xb1, 0x6b, + 0xd5, 0xcb, 0xec, 0x32, 0xbb, 0xc7, 0x22, 0x55, + 0x0f, 0xed, 0xef, 0x55, 0x4b, 0xba, 0x95, 0x95, + 0x6b, 0x2b, 0xd3, 0xd2, 0x4d, 0xae, 0x7d, 0xa7, + 0xc3, 0x48, 0x36, 0xd2, 0x87, 0x85, 0x4a, 0x78, + 0xf3, 0xbb, 0x9f, 0xce, 0x88, 0xbd, 0x19, 0x12, + 0x3e, 0x1a, 0x68, 0x63, 0x34, 0x00, 0x8f, 0x1b, + 0xa7, 0xbf, 0xdb, 0xf9, 0xe9, 0x54, 0xf8, 0xac, + 0xd8, 0xd5, 0xbd, 0xec, 0xba, 0x71, 0xf4, 0x76, + 0x5d, 0xf8, 0xda, 0x1e, 0x11, 0x22, 0xbf, 0x4c, + 0xeb, 0xeb, 0xfa, 0x48, 0x33, 0x92, 0x8f, 0x98, + 0x97, 0xcd, 0x87, 0xc8, 0x14, 0x22, 0x0f, 0xa3, + 0x88, 0xa7, 0x3f, 0x29, 0x9b, 0x69, 0x18, 0x39, + 0xc1, 0xc6, 0x33, 0x74, 0x11, 0x32, 0xb1, 0x2b, + 0x95, 0xac, 0x7b, 0xb3, 0xac, 0x0e, 0xeb, 0x5a, + 0x72, 0xec, 0x1d, 0x44, 0x8c, 0xea, 0xfd, 0xbf, + 0xc7, 0xb1, 0xe3, 0xa9, 0xc4, 0x9b, 0x7e, 0x45, + 0x5d, 0xd0, 0x65, 0x43, 0x7e, 0xf5, 0xe5, 0xbb, + 0xcd, 0xc6, 0xe6, 0xfe, 0xc3, 0xbf, 0x7f, 0xd1, + 0xde, 0xb4, 0x5e, 0x34, 0xd6, 0xf4, 0x8e, 0x6b, + 0x4f, 0x77, 0x1f, 0xf4, 0x3c, 0x7f, 0xb6, 0x97, + 0xfc, 0xb5, 0x0b, 0x51, 0x16, 0x3f, 0x1e, 0x6f, + 0x90, 0x23, 0xc3, 0xe7, 0xee, 0x1f, 0xe2, 0xcf, + 0x9d, 0x8d, 0xc3, 0xcf, 0x0e, 0x9f, 0xbb, 0xc8, + 0x58, 0x16, 0x65, 0xef, 0x95, 0xcd, 0x98, 0xbb, + 0xbb, 0x2f, 0xee, 0xdf, 0xfe, 0xfb, 0x5c, 0x5b, + 0xb3, 0x16, 0xac, 0xb3, 0xe5, 0x8a, 0xa7, 0xde, + 0xcf, 0x77, 0xe7, 0x08, 0xed, 0xce, 0x2c, 0xfe, + 0x19, 0xc4, 0xca, 0x17, 0x61, 0x47, 0x14, 0x21, + 0xe2, 0x2f, 0xcb, 0x84, 0x29, 0xca, 0x69, 0xac, + 0xf8, 0x5e, 0x33, 0x0a, 0x9b, 0xda, 0xaf, 0xc5, + 0x6a, 0x90, 0x65, 0x0f, 0x17, 0x73, 0x99, 0x5c, + 0x89, 0x34, 0xe7, 0x91, 0x63, 0x9d, 0x51, 0x62, + 0xee, 0xa8, 0x72, 0x5a, 0x19, 0x26, 0xe4, 0xcd, + 0x8c, 0x83, 0x7b, 0xf3, 0x9a, 0x82, 0x6e, 0x42, + 0xc8, 0xf5, 0x9b, 0x39, 0xda, 0x50, 0x86, 0x5d, + 0xe4, 0x52, 0x5e, 0x44, 0x8f, 0x38, 0x33, 0x4a, + 0x2e, 0x0d, 0x49, 0x53, 0xe8, 0xc4, 0xc7, 0x69, + 0x72, 0x0b, 0x18, 0x39, 0xa1, 0xe8, 0x45, 0xde, + 0x67, 0x47, 0xbb, 0xc4, 0x4c, 0xbd, 0xe2, 0x5c, + 0x31, 0x51, 0xe3, 0x79, 0x13, 0x9e, 0x9b, 0x74, + 0x64, 0x93, 0xd7, 0x9f, 0x91, 0x21, 0x92, 0xa6, + 0xfe, 0xfa, 0xc3, 0xe3, 0x90, 0x06, 0xb7, 0x63, + 0x82, 0xc9, 0x78, 0x28, 0x56, 0x49, 0xb8, 0xd9, + 0x9e, 0x96, 0xa7, 0xdb, 0x58, 0x09, 0x42, 0x5f, + 0xd8, 0x79, 0x62, 0xeb, 0x60, 0x0e, 0x8b, 0x99, + 0xf1, 0x1d, 0x27, 0xa3, 0xcf, 0xb7, 0x87, 0xf4, + 0xe1, 0x76, 0x54, 0x9f, 0xe9, 0xf3, 0x77, 0x3e, + 0xe9, 0x62, 0x93, 0x34, 0x27, 0x8f, 0x35, 0xd3, + 0x77, 0xb1, 0x11, 0x92, 0xc2, 0x51, 0xda, 0x53, + 0xa5, 0xed, 0x55, 0x7c, 0xfa, 0xd4, 0xf7, 0x6d, + 0xb9, 0x3b, 0x54, 0xf9, 0xb6, 0x19, 0x67, 0x67, + 0x58, 0x8c, 0xd5, 0x58, 0x88, 0x9d, 0x77, 0xb2, + 0x7a, 0xb6, 0xc4, 0x78, 0x2f, 0x95, 0xe1, 0x3c, + 0x50, 0x2d, 0xd1, 0x0a, 0x29, 0xa2, 0xf5, 0x9d, + 0xc5, 0xfb, 0x2d, 0xbe, 0x1f, 0x6e, 0x40, 0x56, + 0x1a, 0xb0, 0xae, 0x35, 0x07, 0x9c, 0xe0, 0xdb, + 0x6f, 0x57, 0xf0, 0x33, 0x63, 0x4d, 0x29, 0x69, + 0xcd, 0xe5, 0xb8, 0xfe, 0x73, 0xcd, 0x0d, 0x0b, + 0x10, 0xb7, 0xb3, 0xf3, 0xd5, 0xf3, 0xc2, 0xe5, + 0xea, 0x55, 0xa9, 0x17, 0x77, 0x0d, 0x6b, 0x3b, + 0xe2, 0x15, 0x74, 0xea, 0xd0, 0x77, 0x8e, 0x4c, + 0x2e, 0xd3, 0xe2, 0x3d, 0x4d, 0x74, 0x49, 0x38, + 0x4b, 0x7d, 0xcc, 0x8b, 0xd6, 0x86, 0x15, 0xb6, + 0xc4, 0x97, 0x67, 0xe2, 0xd1, 0xf0, 0x74, 0x5d, + 0xdf, 0xf1, 0xe6, 0x3e, 0xdb, 0x85, 0xd0, 0x1c, + 0x71, 0xb5, 0x53, 0x90, 0x6b, 0xac, 0x33, 0xbc, + 0x12, 0xb0, 0xff, 0xf2, 0x9e, 0xb5, 0x2c, 0x1c, + 0x4d, 0xd5, 0xa3, 0xf5, 0x28, 0x8c, 0x8b, 0x29, + 0xac, 0xe3, 0x59, 0x38, 0x33, 0x32, 0xb0, 0xa4, + 0x75, 0x57, 0x06, 0x9c, 0x89, 0xe9, 0x23, 0xcc, + 0xdd, 0x7a, 0xf3, 0x42, 0x8a, 0xeb, 0x6c, 0x88, + 0xe9, 0x4a, 0x77, 0x9c, 0xaa, 0xf1, 0xb9, 0xcb, + 0x9c, 0x3b, 0xe6, 0x5d, 0xa7, 0xea, 0x69, 0x74, + 0xcb, 0x94, 0x19, 0xea, 0x4c, 0x31, 0xc8, 0xbd, + 0xae, 0x8e, 0xfa, 0xef, 0x88, 0xee, 0xbc, 0xc9, + 0xeb, 0x75, 0x54, 0x65, 0x8a, 0x90, 0x36, 0x2c, + 0x31, 0x9b, 0x8e, 0x22, 0x8a, 0x22, 0xc0, 0x67, + 0x53, 0x23, 0x2a, 0x9d, 0x67, 0x36, 0xec, 0x3c, + 0x33, 0xc2, 0xc6, 0x88, 0x1b, 0xd5, 0x77, 0x9d, + 0x90, 0x79, 0xc1, 0x67, 0xd9, 0x3b, 0x5d, 0xf5, + 0x15, 0xff, 0x33, 0x41, 0xd6, 0x70, 0xf4, 0x44, + 0x19, 0xf4, 0x3e, 0x55, 0x7f, 0x95, 0xd5, 0xc3, + 0xe7, 0x75, 0x54, 0xd2, 0x7c, 0x65, 0x16, 0x52, + 0xa1, 0x52, 0x46, 0xda, 0xf8, 0x7c, 0x9e, 0x8b, + 0x62, 0x1e, 0xc3, 0x1f, 0xcd, 0xb3, 0x80, 0xb3, + 0x6b, 0x0c, 0xb8, 0x79, 0x5d, 0x70, 0x56, 0xcd, + 0x20, 0x71, 0x84, 0x49, 0x43, 0x85, 0x2a, 0xdb, + 0x3b, 0x4c, 0x30, 0x48, 0xe5, 0xc2, 0x09, 0x98, + 0x85, 0x1e, 0x7d, 0x15, 0xaf, 0x1a, 0xef, 0xe4, + 0x29, 0x32, 0xe2, 0xf7, 0x73, 0xe6, 0x8a, 0xf9, + 0x98, 0xf0, 0xde, 0x54, 0x43, 0x26, 0x87, 0x72, + 0x5c, 0x9b, 0x61, 0x0d, 0x46, 0xce, 0x45, 0xc7, + 0xb3, 0x29, 0xd8, 0x83, 0xee, 0xc1, 0x1b, 0xe2, + 0x43, 0x03, 0xb0, 0xef, 0x85, 0xa9, 0xfb, 0xe0, + 0xe3, 0xeb, 0xc6, 0xda, 0xc8, 0xd2, 0x43, 0xa7, + 0x2b, 0xd9, 0xe2, 0xf8, 0xba, 0x80, 0x87, 0xfd, + 0x50, 0x1a, 0xeb, 0xf2, 0x90, 0x94, 0x78, 0xcf, + 0x7b, 0x84, 0x11, 0x23, 0xc2, 0x55, 0x9b, 0x9a, + 0x7c, 0x0e, 0x72, 0xdf, 0xe9, 0xbc, 0x79, 0xda, + 0x49, 0x0a, 0x8f, 0xfb, 0xa3, 0x3e, 0x25, 0x06, + 0x19, 0xe0, 0x9c, 0x33, 0x6f, 0xff, 0x80, 0x5d, + 0x5c, 0x38, 0xbe, 0x38, 0xbe, 0xd1, 0xba, 0xc2, + 0x52, 0xe6, 0xe3, 0x9c, 0xcf, 0xee, 0xd7, 0xac, + 0x8f, 0xa4, 0xc5, 0xf7, 0x9c, 0x5d, 0xd1, 0xab, + 0x73, 0x82, 0x8a, 0xcb, 0xc3, 0xa4, 0x38, 0xfb, + 0x51, 0xdb, 0xc0, 0xbe, 0x17, 0xcc, 0xc3, 0xb8, + 0x3d, 0xae, 0x45, 0x99, 0x7c, 0x20, 0x08, 0x43, + 0x66, 0x08, 0xae, 0x5d, 0xe2, 0x5d, 0x42, 0xfd, + 0xb8, 0xfd, 0x21, 0xae, 0x4f, 0xd0, 0x0b, 0x6c, + 0xd6, 0xe0, 0x7a, 0x85, 0x6a, 0x63, 0xd6, 0x28, + 0xb0, 0xf9, 0xf7, 0x58, 0x15, 0x9d, 0x95, 0x3f, + 0x2b, 0x77, 0xb4, 0xfe, 0x9a, 0xf3, 0x82, 0x8a, + 0xfa, 0xe9, 0x70, 0x56, 0x35, 0xb8, 0xe5, 0x3c, + 0x6d, 0x43, 0xf4, 0xf2, 0xce, 0x7b, 0x0e, 0xd9, + 0xfc, 0x7c, 0xf9, 0xae, 0xc3, 0xbc, 0x2b, 0x5d, + 0xa3, 0x4c, 0xd3, 0x8f, 0x3e, 0xfb, 0xb5, 0xee, + 0x21, 0xf3, 0x32, 0x9e, 0xb3, 0x8d, 0xd2, 0x5d, + 0x18, 0xb1, 0x98, 0x8d, 0xe0, 0xf1, 0x83, 0x84, + 0xff, 0x3e, 0xd8, 0x89, 0xcc, 0x25, 0x42, 0x76, + 0xc2, 0x75, 0x7d, 0xb5, 0xec, 0x5c, 0xf2, 0xdd, + 0xb2, 0x29, 0x8b, 0x41, 0xa6, 0x1e, 0xd7, 0xf4, + 0x80, 0x00, 0x5d, 0xc0, 0x67, 0xc2, 0x5c, 0xf6, + 0xb0, 0x01, 0xbc, 0x1a, 0xf7, 0xe9, 0x9b, 0x52, + 0x69, 0xac, 0x9d, 0x6e, 0x22, 0x3b, 0xb3, 0x3b, + 0xe6, 0xd0, 0x2b, 0xea, 0xce, 0xbb, 0x2c, 0x5b, + 0xc8, 0x49, 0x72, 0xda, 0xfd, 0x1f, 0x32, 0xec, + 0x11, 0xb9, 0xde, 0xca, 0x18, 0x5f, 0xf9, 0xbb, + 0xf9, 0x17, 0x71, 0xdf, 0x74, 0xd9, 0xeb, 0x3c, + 0x72, 0xec, 0x07, 0xba, 0xb9, 0x61, 0x1f, 0x5b, + 0x15, 0x50, 0x5d, 0x64, 0xc4, 0x19, 0xa5, 0xca, + 0xb7, 0xff, 0x99, 0xd7, 0xd5, 0xdb, 0xea, 0x29, + 0xfd, 0x43, 0x5e, 0x0c, 0x9e, 0x84, 0x11, 0x73, + 0x83, 0x2d, 0x18, 0x0b, 0x8a, 0x04, 0x99, 0xe8, + 0xb8, 0xbc, 0x4d, 0x79, 0x28, 0x47, 0x85, 0xf9, + 0xd1, 0x52, 0x6f, 0xd5, 0xba, 0xbf, 0x47, 0xe0, + 0x3d, 0x12, 0x9f, 0x8e, 0x93, 0xa3, 0x2c, 0x75, + 0x3f, 0x4f, 0x0b, 0x2b, 0x9e, 0x4b, 0x11, 0x77, + 0xa8, 0xeb, 0x3a, 0x8b, 0x73, 0x5f, 0x71, 0x3a, + 0x57, 0x7d, 0x5c, 0xbc, 0xb4, 0x87, 0x72, 0x22, + 0x36, 0xfc, 0x09, 0xa6, 0x1e, 0xcc, 0xfe, 0x66, + 0xa4, 0x11, 0x6d, 0x44, 0x2d, 0xd5, 0xd4, 0xf6, + 0x50, 0xa9, 0xc6, 0xab, 0x3f, 0x2b, 0x13, 0x8d, + 0x31, 0x25, 0xfd, 0x4b, 0xb2, 0x95, 0xb6, 0xcf, + 0x1d, 0x2c, 0x5b, 0x4b, 0x07, 0xac, 0x15, 0xda, + 0x83, 0x19, 0x2a, 0x43, 0x6c, 0xac, 0xd4, 0x6c, + 0x81, 0xa1, 0xf7, 0x4d, 0x5a, 0x8d, 0x94, 0xd2, + 0xc8, 0x1d, 0xb0, 0x30, 0xba, 0xf5, 0xd4, 0x0c, + 0x74, 0x61, 0xef, 0xb9, 0x3a, 0x72, 0x1c, 0xca, + 0x21, 0x7b, 0x2d, 0xdd, 0x86, 0x15, 0x47, 0xf4, + 0xb5, 0x4a, 0x64, 0x3d, 0x52, 0x7e, 0x81, 0xb3, + 0x83, 0x45, 0x37, 0x53, 0x9b, 0x15, 0xcc, 0x16, + 0x70, 0x65, 0xa2, 0x52, 0x10, 0xf1, 0xf8, 0xcc, + 0x1d, 0xf2, 0xfb, 0x8e, 0xe4, 0x46, 0x85, 0x71, + 0xde, 0x2f, 0xf5, 0xba, 0xa5, 0x91, 0x5e, 0x6f, + 0xd9, 0x76, 0xba, 0x19, 0xe8, 0xd3, 0x0b, 0x92, + 0xbd, 0x7c, 0x5d, 0x26, 0xfd, 0x15, 0x64, 0xe2, + 0x45, 0xaa, 0x11, 0x8a, 0x37, 0x57, 0xf2, 0xfd, + 0x6c, 0xbb, 0x01, 0x1a, 0xbb, 0x54, 0x09, 0xf5, + 0x7d, 0xa5, 0xfb, 0x5c, 0x14, 0x39, 0x03, 0x85, + 0x1f, 0x82, 0xe7, 0x9b, 0x56, 0x85, 0x75, 0x8f, + 0x99, 0xeb, 0xd2, 0xf3, 0xdc, 0x86, 0xb0, 0xee, + 0xac, 0x4b, 0xf0, 0x9b, 0x14, 0xf0, 0x1e, 0xf5, + 0xb3, 0x1e, 0x9e, 0xf3, 0x74, 0xbd, 0xb0, 0x68, + 0xd4, 0x55, 0xb0, 0xda, 0x87, 0x75, 0xbe, 0x73, + 0xd2, 0x24, 0x9b, 0x28, 0xc1, 0x2c, 0x6a, 0x30, + 0x88, 0x4f, 0x46, 0xc8, 0xbf, 0x1b, 0xf1, 0xc0, + 0x94, 0x93, 0x29, 0x49, 0xc7, 0xf3, 0xa7, 0x73, + 0x3c, 0xdd, 0xcd, 0x57, 0x1c, 0x63, 0x03, 0xeb, + 0x14, 0xf2, 0xf8, 0x9c, 0x09, 0x78, 0x54, 0xc3, + 0x47, 0x95, 0x61, 0x97, 0x6b, 0x86, 0xd0, 0x2e, + 0x01, 0xe7, 0x23, 0xa6, 0x24, 0x9c, 0x6b, 0xca, + 0x65, 0xe7, 0xb2, 0x72, 0xcf, 0x35, 0x84, 0xa8, + 0x1d, 0xdd, 0x8c, 0x6f, 0x52, 0x9d, 0x01, 0xa2, + 0x4d, 0xdd, 0xa4, 0xfe, 0x42, 0x4e, 0x3c, 0xd1, + 0xa9, 0x91, 0xf5, 0x30, 0xe4, 0x92, 0x37, 0x8d, + 0xe9, 0xf2, 0x0c, 0xcc, 0x1e, 0xee, 0xc5, 0x47, + 0x3a, 0x71, 0xa4, 0x7f, 0x45, 0xf1, 0x73, 0x75, + 0x0d, 0xa2, 0xe7, 0x65, 0x57, 0x40, 0xf5, 0xb9, + 0xcd, 0xf8, 0x6f, 0x5a, 0x07, 0x1d, 0x9d, 0x21, + 0x35, 0x83, 0xcf, 0x5b, 0x19, 0x96, 0xa9, 0x0e, + 0xb2, 0xd1, 0xd6, 0xa8, 0x83, 0xb5, 0xb3, 0x0c, + 0x5b, 0xab, 0xae, 0x75, 0x5c, 0xf3, 0x86, 0xf4, + 0xa5, 0xc3, 0x45, 0x07, 0x59, 0x87, 0x10, 0x23, + 0x34, 0xe2, 0x8d, 0x98, 0xe7, 0x17, 0x43, 0x2b, + 0x05, 0x65, 0x32, 0xcb, 0x6d, 0x56, 0x1f, 0xc1, + 0x4c, 0xa6, 0x87, 0xaf, 0xc1, 0xb5, 0x77, 0x54, + 0x73, 0x36, 0x57, 0x10, 0x66, 0x3b, 0xcc, 0xee, + 0xce, 0xa3, 0x1e, 0x36, 0x5e, 0x13, 0x96, 0x1d, + 0xc4, 0x51, 0x65, 0xab, 0x1b, 0xe4, 0x4e, 0xb2, + 0xec, 0xf1, 0xac, 0x21, 0x77, 0x4c, 0xfe, 0x59, + 0x15, 0x9a, 0x83, 0xc8, 0x36, 0x91, 0x47, 0x3a, + 0x07, 0x5f, 0x73, 0x76, 0x4b, 0x91, 0x52, 0x84, + 0xc9, 0x46, 0x04, 0x1d, 0x2e, 0x9c, 0x6f, 0x24, + 0xef, 0xf5, 0x39, 0x93, 0x0b, 0xae, 0x8f, 0xdc, + 0x88, 0xc0, 0x1e, 0x58, 0x74, 0x66, 0x95, 0x6f, + 0x10, 0x5f, 0xe5, 0xaa, 0x42, 0xc1, 0x0e, 0x6e, + 0x8a, 0xd4, 0x11, 0x43, 0xd7, 0xa9, 0x1a, 0xa9, + 0xca, 0xc6, 0x9c, 0xa4, 0xaf, 0xb5, 0xed, 0xe9, + 0x23, 0x21, 0x3a, 0x78, 0xa5, 0x1e, 0x82, 0xdc, + 0x75, 0x57, 0x91, 0x0e, 0x52, 0xf6, 0x84, 0xbd, + 0xa8, 0xae, 0xab, 0xe4, 0x5b, 0x5a, 0xe6, 0xfb, + 0x20, 0x77, 0x9e, 0xea, 0xcf, 0x80, 0xfb, 0xb1, + 0x79, 0xe8, 0x8b, 0x17, 0x38, 0x4a, 0x0b, 0xfd, + 0xb5, 0x7a, 0x49, 0xd9, 0x50, 0x16, 0xdd, 0xf3, + 0xa8, 0xb4, 0x0c, 0x79, 0xf1, 0x39, 0x67, 0x52, + 0x59, 0x54, 0xd6, 0x95, 0x21, 0xb8, 0xfe, 0x61, + 0xc1, 0xaf, 0xc6, 0x3f, 0x63, 0x71, 0xf4, 0x4e, + 0x3f, 0x40, 0x25, 0xfe, 0xf3, 0xd2, 0x22, 0xdc, + 0xd6, 0xbd, 0x5e, 0xcc, 0x34, 0xce, 0x1a, 0x39, + 0x70, 0xa2, 0x8e, 0xc4, 0xbb, 0x96, 0x27, 0x9d, + 0x67, 0xfb, 0xc7, 0xbb, 0x37, 0x33, 0xf2, 0x23, + 0x2d, 0x58, 0xb3, 0x72, 0x9a, 0x3c, 0xdc, 0x5d, + 0xb1, 0x3a, 0xcf, 0x3d, 0x99, 0x8d, 0xfa, 0xea, + 0x94, 0x72, 0x73, 0x2c, 0x3f, 0x2d, 0x7c, 0xde, + 0x0c, 0xe5, 0xc7, 0x5a, 0x5d, 0x46, 0x1d, 0x1c, + 0xe6, 0x54, 0xf2, 0xc4, 0xfc, 0xe5, 0x95, 0x00, + 0x8b, 0xeb, 0x22, 0x92, 0xea, 0x69, 0x39, 0xaf, + 0x08, 0x0d, 0x74, 0x8c, 0x5f, 0x65, 0x01, 0x56, + 0x28, 0xc1, 0xce, 0x57, 0xc6, 0xfd, 0x08, 0xab, + 0x37, 0x1c, 0xc5, 0x8a, 0xdc, 0x36, 0xa1, 0x91, + 0x6f, 0x08, 0xaf, 0xe1, 0x68, 0xa0, 0xc2, 0x95, + 0xda, 0xf0, 0xb4, 0x76, 0xb1, 0x1b, 0x0e, 0xf1, + 0x95, 0x00, 0x3b, 0x6c, 0x00, 0x46, 0x4f, 0xbf, + 0x8f, 0x49, 0x00, 0x7b, 0x72, 0x8d, 0x9e, 0x8e, + 0x36, 0xee, 0x78, 0x1d, 0x4c, 0x3e, 0xf7, 0x11, + 0xab, 0x51, 0x2e, 0x17, 0x4b, 0x9e, 0xb1, 0x9e, + 0x35, 0xce, 0x34, 0x2f, 0x36, 0xc2, 0xaf, 0x72, + 0x7b, 0x03, 0x7d, 0x7b, 0xca, 0xef, 0xb1, 0xfc, + 0xa4, 0xfc, 0xe7, 0xad, 0x05, 0x83, 0xf6, 0x93, + 0x03, 0x9e, 0xd7, 0x43, 0x56, 0xdf, 0xf6, 0x73, + 0x7a, 0x44, 0x95, 0xa0, 0x96, 0x45, 0xa6, 0xf1, + 0xa8, 0x21, 0xbd, 0x26, 0xa6, 0x5e, 0x23, 0x05, + 0x19, 0x18, 0x77, 0x60, 0x47, 0xa5, 0x47, 0xd4, + 0xc3, 0xca, 0x38, 0x8f, 0x6c, 0xc9, 0x81, 0x35, + 0xc0, 0xc9, 0x2a, 0x29, 0x27, 0xa9, 0x78, 0x8f, + 0xfa, 0xda, 0xe0, 0x3d, 0x8f, 0x9e, 0xeb, 0x3c, + 0x2a, 0xe0, 0xee, 0x68, 0x2d, 0xba, 0x9a, 0xd0, + 0xd5, 0x3f, 0x5b, 0x21, 0x1d, 0x51, 0x5c, 0xcd, + 0xe2, 0x4a, 0x42, 0xad, 0xed, 0xc7, 0xed, 0x94, + 0x22, 0x39, 0x9d, 0x1a, 0x45, 0x67, 0x55, 0x09, + 0x76, 0x6e, 0x03, 0xed, 0x60, 0xcf, 0x5f, 0x35, + 0x57, 0x38, 0x81, 0x48, 0x41, 0x37, 0x2b, 0xe4, + 0x15, 0x77, 0x99, 0xc5, 0xde, 0xda, 0x6e, 0xae, + 0xb2, 0x53, 0x06, 0x55, 0x6b, 0xe4, 0x69, 0x09, + 0xa3, 0x5f, 0x6f, 0x9d, 0x24, 0x8f, 0x2a, 0xce, + 0x4b, 0xc3, 0x5d, 0xe9, 0x24, 0x0a, 0x9d, 0xb3, + 0xf3, 0x07, 0xeb, 0x62, 0xbd, 0xa3, 0x38, 0x50, + 0x97, 0x4d, 0xc5, 0xd4, 0x31, 0xd3, 0x94, 0xa6, + 0xd0, 0xc3, 0xc8, 0x4e, 0x68, 0x35, 0x52, 0xa2, + 0x29, 0xda, 0x67, 0xe1, 0xbe, 0x83, 0x74, 0x32, + 0x64, 0x26, 0x33, 0x74, 0x78, 0x8c, 0xb2, 0x18, + 0x44, 0x48, 0xa3, 0x07, 0x13, 0xd6, 0x13, 0xeb, + 0xf4, 0x3f, 0x42, 0xbf, 0x72, 0x84, 0xb3, 0xbf, + 0x3b, 0x93, 0xe3, 0x8b, 0x9b, 0x10, 0x26, 0x9d, + 0x27, 0x76, 0x40, 0x0b, 0x32, 0xe1, 0xc0, 0x67, + 0xea, 0x21, 0x3e, 0x4e, 0x46, 0x4e, 0x07, 0xc4, + 0xff, 0xc9, 0xd6, 0x9f, 0x73, 0x67, 0x3c, 0x4f, + 0x3d, 0xe4, 0x7e, 0x47, 0xb0, 0x57, 0x82, 0x31, + 0x10, 0x64, 0xc0, 0x3f, 0xba, 0xac, 0x35, 0x72, + 0x10, 0xb7, 0x14, 0x8a, 0xea, 0x4f, 0x8e, 0x58, + 0x1f, 0x4d, 0x15, 0x29, 0xf3, 0xf9, 0x8b, 0xd5, + 0x92, 0xf1, 0x36, 0x61, 0x02, 0x85, 0x7b, 0x6d, + 0xee, 0x68, 0x4f, 0x47, 0xce, 0x67, 0x52, 0x93, + 0xcf, 0x66, 0x7b, 0xcc, 0x9d, 0xfa, 0xed, 0x99, + 0x13, 0x7f, 0x1f, 0xb1, 0x46, 0xcb, 0x72, 0xfb, + 0x6a, 0xd8, 0xf3, 0x94, 0x3f, 0xe2, 0xfe, 0x36, + 0x58, 0xc5, 0x81, 0x5d, 0xa9, 0x17, 0xdf, 0xde, + 0x71, 0xe2, 0x3c, 0xa7, 0x4c, 0xc2, 0x2e, 0xac, + 0x35, 0xb4, 0x32, 0x2b, 0x77, 0x38, 0xda, 0xe4, + 0x46, 0xb1, 0xa6, 0xa8, 0x90, 0x55, 0x09, 0x6c, + 0x04, 0x76, 0xbb, 0x98, 0xa3, 0xe8, 0x7e, 0xe6, + 0x85, 0xd5, 0x4b, 0x89, 0x31, 0x86, 0xca, 0x2a, + 0x24, 0x7f, 0x00, 0xcf, 0x5e, 0x47, 0x17, 0x31, + 0x49, 0x12, 0xfb, 0x75, 0x89, 0xb1, 0xf6, 0xc5, + 0x54, 0x9f, 0x63, 0xc6, 0x73, 0xf6, 0x49, 0xf7, + 0x29, 0x9c, 0xab, 0x31, 0x17, 0xf9, 0x2f, 0xc9, + 0xc6, 0x55, 0xf7, 0xd2, 0xf1, 0x97, 0x96, 0x7c, + 0x20, 0xb7, 0x62, 0x62, 0x27, 0x6e, 0x3f, 0x12, + 0xd8, 0xaa, 0x79, 0xca, 0x40, 0x77, 0x8b, 0x91, + 0x9e, 0xce, 0x14, 0xce, 0xaa, 0x80, 0xbc, 0x6b, + 0x43, 0xcc, 0xde, 0x08, 0x38, 0xf9, 0x06, 0xfc, + 0x3c, 0x9e, 0xb7, 0xd4, 0x83, 0x7c, 0x6b, 0x50, + 0xf4, 0x72, 0x2b, 0xf3, 0xcc, 0x66, 0xd1, 0xbd, + 0x60, 0x5c, 0x70, 0xae, 0x18, 0x57, 0xdd, 0xcc, + 0x76, 0xf1, 0x30, 0x63, 0x14, 0xb6, 0x07, 0xf6, + 0x7a, 0x9c, 0x1c, 0x85, 0x3f, 0x21, 0x36, 0x0c, + 0x66, 0x0b, 0xce, 0x94, 0xf1, 0xf2, 0x88, 0xf2, + 0x8c, 0xb0, 0x2e, 0x83, 0xce, 0x77, 0xd2, 0x97, + 0xce, 0x66, 0xf9, 0xcb, 0xf6, 0x43, 0xe3, 0x61, + 0x7b, 0x53, 0xff, 0xde, 0x19, 0xb2, 0x87, 0xdf, + 0x46, 0x09, 0x1d, 0x2d, 0x28, 0x32, 0x32, 0x91, + 0x94, 0x5d, 0xae, 0xe7, 0x64, 0xc2, 0x7e, 0x64, + 0x7e, 0xed, 0xf8, 0x4e, 0xbb, 0x9e, 0x9e, 0xb9, + 0xbb, 0x00, 0x6b, 0x07, 0xa2, 0xbb, 0x08, 0x37, + 0x62, 0xcf, 0xbd, 0xbe, 0xae, 0x94, 0x15, 0xaa, + 0x7e, 0x68, 0xb2, 0x0a, 0x23, 0x03, 0x5e, 0x63, + 0x0c, 0xb2, 0x9f, 0x71, 0xe5, 0xa9, 0x0c, 0x91, + 0xfb, 0xcb, 0xa9, 0x70, 0xae, 0x83, 0x51, 0xdf, + 0x55, 0x42, 0x90, 0xab, 0x9e, 0xab, 0x4e, 0xb2, + 0x45, 0xc8, 0x57, 0xd7, 0xab, 0x21, 0xc1, 0xd3, + 0x63, 0x84, 0x57, 0x8c, 0xc0, 0x33, 0xcf, 0xa1, + 0xa7, 0x65, 0xf5, 0x21, 0x1b, 0xaf, 0x86, 0x18, + 0x44, 0x1c, 0xc2, 0xe3, 0x1e, 0x17, 0x75, 0x38, + 0x93, 0xce, 0x65, 0xe1, 0x1a, 0x64, 0xd5, 0x63, + 0xc7, 0x13, 0xf6, 0xd8, 0xb1, 0x6a, 0x2b, 0x0e, + 0xea, 0x99, 0x43, 0xae, 0x95, 0x1b, 0x3b, 0xfe, + 0x8b, 0x9d, 0x45, 0x77, 0x69, 0x05, 0x63, 0xfe, + 0x1b, 0xd6, 0x15, 0xeb, 0xea, 0x3f, 0xee, 0xdf, + 0x45, 0xcc, 0x49, 0x40, 0x79, 0x91, 0x5b, 0x3e, + 0xce, 0xda, 0xd7, 0x1b, 0x70, 0x0d, 0x95, 0x1b, + 0x76, 0xd6, 0x5e, 0x3e, 0xb8, 0x6e, 0xfd, 0xcf, + 0x7f, 0x0c, 0xdd, 0x95, 0xf6, 0xc8, 0x4f, 0xe4, + 0x08, 0xe2, 0x96, 0x7a, 0xad, 0xdd, 0xf5, 0x92, + 0x87, 0x9b, 0x28, 0x8b, 0x23, 0xa4, 0x15, 0x36, + 0xa5, 0xa8, 0x0a, 0x73, 0xa8, 0x3f, 0x8f, 0x6a, + 0x5e, 0xa8, 0x98, 0x90, 0xcb, 0x68, 0x99, 0xfc, + 0xa7, 0x6f, 0x7a, 0xfd, 0x16, 0x3b, 0xf8, 0x9c, + 0x36, 0xba, 0x78, 0x9d, 0x2d, 0x57, 0x48, 0xc3, + 0x0a, 0xb9, 0xe8, 0x59, 0x87, 0x71, 0x7c, 0x8d, + 0x83, 0x58, 0x05, 0x35, 0x37, 0xa7, 0x5d, 0xcf, + 0x3f, 0x7e, 0xe3, 0x29, 0x7a, 0xa1, 0x17, 0x26, + 0x79, 0x45, 0xce, 0x1c, 0x3c, 0x5a, 0xc2, 0x6b, + 0x2a, 0x2a, 0x41, 0xee, 0x5d, 0xd8, 0x51, 0xef, + 0x47, 0x74, 0x57, 0x9a, 0x94, 0x32, 0x60, 0x6d, + 0x53, 0x55, 0xee, 0xec, 0x40, 0x28, 0x1a, 0xcc, + 0xc4, 0x3f, 0x76, 0x3c, 0x2e, 0x5c, 0xaf, 0xc6, + 0x20, 0x6a, 0x99, 0x90, 0x56, 0x03, 0x7a, 0x43, + 0x23, 0xa6, 0x32, 0xe6, 0x70, 0x07, 0x76, 0x0f, + 0x5d, 0x09, 0xfb, 0x78, 0x0c, 0xd6, 0xd4, 0x8f, + 0x29, 0xc7, 0x49, 0x8a, 0x93, 0xef, 0x31, 0x07, + 0x8b, 0xf9, 0xce, 0x95, 0x8e, 0xff, 0xa9, 0xe2, + 0xd6, 0x7c, 0x79, 0x2b, 0xd5, 0xcb, 0xe3, 0xeb, + 0x32, 0x23, 0x66, 0x85, 0x59, 0x77, 0x76, 0xfb, + 0xf9, 0xf6, 0x1f, 0x2a, 0x43, 0x46, 0xd4, 0x50, + 0xb7, 0x6f, 0xee, 0xf9, 0x6a, 0xd8, 0xeb, 0xef, + 0x25, 0xc8, 0x26, 0x34, 0x79, 0xd1, 0x1d, 0x12, + 0xd3, 0x0e, 0xec, 0x74, 0x65, 0xa9, 0x3d, 0x1c, + 0xf6, 0x1e, 0x7d, 0xf2, 0xd5, 0xfe, 0xa9, 0x0e, + 0xf7, 0xa8, 0x3b, 0x6f, 0xf0, 0x51, 0x88, 0x47, + 0x50, 0x5f, 0x1d, 0xe6, 0x71, 0x54, 0x86, 0x4f, + 0x2b, 0x66, 0xc4, 0x35, 0x21, 0x28, 0x07, 0xe5, + 0x40, 0xdb, 0x8f, 0x45, 0xc7, 0xdb, 0xa8, 0x46, + 0xf1, 0x91, 0x7c, 0xcf, 0x5b, 0x03, 0xb0, 0x87, + 0x3f, 0x2a, 0x79, 0xaa, 0xd4, 0xc2, 0x2e, 0xaa, + 0x85, 0xc0, 0x6f, 0x53, 0xad, 0x67, 0xad, 0xe8, + 0x41, 0xbc, 0x11, 0xb7, 0x92, 0x2d, 0x74, 0xcc, + 0xe4, 0x28, 0xd6, 0x4c, 0x3d, 0x5a, 0x8f, 0xbb, + 0xe8, 0xba, 0xb8, 0x6b, 0xa5, 0x2c, 0x54, 0xb0, + 0xdc, 0x20, 0x14, 0x2b, 0xcf, 0xbb, 0xe3, 0x8c, + 0xbb, 0xab, 0x9c, 0x54, 0xa5, 0xe6, 0x59, 0x0c, + 0xae, 0x28, 0x1f, 0x25, 0x79, 0x4d, 0x3d, 0x59, + 0x4e, 0x75, 0x34, 0x9c, 0x3b, 0x11, 0x32, 0xac, + 0x81, 0xd7, 0xe4, 0x2b, 0xc7, 0x97, 0x4a, 0x0f, + 0x1c, 0xe3, 0x28, 0xe2, 0xf5, 0xf7, 0x65, 0x3a, + 0xcf, 0xb7, 0xda, 0x8a, 0x3c, 0x43, 0xbe, 0xa7, + 0x78, 0x9e, 0xa7, 0x21, 0x03, 0xbc, 0x79, 0xf4, + 0x59, 0xca, 0x53, 0x4e, 0xdb, 0x2f, 0x35, 0x94, + 0xfd, 0xe9, 0x54, 0x90, 0x57, 0x87, 0x8f, 0xa6, + 0x8d, 0x0c, 0x2b, 0x95, 0x74, 0x5d, 0xe8, 0xf1, + 0x2a, 0xf8, 0x50, 0x65, 0xa1, 0x13, 0xb9, 0xd5, + 0x17, 0xf4, 0x6c, 0x2e, 0x7c, 0x77, 0xbc, 0xae, + 0x29, 0xac, 0x15, 0x93, 0x65, 0x78, 0xed, 0x4f, + 0x7b, 0xd0, 0x59, 0xbd, 0xbb, 0x2b, 0xd7, 0x7c, + 0x2c, 0x4b, 0x1d, 0xf7, 0x3a, 0x87, 0x73, 0xd0, + 0x26, 0xd8, 0x15, 0xf6, 0xa5, 0xd3, 0x1d, 0x39, + 0xfd, 0xd5, 0xba, 0x11, 0x38, 0xbf, 0xff, 0xf5, + 0x2f, 0xfe, 0xed, 0xfd, 0xf8, 0x2a, 0xae, 0xff, + 0x15, 0x9e, 0x35, 0xc1, 0xe6, 0x89, 0x7f, 0x3a, + 0xe9, 0x5c, 0x22, 0x95, 0x4b, 0xcf, 0x75, 0xcb, + 0x9d, 0x16, 0xa6, 0x3b, 0x9a, 0x32, 0xc5, 0x36, + 0xfe, 0x35, 0xed, 0xa9, 0xd9, 0x77, 0x33, 0x5b, + 0x7c, 0x17, 0xd1, 0x82, 0x33, 0x5e, 0x52, 0xc5, + 0x92, 0x22, 0x2a, 0x03, 0x9d, 0x0a, 0x86, 0x14, + 0x2e, 0x56, 0xa8, 0x7f, 0xb8, 0x43, 0x5c, 0x2f, + 0x96, 0x35, 0x37, 0xcc, 0x90, 0xe4, 0xf7, 0x08, + 0x32, 0x66, 0x9c, 0x3a, 0x05, 0x35, 0xf4, 0x96, + 0x2e, 0x67, 0xcb, 0x6c, 0x3f, 0xa4, 0x0e, 0xa5, + 0x3c, 0x7c, 0x5d, 0x79, 0xb7, 0x01, 0x71, 0x8e, + 0x16, 0x2c, 0xad, 0x5a, 0x82, 0x92, 0x2f, 0xcd, + 0x9a, 0xaa, 0x9c, 0x2f, 0x0f, 0xd4, 0xfb, 0x3a, + 0x26, 0x90, 0x3f, 0x49, 0x90, 0x3f, 0x55, 0xcb, + 0x81, 0xc6, 0x69, 0x65, 0x85, 0x66, 0x59, 0x27, + 0x4b, 0xfd, 0x80, 0xd5, 0x46, 0x6c, 0x0e, 0x79, + 0x5a, 0x46, 0x56, 0x1e, 0x2a, 0xcc, 0x7c, 0xeb, + 0xb1, 0xf4, 0x50, 0x35, 0xa1, 0xdb, 0x85, 0xa7, + 0x68, 0x44, 0xa1, 0x35, 0x16, 0x9d, 0x1d, 0x94, + 0x94, 0x92, 0x54, 0xce, 0x2a, 0xe4, 0x19, 0x71, + 0x02, 0x9f, 0xc3, 0x71, 0xb4, 0x7c, 0x46, 0xf5, + 0xd7, 0xf9, 0x07, 0x7a, 0x74, 0x1e, 0x3d, 0xe5, + 0x52, 0x8a, 0x46, 0xb9, 0x01, 0xaa, 0x21, 0xf8, + 0xb6, 0x39, 0x63, 0x2e, 0x37, 0xcf, 0xf1, 0xab, + 0x01, 0x78, 0x9b, 0x92, 0x06, 0x25, 0xd1, 0xc4, + 0x5e, 0x3a, 0x55, 0x11, 0x2b, 0xfd, 0x3a, 0xcc, + 0x63, 0xbf, 0xc6, 0x2b, 0xf3, 0xa5, 0xad, 0x5f, + 0x60, 0xee, 0xd6, 0xbd, 0xb8, 0x2e, 0x37, 0xd0, + 0x5c, 0xfd, 0x9d, 0xfe, 0x42, 0xb1, 0x93, 0x79, + 0xa1, 0xa7, 0x29, 0x1e, 0xa8, 0x86, 0x7b, 0xd6, + 0xc9, 0xd1, 0x75, 0x09, 0x52, 0x67, 0x99, 0xab, + 0xd8, 0x74, 0x5d, 0x5c, 0xa3, 0xf5, 0xa8, 0x19, + 0xaf, 0x26, 0xe9, 0x9b, 0x75, 0xb1, 0x01, 0x88, + 0x0c, 0x40, 0x1c, 0xea, 0x4c, 0x4e, 0xff, 0x09, + 0xfe, 0x9f, 0x00, 0xcf, 0xf4, 0xce, 0x86, 0x86, + 0x0a, 0x61, 0xe5, 0x82, 0xb5, 0x10, 0x2e, 0x9e, + 0x70, 0x84, 0x41, 0xcd, 0x3d, 0xcc, 0x19, 0xd0, + 0xff, 0x41, 0x38, 0xc8, 0x1f, 0x06, 0xe0, 0xa7, + 0xfa, 0x72, 0x36, 0xbc, 0x1a, 0xce, 0xd0, 0x0e, + 0x3b, 0x4f, 0xab, 0x1f, 0x6a, 0x9c, 0x8c, 0xa0, + 0xba, 0xb3, 0x1c, 0x89, 0x47, 0xc2, 0xe3, 0x1e, + 0x0b, 0x9b, 0xeb, 0x60, 0x60, 0xb7, 0xf8, 0x22, + 0x43, 0xb5, 0xc6, 0x79, 0x42, 0x8e, 0xad, 0x78, + 0x9d, 0x8b, 0xb8, 0x90, 0x70, 0x10, 0x31, 0x92, + 0x62, 0x52, 0xab, 0xb0, 0x9d, 0xdd, 0x22, 0x95, + 0x8e, 0x4e, 0x9d, 0x90, 0x23, 0xb3, 0x10, 0x97, + 0x45, 0xb8, 0xef, 0x63, 0x8e, 0xfa, 0xc6, 0x83, + 0x78, 0x4f, 0xe8, 0x67, 0xe6, 0xfc, 0x60, 0x0f, + 0xd8, 0xd7, 0xed, 0xa0, 0x7d, 0xe3, 0x55, 0xd0, + 0xba, 0x7e, 0xb8, 0x78, 0x70, 0xc1, 0x5e, 0x69, + 0x29, 0x7b, 0x3c, 0x1a, 0x51, 0x74, 0x56, 0x47, + 0x2c, 0xe9, 0xac, 0x73, 0x5b, 0x42, 0xe7, 0xae, + 0x88, 0xa3, 0x58, 0xb7, 0x3c, 0x1f, 0x22, 0x42, + 0x2c, 0xec, 0x14, 0x1b, 0xe7, 0x1b, 0xe7, 0xf3, + 0x97, 0x95, 0xab, 0xca, 0x74, 0xbe, 0xa8, 0x4c, + 0x2b, 0x45, 0x5f, 0x29, 0x1d, 0x22, 0xb7, 0xfb, + 0xda, 0xba, 0x76, 0x9b, 0x3d, 0x62, 0xb7, 0x4c, + 0xbd, 0x75, 0x53, 0xfb, 0x44, 0xda, 0xea, 0xe0, + 0xc1, 0x61, 0x5f, 0x90, 0xd2, 0x2d, 0x59, 0x1a, + 0x33, 0xe3, 0x6e, 0xbc, 0x85, 0x58, 0x63, 0x44, + 0x21, 0xcf, 0x98, 0x77, 0xb9, 0x27, 0x35, 0xa2, + 0x36, 0x68, 0x04, 0xc0, 0x98, 0xc4, 0x1d, 0x4b, + 0x81, 0x08, 0x4c, 0xe8, 0xba, 0x60, 0x3c, 0x17, + 0xd6, 0x91, 0x17, 0xc5, 0x36, 0x8c, 0xbb, 0xa8, + 0x21, 0xd8, 0x60, 0x8d, 0x9b, 0x1e, 0x47, 0x8c, + 0x77, 0x5b, 0x30, 0x9e, 0xf4, 0x39, 0x42, 0x7c, + 0xb4, 0x17, 0x3b, 0x48, 0xf2, 0xbc, 0x82, 0x9e, + 0x3e, 0xab, 0xea, 0x34, 0xdc, 0x56, 0xd5, 0x59, + 0x75, 0x76, 0x25, 0x8f, 0x88, 0xed, 0x4e, 0x76, + 0xfc, 0x02, 0xb3, 0x63, 0x52, 0x9e, 0x85, 0x9d, + 0xdd, 0xa1, 0x1a, 0xa7, 0xfb, 0x91, 0x1f, 0xe5, + 0x4a, 0x01, 0xb3, 0x66, 0x9d, 0x2a, 0x9f, 0xd2, + 0xfd, 0x48, 0xd6, 0xaf, 0x51, 0xf0, 0x7e, 0xd2, + 0x90, 0x9e, 0x75, 0x97, 0xec, 0x85, 0xdc, 0x06, + 0xbc, 0x4f, 0xb8, 0x1c, 0x35, 0xa2, 0x9e, 0xeb, + 0xa5, 0x90, 0xfc, 0xf1, 0x88, 0xe9, 0x77, 0x9c, + 0xe7, 0x06, 0xb9, 0xdc, 0xc0, 0xfd, 0x1d, 0x07, + 0x79, 0x5c, 0x83, 0x5e, 0xbc, 0xb1, 0xa1, 0x2f, + 0xb6, 0x97, 0x0c, 0x69, 0x73, 0xf7, 0x65, 0x68, + 0x09, 0xfd, 0x62, 0x16, 0xdd, 0x1e, 0x57, 0x44, + 0x01, 0xf5, 0xf3, 0xcf, 0xae, 0x5c, 0x6c, 0x0d, + 0x26, 0xf1, 0x7b, 0x88, 0xca, 0xb0, 0x11, 0x31, + 0xbb, 0x7a, 0xaa, 0xfe, 0x9a, 0xce, 0xab, 0xa5, + 0x03, 0xf2, 0x19, 0xf9, 0xbb, 0x86, 0xe8, 0xe9, + 0xc6, 0x07, 0xe5, 0x69, 0x54, 0xf1, 0xaa, 0x07, + 0xcc, 0xb3, 0xad, 0xa7, 0x95, 0x51, 0x5c, 0xb7, + 0x99, 0x5c, 0x1a, 0xaf, 0xfb, 0xe3, 0xaa, 0xa6, + 0x87, 0xdb, 0x61, 0x83, 0x78, 0x13, 0x2f, 0x2f, + 0x2f, 0xc1, 0x15, 0x74, 0xbb, 0x57, 0x10, 0x19, + 0x26, 0x71, 0x2b, 0xea, 0xce, 0x58, 0xff, 0x61, + 0xa1, 0xbf, 0xb6, 0x64, 0x65, 0x9d, 0x94, 0x95, + 0xb4, 0xce, 0xba, 0x15, 0xd2, 0x9c, 0x0f, 0x1d, + 0xc5, 0x61, 0xa5, 0x40, 0xff, 0x05, 0x88, 0x77, + 0x6c, 0xc9, 0x5e, 0x74, 0x71, 0x65, 0xf0, 0x72, + 0x0d, 0x88, 0x02, 0x66, 0xdd, 0x05, 0x3d, 0x57, + 0xd5, 0x5a, 0xf3, 0x14, 0xeb, 0xcc, 0xb2, 0x6b, + 0x6c, 0x7a, 0x2b, 0x53, 0x57, 0x49, 0x7d, 0x34, + 0xc8, 0x88, 0x3b, 0x28, 0xa0, 0xf6, 0x3b, 0xc6, + 0x3c, 0xa3, 0x90, 0x03, 0xfb, 0x0c, 0x14, 0xfe, + 0xdc, 0xf3, 0xca, 0x52, 0x75, 0x97, 0xdd, 0x72, + 0x5e, 0xc0, 0x73, 0x57, 0xd9, 0x2c, 0x5b, 0xdd, + 0x9a, 0xab, 0x2f, 0xed, 0x08, 0x82, 0xdf, 0xfd, + 0xf1, 0x3b, 0xf1, 0x70, 0x1e, 0xfa, 0xd8, 0xa3, + 0xfe, 0xa3, 0x7c, 0xee, 0xf5, 0xab, 0x82, 0xac, + 0xeb, 0xb0, 0x9b, 0xc0, 0xca, 0x9b, 0x32, 0x27, + 0xcc, 0x45, 0xc6, 0x8c, 0x5a, 0x2e, 0xaa, 0x5c, + 0xcf, 0x89, 0xc6, 0x84, 0xf9, 0x58, 0xec, 0xf8, + 0xd3, 0xa1, 0x46, 0x02, 0x3b, 0x97, 0x9b, 0x94, + 0x51, 0x3b, 0x67, 0xdd, 0xf4, 0x23, 0x37, 0x54, + 0x87, 0x2e, 0xb2, 0xd0, 0x16, 0xaa, 0x6d, 0x87, + 0x0e, 0x34, 0x67, 0x99, 0x2d, 0x6c, 0x5d, 0x83, + 0xf9, 0x3e, 0x4f, 0x5d, 0x00, 0xcc, 0x34, 0x0a, + 0xd6, 0x7d, 0xf7, 0x4b, 0xab, 0x66, 0xdd, 0x77, + 0x96, 0x2c, 0xf8, 0xdd, 0xf9, 0x02, 0x66, 0xfb, + 0x7d, 0x77, 0xa9, 0xee, 0xbb, 0x05, 0xd5, 0x48, + 0xf1, 0x10, 0xf6, 0x6e, 0xfd, 0x99, 0x9e, 0x70, + 0x50, 0xff, 0x8c, 0x57, 0xa8, 0xa8, 0xaa, 0xa7, + 0xd4, 0x74, 0xc9, 0x4c, 0x49, 0x13, 0xf2, 0x84, + 0xa2, 0xbd, 0xd1, 0x44, 0x5a, 0xec, 0xca, 0xa1, + 0xba, 0x5f, 0x45, 0xc4, 0xb8, 0x0d, 0x72, 0x06, + 0xe1, 0xaa, 0x73, 0x51, 0x7a, 0xe0, 0xdc, 0xef, + 0xc4, 0x39, 0x5d, 0x04, 0x4e, 0x47, 0xf7, 0x41, + 0xe8, 0xc6, 0x32, 0xf8, 0x8d, 0x8a, 0x4a, 0x56, + 0x5f, 0xc2, 0x75, 0xc9, 0xc9, 0x98, 0x17, 0x9d, + 0x25, 0x53, 0x75, 0xb2, 0xc6, 0x45, 0x62, 0x54, + 0x05, 0x84, 0x53, 0xe5, 0x71, 0xaa, 0x7e, 0x0c, + 0xe8, 0x23, 0x4e, 0x95, 0x57, 0x56, 0xa8, 0xba, + 0x22, 0xf5, 0x22, 0xc9, 0x95, 0x61, 0xb8, 0xca, + 0xe7, 0x94, 0xcb, 0xca, 0x03, 0xaa, 0x46, 0xc7, + 0xe9, 0x7d, 0x67, 0x60, 0xa6, 0x24, 0x9e, 0xdc, + 0xd2, 0x66, 0xda, 0xaa, 0x34, 0xfc, 0x9e, 0x6a, + 0xc4, 0x30, 0x6e, 0xa6, 0x75, 0x0f, 0xa9, 0x88, + 0x0e, 0x9a, 0xad, 0x5d, 0x3b, 0xf6, 0x3a, 0xde, + 0x8a, 0xbc, 0x4a, 0xd5, 0xbf, 0xed, 0x54, 0x91, + 0x73, 0x9e, 0xf2, 0xbf, 0xa7, 0x83, 0x48, 0xb8, + 0x1e, 0xec, 0x0f, 0xf3, 0xff, 0x13, 0x68, 0xa2, + 0xeb, 0x07, 0xbf, 0xd5, 0x5c, 0xfe, 0x33, 0x76, + 0xc4, 0x77, 0x06, 0x52, 0xea, 0xc4, 0x3a, 0xd2, + 0x4e, 0xda, 0x5a, 0xab, 0x2e, 0xb7, 0xb2, 0xce, + 0x50, 0x6b, 0x04, 0xe6, 0xc5, 0x58, 0x75, 0xee, + 0x20, 0x6b, 0xdf, 0x2f, 0xad, 0xed, 0x75, 0x38, + 0x08, 0x55, 0xc1, 0x2c, 0x98, 0x8b, 0x72, 0x56, + 0x2e, 0xe4, 0xb0, 0xa3, 0x59, 0x30, 0x03, 0x62, + 0x50, 0x3c, 0x59, 0xaf, 0x83, 0xb5, 0x81, 0x98, + 0xd5, 0x09, 0x61, 0x46, 0xd0, 0x5d, 0xee, 0xb1, + 0xae, 0xd7, 0x67, 0xda, 0x8a, 0x05, 0x11, 0xb1, + 0x85, 0xa8, 0x6c, 0xd4, 0x8d, 0xba, 0x75, 0xa4, + 0x1f, 0x8e, 0xc0, 0xe9, 0x88, 0x4b, 0x71, 0x96, + 0x66, 0x2a, 0x2b, 0xf5, 0x30, 0x6b, 0x66, 0xd9, + 0x1c, 0x53, 0x29, 0xd3, 0xf4, 0xb1, 0xa4, 0x89, + 0xc3, 0x45, 0x63, 0xb7, 0x22, 0xbd, 0xac, 0xa1, + 0xef, 0x77, 0x3b, 0x28, 0x87, 0xe5, 0x1c, 0xd5, + 0xea, 0xb9, 0x02, 0xdc, 0x0b, 0x77, 0x4e, 0x99, + 0x83, 0x38, 0xfb, 0xb9, 0xc3, 0x20, 0x66, 0x8e, + 0x2b, 0x7f, 0xf6, 0xbd, 0x57, 0x20, 0xbe, 0x52, + 0xf5, 0xdb, 0xa8, 0x65, 0x55, 0x1d, 0x87, 0x11, + 0xba, 0x4e, 0xaa, 0x56, 0xde, 0x55, 0x40, 0xac, + 0x12, 0xcc, 0x90, 0xeb, 0xe4, 0xd7, 0xf6, 0xe0, + 0x44, 0x9f, 0x9d, 0x77, 0xc3, 0x8b, 0xae, 0x52, + 0x57, 0xd0, 0xb1, 0x98, 0xeb, 0x8b, 0x3e, 0xb9, + 0xfb, 0xf2, 0x66, 0xb8, 0x4e, 0xca, 0x69, 0x35, + 0xe2, 0x73, 0x2c, 0xc8, 0xcb, 0x56, 0xd6, 0xd2, + 0x0c, 0xad, 0xac, 0x29, 0x17, 0xca, 0x2b, 0xd6, + 0x9f, 0x69, 0xf5, 0x46, 0x66, 0x61, 0x61, 0x27, + 0xdb, 0x2a, 0x6a, 0xa9, 0x5c, 0xb6, 0xb5, 0x4e, + 0xca, 0x00, 0xa1, 0xa3, 0xae, 0x8f, 0x7a, 0xb7, + 0x06, 0x44, 0x48, 0x58, 0x67, 0xda, 0xc3, 0x85, + 0xf2, 0xca, 0xd8, 0x00, 0xac, 0x5e, 0xeb, 0x6d, + 0xc2, 0x8a, 0xf7, 0xa8, 0x65, 0x07, 0xe4, 0x40, + 0x8e, 0x67, 0xc7, 0xe8, 0xb4, 0x2b, 0xb3, 0x49, + 0xf7, 0x12, 0xbb, 0x4c, 0xce, 0xc5, 0x86, 0x15, + 0x39, 0x94, 0x2b, 0x31, 0xd3, 0xcb, 0x70, 0x1b, + 0xe8, 0x71, 0x0f, 0xdf, 0xca, 0x26, 0xd7, 0xad, + 0x95, 0x07, 0x49, 0x7f, 0x3c, 0x77, 0x15, 0xe8, + 0x22, 0x02, 0x29, 0x1a, 0xf7, 0xf1, 0x44, 0xe4, + 0x3a, 0x6a, 0x66, 0x7e, 0xda, 0x56, 0xe0, 0xda, + 0x70, 0x0d, 0x4c, 0xee, 0x47, 0xcf, 0x35, 0xbb, + 0x60, 0xb5, 0xc4, 0x9c, 0xb7, 0x51, 0x84, 0xbc, + 0x0d, 0xfd, 0xb6, 0xce, 0x38, 0x55, 0x5a, 0x41, + 0x3d, 0xae, 0x87, 0x8f, 0xe9, 0x75, 0x10, 0x17, + 0x76, 0xf3, 0x04, 0x6f, 0x02, 0xcf, 0x24, 0xea, + 0xc7, 0x4d, 0x59, 0xd1, 0x32, 0x9c, 0xc1, 0xbf, + 0xa7, 0xdf, 0xf7, 0xb2, 0x0b, 0x25, 0xe5, 0x8e, + 0x9b, 0x55, 0x96, 0xb8, 0xb3, 0x03, 0xd5, 0x55, + 0xb3, 0x58, 0x71, 0x75, 0x24, 0x4f, 0x3b, 0xba, + 0x56, 0x47, 0x37, 0xf2, 0x29, 0x16, 0x63, 0xbb, + 0xd5, 0xe0, 0x09, 0x35, 0x30, 0x3f, 0x0a, 0xe1, + 0xfe, 0xbd, 0xdd, 0xdc, 0x8b, 0x2b, 0xc4, 0xc6, + 0x25, 0x1c, 0x55, 0x34, 0xa6, 0x5a, 0xaa, 0x39, + 0xfb, 0x0a, 0xff, 0x6d, 0x57, 0xbd, 0xa1, 0xab, + 0x92, 0xcc, 0x6b, 0x9c, 0xda, 0x2b, 0xad, 0x9a, + 0x93, 0x3a, 0x15, 0x66, 0x25, 0xaf, 0x09, 0x2a, + 0xae, 0x7f, 0xab, 0x5a, 0xe0, 0x78, 0x75, 0x3b, + 0x60, 0xac, 0x1a, 0xb3, 0x9b, 0x73, 0xff, 0x2a, + 0xdc, 0x15, 0x71, 0x2e, 0x24, 0x77, 0x8f, 0xa4, + 0xfa, 0x59, 0xb7, 0x6a, 0x8d, 0xcb, 0x83, 0xcd, + 0x93, 0x78, 0x15, 0x41, 0xa1, 0xca, 0x98, 0x23, + 0x28, 0x18, 0x33, 0x75, 0x1c, 0x07, 0x9c, 0xbc, + 0x89, 0xda, 0x95, 0x41, 0x29, 0x23, 0x47, 0xcb, + 0xe9, 0x66, 0x70, 0x27, 0x68, 0x0c, 0x1c, 0xee, + 0x1a, 0x78, 0x26, 0xc6, 0xe4, 0xa4, 0xec, 0x23, + 0x6f, 0x6b, 0x4e, 0x98, 0x79, 0x1d, 0x4f, 0xe3, + 0xf2, 0xce, 0x55, 0x6b, 0xba, 0x5a, 0x94, 0xa7, + 0x7d, 0xaf, 0xe4, 0xbe, 0xef, 0x3f, 0x72, 0xd2, + 0x17, 0x0f, 0xf9, 0xac, 0xd5, 0x82, 0x05, 0x7b, + 0xb3, 0x23, 0x68, 0x45, 0x37, 0xa3, 0xf1, 0x8c, + 0x31, 0xa3, 0xcc, 0x95, 0xbb, 0xdc, 0xff, 0x20, + 0xfa, 0xf7, 0x96, 0xab, 0x79, 0xff, 0x99, 0x32, + 0x31, 0xaa, 0x06, 0x64, 0xd1, 0x5a, 0x69, 0x60, + 0x0c, 0x02, 0x6b, 0xb4, 0x93, 0x2a, 0x43, 0x7c, + 0x0c, 0xfb, 0x3e, 0xc4, 0xc7, 0x9e, 0x67, 0x62, + 0xbe, 0xaa, 0x5a, 0xb3, 0xca, 0xbc, 0xbb, 0x2a, + 0xe0, 0x6e, 0x03, 0x7b, 0x46, 0x65, 0x56, 0x9f, + 0x2d, 0xcd, 0x95, 0x50, 0x23, 0x05, 0xd5, 0x2a, + 0x7a, 0x6a, 0x8f, 0x2e, 0xe9, 0x8f, 0x94, 0x03, + 0xf5, 0xc1, 0xf2, 0x4a, 0xaa, 0xdb, 0xb9, 0xc0, + 0x03, 0xd6, 0x1b, 0x74, 0x31, 0x22, 0x84, 0x58, + 0xe9, 0x80, 0x38, 0xda, 0xd4, 0x5b, 0x85, 0xb1, + 0x6c, 0x5d, 0xb2, 0xae, 0xba, 0x86, 0xe0, 0xab, + 0x55, 0x71, 0x5d, 0x53, 0xc4, 0xd5, 0x73, 0xee, + 0x18, 0x44, 0xa3, 0x5c, 0x9d, 0xe1, 0x00, 0xd5, + 0x19, 0xd6, 0x7e, 0xc2, 0x4a, 0xd1, 0x49, 0x57, + 0xb5, 0x50, 0x53, 0xae, 0xc8, 0xcc, 0x77, 0x55, + 0xeb, 0x55, 0x4d, 0xfc, 0x30, 0x2f, 0xf3, 0xbd, + 0xdd, 0xa5, 0x7a, 0xd2, 0x4d, 0x91, 0xb7, 0x3b, + 0x2a, 0x03, 0x74, 0xbc, 0xdd, 0x21, 0xe7, 0x08, + 0x7a, 0x0a, 0x96, 0x83, 0x4e, 0x58, 0x0a, 0x4b, + 0x71, 0x49, 0x95, 0x4a, 0xd2, 0x20, 0xc7, 0xb9, + 0xe9, 0x93, 0x2e, 0xd7, 0xeb, 0xa8, 0xb9, 0xa8, + 0x09, 0x7e, 0x59, 0xba, 0xec, 0xdc, 0xc3, 0x4f, + 0xfd, 0x6a, 0x54, 0xec, 0xc4, 0x84, 0x06, 0xf5, + 0x09, 0x8c, 0x22, 0x8c, 0x69, 0xe4, 0x0f, 0x67, + 0x9d, 0x75, 0xea, 0xd2, 0x62, 0xfd, 0x62, 0x48, + 0x79, 0xe6, 0xc4, 0x61, 0x2f, 0x8f, 0x92, 0xc3, + 0xe0, 0x12, 0x75, 0xad, 0x59, 0x6b, 0x58, 0xe4, + 0x4e, 0xca, 0x01, 0xe1, 0xfa, 0x6b, 0x74, 0x37, + 0xe8, 0x45, 0x3a, 0xf8, 0xb5, 0xeb, 0x1e, 0x6d, + 0x95, 0xdf, 0xc5, 0x99, 0xfb, 0x58, 0x8f, 0xa0, + 0x0e, 0xd1, 0x11, 0xcb, 0x94, 0x4a, 0x25, 0xea, + 0xa8, 0x34, 0xf9, 0xbe, 0x9f, 0x51, 0x66, 0x5c, + 0x74, 0x6d, 0xd7, 0xde, 0x5e, 0x78, 0xbb, 0xb0, + 0x99, 0xdd, 0xbc, 0x60, 0xad, 0xa0, 0xdf, 0x57, + 0x8e, 0x8f, 0x58, 0x55, 0x81, 0x11, 0x0a, 0xb1, + 0x91, 0x44, 0x7c, 0x63, 0x0d, 0x8e, 0x0b, 0xce, + 0x4a, 0x8b, 0x2b, 0xf1, 0x92, 0x57, 0x79, 0xbd, + 0xaf, 0x52, 0xef, 0xe4, 0x3d, 0x25, 0x22, 0xdc, + 0xcb, 0x64, 0x98, 0x9d, 0x29, 0x56, 0x61, 0xb8, + 0x53, 0x47, 0x59, 0xd4, 0x3c, 0x6b, 0x06, 0x24, + 0x88, 0x18, 0x3d, 0x3d, 0x46, 0x5f, 0x7b, 0x07, + 0x7f, 0x9f, 0x20, 0x3f, 0x0b, 0xfc, 0x2b, 0xd7, + 0xf1, 0x0f, 0x7d, 0x21, 0x63, 0xfe, 0x8b, 0xeb, + 0x6e, 0xd2, 0xaa, 0x58, 0x91, 0x23, 0x39, 0x27, + 0xb7, 0xae, 0x7a, 0x59, 0xb9, 0x6c, 0xed, 0xb4, + 0x61, 0x84, 0xb4, 0xe5, 0xbf, 0xa7, 0xdb, 0x4f, + 0x93, 0xf2, 0x01, 0xcc, 0xee, 0x46, 0x2c, 0x99, + 0x17, 0x3d, 0xbf, 0xf2, 0xe6, 0x0b, 0xe2, 0xcd, + 0xa0, 0x02, 0xe8, 0x53, 0xda, 0xd1, 0x50, 0x05, + 0x27, 0xa7, 0x70, 0xa5, 0x65, 0xc8, 0x08, 0x5e, + 0x0a, 0x2f, 0x57, 0xc3, 0x41, 0xac, 0x45, 0x9b, + 0x90, 0x11, 0x18, 0xaa, 0x92, 0x3f, 0x1c, 0x0c, + 0xf7, 0x30, 0xf4, 0x4d, 0x34, 0x71, 0x8b, 0x39, + 0xf4, 0xd9, 0x61, 0xff, 0x1d, 0xa1, 0xae, 0x74, + 0x97, 0xa1, 0x3f, 0x55, 0xe5, 0x3c, 0xbe, 0x29, + 0xc8, 0x00, 0xa2, 0x95, 0x73, 0x7a, 0x45, 0xef, + 0xd4, 0xae, 0x9d, 0x00, 0xf6, 0x2a, 0x9c, 0x7c, + 0x59, 0x28, 0xe7, 0xcb, 0x6a, 0x43, 0xdd, 0x5f, + 0x55, 0x83, 0xa9, 0x93, 0xf8, 0xc9, 0x54, 0x85, + 0xfb, 0x3d, 0x7b, 0x07, 0xed, 0xa1, 0x43, 0xd5, + 0x67, 0x56, 0x42, 0x09, 0x93, 0x7e, 0x40, 0xc8, + 0x59, 0xaa, 0x67, 0xeb, 0xd9, 0x3d, 0xb6, 0x27, + 0x61, 0xe4, 0x96, 0xf3, 0x91, 0xb7, 0x3e, 0xb3, + 0xb1, 0xb7, 0x4b, 0x2b, 0x95, 0x42, 0xaa, 0x64, + 0x17, 0x90, 0x89, 0x85, 0x9a, 0xb6, 0xb6, 0xe6, + 0x84, 0x61, 0xf5, 0xa5, 0x5c, 0x51, 0xf1, 0x77, + 0xe7, 0x5e, 0x07, 0x49, 0x8f, 0xd7, 0xea, 0x29, + 0x87, 0xf7, 0xa2, 0x76, 0x89, 0x6f, 0xd1, 0xeb, + 0x11, 0xd9, 0x41, 0xfc, 0xfe, 0x1e, 0x66, 0xcc, + 0xab, 0x4c, 0x7b, 0x5a, 0xcc, 0x5d, 0xbd, 0xd7, + 0x62, 0x0f, 0xc2, 0x19, 0x19, 0x19, 0x27, 0x23, + 0x00, 0xe1, 0x77, 0x1c, 0x7f, 0x7c, 0x4e, 0x55, + 0xd7, 0xfd, 0xb9, 0x8b, 0xf2, 0x0c, 0x78, 0x5c, + 0x90, 0x4e, 0xb7, 0xc5, 0x43, 0x75, 0xf6, 0xde, + 0x64, 0x93, 0xb2, 0x54, 0x18, 0x1b, 0x11, 0x63, + 0x9d, 0x65, 0x99, 0x0a, 0xbb, 0xec, 0x62, 0x13, + 0x3d, 0xac, 0x60, 0x5c, 0xe7, 0x6a, 0xaa, 0xf4, + 0xdb, 0x70, 0x98, 0xd7, 0x54, 0xbb, 0xaa, 0xd4, + 0x18, 0xdd, 0x8c, 0xb3, 0x84, 0x36, 0xbf, 0x72, + 0xad, 0x75, 0x93, 0x33, 0x05, 0x20, 0x82, 0x92, + 0xcd, 0x9a, 0x13, 0xd7, 0xe3, 0xad, 0xd8, 0xeb, + 0x71, 0xe5, 0x7b, 0x87, 0xf0, 0x16, 0xf2, 0xa8, + 0xb4, 0xe2, 0xfb, 0xf0, 0x36, 0x76, 0x1b, 0x21, + 0x79, 0x4a, 0x9a, 0x74, 0x27, 0x88, 0xff, 0xd4, + 0xa3, 0x28, 0xc2, 0x59, 0x9c, 0xc2, 0x10, 0xee, + 0x54, 0x10, 0x57, 0x6b, 0x10, 0x99, 0x77, 0xfb, + 0x83, 0xfd, 0xe8, 0x4a, 0x74, 0x2b, 0x1b, 0xf0, + 0xb4, 0x1d, 0xa8, 0x1f, 0x6a, 0xa1, 0x3f, 0xcc, + 0xa7, 0x75, 0xa5, 0x3d, 0x53, 0x17, 0x9c, 0x31, + 0x4b, 0x36, 0xe4, 0xb2, 0xf2, 0x64, 0xfa, 0xe5, + 0x27, 0x61, 0x5d, 0xf4, 0xf5, 0x36, 0x6f, 0x92, + 0xde, 0xe6, 0xa0, 0x7b, 0xd2, 0x89, 0x55, 0xae, + 0xb3, 0xfa, 0xe2, 0x91, 0xd2, 0x90, 0xf6, 0x23, + 0x6a, 0x26, 0x75, 0x53, 0xe8, 0xf7, 0x11, 0xeb, + 0xaa, 0x71, 0xce, 0xe4, 0x82, 0x87, 0x71, 0x73, + 0x12, 0xa2, 0x46, 0xd4, 0xb3, 0xba, 0x05, 0xbb, + 0xb7, 0x8f, 0x61, 0x86, 0x4c, 0x87, 0xd4, 0x33, + 0xf0, 0x1e, 0xb5, 0x33, 0xfc, 0x2a, 0x31, 0xaf, + 0x0b, 0xc4, 0x9c, 0x51, 0xe9, 0xaa, 0x73, 0x5d, + 0x78, 0x80, 0xe8, 0xea, 0xed, 0xd1, 0xb7, 0x33, + 0xdb, 0x2a, 0x63, 0x6f, 0xbb, 0x9e, 0xf2, 0x38, + 0xcb, 0xa6, 0xb4, 0x38, 0x56, 0xc5, 0x7e, 0xc1, + 0x2e, 0xcf, 0xed, 0xf2, 0x44, 0xaa, 0x3b, 0x8f, + 0xd8, 0x9e, 0x5c, 0x85, 0xe8, 0x96, 0x38, 0xaa, + 0x03, 0x7a, 0x18, 0xe7, 0x49, 0xd3, 0x67, 0xaf, + 0xfc, 0x21, 0xd7, 0xfb, 0xee, 0x74, 0x90, 0x76, + 0x07, 0x5e, 0xc8, 0x21, 0x87, 0x3c, 0x23, 0xcc, + 0xa8, 0x53, 0x53, 0xce, 0xbc, 0xcb, 0x56, 0xb3, + 0x07, 0x0b, 0xda, 0x86, 0x8a, 0x6b, 0x1d, 0xcc, + 0xf9, 0x57, 0x63, 0xef, 0x9f, 0xbc, 0x4c, 0xc2, + 0xde, 0x30, 0x6b, 0xd4, 0xbe, 0x8b, 0x6c, 0xde, + 0xa8, 0x5e, 0xae, 0x5e, 0x7e, 0x79, 0x7f, 0x49, + 0x2e, 0xf1, 0x4a, 0x42, 0x00, 0xc6, 0x33, 0xbe, + 0x3b, 0xd6, 0xde, 0x6f, 0xba, 0x19, 0x16, 0x36, + 0x64, 0xdf, 0x61, 0x41, 0x21, 0x7d, 0x47, 0x58, + 0xa3, 0x70, 0xbd, 0x52, 0x95, 0xd5, 0x77, 0x6a, + 0x55, 0x3d, 0x98, 0xd5, 0xe6, 0xd4, 0xbb, 0x65, + 0x5f, 0x13, 0xe6, 0xac, 0xeb, 0xe3, 0x82, 0x4e, + 0xb9, 0xc8, 0xb8, 0x90, 0x64, 0xee, 0x77, 0x2c, + 0x56, 0x24, 0x19, 0x11, 0x72, 0x13, 0xe6, 0xa8, + 0x39, 0x26, 0x4e, 0xc1, 0xe7, 0x9b, 0x80, 0x5b, + 0xd6, 0xcc, 0x38, 0x9f, 0xf8, 0xde, 0x67, 0x7a, + 0xb7, 0x3e, 0x82, 0x55, 0xc3, 0x19, 0x37, 0xbb, + 0xbf, 0xbe, 0x29, 0x27, 0xbd, 0x3a, 0x12, 0x8c, + 0x9c, 0x80, 0x5c, 0x90, 0x08, 0x27, 0xa3, 0xaf, + 0xb6, 0xb1, 0xab, 0xe5, 0x55, 0x4e, 0x8c, 0x3c, + 0x53, 0x77, 0xe6, 0x9b, 0xf9, 0x2a, 0x1c, 0x3b, + 0x98, 0x37, 0xe5, 0x73, 0x49, 0x35, 0xfe, 0xdb, + 0x3c, 0x5d, 0x7d, 0xc1, 0x80, 0xf3, 0x52, 0x9d, + 0x69, 0x16, 0xaa, 0xa1, 0xa6, 0xb6, 0x43, 0xd8, + 0xe8, 0xdc, 0x05, 0x75, 0x65, 0xf3, 0x31, 0xdf, + 0xe9, 0x84, 0x79, 0x18, 0xb1, 0x63, 0x8e, 0x58, + 0x1a, 0x70, 0x9f, 0x12, 0xf7, 0x02, 0xe2, 0xa9, + 0xc6, 0x64, 0x72, 0x4e, 0xe4, 0x31, 0xc3, 0x3c, + 0x75, 0x52, 0x82, 0xf6, 0x80, 0x53, 0xa9, 0xa3, + 0x62, 0x73, 0x4a, 0x8b, 0xbc, 0x1b, 0x97, 0xe7, + 0xda, 0x37, 0xb9, 0x97, 0xb3, 0x11, 0x67, 0x90, + 0x4b, 0xea, 0x7f, 0x72, 0xb8, 0x0a, 0x52, 0x16, + 0xa2, 0xd2, 0xe4, 0xa5, 0xb3, 0xbf, 0x7e, 0xeb, + 0x55, 0xd4, 0xe3, 0x8d, 0x68, 0x23, 0xe3, 0x3c, + 0x6a, 0x90, 0x83, 0x6c, 0x1f, 0x42, 0xb2, 0x5f, + 0x7f, 0xb2, 0x17, 0xf1, 0x8d, 0x19, 0x1f, 0x32, + 0xe9, 0xa6, 0x8c, 0x59, 0x77, 0x97, 0xd4, 0x44, + 0xb0, 0xae, 0x7d, 0xca, 0xbd, 0x48, 0x5e, 0x52, + 0xdc, 0x4b, 0x57, 0xec, 0x19, 0x77, 0xbd, 0xda, + 0x2d, 0xfc, 0xea, 0x77, 0x95, 0xc2, 0x78, 0x7f, + 0xca, 0x8f, 0x8a, 0x29, 0x13, 0x81, 0x1c, 0x2c, + 0x7d, 0xb8, 0xa6, 0x2c, 0x37, 0xb2, 0xbf, 0x8c, + 0xd8, 0x43, 0x76, 0xda, 0x8e, 0x6a, 0xc5, 0xe3, + 0x0c, 0x5b, 0x63, 0x6b, 0x26, 0x7d, 0x66, 0x6d, + 0x44, 0x1d, 0x77, 0x13, 0xca, 0xc5, 0xf2, 0x86, + 0x11, 0xb6, 0xc6, 0xa5, 0xb2, 0x18, 0x47, 0xaf, + 0xe4, 0x92, 0xde, 0xa7, 0x8c, 0x57, 0x0e, 0xf3, + 0xfd, 0xb0, 0xd7, 0x67, 0x0a, 0x56, 0x79, 0x16, + 0x31, 0x5e, 0x28, 0xd8, 0xab, 0xc5, 0xea, 0xe5, + 0x55, 0x67, 0xb3, 0xa3, 0x0f, 0x80, 0xdf, 0xa8, + 0x67, 0x77, 0xb6, 0x77, 0x2b, 0x21, 0x77, 0x49, + 0xc8, 0x3a, 0x1d, 0xc7, 0x1f, 0x19, 0xb5, 0x43, + 0x55, 0x18, 0x5b, 0x58, 0x31, 0x9a, 0x85, 0xbd, + 0x5d, 0xe5, 0x5d, 0x71, 0xe2, 0x0e, 0xcb, 0xc2, + 0x97, 0xee, 0x15, 0xe1, 0x3a, 0xae, 0xeb, 0x70, + 0x4c, 0x38, 0x57, 0x94, 0x2b, 0xce, 0x7d, 0xd8, + 0x8f, 0xc6, 0xc8, 0x81, 0x3d, 0x20, 0x0b, 0x8d, + 0x1f, 0x9d, 0x0d, 0x76, 0x87, 0x0e, 0xee, 0x82, + 0x43, 0x31, 0x3d, 0xff, 0xbe, 0x02, 0x56, 0x26, + 0xf1, 0x9d, 0xe0, 0x3c, 0x9a, 0x21, 0x29, 0x92, + 0x5c, 0xe6, 0x9f, 0xd9, 0xab, 0xe7, 0x60, 0x96, + 0xfa, 0x50, 0xe6, 0x1c, 0x41, 0xbc, 0x7f, 0x21, + 0xdf, 0x96, 0x6f, 0xca, 0xdc, 0x3d, 0x27, 0x42, + 0x8e, 0xe2, 0x2f, 0x14, 0x52, 0x14, 0x87, 0x73, + 0xf8, 0xac, 0x83, 0x43, 0x25, 0x3e, 0x7b, 0x13, + 0x7d, 0x92, 0x6a, 0x6e, 0xc2, 0x88, 0x59, 0x78, + 0x6e, 0xfb, 0x51, 0x15, 0xfc, 0x2a, 0xf0, 0x1a, + 0xb1, 0xcf, 0xc5, 0xea, 0x3e, 0xca, 0x15, 0xee, + 0xcf, 0x96, 0x13, 0x07, 0xdf, 0x2c, 0xc1, 0x6f, + 0x4e, 0x40, 0x86, 0xf7, 0x6a, 0x8f, 0x0b, 0xf3, + 0x5c, 0xbd, 0x50, 0xb8, 0xdd, 0x5e, 0x40, 0x24, + 0x3c, 0xe4, 0x27, 0x21, 0x79, 0x1c, 0x32, 0x68, + 0xee, 0xe8, 0x34, 0xc2, 0x95, 0x96, 0x95, 0x5d, + 0x65, 0xc0, 0x0d, 0x1b, 0xd2, 0xab, 0xc5, 0x77, + 0x9a, 0x7c, 0xde, 0x58, 0xa0, 0xdb, 0xf2, 0xe6, + 0xf5, 0xcd, 0x27, 0x84, 0xf9, 0xdc, 0x85, 0x35, + 0x0e, 0x3b, 0x10, 0x59, 0x76, 0x01, 0xb9, 0x1a, + 0x47, 0xda, 0xd1, 0x82, 0x71, 0x81, 0xad, 0x20, + 0x53, 0x04, 0xce, 0xd5, 0x0b, 0x42, 0x01, 0xc6, + 0x5e, 0xdf, 0xd8, 0x3c, 0x2f, 0xff, 0x4f, 0x57, + 0x63, 0x59, 0xfd, 0x7a, 0x75, 0x46, 0x17, 0x9b, + 0x88, 0x27, 0xf4, 0x54, 0x5f, 0x10, 0x67, 0xe3, + 0x69, 0x0d, 0x7e, 0x49, 0x5d, 0x17, 0x9e, 0xb5, + 0x05, 0x85, 0xb0, 0xb3, 0x42, 0xeb, 0x31, 0xba, + 0xc1, 0x71, 0x04, 0x07, 0xae, 0xcf, 0x1e, 0x1b, + 0x4b, 0xd8, 0x80, 0xbf, 0x97, 0xb8, 0x47, 0xeb, + 0x07, 0x8f, 0xf6, 0xc6, 0x57, 0xc1, 0x0f, 0x78, + 0xe5, 0x1d, 0x8f, 0x1b, 0x13, 0xf6, 0x6e, 0xb3, + 0x06, 0xf7, 0xa8, 0x0b, 0xa4, 0x99, 0x5c, 0x1f, + 0x98, 0xd7, 0x9f, 0xe5, 0xe4, 0xd4, 0x91, 0xa7, + 0xb0, 0x53, 0xc9, 0x56, 0x0a, 0xf6, 0x65, 0x35, + 0x4b, 0x73, 0x41, 0x90, 0xf2, 0xb0, 0xb7, 0xef, + 0x42, 0x24, 0x9c, 0x77, 0xbd, 0x1a, 0xe5, 0xab, + 0xd9, 0xf8, 0xac, 0x5c, 0xf0, 0x0a, 0xb2, 0xdc, + 0x31, 0xc4, 0xf3, 0x0c, 0xa1, 0xee, 0xf1, 0x35, + 0x88, 0xf9, 0x97, 0x49, 0xa5, 0x59, 0xac, 0x67, + 0x5e, 0xc7, 0xb4, 0xf4, 0x71, 0x60, 0xe5, 0xd4, + 0xf6, 0xa9, 0xed, 0xef, 0x9d, 0x84, 0x86, 0x48, + 0x9d, 0xd4, 0x2b, 0x9e, 0x2f, 0x0c, 0x08, 0x29, + 0x98, 0x35, 0x53, 0xde, 0xcc, 0x81, 0xab, 0x9c, + 0x1b, 0xb7, 0x12, 0x9b, 0x89, 0xbb, 0xe3, 0x3f, + 0xfd, 0x05, 0x15, 0xe9, 0x65, 0xa9, 0x31, 0xec, + 0x70, 0x86, 0xe0, 0x03, 0xc7, 0xc7, 0x4c, 0x71, + 0x2d, 0x6e, 0xe4, 0xd4, 0x9c, 0x66, 0x21, 0x16, + 0x6f, 0x15, 0xd9, 0x3d, 0x4f, 0x57, 0x4b, 0x86, + 0xec, 0xfb, 0x23, 0xe9, 0x2b, 0xae, 0xda, 0x84, + 0x55, 0x62, 0x33, 0x08, 0x33, 0x3e, 0x6a, 0x86, + 0x0d, 0xd1, 0x10, 0xcb, 0x43, 0xca, 0x50, 0x59, + 0xf6, 0x6a, 0x6e, 0x1f, 0xfa, 0x46, 0x47, 0x51, + 0x61, 0xd3, 0xda, 0xad, 0x0c, 0xfc, 0xe4, 0xb3, + 0xfc, 0xb8, 0x17, 0xb1, 0x3f, 0xa2, 0x70, 0x6c, + 0x6a, 0x54, 0x39, 0xe1, 0x3b, 0xfd, 0x2a, 0x56, + 0xae, 0xd8, 0x6a, 0x95, 0xa2, 0x59, 0x0b, 0x75, + 0xd2, 0xce, 0x76, 0x14, 0xf8, 0x91, 0x29, 0x84, + 0x7c, 0x1e, 0xea, 0x96, 0xea, 0x5c, 0xd3, 0x6b, + 0xb8, 0xc3, 0x69, 0xed, 0xe9, 0x30, 0x34, 0xd3, + 0xb0, 0x03, 0xe2, 0xef, 0x3e, 0x7f, 0x01, 0x5f, + 0xed, 0x94, 0x74, 0x79, 0x3b, 0x24, 0x9f, 0xdb, + 0xfe, 0xa6, 0x35, 0x9e, 0x4b, 0xd8, 0x7f, 0x69, + 0xf5, 0x22, 0xca, 0x7c, 0x3e, 0xec, 0xef, 0x70, + 0x97, 0xba, 0x2e, 0x16, 0x0e, 0x3a, 0xb0, 0xe0, + 0xc1, 0xf3, 0xdf, 0x81, 0xb6, 0xe7, 0x65, 0x4f, + 0x3e, 0xf6, 0x3d, 0x7c, 0xe5, 0x23, 0xc5, 0xab, + 0x8a, 0x87, 0x84, 0x05, 0xf8, 0x54, 0x59, 0xfb, + 0xae, 0x3d, 0xae, 0xfd, 0x8d, 0x49, 0x07, 0xfd, + 0x2c, 0x12, 0x1c, 0x39, 0xa8, 0x2c, 0xe8, 0x8d, + 0x37, 0x27, 0xd4, 0xa7, 0x3e, 0xea, 0x6b, 0x71, + 0x72, 0xd5, 0x2f, 0xd8, 0x33, 0x9d, 0xa7, 0x9e, + 0x2b, 0x04, 0x72, 0x79, 0xf0, 0x9a, 0xc9, 0xa8, + 0x66, 0x4d, 0xd7, 0x2c, 0xed, 0x7e, 0x47, 0xff, + 0x0e, 0x6e, 0x15, 0xd4, 0xb0, 0x22, 0xb4, 0x70, + 0x73, 0x47, 0xe7, 0xcc, 0xa3, 0x29, 0xf6, 0xad, + 0xe3, 0xc7, 0xd9, 0xf4, 0x28, 0x76, 0xee, 0xac, + 0x9d, 0xb2, 0xdc, 0x1e, 0xbb, 0x8b, 0xaf, 0xfb, + 0x8c, 0x9e, 0x0b, 0x51, 0x47, 0xf5, 0xea, 0x5e, + 0x57, 0x3d, 0x09, 0xf6, 0xff, 0x5f, 0xe2, 0xfb, + 0xe9, 0x5f, 0x88, 0x5d, 0x45, 0xbd, 0xa7, 0x9c, + 0x7e, 0x52, 0x6f, 0xb3, 0x3f, 0x32, 0xec, 0x3a, + 0x38, 0x73, 0xdf, 0xef, 0xa2, 0xd3, 0xbf, 0x6e, + 0x70, 0xb7, 0xbe, 0x7e, 0x5e, 0x62, 0x8f, 0x33, + 0x29, 0x71, 0x6a, 0x6a, 0xed, 0xa8, 0x94, 0x78, + 0x7f, 0x0d, 0x95, 0x42, 0xdb, 0xf7, 0x20, 0xea, + 0x48, 0x78, 0x19, 0x1f, 0x65, 0x02, 0x10, 0x5d, + 0x47, 0x6d, 0xac, 0x60, 0x5c, 0x75, 0x50, 0x3b, + 0xfe, 0x5e, 0x67, 0xc4, 0xca, 0x0d, 0x44, 0x2f, + 0xdd, 0x72, 0x32, 0xf6, 0x0c, 0xec, 0x76, 0xc3, + 0x0e, 0x57, 0xe4, 0x8b, 0xc8, 0xd3, 0x6d, 0xa5, + 0xa3, 0x07, 0x95, 0x68, 0x5f, 0x12, 0x6e, 0xbc, + 0xbe, 0x68, 0x3f, 0x78, 0x4d, 0x19, 0xc5, 0xd1, + 0xac, 0xa7, 0xcc, 0x13, 0x10, 0x06, 0x8e, 0xc2, + 0x7a, 0xae, 0xee, 0xe3, 0x60, 0x03, 0xb2, 0x5f, + 0xa5, 0xe0, 0x2a, 0x91, 0x98, 0x43, 0xde, 0x21, + 0xe6, 0xd8, 0x10, 0x9b, 0x74, 0xd0, 0xbb, 0x12, + 0x62, 0x90, 0xf2, 0xf4, 0xc1, 0x67, 0x1e, 0x53, + 0x80, 0x32, 0x63, 0xc8, 0xf6, 0xce, 0x49, 0x93, + 0xd2, 0xa2, 0xd3, 0xeb, 0x26, 0xe3, 0x45, 0x41, + 0xa5, 0xdb, 0xf9, 0x90, 0x1e, 0xcd, 0x8d, 0xb4, + 0x4e, 0x70, 0x88, 0x1a, 0x5f, 0xba, 0x97, 0x1a, + 0x37, 0xe0, 0x1b, 0xe1, 0xb7, 0xba, 0x01, 0xdf, + 0xe8, 0x61, 0xcf, 0x37, 0x82, 0x2c, 0xd4, 0x1a, + 0xb2, 0x9e, 0xd9, 0x09, 0x35, 0x6c, 0x44, 0x61, + 0x14, 0x84, 0x95, 0xec, 0x71, 0xf6, 0xcd, 0xc2, + 0xe6, 0x86, 0x21, 0x79, 0xca, 0xd2, 0xc3, 0xee, + 0xb7, 0x62, 0x02, 0x56, 0x35, 0x74, 0x34, 0x80, + 0x47, 0xed, 0xec, 0xfe, 0x82, 0xca, 0x78, 0xd7, + 0xa3, 0xb2, 0x8b, 0xe8, 0x50, 0x56, 0x78, 0x02, + 0xf7, 0x88, 0xb0, 0x6d, 0xcc, 0xda, 0xab, 0x7b, + 0x7f, 0x79, 0x29, 0x5a, 0x62, 0xa5, 0xd7, 0x6f, + 0xb1, 0x7b, 0x15, 0xbb, 0x78, 0x6f, 0xb1, 0x83, + 0xb7, 0xf3, 0x67, 0x5a, 0xef, 0x2c, 0xe3, 0x8f, + 0xa1, 0x6e, 0x48, 0xfa, 0xd5, 0xb3, 0xa3, 0xf0, + 0xde, 0x77, 0x3b, 0xfe, 0xbf, 0x26, 0x4d, 0x45, + 0xaa, 0xfd, 0x07, 0xe1, 0x8a, 0x76, 0xf3, 0x50, + 0xec, 0xf8, 0x72, 0x3c, 0x38, 0xff, 0x97, 0x11, + 0xb8, 0x32, 0xeb, 0xed, 0x99, 0xd7, 0x19, 0x9b, + 0xfb, 0xe8, 0x46, 0xda, 0x73, 0x77, 0x15, 0xca, + 0xca, 0x55, 0xf8, 0x4b, 0xd4, 0x53, 0xfa, 0x37, + 0xce, 0x29, 0x5e, 0x91, 0xb0, 0x52, 0xd6, 0x93, + 0x32, 0x47, 0x1c, 0xf5, 0xb3, 0x0e, 0xb9, 0x82, + 0x44, 0xb7, 0x8a, 0x18, 0x84, 0x35, 0x11, 0xf7, + 0x3a, 0xae, 0x06, 0x89, 0xae, 0x1c, 0x11, 0x39, + 0x2a, 0xa5, 0x24, 0xaf, 0x72, 0xd2, 0xe8, 0x46, + 0x41, 0xcf, 0x60, 0xf4, 0xf0, 0x95, 0x6e, 0xbc, + 0xdd, 0xd3, 0x6b, 0x83, 0x33, 0x3c, 0x23, 0x3e, + 0x72, 0x68, 0xf5, 0x77, 0xb2, 0xf5, 0x73, 0xee, + 0xf8, 0xde, 0x59, 0xb7, 0xb2, 0xd7, 0x9f, 0xb5, + 0x09, 0x82, 0xd7, 0x21, 0x24, 0x4f, 0x47, 0x1f, + 0x59, 0x8d, 0xbd, 0x27, 0xad, 0x52, 0xfc, 0x59, + 0x83, 0x48, 0x87, 0x3c, 0xb9, 0xec, 0xac, 0xb6, + 0x96, 0x3f, 0xf3, 0x06, 0x23, 0xe4, 0x50, 0xfb, + 0x2c, 0x76, 0xf6, 0xd8, 0xc7, 0x8e, 0xa1, 0x47, + 0xcc, 0xd1, 0xc3, 0x48, 0x79, 0xf4, 0x20, 0xa2, + 0x8d, 0xaa, 0x98, 0x77, 0x07, 0x50, 0xf1, 0x15, + 0x95, 0xbd, 0xf9, 0xcc, 0x14, 0x10, 0x19, 0xfc, + 0xb8, 0xb3, 0xef, 0x93, 0x1e, 0x2c, 0x45, 0x21, + 0x57, 0xf0, 0xd9, 0x27, 0xd6, 0xe7, 0x80, 0x52, + 0x74, 0x17, 0x34, 0x4d, 0xbd, 0xe1, 0x66, 0x95, + 0xc5, 0xe3, 0x1b, 0xf6, 0xe2, 0xf1, 0xa2, 0xb1, + 0xf8, 0xdb, 0xe2, 0xdf, 0xcf, 0xff, 0x6b, 0xab, + 0xe4, 0x9d, 0x67, 0xaa, 0x8f, 0xa0, 0x72, 0xe5, + 0xb8, 0x96, 0xb6, 0x93, 0x07, 0x69, 0x6b, 0xe1, + 0xd2, 0xf2, 0xaf, 0x6c, 0x8f, 0xc7, 0x2a, 0x5c, + 0xe3, 0x1c, 0x0f, 0x88, 0x53, 0xda, 0xab, 0x70, + 0x2e, 0x12, 0xb0, 0xbb, 0xdc, 0xc4, 0x77, 0xd6, + 0x33, 0x58, 0x2d, 0x77, 0x44, 0x1d, 0x3b, 0x0a, + 0x7e, 0xbc, 0xe0, 0xf7, 0x80, 0x08, 0xc9, 0x46, + 0x55, 0x70, 0xe4, 0x1f, 0x45, 0xf5, 0x68, 0x35, + 0xea, 0xf1, 0x84, 0xc8, 0x25, 0x50, 0x1a, 0xb1, + 0xc3, 0xa4, 0x41, 0x76, 0xc9, 0xde, 0xb4, 0xb9, + 0x8e, 0xcd, 0x98, 0x1d, 0x93, 0xe2, 0x66, 0x92, + 0xd4, 0xbf, 0x4f, 0x44, 0x7b, 0x70, 0x0f, 0xb9, + 0x33, 0xb2, 0x74, 0x3b, 0x7a, 0xe6, 0xa4, 0xcc, + 0x4c, 0xf7, 0x9a, 0xa9, 0x9a, 0x73, 0xe6, 0xf5, + 0xf6, 0xd7, 0xa4, 0xd7, 0xf7, 0x7b, 0xdc, 0xb4, + 0x5e, 0x17, 0x57, 0xac, 0xf3, 0xef, 0xf2, 0xea, + 0xbc, 0x3e, 0xaa, 0x4f, 0x54, 0x9f, 0x79, 0x9f, + 0x6a, 0x25, 0xdf, 0xab, 0xa4, 0xcd, 0xab, 0x80, + 0x03, 0xf5, 0x01, 0xfd, 0x94, 0x02, 0xe7, 0x9a, + 0xf2, 0x23, 0x05, 0x3b, 0x61, 0x76, 0xc9, 0x9e, + 0xb7, 0x55, 0x7b, 0xd0, 0xfb, 0xc4, 0x33, 0x10, + 0xcd, 0x96, 0x4c, 0x96, 0xec, 0xae, 0x75, 0x7c, + 0x8e, 0xf0, 0xda, 0xe8, 0x78, 0xb7, 0x76, 0xad, + 0x2b, 0xb4, 0xbe, 0x42, 0x06, 0x8c, 0x4e, 0x13, + 0x0e, 0x5f, 0x23, 0x93, 0x3a, 0x3f, 0x57, 0x98, + 0xbf, 0x0e, 0xc1, 0x77, 0x97, 0xeb, 0x1f, 0xe9, + 0xf7, 0x94, 0xa8, 0x3c, 0xe6, 0x4c, 0xc4, 0x7d, + 0xf7, 0xa0, 0x9e, 0x4a, 0x6f, 0x35, 0xed, 0xf9, + 0x5f, 0xa5, 0x9d, 0xa4, 0xbd, 0xfc, 0x56, 0xe3, + 0xac, 0x0a, 0x25, 0xaf, 0xa9, 0xea, 0x3c, 0x7a, + 0x90, 0xa0, 0x4f, 0xe7, 0xb1, 0x0a, 0x91, 0x41, + 0xf2, 0x1f, 0xf1, 0x9f, 0xd5, 0x5f, 0xf5, 0x3d, + 0xee, 0x03, 0x28, 0x43, 0xa6, 0x19, 0xad, 0xcb, + 0xce, 0x39, 0xcf, 0x4d, 0x46, 0x35, 0x54, 0xeb, + 0x36, 0x61, 0xe3, 0xf9, 0xca, 0xf0, 0x4c, 0x41, + 0xc7, 0xbd, 0x98, 0x5b, 0x13, 0x43, 0x9b, 0x4b, + 0x10, 0xb9, 0x67, 0x5f, 0xb2, 0x97, 0xa1, 0xce, + 0x4e, 0x87, 0xbb, 0x67, 0xb8, 0x1c, 0xb5, 0x66, + 0xe4, 0xfe, 0xd5, 0x9b, 0x47, 0xbb, 0x3b, 0x7a, + 0xc8, 0x19, 0x66, 0x31, 0xb6, 0xca, 0x1e, 0x3a, + 0x31, 0x54, 0xd4, 0x64, 0x91, 0x4e, 0xd7, 0xa3, + 0xb7, 0x4f, 0xcb, 0x63, 0x78, 0xbf, 0xfb, 0xcf, + 0xfb, 0x85, 0x35, 0xc4, 0x9d, 0xd0, 0x59, 0x4c, + 0xd9, 0xdf, 0x93, 0x06, 0x5d, 0xdc, 0xbc, 0xfc, + 0xaa, 0x47, 0x8d, 0x53, 0x38, 0xe5, 0x48, 0x72, + 0x52, 0x41, 0xfe, 0xad, 0xc7, 0x6b, 0x6b, 0x72, + 0xb7, 0xaf, 0xc1, 0x23, 0xc9, 0x18, 0xb6, 0x60, + 0x7f, 0x63, 0x93, 0xef, 0x2b, 0x25, 0x1f, 0x93, + 0xcf, 0x57, 0x95, 0x0e, 0x13, 0xef, 0x30, 0x6e, + 0x20, 0xbb, 0xa2, 0x53, 0x2d, 0x68, 0xf6, 0xee, + 0x56, 0x38, 0x0a, 0xd2, 0xc8, 0xe5, 0x23, 0x8c, + 0x6c, 0xe4, 0xd5, 0x15, 0xb1, 0x57, 0xe7, 0x33, + 0x29, 0xa7, 0x2c, 0xd4, 0xea, 0xd3, 0x64, 0xd6, + 0xd5, 0xf9, 0x0c, 0x2f, 0xb7, 0x23, 0x5a, 0x94, + 0x05, 0x0f, 0x07, 0x72, 0x67, 0xd9, 0x33, 0x54, + 0x65, 0xdb, 0x8f, 0xa9, 0x53, 0x8a, 0x37, 0xda, + 0xa9, 0xb3, 0x88, 0xee, 0x47, 0x1f, 0xb7, 0xfe, + 0x83, 0x57, 0x4d, 0xb6, 0x60, 0xbc, 0x8b, 0x51, + 0x31, 0x42, 0x7a, 0x7d, 0x03, 0x47, 0xa2, 0x32, + 0xa4, 0x7f, 0x54, 0x0f, 0xe8, 0xa7, 0x77, 0x56, + 0xf6, 0x06, 0x20, 0x16, 0x12, 0xca, 0x88, 0x69, + 0x5d, 0xe9, 0xd1, 0xdd, 0xea, 0xaa, 0x58, 0x88, + 0xfa, 0x10, 0x75, 0x2e, 0x79, 0x46, 0xcf, 0x39, + 0x71, 0x88, 0x02, 0x14, 0x74, 0xb9, 0x49, 0x19, + 0xbd, 0x95, 0x31, 0x4a, 0x8c, 0x89, 0xbe, 0x6b, + 0x2d, 0xba, 0xf3, 0x16, 0xea, 0xdc, 0xa3, 0x36, + 0x5f, 0x57, 0xeb, 0xea, 0x5e, 0x9e, 0x34, 0x34, + 0xc8, 0xcd, 0x0d, 0xf6, 0xa0, 0x75, 0xea, 0x69, + 0xe2, 0xfd, 0x8f, 0x0e, 0x76, 0x71, 0x3c, 0xc7, + 0x4c, 0x58, 0xff, 0x58, 0xfd, 0xa9, 0xf3, 0x40, + 0xfa, 0x83, 0xb3, 0x2e, 0x3d, 0x75, 0x6e, 0x4a, + 0x37, 0x93, 0x3d, 0x1e, 0x19, 0xa4, 0x3d, 0xdb, + 0xd5, 0x69, 0x45, 0xdd, 0x93, 0xae, 0x66, 0x17, + 0x75, 0x10, 0xea, 0xe3, 0x90, 0x9f, 0x10, 0x46, + 0xae, 0x53, 0x6f, 0xe5, 0x4c, 0x2e, 0xf2, 0xb3, + 0x26, 0x2c, 0x02, 0xde, 0xce, 0x2a, 0x55, 0xef, + 0x37, 0x48, 0xf8, 0xca, 0xfe, 0xa8, 0xdb, 0x15, + 0x87, 0xf6, 0x92, 0xf5, 0xa4, 0x99, 0xb2, 0xb2, + 0x47, 0xd9, 0x3a, 0xab, 0x4b, 0x7b, 0x12, 0xd5, + 0xaf, 0x44, 0xf2, 0xa5, 0x8d, 0x89, 0x93, 0xa5, + 0x51, 0x7d, 0x94, 0xd5, 0x8c, 0x68, 0x79, 0x02, + 0xf5, 0x10, 0x4a, 0x99, 0xd2, 0x27, 0x79, 0xae, + 0x0b, 0x41, 0xec, 0x7e, 0x65, 0xd2, 0x4d, 0x09, + 0x93, 0xce, 0x22, 0xec, 0xa2, 0xeb, 0xd4, 0xf5, + 0x0e, 0xf1, 0xb9, 0xa0, 0xa8, 0x10, 0x37, 0x67, + 0xc5, 0x8b, 0x75, 0xad, 0xae, 0xbe, 0x52, 0x8f, + 0xe0, 0x5c, 0xd4, 0x57, 0xf6, 0x94, 0x3d, 0x65, + 0xc7, 0x73, 0x45, 0x84, 0xfc, 0x92, 0x5c, 0x11, + 0x95, 0x42, 0x25, 0x88, 0x63, 0xbd, 0x95, 0xb5, + 0x6f, 0xab, 0xc4, 0xd4, 0x2b, 0x15, 0x55, 0xcd, + 0x2e, 0x58, 0x1a, 0x55, 0xc5, 0x0a, 0x76, 0x10, + 0x72, 0x51, 0x78, 0x25, 0x65, 0x4d, 0x09, 0x2b, + 0x5d, 0xa5, 0xb8, 0x31, 0x37, 0x77, 0x84, 0xd8, + 0x1a, 0xd4, 0x80, 0x44, 0x4e, 0x88, 0x87, 0x57, + 0xa1, 0xf1, 0x8c, 0x4e, 0xc7, 0x9e, 0xff, 0xb3, + 0x32, 0xee, 0x3c, 0x46, 0xa4, 0x00, 0xef, 0x4d, + 0x78, 0xe3, 0x0a, 0x2b, 0x04, 0xaa, 0x15, 0x37, + 0xc2, 0x46, 0x58, 0x1e, 0x82, 0xd9, 0xcd, 0x7d, + 0x5a, 0x05, 0x88, 0x08, 0xb0, 0x95, 0x58, 0x73, + 0x1f, 0x4a, 0x0f, 0xd9, 0x43, 0x0d, 0x6e, 0x12, + 0xbf, 0xdd, 0xc2, 0x33, 0x69, 0x49, 0xa6, 0xec, + 0x8e, 0x35, 0x61, 0x0d, 0x55, 0xe5, 0x78, 0x24, + 0xec, 0xf3, 0xeb, 0x78, 0x86, 0xeb, 0x77, 0xd0, + 0x79, 0xad, 0x0c, 0x75, 0x91, 0x7b, 0x71, 0x8c, + 0x1c, 0xd9, 0xac, 0x22, 0xe7, 0xc5, 0x4d, 0xca, + 0xa8, 0xbc, 0x13, 0x92, 0xa5, 0x0e, 0xe2, 0x97, + 0x2b, 0x54, 0xd5, 0x8e, 0x05, 0xd1, 0xaf, 0x68, + 0xf7, 0xae, 0x93, 0xdc, 0xad, 0x5e, 0x40, 0xb7, + 0x7a, 0x56, 0xa8, 0xa0, 0x53, 0x7d, 0x40, 0xee, + 0x3e, 0xea, 0x2b, 0xf1, 0x26, 0x74, 0xd2, 0xe1, + 0xd5, 0x86, 0xb4, 0xe2, 0xc1, 0x50, 0xbc, 0xf6, + 0xf3, 0xf8, 0xdd, 0xb2, 0x87, 0xfa, 0xe3, 0x1e, + 0xdb, 0xf1, 0x5c, 0xd4, 0xc8, 0x98, 0x3e, 0x12, + 0xd1, 0xe3, 0xe1, 0x7a, 0xbb, 0x33, 0x7a, 0x70, + 0x72, 0x04, 0xd6, 0xff, 0xfa, 0x4f, 0x8e, 0xed, + 0x21, 0x5c, 0xae, 0x81, 0xdc, 0x96, 0x9b, 0x06, + 0xc6, 0x62, 0x83, 0xae, 0x08, 0x31, 0x54, 0x94, + 0xd6, 0xff, 0xb5, 0x0a, 0x31, 0x50, 0x88, 0x07, + 0xa4, 0x1a, 0x79, 0xd2, 0xa0, 0xcb, 0x7b, 0x68, + 0x72, 0x3f, 0x77, 0x86, 0x7d, 0x81, 0xb2, 0x01, + 0xb5, 0x0a, 0x51, 0x4c, 0x75, 0xfe, 0xc9, 0xea, + 0xd6, 0xac, 0x31, 0xbb, 0x3d, 0xbb, 0x37, 0x57, + 0xbf, 0xbb, 0xd3, 0xeb, 0x27, 0x42, 0xdf, 0xbb, + 0x25, 0x88, 0xbd, 0x1c, 0xfc, 0xa0, 0x25, 0x9a, + 0xc9, 0x9d, 0xff, 0x6a, 0x4a, 0x4a, 0x28, 0x1e, + 0x0a, 0x93, 0xb3, 0xbb, 0xd5, 0xd3, 0xa3, 0x87, + 0x47, 0x27, 0xdd, 0x6d, 0x5d, 0xba, 0x34, 0xf2, + 0xbb, 0xfa, 0x57, 0x33, 0xd4, 0xe7, 0x0a, 0x42, + 0x8c, 0xff, 0xcc, 0x84, 0x99, 0x9f, 0x8b, 0x1e, + 0xa6, 0xa5, 0xa4, 0x1f, 0x51, 0xe8, 0x33, 0xc4, + 0x5d, 0x10, 0xd8, 0x80, 0xf3, 0x1d, 0xea, 0x61, + 0x50, 0x87, 0x3f, 0xd9, 0xf2, 0x99, 0x6b, 0x79, + 0x4b, 0x6d, 0x2c, 0xba, 0x9a, 0x9e, 0x3b, 0x5e, + 0xdc, 0x56, 0x0f, 0xe6, 0x73, 0x6a, 0x65, 0xc5, + 0x9e, 0x51, 0x91, 0xa3, 0x43, 0xef, 0xfb, 0x4b, + 0xba, 0xb9, 0xad, 0x4a, 0xa9, 0xf4, 0x7b, 0x1e, + 0x07, 0xf3, 0x08, 0x43, 0x35, 0x49, 0x33, 0xa4, + 0xd7, 0xa1, 0x8c, 0xb2, 0x7e, 0xf1, 0xed, 0xf5, + 0xb7, 0xcb, 0xd5, 0x05, 0x42, 0xfb, 0x43, 0xfc, + 0x86, 0x7e, 0x55, 0x75, 0xc9, 0x4d, 0x73, 0x35, + 0x63, 0x9c, 0x7f, 0x68, 0x03, 0x49, 0xb5, 0x4d, + 0xae, 0x80, 0x04, 0xb1, 0x18, 0x9d, 0x89, 0x93, + 0x5c, 0x9e, 0xc0, 0xef, 0xae, 0x49, 0xbe, 0x03, + 0x2c, 0xe7, 0x9d, 0x2c, 0x28, 0x9f, 0xc8, 0x45, + 0x88, 0x41, 0x10, 0x5f, 0x55, 0x74, 0x06, 0x50, + 0x43, 0x25, 0xf7, 0x58, 0x38, 0xd1, 0x7b, 0x12, + 0xce, 0xbb, 0x57, 0xe5, 0x69, 0xa3, 0xf8, 0x08, + 0xd5, 0x1e, 0x03, 0xa9, 0x8e, 0x6f, 0x29, 0xd5, + 0x82, 0x04, 0xca, 0xae, 0x2f, 0x38, 0x9a, 0xb1, + 0x62, 0x9e, 0x97, 0x6e, 0xb9, 0x1e, 0x6a, 0xa8, + 0x91, 0x70, 0xd3, 0x4e, 0x42, 0x4e, 0xb8, 0xb1, + 0x23, 0xc4, 0x3a, 0x65, 0x84, 0x19, 0x67, 0x9d, + 0x45, 0x0f, 0x38, 0x3e, 0x76, 0xc4, 0x59, 0x53, + 0xc8, 0x0f, 0x48, 0xe0, 0x3b, 0xa1, 0x6a, 0xcd, + 0xbf, 0x2f, 0x91, 0x06, 0x1d, 0xc4, 0x22, 0xd5, + 0x74, 0xf3, 0x76, 0x75, 0x16, 0x6b, 0x10, 0xfa, + 0x48, 0x75, 0x5c, 0x4f, 0x57, 0x17, 0xf4, 0xe5, + 0xea, 0x7a, 0xe9, 0x8e, 0xcf, 0x68, 0x76, 0x7a, + 0x71, 0xf3, 0x7d, 0x3a, 0x27, 0xa8, 0x4d, 0xaa, + 0x33, 0x73, 0xbd, 0xf5, 0x99, 0xc1, 0x8e, 0xd6, + 0x95, 0xcf, 0x2a, 0x55, 0x7b, 0x40, 0x0d, 0x63, + 0x4d, 0xbc, 0xd9, 0xa3, 0x74, 0xf1, 0x04, 0x15, + 0x45, 0x11, 0x81, 0xba, 0x8b, 0xb3, 0x47, 0x0a, + 0x12, 0x53, 0x04, 0x7b, 0x40, 0xa1, 0xe6, 0x2e, + 0xdf, 0x9f, 0x76, 0x46, 0x9a, 0x49, 0x7d, 0xbb, + 0xc7, 0xed, 0xcb, 0x67, 0xe9, 0xd2, 0xda, 0xa8, + 0x9f, 0xd3, 0xc9, 0x83, 0x8a, 0xfc, 0x1b, 0x3c, + 0x7f, 0x2b, 0x17, 0xf7, 0x50, 0xee, 0xd6, 0x1b, + 0x93, 0xce, 0x49, 0xcf, 0x7b, 0x78, 0x31, 0x5c, + 0x6b, 0x68, 0x0d, 0xa2, 0x1e, 0xc8, 0x53, 0x88, + 0x13, 0x11, 0x45, 0x47, 0x72, 0x99, 0x49, 0x86, + 0x88, 0xe5, 0x76, 0xac, 0x3f, 0x7f, 0xea, 0x28, + 0xe6, 0xbc, 0x13, 0x84, 0xf3, 0x34, 0xaa, 0x4f, + 0xb6, 0x33, 0x3a, 0x64, 0x9a, 0x3a, 0x9d, 0x49, + 0xf8, 0x94, 0xf8, 0xba, 0x91, 0xd6, 0x28, 0xdb, + 0x69, 0x47, 0x94, 0xd1, 0x8a, 0x6c, 0x4f, 0xaa, + 0xff, 0xe9, 0x7d, 0x23, 0xac, 0x24, 0x04, 0x9a, + 0xa8, 0x23, 0x97, 0xd7, 0x85, 0x9d, 0xd5, 0xa6, + 0x37, 0xaf, 0x4a, 0x79, 0x52, 0x6e, 0xc1, 0xd5, + 0x3b, 0xb1, 0x19, 0x83, 0xeb, 0xf4, 0x88, 0xf7, + 0x53, 0x0d, 0xc2, 0x8d, 0x38, 0x1c, 0x51, 0x06, + 0xef, 0xdb, 0x4e, 0x18, 0x9f, 0xb6, 0xf1, 0xba, + 0x9c, 0x92, 0xd2, 0xad, 0x04, 0x1b, 0x6b, 0xcd, + 0xb2, 0xe9, 0xe3, 0xcf, 0x34, 0x5a, 0xcd, 0x20, + 0xfa, 0x08, 0xb8, 0xbb, 0x87, 0xa4, 0x50, 0xa7, + 0xe7, 0xeb, 0xc8, 0xf2, 0x9b, 0x33, 0x7d, 0x26, + 0x9f, 0x9f, 0x2f, 0xf4, 0x74, 0x9e, 0x7a, 0x54, + 0xb9, 0xfc, 0xee, 0xeb, 0xd8, 0x61, 0xc2, 0xe8, + 0xdc, 0x7e, 0x9b, 0x0e, 0x4f, 0x87, 0x6f, 0x76, + 0x38, 0x35, 0x05, 0x3b, 0xab, 0xf0, 0x0a, 0x97, + 0x66, 0x86, 0x9d, 0x21, 0x73, 0xc4, 0xac, 0x50, + 0x3f, 0x54, 0xe8, 0x71, 0x32, 0xe5, 0xa3, 0xb8, + 0x5f, 0xa5, 0x4a, 0x70, 0x76, 0xcc, 0x52, 0xcf, + 0x6d, 0xc7, 0x14, 0xda, 0xbe, 0xc2, 0xb3, 0x44, + 0xde, 0x0d, 0x78, 0x55, 0x90, 0x4f, 0xe7, 0xc7, + 0x5d, 0xdc, 0x55, 0xce, 0x9b, 0xbf, 0xb0, 0xee, + 0x63, 0xed, 0xed, 0x7b, 0x57, 0xf6, 0xd4, 0x42, + 0x7c, 0xf7, 0x67, 0x0f, 0x3d, 0xeb, 0xf0, 0x7f, + 0x8f, 0x3a, 0x29, 0xb0, 0xe2, 0x29, 0x19, 0x0f, + 0x7f, 0x85, 0x51, 0xcc, 0x69, 0x7d, 0xe2, 0xe0, + 0xaf, 0x6e, 0xb8, 0x3e, 0x76, 0x24, 0xd6, 0x07, + 0x9d, 0x5e, 0x6c, 0x6d, 0x40, 0x82, 0x75, 0xcc, + 0xc2, 0x35, 0x8c, 0x2a, 0xcc, 0xd8, 0x01, 0xa2, + 0x1e, 0xd0, 0xac, 0xfa, 0x59, 0x8a, 0x47, 0xb9, + 0x5c, 0xd5, 0x25, 0x63, 0x4e, 0x55, 0x79, 0x34, + 0xd5, 0xc5, 0x4f, 0x72, 0xbc, 0x28, 0xc4, 0xc6, + 0xb9, 0x42, 0x4e, 0x6d, 0x15, 0xc5, 0x2e, 0xcb, + 0x4d, 0xf0, 0x74, 0x7b, 0x30, 0x06, 0xf1, 0x9d, + 0xdf, 0x79, 0xd6, 0xe0, 0x47, 0xe6, 0x30, 0xea, + 0x5e, 0x73, 0xdd, 0xe9, 0xd8, 0x6b, 0xec, 0xef, + 0x5f, 0x7d, 0x7d, 0xdf, 0xbe, 0x6f, 0xc7, 0x5b, + 0xf1, 0xd6, 0xf8, 0x2b, 0xff, 0xbc, 0x21, 0xc7, + 0xc4, 0x77, 0xc9, 0xe9, 0xf5, 0xc7, 0x91, 0x84, + 0x3b, 0xce, 0x45, 0xc2, 0xfb, 0x6e, 0x30, 0x3f, + 0xc3, 0xc5, 0x91, 0x5f, 0xf4, 0x3d, 0x31, 0x1d, + 0xd4, 0x07, 0xae, 0xa9, 0x8b, 0xaf, 0x0b, 0xff, + 0xca, 0xc2, 0x37, 0x10, 0xa5, 0x1b, 0xce, 0x05, + 0x49, 0xe3, 0x6e, 0x5f, 0xd4, 0xa1, 0xab, 0x62, + 0xae, 0xf2, 0xfa, 0x6a, 0xf2, 0xaa, 0x03, 0xb9, + 0x8a, 0xfc, 0xa5, 0x4b, 0x3c, 0x1c, 0x6f, 0xe4, + 0x20, 0x9b, 0x03, 0xf2, 0x15, 0x25, 0xe0, 0xac, + 0xc2, 0xee, 0xb9, 0x8a, 0x8c, 0x1d, 0xf2, 0x74, + 0xf4, 0x91, 0x21, 0x5d, 0x4d, 0x09, 0xd2, 0x55, + 0xa3, 0xae, 0x33, 0x6a, 0x4a, 0xf4, 0xd7, 0x0a, + 0x4e, 0xaa, 0x18, 0x71, 0x2f, 0xeb, 0x75, 0xd9, + 0xab, 0x9a, 0xea, 0x78, 0xa0, 0x0f, 0x00, 0xe7, + 0x86, 0x7b, 0x2c, 0x03, 0xf9, 0x05, 0xcf, 0x99, + 0xe4, 0x04, 0x64, 0x38, 0x98, 0x16, 0x8f, 0xf8, + 0x6a, 0x8d, 0x54, 0x27, 0xe4, 0x19, 0x15, 0x3c, + 0x26, 0x3f, 0xf5, 0x1c, 0xe8, 0xf8, 0x0c, 0x8d, + 0xb9, 0xd1, 0xfd, 0x9d, 0x46, 0x44, 0x8d, 0x3e, + 0xe2, 0xae, 0x01, 0xbe, 0xdf, 0x7c, 0x4e, 0xef, + 0xf7, 0x16, 0xea, 0x3d, 0x87, 0xfc, 0x1a, 0xa1, + 0x7a, 0x70, 0x4d, 0x8f, 0xbb, 0x85, 0xfd, 0x45, + 0xad, 0x90, 0x43, 0x1d, 0x39, 0xa9, 0x5c, 0x33, + 0xe2, 0xd6, 0x0c, 0x55, 0xc6, 0x20, 0xea, 0x43, + 0x55, 0x90, 0x43, 0xb5, 0x31, 0x9d, 0x3c, 0x5d, + 0xa2, 0x7e, 0x28, 0xfe, 0xae, 0xac, 0x91, 0xa7, + 0x5e, 0x44, 0xe6, 0x4e, 0x43, 0xc8, 0xd1, 0x0e, + 0xa0, 0x6e, 0x75, 0x23, 0xbe, 0x3f, 0x9b, 0x9a, + 0x13, 0x3e, 0xf5, 0x38, 0x53, 0x7e, 0x84, 0x80, + 0x4c, 0x6b, 0x19, 0xa2, 0xea, 0x84, 0xb1, 0xa0, + 0x67, 0x94, 0x12, 0xb9, 0x4f, 0xd2, 0x9a, 0x03, + 0xa3, 0x85, 0x6a, 0x0f, 0x0e, 0x56, 0x23, 0x24, + 0x2b, 0x6e, 0xa1, 0x33, 0x2b, 0x7d, 0x64, 0x9d, + 0x8f, 0x96, 0x1d, 0x61, 0xd8, 0x65, 0xa8, 0x83, + 0x63, 0x5f, 0xb4, 0xa7, 0xec, 0x67, 0x1e, 0xee, + 0xcb, 0x47, 0x2a, 0x46, 0x3f, 0xa8, 0xcc, 0xf8, + 0xec, 0x86, 0xa8, 0xfb, 0x64, 0x6f, 0x5c, 0x38, + 0xe3, 0x46, 0x09, 0xed, 0x4f, 0xfa, 0x2a, 0xe5, + 0xf5, 0xdc, 0x90, 0x57, 0xad, 0x55, 0xf5, 0x59, + 0x77, 0xb5, 0x34, 0x5b, 0x52, 0x91, 0x03, 0x54, + 0x9e, 0x2b, 0xe7, 0x1b, 0x4f, 0xf6, 0x4f, 0xa9, + 0xa7, 0x53, 0x7e, 0xf5, 0x72, 0x56, 0x5e, 0xa5, + 0xba, 0xe5, 0xaa, 0xc7, 0xc7, 0x54, 0x05, 0xee, + 0x23, 0x86, 0xa3, 0x1d, 0x2b, 0xb5, 0xe7, 0x84, + 0x19, 0xf7, 0x26, 0x31, 0x1d, 0x7a, 0x75, 0x89, + 0xe1, 0xd1, 0x70, 0xa0, 0xfd, 0x42, 0x0e, 0x1a, + 0xd7, 0x8d, 0xc1, 0x47, 0xd7, 0x8c, 0x53, 0xc6, + 0x0d, 0x23, 0xeb, 0x2e, 0x0a, 0xf9, 0xa6, 0x46, + 0x11, 0xa3, 0xf4, 0x3a, 0xa1, 0xc5, 0xb4, 0x99, + 0xe3, 0x3f, 0xdd, 0x0d, 0x89, 0x10, 0x39, 0xb2, + 0x45, 0xed, 0x5c, 0x7b, 0x52, 0x3e, 0xa3, 0x3d, + 0x7d, 0xe3, 0x61, 0x20, 0x4d, 0xdd, 0xc4, 0x7b, + 0x46, 0x2b, 0x03, 0xfe, 0x75, 0xd3, 0xf4, 0x54, + 0x71, 0x75, 0xde, 0xd5, 0xda, 0x25, 0xf7, 0xb7, + 0x98, 0x83, 0x63, 0xe3, 0x31, 0x65, 0xdd, 0x34, + 0x3a, 0xcc, 0x1f, 0x58, 0x48, 0x1e, 0x76, 0x7e, + 0x60, 0xb7, 0x9c, 0x35, 0xf6, 0xa3, 0x43, 0xdd, + 0x3d, 0x8a, 0x12, 0xcb, 0xa4, 0x35, 0x24, 0xca, + 0xdf, 0x94, 0x1f, 0xea, 0x5f, 0xe8, 0xa5, 0x9d, + 0x5a, 0xeb, 0x2e, 0xfb, 0x8c, 0x3d, 0x64, 0xdf, + 0xc0, 0xeb, 0xd7, 0x24, 0x72, 0x72, 0x4c, 0x0d, + 0xbe, 0xfb, 0x81, 0xad, 0xe7, 0x60, 0x2c, 0x52, + 0x14, 0x8e, 0x95, 0xfc, 0x1f, 0x1a, 0x61, 0x3d, + 0x74, 0x30, 0x1a, 0xf6, 0x10, 0xdd, 0xe8, 0x4e, + 0x08, 0xef, 0x7b, 0x5d, 0xba, 0xea, 0x5c, 0x96, + 0xef, 0xa1, 0xfb, 0x21, 0xb1, 0x60, 0x04, 0x64, + 0x89, 0xb6, 0x15, 0x4b, 0xb1, 0xf2, 0x2f, 0xa7, + 0xe3, 0x99, 0xf0, 0x2a, 0x3a, 0x0c, 0x5a, 0x79, + 0xa3, 0xac, 0x28, 0x87, 0x33, 0xe1, 0xdf, 0xd3, + 0xad, 0x45, 0x9c, 0xae, 0xcf, 0xd9, 0x25, 0x44, + 0x8a, 0xbd, 0x7b, 0x10, 0x50, 0xf2, 0x86, 0x60, + 0xe6, 0x55, 0x61, 0x3f, 0x6f, 0xcf, 0xe6, 0x30, + 0xa2, 0x1a, 0x10, 0xbb, 0xaa, 0xc5, 0x89, 0xf6, + 0x65, 0xf9, 0x21, 0xe4, 0xf9, 0x09, 0x3a, 0xe2, + 0x9e, 0xdf, 0x22, 0x5f, 0xa6, 0x8b, 0x0e, 0xa3, + 0x6a, 0x37, 0xe2, 0x57, 0xd1, 0x65, 0x3a, 0x0a, + 0x3b, 0xb4, 0x37, 0x72, 0xf0, 0xc6, 0x76, 0xab, + 0x31, 0xd8, 0x73, 0x70, 0x14, 0x8d, 0x56, 0x26, + 0xf4, 0xaf, 0xc5, 0xa0, 0x48, 0x51, 0xb0, 0xb2, + 0xd3, 0x10, 0x1b, 0xa2, 0x9d, 0x7f, 0xad, 0x1c, + 0xcf, 0x40, 0x9e, 0x2a, 0xda, 0xe2, 0x6b, 0xf8, + 0xdb, 0xf7, 0x3d, 0x54, 0x76, 0x65, 0x55, 0x26, + 0x87, 0x39, 0x7d, 0x96, 0xe1, 0x08, 0x99, 0x2b, + 0x15, 0xf4, 0x27, 0x28, 0x79, 0xb5, 0x22, 0x78, + 0xd8, 0x32, 0x15, 0xab, 0xe5, 0xe6, 0x90, 0x13, + 0x15, 0x96, 0xfb, 0xea, 0x84, 0x32, 0xe4, 0x5d, + 0x43, 0xfa, 0x1a, 0xf6, 0xbd, 0x5a, 0x67, 0x61, + 0xbd, 0x1b, 0x62, 0x43, 0x15, 0xcc, 0xbc, 0x32, + 0xe2, 0xb4, 0xeb, 0x63, 0xd4, 0x37, 0x84, 0xac, + 0xb0, 0xe8, 0x9c, 0xd1, 0xc6, 0xb5, 0xe5, 0xe3, + 0x75, 0x0d, 0xb2, 0x38, 0x5b, 0x7d, 0xcd, 0x28, + 0xea, 0x0b, 0x23, 0x5e, 0xc5, 0x1d, 0x46, 0x2e, + 0x9e, 0x83, 0x9c, 0x1c, 0xc8, 0x26, 0x70, 0x8d, + 0xe1, 0x4c, 0x10, 0x8f, 0x0b, 0x4f, 0xae, 0x21, + 0xf5, 0xf9, 0x23, 0x55, 0xe1, 0x87, 0xc2, 0xb1, + 0xe4, 0xf5, 0x1a, 0xec, 0xda, 0x71, 0x77, 0x46, + 0xae, 0x59, 0x43, 0x96, 0x64, 0x14, 0x50, 0xc5, + 0xb7, 0x7c, 0xd6, 0x7a, 0x4a, 0x2e, 0xbd, 0x84, + 0x89, 0x5a, 0x79, 0x71, 0xfc, 0x85, 0xfd, 0x85, + 0xbd, 0x69, 0xd7, 0x8e, 0x0d, 0x3b, 0x69, 0x27, + 0xb6, 0xd3, 0xd5, 0xaf, 0xb9, 0xe5, 0xb8, 0x30, + 0xef, 0xa0, 0x1f, 0xf7, 0x29, 0x59, 0x6c, 0x7c, + 0xef, 0xc4, 0xe1, 0x7c, 0xc7, 0xf5, 0x49, 0xa7, + 0xb3, 0xa7, 0x28, 0xc5, 0x06, 0x64, 0x22, 0xaf, + 0xb5, 0xe3, 0xa2, 0x0d, 0x3f, 0xd1, 0xbd, 0xfd, + 0x75, 0xb6, 0x91, 0xdd, 0x5b, 0xdb, 0x0b, 0xef, + 0x74, 0xd5, 0xfc, 0x76, 0x51, 0x97, 0xe0, 0xb7, + 0xa7, 0x4b, 0xfd, 0x75, 0x51, 0x1f, 0xb9, 0x91, + 0x6a, 0x9e, 0x52, 0x06, 0xda, 0xbb, 0x52, 0x4f, + 0xd7, 0xbc, 0x83, 0x80, 0x25, 0x8d, 0x7e, 0x6b, + 0x56, 0x2e, 0xc9, 0x62, 0xf7, 0x96, 0xeb, 0x55, + 0xef, 0x5f, 0x23, 0x34, 0x63, 0xc4, 0x8a, 0x18, + 0x53, 0xc6, 0xb3, 0xb8, 0x08, 0x31, 0xa3, 0xdf, + 0xb5, 0x84, 0xb1, 0xe4, 0xf5, 0x34, 0x7a, 0xf9, + 0x46, 0x5e, 0xf7, 0xb0, 0x1e, 0x31, 0xcf, 0xb6, + 0x02, 0xc6, 0xff, 0x2d, 0xcb, 0x87, 0x31, 0x96, + 0x2a, 0x75, 0x51, 0xac, 0x98, 0x3b, 0xae, 0xa0, + 0xaa, 0xaf, 0xb3, 0xdb, 0x08, 0x29, 0xe7, 0xdc, + 0x7e, 0x9d, 0x22, 0x0f, 0x45, 0xf1, 0x52, 0xaa, + 0xa0, 0x87, 0x06, 0xea, 0xd1, 0xf4, 0xa2, 0xb3, + 0xfc, 0xb8, 0xdd, 0x57, 0xfc, 0xc3, 0x47, 0xba, + 0xfd, 0x14, 0x8e, 0xb4, 0x8b, 0xc8, 0x55, 0xf4, + 0xf4, 0x62, 0x78, 0xfc, 0x70, 0xfc, 0x47, 0x7b, + 0xf4, 0x38, 0x63, 0x53, 0x0c, 0xdc, 0xd3, 0x59, + 0x18, 0x21, 0x27, 0x0b, 0x54, 0x9c, 0x28, 0xf5, + 0xe8, 0xaa, 0x05, 0x7a, 0xb4, 0xa8, 0xfa, 0xd9, + 0x0d, 0xfc, 0x4c, 0x8d, 0xb9, 0xf1, 0xd2, 0xa5, + 0xd2, 0x66, 0x29, 0x5e, 0xea, 0xd5, 0xff, 0xee, + 0xef, 0x02, 0xf4, 0xcf, 0x37, 0xff, 0x95, 0xbb, + 0x0a, 0xdd, 0x01, 0x21, 0xf0, 0x41, 0xad, 0x1e, + 0xa3, 0x3e, 0x5e, 0x83, 0xe7, 0xf5, 0xf6, 0x2e, + 0x9a, 0x85, 0x23, 0xd8, 0xe1, 0xb0, 0xe0, 0xdd, + 0x8f, 0xe2, 0xc6, 0x7c, 0xab, 0x54, 0x42, 0x5c, + 0x98, 0x87, 0x8e, 0xae, 0xfb, 0x1a, 0xce, 0x49, + 0x52, 0x71, 0xce, 0xf6, 0x39, 0x95, 0xc8, 0xf4, + 0xe8, 0xa7, 0x9c, 0x2f, 0xe8, 0x69, 0xfe, 0xe0, + 0xef, 0x9f, 0x77, 0x3c, 0x8b, 0x4f, 0x7c, 0x2e, + 0x05, 0xf6, 0x46, 0x67, 0x57, 0x14, 0xc4, 0xfe, + 0xda, 0x17, 0x69, 0xe8, 0x4a, 0xe1, 0x83, 0xef, + 0x9a, 0x7e, 0x06, 0x24, 0xd4, 0xbb, 0xea, 0xc1, + 0xc8, 0x52, 0xf4, 0x22, 0x46, 0xbf, 0x2b, 0x2d, + 0xc1, 0xdc, 0x84, 0xc4, 0xa2, 0xe8, 0x9e, 0x97, + 0x7a, 0x95, 0xf1, 0x8a, 0xd4, 0x03, 0xf2, 0xf4, + 0x73, 0x90, 0x11, 0x89, 0xbc, 0x2b, 0x16, 0x72, + 0xb3, 0x2c, 0x65, 0x8f, 0x6b, 0x67, 0xa5, 0x0a, + 0xf5, 0xbb, 0x31, 0x2b, 0x2f, 0xba, 0x98, 0x99, + 0x53, 0x5d, 0x94, 0xfc, 0x32, 0xb3, 0xca, 0x2d, + 0xe2, 0xc3, 0x52, 0xf7, 0x01, 0xde, 0x17, 0xce, + 0xff, 0xa3, 0x6b, 0x88, 0xae, 0x75, 0x8d, 0xba, + 0xc1, 0x23, 0x3d, 0xd8, 0xa4, 0x15, 0x25, 0xad, + 0x44, 0x9d, 0x35, 0x6d, 0xee, 0x20, 0xeb, 0x0e, + 0x28, 0x63, 0xd5, 0xc9, 0x56, 0xc6, 0x99, 0x6b, + 0xfd, 0x91, 0xad, 0x55, 0xef, 0x52, 0xcf, 0xab, + 0x64, 0x2e, 0x3a, 0xb2, 0x95, 0x6b, 0x7c, 0xee, + 0x4a, 0xf5, 0x71, 0x67, 0x51, 0xfa, 0x83, 0xd3, + 0x75, 0x55, 0xeb, 0xf5, 0x97, 0xc4, 0x3a, 0x4b, + 0xbf, 0x42, 0x1d, 0xaf, 0x4e, 0x07, 0xa4, 0x8e, + 0x66, 0x63, 0xbb, 0xab, 0x64, 0xc1, 0xeb, 0x0c, + 0xb3, 0xee, 0xac, 0xb8, 0x2a, 0xaa, 0x02, 0x61, + 0x9e, 0xe0, 0xef, 0xa4, 0x12, 0x87, 0x9f, 0x7a, + 0xd9, 0x57, 0x1e, 0xfb, 0xbd, 0x1b, 0xe9, 0x4f, + 0x22, 0x6a, 0xc6, 0x52, 0x2d, 0xd8, 0xb3, 0x9b, + 0x62, 0xfd, 0x74, 0x23, 0x6c, 0x55, 0xad, 0x1e, + 0x25, 0x6d, 0x61, 0xd0, 0x29, 0x41, 0xb4, 0x3c, + 0x7f, 0x2c, 0x62, 0xf7, 0x88, 0x3c, 0x50, 0x6e, + 0x6b, 0xeb, 0xc7, 0x12, 0xa9, 0xae, 0x05, 0x8c, + 0x80, 0x51, 0xc3, 0x3a, 0x4e, 0x65, 0x5d, 0x58, + 0x77, 0x08, 0xdb, 0x79, 0x14, 0x30, 0x4e, 0xb3, + 0x24, 0xea, 0xdb, 0x71, 0x95, 0xc0, 0x52, 0xad, + 0x1a, 0x47, 0x7c, 0xad, 0x54, 0xa8, 0x66, 0x74, + 0x3a, 0x76, 0x30, 0x7b, 0xef, 0x8c, 0xba, 0x9d, + 0x4d, 0x1d, 0x6f, 0x0f, 0x9d, 0x87, 0xd2, 0x9f, + 0xa4, 0x7b, 0x1d, 0xef, 0x6f, 0xca, 0x53, 0x84, + 0x17, 0xed, 0x87, 0xc2, 0x43, 0x38, 0xbe, 0x74, + 0x1f, 0xb2, 0x3f, 0x19, 0xf7, 0x14, 0xdf, 0x73, + 0xad, 0xa3, 0x2a, 0x80, 0x11, 0x45, 0x67, 0x16, + 0x10, 0x37, 0xb1, 0xe9, 0x3b, 0x85, 0x05, 0x21, + 0x13, 0xcc, 0x08, 0x19, 0xf4, 0x12, 0xe2, 0xac, + 0x90, 0x1c, 0xd7, 0x60, 0x17, 0x84, 0xe7, 0x58, + 0x7f, 0x6f, 0x3f, 0x17, 0x6e, 0xb6, 0x6f, 0x22, + 0xa6, 0x97, 0x85, 0x90, 0x63, 0x0a, 0xaf, 0xfc, + 0x17, 0x42, 0xdf, 0x15, 0x2d, 0x44, 0x82, 0x5c, + 0x68, 0xa9, 0x66, 0x11, 0xf6, 0xb4, 0x0b, 0xfb, + 0xd9, 0xbd, 0x2c, 0x2a, 0x92, 0x58, 0x37, 0x1b, + 0x88, 0x34, 0x46, 0x3d, 0xf0, 0x8d, 0x06, 0xbc, + 0x2b, 0x5b, 0x6e, 0x7d, 0xad, 0x65, 0xb4, 0xe5, + 0x83, 0x8c, 0x3c, 0x73, 0xb0, 0xc4, 0x90, 0xfb, + 0x90, 0x51, 0xb2, 0x8d, 0xcf, 0x7f, 0x91, 0x59, + 0xd1, 0xbe, 0xaf, 0x8d, 0x59, 0xb1, 0x83, 0x14, + 0x0b, 0x88, 0xbc, 0x67, 0x82, 0x4e, 0x70, 0x88, + 0x7d, 0x91, 0x21, 0xca, 0x8d, 0x1c, 0x44, 0x1a, + 0xf2, 0xc1, 0x39, 0xfb, 0xd9, 0x7e, 0x7c, 0x9f, + 0xeb, 0x23, 0x5d, 0x4a, 0x75, 0x2b, 0x81, 0xa8, + 0x96, 0xbb, 0x09, 0xdf, 0xf7, 0x05, 0x29, 0x6c, + 0x44, 0x3c, 0x85, 0x0d, 0x4f, 0x0d, 0x0c, 0x2b, + 0xcc, 0xdc, 0x53, 0xde, 0xe1, 0xfb, 0x1d, 0xac, + 0x57, 0x49, 0xce, 0x94, 0x4f, 0xb7, 0xd6, 0xd8, + 0x32, 0x5b, 0xa8, 0x8e, 0xb0, 0x71, 0x96, 0xae, + 0x66, 0x58, 0xb1, 0x85, 0xa8, 0x02, 0xac, 0xd8, + 0x60, 0x87, 0x7a, 0xd1, 0x5d, 0x30, 0x56, 0x8d, + 0xe9, 0xca, 0xb4, 0x70, 0xcd, 0xc1, 0xbe, 0x08, + 0xf5, 0xa5, 0xef, 0x32, 0xce, 0x4e, 0xaa, 0xab, + 0x2e, 0xf1, 0x9f, 0xbd, 0xfe, 0x5f, 0xd1, 0xf2, + 0x88, 0x35, 0x38, 0xf9, 0x1b, 0xd5, 0x06, 0xb3, + 0x37, 0xec, 0xe7, 0x07, 0xeb, 0x0d, 0x76, 0xf0, + 0xdc, 0xfe, 0x6c, 0x9f, 0xed, 0x3f, 0x57, 0x02, + 0x6a, 0x50, 0x15, 0x53, 0xdc, 0x1f, 0x07, 0x2b, + 0x05, 0x37, 0xb0, 0x6f, 0x60, 0xa3, 0x3e, 0xe1, + 0x52, 0xe3, 0xba, 0xfd, 0xb7, 0xbd, 0x30, 0xac, + 0x9c, 0x9e, 0x0a, 0x77, 0x5d, 0x6d, 0xe7, 0xe1, + 0x50, 0xeb, 0x45, 0x57, 0x6d, 0xa9, 0x36, 0xbc, + 0xfe, 0x81, 0xda, 0xfa, 0x5c, 0xec, 0xc4, 0x57, + 0x18, 0x5b, 0xb5, 0x31, 0xaa, 0x5a, 0x15, 0x66, + 0x9d, 0x39, 0x7b, 0x56, 0x9b, 0x63, 0x77, 0xf1, + 0xfb, 0xda, 0x92, 0x1d, 0x72, 0x91, 0x5b, 0x08, + 0x3b, 0x4d, 0xbd, 0x00, 0x73, 0xf1, 0x8c, 0x3b, + 0x54, 0x39, 0x6b, 0x7f, 0xab, 0xf2, 0xbc, 0x0c, + 0x3d, 0x52, 0x6b, 0x0c, 0xa2, 0x72, 0x3c, 0x50, + 0x97, 0xdc, 0x9e, 0xb5, 0xe7, 0x8e, 0x0b, 0x34, + 0xbb, 0x11, 0xd3, 0x3a, 0xe0, 0xbe, 0x80, 0x91, + 0xb9, 0x5a, 0x09, 0x90, 0x93, 0x3b, 0xbc, 0xf7, + 0xd1, 0xac, 0x51, 0xb8, 0x2b, 0x70, 0x0e, 0xa0, + 0x83, 0x6c, 0x17, 0xc9, 0xdc, 0x3d, 0x08, 0x09, + 0x9a, 0x73, 0xc1, 0xd4, 0xcc, 0x15, 0x47, 0x13, + 0x3e, 0xf1, 0xba, 0x2d, 0xf9, 0x86, 0x6a, 0xcf, + 0xd9, 0xab, 0x07, 0xa1, 0x86, 0x76, 0x70, 0xde, + 0xce, 0xee, 0x6b, 0xfb, 0xe7, 0x95, 0x6b, 0xea, + 0xd7, 0xf4, 0x7d, 0x3d, 0x9f, 0x9a, 0xcd, 0xcc, + 0x6f, 0x8f, 0xde, 0x4a, 0xc6, 0xee, 0x5b, 0xd2, + 0xcc, 0xec, 0x41, 0x95, 0xc0, 0x1a, 0x29, 0x10, + 0x9a, 0x1e, 0x8e, 0x1a, 0xaf, 0x6d, 0x35, 0x60, + 0x25, 0xe4, 0x1a, 0xfb, 0x1d, 0xb4, 0x61, 0x4f, + 0x65, 0x12, 0xd6, 0x82, 0x8f, 0x3d, 0xdf, 0xc3, + 0xde, 0x1e, 0x01, 0xf9, 0x08, 0xb9, 0x0b, 0xaa, + 0xfa, 0x52, 0x15, 0x75, 0xcf, 0xbb, 0x01, 0x3d, + 0x5d, 0x8a, 0x70, 0x86, 0x51, 0xd7, 0x34, 0xc5, + 0x3a, 0x5e, 0xba, 0x39, 0x0f, 0xef, 0x5d, 0x7d, + 0x01, 0xf7, 0xb0, 0xef, 0x18, 0xe7, 0xd8, 0xb3, + 0xcd, 0xf8, 0x6f, 0x58, 0xca, 0x8b, 0xd4, 0x0b, + 0x1e, 0x27, 0x8e, 0xa2, 0x85, 0xb6, 0x2a, 0x77, + 0x0f, 0x2f, 0x62, 0x10, 0x82, 0x12, 0x29, 0xc9, + 0x37, 0xb8, 0x4b, 0x2e, 0xb1, 0xd5, 0x1b, 0xa8, + 0xcc, 0x32, 0x47, 0x0a, 0xc0, 0xdd, 0x4a, 0xaf, + 0x5a, 0x12, 0x4b, 0xa8, 0xc4, 0x48, 0x0a, 0xde, + 0xea, 0x1a, 0x69, 0x2c, 0x60, 0xdd, 0x16, 0x31, + 0xd9, 0x11, 0x39, 0xca, 0x76, 0xf6, 0x62, 0xf8, + 0x8e, 0x66, 0x0a, 0xfe, 0x09, 0x56, 0x91, 0x61, + 0x55, 0xc9, 0x8d, 0x37, 0x79, 0x76, 0x9a, 0xfe, + 0x3d, 0x3e, 0xbb, 0xef, 0xea, 0x62, 0x7a, 0x7d, + 0x2b, 0x33, 0xeb, 0x9c, 0x73, 0xd1, 0x9f, 0xee, + 0xa9, 0xf8, 0xbb, 0xdc, 0xa5, 0xa3, 0x6b, 0x46, + 0x86, 0xa9, 0x25, 0x5f, 0x75, 0x6d, 0xd8, 0xd1, + 0xd9, 0xbc, 0xab, 0xb0, 0x01, 0x87, 0xe7, 0xbf, + 0x9e, 0x1e, 0x14, 0xc7, 0x31, 0x36, 0x16, 0xdd, + 0x5c, 0x6b, 0x19, 0x6b, 0x57, 0x54, 0xb9, 0x9a, + 0x6e, 0xa6, 0x1d, 0x7f, 0xef, 0xa6, 0x6a, 0x63, + 0x03, 0x57, 0xd2, 0x49, 0x4f, 0xe9, 0x60, 0xa1, + 0x27, 0xbe, 0x92, 0xe5, 0xa8, 0x02, 0x67, 0x12, + 0xf1, 0x9e, 0xd5, 0x1b, 0xfa, 0xe5, 0x2a, 0xaa, + 0x93, 0xdd, 0xab, 0x46, 0x58, 0xb4, 0x1e, 0x27, + 0x06, 0x8a, 0x82, 0x9e, 0xcf, 0x32, 0x55, 0xd5, + 0x3e, 0xe8, 0x2e, 0xe1, 0x73, 0xc7, 0xab, 0xb3, + 0x4c, 0x65, 0xd5, 0x6a, 0x4c, 0x7f, 0x01, 0xcf, + 0x7a, 0xc8, 0xae, 0x55, 0x3f, 0x12, 0xa6, 0xea, + 0x4f, 0x76, 0x7a, 0xfd, 0x16, 0x17, 0x14, 0xa9, + 0x09, 0xbb, 0x24, 0xe4, 0x7d, 0xb8, 0xbf, 0x66, + 0xd8, 0xda, 0x16, 0x8f, 0xbe, 0x90, 0x69, 0x8a, + 0xbd, 0x18, 0xde, 0xeb, 0xc6, 0xdd, 0x77, 0x62, + 0xcb, 0xc7, 0x4e, 0xa3, 0x1a, 0x26, 0xaa, 0xb0, + 0x47, 0x5a, 0xa3, 0xdb, 0xf2, 0x41, 0x2c, 0x97, + 0xda, 0x7e, 0xbc, 0x7f, 0xda, 0xab, 0x9c, 0xe0, + 0xca, 0x00, 0x67, 0xb0, 0x25, 0xd9, 0x29, 0x73, + 0xd2, 0x9d, 0x94, 0x16, 0xd8, 0x82, 0xb6, 0x2e, + 0x0d, 0xbb, 0x43, 0xa4, 0x2e, 0xdb, 0x61, 0x91, + 0xd0, 0x6e, 0x3e, 0xc5, 0x9e, 0x6d, 0x47, 0xb7, + 0x78, 0x87, 0x01, 0x27, 0x77, 0x94, 0x14, 0x36, + 0x6a, 0xad, 0x68, 0x95, 0xf7, 0xea, 0x2e, 0xb2, + 0x07, 0xd5, 0xfb, 0x07, 0xf1, 0x7f, 0xc4, 0x37, + 0xc7, 0x7f, 0xea, 0xea, 0x30, 0x23, 0xf6, 0xf2, + 0x81, 0x73, 0x12, 0x7b, 0x29, 0x63, 0x4f, 0x55, + 0xbf, 0xd9, 0x46, 0x65, 0xbc, 0x80, 0xd7, 0xdd, + 0xc3, 0xec, 0xef, 0xa6, 0xf5, 0x89, 0xc4, 0x19, + 0x0a, 0xa8, 0x1e, 0x0c, 0x51, 0x41, 0x1d, 0x7b, + 0x8e, 0x8b, 0xe6, 0x82, 0xb9, 0x01, 0xd1, 0x32, + 0x57, 0xf0, 0xc6, 0x6a, 0x00, 0xf7, 0x0f, 0x1d, + 0x74, 0x2b, 0x9d, 0xd5, 0xdb, 0xef, 0x3d, 0xf1, + 0x5d, 0xf0, 0xf7, 0x66, 0x83, 0xee, 0x79, 0x54, + 0xcd, 0xb1, 0xff, 0x71, 0x90, 0xb4, 0x22, 0xdb, + 0x59, 0xea, 0x3f, 0x5e, 0xdb, 0xbe, 0x74, 0x70, + 0xd9, 0xba, 0xaf, 0xc5, 0xa9, 0x02, 0x19, 0xfa, + 0x67, 0x62, 0x33, 0xf6, 0xcf, 0x8c, 0x00, 0xe3, + 0x8a, 0x7a, 0x45, 0xd9, 0x6a, 0xca, 0x4c, 0x4a, + 0xb0, 0xb3, 0xe7, 0xba, 0x6a, 0xf6, 0x91, 0x36, + 0x32, 0xce, 0x2f, 0xcb, 0x1f, 0x3b, 0x0f, 0xe3, + 0x3e, 0x9b, 0x1e, 0x63, 0x95, 0xe1, 0xf6, 0x90, + 0x75, 0x8b, 0x98, 0x02, 0x41, 0x8f, 0x7b, 0x82, + 0x48, 0x89, 0x5b, 0xf2, 0x5d, 0x89, 0x5f, 0x05, + 0xc4, 0xfc, 0xbe, 0x60, 0x11, 0x83, 0xf3, 0x5b, + 0x53, 0x7a, 0xd7, 0x5d, 0xd4, 0x8f, 0x54, 0x70, + 0x96, 0xaf, 0xed, 0x7d, 0xf5, 0x1e, 0x15, 0xa7, + 0xb0, 0x4a, 0x59, 0xeb, 0x70, 0xb4, 0xb1, 0x3f, + 0xb1, 0x5b, 0x5a, 0x7c, 0x44, 0xab, 0xaf, 0xfe, + 0xad, 0x03, 0x31, 0xa1, 0x0d, 0x31, 0xe1, 0x6b, + 0x9f, 0x3d, 0xfa, 0x04, 0x62, 0xa7, 0x09, 0x36, + 0x47, 0x1c, 0x27, 0x64, 0x9f, 0x5e, 0x21, 0x64, + 0x0b, 0x3d, 0xf9, 0x68, 0x44, 0x09, 0x75, 0x6f, + 0x72, 0x08, 0xa3, 0x25, 0xf4, 0x89, 0x13, 0x7b, + 0xf1, 0x0c, 0xfd, 0x91, 0xe3, 0x74, 0x2e, 0xd0, + 0xe5, 0xa4, 0x57, 0x61, 0x96, 0x99, 0x21, 0xb6, + 0xab, 0x49, 0x5a, 0x56, 0x4a, 0x49, 0x9d, 0xb3, + 0xa1, 0x20, 0xdf, 0xf5, 0xbe, 0x19, 0x27, 0xa6, + 0xcf, 0xb6, 0x5b, 0xa8, 0x6b, 0x6e, 0x61, 0x73, + 0xe1, 0xe7, 0x62, 0x29, 0x93, 0x14, 0x4e, 0x38, + 0x25, 0x73, 0x2c, 0x6c, 0x4f, 0x34, 0x92, 0x1c, + 0x3e, 0x1a, 0xa2, 0xfc, 0xea, 0x63, 0xf7, 0x3e, + 0xe7, 0xdc, 0x58, 0xa9, 0xb8, 0x1c, 0x86, 0xf3, + 0x42, 0x59, 0x1b, 0x5e, 0x33, 0x3c, 0xab, 0xa8, + 0x16, 0xc5, 0x47, 0x6f, 0x8f, 0x4f, 0x0d, 0x62, + 0x2f, 0x3d, 0x75, 0xc1, 0x07, 0x1d, 0x96, 0x4f, + 0x44, 0x19, 0x95, 0x93, 0x12, 0x61, 0xe4, 0x58, + 0x9c, 0xd4, 0xd6, 0x6a, 0x8c, 0xc1, 0xf1, 0x6f, + 0xb0, 0x9f, 0x5d, 0x60, 0xa4, 0x97, 0x9c, 0xfc, + 0xbd, 0xaa, 0x29, 0x1e, 0xdd, 0x1a, 0x54, 0xb7, + 0xaa, 0xcf, 0x63, 0xe7, 0x3e, 0x1d, 0xf5, 0x13, + 0xea, 0x0d, 0xb2, 0x3e, 0x55, 0xfd, 0x5a, 0x1f, + 0xf0, 0xf0, 0x57, 0x9d, 0x9a, 0x2a, 0xe9, 0x99, + 0x73, 0x9e, 0x4f, 0xb7, 0x47, 0xdf, 0xab, 0xda, + 0xd4, 0xd3, 0xd5, 0xf0, 0xfa, 0x1a, 0x5e, 0x34, + 0x92, 0x8b, 0x35, 0x39, 0x5b, 0xcb, 0x3f, 0x1f, + 0xf3, 0xff, 0xd2, 0xbb, 0xb1, 0x4a, 0x72, 0xea, + 0x08, 0x71, 0xdc, 0xa4, 0x76, 0xa4, 0xc4, 0x9d, + 0x39, 0x61, 0xa1, 0x6e, 0xec, 0x50, 0x89, 0x2a, + 0xf7, 0x63, 0x93, 0xab, 0x4a, 0x16, 0x5d, 0x8e, + 0x5b, 0x88, 0x39, 0x9d, 0x9e, 0x35, 0x7e, 0xa0, + 0x7a, 0xb7, 0xaa, 0x3d, 0x23, 0x51, 0x5d, 0xbb, + 0xf2, 0x98, 0x32, 0x02, 0xae, 0x18, 0x33, 0xe9, + 0x5c, 0x82, 0xd9, 0x7b, 0x51, 0x7f, 0xe0, 0x46, + 0xdf, 0xc8, 0x6f, 0x22, 0xa5, 0xe8, 0x56, 0x9c, + 0x32, 0x02, 0xee, 0x69, 0xfb, 0x82, 0xb8, 0x88, + 0x1c, 0x49, 0x1e, 0x39, 0x1c, 0xa5, 0x6b, 0x94, + 0xa3, 0x4a, 0xef, 0x18, 0x3c, 0xfe, 0x03, 0x7c, + 0xd2, 0x31, 0x78, 0xfc, 0x9c, 0xf2, 0x7f, 0xf0, + 0x2a, 0x3a, 0x09, 0x21, 0xd9, 0xcc, 0xe5, 0x7b, + 0x3d, 0xc8, 0x38, 0x3e, 0xa7, 0x42, 0xdd, 0x72, + 0xbf, 0x2b, 0xcd, 0x77, 0xb6, 0x9a, 0x23, 0xb1, + 0x49, 0x67, 0x0a, 0x9d, 0xa4, 0xde, 0x68, 0x6f, + 0xd6, 0x4b, 0x43, 0x5b, 0x61, 0xd2, 0xf9, 0x94, + 0xc9, 0x01, 0x5d, 0x57, 0x14, 0x62, 0x48, 0xf2, + 0x3a, 0x13, 0xaf, 0x8c, 0x29, 0x65, 0x8e, 0xa0, + 0x83, 0x33, 0x24, 0x46, 0x85, 0x69, 0x37, 0xaf, + 0x3c, 0x69, 0xa0, 0x57, 0x8c, 0xda, 0x58, 0x6d, + 0x04, 0xcb, 0xb8, 0xc3, 0xd2, 0x18, 0xd9, 0xc1, + 0x1e, 0x2e, 0xb2, 0x46, 0xd1, 0x8b, 0xe4, 0x21, + 0xed, 0x92, 0x11, 0x69, 0x94, 0xaa, 0x97, 0x67, + 0x9c, 0x6b, 0x84, 0x4f, 0xd9, 0x85, 0x5d, 0x1c, + 0xfd, 0xcd, 0x38, 0x86, 0x79, 0xd8, 0xe3, 0x3d, + 0xe1, 0xbc, 0xfc, 0x46, 0xd6, 0x1a, 0x31, 0x37, + 0x5b, 0xc2, 0x6c, 0xe6, 0x8f, 0xec, 0x0b, 0xb8, + 0xdd, 0xdf, 0xe2, 0xdc, 0xff, 0xd8, 0x4f, 0x79, + 0x88, 0x36, 0x2e, 0xcb, 0xcb, 0xd6, 0x92, 0xbb, + 0x6b, 0xcd, 0xa1, 0x0b, 0xf4, 0xce, 0x85, 0xba, + 0x5a, 0xbe, 0x4b, 0xd5, 0x9e, 0xbc, 0x10, 0x70, + 0x77, 0x15, 0xde, 0xbd, 0xe4, 0x07, 0x8f, 0xa2, + 0x49, 0x73, 0x00, 0x7e, 0xc2, 0xa3, 0xa6, 0x60, + 0xac, 0xba, 0x01, 0xb5, 0xe0, 0x08, 0xe4, 0x26, + 0x04, 0x9f, 0x1c, 0x1f, 0x27, 0x0e, 0xc2, 0x8c, + 0x0b, 0x31, 0x99, 0x11, 0x72, 0x43, 0xea, 0xb2, + 0xa3, 0xd9, 0x78, 0xbb, 0xf0, 0x7a, 0x85, 0x94, + 0x1f, 0x84, 0xe4, 0xfc, 0x51, 0x9c, 0xb0, 0x21, + 0x83, 0x70, 0x7c, 0x4f, 0x1c, 0xf1, 0x68, 0xc5, + 0x5f, 0xeb, 0x06, 0x84, 0x7c, 0x55, 0x65, 0xa8, + 0x2a, 0x5c, 0x3c, 0x82, 0x7b, 0x96, 0x29, 0x5d, + 0x7f, 0xf3, 0xf8, 0x9d, 0xf0, 0x76, 0x97, 0x56, + 0x95, 0x88, 0x30, 0x54, 0xad, 0xb5, 0x88, 0x6b, + 0x59, 0xfe, 0xd8, 0x28, 0xb2, 0x22, 0xec, 0xc2, + 0xb5, 0x77, 0x43, 0x5b, 0x11, 0xe2, 0xf0, 0x76, + 0x54, 0x5f, 0x94, 0x47, 0xca, 0x09, 0x9e, 0x35, + 0xc5, 0xfc, 0x83, 0x4d, 0xe4, 0x30, 0x72, 0x26, + 0x23, 0x64, 0x31, 0xf5, 0x5d, 0xc2, 0x06, 0x67, + 0xac, 0x35, 0xab, 0x5b, 0xc9, 0x9f, 0x71, 0x32, + 0xe8, 0xcd, 0xfd, 0x2a, 0x7a, 0x14, 0xa5, 0x2e, + 0x2d, 0xdb, 0x33, 0x76, 0xfc, 0x33, 0xf9, 0xc2, + 0xc3, 0x78, 0x20, 0xc2, 0x2a, 0x7a, 0x1c, 0xa5, + 0x8a, 0xd3, 0xc5, 0x1e, 0x9c, 0x39, 0x22, 0x77, + 0x23, 0x4a, 0xda, 0xf9, 0xbf, 0x3a, 0xcc, 0x60, + 0x3a, 0x3e, 0x76, 0xfd, 0x58, 0x25, 0xa3, 0xc7, + 0x77, 0x6a, 0xd6, 0xba, 0x55, 0x33, 0xd6, 0x8d, + 0x3f, 0x29, 0x0f, 0x95, 0x3f, 0x19, 0x37, 0x89, + 0x3f, 0xc8, 0xfd, 0x08, 0xd6, 0xe4, 0x69, 0x65, + 0xde, 0xa1, 0x7c, 0xc2, 0x4c, 0xa0, 0xe6, 0xe3, + 0x31, 0x36, 0x27, 0x78, 0x1f, 0x47, 0xa9, 0xef, + 0x38, 0xb7, 0xa5, 0xdb, 0xd2, 0x27, 0xe6, 0x0e, + 0x43, 0xa9, 0xc5, 0x92, 0xb4, 0xe3, 0x69, 0x48, + 0x76, 0xab, 0x01, 0x37, 0x7f, 0x27, 0xc3, 0xf5, + 0xf0, 0x0c, 0x0d, 0x7f, 0x0f, 0xe5, 0x9f, 0x78, + 0xc2, 0x53, 0xc4, 0xc5, 0x6f, 0x34, 0xe9, 0xce, + 0xca, 0x6a, 0xe3, 0x47, 0x0f, 0xb5, 0xf2, 0xc5, + 0xf1, 0x75, 0xfb, 0xe2, 0x31, 0xf7, 0xa3, 0xf7, + 0x35, 0xac, 0x90, 0x23, 0x3d, 0x08, 0xdf, 0x0b, + 0xf1, 0xf3, 0x19, 0x5b, 0x6d, 0xe9, 0xe6, 0xad, + 0x1c, 0xd7, 0xcf, 0xa9, 0xd5, 0x25, 0xf7, 0x2c, + 0xe4, 0x45, 0x21, 0x79, 0x42, 0xee, 0xd7, 0xf6, + 0x47, 0x9c, 0xea, 0xf2, 0xd1, 0x1d, 0x65, 0xc8, + 0x4d, 0xb7, 0x64, 0x76, 0x15, 0xb1, 0x23, 0x07, + 0x71, 0x0b, 0x8e, 0x56, 0x62, 0xcf, 0x43, 0xb1, + 0x1e, 0xfd, 0xa8, 0x44, 0xe9, 0xd1, 0xb4, 0xfd, + 0x5d, 0xe7, 0xd1, 0xcb, 0xde, 0xa3, 0x35, 0x98, + 0xa3, 0xbb, 0xbf, 0x7c, 0xd9, 0xda, 0xd9, 0xfe, + 0x12, 0x72, 0x83, 0x98, 0xb5, 0x0b, 0x79, 0x43, + 0xb4, 0x15, 0xdd, 0xeb, 0x45, 0xb3, 0x60, 0x7e, + 0x4d, 0x7d, 0x76, 0x39, 0xda, 0xe9, 0xe2, 0x7d, + 0x80, 0x70, 0x56, 0xb2, 0xe5, 0x94, 0x91, 0xb4, + 0x46, 0xa4, 0x67, 0x38, 0x53, 0xc8, 0x71, 0x9d, + 0xeb, 0x16, 0x77, 0xd4, 0x8b, 0x3b, 0x68, 0x07, + 0x81, 0xb3, 0x01, 0x3d, 0xcd, 0x18, 0x3c, 0xce, + 0xc9, 0x8f, 0xdb, 0x83, 0x6e, 0xc0, 0x3a, 0x2d, + 0xf5, 0x66, 0x8b, 0xb8, 0x86, 0x0e, 0x9c, 0xe8, + 0xb5, 0x75, 0xf0, 0x84, 0x8c, 0xd0, 0xe2, 0x88, + 0x1a, 0xa7, 0x0e, 0xc3, 0x8c, 0xf5, 0x28, 0xdc, + 0x59, 0xeb, 0x08, 0xe3, 0x81, 0xf7, 0x98, 0x31, + 0xa2, 0x5b, 0xd0, 0xa7, 0x5c, 0x25, 0x72, 0x65, + 0xb8, 0x49, 0xd5, 0x80, 0xc6, 0xb4, 0x1c, 0x34, + 0xe3, 0x7b, 0xd1, 0xc3, 0xa8, 0xad, 0x42, 0x84, + 0xad, 0xd7, 0x6f, 0xd6, 0x49, 0x9f, 0xd0, 0x1d, + 0x75, 0xfe, 0x62, 0x67, 0x9d, 0x09, 0x7b, 0xce, + 0xc1, 0x55, 0xe2, 0xfa, 0x3f, 0xae, 0x2e, 0x21, + 0xda, 0x38, 0x81, 0x35, 0x46, 0xd3, 0xc3, 0xbf, + 0xba, 0x9c, 0x33, 0xc1, 0x11, 0x37, 0xd4, 0xb5, + 0x13, 0x7c, 0x1e, 0x50, 0x26, 0x5f, 0x20, 0xdf, + 0x93, 0x0c, 0x76, 0xf3, 0x4c, 0x52, 0x60, 0xe4, + 0x6a, 0xe7, 0x98, 0x3d, 0xc1, 0x3d, 0x69, 0x29, + 0x23, 0xaa, 0x5b, 0x41, 0xdd, 0x6d, 0xa9, 0x1a, + 0x7a, 0x23, 0x79, 0x1c, 0xde, 0x9a, 0x22, 0xe9, + 0x5d, 0x4c, 0x78, 0x06, 0x46, 0x77, 0xd8, 0x88, + 0x9a, 0x7f, 0x16, 0xbb, 0x3b, 0x4e, 0x7f, 0xc5, + 0xbc, 0xe3, 0x92, 0x80, 0x8e, 0x6c, 0x94, 0x2c, + 0x61, 0x1d, 0x00, 0xbe, 0x71, 0x03, 0xf7, 0xe6, + 0xe8, 0x4a, 0xfa, 0x0d, 0xd7, 0x0b, 0x2a, 0x56, + 0xa6, 0x8d, 0x69, 0xa3, 0xb8, 0x99, 0x7d, 0x99, + 0xfd, 0x09, 0xa3, 0xf7, 0xa2, 0xb1, 0x94, 0xdb, + 0xc8, 0xdd, 0x6f, 0xcd, 0x50, 0xbf, 0x2c, 0xfd, + 0x3a, 0x09, 0x79, 0xce, 0xe7, 0x76, 0xf6, 0xe7, + 0xec, 0x9b, 0x11, 0x17, 0x79, 0x17, 0xcb, 0x87, + 0x8b, 0xb9, 0xcd, 0x16, 0xdb, 0xeb, 0xd7, 0x24, + 0xef, 0x55, 0x27, 0x2f, 0x76, 0xdc, 0x09, 0xbb, + 0x7c, 0x9c, 0x4e, 0x4d, 0xed, 0x7d, 0x40, 0x14, + 0x5c, 0xce, 0xb8, 0x29, 0xf6, 0x55, 0x56, 0x10, + 0x35, 0x14, 0x52, 0xb9, 0xa2, 0x35, 0x46, 0x2c, + 0x55, 0x9d, 0x77, 0x1d, 0xf8, 0x8d, 0xbb, 0x83, + 0x7a, 0x18, 0x0c, 0x1d, 0x55, 0x7e, 0x64, 0x63, + 0xa7, 0x8c, 0x23, 0x24, 0xe2, 0x8c, 0x49, 0xe7, + 0x9c, 0xc7, 0xe8, 0x77, 0x40, 0xef, 0x9b, 0xd3, + 0xa5, 0xc6, 0x63, 0x79, 0xcc, 0xc5, 0x7f, 0x1d, + 0x31, 0xe6, 0xd8, 0x74, 0xb3, 0xb7, 0x32, 0xc6, + 0x51, 0x16, 0xe4, 0xb9, 0x86, 0xb1, 0x81, 0x93, + 0x37, 0x67, 0xcd, 0xd3, 0xe6, 0x90, 0x99, 0xf3, + 0xf9, 0xfb, 0x9e, 0x3b, 0xf0, 0x58, 0x5b, 0x86, + 0x0c, 0x3a, 0xd2, 0x1e, 0x93, 0xc7, 0x21, 0x66, + 0xbc, 0xd9, 0xf6, 0xdd, 0xdc, 0x66, 0x68, 0x35, + 0xc7, 0xf7, 0xbd, 0xa8, 0xdf, 0x27, 0x74, 0x56, + 0x42, 0x4f, 0x36, 0x65, 0x54, 0xd5, 0xd3, 0xc3, + 0xc4, 0xf8, 0x4d, 0x72, 0x96, 0xcd, 0xce, 0x60, + 0xb3, 0xea, 0xc7, 0x5e, 0x7a, 0x47, 0xc5, 0x08, + 0x8e, 0x71, 0x17, 0x99, 0xf0, 0x88, 0xd5, 0x67, + 0x1d, 0x16, 0x27, 0x5f, 0x73, 0x4a, 0x16, 0x64, + 0x31, 0x96, 0x88, 0xb5, 0x63, 0x27, 0x01, 0xeb, + 0x80, 0xa6, 0xaf, 0x1f, 0x7c, 0x01, 0x23, 0xf6, + 0xac, 0x15, 0xb4, 0xd4, 0x27, 0xf1, 0x92, 0xa4, + 0xa5, 0xdb, 0x8a, 0xc4, 0x91, 0x01, 0xb4, 0xe7, + 0x3a, 0xbd, 0xea, 0x1c, 0x83, 0x47, 0x49, 0x4f, + 0x07, 0x07, 0xce, 0xa5, 0x70, 0xaa, 0x34, 0xae, + 0xf2, 0x33, 0x99, 0xc7, 0xdc, 0xc4, 0xc8, 0x1b, + 0xe4, 0xcb, 0xe5, 0xcc, 0xc2, 0xd8, 0x49, 0xc2, + 0xb8, 0x53, 0x3d, 0xd5, 0x53, 0xa5, 0x0e, 0x99, + 0x99, 0x12, 0x94, 0x47, 0x9c, 0xca, 0x1e, 0xcc, + 0x95, 0x06, 0x2a, 0x08, 0x8f, 0x9b, 0x3e, 0x1a, + 0x4d, 0xaa, 0x16, 0x59, 0xc8, 0x18, 0x32, 0x6a, + 0x47, 0x92, 0x91, 0x66, 0x1f, 0x95, 0xbe, 0x2a, + 0x45, 0x9e, 0x44, 0xb6, 0xd2, 0x9d, 0x6f, 0x94, + 0x70, 0x63, 0xc6, 0x0c, 0xe4, 0xb1, 0xa1, 0x0a, + 0xaa, 0xae, 0x2d, 0xb2, 0x73, 0xc6, 0x84, 0x72, + 0xd6, 0xf8, 0x3f, 0x3f, 0xe1, 0x9e, 0x52, 0x3b, + 0xe2, 0xfc, 0xe0, 0x69, 0x77, 0x55, 0xf9, 0x06, + 0x3d, 0xeb, 0x0f, 0xe7, 0xe3, 0xf9, 0x70, 0xc0, + 0x15, 0x3c, 0x5e, 0x1b, 0x55, 0x7b, 0xe1, 0xb1, + 0x59, 0xe5, 0x9b, 0x15, 0xd4, 0xd4, 0x9d, 0x83, + 0xac, 0x51, 0x34, 0x43, 0x9e, 0x36, 0xe9, 0x2e, + 0x75, 0x05, 0xf3, 0xca, 0xe9, 0xc3, 0x6b, 0xc4, + 0x3a, 0x46, 0x65, 0x61, 0xce, 0x3b, 0x3e, 0xc1, + 0x6a, 0x14, 0xc6, 0xda, 0x90, 0x11, 0xe9, 0x4a, + 0x73, 0x26, 0xf7, 0x28, 0x2c, 0xf4, 0x39, 0xf0, + 0xf5, 0x2b, 0x72, 0xfb, 0xce, 0x59, 0x38, 0x33, + 0xf9, 0xab, 0xe3, 0xeb, 0xab, 0xca, 0x69, 0x63, + 0xc8, 0xfc, 0x88, 0xab, 0xd6, 0x0a, 0xc8, 0x18, + 0x8c, 0x9a, 0xf8, 0xff, 0xc5, 0xc3, 0xc9, 0xf0, + 0xe3, 0xbe, 0x0a, 0xa4, 0x24, 0x8d, 0x1c, 0x87, + 0xb4, 0x88, 0x1d, 0xdd, 0x2e, 0x1e, 0xdf, 0xd3, + 0xd0, 0x87, 0x32, 0x02, 0xf7, 0x11, 0x4f, 0xdb, + 0x3f, 0xd0, 0xa7, 0x8f, 0x85, 0x57, 0x88, 0x10, + 0x00, 0x7b, 0xc9, 0x8e, 0xfb, 0xd5, 0x40, 0x3b, + 0xac, 0x5c, 0xf4, 0x1c, 0xed, 0xbe, 0x0d, 0x63, + 0x0f, 0x75, 0xd0, 0x57, 0xd8, 0x80, 0xf3, 0x39, + 0x4f, 0x79, 0x68, 0x90, 0x71, 0x76, 0x04, 0xd7, + 0x93, 0x59, 0x2a, 0xf1, 0x26, 0x01, 0x7c, 0x13, + 0x89, 0xdf, 0x78, 0x95, 0x08, 0xbd, 0x80, 0x48, + 0x35, 0x24, 0xc7, 0xbb, 0xff, 0xa8, 0x0c, 0x2c, + 0x5b, 0xc8, 0xf3, 0x45, 0xed, 0x1f, 0x44, 0x83, + 0xfa, 0xfa, 0xc0, 0x01, 0x42, 0xe7, 0x43, 0x94, + 0x64, 0xe0, 0xac, 0x87, 0x28, 0x57, 0x98, 0x74, + 0xbe, 0x96, 0x7c, 0x8d, 0x50, 0x01, 0xe3, 0x40, + 0x8e, 0x80, 0x76, 0x29, 0xa3, 0x83, 0xd1, 0xff, + 0x0d, 0xc4, 0x6e, 0x21, 0x47, 0xee, 0x71, 0xac, + 0x4e, 0xb7, 0x9f, 0x84, 0x07, 0x9b, 0xe4, 0x0a, + 0xc3, 0x35, 0xf9, 0xca, 0x45, 0xab, 0x1b, 0x8b, + 0x12, 0x97, 0x17, 0x9d, 0x55, 0xdb, 0x61, 0x39, + 0xde, 0x7d, 0xdf, 0x5e, 0x34, 0xa1, 0xc0, 0xb3, + 0xa3, 0x8c, 0x9a, 0x51, 0x8b, 0xef, 0x08, 0xbc, + 0xa5, 0x13, 0xab, 0x82, 0x3b, 0x2f, 0x09, 0xe8, + 0xbb, 0xf4, 0xc2, 0xbd, 0xb5, 0x19, 0xfc, 0x59, + 0xdc, 0x93, 0x92, 0x3e, 0xfa, 0x2e, 0x59, 0x87, + 0x6c, 0x4f, 0xfa, 0xd8, 0xb9, 0x4f, 0x98, 0xc3, + 0x74, 0x87, 0x27, 0x02, 0x51, 0x1f, 0x46, 0x8c, + 0xe8, 0x4e, 0x9b, 0x8a, 0xc3, 0xbc, 0x7e, 0x2a, + 0x63, 0x56, 0x8a, 0x0a, 0x48, 0xf9, 0x30, 0x57, + 0x51, 0xc0, 0xa8, 0x00, 0xf2, 0x9f, 0xc6, 0x64, + 0x32, 0xf1, 0x3e, 0x87, 0xac, 0x2a, 0xc9, 0xcf, + 0x25, 0x03, 0x1f, 0xb0, 0xe2, 0xfa, 0x74, 0xd4, + 0x3b, 0xb5, 0xaf, 0x6b, 0x0d, 0xc8, 0xd6, 0xec, + 0x2f, 0xf6, 0x8d, 0xfd, 0x1e, 0x6d, 0x70, 0xcc, + 0xcb, 0x5c, 0xc8, 0xcb, 0xc8, 0x19, 0x1e, 0x19, + 0xb3, 0xf7, 0xe4, 0xfb, 0x56, 0xdc, 0xe2, 0x2a, + 0x82, 0xfe, 0xa3, 0x18, 0x8b, 0xdc, 0xe0, 0x0e, + 0x19, 0x47, 0xf7, 0x48, 0x93, 0x82, 0xd7, 0xbd, + 0xa7, 0xd1, 0x61, 0x8c, 0x0d, 0x19, 0x71, 0xd8, + 0x55, 0x32, 0x61, 0xdf, 0xef, 0x95, 0x8f, 0xc9, + 0x08, 0x31, 0x04, 0x6f, 0x41, 0xdc, 0x3c, 0x7b, + 0x3c, 0x64, 0x62, 0xdc, 0x12, 0x85, 0xac, 0x6b, + 0xe6, 0x78, 0x8d, 0xb0, 0x01, 0x32, 0xf5, 0xd9, + 0x6f, 0x51, 0x96, 0x27, 0x90, 0xaa, 0xed, 0x8c, + 0xa3, 0xda, 0xeb, 0xda, 0x1a, 0xd3, 0x0f, 0x3a, + 0xde, 0x49, 0xb0, 0x2a, 0x29, 0xc8, 0xea, 0xb0, + 0x46, 0x50, 0xdd, 0xcd, 0x52, 0x2d, 0x4d, 0x56, + 0x72, 0xfe, 0x5a, 0x37, 0x04, 0x6b, 0xcd, 0x92, + 0xb7, 0xda, 0x84, 0x29, 0x0f, 0xe2, 0xfd, 0xdf, + 0x08, 0xec, 0xf6, 0xa3, 0x07, 0x89, 0xfd, 0x6b, + 0xce, 0x45, 0xe9, 0xf2, 0x7b, 0xec, 0x94, 0x8d, + 0xcb, 0x71, 0x4b, 0x6d, 0xcc, 0x77, 0xea, 0xde, + 0x5c, 0x51, 0x15, 0x67, 0x1f, 0x6e, 0x1f, 0x69, + 0xba, 0xe7, 0xdc, 0x43, 0xbf, 0x56, 0x00, 0x91, + 0x24, 0x7c, 0xbe, 0x09, 0x39, 0x2b, 0xdf, 0xc1, + 0x59, 0x48, 0x4a, 0x09, 0xdd, 0x1c, 0xf6, 0x54, + 0x1b, 0xe3, 0xde, 0x38, 0x9e, 0x2b, 0x2b, 0x6a, + 0xc4, 0x8d, 0xee, 0xb9, 0xe2, 0xdd, 0x18, 0xce, + 0x40, 0xea, 0x71, 0x7b, 0x6b, 0xf6, 0x44, 0x50, + 0xd6, 0x5a, 0x0f, 0x8f, 0xa1, 0xd3, 0x49, 0xef, + 0xc4, 0x57, 0x5f, 0xc1, 0x3a, 0x8d, 0x3e, 0xa2, + 0xb1, 0x96, 0xe7, 0x21, 0x4a, 0x9d, 0xd6, 0x2f, + 0xdd, 0x2b, 0xfa, 0x0d, 0x8c, 0x9e, 0x5c, 0x72, + 0x2a, 0x11, 0xae, 0x3a, 0x0f, 0xa4, 0x84, 0x94, + 0x70, 0xc6, 0x85, 0x0e, 0x6e, 0x53, 0x8f, 0x1b, + 0xe1, 0x57, 0xb1, 0x77, 0xbb, 0x46, 0x18, 0x91, + 0x6c, 0x96, 0xf6, 0x72, 0x9d, 0xbc, 0xb1, 0x04, + 0xa9, 0xd6, 0x92, 0x58, 0x98, 0x61, 0xf6, 0x1c, + 0x42, 0xa5, 0x19, 0xac, 0xbf, 0xb1, 0x11, 0xa9, + 0x42, 0xf5, 0x3a, 0xee, 0x3b, 0x3c, 0x42, 0xbe, + 0x75, 0x7e, 0x07, 0xa7, 0xab, 0x75, 0xdf, 0x8b, + 0xbb, 0xc6, 0xfa, 0xc2, 0x88, 0x1b, 0x42, 0x66, + 0xab, 0x3d, 0xc3, 0x94, 0x03, 0xff, 0xd1, 0x6b, + 0x86, 0x76, 0xb4, 0xe8, 0xac, 0x34, 0x96, 0xdd, + 0x05, 0xe3, 0xc6, 0xd6, 0xd2, 0xbb, 0x45, 0x43, + 0x63, 0x5b, 0x58, 0x07, 0x96, 0xf3, 0x70, 0x56, + 0x77, 0xe5, 0x80, 0x9b, 0x97, 0x89, 0xdf, 0x6a, + 0xe5, 0xb1, 0xab, 0x27, 0x73, 0x77, 0xc2, 0x20, + 0x5b, 0x45, 0x55, 0xe2, 0x46, 0x11, 0xe2, 0xc2, + 0xb9, 0x63, 0x58, 0xc1, 0x05, 0xb5, 0xcd, 0x99, + 0x4f, 0x7f, 0x70, 0xfc, 0xae, 0x78, 0x97, 0x2d, + 0xc0, 0x79, 0x5f, 0x82, 0x97, 0xd1, 0x43, 0xbc, + 0xa1, 0x42, 0xec, 0x5c, 0x29, 0xd8, 0x0b, 0xaa, + 0x54, 0xee, 0x30, 0x8b, 0xcd, 0x15, 0x87, 0xe2, + 0xab, 0x86, 0x42, 0x3e, 0x5c, 0xc1, 0x03, 0xa1, + 0xf1, 0xf4, 0x20, 0x6a, 0x9f, 0xd3, 0x70, 0xa4, + 0xa7, 0x52, 0x5e, 0x3d, 0x47, 0x9e, 0x39, 0x22, + 0x7f, 0x97, 0xa3, 0x80, 0xf1, 0xfd, 0xbf, 0x60, + 0x5e, 0xbc, 0x8e, 0x68, 0x51, 0x29, 0x95, 0xf3, + 0xf6, 0x85, 0x63, 0x69, 0x3b, 0xf1, 0x5d, 0xf4, + 0x65, 0xc6, 0xf9, 0x93, 0x14, 0x72, 0x91, 0x5f, + 0x91, 0xb5, 0x20, 0xae, 0x2b, 0x73, 0x8d, 0x14, + 0xae, 0x62, 0xf3, 0x00, 0x56, 0x92, 0x7f, 0x3b, + 0xde, 0x30, 0x3f, 0x77, 0x98, 0xb9, 0x61, 0x3f, + 0xb3, 0x6f, 0x1d, 0xeb, 0xdc, 0x2d, 0x08, 0x3f, + 0xb3, 0x52, 0xd0, 0x33, 0x5e, 0x14, 0x83, 0xea, + 0xec, 0x92, 0x73, 0xd6, 0x78, 0x4a, 0x0a, 0x84, + 0x41, 0x76, 0xcd, 0x58, 0x74, 0x34, 0x38, 0x4b, + 0xd7, 0xda, 0x8b, 0xec, 0xfc, 0xfb, 0x6b, 0xed, + 0x05, 0x7d, 0xc1, 0x5d, 0xdc, 0xcc, 0xfe, 0xfc, + 0x28, 0xd9, 0xcf, 0x89, 0x53, 0xb4, 0xa2, 0xb6, + 0xec, 0x64, 0xed, 0x0b, 0x76, 0x56, 0x9b, 0xd7, + 0x56, 0xaa, 0x30, 0x9e, 0x1b, 0x53, 0x0a, 0xfa, + 0x10, 0x2d, 0xdb, 0x7f, 0xb3, 0x97, 0x51, 0x27, + 0xce, 0xce, 0x68, 0x78, 0xcc, 0xb4, 0x96, 0x5e, + 0x41, 0x6c, 0xa6, 0xaf, 0xc0, 0x07, 0xf8, 0x7f, + 0x0e, 0xba, 0x99, 0x67, 0xbd, 0x03, 0x6b, 0xd5, + 0x10, 0x8b, 0xe6, 0xba, 0x7a, 0x8c, 0x5f, 0xc1, + 0xa7, 0xfc, 0xbc, 0xc5, 0xe8, 0x3f, 0xf4, 0x47, + 0xd1, 0x09, 0x3b, 0x7d, 0x72, 0x65, 0xef, 0xcf, + 0xd9, 0xa7, 0x91, 0x11, 0x58, 0x1f, 0xf0, 0xd8, + 0x5f, 0x93, 0xed, 0x27, 0xc2, 0x80, 0xd3, 0x55, + 0x5e, 0xc2, 0x99, 0x80, 0x6b, 0xd2, 0x8a, 0x80, + 0xd5, 0xab, 0x07, 0x1e, 0x4b, 0xc4, 0x77, 0xcf, + 0xe1, 0x8f, 0xd6, 0xa8, 0x5f, 0x1e, 0x65, 0x63, + 0x90, 0x79, 0x7d, 0xeb, 0x3d, 0x7a, 0x95, 0xfb, + 0xe3, 0x38, 0x61, 0xc8, 0x2e, 0xd0, 0x13, 0xe7, + 0x14, 0x29, 0x41, 0x26, 0x20, 0x0f, 0x51, 0x25, + 0x9e, 0x89, 0xa0, 0xaf, 0xe1, 0xba, 0xcc, 0x1a, + 0x35, 0x17, 0x11, 0x1a, 0x3f, 0x10, 0x4a, 0x03, + 0x91, 0xaa, 0x23, 0x1e, 0xff, 0xb7, 0xab, 0xb6, + 0xda, 0x1d, 0xb1, 0xdd, 0x38, 0x68, 0xd5, 0x45, + 0x27, 0x4e, 0xba, 0xff, 0x6e, 0x75, 0x73, 0x16, + 0x6f, 0xdf, 0xe1, 0xff, 0xf9, 0x43, 0xd8, 0x8f, + 0x28, 0x20, 0x53, 0xc6, 0x0e, 0x32, 0x9c, 0x8f, + 0xa8, 0x54, 0x3c, 0x26, 0xef, 0xbd, 0x16, 0x8d, + 0x49, 0xd9, 0xff, 0xc6, 0x41, 0xf9, 0xdb, 0x8e, + 0x03, 0xd5, 0xa4, 0x8f, 0xf6, 0xe7, 0x9e, 0x4d, + 0x90, 0xb5, 0xc1, 0xd8, 0x38, 0xae, 0xd9, 0x21, + 0x7b, 0xd1, 0x3e, 0x77, 0x3c, 0x2e, 0x8d, 0x48, + 0x4f, 0x3d, 0x2f, 0x7b, 0x74, 0x81, 0xdf, 0x84, + 0x99, 0x8a, 0x1d, 0x84, 0xcd, 0xf2, 0xa6, 0xb1, + 0xc9, 0x76, 0xbc, 0x18, 0x49, 0xd1, 0xe7, 0xea, + 0xd7, 0x60, 0x06, 0xcd, 0xb4, 0xd3, 0x18, 0xf3, + 0xbb, 0x35, 0xe4, 0x97, 0x6f, 0x46, 0x7f, 0x8e, + 0xee, 0xc5, 0x93, 0x1e, 0x0a, 0x4e, 0x5f, 0x6e, + 0x67, 0x74, 0xac, 0x32, 0x64, 0x84, 0xf9, 0x76, + 0x56, 0xfe, 0xb8, 0x53, 0x25, 0xc6, 0x6a, 0xc0, + 0x34, 0xf1, 0xe1, 0xb0, 0x1a, 0x80, 0xfe, 0x94, + 0x63, 0x1c, 0x25, 0xd3, 0x59, 0x73, 0xe6, 0x5d, + 0xe4, 0x58, 0xa0, 0x0e, 0xe1, 0xc7, 0xb0, 0x2a, + 0xc8, 0x87, 0x5d, 0xbf, 0x36, 0x85, 0x72, 0x0d, + 0x5a, 0x45, 0x85, 0x01, 0x37, 0x2a, 0xc5, 0x61, + 0x27, 0x80, 0xf8, 0x5f, 0x5d, 0x53, 0xef, 0x7a, + 0x7a, 0x7d, 0xe8, 0x67, 0x94, 0xc7, 0x3e, 0x82, + 0x8c, 0xfe, 0x49, 0xcf, 0x7b, 0x10, 0xa1, 0xe4, + 0x68, 0xcc, 0x6a, 0x46, 0x56, 0x59, 0x30, 0xfe, + 0xed, 0xa7, 0x7e, 0x0c, 0xfd, 0x49, 0x27, 0x9a, + 0xc7, 0x61, 0xb1, 0x8f, 0xfd, 0xed, 0xaf, 0x83, + 0xa8, 0xfe, 0xd1, 0x55, 0xa9, 0xf1, 0xab, 0x88, + 0x27, 0x15, 0x27, 0x38, 0x6a, 0x15, 0x62, 0x53, + 0x85, 0x2b, 0x7a, 0x95, 0xa8, 0x0a, 0x73, 0x91, + 0x71, 0x4c, 0x51, 0x16, 0xad, 0x6f, 0x20, 0x5f, + 0xb8, 0xba, 0x27, 0x7b, 0xd5, 0x69, 0xc4, 0xb2, + 0x05, 0x9c, 0x3c, 0x8c, 0xc6, 0x82, 0x14, 0xb4, + 0x49, 0x21, 0x76, 0x7f, 0x56, 0x2d, 0xa4, 0xb8, + 0xc6, 0x51, 0x48, 0x80, 0x88, 0xcd, 0x3d, 0xa7, + 0x4f, 0xea, 0x93, 0xd5, 0x05, 0x98, 0x0d, 0x58, + 0xf9, 0xf4, 0x6a, 0xf5, 0xf5, 0x48, 0x7b, 0x54, + 0xe7, 0xac, 0x89, 0x95, 0xfa, 0xe5, 0xe3, 0x2b, + 0xdb, 0xf7, 0x0e, 0xbe, 0xd8, 0x8e, 0xec, 0x8f, + 0x2a, 0xa4, 0x66, 0x20, 0x70, 0x64, 0x3a, 0xde, + 0xf2, 0x5d, 0x88, 0x72, 0xc7, 0x5d, 0xd4, 0xeb, + 0x4b, 0xef, 0x49, 0x66, 0xa4, 0x7a, 0x92, 0x57, + 0x0e, 0x57, 0xe1, 0x75, 0x4c, 0xdb, 0xd5, 0x62, + 0x3f, 0x47, 0xef, 0x5e, 0x17, 0x61, 0x3e, 0x68, + 0xf7, 0xed, 0x07, 0xf2, 0x68, 0x0e, 0xc6, 0x96, + 0xd8, 0xab, 0x9a, 0x88, 0x48, 0xc9, 0xa4, 0x99, + 0x34, 0xd3, 0xb8, 0x66, 0xc1, 0x0a, 0xc2, 0x23, + 0x19, 0xae, 0x07, 0x9c, 0x7e, 0x27, 0x3f, 0x82, + 0xcc, 0x05, 0xb9, 0x35, 0xf0, 0xef, 0x17, 0x98, + 0x6a, 0xeb, 0xb9, 0x7e, 0x4f, 0xbd, 0x80, 0xd3, + 0x65, 0xf0, 0xa7, 0x4f, 0x30, 0xe5, 0x7b, 0xf7, + 0xfe, 0x6e, 0x45, 0x8e, 0xab, 0x91, 0x70, 0x8d, + 0x75, 0x95, 0xb4, 0x48, 0xba, 0x7a, 0xd7, 0xaa, + 0x92, 0x56, 0xe2, 0xd5, 0xcf, 0x2d, 0x15, 0x56, + 0x16, 0x41, 0x4b, 0xbb, 0xe3, 0xb0, 0xea, 0x2c, + 0x28, 0x9f, 0x2b, 0xeb, 0xca, 0x9d, 0x32, 0xe1, + 0x81, 0x77, 0xbe, 0xb5, 0xfe, 0x43, 0xb9, 0xef, + 0xfc, 0xb1, 0xf5, 0x47, 0x38, 0xbe, 0x72, 0xee, + 0xb3, 0x67, 0xd5, 0xe0, 0x41, 0xd0, 0x0e, 0xbc, + 0xa1, 0x47, 0x73, 0x03, 0xcd, 0x5d, 0x01, 0x9d, + 0x2e, 0xf1, 0x56, 0x3c, 0xca, 0xe0, 0xff, 0xf3, + 0xd0, 0x1d, 0x1c, 0xaf, 0xc2, 0x75, 0x11, 0x21, + 0x4e, 0x69, 0x63, 0xad, 0xd3, 0xeb, 0x97, 0x37, + 0xfd, 0x1a, 0x85, 0xa0, 0x17, 0xdc, 0x0c, 0x76, + 0xbb, 0x0c, 0x74, 0x8d, 0x3f, 0xab, 0x54, 0x8d, + 0x90, 0x39, 0xe5, 0x77, 0x3d, 0x76, 0x3e, 0x6d, + 0x2a, 0x2c, 0x43, 0xe8, 0x0d, 0x88, 0x1a, 0xf1, + 0x79, 0x25, 0xa5, 0xa4, 0xe4, 0xf9, 0x4c, 0x51, + 0x75, 0xd5, 0x9c, 0x67, 0xf9, 0x0a, 0xec, 0xe7, + 0x39, 0xb8, 0xb7, 0xe7, 0x55, 0xac, 0x15, 0xdd, + 0xc5, 0x2b, 0x98, 0x9c, 0x41, 0x8c, 0xa8, 0x1b, + 0x54, 0x82, 0xce, 0x33, 0x52, 0x09, 0x8d, 0x93, + 0xcb, 0x45, 0x67, 0xfe, 0xba, 0x23, 0x4a, 0x55, + 0x97, 0x3a, 0xae, 0x0e, 0x05, 0xd8, 0x37, 0x86, + 0x20, 0x46, 0x1e, 0xec, 0xa8, 0x90, 0x75, 0xb5, + 0x99, 0xfb, 0x71, 0x6e, 0xfe, 0xc8, 0xe7, 0xfb, + 0xe2, 0x1f, 0x9e, 0xa0, 0xef, 0x22, 0x9d, 0x5d, + 0x8a, 0x18, 0xa9, 0x1a, 0x90, 0x8f, 0x1d, 0x65, + 0xb4, 0x47, 0x90, 0x51, 0x92, 0x8a, 0x6f, 0x23, + 0xa5, 0x24, 0xd5, 0xb3, 0x6a, 0xa5, 0xe3, 0xba, + 0xc5, 0x5f, 0xf5, 0xaf, 0xbf, 0xf2, 0xdc, 0x91, + 0x23, 0x16, 0x3c, 0xdf, 0xd2, 0x2a, 0xf6, 0x40, + 0x8b, 0x46, 0xa8, 0x0c, 0xf7, 0x2c, 0x54, 0x0a, + 0x51, 0x26, 0x32, 0xad, 0x7f, 0xa2, 0xf7, 0x63, + 0x12, 0x20, 0xdf, 0x66, 0xaa, 0x46, 0x3c, 0x69, + 0x4f, 0xfb, 0x9d, 0xfb, 0x67, 0xe2, 0x9e, 0x1c, + 0x11, 0xa6, 0x9d, 0x9b, 0x82, 0x3f, 0x42, 0x3a, + 0xdc, 0x43, 0x64, 0xf8, 0x11, 0x86, 0x2d, 0x71, + 0x98, 0x90, 0xe9, 0x16, 0x2f, 0xfe, 0x4b, 0x21, + 0x6e, 0x38, 0x1f, 0x57, 0x71, 0x1d, 0x55, 0xb0, + 0x34, 0x77, 0xdd, 0xda, 0x75, 0x24, 0x2b, 0xee, + 0x44, 0xad, 0x8c, 0x4b, 0xca, 0xf0, 0xca, 0x75, + 0x2d, 0x60, 0xbf, 0xa8, 0x08, 0xca, 0x8a, 0x3b, + 0x58, 0xb9, 0x56, 0x09, 0xd8, 0xd7, 0xf6, 0x17, + 0x94, 0x45, 0x85, 0x63, 0xa8, 0x66, 0x61, 0xb5, + 0x4e, 0x1f, 0xdc, 0xde, 0x59, 0x3e, 0xcc, 0x1e, + 0x8e, 0xb8, 0xe8, 0xfc, 0x92, 0x81, 0xdf, 0x6f, + 0x19, 0x25, 0x77, 0x4b, 0xef, 0x46, 0x8c, 0x32, + 0x39, 0x5c, 0xa5, 0xc4, 0xef, 0x1d, 0xc8, 0xc3, + 0x10, 0x07, 0xc7, 0x72, 0x5e, 0xc7, 0x24, 0x6e, + 0x46, 0x5f, 0x73, 0x15, 0xb2, 0x9a, 0x18, 0xfa, + 0x6e, 0x71, 0xf3, 0xdc, 0xe6, 0xf8, 0x77, 0x23, + 0xe2, 0xd3, 0x70, 0x57, 0x85, 0x3b, 0xee, 0x6b, + 0x0d, 0xbd, 0x7e, 0x90, 0x7c, 0xe0, 0x74, 0xb4, + 0x86, 0xa4, 0xa2, 0x89, 0x08, 0x18, 0xff, 0x08, + 0x62, 0x87, 0x12, 0x6e, 0xb7, 0xa5, 0x09, 0xae, + 0xec, 0xe1, 0x8c, 0xb2, 0xbf, 0xc2, 0x7a, 0x31, + 0xe9, 0xa8, 0x34, 0xcb, 0x29, 0x5e, 0x75, 0xef, + 0x97, 0x28, 0x87, 0x85, 0xd5, 0x62, 0xa7, 0xf5, + 0x85, 0x0d, 0x91, 0xf9, 0xc1, 0x2e, 0xfb, 0xd2, + 0xd9, 0xb4, 0xbf, 0xb0, 0x5f, 0xc8, 0x37, 0xad, + 0xe0, 0xb6, 0x58, 0x12, 0x7a, 0x54, 0x2a, 0x10, + 0xe3, 0x93, 0x31, 0x97, 0x8f, 0xa7, 0x25, 0x3c, + 0xe0, 0x96, 0xec, 0x8d, 0x81, 0x63, 0xda, 0xf5, + 0x16, 0xdf, 0xed, 0x3c, 0x3d, 0x8c, 0x9e, 0xfe, + 0x60, 0xc1, 0xcd, 0xda, 0xc5, 0x5c, 0xd6, 0x43, + 0xee, 0xf9, 0x68, 0x96, 0x38, 0xd6, 0xd3, 0x8d, + 0xb8, 0x5b, 0xb0, 0x16, 0xad, 0x02, 0x9c, 0xe3, + 0x82, 0x25, 0x39, 0x35, 0x88, 0xae, 0xf9, 0x79, + 0xf6, 0xfc, 0x61, 0xeb, 0xf3, 0xee, 0x34, 0xc4, + 0x48, 0x21, 0x79, 0xd8, 0x1a, 0x2a, 0xc3, 0x6c, + 0x31, 0xa6, 0xcd, 0x39, 0xc9, 0xaf, 0x34, 0x08, + 0x27, 0xfe, 0xf3, 0xeb, 0xe9, 0xdd, 0x55, 0x25, + 0x8a, 0xbd, 0xa4, 0x95, 0x58, 0x13, 0x7f, 0x66, + 0xc4, 0x0c, 0xe7, 0xef, 0x43, 0x56, 0x2b, 0x30, + 0xdf, 0xeb, 0x32, 0x4d, 0x60, 0xad, 0x80, 0x75, + 0x36, 0x5e, 0xe1, 0xee, 0xb1, 0xe4, 0x0d, 0x0c, + 0x33, 0x05, 0x46, 0xc1, 0x73, 0xdf, 0xc3, 0x02, + 0xb2, 0xfd, 0x4e, 0x76, 0x2c, 0x48, 0xf4, 0xea, + 0x9a, 0xb4, 0x6e, 0x9e, 0xc5, 0xea, 0x3f, 0x44, + 0x8c, 0x83, 0x2d, 0xdf, 0x6f, 0x11, 0xf6, 0x56, + 0x61, 0x16, 0xb9, 0xb6, 0xf8, 0x5b, 0x79, 0xf6, + 0xc9, 0xea, 0xd6, 0xb8, 0x91, 0x30, 0x32, 0xdb, + 0xb7, 0xf7, 0x7a, 0x34, 0x42, 0x61, 0xb4, 0xce, + 0x6a, 0x0b, 0xda, 0x74, 0x77, 0xd4, 0x26, 0xf9, + 0x2b, 0x87, 0xa8, 0x0a, 0xc4, 0x6f, 0x05, 0x88, + 0xdf, 0x87, 0x94, 0x11, 0x65, 0xdc, 0x2d, 0x77, + 0xf4, 0x90, 0x7d, 0x3c, 0x67, 0xf7, 0xe6, 0x63, + 0x8a, 0xba, 0x98, 0xde, 0x93, 0xe8, 0x5e, 0xb8, + 0xba, 0x3a, 0x64, 0x30, 0xfa, 0xba, 0x9e, 0xc5, + 0x4e, 0x2a, 0xf9, 0x57, 0x0d, 0xc2, 0xff, 0x11, + 0x4b, 0x62, 0x29, 0x9c, 0x47, 0xc5, 0xc7, 0xff, + 0x3f, 0x65, 0x4b, 0xea, 0xe3, 0xa1, 0xb3, 0x21, + 0xf9, 0x77, 0xa8, 0x54, 0x39, 0x91, 0x1d, 0x45, + 0xe8, 0x5f, 0xbd, 0x65, 0x33, 0xdd, 0x8a, 0x1c, + 0x44, 0x1b, 0xaa, 0xb5, 0x62, 0xea, 0x7b, 0xe8, + 0x09, 0xd2, 0x71, 0x07, 0x16, 0x70, 0xd7, 0xe8, + 0x1e, 0x5e, 0x56, 0x9e, 0x1c, 0x3e, 0xe2, 0xdd, + 0x85, 0x5c, 0x8f, 0x9e, 0x3c, 0xc5, 0x41, 0x3c, + 0x2b, 0x4f, 0x85, 0x8e, 0xa8, 0x62, 0x83, 0x3d, + 0x0b, 0x97, 0x72, 0x76, 0x38, 0x1f, 0x11, 0x97, + 0xbf, 0x2f, 0xd6, 0x06, 0xce, 0xc8, 0x03, 0x72, + 0xd0, 0x0a, 0xcb, 0xb9, 0x72, 0x3f, 0x6a, 0x88, + 0x6b, 0xa1, 0xd7, 0x5a, 0xc2, 0x36, 0x6a, 0xa1, + 0xa3, 0x46, 0x44, 0xaf, 0x7f, 0x37, 0x56, 0x98, + 0xb1, 0xd6, 0xa7, 0x96, 0xe6, 0xb7, 0x30, 0x6e, + 0x92, 0xea, 0xa8, 0xd9, 0x97, 0xc1, 0xdb, 0x6b, + 0x8e, 0xf9, 0x8c, 0x18, 0xbb, 0x77, 0x07, 0x9d, + 0xa1, 0xb7, 0xc3, 0xce, 0xc4, 0xdb, 0xab, 0xdb, + 0x5f, 0xbc, 0x85, 0xc7, 0xdf, 0xc6, 0xb6, 0xa3, + 0x5b, 0x5e, 0x96, 0x5a, 0x7f, 0x01, 0x3b, 0xf2, + 0x90, 0x22, 0x1f, 0x24, 0xed, 0x4b, 0xf6, 0x43, + 0xcc, 0x49, 0x55, 0x18, 0x97, 0x65, 0xde, 0x99, + 0xba, 0x25, 0x6e, 0xee, 0xc7, 0x8d, 0x99, 0x16, + 0xf7, 0x76, 0xf1, 0x2b, 0x96, 0x03, 0x1e, 0xc7, + 0x33, 0xac, 0xa3, 0xca, 0xdb, 0x72, 0xab, 0x74, + 0x1c, 0x92, 0x62, 0x39, 0xa1, 0xde, 0xfd, 0xcc, + 0x90, 0x45, 0xc8, 0x57, 0x5d, 0x64, 0xf7, 0x33, + 0xf8, 0x7c, 0xe8, 0x27, 0x70, 0x87, 0x14, 0x5f, + 0x3f, 0xe6, 0x67, 0x03, 0x7b, 0xec, 0x6d, 0x74, + 0x6c, 0x21, 0x55, 0xb6, 0xef, 0xa4, 0x97, 0x23, + 0xe1, 0x4a, 0x4f, 0xad, 0x8f, 0x46, 0x64, 0x5d, + 0x21, 0x3d, 0x28, 0xae, 0x1f, 0xe2, 0x21, 0xb6, + 0xeb, 0x5d, 0x7d, 0x06, 0x9e, 0x55, 0xa1, 0x0f, + 0xf7, 0x07, 0x08, 0xab, 0xc6, 0x0b, 0xf2, 0xdb, + 0x83, 0x15, 0x49, 0xae, 0x34, 0x22, 0x46, 0x82, + 0x25, 0xe2, 0xe3, 0xf1, 0x1c, 0xfa, 0x6a, 0xe5, + 0xa2, 0x5a, 0xcc, 0xfe, 0xa1, 0x31, 0xea, 0x26, + 0x1a, 0xe7, 0x72, 0x31, 0x63, 0x82, 0x7d, 0xb7, + 0x97, 0x14, 0x12, 0x2c, 0xbe, 0xbf, 0xb2, 0x4f, + 0x55, 0x62, 0x2d, 0xf1, 0x2e, 0xf1, 0xe4, 0xc6, + 0xce, 0xc5, 0xc6, 0x95, 0xc6, 0xbf, 0x19, 0x90, + 0xed, 0x99, 0x49, 0x71, 0x96, 0xa9, 0xfb, 0x6c, + 0x9f, 0xeb, 0x40, 0x66, 0xf5, 0xa5, 0x1d, 0xde, + 0x6d, 0x3d, 0xe7, 0x4c, 0xa2, 0x36, 0x7f, 0x87, + 0xc3, 0x8b, 0x5a, 0x9d, 0x7e, 0x44, 0x21, 0x56, + 0x79, 0x6d, 0xa3, 0x47, 0x13, 0x15, 0x59, 0x06, + 0x0d, 0x09, 0xab, 0xfc, 0xf6, 0x75, 0x7b, 0xe8, + 0xf5, 0x1d, 0x29, 0x2b, 0x75, 0x7b, 0x4f, 0xde, + 0xca, 0xdf, 0x26, 0xe1, 0x31, 0xf2, 0x03, 0x89, + 0x08, 0x13, 0x42, 0xdc, 0xeb, 0x88, 0xf1, 0x59, + 0x92, 0xaa, 0x4c, 0x90, 0xea, 0x2f, 0x66, 0xb2, + 0xbd, 0x71, 0xbb, 0x9f, 0xcb, 0xe1, 0xcf, 0x8d, + 0xfd, 0xab, 0x6f, 0xb1, 0x13, 0xda, 0xf5, 0xc5, + 0xe3, 0x6a, 0x15, 0xe3, 0xca, 0x25, 0xfd, 0x92, + 0xf2, 0x31, 0xc4, 0x29, 0xb4, 0x8e, 0xd9, 0x31, + 0x6f, 0x8d, 0x95, 0x1b, 0xb0, 0xe3, 0xda, 0xc8, + 0x86, 0x9e, 0x47, 0xc6, 0x1d, 0xa1, 0x3d, 0x67, + 0xd9, 0x6c, 0x6e, 0xfd, 0xf0, 0x8b, 0x70, 0xbf, + 0xd6, 0xee, 0x1c, 0xdb, 0xb5, 0xa3, 0xaf, 0x26, + 0x93, 0x57, 0xa4, 0x2b, 0xd2, 0x7d, 0xc9, 0x5f, + 0x09, 0xc3, 0x77, 0xa3, 0x95, 0x17, 0xa5, 0x00, + 0x32, 0x85, 0xf4, 0xc2, 0x5d, 0xc8, 0xd1, 0xf4, + 0x4c, 0x89, 0x23, 0x8e, 0x04, 0xb3, 0x80, 0x1a, + 0x7c, 0x72, 0x5e, 0x99, 0x4d, 0xce, 0xbe, 0x5a, + 0xdd, 0x9e, 0xd5, 0x66, 0xb7, 0x66, 0x5f, 0x75, + 0xd8, 0x3a, 0x0d, 0xc4, 0xb1, 0x2c, 0xc2, 0xaa, + 0xbf, 0xe8, 0x66, 0x85, 0xeb, 0x4e, 0x56, 0x80, + 0x9f, 0xad, 0xec, 0xc1, 0xd2, 0xe1, 0xbf, 0x23, + 0xe3, 0xa6, 0xce, 0xc7, 0x5a, 0xd4, 0xea, 0x51, + 0xa7, 0xb6, 0xa2, 0xe5, 0x99, 0x03, 0xaa, 0x7b, + 0xa3, 0xe7, 0x29, 0xcc, 0xde, 0xa0, 0x73, 0xdd, + 0xf7, 0x6c, 0x32, 0xae, 0x1b, 0xc1, 0xcd, 0xe0, + 0xcb, 0x33, 0x9e, 0xfb, 0xa4, 0x08, 0xff, 0x36, + 0x54, 0x1f, 0x6c, 0x72, 0x7d, 0x67, 0x3a, 0x37, + 0x1c, 0xe9, 0x76, 0xa2, 0xd2, 0xab, 0x78, 0xa8, + 0x56, 0x4c, 0x37, 0xd3, 0xae, 0xd7, 0xc1, 0x27, + 0xa5, 0x29, 0xea, 0xe0, 0x0b, 0xcf, 0x04, 0x5a, + 0x6b, 0xc5, 0xa8, 0xf8, 0x11, 0xa1, 0x0e, 0xb8, + 0x63, 0x26, 0xe7, 0xb8, 0x4f, 0xb0, 0xef, 0x79, + 0xad, 0x09, 0x95, 0x11, 0xbc, 0xe8, 0x8b, 0x7f, + 0xea, 0x38, 0xa9, 0x75, 0x71, 0x4e, 0x4e, 0xcd, + 0x43, 0x0d, 0x11, 0xfb, 0x9b, 0x3a, 0xad, 0xe3, + 0x0c, 0xc6, 0x8d, 0xb0, 0x28, 0x2c, 0x40, 0x6e, + 0x19, 0x12, 0x43, 0xa2, 0xe4, 0xfa, 0x8e, 0x4e, + 0x6b, 0x2c, 0x63, 0x64, 0xf4, 0x01, 0x27, 0x26, + 0x61, 0x4d, 0x45, 0x2d, 0xab, 0xe5, 0x75, 0x8b, + 0xae, 0x82, 0x22, 0x35, 0x87, 0xa5, 0xb5, 0x5c, + 0xa6, 0x99, 0x69, 0x05, 0x5b, 0xd1, 0x03, 0xf2, + 0x74, 0x81, 0xf1, 0xce, 0xf6, 0x8c, 0x3a, 0xcf, + 0x25, 0x39, 0xe3, 0xea, 0x2c, 0x64, 0xad, 0x3c, + 0x22, 0xec, 0x2a, 0x87, 0x73, 0x3d, 0xf3, 0x88, + 0x16, 0xc9, 0x4d, 0x2b, 0xab, 0xce, 0x37, 0xe6, + 0xac, 0x31, 0x6b, 0xcc, 0x29, 0x05, 0x63, 0x96, + 0x34, 0xe7, 0x73, 0xf0, 0xae, 0x5f, 0x43, 0xcc, + 0x85, 0xef, 0x36, 0xff, 0xf7, 0x10, 0xf1, 0xfc, + 0x06, 0x75, 0xe9, 0x68, 0x40, 0xce, 0x4b, 0x5d, + 0x04, 0xec, 0xef, 0x44, 0xf5, 0x2b, 0xbd, 0x5a, + 0xca, 0xbd, 0xaa, 0x79, 0x9d, 0xf7, 0x25, 0x1d, + 0x3f, 0xf4, 0xe7, 0xa6, 0xc3, 0x15, 0xc4, 0x10, + 0x21, 0x6c, 0x20, 0xad, 0x87, 0xe7, 0x4a, 0x88, + 0x06, 0x6d, 0x8c, 0xfd, 0x22, 0x37, 0x72, 0x8d, + 0x2f, 0x7f, 0xc1, 0x7a, 0x15, 0xfe, 0x1e, 0x21, + 0xed, 0x2d, 0xaf, 0x12, 0x28, 0xc4, 0xac, 0xe4, + 0x6f, 0x09, 0x35, 0x9a, 0x84, 0xd7, 0x29, 0xa5, + 0x9d, 0x69, 0x3d, 0xa3, 0x97, 0x3c, 0x4e, 0x0d, + 0x66, 0x95, 0x3b, 0x1e, 0xbe, 0x11, 0xbd, 0x3b, + 0x2a, 0x5e, 0xb4, 0x49, 0x7a, 0x05, 0x58, 0xfb, + 0x6a, 0xd4, 0xbc, 0xd7, 0x4c, 0x36, 0x2a, 0x9d, + 0x57, 0xbe, 0x44, 0xf5, 0x49, 0x18, 0x9f, 0x70, + 0xe3, 0xb1, 0x28, 0x9c, 0x6d, 0xa3, 0x80, 0xea, + 0xc9, 0x46, 0xc6, 0xbc, 0x29, 0xf6, 0xf2, 0x16, + 0x61, 0xa6, 0x6d, 0x4f, 0xd8, 0xda, 0xfe, 0x82, + 0xba, 0xd1, 0xa3, 0xf2, 0x8a, 0x2b, 0xd0, 0x40, + 0xf3, 0x4c, 0xee, 0xa9, 0x14, 0x10, 0xfd, 0xca, + 0x97, 0x5f, 0xfb, 0xd2, 0x74, 0xad, 0x8e, 0xf8, + 0x53, 0xc8, 0xe7, 0xd8, 0x0c, 0x8c, 0x6a, 0xad, + 0xb1, 0xa0, 0xa0, 0xce, 0x3b, 0x56, 0xab, 0x08, + 0xf5, 0x67, 0xee, 0xb4, 0xc5, 0x7a, 0x6a, 0xef, + 0xc9, 0xce, 0x87, 0x5e, 0x42, 0xbc, 0xff, 0x49, + 0x1c, 0x5e, 0x65, 0xd6, 0x25, 0xc5, 0x5b, 0xbc, + 0x2d, 0x41, 0x94, 0x0b, 0xcf, 0x0d, 0xea, 0xbb, + 0x3b, 0x41, 0xbd, 0x50, 0x0d, 0xea, 0x3b, 0x3b, + 0xa8, 0x23, 0xea, 0xe7, 0xc0, 0x1c, 0x75, 0x4f, + 0x7c, 0x2b, 0xc4, 0x5e, 0x4a, 0xe7, 0xab, 0xe7, + 0xf5, 0xcb, 0xfa, 0x55, 0x7d, 0x1a, 0xf6, 0xc3, + 0xe9, 0xd2, 0x74, 0xa9, 0x98, 0xf7, 0x11, 0xdd, + 0xc8, 0xb7, 0xf5, 0x7c, 0x96, 0xa9, 0x86, 0xd8, + 0x89, 0xaf, 0x28, 0xce, 0x89, 0xc8, 0x3b, 0x16, + 0x29, 0x26, 0x08, 0x11, 0xe7, 0x9c, 0xd4, 0xed, + 0x3e, 0xa0, 0xa6, 0x1e, 0xd7, 0x4e, 0x83, 0xb1, + 0xd6, 0x56, 0xd1, 0xe1, 0xee, 0xe8, 0x8c, 0x31, + 0xca, 0xdd, 0x74, 0xbb, 0x1a, 0x56, 0x4e, 0xd2, + 0x4e, 0xd9, 0x93, 0x10, 0x0b, 0x69, 0xf6, 0xba, + 0x1b, 0xf2, 0x7d, 0x96, 0x21, 0xab, 0x1c, 0x76, + 0x77, 0x2d, 0xa9, 0x9d, 0xb4, 0x52, 0xed, 0x09, + 0xcc, 0x37, 0x8f, 0xd6, 0x8d, 0xb3, 0x0c, 0x12, + 0x7e, 0xdd, 0x7f, 0x74, 0xc8, 0x5a, 0x6a, 0x6b, + 0x96, 0xd6, 0x66, 0xd8, 0x51, 0x3e, 0x8a, 0x1f, + 0xc6, 0xd8, 0x1c, 0xa9, 0x8e, 0x8b, 0xc2, 0x6d, + 0x67, 0x41, 0x8a, 0x48, 0x1f, 0x11, 0xb3, 0x73, + 0x5c, 0x1a, 0x97, 0x16, 0x1c, 0x66, 0x49, 0x66, + 0x48, 0xbc, 0x28, 0xf6, 0xa0, 0xb2, 0x85, 0x91, + 0xff, 0xd6, 0x27, 0xdd, 0xc7, 0x86, 0x40, 0x38, + 0xb0, 0xd7, 0xaf, 0x51, 0xe6, 0xf5, 0x8e, 0x61, + 0x9e, 0x41, 0x06, 0x2e, 0x20, 0xba, 0xaf, 0xdb, + 0xb7, 0xe2, 0x38, 0xa8, 0x05, 0x59, 0xb3, 0x72, + 0x8d, 0x45, 0x4f, 0x95, 0xe7, 0x1a, 0xae, 0x13, + 0x5e, 0x54, 0x30, 0xed, 0xe1, 0xef, 0x03, 0x6d, + 0x74, 0x05, 0xe7, 0x3d, 0xfb, 0x8e, 0x32, 0x00, + 0xc6, 0x13, 0xc8, 0xc2, 0xe3, 0xda, 0xfc, 0x8e, + 0x66, 0x87, 0x61, 0x55, 0x1d, 0x71, 0x2a, 0xfb, + 0x42, 0x8a, 0x3a, 0xe9, 0xee, 0x8a, 0x12, 0xd2, + 0x20, 0x57, 0x38, 0x90, 0x38, 0xfe, 0x59, 0xe9, + 0xaa, 0x07, 0xcb, 0x12, 0xd6, 0x2f, 0x0b, 0x6c, + 0xa1, 0x85, 0x3b, 0x49, 0xad, 0x15, 0xa2, 0xda, + 0x5d, 0x94, 0x29, 0xec, 0xa6, 0xd9, 0x9d, 0x65, + 0xa7, 0x95, 0x15, 0xf2, 0x14, 0x4a, 0x1d, 0x4c, + 0x2a, 0x59, 0x03, 0x32, 0x64, 0xf2, 0xb2, 0xf7, + 0x78, 0xa9, 0x75, 0x5c, 0x81, 0xb8, 0xe6, 0x6c, + 0xdf, 0xf5, 0x95, 0x0a, 0x90, 0x53, 0xe1, 0x81, + 0xfa, 0x95, 0xb3, 0x2c, 0xc1, 0x46, 0xd9, 0x39, + 0xf6, 0xc4, 0x14, 0xa5, 0x30, 0x46, 0xb9, 0x8c, + 0x2b, 0x7e, 0x74, 0x54, 0x43, 0xfa, 0xeb, 0x0c, + 0x88, 0x22, 0xd0, 0x77, 0xea, 0xfc, 0x15, 0xa7, + 0x50, 0xe5, 0x59, 0xea, 0xd6, 0x9f, 0xe9, 0xb3, + 0xeb, 0xe8, 0xb2, 0x3d, 0x2e, 0x9d, 0x93, 0x90, + 0x87, 0xdb, 0xab, 0x65, 0x41, 0x39, 0x5d, 0xfd, + 0x16, 0x79, 0x0f, 0x05, 0xbd, 0xcf, 0xd4, 0x75, + 0x29, 0x0a, 0x08, 0xbe, 0x13, 0x72, 0x7f, 0x64, + 0xd7, 0xc5, 0xa8, 0xa7, 0x5d, 0xb5, 0x71, 0x2b, + 0x27, 0xeb, 0x21, 0xe7, 0x26, 0xbc, 0x2e, 0x6a, + 0x5b, 0x47, 0xbc, 0xab, 0x80, 0xee, 0x39, 0xa8, + 0x96, 0x8b, 0xb1, 0x9b, 0x44, 0xfa, 0x0a, 0x5c, + 0x7b, 0x87, 0x23, 0x9d, 0x90, 0x3b, 0x3c, 0xa5, + 0x47, 0x1d, 0xd4, 0xdd, 0x1a, 0x35, 0xb1, 0xff, + 0x71, 0x52, 0x77, 0x4b, 0x34, 0x64, 0x36, 0xe2, + 0x6e, 0xc0, 0x0c, 0xcd, 0xd0, 0x37, 0x5e, 0x86, + 0x38, 0x5c, 0xb7, 0xa8, 0x9a, 0x87, 0xfd, 0x23, + 0x21, 0x46, 0x48, 0xd6, 0x6f, 0xa9, 0x0e, 0xd4, + 0x8b, 0x37, 0x13, 0x84, 0xe7, 0x5c, 0x43, 0xb5, + 0x5d, 0x6d, 0xa0, 0xd3, 0x32, 0xb2, 0xa9, 0xef, + 0x6c, 0xed, 0xbc, 0x1b, 0xd8, 0xc2, 0x0a, 0x06, + 0x29, 0xa7, 0xb9, 0x37, 0x15, 0x54, 0x4b, 0xe3, + 0x9a, 0xa7, 0xa8, 0x4d, 0xab, 0x34, 0x6f, 0xe5, + 0xee, 0x86, 0xbb, 0x8a, 0x22, 0x97, 0xdb, 0x2b, + 0x8d, 0x8f, 0x1d, 0x03, 0x66, 0xda, 0xb8, 0x31, + 0xb6, 0xa5, 0xbe, 0x9b, 0xd9, 0x42, 0xf4, 0xac, + 0x6c, 0xe0, 0x75, 0x78, 0xa2, 0x2f, 0x3a, 0x5c, + 0xcd, 0x3e, 0xe6, 0xac, 0xc8, 0x88, 0x96, 0x32, + 0x2c, 0x39, 0xf7, 0xdf, 0xe9, 0x6f, 0xa0, 0x52, + 0x0d, 0x66, 0x9a, 0x90, 0x1f, 0x49, 0xda, 0x61, + 0x21, 0xa7, 0x69, 0x85, 0x92, 0x66, 0x16, 0x59, + 0xd0, 0xc8, 0x42, 0x3e, 0x92, 0x35, 0xd6, 0xcc, + 0x33, 0x7d, 0xae, 0x97, 0x9e, 0x9b, 0x56, 0xfb, + 0xac, 0xf2, 0x91, 0x8e, 0xce, 0xd1, 0xd5, 0x94, + 0x87, 0xda, 0x15, 0xd6, 0xa4, 0x4f, 0xb5, 0x7b, + 0xda, 0x7a, 0xeb, 0x0e, 0xbb, 0xad, 0xfd, 0x9b, + 0x76, 0x4b, 0xf2, 0x78, 0x2f, 0xde, 0x55, 0xc0, + 0x8a, 0x8e, 0xef, 0x8c, 0xeb, 0xeb, 0xce, 0xd0, + 0xb6, 0xd0, 0xd8, 0xb5, 0x22, 0x52, 0x94, 0xc9, + 0x3a, 0xd6, 0x62, 0xbe, 0x91, 0xe7, 0x1d, 0xd4, + 0x21, 0x5a, 0xf5, 0xf4, 0x28, 0x3a, 0x35, 0x71, + 0x07, 0xb1, 0xd3, 0x03, 0xc2, 0x48, 0xfb, 0x3b, + 0x79, 0xb0, 0x8b, 0x9d, 0x46, 0x55, 0x5b, 0x77, + 0x86, 0x15, 0x72, 0xd3, 0xbf, 0x7e, 0x7e, 0x44, + 0xe8, 0x6a, 0x2f, 0xcb, 0x0e, 0xf4, 0x56, 0xc5, + 0x93, 0x5f, 0x1d, 0x75, 0x1d, 0x04, 0x3a, 0x5c, + 0x8f, 0x4a, 0xcc, 0x8d, 0x6e, 0xd5, 0x8e, 0xe1, + 0x0a, 0xdb, 0x57, 0x9c, 0x2b, 0xf6, 0x45, 0x67, + 0x53, 0x78, 0xe8, 0x8c, 0x6f, 0x47, 0xb6, 0xa9, + 0x02, 0xe9, 0xf9, 0x59, 0x7f, 0xe9, 0x6e, 0x1e, + 0x3d, 0x34, 0xbe, 0x74, 0x1e, 0x6e, 0xfe, 0xa9, + 0x7d, 0xcf, 0x88, 0x18, 0x11, 0x4f, 0x45, 0x21, + 0x4f, 0xaa, 0x3b, 0x79, 0xab, 0x7b, 0xaf, 0xbe, + 0x84, 0xcf, 0x1d, 0xff, 0x2c, 0xec, 0xcf, 0xdf, + 0x21, 0xc8, 0x2d, 0x97, 0x6c, 0xcd, 0x61, 0x36, + 0x22, 0x62, 0xb1, 0xa6, 0x9c, 0xf1, 0x46, 0x6c, + 0xaf, 0x73, 0x37, 0x8f, 0x20, 0x7c, 0xb5, 0x2b, + 0x52, 0x6d, 0x85, 0x8c, 0xcb, 0x8f, 0xfb, 0x3c, + 0x04, 0x8e, 0xdc, 0xc9, 0x35, 0x3c, 0x7d, 0xfe, + 0x19, 0xf7, 0x91, 0x22, 0x55, 0x76, 0x2b, 0x92, + 0xbd, 0xa8, 0xa2, 0x1f, 0x10, 0x67, 0x53, 0xfa, + 0x2a, 0xcd, 0x19, 0x38, 0x87, 0x21, 0x35, 0x40, + 0x8e, 0x8d, 0x5c, 0xaf, 0x0f, 0xf5, 0xf9, 0xa7, + 0x7a, 0xba, 0xa5, 0xe8, 0xc4, 0x44, 0xfc, 0x08, + 0x58, 0xd4, 0x92, 0xe4, 0xd2, 0x2b, 0x6c, 0xd7, + 0xb4, 0xf0, 0x6f, 0xe1, 0xcd, 0xa2, 0x79, 0xde, + 0x3d, 0x6f, 0x5c, 0x36, 0xae, 0xba, 0xd3, 0x46, + 0xd1, 0x98, 0x7e, 0x59, 0x7c, 0x19, 0x20, 0xe8, + 0x7c, 0xba, 0x3c, 0x65, 0xca, 0xb9, 0xda, 0x9b, + 0x68, 0x72, 0xf5, 0xc8, 0xf7, 0x95, 0x9f, 0x50, + 0x1e, 0x37, 0xa7, 0x90, 0x0d, 0x6d, 0x88, 0x4c, + 0x64, 0x58, 0x79, 0x49, 0xb7, 0x34, 0xac, 0xb7, + 0xa1, 0x68, 0xed, 0x13, 0xe9, 0x65, 0x47, 0xf9, + 0xd0, 0x5b, 0x63, 0xa7, 0x30, 0xe3, 0x60, 0x53, + 0xe8, 0x9a, 0xcd, 0xa6, 0x59, 0x91, 0x72, 0x3a, + 0x9e, 0x2f, 0xd4, 0x38, 0xee, 0x00, 0xc6, 0x45, + 0xa5, 0x05, 0xe7, 0x38, 0x17, 0xcd, 0xc5, 0x5b, + 0x37, 0xc4, 0xde, 0xbe, 0x46, 0x09, 0xde, 0x63, + 0xd8, 0x4d, 0x32, 0x2d, 0x07, 0x6b, 0x5d, 0x47, + 0x53, 0xb1, 0x5b, 0xf7, 0x9e, 0xc5, 0x7c, 0xf1, + 0xb8, 0xc8, 0x34, 0x7b, 0x71, 0x1b, 0xf2, 0x45, + 0x9e, 0x77, 0xd7, 0x11, 0x31, 0xc6, 0x79, 0x47, + 0x63, 0xee, 0x18, 0xe4, 0x2d, 0xd3, 0x9b, 0x99, + 0x9f, 0xd7, 0xf6, 0x50, 0xc3, 0x39, 0x20, 0x06, + 0xa4, 0x5a, 0x7b, 0xb3, 0x71, 0xbf, 0xf1, 0x20, + 0xff, 0xd5, 0xf1, 0x7d, 0xed, 0xab, 0xe3, 0xef, + 0xb5, 0x2f, 0xec, 0x8d, 0x56, 0x94, 0x05, 0xcd, + 0x0e, 0xca, 0x42, 0xf0, 0x51, 0x54, 0x63, 0x4e, + 0x4a, 0xfa, 0xe6, 0xf8, 0x94, 0x76, 0xea, 0x58, + 0xf4, 0x38, 0x08, 0x92, 0x51, 0x30, 0xb2, 0x26, + 0x46, 0x9b, 0x05, 0xd8, 0xb5, 0xc2, 0x26, 0xb1, + 0x47, 0xfd, 0xd1, 0xde, 0xef, 0x5e, 0xd6, 0xe7, + 0x6a, 0x2a, 0xe9, 0x43, 0x10, 0xb5, 0x21, 0x0e, + 0x11, 0xb5, 0x59, 0x3a, 0x95, 0x2d, 0x5f, 0xed, + 0x4d, 0x5a, 0x67, 0x58, 0x75, 0xf4, 0xfb, 0x2c, + 0xfc, 0x5e, 0xea, 0x41, 0xd0, 0xf9, 0x6e, 0x7e, + 0x27, 0x95, 0x31, 0x7d, 0x97, 0x13, 0xd4, 0xb4, + 0xa2, 0xf5, 0x06, 0x7b, 0xcc, 0x70, 0x06, 0xa6, + 0xf5, 0xb9, 0xdc, 0x16, 0x8d, 0xc9, 0x21, 0x77, + 0xa3, 0xbe, 0x54, 0xd7, 0x50, 0xf7, 0xc9, 0x94, + 0x5a, 0x23, 0xc6, 0xf3, 0x5c, 0x84, 0x62, 0x95, + 0x92, 0xd8, 0x65, 0x26, 0x3e, 0x94, 0x1f, 0x5a, + 0x0f, 0x0d, 0xbc, 0xfd, 0x49, 0xbe, 0x27, 0x47, + 0xe3, 0xd1, 0x78, 0x3c, 0x4c, 0x58, 0xd3, 0x95, + 0x31, 0x7b, 0xc7, 0x1e, 0xfd, 0x39, 0xf1, 0x73, + 0xe2, 0x4d, 0xda, 0xf9, 0xce, 0x1e, 0xb5, 0x47, + 0xad, 0x89, 0x83, 0x64, 0xeb, 0x23, 0xca, 0xd9, + 0x5f, 0xec, 0x20, 0xcf, 0x56, 0xb6, 0xe2, 0xd6, + 0x0f, 0x6e, 0x8c, 0x6a, 0x46, 0x53, 0xd6, 0xd7, + 0x96, 0xb8, 0x23, 0x09, 0x1d, 0x95, 0x75, 0x88, + 0x57, 0xc7, 0xcd, 0x73, 0xe6, 0xa4, 0xb1, 0x68, + 0x2c, 0xa0, 0x43, 0x99, 0x31, 0x44, 0xab, 0x8a, + 0x4c, 0x2a, 0x46, 0x37, 0x29, 0x7e, 0x0e, 0x48, + 0xa1, 0x1c, 0x76, 0xfc, 0x22, 0x42, 0x44, 0x9c, + 0x16, 0x15, 0x8a, 0x9f, 0x51, 0x4d, 0xe9, 0xa6, + 0x3c, 0x2d, 0x4f, 0x5b, 0x01, 0x23, 0x64, 0x70, + 0xfc, 0x64, 0x34, 0x9e, 0x89, 0xab, 0xf0, 0xa9, + 0x34, 0x61, 0xc1, 0x5d, 0x20, 0x95, 0xab, 0x69, + 0x73, 0xda, 0x5c, 0x85, 0x48, 0x74, 0x56, 0x99, + 0x53, 0xe6, 0x8c, 0xdb, 0xe6, 0x27, 0x62, 0xcf, + 0xbe, 0x4f, 0x3b, 0xc9, 0x78, 0x8e, 0xe2, 0x63, + 0x8a, 0x90, 0x73, 0xc4, 0xb7, 0xda, 0x71, 0xfd, + 0x88, 0x8b, 0x63, 0xab, 0x64, 0xeb, 0x9c, 0xfc, + 0x58, 0x0e, 0xba, 0x34, 0xac, 0xf4, 0x20, 0x7b, + 0xc1, 0x1e, 0x1a, 0x9b, 0xfa, 0x97, 0xce, 0x0e, + 0xaf, 0xc9, 0xc3, 0xbd, 0x5f, 0x8d, 0x97, 0xf5, + 0x62, 0xf3, 0xab, 0x9d, 0x44, 0xab, 0xc6, 0x12, + 0xb9, 0xe2, 0xdb, 0x99, 0x12, 0x32, 0x98, 0x8a, + 0x2d, 0xdf, 0x4f, 0x44, 0x14, 0xa4, 0x0a, 0xa9, + 0x35, 0x6e, 0x8e, 0xbe, 0x1c, 0x0b, 0xd3, 0xae, + 0x61, 0x4c, 0x18, 0x59, 0x25, 0x63, 0x7c, 0xfa, + 0x53, 0x47, 0x93, 0x6d, 0x65, 0xb8, 0xb5, 0x6e, + 0xcc, 0xbb, 0xca, 0xd1, 0xb0, 0x73, 0x66, 0x13, + 0xce, 0xbc, 0x31, 0xdd, 0x9e, 0xa6, 0x65, 0x05, + 0x22, 0xc9, 0x7a, 0xa6, 0x0e, 0x23, 0xba, 0x55, + 0x68, 0x65, 0x5a, 0x19, 0xbb, 0x70, 0x30, 0x2e, + 0x27, 0x72, 0x99, 0xd6, 0xa7, 0x62, 0x47, 0xbb, + 0x52, 0x46, 0x9e, 0x7b, 0x01, 0xf6, 0x21, 0x38, + 0x0e, 0x0a, 0x10, 0x8d, 0xd4, 0x3c, 0xa5, 0xd6, + 0x40, 0xb3, 0x28, 0x63, 0x47, 0x26, 0x44, 0xae, + 0x1f, 0xfd, 0xbe, 0x5a, 0x84, 0xe9, 0x55, 0x86, + 0x60, 0x5f, 0x38, 0x0f, 0xf1, 0x0f, 0x46, 0x42, + 0x67, 0x70, 0x27, 0xb5, 0xa6, 0x25, 0x3c, 0x57, + 0x29, 0xe1, 0x94, 0x1b, 0x57, 0xe2, 0x3a, 0x62, + 0xba, 0x8b, 0xce, 0x7d, 0xaa, 0x7d, 0xc2, 0xef, + 0xc6, 0x79, 0x73, 0x8d, 0xe2, 0xd8, 0xb0, 0x1b, + 0xad, 0x67, 0xeb, 0xcc, 0xc1, 0xcf, 0x54, 0xa0, + 0x4f, 0xa5, 0x5a, 0xf3, 0xb9, 0x6b, 0xa4, 0xc4, + 0x0b, 0xb3, 0xb6, 0x1d, 0x51, 0x76, 0xf5, 0x31, + 0x42, 0x19, 0xa7, 0x9d, 0x67, 0xdb, 0xa4, 0x13, + 0xea, 0x31, 0x23, 0x20, 0xbb, 0x6e, 0x3f, 0x57, + 0x36, 0xf4, 0xcf, 0x9d, 0x0d, 0x86, 0x9d, 0x98, + 0x0d, 0x9b, 0x35, 0x9e, 0x2b, 0xeb, 0xea, 0x1a, + 0xe7, 0x20, 0xe4, 0x8a, 0x87, 0xbc, 0x87, 0xc4, + 0x3f, 0x6d, 0xcd, 0xed, 0xc5, 0x85, 0x49, 0x42, + 0xa1, 0x72, 0x71, 0x33, 0xfb, 0x53, 0x0d, 0xf2, + 0xb1, 0x6c, 0xe5, 0xd3, 0x9f, 0xfa, 0xbb, 0xc3, + 0x7d, 0x8f, 0xe6, 0x3e, 0xfd, 0x15, 0x56, 0xb3, + 0xce, 0xde, 0xe0, 0xf7, 0x25, 0xd3, 0x87, 0xf8, + 0xda, 0xfd, 0xbe, 0x3c, 0x18, 0x23, 0xf1, 0xb9, + 0x83, 0x7a, 0xc4, 0x6a, 0x69, 0xfd, 0x8d, 0xcf, + 0x00, 0x0d, 0x74, 0x19, 0xa0, 0xee, 0x34, 0xc4, + 0xbd, 0xcb, 0x55, 0xff, 0xc0, 0x18, 0x1f, 0x11, + 0xf6, 0x0a, 0xa9, 0xf9, 0x89, 0x3d, 0x08, 0x36, + 0xac, 0x96, 0x4b, 0x5e, 0x95, 0x8c, 0x63, 0x12, + 0xe8, 0xdc, 0x37, 0x4f, 0xe5, 0xc6, 0xa5, 0xc7, + 0xe2, 0x07, 0x7a, 0xb9, 0xb8, 0x2f, 0xc0, 0x7f, + 0xa8, 0x18, 0x04, 0xe7, 0xb8, 0x8e, 0xea, 0x2a, + 0xa7, 0xeb, 0x43, 0x10, 0x4f, 0x2a, 0x3b, 0x5d, + 0x5e, 0x0c, 0x72, 0x79, 0xe3, 0xa5, 0xb1, 0x56, + 0xbc, 0x82, 0xbf, 0x21, 0x7b, 0x71, 0xcb, 0x63, + 0xdc, 0xcc, 0x40, 0xac, 0x31, 0x64, 0x20, 0x32, + 0xe1, 0xa2, 0x79, 0xdf, 0x82, 0xcf, 0x5f, 0x8e, + 0x97, 0x13, 0xd6, 0x54, 0x98, 0x63, 0xc6, 0x10, + 0x27, 0xc8, 0xb1, 0x82, 0x62, 0xbd, 0x5f, 0xef, + 0xab, 0x57, 0x7b, 0x36, 0xa2, 0xa7, 0xab, 0x78, + 0x4c, 0xeb, 0x85, 0x9d, 0x35, 0x72, 0xae, 0xe1, + 0xba, 0xfb, 0xbb, 0x70, 0xc5, 0x60, 0xc7, 0xcb, + 0x4d, 0x29, 0xcf, 0xb8, 0x22, 0xff, 0xbb, 0x98, + 0x9a, 0xef, 0xf4, 0xf7, 0x77, 0x11, 0x15, 0x82, + 0x7a, 0x6e, 0xe6, 0xb3, 0xce, 0xfb, 0x16, 0xf0, + 0x7d, 0xe1, 0x55, 0xf8, 0x81, 0xd9, 0x44, 0xa8, + 0x47, 0xcd, 0xbb, 0x92, 0xf2, 0xd7, 0x76, 0x19, + 0xfd, 0x47, 0x50, 0x5f, 0xa7, 0x49, 0xca, 0x04, + 0xf5, 0x51, 0x0f, 0xfb, 0x01, 0x71, 0x9d, 0x26, + 0x69, 0xba, 0xa9, 0x58, 0x19, 0x2b, 0x78, 0x10, + 0xb5, 0xe3, 0x6f, 0xe2, 0x6f, 0xb4, 0xfa, 0xb4, + 0xb9, 0x66, 0x96, 0xaa, 0x9d, 0x4e, 0x3a, 0xc4, + 0xfa, 0x59, 0xf8, 0xce, 0x93, 0xed, 0x45, 0x79, + 0xa3, 0x11, 0x6d, 0xc0, 0xf9, 0x20, 0xf5, 0x33, + 0xef, 0x5c, 0x99, 0x10, 0x5f, 0x62, 0x6e, 0x8f, + 0x2a, 0x90, 0x8a, 0xdc, 0x44, 0xac, 0xcb, 0xdd, + 0x30, 0xe7, 0xb6, 0x60, 0x14, 0x8b, 0x71, 0x68, + 0x01, 0xe2, 0xa0, 0x27, 0x8d, 0x59, 0xca, 0x87, + 0xb8, 0xeb, 0x87, 0xa8, 0x27, 0x95, 0x8a, 0x86, + 0x9f, 0x6a, 0x17, 0x46, 0xd3, 0xc4, 0xc1, 0x15, + 0xfb, 0xd2, 0x1b, 0x63, 0x2f, 0x82, 0x5e, 0x07, + 0x55, 0x9e, 0xf1, 0xc5, 0x1b, 0x7f, 0x85, 0x5c, + 0x4f, 0x6e, 0x2c, 0xfe, 0xb2, 0xd3, 0x48, 0x36, + 0xae, 0xfe, 0x72, 0x59, 0xf9, 0x48, 0xb9, 0xcf, + 0x73, 0x49, 0x6f, 0x2f, 0x93, 0x74, 0x88, 0x1c, + 0xca, 0x85, 0x52, 0x26, 0x0f, 0x19, 0xe0, 0x56, + 0xa1, 0xec, 0xd5, 0x28, 0x04, 0xd4, 0xb6, 0x22, + 0x0d, 0x41, 0x06, 0xf1, 0xbe, 0xb0, 0x2a, 0x60, + 0xa5, 0x13, 0xbb, 0x87, 0x77, 0x5d, 0x2f, 0x06, + 0x56, 0x5e, 0xb8, 0x21, 0x6d, 0x38, 0x17, 0x73, + 0x56, 0xcd, 0x87, 0x46, 0xcc, 0x80, 0xf3, 0x6c, + 0x24, 0xa8, 0x73, 0x21, 0x18, 0x79, 0x43, 0x30, + 0x6a, 0xff, 0xc4, 0x9f, 0x03, 0xff, 0xc4, 0xdf, + 0xf3, 0xff, 0x9c, 0x87, 0xa8, 0x62, 0x15, 0x22, + 0x48, 0xbc, 0xbe, 0x30, 0xbe, 0x61, 0x6e, 0x66, + 0xea, 0x45, 0x37, 0xb9, 0xf7, 0x5f, 0xc7, 0x27, + 0x34, 0x43, 0xe4, 0x79, 0x0b, 0x5d, 0x55, 0x06, + 0x6d, 0x31, 0xf7, 0xbd, 0x9b, 0x82, 0x75, 0x38, + 0xee, 0x8e, 0x59, 0x29, 0x79, 0x4e, 0x26, 0xbe, + 0x24, 0x39, 0x2e, 0xe0, 0x35, 0xf2, 0xef, 0x77, + 0x77, 0xb8, 0x1b, 0x2f, 0x77, 0x38, 0x4a, 0xb7, + 0x82, 0x95, 0xb3, 0xc6, 0x45, 0x16, 0xd5, 0xa2, + 0xc9, 0x5a, 0x0b, 0xae, 0x6e, 0x25, 0xa3, 0x65, + 0xd4, 0xb5, 0x78, 0x90, 0xa2, 0xcd, 0x84, 0x13, + 0x35, 0x76, 0x15, 0xd9, 0x91, 0x21, 0x1f, 0xb9, + 0x02, 0x71, 0x12, 0xb2, 0xfb, 0xa3, 0xaf, 0x12, + 0xf5, 0x64, 0x4f, 0x9f, 0x8e, 0xdc, 0x1b, 0xec, + 0xa9, 0x83, 0xa8, 0x33, 0xd5, 0x8a, 0xda, 0x35, + 0x2b, 0xb1, 0xfd, 0xe7, 0x3d, 0xae, 0x27, 0x33, + 0xe2, 0xa0, 0x06, 0xe8, 0x25, 0xe1, 0x4b, 0x67, + 0x94, 0x8d, 0xd1, 0x31, 0xe1, 0xd5, 0xbd, 0x7b, + 0xea, 0xa2, 0xdb, 0x63, 0xb0, 0x86, 0xc0, 0xe1, + 0xa6, 0x21, 0x6a, 0xe6, 0xcc, 0xb5, 0x2e, 0x57, + 0x2b, 0xc9, 0x94, 0x56, 0xed, 0x78, 0x4e, 0x9b, + 0xcb, 0x65, 0xad, 0xc5, 0xdc, 0xc5, 0x96, 0x22, + 0xf2, 0x57, 0x86, 0x99, 0xad, 0x86, 0xd4, 0xf1, + 0xe3, 0x73, 0x39, 0x62, 0x82, 0xc0, 0x9e, 0x12, + 0x7a, 0x12, 0xda, 0x3f, 0x9b, 0xea, 0xe7, 0x2c, + 0xc3, 0xfc, 0xab, 0xcb, 0xaf, 0xd2, 0x47, 0x70, + 0xbf, 0x37, 0xb5, 0x57, 0x21, 0x4e, 0xdc, 0xae, + 0xdb, 0xa9, 0x6f, 0xd4, 0x3f, 0x7c, 0x34, 0x4d, + 0xf9, 0x01, 0xf7, 0x0b, 0xfb, 0xc0, 0x55, 0x9c, + 0x70, 0x04, 0xbd, 0x51, 0x70, 0xbf, 0x3b, 0xb0, + 0x9f, 0x3f, 0xf6, 0xf6, 0xd2, 0x48, 0x65, 0x41, + 0xf7, 0x72, 0xab, 0x2a, 0xec, 0xbd, 0x16, 0x62, + 0xc1, 0x26, 0x0c, 0xad, 0xb5, 0xa0, 0x32, 0x21, + 0xd4, 0x84, 0x58, 0x49, 0xa2, 0x31, 0x59, 0xe7, + 0xec, 0x11, 0x8c, 0xd9, 0x93, 0xf6, 0x65, 0xe5, + 0xaa, 0x6b, 0x78, 0xb2, 0xd6, 0x7c, 0xd4, 0x65, + 0x74, 0xff, 0x86, 0x0e, 0xbe, 0xda, 0x4a, 0x0e, + 0xd9, 0xd3, 0x5e, 0xa5, 0x17, 0x3e, 0x89, 0x14, + 0xc0, 0x95, 0xbf, 0x07, 0xfb, 0x1e, 0x13, 0xb8, + 0xab, 0x38, 0x46, 0x6e, 0x51, 0x73, 0x8a, 0x22, + 0xb7, 0xe2, 0x91, 0x58, 0x8f, 0xbf, 0x1a, 0x3b, + 0x8a, 0xd7, 0xe3, 0x7b, 0x63, 0x7b, 0x55, 0x0f, + 0x7f, 0x55, 0x44, 0x0d, 0x09, 0x44, 0x12, 0xc1, + 0x0c, 0x1a, 0x93, 0xe5, 0x72, 0x6c, 0x4f, 0x49, + 0x2a, 0xe5, 0x4f, 0xeb, 0x7e, 0x0e, 0xab, 0x1e, + 0xad, 0x1a, 0x73, 0x77, 0xd5, 0x46, 0x71, 0x6b, + 0xee, 0xee, 0xac, 0xa1, 0x1e, 0xcd, 0x6f, 0xa9, + 0xa5, 0xbb, 0x4d, 0x9f, 0xeb, 0x51, 0xa4, 0x33, + 0x21, 0x9a, 0x13, 0xd5, 0x3f, 0x1f, 0x9d, 0xd6, + 0xc7, 0x3b, 0x73, 0x1f, 0xf1, 0x1b, 0x88, 0xd7, + 0x80, 0x79, 0x27, 0xcf, 0xca, 0x14, 0x23, 0xcb, + 0xfc, 0x76, 0x97, 0xba, 0x00, 0xd5, 0xea, 0x48, + 0x2b, 0x24, 0x5d, 0x5b, 0x99, 0x69, 0x64, 0x1a, + 0xd7, 0x5f, 0x2f, 0xda, 0x43, 0x10, 0x41, 0x0d, + 0x23, 0xde, 0x90, 0xd4, 0x84, 0x02, 0xb2, 0x60, + 0x89, 0xe8, 0x15, 0xac, 0x20, 0xb2, 0x5a, 0xdd, + 0xbb, 0x2d, 0x7e, 0x22, 0x88, 0x72, 0x4a, 0xfe, + 0x73, 0xdb, 0xbf, 0xbe, 0xfc, 0xf0, 0x7a, 0xbf, + 0xed, 0x5e, 0xbf, 0xd4, 0xb4, 0x3b, 0xab, 0x7c, + 0x75, 0xc2, 0x59, 0x9c, 0xc7, 0x4b, 0xbe, 0xd3, + 0x50, 0x84, 0xd4, 0xee, 0x2a, 0x42, 0xcc, 0xf1, + 0x2b, 0x6e, 0x4b, 0xc2, 0x2d, 0xd7, 0xaf, 0xf4, + 0xee, 0x34, 0x22, 0xf2, 0xa4, 0x73, 0x49, 0x24, + 0x7e, 0x68, 0xc3, 0xb0, 0x22, 0x2b, 0x63, 0x84, + 0x08, 0x25, 0x9f, 0x38, 0xf4, 0xf5, 0x50, 0xb8, + 0x52, 0xd0, 0x73, 0x67, 0x5d, 0x39, 0xa3, 0x24, + 0x94, 0x69, 0xee, 0x81, 0x92, 0x8a, 0xbd, 0x8b, + 0xb2, 0x08, 0xec, 0x61, 0xdc, 0x81, 0xfb, 0x3b, + 0x87, 0xb5, 0x42, 0xb9, 0xd1, 0x9c, 0x4a, 0x1e, + 0x91, 0x58, 0xaf, 0xf3, 0x9c, 0x58, 0xd1, 0xa1, + 0x12, 0x62, 0xba, 0x25, 0x86, 0x7c, 0xb0, 0x75, + 0x8f, 0x1b, 0xce, 0xfd, 0xa4, 0x4f, 0x66, 0xb1, + 0x1e, 0x3a, 0x1a, 0x2b, 0x90, 0xad, 0x1f, 0x5f, + 0x07, 0xed, 0x7c, 0x2b, 0xf0, 0x6a, 0x05, 0xa2, + 0x8d, 0xd5, 0x5f, 0x35, 0x65, 0xa1, 0xb5, 0x92, + 0x5b, 0x6c, 0x76, 0x59, 0xf6, 0x31, 0xf2, 0xdd, + 0x90, 0x9b, 0x11, 0x16, 0xcb, 0x25, 0x3a, 0x5c, + 0x4b, 0xc8, 0x93, 0x64, 0x51, 0x29, 0xda, 0x0b, + 0xec, 0x82, 0xbc, 0xf2, 0x72, 0x5e, 0xcd, 0x4a, + 0x70, 0x93, 0xb3, 0xca, 0x45, 0x91, 0x6b, 0x77, + 0xf8, 0xca, 0x96, 0xf0, 0x7d, 0x05, 0xec, 0xb6, + 0x7e, 0xe9, 0xde, 0xa3, 0x5e, 0x1b, 0xe9, 0x04, + 0x22, 0x02, 0x4b, 0x0a, 0x99, 0x01, 0xeb, 0xc5, + 0xef, 0xf8, 0x1f, 0xc9, 0x42, 0x57, 0xf7, 0x52, + 0x10, 0xb8, 0xb7, 0x0f, 0x79, 0xbd, 0x31, 0x62, + 0x71, 0x4a, 0xb5, 0xdc, 0xf8, 0x61, 0xcd, 0xf8, + 0x77, 0xa3, 0x86, 0x5c, 0x3e, 0x64, 0x9a, 0x56, + 0xc6, 0x8d, 0x2b, 0xd5, 0x07, 0x6f, 0x2f, 0x79, + 0x28, 0x47, 0xbf, 0x26, 0x2b, 0x78, 0xd5, 0x95, + 0x6e, 0x4f, 0xb3, 0x3f, 0xd3, 0x44, 0x17, 0x88, + 0x54, 0xe3, 0x89, 0x2e, 0x2a, 0x83, 0x32, 0xf7, + 0xc8, 0x40, 0x27, 0x8b, 0x9a, 0x26, 0xd8, 0xf9, + 0x03, 0x72, 0xb3, 0xf0, 0xd0, 0xfe, 0x1c, 0xcf, + 0x2f, 0xd6, 0x93, 0xf5, 0xbf, 0xd4, 0xe3, 0xce, + 0xb8, 0xf4, 0x37, 0x29, 0x6c, 0xc6, 0xd9, 0x13, + 0x86, 0x3e, 0x09, 0x4f, 0x50, 0xb1, 0x80, 0xb2, + 0x72, 0xd4, 0x47, 0xc6, 0x15, 0x1c, 0xd9, 0x96, + 0x70, 0xb0, 0xe5, 0x2a, 0xac, 0xe6, 0xad, 0x92, + 0x79, 0x3b, 0xd9, 0x83, 0x91, 0x93, 0x65, 0x01, + 0x95, 0xa2, 0x7c, 0xe6, 0x94, 0xc7, 0xa4, 0xf6, + 0x59, 0x60, 0x8e, 0xa6, 0x63, 0xf7, 0xe1, 0x6f, + 0xdb, 0x43, 0xaf, 0x62, 0x49, 0xac, 0x44, 0x20, + 0x37, 0x3c, 0xa8, 0x84, 0x95, 0x15, 0x45, 0x3a, + 0x90, 0xec, 0xdd, 0x7d, 0x69, 0xff, 0x9c, 0x36, + 0xb1, 0x9d, 0xcd, 0x31, 0x2c, 0xd5, 0x37, 0x87, + 0x85, 0xdf, 0xab, 0x6d, 0xf6, 0xea, 0x6e, 0x61, + 0xfd, 0x2a, 0xe1, 0x22, 0xba, 0x7f, 0x07, 0x46, + 0x09, 0xd6, 0x74, 0x17, 0x9d, 0x73, 0x6c, 0x9c, + 0x8d, 0x38, 0x15, 0xee, 0x0a, 0xd1, 0x8e, 0xd7, + 0xa3, 0xf5, 0x8c, 0xfb, 0x88, 0x7c, 0xfe, 0x42, + 0x90, 0x71, 0xa4, 0x8c, 0x24, 0x3b, 0xbb, 0xf7, + 0x54, 0xec, 0xbe, 0x32, 0x22, 0xa9, 0xb1, 0xef, + 0xb5, 0x74, 0x80, 0x6a, 0x9c, 0xe8, 0xe4, 0x47, + 0xda, 0x68, 0x58, 0x81, 0xd4, 0xbd, 0x3c, 0x45, + 0x2d, 0x28, 0x59, 0x27, 0xac, 0x0c, 0x41, 0xae, + 0xf8, 0xad, 0xe7, 0x72, 0x22, 0x39, 0x53, 0xda, + 0xac, 0xbb, 0xbb, 0x9d, 0xad, 0x14, 0xde, 0x2c, + 0xe6, 0x0b, 0x8e, 0x68, 0x5e, 0x47, 0x4e, 0xa5, + 0xa3, 0x9b, 0xd4, 0xb5, 0x6e, 0xf2, 0x7a, 0xd0, + 0x48, 0xd3, 0x77, 0xac, 0x26, 0xad, 0x1b, 0xcf, + 0x45, 0x9d, 0x34, 0xf7, 0x8e, 0x22, 0xd2, 0xb8, + 0x74, 0xd5, 0xba, 0x6a, 0x7c, 0xfc, 0xe4, 0xa1, + 0xf8, 0x90, 0xdc, 0x84, 0x23, 0xe4, 0x98, 0x19, + 0x3b, 0x46, 0xc7, 0x4c, 0xac, 0xca, 0x6e, 0x34, + 0xb2, 0x47, 0x18, 0xb5, 0x4d, 0xfc, 0x23, 0xfb, + 0x2b, 0xd7, 0x15, 0x97, 0x73, 0xc3, 0xcd, 0x21, + 0x61, 0x4d, 0x98, 0x71, 0x32, 0x4a, 0x50, 0x41, + 0xbc, 0xaa, 0x22, 0x64, 0x94, 0x35, 0xb9, 0x04, + 0x89, 0x0e, 0xf1, 0x61, 0xdd, 0x09, 0xf9, 0x4e, + 0x23, 0x5b, 0x2d, 0xb6, 0x06, 0xaa, 0xe8, 0x1c, + 0x8d, 0xd7, 0x6a, 0x2d, 0x57, 0x62, 0xeb, 0x98, + 0x6b, 0x50, 0x97, 0xe6, 0xeb, 0xbb, 0xe1, 0x66, + 0xf1, 0x77, 0xeb, 0x75, 0xb0, 0x22, 0x4a, 0x5f, + 0xb5, 0x43, 0xb9, 0x8f, 0x5b, 0x35, 0xce, 0x3f, + 0xeb, 0xe5, 0x2d, 0xc2, 0xd9, 0xb8, 0xa0, 0x68, + 0xba, 0xe6, 0x70, 0xa5, 0x64, 0x88, 0x83, 0xcd, + 0x09, 0x47, 0x34, 0x92, 0x84, 0x15, 0xe7, 0x19, + 0x58, 0x51, 0xd7, 0x77, 0x30, 0xb6, 0x5e, 0x44, + 0xe4, 0x4a, 0x2e, 0xab, 0xd4, 0x8c, 0x5b, 0x84, + 0xbf, 0xca, 0x40, 0xee, 0x18, 0xaf, 0xd7, 0xea, + 0xf1, 0x36, 0xec, 0xad, 0x87, 0xb5, 0x83, 0xf8, + 0x01, 0xfc, 0x7c, 0xa9, 0xfe, 0x6b, 0x3e, 0x5c, + 0x12, 0xfd, 0x5a, 0x2e, 0x7a, 0xae, 0x43, 0x1c, + 0x5b, 0x1e, 0x97, 0x1f, 0x4b, 0x01, 0xb1, 0x47, + 0x99, 0x56, 0xe6, 0x6a, 0xee, 0x90, 0xbd, 0xca, + 0x0b, 0x32, 0xf3, 0x7d, 0xdd, 0x7d, 0x25, 0x40, + 0x8c, 0x54, 0x20, 0x82, 0xa9, 0xb5, 0xa3, 0x02, + 0x67, 0xf7, 0xa5, 0xf4, 0xbf, 0xba, 0x5d, 0x6e, + 0x5a, 0x2f, 0x62, 0x17, 0x56, 0x09, 0xe4, 0x06, + 0xe8, 0xa8, 0x9f, 0x5d, 0xee, 0x28, 0xf1, 0x46, + 0xda, 0x3b, 0xa4, 0x6f, 0x32, 0xef, 0xfe, 0x50, + 0xba, 0xe3, 0x9c, 0x85, 0x11, 0x9b, 0xa9, 0xe8, + 0xba, 0xf0, 0x81, 0x0b, 0x42, 0xef, 0xba, 0xc9, + 0x3f, 0xf3, 0x7f, 0xff, 0x68, 0x47, 0x35, 0xb1, + 0x2e, 0xa2, 0x07, 0x8f, 0x99, 0x34, 0x35, 0x5e, + 0x19, 0x23, 0x87, 0x14, 0x1e, 0x7d, 0xe1, 0x18, + 0x88, 0xca, 0x31, 0x77, 0x54, 0x9e, 0xc0, 0x98, + 0xd0, 0xc8, 0xc8, 0x19, 0xf2, 0xe5, 0xf1, 0x1d, + 0x8b, 0x56, 0x1a, 0x97, 0x95, 0xcb, 0xee, 0x03, + 0x35, 0xa1, 0x8e, 0xab, 0x11, 0x35, 0xb2, 0xc2, + 0xf7, 0x32, 0xdf, 0xab, 0x91, 0xff, 0x44, 0x76, + 0x12, 0xe5, 0x0b, 0xe8, 0x74, 0x00, 0x67, 0x72, + 0x88, 0xf7, 0xc2, 0xf5, 0x2c, 0xef, 0x78, 0xa3, + 0x63, 0x89, 0x32, 0x05, 0x31, 0xd2, 0x8c, 0xf9, + 0x19, 0x8e, 0xf6, 0x72, 0x38, 0x77, 0x91, 0xd1, + 0x0e, 0xf3, 0xcf, 0x11, 0x8e, 0x30, 0xf2, 0xfc, + 0xea, 0xb1, 0x1b, 0xce, 0x95, 0xc3, 0x33, 0x98, + 0x23, 0x34, 0xfa, 0xbd, 0x68, 0xa8, 0xda, 0x23, + 0x49, 0x95, 0x11, 0xb3, 0x84, 0x3d, 0x11, 0x61, + 0xc0, 0x91, 0x73, 0xf8, 0x09, 0xbb, 0x7e, 0xb8, + 0xbe, 0xbe, 0x93, 0xca, 0x70, 0x46, 0x61, 0x34, + 0x7d, 0x02, 0x9f, 0xe3, 0xd7, 0xaf, 0xe0, 0x86, + 0x75, 0xcd, 0x9c, 0x65, 0x58, 0xbe, 0x53, 0x36, + 0x3f, 0x17, 0x70, 0x1e, 0xac, 0x09, 0x38, 0x0b, + 0xd1, 0x83, 0x65, 0x67, 0xa1, 0xb5, 0x61, 0x87, + 0xd8, 0x90, 0xe6, 0xe5, 0xec, 0xed, 0xb4, 0x3b, + 0xa6, 0x45, 0x8e, 0x4e, 0x6a, 0x38, 0x07, 0x4f, + 0xe0, 0x73, 0xfc, 0x5d, 0xac, 0x27, 0xa2, 0x90, + 0xf2, 0xd6, 0x80, 0xbb, 0x6b, 0x07, 0xec, 0xd5, + 0x83, 0x01, 0x37, 0xcf, 0x1d, 0xab, 0x1d, 0xdf, + 0xb1, 0x9a, 0x7b, 0x52, 0x3f, 0x3e, 0xc1, 0xa7, + 0x0b, 0xea, 0xe1, 0x5c, 0x85, 0xca, 0xa6, 0xab, + 0x8e, 0x1a, 0x57, 0xe3, 0xb0, 0xe2, 0xa1, 0x4f, + 0x50, 0x65, 0x16, 0xee, 0xc7, 0xbf, 0x4b, 0x78, + 0x73, 0x10, 0x77, 0xd6, 0x62, 0x83, 0xd4, 0xd4, + 0xdb, 0xa2, 0x16, 0x57, 0xc7, 0xf6, 0x21, 0xff, + 0x53, 0x96, 0x14, 0xbf, 0x7b, 0xd8, 0x61, 0x34, + 0x7b, 0xfa, 0x11, 0x7d, 0xfa, 0x66, 0xd4, 0xe1, + 0x5e, 0x90, 0x16, 0xdc, 0x8f, 0xa5, 0x45, 0x86, + 0x08, 0x75, 0xdc, 0x0d, 0xaf, 0x79, 0x68, 0x07, + 0x8a, 0x41, 0x5c, 0x18, 0xcb, 0xed, 0xcb, 0xc6, + 0x3d, 0x23, 0x8d, 0x59, 0x96, 0x31, 0xe6, 0xc6, + 0x3d, 0x8d, 0x05, 0xdf, 0xdd, 0x69, 0x14, 0x5d, + 0x6f, 0xdd, 0x09, 0xfb, 0x99, 0x8d, 0x55, 0x16, + 0xbf, 0x5b, 0xda, 0x45, 0x1d, 0xe0, 0x79, 0x19, + 0x6b, 0x42, 0xfe, 0xa3, 0xc0, 0x67, 0x7b, 0x59, + 0x25, 0xd4, 0x01, 0xef, 0xe1, 0x66, 0xe1, 0xda, + 0x0e, 0x35, 0x90, 0xcf, 0x37, 0xe2, 0x44, 0x1b, + 0x7f, 0x6b, 0x9c, 0x71, 0x93, 0xc4, 0xd5, 0xe2, + 0x78, 0x14, 0xe4, 0xb6, 0x14, 0x8f, 0x33, 0xda, + 0x57, 0xdc, 0x9d, 0x87, 0x8e, 0x68, 0x47, 0x01, + 0x58, 0xa6, 0xe7, 0x6f, 0xd0, 0x2b, 0xa0, 0x56, + 0xb8, 0xef, 0x48, 0x8e, 0x78, 0xfe, 0x1a, 0x8c, + 0x8c, 0xa8, 0x11, 0x2f, 0xd7, 0x0c, 0x81, 0x41, + 0x5c, 0x5f, 0xca, 0x3c, 0x81, 0xb8, 0x9e, 0xe3, + 0xf9, 0xe1, 0x9a, 0x17, 0x64, 0x58, 0x49, 0xe5, + 0x1a, 0xe2, 0xdb, 0x0c, 0x18, 0x95, 0xe8, 0xd6, + 0x20, 0x57, 0x08, 0x89, 0x4a, 0x5d, 0x90, 0x15, + 0x88, 0x9b, 0xd9, 0xa4, 0x73, 0x75, 0xeb, 0xea, + 0xd6, 0xc7, 0xce, 0x83, 0xff, 0xbc, 0xff, 0x28, + 0xbe, 0x33, 0xb6, 0x97, 0xf4, 0x39, 0x9e, 0x87, + 0xe9, 0x8e, 0x0e, 0x19, 0xdc, 0xcb, 0x91, 0xcd, + 0xe9, 0x7f, 0x5d, 0x58, 0xd2, 0xc5, 0x7e, 0x8f, + 0xf5, 0x1e, 0x15, 0xb3, 0x7c, 0xed, 0x88, 0xe7, + 0x29, 0xde, 0xda, 0x5e, 0xcd, 0xb4, 0x66, 0x8c, + 0x42, 0x4e, 0x6a, 0x2d, 0xbb, 0x1e, 0x4e, 0x55, + 0xf0, 0x1d, 0x9c, 0x65, 0x86, 0x88, 0x48, 0x83, + 0xd7, 0x8f, 0xbc, 0x79, 0x44, 0xef, 0x2b, 0xd5, + 0xe0, 0x4c, 0x72, 0xc5, 0x5b, 0x81, 0xd5, 0xd8, + 0x3a, 0x1d, 0xeb, 0x52, 0x4d, 0xba, 0x99, 0xe4, + 0x57, 0x61, 0xda, 0xbd, 0xd3, 0x3e, 0x23, 0x7b, + 0x3c, 0x4f, 0x44, 0xb6, 0x91, 0xbe, 0xf7, 0x54, + 0xd8, 0xeb, 0x88, 0xa1, 0x7a, 0x83, 0xfc, 0x10, + 0xd5, 0x0c, 0x9c, 0x2f, 0xd8, 0x7f, 0xf8, 0xf8, + 0x4c, 0xcf, 0x45, 0x9d, 0x54, 0x12, 0x73, 0xc8, + 0xfa, 0x9f, 0xf5, 0xea, 0x2e, 0x70, 0x98, 0x7f, + 0x10, 0xbb, 0xcf, 0x45, 0x7d, 0x25, 0xdc, 0x45, + 0xd1, 0x89, 0xb5, 0xcb, 0x3b, 0x16, 0x30, 0xe3, + 0x75, 0x67, 0x9d, 0x82, 0xa9, 0x3a, 0xa8, 0xe1, + 0xa6, 0xea, 0xaa, 0x33, 0x6f, 0xc0, 0xde, 0x7d, + 0xf8, 0x79, 0x98, 0x7f, 0xaa, 0x98, 0x8b, 0xcf, + 0x1d, 0x6e, 0xc7, 0xe4, 0x73, 0xed, 0x4b, 0xf5, + 0x7b, 0xde, 0xa7, 0x1a, 0x0d, 0xf7, 0xf6, 0x43, + 0x23, 0xc2, 0x82, 0x7b, 0x47, 0x4e, 0x90, 0x67, + 0x6e, 0xac, 0x21, 0x1f, 0x8d, 0x41, 0xb4, 0x19, + 0xb5, 0x87, 0xe0, 0xb6, 0x66, 0xcf, 0xbc, 0xce, + 0x48, 0x03, 0xb8, 0x8a, 0xbe, 0x46, 0xbc, 0x82, + 0x6a, 0x97, 0x6c, 0xdc, 0x53, 0x08, 0xc5, 0xd6, + 0x86, 0x78, 0xd2, 0x2a, 0x62, 0xd5, 0x96, 0x10, + 0x6d, 0xe4, 0xdd, 0x72, 0xa0, 0xd4, 0xfd, 0xae, + 0x87, 0xa7, 0xb9, 0xa7, 0x87, 0xeb, 0xd5, 0x06, + 0xa2, 0x6f, 0x42, 0x2b, 0x23, 0x6f, 0xf0, 0x4c, + 0x7a, 0x3e, 0x26, 0xda, 0xb4, 0x36, 0xef, 0x9c, + 0x82, 0x68, 0x0f, 0x66, 0xbf, 0x3a, 0xad, 0x66, + 0x56, 0xd6, 0x94, 0x92, 0xe2, 0x7b, 0x91, 0xf0, + 0x55, 0x28, 0x57, 0xbf, 0x27, 0x70, 0xfd, 0xe7, + 0x68, 0x35, 0x4d, 0x68, 0x43, 0xd4, 0x60, 0x87, + 0x1b, 0xf9, 0x2c, 0xdf, 0xb5, 0x43, 0xda, 0x19, + 0xed, 0x07, 0x52, 0x2f, 0x08, 0xf1, 0xae, 0x16, + 0xfc, 0x3e, 0xc5, 0x54, 0x73, 0xd7, 0x5d, 0x34, + 0x0b, 0x2d, 0x74, 0x62, 0x86, 0xfd, 0xd7, 0x44, + 0x4d, 0x03, 0xfd, 0x15, 0xaf, 0x03, 0x4b, 0x3a, + 0xb1, 0x2f, 0xe5, 0xe2, 0xf1, 0x9a, 0x1a, 0x54, + 0x50, 0xf7, 0x06, 0x7b, 0x12, 0x72, 0xd3, 0xf7, + 0xc4, 0xc4, 0x7a, 0xca, 0x06, 0xbc, 0xf2, 0xba, + 0xb6, 0xce, 0x36, 0xd8, 0x0e, 0x13, 0xfe, 0xbf, + 0xb6, 0xae, 0x1e, 0xac, 0x8d, 0x33, 0x5b, 0x8f, + 0x60, 0x80, 0x91, 0x2c, 0xe3, 0xd1, 0x0f, 0x48, + 0xfc, 0x18, 0x06, 0x31, 0x02, 0x49, 0x60, 0x23, + 0x3b, 0x60, 0x63, 0x07, 0xa3, 0x31, 0x96, 0x93, + 0xe1, 0x27, 0xeb, 0x09, 0x16, 0x6b, 0xf6, 0x26, + 0x79, 0x2c, 0xe7, 0x92, 0x1b, 0x76, 0xb7, 0x58, + 0x25, 0x9b, 0xfb, 0x44, 0x4e, 0x64, 0xa4, 0xc2, + 0xc5, 0x14, 0x5b, 0x4c, 0xe1, 0xc2, 0x45, 0x0a, + 0x15, 0x14, 0x53, 0xa4, 0xa0, 0xb8, 0x85, 0x8b, + 0x2d, 0x54, 0xa4, 0x50, 0xb1, 0x05, 0xc5, 0x16, + 0x2e, 0x6e, 0x41, 0xe1, 0x82, 0xe2, 0x16, 0x53, + 0xb8, 0x98, 0x62, 0x8a, 0x7b, 0xce, 0xf9, 0x66, + 0x46, 0x12, 0xce, 0x33, 0xcf, 0x60, 0x6c, 0x59, + 0xd2, 0x48, 0xf3, 0x7d, 0xe7, 0xf7, 0x3d, 0xef, + 0xab, 0x07, 0x18, 0xc6, 0x46, 0xe9, 0xb7, 0x9f, + 0x23, 0x47, 0x2b, 0xb2, 0x94, 0x09, 0xec, 0xfc, + 0x09, 0xbe, 0x97, 0x80, 0x38, 0x4c, 0xd9, 0x71, + 0xcc, 0x8e, 0x68, 0x18, 0xe9, 0x30, 0x7f, 0x33, + 0x2a, 0xe0, 0xec, 0x43, 0xbf, 0xdd, 0x4f, 0x5a, + 0xc9, 0x84, 0xbc, 0x85, 0x7d, 0xbb, 0x22, 0x32, + 0xed, 0xc1, 0xa8, 0xc7, 0x6a, 0x9b, 0x27, 0x2e, + 0xa9, 0x33, 0x91, 0x22, 0x60, 0xb2, 0xfc, 0xf6, + 0xe4, 0xab, 0x0a, 0x2a, 0x68, 0x92, 0x1f, 0x58, + 0x2e, 0xfb, 0xb8, 0x82, 0xf2, 0xf8, 0x49, 0x36, + 0xa3, 0xca, 0x88, 0x48, 0x0a, 0x36, 0xa3, 0x5d, + 0xf9, 0x51, 0xdd, 0x19, 0x2c, 0x4f, 0x1a, 0x7f, + 0x73, 0x92, 0x8d, 0xa5, 0x33, 0xa1, 0x01, 0x99, + 0x56, 0x37, 0x9b, 0xd0, 0xd9, 0x96, 0x94, 0x6b, + 0x2e, 0xc2, 0x77, 0x5f, 0x17, 0x83, 0xf6, 0x54, + 0x09, 0x19, 0x73, 0xd1, 0x57, 0x06, 0xc5, 0x50, + 0x19, 0x33, 0xbe, 0x82, 0x4d, 0xfd, 0x77, 0xbf, + 0x5f, 0xc9, 0x18, 0xec, 0x18, 0xc7, 0xbe, 0x80, + 0x6c, 0x6e, 0xcd, 0xef, 0x9b, 0x71, 0xe3, 0x32, + 0x5c, 0xd5, 0x51, 0xc9, 0x45, 0xb0, 0x1b, 0x9b, + 0xf4, 0xdc, 0xce, 0xbc, 0xd5, 0x8b, 0x1f, 0xae, + 0xae, 0x22, 0x4a, 0x13, 0xf1, 0x79, 0xf8, 0x6d, + 0x26, 0x5b, 0x1d, 0x2d, 0x7b, 0xbc, 0x76, 0x66, + 0xfb, 0xbb, 0x2d, 0x30, 0x8b, 0x7b, 0xd8, 0xf9, + 0xf4, 0x1c, 0xb1, 0xcf, 0xec, 0x7c, 0xda, 0x56, + 0xf6, 0x3b, 0xd3, 0x76, 0xbf, 0x83, 0xb0, 0x83, + 0xab, 0x0a, 0x51, 0xa5, 0x16, 0xe7, 0x2c, 0x6f, + 0x48, 0x9f, 0x53, 0x2d, 0x3e, 0xe2, 0xeb, 0x41, + 0xc1, 0x53, 0xcf, 0xae, 0x90, 0x45, 0xbb, 0x62, + 0x7b, 0x3c, 0x4a, 0x3d, 0x53, 0x7e, 0xc8, 0x05, + 0xc7, 0x43, 0xa6, 0xf0, 0x8f, 0xa8, 0x06, 0xbf, + 0x69, 0xa3, 0xda, 0x84, 0x73, 0x00, 0xeb, 0x37, + 0x08, 0xdf, 0x34, 0xae, 0xd8, 0x4d, 0x25, 0x57, + 0xab, 0xb7, 0xbf, 0xca, 0x7f, 0x91, 0xff, 0x6b, + 0x1b, 0xd1, 0x84, 0x3d, 0x13, 0xcd, 0xf4, 0x79, + 0xbd, 0x19, 0x85, 0x5e, 0xf6, 0x18, 0x7c, 0x6e, + 0x4e, 0x99, 0xc4, 0xe7, 0x66, 0xbe, 0xc8, 0xff, + 0xb9, 0xbd, 0x5d, 0xf4, 0x22, 0x53, 0xc1, 0x55, + 0xd9, 0x66, 0xb3, 0xff, 0x41, 0x7b, 0x4c, 0xbd, + 0xaa, 0x4e, 0x1c, 0x2e, 0xbc, 0xce, 0xbe, 0xa6, + 0x4e, 0x1c, 0x31, 0xe2, 0x7a, 0xfa, 0x29, 0xf8, + 0xff, 0x99, 0xbe, 0x74, 0xbc, 0xec, 0xb1, 0x31, + 0x77, 0xec, 0xd5, 0x67, 0x4a, 0xb6, 0x96, 0x6b, + 0x83, 0xbd, 0xc9, 0xc0, 0xf5, 0x89, 0x7f, 0xcd, + 0x6f, 0xaa, 0xdb, 0x2f, 0x7b, 0xbf, 0xc9, 0xfb, + 0xc2, 0x7d, 0xe1, 0xe9, 0xf9, 0x03, 0xe1, 0xa1, + 0xf0, 0x27, 0xe1, 0x01, 0x21, 0xc9, 0x03, 0xd2, + 0x3d, 0x39, 0x9d, 0xc9, 0x5a, 0x59, 0xe9, 0x86, + 0x9c, 0x7d, 0x37, 0xff, 0x25, 0xe4, 0x50, 0x36, + 0xea, 0xdd, 0xce, 0x53, 0x86, 0xdb, 0xfd, 0x69, + 0xfa, 0x1b, 0x1f, 0xaa, 0x24, 0xb0, 0xec, 0xa9, + 0xb7, 0x83, 0xeb, 0x7d, 0x93, 0x02, 0xa2, 0xe2, + 0x1c, 0x42, 0x37, 0x9b, 0xbb, 0xb5, 0xa8, 0x98, + 0x30, 0x46, 0x1d, 0x88, 0x57, 0x8c, 0x18, 0xf8, + 0x6f, 0xec, 0xe1, 0x4e, 0x49, 0x31, 0x67, 0x4a, + 0x17, 0xb5, 0x82, 0x73, 0x53, 0x7a, 0xea, 0x44, + 0xa5, 0x80, 0xd4, 0xc5, 0x5a, 0xcc, 0x62, 0x7e, + 0x71, 0xc1, 0xc8, 0x39, 0x21, 0x73, 0xe2, 0x24, + 0x57, 0xdb, 0x86, 0x67, 0x8f, 0x42, 0x64, 0xb2, + 0x41, 0xcf, 0x85, 0x58, 0x05, 0x6c, 0x99, 0x60, + 0xb3, 0xca, 0x3f, 0xeb, 0x89, 0x20, 0xb3, 0x0f, + 0x63, 0x31, 0xc2, 0x1e, 0x07, 0x1e, 0x05, 0x36, + 0x31, 0x81, 0x55, 0x7f, 0x15, 0x67, 0xff, 0x3f, + 0x41, 0x65, 0x52, 0x09, 0x62, 0xcb, 0xda, 0x26, + 0xdc, 0xc1, 0xbf, 0x9e, 0x3e, 0xfa, 0xbf, 0x0b, + 0xd8, 0x68, 0xd7, 0x2f, 0x30, 0x3d, 0x1f, 0x0e, + 0x31, 0x2b, 0xc8, 0x57, 0x9e, 0x4f, 0x2d, 0x4b, + 0xff, 0x7a, 0xe0, 0xf7, 0x44, 0x64, 0xe3, 0xa9, + 0x85, 0x33, 0x2d, 0x71, 0x8d, 0xaa, 0x6b, 0x67, + 0xb1, 0x97, 0x93, 0x54, 0xc1, 0xa0, 0x15, 0x45, + 0x0c, 0x17, 0x1f, 0x59, 0xbb, 0x88, 0x69, 0x34, + 0x47, 0x21, 0xbb, 0xc3, 0xcf, 0x1f, 0x4d, 0x76, + 0x18, 0xbd, 0xa8, 0xf6, 0xf9, 0xdb, 0x16, 0xdf, + 0x0f, 0xdf, 0xd3, 0x78, 0xc3, 0xeb, 0xe2, 0x79, + 0x2b, 0x11, 0xe7, 0x92, 0x04, 0xb7, 0x57, 0xe6, + 0xf2, 0x22, 0x4a, 0x2c, 0xb3, 0x96, 0xa9, 0xfa, + 0xda, 0x51, 0xb1, 0x82, 0x0c, 0xca, 0xde, 0x54, + 0x83, 0xfb, 0x0c, 0x15, 0x56, 0x06, 0x5b, 0x87, + 0xea, 0x73, 0x69, 0xee, 0x67, 0x27, 0x52, 0xfa, + 0xc2, 0x79, 0x52, 0xda, 0x2b, 0x7d, 0x5e, 0x8a, + 0xd0, 0x3e, 0x62, 0x0c, 0xa3, 0xa8, 0x5f, 0x59, + 0xd1, 0xb1, 0xc2, 0x12, 0x15, 0xe2, 0xf9, 0x4e, + 0x3f, 0x74, 0xd6, 0x41, 0x64, 0x4c, 0xbf, 0xd5, + 0x2f, 0x7e, 0x6f, 0x44, 0xcb, 0xb0, 0x47, 0x4e, + 0x13, 0x1d, 0xce, 0x5b, 0x5f, 0x1d, 0xb8, 0xdf, + 0xfe, 0x9e, 0x3e, 0x51, 0x82, 0x74, 0xae, 0xe6, + 0x92, 0xac, 0x57, 0x8e, 0x3c, 0x79, 0x8c, 0xeb, + 0x7e, 0x97, 0xb2, 0x79, 0xec, 0x7a, 0x40, 0x1e, + 0x4c, 0xf6, 0x0a, 0x3f, 0xcd, 0x94, 0x82, 0x78, + 0x4e, 0xc6, 0xbe, 0xb2, 0xa8, 0x87, 0xf5, 0x11, + 0x61, 0x74, 0x59, 0xe6, 0xdd, 0x7c, 0xbf, 0x2a, + 0x1a, 0x31, 0xe9, 0x05, 0xab, 0xda, 0xd9, 0xcf, + 0x0f, 0xd5, 0x72, 0xb8, 0x19, 0x3f, 0x9e, 0x91, + 0x3f, 0x71, 0x91, 0xb7, 0xc8, 0xee, 0x5b, 0x68, + 0xb3, 0x5e, 0x1c, 0x53, 0x1b, 0x10, 0x88, 0xab, + 0x88, 0xe3, 0x32, 0x8d, 0x8c, 0x53, 0x33, 0xb2, + 0xb5, 0x3b, 0xa5, 0x58, 0xed, 0x45, 0x69, 0xaf, + 0xb6, 0x57, 0x7a, 0xa1, 0x81, 0x65, 0xcc, 0xc3, + 0x3d, 0x7e, 0x79, 0x91, 0xaf, 0x9e, 0x21, 0x7c, + 0x18, 0x97, 0x23, 0xed, 0x32, 0xf0, 0xdc, 0x10, + 0xfd, 0x28, 0x59, 0xca, 0xf6, 0xea, 0x76, 0x80, + 0xd5, 0x0b, 0xf1, 0x27, 0x7c, 0x93, 0x42, 0x46, + 0x90, 0x5d, 0x86, 0x2b, 0xc4, 0x03, 0xdb, 0x02, + 0x78, 0x8f, 0x49, 0x3b, 0x69, 0x0e, 0x9b, 0x95, + 0xd7, 0x2e, 0xe2, 0x28, 0x83, 0x16, 0x67, 0xe9, + 0x3c, 0x9b, 0xf1, 0xce, 0xec, 0x21, 0x22, 0xb3, + 0xbd, 0xfe, 0xaf, 0xc7, 0x06, 0x46, 0xd3, 0xdf, + 0x2e, 0x23, 0xc9, 0xcd, 0x7d, 0x57, 0x73, 0xcd, + 0x62, 0x9a, 0x9f, 0xae, 0xce, 0x59, 0x66, 0x56, + 0x85, 0xbb, 0xcf, 0x55, 0x89, 0xdb, 0x9f, 0x6a, + 0x26, 0x17, 0xe6, 0xb3, 0xc9, 0xae, 0xe4, 0xd9, + 0x2b, 0x23, 0x8a, 0x15, 0xe7, 0xf0, 0x46, 0xd5, + 0x8f, 0x21, 0x2a, 0x18, 0xf5, 0x74, 0x3f, 0xdc, + 0x6b, 0xae, 0x53, 0x5d, 0x0d, 0xfd, 0x18, 0x6a, + 0xc1, 0x09, 0x66, 0xdd, 0xc6, 0xbe, 0xa7, 0xf0, + 0x86, 0xac, 0x9a, 0xf2, 0xa3, 0x8f, 0x0e, 0x40, + 0xbe, 0x92, 0x65, 0x65, 0xd7, 0x8c, 0xbe, 0x8c, + 0xbf, 0x12, 0x2b, 0xbd, 0x51, 0x10, 0x8b, 0x84, + 0x06, 0x20, 0xc7, 0x7b, 0xb6, 0x38, 0x48, 0xf6, + 0xf9, 0xc3, 0x47, 0xb1, 0x9a, 0xef, 0xe9, 0x3b, + 0x7f, 0xf8, 0x68, 0x48, 0x9a, 0xd0, 0xfe, 0xf2, + 0x6b, 0xb4, 0x39, 0xc8, 0xf6, 0x2f, 0xd3, 0xf9, + 0xa4, 0x1a, 0x34, 0x7c, 0x02, 0x0d, 0x56, 0xf3, + 0xc1, 0xcc, 0xab, 0xb9, 0xf0, 0xc5, 0xe8, 0x0b, + 0xfd, 0xd6, 0x50, 0x6b, 0xb2, 0xf2, 0xed, 0xbf, + 0x18, 0xc3, 0x3c, 0x63, 0x04, 0x62, 0x0c, 0xd7, + 0x75, 0x42, 0xbc, 0x44, 0x20, 0x80, 0x85, 0xec, + 0xd2, 0x65, 0x6e, 0x21, 0xee, 0x4a, 0xe3, 0xe1, + 0x7e, 0xc2, 0x09, 0x5a, 0x9b, 0xda, 0x8c, 0x95, + 0xd5, 0x82, 0x16, 0xe6, 0x05, 0x92, 0x21, 0xe5, + 0xbd, 0xca, 0x58, 0x37, 0x8b, 0x6a, 0x77, 0xdf, + 0x39, 0x24, 0xe1, 0x31, 0xdd, 0x8c, 0xd6, 0x6e, + 0xaa, 0x8f, 0xdb, 0xb4, 0x33, 0x31, 0x9b, 0x3c, + 0x49, 0xb6, 0x63, 0xee, 0xee, 0xbe, 0x44, 0xb3, + 0x2e, 0xf9, 0xe6, 0x13, 0x27, 0xa2, 0xc5, 0xec, + 0x78, 0xd1, 0x63, 0xe0, 0xe8, 0xc6, 0xd6, 0x16, + 0x74, 0xc8, 0xd2, 0x51, 0xd7, 0xfb, 0xa4, 0x07, + 0x25, 0xd5, 0xc5, 0x28, 0xd2, 0xab, 0x27, 0xc3, + 0xba, 0x0f, 0xeb, 0x38, 0x85, 0x7d, 0x92, 0x6a, + 0x44, 0xed, 0x78, 0xbb, 0x6e, 0x0a, 0x27, 0xeb, + 0x86, 0x70, 0x22, 0xb4, 0x85, 0x97, 0x17, 0x55, + 0x6c, 0xc0, 0x6f, 0x9d, 0x3e, 0x0b, 0x7b, 0x6a, + 0x24, 0x17, 0x19, 0x36, 0x5c, 0xbc, 0x20, 0xad, + 0x17, 0x77, 0xee, 0xd8, 0x06, 0x7b, 0x5a, 0x2e, + 0x9d, 0x3c, 0xd9, 0x79, 0x62, 0x97, 0x94, 0x3d, + 0xab, 0xa6, 0x7c, 0xea, 0xe7, 0xb0, 0xb8, 0x8a, + 0x30, 0x57, 0x59, 0x53, 0x90, 0x59, 0xf0, 0xc7, + 0xff, 0x65, 0xea, 0x57, 0x5e, 0x45, 0xae, 0xc3, + 0x2f, 0x4a, 0xca, 0x86, 0xee, 0x89, 0xd3, 0xe1, + 0x9f, 0x26, 0xfd, 0x4c, 0x93, 0x8b, 0x40, 0x0c, + 0x92, 0x68, 0x27, 0xd5, 0x58, 0x3b, 0x5a, 0xe9, + 0xa0, 0x94, 0x29, 0x9b, 0xb0, 0x8f, 0x84, 0x58, + 0x3b, 0x0e, 0x91, 0xf0, 0x74, 0xfb, 0x7b, 0x64, + 0xcb, 0xee, 0xe0, 0xeb, 0x7c, 0xc6, 0x18, 0x9a, + 0x58, 0xd6, 0x3e, 0xb2, 0x4b, 0xc5, 0x8e, 0x12, + 0x8d, 0xeb, 0x73, 0x15, 0xc1, 0x11, 0xf4, 0x2b, + 0x7a, 0x08, 0xfb, 0x2a, 0x79, 0xd8, 0x73, 0x90, + 0xef, 0x0f, 0xf3, 0x9d, 0xa8, 0x80, 0x74, 0x06, + 0x09, 0xc5, 0xe1, 0x2b, 0xb2, 0xd1, 0x3d, 0xc4, + 0x6b, 0x24, 0xbe, 0xbd, 0xaa, 0xff, 0x13, 0xae, + 0x78, 0x96, 0x6c, 0x3b, 0x63, 0x5e, 0x7a, 0x60, + 0x63, 0x76, 0x39, 0x44, 0x9a, 0xc7, 0x82, 0x21, + 0xea, 0x91, 0xd5, 0xf9, 0xdf, 0x24, 0xbe, 0x33, + 0xd5, 0x98, 0x12, 0xe6, 0xdb, 0x82, 0xda, 0xdf, + 0x0e, 0x55, 0x42, 0x84, 0x09, 0x64, 0x0c, 0x93, + 0xdd, 0xcc, 0x2d, 0xb0, 0xc2, 0xcb, 0x01, 0xac, + 0x29, 0x70, 0x5e, 0x9e, 0xc2, 0x35, 0x8e, 0x1a, + 0x22, 0x58, 0xd8, 0xd8, 0xb9, 0x94, 0x59, 0xcb, + 0x7c, 0x73, 0x9e, 0xce, 0x13, 0x92, 0x9a, 0x67, + 0x93, 0xe3, 0xa2, 0x14, 0x5d, 0x1d, 0x69, 0x7f, + 0x93, 0xcf, 0x9c, 0x27, 0xe5, 0x79, 0xfb, 0x85, + 0x34, 0x66, 0x63, 0xfe, 0x7d, 0x43, 0xda, 0x3d, + 0x8b, 0xaf, 0xf9, 0xb1, 0x37, 0x7f, 0xef, 0xdd, + 0x9c, 0x2c, 0xcb, 0xf7, 0xde, 0xa5, 0x57, 0xbb, + 0x7b, 0x13, 0xdd, 0x79, 0x28, 0x45, 0x0c, 0xee, + 0x67, 0x4e, 0x8a, 0xe5, 0x72, 0xe7, 0x51, 0x56, + 0x03, 0x72, 0x2b, 0x41, 0x76, 0x0d, 0xa2, 0xcd, + 0x3e, 0x6f, 0x06, 0xb0, 0x35, 0x63, 0x4d, 0x4b, + 0xe2, 0x59, 0xff, 0x97, 0x75, 0x7f, 0x8a, 0x6b, + 0x91, 0xb8, 0xa3, 0xb1, 0xea, 0x2d, 0x9c, 0x16, + 0xa4, 0x5c, 0x65, 0xe1, 0x57, 0xb0, 0x0b, 0x52, + 0xaf, 0x46, 0x24, 0x61, 0x4d, 0x69, 0x36, 0xe9, + 0x47, 0x07, 0x35, 0x2c, 0x22, 0x4a, 0xbf, 0x18, + 0x6e, 0xfe, 0xa0, 0x30, 0xed, 0x15, 0xc6, 0x0f, + 0xe8, 0xf2, 0x04, 0x56, 0xd7, 0x20, 0x93, 0xc1, + 0xcc, 0x33, 0x2d, 0xac, 0x0b, 0xc8, 0x30, 0xd9, + 0x85, 0xea, 0xa4, 0x0a, 0xa2, 0xe7, 0xf7, 0xdd, + 0x68, 0x84, 0xe3, 0xab, 0x60, 0xb9, 0x35, 0x5e, + 0x2b, 0x9c, 0x21, 0x3e, 0xa1, 0xfe, 0x1b, 0x5f, + 0x14, 0x0e, 0x84, 0x7d, 0x66, 0xbd, 0xf1, 0xaa, + 0xe2, 0xa7, 0x31, 0x29, 0x55, 0xf9, 0xea, 0x57, + 0xc1, 0x3e, 0x92, 0x04, 0x3b, 0x27, 0x5d, 0x75, + 0x3c, 0x1c, 0x05, 0x64, 0x01, 0x4a, 0xb4, 0x9a, + 0xd3, 0x37, 0xcf, 0xd7, 0x33, 0xa9, 0xcc, 0xfa, + 0x79, 0xea, 0x64, 0xbd, 0x21, 0x37, 0xe6, 0x5e, + 0xde, 0x65, 0xb8, 0x2f, 0x37, 0xe3, 0x86, 0x58, + 0xe2, 0x34, 0xae, 0xd1, 0xf9, 0x3e, 0x1e, 0x9e, + 0x77, 0xae, 0x95, 0x76, 0xdf, 0x11, 0x07, 0x9d, + 0x74, 0xad, 0x7a, 0x4d, 0xbd, 0xc6, 0x38, 0xcb, + 0x6b, 0xd7, 0x94, 0x42, 0xed, 0xda, 0xe2, 0xb5, + 0xd2, 0xb5, 0xe2, 0x17, 0xaf, 0x49, 0x07, 0xe1, + 0xac, 0xe0, 0x32, 0x27, 0x32, 0x51, 0xe0, 0x60, + 0x63, 0xd8, 0xc7, 0xe5, 0x7a, 0xab, 0x4e, 0xe4, + 0x7a, 0x8f, 0x2b, 0x3e, 0x8a, 0x06, 0xe7, 0x58, + 0xc5, 0xe6, 0x6d, 0xa7, 0x54, 0xa4, 0xc9, 0x5f, + 0xf0, 0xa8, 0x11, 0x61, 0x94, 0x6a, 0x9b, 0xbc, + 0x80, 0x9a, 0xc2, 0x11, 0xf0, 0x27, 0x21, 0x42, + 0x59, 0x4c, 0x33, 0xfd, 0x0c, 0x61, 0x9a, 0x29, + 0x67, 0xb9, 0x35, 0x99, 0x1a, 0xcb, 0x14, 0xab, + 0xa2, 0x3e, 0xa9, 0x3f, 0xa3, 0x89, 0x69, 0x4f, + 0xd3, 0x07, 0x59, 0xbd, 0x8e, 0x98, 0xb2, 0x8a, + 0xba, 0xa6, 0xca, 0x2a, 0x22, 0xd8, 0x23, 0x42, + 0xaa, 0x8b, 0x87, 0xea, 0x8f, 0xc2, 0x13, 0xdb, + 0x9d, 0x4d, 0x16, 0xff, 0xd4, 0x51, 0x84, 0x61, + 0xd1, 0x33, 0xd9, 0xa5, 0x21, 0xb0, 0x0a, 0xc4, + 0x47, 0x28, 0xf4, 0xb2, 0x53, 0x26, 0x9c, 0x3b, + 0xdc, 0x0a, 0x1c, 0x9f, 0xfb, 0xfa, 0xce, 0xa2, + 0xaf, 0xfe, 0xec, 0xeb, 0x91, 0x30, 0xee, 0x09, + 0x78, 0xdd, 0x94, 0xb8, 0x28, 0x32, 0x16, 0x94, + 0x8e, 0x5d, 0x67, 0xd1, 0x7e, 0x50, 0x1a, 0xd1, + 0xbe, 0xfd, 0xd7, 0x58, 0xbe, 0xdf, 0xe3, 0x85, + 0xd0, 0x25, 0xe4, 0xab, 0xb5, 0xa7, 0x85, 0xbe, + 0x7c, 0xaf, 0x0a, 0xb3, 0x37, 0x07, 0xe0, 0x69, + 0xb6, 0x74, 0xdb, 0x42, 0xd7, 0xc6, 0x3a, 0x18, + 0xe5, 0x4e, 0x36, 0x27, 0x9c, 0x09, 0x6d, 0xc1, + 0x5e, 0x2c, 0x6e, 0xbb, 0x71, 0x38, 0xbb, 0x2a, + 0xc9, 0x9d, 0x74, 0xfa, 0x60, 0x6e, 0x8d, 0x5e, + 0x39, 0x24, 0xfd, 0xdd, 0x89, 0xd3, 0x1a, 0x79, + 0xa1, 0x86, 0xb1, 0x8e, 0x0f, 0x39, 0xdb, 0x26, + 0xcd, 0x88, 0x31, 0x26, 0x4b, 0x62, 0x14, 0x50, + 0x48, 0x39, 0x40, 0x95, 0x69, 0xc5, 0xce, 0x09, + 0xd8, 0xf5, 0x08, 0x08, 0x77, 0x84, 0xa5, 0xd3, + 0xac, 0xb8, 0x74, 0xb6, 0x2a, 0x2c, 0xb4, 0x73, + 0xda, 0xc7, 0xef, 0x72, 0xc5, 0xac, 0x9e, 0x6d, + 0x5f, 0x17, 0xf7, 0x71, 0x2f, 0x88, 0x77, 0xc4, + 0x7e, 0xc8, 0xca, 0x02, 0x16, 0x62, 0x9f, 0x70, + 0x4e, 0x6d, 0x0d, 0x95, 0xa2, 0xd4, 0xb5, 0x22, + 0x53, 0x29, 0x4a, 0x2a, 0x7f, 0x69, 0xa4, 0xed, + 0x31, 0xe1, 0xcf, 0xf6, 0x65, 0x61, 0xc4, 0x3e, + 0x28, 0x87, 0xcb, 0x71, 0x62, 0x3c, 0x46, 0xd5, + 0xcb, 0x41, 0x6e, 0xd5, 0x96, 0xd5, 0x39, 0xf5, + 0xae, 0xfe, 0x37, 0xfb, 0x77, 0x18, 0xdb, 0x90, + 0x4b, 0x4a, 0x8b, 0xea, 0xb3, 0xef, 0xbf, 0x6c, + 0x22, 0xf7, 0x4f, 0x50, 0xea, 0x5e, 0xed, 0xec, + 0x9a, 0x49, 0x35, 0x40, 0xc9, 0x20, 0xa3, 0x0d, + 0x5d, 0xf3, 0x1d, 0x21, 0x25, 0xc8, 0xf4, 0x89, + 0x38, 0xad, 0x8a, 0x63, 0x9f, 0xca, 0x23, 0x87, + 0x18, 0x27, 0xca, 0x6a, 0xb3, 0x6a, 0x04, 0xc4, + 0x41, 0xaa, 0x33, 0x30, 0x8c, 0x6b, 0x5d, 0x09, + 0xd9, 0x5b, 0x3a, 0xaa, 0xce, 0xd7, 0x49, 0x39, + 0x33, 0xaa, 0x49, 0xc4, 0x18, 0x43, 0x53, 0x7d, + 0x3a, 0xaf, 0xd7, 0x0c, 0xbe, 0xc9, 0xb7, 0xf0, + 0x6f, 0x93, 0x8d, 0x83, 0x06, 0xff, 0x12, 0x0e, + 0x8c, 0x54, 0x9b, 0x21, 0x33, 0x78, 0x42, 0xd5, + 0xb4, 0xe6, 0x13, 0x9f, 0x0b, 0x5d, 0x6c, 0xc6, + 0x44, 0xcc, 0x43, 0xfb, 0x3c, 0x95, 0x57, 0xec, + 0x6d, 0x2b, 0x98, 0xfd, 0xf6, 0xf9, 0xff, 0xc6, + 0xd6, 0x86, 0x97, 0x09, 0xb2, 0xbb, 0x3e, 0xa2, + 0x2d, 0x9d, 0xfb, 0x8a, 0x8a, 0xcd, 0xa8, 0x19, + 0x39, 0xa9, 0x3b, 0x4c, 0xcb, 0x68, 0x52, 0xf9, + 0xce, 0xf2, 0x5e, 0x79, 0x2d, 0xdc, 0x65, 0xf9, + 0xcb, 0x49, 0x6d, 0x52, 0x1d, 0x2f, 0xe6, 0x8a, + 0x8c, 0xf5, 0x94, 0xdd, 0x7d, 0xcc, 0xe6, 0x21, + 0xb6, 0x6b, 0xac, 0x3b, 0x59, 0x31, 0x6b, 0x6c, + 0x19, 0xc3, 0x5a, 0x15, 0xb9, 0x78, 0xb5, 0x20, + 0xf9, 0x05, 0x64, 0xdf, 0x60, 0x8c, 0xdf, 0x9b, + 0xd2, 0xa6, 0xfc, 0xd3, 0x97, 0x3b, 0xf0, 0xb7, + 0xaa, 0xcf, 0xbf, 0xc1, 0x2b, 0x63, 0xf6, 0x77, + 0xc4, 0x0e, 0xf8, 0x02, 0x3e, 0xcb, 0xd8, 0xfe, + 0xad, 0x83, 0x15, 0x43, 0x2b, 0x47, 0x74, 0x64, + 0x97, 0x62, 0xbe, 0x3b, 0x6e, 0xa3, 0x9f, 0xf8, + 0x52, 0x67, 0x88, 0xc3, 0x1c, 0xec, 0xc2, 0xa4, + 0x3e, 0xcc, 0xea, 0xfc, 0x38, 0xbf, 0x80, 0xd7, + 0x65, 0xdf, 0x57, 0x8f, 0x10, 0x4d, 0xa5, 0x0e, + 0xab, 0x55, 0x62, 0x89, 0x1c, 0xa7, 0x3d, 0x18, + 0x84, 0xcf, 0x7a, 0x1f, 0x2b, 0x0f, 0x93, 0x3c, + 0x77, 0x09, 0x2c, 0x26, 0x4e, 0x3a, 0x49, 0xca, + 0xcc, 0xc9, 0xf5, 0x30, 0x43, 0xc1, 0x61, 0x3d, + 0x68, 0x58, 0x8f, 0xfe, 0x23, 0xf6, 0x3e, 0xc7, + 0x3d, 0xb4, 0x07, 0x20, 0x63, 0x43, 0x94, 0x23, + 0x2d, 0x67, 0x2f, 0x97, 0x94, 0x28, 0xd6, 0x30, + 0x47, 0xed, 0x09, 0xf9, 0x1b, 0x79, 0x40, 0x0e, + 0x3a, 0x11, 0xde, 0xd7, 0x14, 0xb0, 0xf7, 0x84, + 0x3d, 0x88, 0xe9, 0xf6, 0x10, 0xef, 0xd6, 0xdc, + 0x6f, 0x7a, 0xd3, 0xfd, 0x1e, 0xd7, 0x01, 0xf6, + 0xd8, 0x9e, 0x85, 0x07, 0x94, 0xde, 0x6c, 0xb1, + 0xc3, 0x21, 0x81, 0xbb, 0x0b, 0x7b, 0x44, 0x11, + 0x71, 0xe9, 0xfc, 0x3e, 0xcf, 0x3c, 0xfb, 0x20, + 0xf7, 0x33, 0x44, 0xdd, 0x93, 0x6a, 0xfd, 0x70, + 0xf2, 0xed, 0xf8, 0xdb, 0x9c, 0x7a, 0xf4, 0x76, + 0xe1, 0x90, 0xcd, 0x17, 0xa7, 0xde, 0x76, 0xf7, + 0x17, 0x42, 0xa4, 0x32, 0x1b, 0xa4, 0xd7, 0xc4, + 0x49, 0x3d, 0x05, 0xbc, 0x55, 0x3f, 0x3e, 0x06, + 0xef, 0x39, 0x93, 0xd9, 0x90, 0xc3, 0x52, 0xbe, + 0xd5, 0x8b, 0xfd, 0x20, 0x9e, 0x0b, 0x71, 0xda, + 0x49, 0xac, 0x8e, 0xff, 0x3b, 0x9a, 0x4f, 0xb4, + 0x90, 0xab, 0x06, 0x75, 0xef, 0x94, 0x46, 0xc0, + 0xaf, 0x4e, 0xfb, 0x8f, 0x1b, 0x70, 0xe7, 0x1b, + 0xb3, 0xf6, 0x75, 0xe1, 0x01, 0x64, 0x10, 0x34, + 0xff, 0x4b, 0x1c, 0x19, 0x89, 0xca, 0xb8, 0x09, + 0x76, 0xdb, 0x48, 0x58, 0x09, 0x6b, 0xc6, 0x4c, + 0x39, 0x3b, 0x8c, 0x3b, 0xda, 0xe5, 0xd0, 0x60, + 0x2c, 0x1a, 0x89, 0xca, 0xa8, 0x35, 0x6e, 0xc6, + 0xe4, 0x94, 0xb4, 0x81, 0x2c, 0xfb, 0x2e, 0x9e, + 0x9f, 0x71, 0x10, 0x79, 0xca, 0x78, 0x65, 0xff, + 0xee, 0xbb, 0x56, 0xd4, 0x3e, 0xa2, 0x69, 0x9c, + 0x68, 0x05, 0xa7, 0x0b, 0x87, 0xe4, 0x10, 0xf1, + 0x0a, 0x78, 0xcc, 0x2d, 0x8c, 0xb7, 0x05, 0xb1, + 0xcf, 0xea, 0xd9, 0xa6, 0xf6, 0x93, 0xca, 0x23, + 0x82, 0x59, 0xe9, 0x68, 0xda, 0x06, 0xc5, 0x71, + 0x83, 0xd4, 0x82, 0xca, 0x19, 0x49, 0x2d, 0x0b, + 0xc6, 0x25, 0x41, 0xf0, 0x2a, 0x9f, 0xe0, 0x15, + 0x96, 0xce, 0x36, 0x5d, 0x8d, 0x16, 0x77, 0xde, + 0x95, 0xe9, 0x2f, 0x70, 0xfd, 0xf6, 0x4f, 0x2a, + 0xd3, 0xf1, 0xdc, 0xf2, 0xa7, 0x9d, 0xfd, 0xab, + 0xf2, 0x6c, 0x9d, 0x35, 0x26, 0x22, 0x53, 0xf9, + 0x02, 0x6a, 0x62, 0xe2, 0x24, 0xbe, 0x31, 0x2c, + 0x7c, 0x18, 0x03, 0x63, 0xe4, 0xfd, 0xe7, 0x45, + 0x78, 0x7d, 0x56, 0x49, 0x30, 0xd6, 0x88, 0x79, + 0x25, 0xed, 0xd7, 0x9d, 0xa9, 0xb7, 0xd9, 0x4c, + 0x8b, 0x7f, 0xe8, 0xec, 0x23, 0x27, 0x54, 0x1c, + 0x2f, 0x92, 0x3a, 0x7b, 0x39, 0xd3, 0xa5, 0xcf, + 0x8e, 0xdf, 0x05, 0xb2, 0xf7, 0x1f, 0x29, 0xb9, + 0xea, 0x7a, 0x3b, 0x67, 0x17, 0x54, 0xbe, 0x7a, + 0x57, 0xbd, 0xae, 0x66, 0x54, 0xac, 0x9c, 0x74, + 0xb0, 0xf1, 0x63, 0xd2, 0xd5, 0x35, 0xbf, 0x83, + 0x2f, 0xb9, 0x8a, 0xc6, 0xba, 0xa0, 0x41, 0xae, + 0xa9, 0x91, 0x16, 0xc9, 0x5b, 0x88, 0x1a, 0x6c, + 0x5e, 0xfc, 0xc8, 0xc9, 0x19, 0x19, 0x0d, 0xb1, + 0xb5, 0xa4, 0x69, 0x21, 0xbc, 0xa0, 0x9c, 0x7e, + 0xdd, 0x5c, 0x31, 0x97, 0x9d, 0xcf, 0x85, 0xcf, + 0x31, 0x9f, 0x14, 0x92, 0x42, 0x57, 0xe4, 0xa6, + 0x78, 0x8a, 0xe3, 0x1b, 0x45, 0x77, 0xc5, 0xb6, + 0x7a, 0xf2, 0x32, 0xee, 0xb1, 0xcd, 0x7c, 0x93, + 0x58, 0x86, 0x1c, 0x50, 0x98, 0x64, 0x48, 0x45, + 0x8b, 0xfa, 0x32, 0x54, 0xe7, 0xe8, 0x53, 0x3e, + 0xec, 0x02, 0x20, 0x7b, 0x30, 0x8b, 0x2b, 0x27, + 0xcf, 0x7a, 0xf9, 0xf9, 0x03, 0x3d, 0x2a, 0xd9, + 0x17, 0xf1, 0x57, 0x2c, 0x26, 0x64, 0x5c, 0xca, + 0xfd, 0xb6, 0x70, 0x26, 0x9c, 0x05, 0x49, 0xf5, + 0x87, 0xb1, 0x62, 0x32, 0x1e, 0x8c, 0x28, 0xf8, + 0x4f, 0x4e, 0xa9, 0x34, 0x22, 0x1c, 0x53, 0x7a, + 0xfa, 0x50, 0xfb, 0xec, 0xa6, 0xb4, 0x2b, 0x61, + 0xc6, 0x1f, 0x57, 0x93, 0x7c, 0xa4, 0x01, 0xd7, + 0x2d, 0x76, 0x74, 0x0f, 0xb3, 0xea, 0x82, 0xfd, + 0xf1, 0xdb, 0xf4, 0xdb, 0x05, 0xbb, 0x70, 0x98, + 0xde, 0x5f, 0xb2, 0x57, 0x84, 0x74, 0xb2, 0xb3, + 0x53, 0x62, 0xf9, 0xd1, 0xb7, 0xa8, 0xc0, 0x8c, + 0x58, 0x62, 0x9c, 0x9a, 0xff, 0xd4, 0xf6, 0xa6, + 0x01, 0x5d, 0x2b, 0xdb, 0x1b, 0xe3, 0x8a, 0xc8, + 0x83, 0xe1, 0x61, 0xd2, 0xa9, 0x12, 0x68, 0x22, + 0xa3, 0x61, 0x82, 0xf4, 0x07, 0x59, 0x95, 0x78, + 0x46, 0x42, 0xfe, 0x30, 0xd4, 0x77, 0x96, 0x10, + 0xed, 0xa8, 0x8f, 0xd3, 0x2c, 0xe5, 0xf6, 0xb9, + 0x4a, 0x3a, 0x62, 0x1d, 0x76, 0x8e, 0x79, 0x7b, + 0x20, 0x83, 0x8a, 0x16, 0xb3, 0xd6, 0x8c, 0xa4, + 0xb4, 0xee, 0x9f, 0xa1, 0x1a, 0x45, 0xef, 0xaa, + 0xc3, 0xbd, 0x5d, 0xb0, 0x78, 0xc8, 0x0e, 0x06, + 0xcb, 0xd5, 0x24, 0xdb, 0x29, 0x3f, 0xd3, 0x3e, + 0x79, 0xe4, 0xee, 0x93, 0x2d, 0xb5, 0x56, 0xec, + 0xee, 0x88, 0x75, 0xd4, 0x1f, 0x2f, 0xd6, 0x82, + 0xb0, 0x5e, 0xc1, 0x74, 0x7f, 0x51, 0xef, 0x34, + 0x5c, 0xb9, 0x6c, 0x5e, 0x96, 0x47, 0x9b, 0x89, + 0x26, 0xcb, 0xf7, 0xb9, 0x1e, 0xad, 0x70, 0x7f, + 0x5a, 0x07, 0x96, 0xea, 0xb4, 0xdd, 0xd1, 0x86, + 0x2e, 0x74, 0x79, 0xd0, 0x6e, 0x8d, 0x8c, 0x88, + 0x13, 0x91, 0x23, 0xf2, 0x9e, 0xb3, 0x27, 0xc3, + 0xe1, 0x94, 0xa4, 0x92, 0x54, 0xf3, 0x5e, 0xc2, + 0xbd, 0xf7, 0x1b, 0xfc, 0x43, 0x6d, 0x44, 0x8d, + 0xbf, 0x4c, 0xcb, 0x43, 0x67, 0x63, 0x5c, 0x2f, + 0x83, 0x77, 0xdd, 0x79, 0x50, 0x2c, 0xbd, 0x1a, + 0xc9, 0xcc, 0xbf, 0x1b, 0xe3, 0x3c, 0xd6, 0x01, + 0x86, 0x37, 0xeb, 0xe2, 0x2a, 0x69, 0x0e, 0x61, + 0x27, 0xe9, 0x5c, 0x2c, 0xe2, 0xef, 0xf7, 0xc5, + 0x4f, 0xc2, 0x9d, 0x5c, 0x92, 0xc5, 0xb7, 0x2c, + 0xa6, 0x09, 0xeb, 0x3f, 0x68, 0x6c, 0x1a, 0x0b, + 0xa3, 0x82, 0x0a, 0x72, 0x8b, 0x9d, 0xd7, 0xf8, + 0x98, 0x9d, 0x14, 0x97, 0xcb, 0xcb, 0x99, 0xdd, + 0x63, 0xc8, 0xac, 0x0d, 0xcc, 0xac, 0xb9, 0xe4, + 0xbd, 0x33, 0x88, 0xf1, 0xc3, 0xf7, 0x2a, 0xe9, + 0x83, 0xf4, 0xc1, 0xbd, 0x43, 0x9c, 0xd6, 0xc1, + 0x88, 0x62, 0xae, 0xb8, 0xe3, 0x33, 0x2f, 0x09, + 0x27, 0xa8, 0xdd, 0x11, 0x3d, 0x8e, 0x2d, 0xde, + 0xcb, 0xc8, 0x95, 0x41, 0x31, 0x04, 0xd6, 0x96, + 0xe2, 0x2b, 0x61, 0x2b, 0xbf, 0xd0, 0x5a, 0x24, + 0x8f, 0x24, 0x20, 0x3b, 0xb8, 0x93, 0x43, 0x2f, + 0x89, 0xa4, 0x6e, 0x6b, 0x17, 0xa6, 0x1a, 0x1b, + 0x2e, 0x0b, 0x8d, 0x3c, 0x1a, 0x4f, 0x86, 0xcb, + 0x3c, 0x63, 0x69, 0xde, 0x14, 0x36, 0x09, 0x21, + 0xb1, 0x29, 0x3d, 0x77, 0xe8, 0xa7, 0x18, 0x28, + 0x05, 0x98, 0x72, 0x74, 0x63, 0xbd, 0xc1, 0x3b, + 0x63, 0x46, 0x48, 0x3b, 0x92, 0x42, 0xa7, 0x13, + 0x3b, 0x93, 0xc8, 0x04, 0xa8, 0x7a, 0x9e, 0xce, + 0x43, 0xa8, 0x7b, 0x51, 0xfd, 0x7d, 0xfe, 0xc1, + 0xbb, 0x29, 0x64, 0x07, 0x42, 0x31, 0x19, 0x37, + 0xfb, 0x45, 0x6c, 0x50, 0xdd, 0xc6, 0x1e, 0x4e, + 0x88, 0x3a, 0x7d, 0xde, 0x94, 0x1f, 0xaa, 0x50, + 0xf5, 0x49, 0xbc, 0x55, 0x10, 0x3a, 0xca, 0xf2, + 0xbd, 0x13, 0xcd, 0x7d, 0x52, 0x80, 0xf1, 0x80, + 0xe8, 0x01, 0x03, 0x15, 0xe7, 0x93, 0x8d, 0x32, + 0xf6, 0x6d, 0x1b, 0xec, 0x51, 0x9f, 0x95, 0x4b, + 0x59, 0xaf, 0xc5, 0x4f, 0xeb, 0x95, 0x89, 0x5f, + 0x17, 0xe1, 0xca, 0x48, 0xc7, 0x44, 0x5a, 0x57, + 0x06, 0x6c, 0x1e, 0x15, 0xda, 0xf5, 0xb8, 0xbd, + 0xe6, 0x2c, 0x37, 0x96, 0x9d, 0x5b, 0xa5, 0xc2, + 0xaf, 0xff, 0x59, 0xec, 0x73, 0xf1, 0xc0, 0x10, + 0x3d, 0x43, 0x44, 0x9a, 0x64, 0x0a, 0xbe, 0x52, + 0xe6, 0x44, 0x35, 0xd1, 0x12, 0x92, 0x6e, 0x38, + 0x6a, 0x64, 0xa0, 0xc2, 0x73, 0x35, 0xdd, 0x9a, + 0x5b, 0x4b, 0xdb, 0xff, 0x2d, 0x6c, 0x52, 0x04, + 0xf7, 0x4c, 0x08, 0x78, 0x58, 0x62, 0x36, 0x3d, + 0x4a, 0xa8, 0xcb, 0xbb, 0xc7, 0xb2, 0x39, 0x68, + 0x84, 0x4e, 0xf2, 0xed, 0x7e, 0xde, 0xeb, 0xd2, + 0x7a, 0x9a, 0x57, 0x2c, 0x92, 0xed, 0x54, 0x89, + 0xfb, 0xa8, 0x07, 0xc8, 0x4b, 0x10, 0x89, 0x36, + 0x66, 0xf0, 0x77, 0x7b, 0x92, 0xb0, 0x0e, 0xbc, + 0x30, 0x64, 0x73, 0x5c, 0x47, 0x73, 0x85, 0xd8, + 0x9c, 0x75, 0x76, 0xac, 0x31, 0xa5, 0x9a, 0x9e, + 0x8e, 0xbe, 0xab, 0x63, 0x63, 0xbf, 0x20, 0x26, + 0x25, 0xfe, 0x02, 0xa3, 0x08, 0x66, 0x79, 0x17, + 0xfd, 0xaf, 0x4c, 0x5d, 0x56, 0x0e, 0x76, 0xfe, + 0x77, 0xad, 0x08, 0x71, 0x63, 0x89, 0xf0, 0x5d, + 0x76, 0xd4, 0xeb, 0xe2, 0x55, 0x88, 0x73, 0x8c, + 0xaf, 0x34, 0xb0, 0xf1, 0x8a, 0x60, 0x2f, 0x74, + 0xc5, 0x39, 0x38, 0x8b, 0xf8, 0xb3, 0xb5, 0x25, + 0x6e, 0xd3, 0xb9, 0xed, 0x6c, 0x71, 0xdb, 0xce, + 0x4f, 0xc7, 0x03, 0xa5, 0x01, 0x5e, 0x48, 0xba, + 0x88, 0x94, 0x06, 0x4e, 0x5b, 0x82, 0x95, 0x52, + 0x65, 0xe5, 0x47, 0xb0, 0x03, 0x61, 0x25, 0xae, + 0x30, 0xee, 0x1d, 0x16, 0x99, 0x65, 0x50, 0xa5, + 0xd1, 0x50, 0x9b, 0x42, 0x6b, 0xb8, 0x51, 0x45, + 0xbf, 0xe9, 0x6a, 0xbd, 0x89, 0x12, 0x56, 0xa1, + 0x3e, 0x75, 0x64, 0x69, 0xfe, 0x1c, 0x6c, 0xce, + 0x61, 0xe2, 0x64, 0x44, 0x4c, 0x9f, 0xe4, 0x4a, + 0x3b, 0xff, 0xd0, 0x08, 0x0f, 0x3c, 0xd4, 0x12, + 0xc0, 0xb6, 0x7a, 0x4c, 0x60, 0xc4, 0x42, 0xe5, + 0xcf, 0xf2, 0xe0, 0xfc, 0x49, 0x47, 0x11, 0x77, + 0x5c, 0xca, 0x3a, 0x59, 0x79, 0x53, 0x0e, 0xca, + 0xc1, 0x55, 0x81, 0xf5, 0xac, 0x1b, 0x69, 0xeb, + 0xcf, 0xc4, 0x04, 0x94, 0xb6, 0x7e, 0x72, 0xd9, + 0x29, 0x77, 0xd5, 0xdd, 0x0a, 0x63, 0x5e, 0x4a, + 0x40, 0x36, 0x70, 0xd0, 0x98, 0x40, 0xee, 0x3b, + 0xf3, 0xe8, 0x3c, 0x6a, 0xde, 0x3d, 0xbf, 0x65, + 0xde, 0x32, 0x5d, 0x0e, 0x58, 0xb7, 0x3a, 0x5d, + 0xb7, 0x19, 0x77, 0x0a, 0x3b, 0x55, 0xd5, 0x9d, + 0x8c, 0xe0, 0x30, 0xeb, 0x12, 0x20, 0x76, 0x09, + 0x96, 0x50, 0x51, 0xfe, 0xea, 0x0f, 0xe9, 0xd2, + 0x1e, 0xf8, 0xc0, 0x51, 0xee, 0x99, 0xc3, 0xb0, + 0x88, 0x90, 0xb3, 0x35, 0x99, 0x1d, 0xa6, 0x4e, + 0x1d, 0xc5, 0xb1, 0x11, 0x11, 0x75, 0x78, 0xbd, + 0xa9, 0xa8, 0x20, 0xea, 0xbf, 0xda, 0x13, 0x42, + 0xd6, 0x26, 0x6d, 0xc3, 0x66, 0x90, 0xba, 0x3c, + 0x5e, 0xce, 0x1e, 0x10, 0x03, 0x02, 0x56, 0x50, + 0x70, 0xfe, 0x0a, 0x3c, 0xc6, 0xc1, 0xcc, 0x2f, + 0x9f, 0xf0, 0xdd, 0x59, 0xdb, 0x90, 0x1d, 0x60, + 0x9d, 0x7e, 0xe9, 0x0a, 0x78, 0x48, 0xa6, 0xc7, + 0x07, 0x3b, 0x8f, 0x2a, 0x0f, 0x64, 0x61, 0xb9, + 0x8b, 0xb3, 0x69, 0x88, 0x34, 0x9e, 0xa2, 0xb5, + 0x87, 0x98, 0xdb, 0x3e, 0xcf, 0x87, 0xb8, 0xec, + 0x0d, 0xa8, 0xe9, 0x93, 0x17, 0xc5, 0xf2, 0x6d, + 0xc8, 0x16, 0x88, 0x2d, 0xd9, 0xdc, 0xa2, 0xde, + 0x1c, 0xd3, 0xe0, 0xf6, 0xde, 0x77, 0xc8, 0xba, + 0x38, 0x71, 0xe5, 0x71, 0xed, 0x26, 0x32, 0xff, + 0x65, 0x8e, 0xb7, 0x27, 0xec, 0x39, 0x8c, 0xb2, + 0xf4, 0xbb, 0xfa, 0x2d, 0xfd, 0x56, 0xd5, 0x9d, + 0x0f, 0x85, 0x5c, 0xb5, 0x0e, 0x71, 0xe1, 0xd1, + 0x7e, 0xf0, 0x0c, 0xbe, 0xb3, 0x2f, 0xaf, 0x9e, + 0x8d, 0x2b, 0x60, 0x93, 0x5c, 0x8b, 0xe4, 0x69, + 0x41, 0x3d, 0x7a, 0x87, 0xdf, 0x78, 0xbf, 0x7a, + 0xef, 0x74, 0xb0, 0x79, 0xc7, 0x18, 0xd4, 0xab, + 0x2f, 0x19, 0x03, 0xff, 0x15, 0xd8, 0x65, 0xd3, + 0x19, 0x31, 0x8f, 0xb8, 0xba, 0x44, 0x55, 0x6c, + 0x27, 0xaa, 0x23, 0xea, 0x88, 0x0a, 0xbf, 0x71, + 0xbd, 0x71, 0x2c, 0x7a, 0x94, 0x0e, 0xd2, 0x89, + 0xec, 0x46, 0xbe, 0x90, 0x49, 0x67, 0x0a, 0x4e, + 0x5a, 0x2a, 0x48, 0xbc, 0x56, 0xd0, 0xe0, 0x35, + 0xbb, 0xb4, 0xdd, 0xb9, 0x0b, 0xa8, 0xad, 0x0f, + 0xb5, 0xcf, 0xba, 0x73, 0x4f, 0xaf, 0xa2, 0xe6, + 0x61, 0x98, 0x59, 0x07, 0x08, 0xa3, 0x49, 0x44, + 0x4e, 0x41, 0xd4, 0xaf, 0x8b, 0x58, 0x55, 0xa1, + 0x2e, 0x5e, 0x50, 0x80, 0x5c, 0xca, 0x58, 0x70, + 0x54, 0x9a, 0x2f, 0x29, 0x38, 0x88, 0xa1, 0xcb, + 0x18, 0x69, 0xf1, 0x63, 0xf1, 0x6b, 0x91, 0x74, + 0x88, 0x70, 0xb6, 0x0e, 0x5f, 0x9d, 0xc3, 0x63, + 0x00, 0x8e, 0x20, 0x21, 0xe7, 0x15, 0xa7, 0x17, + 0xf1, 0xeb, 0x5a, 0xe8, 0xc6, 0x8c, 0x92, 0x92, + 0x76, 0xc4, 0xbc, 0xab, 0x1d, 0xbc, 0x05, 0x91, + 0xf8, 0xa2, 0x1a, 0x54, 0x8f, 0xda, 0xe1, 0xc3, + 0xf1, 0xfd, 0x71, 0x35, 0xe3, 0x73, 0x92, 0xbb, + 0x11, 0xe6, 0x19, 0x75, 0x12, 0x7e, 0x47, 0x9f, + 0xae, 0xd3, 0xc7, 0xb9, 0xc0, 0x09, 0x74, 0xe1, + 0xd1, 0x0d, 0xe1, 0xbe, 0xf0, 0x50, 0x28, 0x65, + 0x4a, 0xfb, 0x07, 0xfb, 0x0f, 0xda, 0x4a, 0xb2, + 0x2b, 0x77, 0xd6, 0xe1, 0x93, 0xe9, 0x2f, 0x34, + 0x41, 0x5b, 0xc4, 0x39, 0x7e, 0x6d, 0x93, 0xe5, + 0x56, 0x3d, 0xaf, 0xdc, 0x73, 0x24, 0xfd, 0xef, + 0x0a, 0x32, 0x9f, 0x11, 0x31, 0x26, 0xce, 0x88, + 0x1b, 0xa7, 0x7d, 0x79, 0x7e, 0x12, 0xa2, 0x15, + 0x57, 0x55, 0x8d, 0xea, 0x0a, 0xf9, 0xc8, 0x69, + 0x02, 0x55, 0x95, 0xdc, 0x6e, 0x98, 0x5f, 0x17, + 0x6d, 0xe0, 0x3c, 0x16, 0xee, 0x9b, 0xc0, 0xea, + 0xd0, 0x6f, 0xb8, 0xca, 0x70, 0x7e, 0x6c, 0x03, + 0x32, 0x82, 0xce, 0x3d, 0xa2, 0x2e, 0xae, 0x15, + 0x31, 0x6e, 0x68, 0x8f, 0xa5, 0x78, 0x13, 0xbb, + 0xe9, 0x6e, 0x1e, 0xda, 0x42, 0xcc, 0x09, 0xeb, + 0x90, 0x14, 0x20, 0xb3, 0x9d, 0xaa, 0x44, 0xd5, + 0xa9, 0x62, 0xac, 0x78, 0x54, 0xed, 0x63, 0x78, + 0x6f, 0xbc, 0x7b, 0xda, 0x94, 0x16, 0x2d, 0xc3, + 0x4f, 0x35, 0x0a, 0x8f, 0x4c, 0x1d, 0x7c, 0xbd, + 0x8f, 0xd1, 0x27, 0xab, 0x24, 0xe4, 0x8c, 0x5c, + 0x19, 0xa3, 0x91, 0x9c, 0xa7, 0xcb, 0xc4, 0xb2, + 0xee, 0x32, 0xcd, 0x20, 0x80, 0x05, 0x1a, 0x70, + 0xee, 0x49, 0x73, 0x92, 0x74, 0x82, 0x2a, 0x36, + 0x03, 0x90, 0x95, 0x0d, 0xca, 0x82, 0x94, 0x2f, + 0xfb, 0x95, 0x5e, 0xf2, 0x62, 0xbe, 0x72, 0x9e, + 0x8f, 0xfc, 0x61, 0x4a, 0x61, 0xa2, 0xcb, 0x64, + 0x4e, 0x47, 0xb9, 0x53, 0x17, 0x45, 0x2e, 0xb8, + 0x19, 0x09, 0xed, 0x17, 0x72, 0xc1, 0xdd, 0x46, + 0xb5, 0x1f, 0x97, 0x0b, 0x6e, 0x32, 0xec, 0xa9, + 0x8b, 0x7e, 0x0f, 0x9e, 0xec, 0xb2, 0x10, 0xd5, + 0x09, 0x8b, 0x88, 0xa8, 0x40, 0x1c, 0x33, 0xf1, + 0x6b, 0xd7, 0xf3, 0xed, 0xb8, 0x76, 0xe5, 0x2c, + 0xbe, 0xff, 0xed, 0x6f, 0xbd, 0x8a, 0x30, 0xe8, + 0x49, 0x38, 0xf0, 0x55, 0x1c, 0x2a, 0xb0, 0x35, + 0xd7, 0x9a, 0x78, 0xa2, 0xd2, 0xd2, 0xba, 0xc0, + 0xfb, 0x93, 0x3e, 0xf3, 0xf6, 0x1a, 0xc4, 0xa2, + 0x82, 0x71, 0xcd, 0x41, 0x86, 0xf6, 0xac, 0xb4, + 0x64, 0xdf, 0x91, 0x9e, 0xd1, 0xec, 0x30, 0x31, + 0x4c, 0x42, 0x7e, 0x34, 0xe0, 0xc8, 0x5c, 0x9c, + 0xf1, 0x5b, 0x61, 0xe7, 0x8c, 0x34, 0xd7, 0xd0, + 0xc6, 0xc6, 0x56, 0x31, 0x16, 0x19, 0x47, 0xe6, + 0x0e, 0x13, 0x22, 0x4e, 0x33, 0xfe, 0x86, 0xf5, + 0x4c, 0x3d, 0x66, 0x80, 0x1c, 0xc4, 0x21, 0xf5, + 0xda, 0xa4, 0x91, 0x33, 0x50, 0xc9, 0x73, 0x0d, + 0x76, 0xe3, 0x38, 0xc3, 0x6e, 0x49, 0x51, 0x7b, + 0xcc, 0x4c, 0xdb, 0x32, 0xc4, 0x1a, 0x62, 0xa5, + 0xae, 0x45, 0x2a, 0x7b, 0xd5, 0x3b, 0xea, 0x8d, + 0xea, 0x54, 0xeb, 0xa0, 0xe6, 0xa1, 0x3a, 0xc7, + 0x20, 0x8a, 0x5d, 0xe6, 0x6f, 0xbb, 0xfa, 0xc0, + 0xa4, 0x11, 0xac, 0x8f, 0xbc, 0xee, 0xe8, 0xc2, + 0x1f, 0xfd, 0x12, 0x35, 0xa6, 0xe0, 0x88, 0x8a, + 0x89, 0x7c, 0x97, 0xc2, 0xaf, 0xcb, 0xa2, 0x8f, + 0x13, 0x7e, 0x2e, 0x9f, 0x0c, 0xd5, 0x7d, 0x67, + 0xd9, 0x14, 0x27, 0x2a, 0x74, 0xb7, 0x1e, 0xe5, + 0xb3, 0xce, 0x02, 0x58, 0xb8, 0x09, 0x73, 0xc1, + 0xdc, 0x7a, 0x2d, 0xb6, 0x46, 0x32, 0xe9, 0xb8, + 0xfa, 0x1e, 0x3d, 0xdd, 0xaa, 0xc2, 0x81, 0x27, + 0xeb, 0xb7, 0xd7, 0xf8, 0x7e, 0xf3, 0xae, 0x89, + 0xe7, 0x02, 0xc4, 0xc8, 0x77, 0xf5, 0x3e, 0xf6, + 0x79, 0x95, 0xa3, 0x26, 0x7a, 0xba, 0x27, 0x76, + 0x8d, 0x27, 0xfe, 0x58, 0x3a, 0x21, 0x06, 0xc0, + 0x3a, 0xa1, 0xc1, 0x19, 0xcf, 0xa5, 0x4d, 0x67, + 0x5b, 0xda, 0x96, 0x3e, 0xa3, 0x28, 0x6a, 0xd3, + 0x7e, 0xde, 0xd1, 0x00, 0xa5, 0x6c, 0x31, 0x01, + 0x56, 0xfd, 0x06, 0x87, 0x3d, 0xbe, 0x11, 0x61, + 0xcc, 0x55, 0xfa, 0x63, 0xbc, 0x10, 0xd8, 0x11, + 0x03, 0x9f, 0x61, 0xdd, 0x10, 0x9f, 0x3a, 0x13, + 0xa5, 0xe8, 0x79, 0xfc, 0x7d, 0xa4, 0x39, 0xea, + 0xa2, 0x3b, 0x60, 0xe5, 0x9c, 0xf1, 0xad, 0x7e, + 0xae, 0x47, 0x71, 0x0b, 0x32, 0xe3, 0xb0, 0x50, + 0xa9, 0x74, 0x70, 0x5f, 0x14, 0x59, 0x58, 0x83, + 0xe2, 0x80, 0x04, 0x79, 0x79, 0x23, 0xe2, 0xce, + 0x10, 0xb1, 0xc7, 0x36, 0xf8, 0xba, 0x0d, 0xde, + 0xd4, 0x0a, 0x8b, 0x57, 0x5c, 0x05, 0x1c, 0xa6, + 0xf8, 0x13, 0xe0, 0x06, 0xa4, 0x74, 0xe6, 0x4e, + 0x7b, 0x61, 0x7f, 0x61, 0x3f, 0x9d, 0x99, 0x5f, + 0x5d, 0xd8, 0x67, 0x7d, 0x71, 0x5f, 0x6b, 0xa6, + 0x31, 0xe2, 0x8c, 0x88, 0xb7, 0x9a, 0x25, 0x65, + 0xe4, 0x64, 0x34, 0x1c, 0xb9, 0xc0, 0x47, 0x81, + 0xef, 0xc9, 0xf0, 0x7a, 0x75, 0xe7, 0xe1, 0xf2, + 0x93, 0xf3, 0xd9, 0x77, 0xc3, 0xca, 0x8d, 0xc6, + 0x10, 0xf5, 0x25, 0xbb, 0x74, 0xe1, 0x21, 0x3e, + 0xbe, 0x8a, 0xdc, 0x86, 0x56, 0x64, 0x12, 0x39, + 0x48, 0xf3, 0x22, 0xe7, 0xeb, 0xfb, 0x32, 0xae, + 0x45, 0xa6, 0xf9, 0xdd, 0xd1, 0x21, 0xea, 0xd6, + 0xc7, 0xb9, 0xab, 0x22, 0x03, 0xe1, 0x6e, 0x37, + 0x13, 0x3e, 0xda, 0x38, 0x43, 0x29, 0xe3, 0xfd, + 0xed, 0x27, 0x8c, 0x8b, 0xa4, 0x2c, 0x39, 0xca, + 0xcb, 0x07, 0xfc, 0x4e, 0xd2, 0xe5, 0xc1, 0x38, + 0xf1, 0xee, 0xfe, 0x25, 0x62, 0x9b, 0x88, 0x31, + 0x0d, 0xd1, 0x7d, 0xe4, 0xa3, 0x50, 0x8d, 0x3c, + 0xf8, 0xe7, 0x7c, 0x73, 0xdb, 0x0e, 0xc1, 0xaa, + 0x5d, 0x58, 0xdd, 0x4a, 0x62, 0xa6, 0xc6, 0xf8, + 0x28, 0x20, 0x3f, 0xca, 0x44, 0xe5, 0xfa, 0x71, + 0x58, 0x2a, 0x38, 0xd7, 0xa4, 0x6b, 0xd2, 0xed, + 0xfc, 0x47, 0x38, 0x4f, 0xa7, 0x17, 0xf4, 0x00, + 0xcf, 0x75, 0x71, 0x71, 0xf6, 0xb2, 0xc4, 0xb2, + 0xef, 0xca, 0xcb, 0x34, 0xc9, 0xf4, 0x35, 0xe2, + 0xf6, 0x8a, 0xfe, 0x39, 0x4e, 0x27, 0xe8, 0xa2, + 0xcb, 0xb1, 0x80, 0x9c, 0xda, 0xb0, 0x6f, 0x95, + 0x50, 0x33, 0x4e, 0xeb, 0x7a, 0x2f, 0x4e, 0xf6, + 0x8e, 0x4d, 0x26, 0x42, 0xcc, 0x4f, 0x35, 0xf3, + 0xb3, 0x7b, 0x5a, 0x9f, 0x7a, 0xef, 0x1d, 0xec, + 0xd0, 0x37, 0xb2, 0x89, 0xaa, 0x80, 0x88, 0x37, + 0xeb, 0x93, 0x52, 0x54, 0xdb, 0x00, 0xfb, 0x54, + 0xfb, 0x3b, 0x78, 0x97, 0xa8, 0x13, 0x37, 0xe2, + 0xc6, 0xd8, 0x89, 0xd7, 0x69, 0xed, 0xe6, 0x60, + 0xef, 0xe2, 0x34, 0x20, 0x36, 0x83, 0x40, 0x63, + 0xbd, 0xca, 0xab, 0x05, 0xc4, 0x31, 0x95, 0xeb, + 0xa7, 0xe0, 0x3d, 0x8b, 0x85, 0xdf, 0xf8, 0x03, + 0x7e, 0x7f, 0x08, 0xd7, 0x39, 0xa1, 0x59, 0xb0, + 0x57, 0x16, 0x34, 0x42, 0x46, 0xd8, 0x0e, 0xc3, + 0xab, 0x8e, 0xda, 0x59, 0xe3, 0x91, 0xb1, 0xea, + 0x72, 0xee, 0xd5, 0xe1, 0x65, 0x20, 0x9e, 0x84, + 0x8c, 0x9d, 0x33, 0xeb, 0xf6, 0x9e, 0xf9, 0x6d, + 0xfe, 0x69, 0x66, 0x73, 0x75, 0xf3, 0xdd, 0xb6, + 0xcf, 0xd3, 0x8b, 0x0c, 0x9e, 0x03, 0xa2, 0x00, + 0x51, 0x0a, 0x63, 0xac, 0x08, 0x60, 0x55, 0xb3, + 0x2b, 0x6e, 0x0f, 0x34, 0x18, 0xce, 0x1d, 0x76, + 0x41, 0x97, 0x02, 0x4e, 0xa0, 0x2b, 0xce, 0x65, + 0xdf, 0x28, 0xf5, 0x35, 0xe1, 0xda, 0xfb, 0x59, + 0x17, 0x00, 0x56, 0x2a, 0xfd, 0xa4, 0xb9, 0x4a, + 0x7f, 0x52, 0x07, 0xb2, 0x4d, 0x52, 0xfa, 0x43, + 0xdd, 0x68, 0x29, 0x71, 0x5a, 0xb0, 0x15, 0x1e, + 0x75, 0x91, 0xf0, 0xf4, 0xe2, 0x91, 0x20, 0x77, + 0x63, 0x75, 0xe9, 0x7c, 0xbe, 0xbd, 0xb2, 0x3f, + 0xdf, 0x4e, 0xab, 0xb7, 0xdf, 0x22, 0xa3, 0x4f, + 0x8f, 0x66, 0xa2, 0x13, 0x85, 0xc8, 0x1b, 0xab, + 0xd0, 0x41, 0x3b, 0xa4, 0x87, 0x6d, 0x9a, 0x1b, + 0xd6, 0x04, 0x7d, 0x82, 0x67, 0x1c, 0x56, 0x10, + 0xb5, 0x82, 0x35, 0xfc, 0xd6, 0x41, 0x8b, 0x88, + 0x78, 0x06, 0x54, 0x94, 0xba, 0x49, 0x2b, 0x87, + 0x39, 0xb5, 0xa8, 0xf2, 0xd8, 0x46, 0x14, 0x05, + 0x63, 0x57, 0x1c, 0x85, 0x58, 0xe7, 0x19, 0xdd, + 0x23, 0xd2, 0x00, 0x75, 0x79, 0x5d, 0x90, 0x8f, + 0x7e, 0x4d, 0x92, 0xcb, 0x83, 0x5a, 0xc8, 0xb8, + 0x21, 0xf4, 0xf9, 0x91, 0x5b, 0xb1, 0x58, 0x94, + 0x83, 0x62, 0xd4, 0xe8, 0x70, 0x4d, 0xb9, 0x2c, + 0x37, 0x17, 0x59, 0x4f, 0x1b, 0xa4, 0x6a, 0x6a, + 0x15, 0x0d, 0xfe, 0xe4, 0x43, 0x66, 0xf8, 0xef, + 0x7c, 0x9d, 0x9a, 0x3c, 0x3e, 0xba, 0x8a, 0x9c, + 0x91, 0xd8, 0xc5, 0x66, 0x3c, 0x08, 0x3f, 0x92, + 0x66, 0x82, 0x87, 0x7f, 0x66, 0xb5, 0x92, 0xe7, + 0x99, 0x48, 0x66, 0xd4, 0x89, 0x9e, 0x8e, 0x69, + 0xdf, 0x3b, 0x89, 0xd3, 0x48, 0x2d, 0xa2, 0x45, + 0xb5, 0x65, 0x57, 0x69, 0xa8, 0xaa, 0x6f, 0xbf, + 0x51, 0xf5, 0x47, 0x60, 0xa7, 0xb6, 0xed, 0x3f, + 0x28, 0x10, 0xdf, 0x2b, 0x3f, 0x5b, 0x7d, 0x0a, + 0x32, 0xaa, 0x76, 0xde, 0x77, 0x8c, 0x54, 0x97, + 0x6e, 0x70, 0x8f, 0xed, 0x52, 0x47, 0x1f, 0x47, + 0x17, 0x34, 0x88, 0x82, 0xc1, 0x33, 0x24, 0xa5, + 0xab, 0xce, 0x84, 0x9c, 0x7b, 0x93, 0xa9, 0xa8, + 0xe6, 0x25, 0x99, 0xb1, 0x19, 0x44, 0x88, 0xaf, + 0xde, 0xaf, 0x9c, 0xb8, 0x68, 0x77, 0xa6, 0x17, + 0xe4, 0xf3, 0x03, 0xf3, 0xe9, 0xf8, 0x0c, 0xec, + 0x50, 0xf4, 0xf0, 0xb3, 0x76, 0x3a, 0x7e, 0x5f, + 0xbc, 0x6f, 0x29, 0xfe, 0x35, 0xc7, 0xf9, 0x15, + 0x71, 0x05, 0xf6, 0xbe, 0x06, 0x8f, 0x4e, 0x85, + 0x47, 0xac, 0xb4, 0xe8, 0xf1, 0x16, 0x17, 0x2c, + 0xc4, 0xac, 0xa6, 0x44, 0xf6, 0xa7, 0xf7, 0xb7, + 0x0d, 0xb1, 0x91, 0x77, 0x75, 0xc4, 0x8a, 0x3b, + 0xc5, 0xe8, 0x1b, 0x9c, 0x70, 0x60, 0x1d, 0xcb, + 0x2e, 0xee, 0x68, 0x7f, 0x12, 0xa4, 0xbb, 0x1a, + 0xe1, 0x57, 0x21, 0x28, 0xbe, 0x5a, 0xb0, 0x21, + 0xbe, 0xb2, 0x8f, 0x8c, 0x31, 0x67, 0x42, 0x1a, + 0xb3, 0x27, 0xa4, 0x6b, 0xe0, 0x0b, 0xef, 0xfb, + 0xac, 0x98, 0x5e, 0x94, 0x75, 0x85, 0xa6, 0x13, + 0x3a, 0x1e, 0xd6, 0x8d, 0xda, 0xe9, 0xdd, 0x37, + 0xe5, 0x0f, 0xef, 0xb0, 0x87, 0x9c, 0x27, 0x95, + 0x0a, 0xaa, 0xcd, 0x5e, 0xf1, 0x75, 0xb4, 0x51, + 0x89, 0xb5, 0xbf, 0x7d, 0xa4, 0x06, 0xb4, 0x7b, + 0x12, 0x78, 0x1d, 0xa5, 0xdf, 0x59, 0x55, 0x72, + 0x34, 0x67, 0xf0, 0xb1, 0xed, 0x7a, 0xe7, 0xa6, + 0xac, 0xdc, 0xb3, 0xb3, 0x10, 0xf7, 0x2d, 0xc1, + 0x4f, 0x38, 0xec, 0x25, 0xf5, 0x8e, 0xfa, 0x0c, + 0xb1, 0x4c, 0x6b, 0xf3, 0x6d, 0x64, 0x76, 0x09, + 0xc0, 0x33, 0x91, 0x01, 0x83, 0xf5, 0x37, 0x27, + 0x6c, 0xcf, 0x32, 0xa0, 0xe2, 0x4f, 0xd6, 0xca, + 0x42, 0x0e, 0x92, 0xe1, 0xe6, 0x91, 0xc1, 0xc9, + 0xbe, 0x6b, 0xca, 0xe6, 0x8c, 0x9a, 0x3a, 0xe9, + 0x55, 0x46, 0xc3, 0x0a, 0x22, 0x75, 0xd1, 0xcf, + 0x06, 0xa4, 0xc1, 0xd6, 0xea, 0x2a, 0x6a, 0x53, + 0x46, 0x95, 0x5c, 0x2d, 0x6c, 0xc6, 0xf2, 0xeb, + 0xd2, 0xae, 0x36, 0xad, 0x7b, 0xba, 0x4a, 0xae, + 0x87, 0x85, 0xe8, 0x34, 0x56, 0x3d, 0x72, 0xf5, + 0x49, 0xa6, 0x50, 0xcf, 0xbe, 0x3d, 0x55, 0xf1, + 0xba, 0xb4, 0xf8, 0xdc, 0x14, 0xd6, 0x1d, 0x9c, + 0x38, 0x3c, 0x3f, 0x05, 0x7b, 0x22, 0x55, 0x4e, + 0x69, 0x29, 0xa3, 0x40, 0x7b, 0x41, 0x84, 0x9d, + 0x72, 0xa9, 0xa5, 0x28, 0xac, 0xd3, 0x4a, 0xab, + 0x02, 0x35, 0x6e, 0xc4, 0x0d, 0x52, 0xc0, 0x89, + 0x80, 0x1d, 0x08, 0x09, 0x1b, 0x90, 0x45, 0x4a, + 0xcd, 0x80, 0x04, 0x7e, 0xdd, 0x1e, 0x8f, 0xe3, + 0xfd, 0x7d, 0x60, 0x29, 0x6e, 0xef, 0x29, 0xaa, + 0x86, 0x32, 0xc3, 0xab, 0x37, 0xdb, 0x43, 0x49, + 0xbc, 0x07, 0xac, 0xe2, 0xe7, 0xf1, 0x63, 0x41, + 0x5c, 0xf7, 0x7a, 0xfc, 0xf0, 0xbf, 0x5e, 0x7b, + 0x7d, 0x06, 0x36, 0xcb, 0x13, 0x2e, 0x57, 0x92, + 0x9d, 0x55, 0x27, 0x73, 0xb3, 0x0e, 0x29, 0x15, + 0xd2, 0x84, 0xe0, 0x03, 0xa5, 0xd8, 0x52, 0xd7, + 0x3a, 0x33, 0x62, 0xa2, 0x1e, 0x37, 0x0e, 0x9c, + 0x31, 0xb0, 0x83, 0x47, 0xc6, 0x22, 0xc4, 0x81, + 0x2a, 0xab, 0x6d, 0x76, 0x73, 0x3b, 0xa8, 0xeb, + 0xa7, 0x99, 0xcc, 0x65, 0x27, 0x74, 0x3c, 0x6c, + 0x7e, 0x47, 0xea, 0x48, 0x1e, 0x63, 0x0c, 0xfa, + 0x9a, 0x04, 0xec, 0xc1, 0xdb, 0x4e, 0xc9, 0xaf, + 0x32, 0x7a, 0x3d, 0xfa, 0xa0, 0x34, 0x20, 0x0d, + 0xfc, 0xce, 0x8c, 0x67, 0x47, 0x83, 0x8c, 0xfe, + 0x8f, 0x72, 0xa1, 0xe7, 0xe5, 0x33, 0xa5, 0x33, + 0xee, 0x3a, 0x62, 0x3b, 0xb0, 0x91, 0xf9, 0xe1, + 0x12, 0xdf, 0xcb, 0x49, 0x7e, 0x65, 0xf5, 0x22, + 0x52, 0x9c, 0x78, 0xc6, 0xac, 0xfb, 0xe2, 0xac, + 0x24, 0xb7, 0x38, 0x88, 0x22, 0xa7, 0x1d, 0xb6, + 0x4f, 0xd8, 0x37, 0x49, 0xf1, 0x64, 0xf5, 0x7b, + 0x3d, 0x7e, 0x7a, 0x59, 0x8a, 0x6a, 0x47, 0x7a, + 0xd0, 0x59, 0xd4, 0x73, 0xba, 0x37, 0xdd, 0xef, + 0xe6, 0xa1, 0x2d, 0xd1, 0x0a, 0x1a, 0x5b, 0x65, + 0xa9, 0x9c, 0x26, 0x2e, 0x5e, 0xc8, 0xaf, 0x2c, + 0x89, 0xf9, 0x85, 0x66, 0x78, 0x35, 0x0c, 0x5e, + 0xe5, 0x5a, 0xfe, 0x5a, 0x7e, 0x45, 0xbd, 0xed, + 0xcc, 0xb0, 0xd9, 0xf0, 0x2a, 0x21, 0x9c, 0x21, + 0xf7, 0x5f, 0xf5, 0xba, 0x35, 0x84, 0x0b, 0xa7, + 0x09, 0xa8, 0xe2, 0x3a, 0x29, 0x0b, 0xf7, 0x71, + 0x61, 0xee, 0xa6, 0x9d, 0xd2, 0x6f, 0xb6, 0xb1, + 0xf2, 0x88, 0x88, 0x81, 0xeb, 0xfa, 0x0f, 0x16, + 0x4f, 0x68, 0x4c, 0xae, 0xa3, 0x5a, 0x4a, 0xf8, + 0x5b, 0x44, 0xdf, 0xc2, 0xe9, 0x23, 0x6f, 0x21, + 0x92, 0xf8, 0x67, 0xfc, 0xb8, 0x0e, 0xe7, 0xed, + 0x7f, 0xae, 0x15, 0x0b, 0xce, 0xde, 0xfb, 0xbd, + 0xd2, 0xc8, 0xfb, 0xf8, 0xbb, 0xc4, 0x97, 0xf1, + 0x1d, 0x54, 0x82, 0x4b, 0x9c, 0x8d, 0x48, 0x9f, + 0xfe, 0x53, 0x6e, 0xcd, 0x37, 0x06, 0x56, 0x13, + 0x2d, 0xac, 0x7c, 0x22, 0xce, 0xf9, 0x29, 0x55, + 0x21, 0xdc, 0x8a, 0xab, 0x22, 0xd7, 0xd6, 0x1b, + 0x05, 0x4e, 0xae, 0x16, 0xb8, 0x0e, 0x4b, 0xbf, + 0xf7, 0x28, 0xab, 0x9c, 0x20, 0x46, 0x07, 0x7d, + 0xc7, 0x7c, 0x7b, 0x56, 0xbf, 0x76, 0x38, 0x93, + 0x64, 0xba, 0xa5, 0xaa, 0xf3, 0x82, 0x53, 0xab, + 0x47, 0x5d, 0xf9, 0x6f, 0x5f, 0x23, 0x4c, 0xd8, + 0xad, 0x80, 0x30, 0xa8, 0xae, 0xa1, 0x4e, 0xa5, + 0x5a, 0x07, 0x9f, 0x30, 0xac, 0x62, 0x86, 0x2a, + 0x43, 0x82, 0xcb, 0x53, 0x4d, 0xa6, 0x9b, 0xa5, + 0x99, 0x66, 0x9f, 0x20, 0xe3, 0xeb, 0xe3, 0x06, + 0x1a, 0xc9, 0x72, 0x79, 0xb2, 0x8b, 0xdb, 0xbf, + 0x11, 0x77, 0x26, 0x8c, 0xa8, 0x15, 0x37, 0x26, + 0xad, 0xb8, 0x3d, 0x6f, 0xc8, 0xe5, 0x4f, 0x7f, + 0xb9, 0x98, 0x87, 0x82, 0x25, 0x69, 0x05, 0xba, + 0x78, 0xb7, 0x02, 0xc2, 0x3a, 0xbe, 0x67, 0x1b, + 0xdf, 0xf1, 0xe0, 0xf5, 0x00, 0xd9, 0xa3, 0xce, + 0xca, 0xc1, 0xfe, 0xc2, 0x91, 0x8b, 0x23, 0x3a, + 0x52, 0x19, 0x82, 0x62, 0x82, 0xfa, 0x1e, 0x43, + 0xc4, 0xa3, 0x3e, 0xe4, 0x1c, 0x65, 0xa2, 0x66, + 0xf4, 0x30, 0xfa, 0xba, 0x4e, 0x1d, 0xbc, 0xf8, + 0xc1, 0xe4, 0xab, 0x6f, 0xdf, 0xf3, 0x71, 0x3e, + 0xec, 0x23, 0xe8, 0xd4, 0xac, 0xb9, 0x94, 0x09, + 0x66, 0xa6, 0xcf, 0xb3, 0x99, 0x6d, 0x33, 0x76, + 0x38, 0xa2, 0x66, 0x09, 0x87, 0xdc, 0x61, 0xf0, + 0xc4, 0x93, 0xad, 0xc0, 0xb0, 0xf1, 0x83, 0xc7, + 0x34, 0xd5, 0xb5, 0x17, 0x46, 0xc1, 0x12, 0x2d, + 0x2b, 0x4f, 0xbc, 0x8a, 0x3d, 0xf7, 0x7b, 0xca, + 0xa4, 0xde, 0x4c, 0x3c, 0x45, 0x9b, 0x38, 0x3b, + 0xaf, 0xcd, 0x39, 0x77, 0x4f, 0x6f, 0x6b, 0xeb, + 0x55, 0x64, 0x05, 0xfb, 0xac, 0xfa, 0x18, 0x7e, + 0xde, 0xaf, 0x3d, 0x70, 0x95, 0xdf, 0xe7, 0xed, + 0x8c, 0xb2, 0x00, 0xb1, 0x5b, 0x56, 0x9e, 0xbb, + 0x80, 0x36, 0x74, 0xd9, 0xec, 0x55, 0xf0, 0x33, + 0xe8, 0xfb, 0x94, 0xc7, 0x76, 0x67, 0x4a, 0xdf, + 0xfb, 0x26, 0x67, 0x84, 0x51, 0xad, 0xaf, 0x31, + 0x76, 0xf2, 0xf5, 0xce, 0x95, 0x66, 0x8f, 0x3a, + 0xb0, 0xbb, 0x47, 0xb1, 0xa8, 0x8c, 0x68, 0xdd, + 0x3e, 0x89, 0x32, 0xc1, 0x46, 0xd7, 0xda, 0x68, + 0xc5, 0xc0, 0x3b, 0x2f, 0x41, 0x56, 0x1f, 0xb3, + 0xf2, 0x8d, 0x27, 0xb6, 0xdb, 0xf7, 0x6e, 0x78, + 0xde, 0xaa, 0xe6, 0xb2, 0xea, 0x4c, 0x83, 0x15, + 0x8e, 0xb8, 0xdc, 0x7a, 0xc8, 0x7c, 0x48, 0x8a, + 0x5d, 0xd5, 0x92, 0xbe, 0xa7, 0xfd, 0x51, 0xaa, + 0x69, 0x7b, 0xfa, 0x1f, 0x9d, 0x92, 0x5e, 0x42, + 0xe5, 0x69, 0x16, 0x5d, 0xf3, 0xb7, 0x8f, 0x6f, + 0x1e, 0xe7, 0x8e, 0xd7, 0x8e, 0xbf, 0x39, 0x0e, + 0xc9, 0xd3, 0xf2, 0xc1, 0x71, 0xe1, 0x78, 0x44, + 0x1e, 0xe6, 0x87, 0x5e, 0x56, 0xc3, 0x7e, 0x85, + 0xb9, 0x39, 0x23, 0xce, 0x9f, 0x73, 0x42, 0x14, + 0x95, 0x27, 0xe0, 0xd8, 0x38, 0x2e, 0x1e, 0xab, + 0xb0, 0x72, 0x66, 0xb8, 0x51, 0x3b, 0x9e, 0x79, + 0x98, 0x81, 0x28, 0xb1, 0x3d, 0xbc, 0xdf, 0x89, + 0x18, 0x3e, 0x65, 0x76, 0x92, 0xa2, 0x26, 0xea, + 0x91, 0xd8, 0x35, 0x21, 0x82, 0x0c, 0x18, 0x90, + 0xed, 0x7e, 0x5d, 0xe2, 0x4b, 0xa8, 0xe3, 0x39, + 0xc8, 0xdd, 0xb1, 0x25, 0x58, 0xa3, 0x73, 0xfa, + 0x1d, 0xe1, 0xeb, 0x7c, 0xb7, 0x66, 0x32, 0xc3, + 0x05, 0x41, 0xdc, 0x4d, 0xcf, 0x2d, 0x9c, 0xcb, + 0xc2, 0x37, 0x1a, 0xab, 0x3f, 0xdf, 0x2b, 0xf5, + 0x95, 0x70, 0x6d, 0x10, 0xfb, 0x8a, 0xb4, 0x88, + 0x95, 0x53, 0x41, 0xd0, 0x49, 0x17, 0x0d, 0x99, + 0x68, 0x5c, 0xe6, 0x7f, 0xea, 0x4a, 0x43, 0x04, + 0x99, 0x2b, 0xe7, 0xad, 0x85, 0x9d, 0xb4, 0x92, + 0xb6, 0xe7, 0x14, 0x78, 0x2f, 0x1f, 0x11, 0xca, + 0x2c, 0x36, 0xe3, 0x79, 0xf6, 0x33, 0x19, 0x17, + 0x09, 0x83, 0x1a, 0x45, 0xf5, 0x46, 0xca, 0x8e, + 0x23, 0xff, 0x08, 0x4e, 0xd3, 0x7b, 0xe7, 0xcb, + 0xb9, 0x5a, 0xaf, 0x42, 0xb7, 0xd6, 0x88, 0x70, + 0xa8, 0x73, 0x81, 0x47, 0xc2, 0x63, 0x77, 0xb7, + 0xa6, 0x9d, 0xc8, 0xf9, 0xb4, 0x28, 0x5a, 0x4c, + 0x15, 0x3e, 0x6e, 0x40, 0xec, 0x56, 0xdc, 0x5a, + 0x8e, 0x58, 0x9d, 0x9e, 0x97, 0xd0, 0x0c, 0x66, + 0x86, 0xd5, 0x50, 0x25, 0x74, 0x16, 0xc3, 0xc9, + 0x17, 0x75, 0xa3, 0x18, 0x56, 0xfc, 0xe7, 0x66, + 0xa6, 0xdd, 0xe7, 0x61, 0xfc, 0xb5, 0x64, 0x4b, + 0xfa, 0x03, 0x21, 0x9c, 0x67, 0xf1, 0x06, 0x46, + 0xb6, 0x58, 0x59, 0xfb, 0x50, 0xc9, 0xf1, 0x43, + 0xcd, 0x26, 0x62, 0x1b, 0x72, 0x67, 0xa5, 0x59, + 0xdc, 0x13, 0x3f, 0x8e, 0x25, 0x51, 0xf7, 0x8a, + 0xe9, 0x7e, 0x44, 0x19, 0xef, 0x62, 0xab, 0x17, + 0x87, 0x9c, 0xcd, 0xb0, 0x63, 0xe9, 0xdc, 0xc3, + 0x21, 0xe3, 0x1d, 0x64, 0xaa, 0xe3, 0x5c, 0x33, + 0x22, 0x8f, 0xfe, 0x22, 0x59, 0x33, 0xe2, 0x27, + 0x4d, 0x45, 0x09, 0x9c, 0x0c, 0xbb, 0xa8, 0xec, + 0xfb, 0x7c, 0x1d, 0xa2, 0xd4, 0x69, 0xeb, 0x70, + 0x91, 0xbd, 0xff, 0x40, 0x39, 0x28, 0xde, 0xa0, + 0xf8, 0x59, 0x10, 0xb7, 0x8c, 0x9c, 0xb6, 0xa8, + 0x05, 0xc5, 0x23, 0x43, 0x30, 0x26, 0x27, 0xc7, + 0x2b, 0x0b, 0x86, 0xea, 0x4e, 0x2f, 0xb1, 0x2e, + 0x8f, 0x62, 0xa4, 0x8c, 0xd0, 0xeb, 0xcb, 0xf1, + 0xe8, 0xc1, 0xcc, 0x05, 0x94, 0x85, 0xbb, 0xea, + 0x70, 0xce, 0x8b, 0x78, 0x7b, 0x20, 0x9a, 0x24, + 0x1d, 0x38, 0xb5, 0x88, 0x13, 0x37, 0x61, 0x7d, + 0x4b, 0xbd, 0xa9, 0x41, 0x8e, 0xaa, 0x6d, 0x6a, + 0x41, 0x6b, 0x4c, 0xcb, 0x6a, 0x9b, 0x56, 0xa8, + 0x14, 0xda, 0x09, 0xef, 0xac, 0x16, 0xdd, 0xcc, + 0x5a, 0x79, 0xe4, 0xe4, 0xcc, 0xac, 0x78, 0xc9, + 0xbe, 0x1a, 0xcf, 0x5a, 0x9b, 0xf4, 0x89, 0x65, + 0x7a, 0x2e, 0x76, 0x52, 0x1f, 0x39, 0x5b, 0xe6, + 0x73, 0x71, 0xdb, 0xfe, 0x2c, 0xce, 0xb8, 0x74, + 0x7e, 0x52, 0xfb, 0x8a, 0x7c, 0x91, 0x31, 0x00, + 0x27, 0x95, 0xbf, 0xd3, 0xe7, 0x45, 0x2d, 0xed, + 0xf1, 0x5f, 0x96, 0xad, 0x15, 0x63, 0xb7, 0x2c, + 0x96, 0x23, 0x06, 0x9b, 0x6e, 0xd8, 0xb3, 0x56, + 0xc4, 0x3b, 0x16, 0xb2, 0x4b, 0x47, 0xb4, 0x31, + 0x6b, 0x45, 0x5b, 0xb1, 0xdc, 0x1d, 0xee, 0xae, + 0x2b, 0x2f, 0x07, 0x82, 0x13, 0xd6, 0x49, 0x50, + 0x12, 0x5a, 0x82, 0x32, 0xcc, 0x74, 0x00, 0x99, + 0x96, 0x10, 0xc7, 0xd9, 0x6b, 0xac, 0x02, 0x22, + 0xad, 0x9d, 0xc0, 0xae, 0x91, 0xd7, 0x65, 0xaa, + 0xe7, 0x90, 0x8a, 0x4d, 0xd4, 0x0c, 0x40, 0xc6, + 0xff, 0xdf, 0xfe, 0x3d, 0x8a, 0x17, 0x17, 0x5b, + 0x0f, 0x9c, 0x6e, 0x34, 0x4b, 0xb7, 0xcd, 0xf3, + 0x11, 0x2b, 0xb0, 0xda, 0xd3, 0x60, 0x91, 0x3e, + 0x72, 0x32, 0xcd, 0xb4, 0x3c, 0xf7, 0x8b, 0x0c, + 0xd1, 0xd6, 0x5d, 0xbf, 0xbf, 0xef, 0xaa, 0x05, + 0x29, 0x29, 0xfb, 0x4b, 0xd8, 0xef, 0x5e, 0xa7, + 0x60, 0x52, 0x13, 0xf5, 0x18, 0xdf, 0x41, 0x4a, + 0xd4, 0xed, 0x0b, 0x2a, 0x08, 0x02, 0xe3, 0xc9, + 0x8f, 0x40, 0x96, 0xfe, 0x8d, 0x95, 0x14, 0x27, + 0x9c, 0x39, 0xe5, 0xc5, 0xc1, 0xd8, 0xe1, 0xf2, + 0xe9, 0x8a, 0x76, 0x4b, 0xd5, 0x8a, 0x1e, 0x9b, + 0xae, 0x40, 0x4c, 0xab, 0xcb, 0xfc, 0x17, 0x84, + 0x12, 0x8e, 0x31, 0xac, 0xb0, 0xe9, 0xce, 0x68, + 0x13, 0x5f, 0x5e, 0x67, 0x35, 0xe3, 0x49, 0x9d, + 0x76, 0xae, 0x6b, 0x2f, 0x28, 0xe1, 0xf2, 0xf8, + 0xd9, 0xf8, 0x69, 0x56, 0xdb, 0x22, 0x46, 0x2e, + 0x86, 0xa3, 0x48, 0x11, 0xd6, 0xfd, 0x91, 0x93, + 0x92, 0x66, 0xf3, 0x83, 0xd6, 0xe8, 0xf9, 0xb8, + 0x39, 0x21, 0x23, 0xd7, 0xef, 0x06, 0x1c, 0xb8, + 0x36, 0x30, 0xd6, 0x4c, 0x38, 0xcb, 0x67, 0x77, + 0xb4, 0x3f, 0xee, 0x44, 0xd4, 0x88, 0x33, 0x6e, + 0x8e, 0x9a, 0x33, 0xb5, 0x14, 0xbc, 0x00, 0xd3, + 0x58, 0x7f, 0x41, 0x73, 0x56, 0x11, 0xa3, 0x5e, + 0x8d, 0x55, 0x63, 0xa5, 0x91, 0x57, 0xc8, 0xce, + 0x81, 0xff, 0x4e, 0x7c, 0x23, 0xdc, 0xe7, 0xf6, + 0x2e, 0xf7, 0xb3, 0xf5, 0x99, 0x88, 0x77, 0xbe, + 0xca, 0x3d, 0x7e, 0xb3, 0x6b, 0x1e, 0x99, 0xfd, + 0x6f, 0xbc, 0xdc, 0xb9, 0xab, 0xae, 0x82, 0x6a, + 0xdb, 0x66, 0xdd, 0xc7, 0x3f, 0x73, 0xca, 0xba, + 0x9a, 0xd6, 0xc0, 0xee, 0x9f, 0x65, 0xb5, 0xb9, + 0x9d, 0xb4, 0x9a, 0x76, 0xe6, 0x0e, 0x3f, 0x36, + 0x65, 0xb0, 0xe7, 0xc8, 0x98, 0x0a, 0x5f, 0x99, + 0x39, 0x55, 0x49, 0x3b, 0x47, 0x95, 0x9c, 0x59, + 0x90, 0x73, 0xe6, 0xba, 0x33, 0x70, 0xf8, 0xd1, + 0x79, 0xae, 0x96, 0xd1, 0xef, 0x0b, 0x34, 0x33, + 0x65, 0x16, 0x2a, 0x39, 0xa7, 0x50, 0x59, 0x30, + 0x17, 0x0e, 0x0a, 0x6a, 0xce, 0x41, 0x36, 0xf5, + 0x5c, 0x6d, 0x49, 0xff, 0x13, 0x1a, 0xac, 0x46, + 0x7f, 0xed, 0x28, 0x1e, 0x7d, 0x15, 0xfd, 0x77, + 0x4c, 0xae, 0xed, 0xb0, 0xa9, 0xe2, 0x29, 0xf5, + 0x6b, 0xb5, 0xdf, 0xd3, 0x4f, 0xf1, 0xad, 0x54, + 0x5e, 0x08, 0xe6, 0x21, 0xda, 0x4f, 0x4e, 0xbf, + 0xf7, 0xf1, 0x2a, 0xa4, 0x04, 0x81, 0x98, 0xc0, + 0x59, 0xbb, 0x4f, 0x45, 0x15, 0x32, 0x59, 0x91, + 0xcb, 0xaa, 0xf1, 0x98, 0xe2, 0xd8, 0xee, 0xe7, + 0xa2, 0x16, 0x33, 0xea, 0x25, 0x77, 0x34, 0x8b, + 0x05, 0x6e, 0xcb, 0x01, 0x2b, 0xaa, 0xd4, 0x7d, + 0x4e, 0x25, 0xe4, 0x57, 0x8a, 0x6b, 0x29, 0x42, + 0xe0, 0x04, 0x7a, 0xba, 0x40, 0xd3, 0x38, 0xf7, + 0x8c, 0xc7, 0x59, 0x27, 0x62, 0xe4, 0x9b, 0xd8, + 0x31, 0x98, 0xb0, 0x17, 0xf9, 0x6d, 0x5b, 0x60, + 0x6c, 0x33, 0x15, 0x17, 0x09, 0x23, 0x5c, 0x39, + 0x0f, 0x65, 0x90, 0xdd, 0x72, 0xd9, 0x2c, 0x99, + 0xe3, 0x66, 0xc4, 0x44, 0x5d, 0x0f, 0xea, 0xb3, + 0xbb, 0xc8, 0xcc, 0x19, 0x25, 0x02, 0x71, 0xf5, + 0xc0, 0xb9, 0xc0, 0x23, 0xb6, 0x5b, 0x82, 0x43, + 0xb1, 0x14, 0xc6, 0xa8, 0xd9, 0x9c, 0xa2, 0x36, + 0xeb, 0xb4, 0x13, 0x97, 0xe3, 0x72, 0x42, 0x1e, + 0xc1, 0xa3, 0x98, 0x2d, 0x66, 0x5f, 0x3e, 0x49, + 0x7a, 0xb1, 0x59, 0x52, 0x44, 0x65, 0xf7, 0x29, + 0xb0, 0x8f, 0x47, 0x76, 0x88, 0x65, 0xd0, 0xed, + 0x4b, 0xde, 0x24, 0x66, 0x33, 0xd9, 0x5c, 0xa1, + 0x8a, 0x1d, 0xec, 0x4d, 0x95, 0x8e, 0x0a, 0xf3, + 0xbf, 0x5d, 0xca, 0x95, 0xd4, 0xf3, 0x44, 0x6c, + 0x7c, 0x52, 0x2d, 0x57, 0x5c, 0x35, 0x19, 0x77, + 0x96, 0x87, 0x21, 0xb5, 0x27, 0x95, 0x9c, 0xb2, + 0x85, 0xbf, 0xf9, 0x3d, 0x82, 0x8e, 0xfa, 0x33, + 0x72, 0x7d, 0xba, 0xdf, 0x47, 0xb9, 0xa3, 0xd1, + 0x8c, 0xaa, 0x4c, 0xb3, 0xe2, 0x57, 0xf0, 0x89, + 0x50, 0x21, 0x0d, 0xd1, 0x2b, 0xc9, 0xca, 0xb0, + 0x52, 0x71, 0xbb, 0xa5, 0x47, 0xb6, 0x90, 0x29, + 0x38, 0x5c, 0x66, 0xdd, 0x0e, 0x48, 0x47, 0xc7, + 0xc2, 0x9b, 0x45, 0x58, 0x09, 0x5b, 0x72, 0xb2, + 0x67, 0xc6, 0xe4, 0xf9, 0x0f, 0x57, 0x57, 0xfb, + 0x1a, 0x57, 0xce, 0x2a, 0x93, 0xf4, 0xea, 0x5d, + 0x13, 0x19, 0x9e, 0xe2, 0x0f, 0xab, 0xae, 0x44, + 0x0d, 0xd6, 0xbb, 0x64, 0xd6, 0x1b, 0xe3, 0xc5, + 0x05, 0x73, 0xda, 0x89, 0xba, 0xa8, 0xff, 0xc4, + 0x3e, 0xc4, 0x6d, 0xc4, 0x4f, 0xc8, 0x8b, 0x71, + 0x31, 0x61, 0xc6, 0x33, 0xf5, 0xdf, 0x64, 0x67, + 0xa5, 0x71, 0xdd, 0x29, 0xbc, 0xba, 0xfe, 0x6a, + 0xe5, 0xb5, 0xab, 0xf4, 0xca, 0xb8, 0xdf, 0xa5, + 0x82, 0x33, 0x9f, 0xcf, 0x9d, 0xdf, 0x3c, 0x4e, + 0x49, 0x4c, 0x21, 0xb4, 0xe8, 0xf2, 0x15, 0xb0, + 0x47, 0xe9, 0x71, 0x58, 0xd1, 0x37, 0x8f, 0x25, + 0x52, 0x73, 0x2d, 0x36, 0x9e, 0x7a, 0x3a, 0xcb, + 0x74, 0xbf, 0x87, 0x29, 0xf3, 0xca, 0xa9, 0x9f, + 0x50, 0xe4, 0x49, 0x96, 0x83, 0x62, 0x33, 0x17, + 0x1f, 0x5e, 0x0c, 0xbc, 0x1c, 0x6c, 0x54, 0x91, + 0xc5, 0x48, 0x70, 0x95, 0xdf, 0xf3, 0x4c, 0xa3, + 0x19, 0x67, 0x1a, 0x22, 0x90, 0x43, 0x0e, 0xc2, + 0xb3, 0xe0, 0x5f, 0x93, 0x5d, 0x3d, 0x11, 0xa1, + 0xd0, 0xc6, 0x47, 0xc7, 0xd4, 0x39, 0xf5, 0xb2, + 0x7a, 0x23, 0x89, 0x53, 0xdc, 0xe1, 0xe6, 0x0f, + 0x2d, 0x4f, 0xfd, 0x99, 0x21, 0x70, 0x22, 0x4a, + 0xc2, 0xc2, 0x49, 0x23, 0xb0, 0x03, 0xd6, 0x6c, + 0xf9, 0x9a, 0xf6, 0xdd, 0x4e, 0x40, 0xe9, 0x9d, + 0x50, 0x48, 0x15, 0x8b, 0xbf, 0xf5, 0x32, 0x99, + 0x30, 0xbb, 0x31, 0x01, 0x76, 0x03, 0x6c, 0xd8, + 0xce, 0x2e, 0xea, 0xb3, 0x98, 0x23, 0x66, 0xa4, + 0x16, 0x15, 0x26, 0x05, 0x8c, 0xdb, 0x11, 0x37, + 0xbf, 0x61, 0x4b, 0xa6, 0x64, 0x0f, 0x9b, 0x60, + 0x25, 0x91, 0x9f, 0x0f, 0xec, 0xcd, 0xc3, 0xa6, + 0xea, 0x2b, 0xa3, 0xc1, 0x69, 0xdf, 0x82, 0x7c, + 0x78, 0x97, 0xd4, 0x64, 0xc6, 0xb4, 0x39, 0xf4, + 0x29, 0x0a, 0x43, 0x74, 0xcb, 0xc6, 0x53, 0x86, + 0x0d, 0x72, 0xaf, 0x6b, 0xc9, 0x9a, 0xaf, 0xfc, + 0x89, 0xae, 0x8a, 0x3d, 0x97, 0xe9, 0x3c, 0x22, + 0xaf, 0x1a, 0x44, 0xa3, 0x70, 0x05, 0x37, 0xd5, + 0x12, 0xcb, 0xcb, 0xc0, 0x5a, 0x5d, 0x3f, 0xcf, + 0x99, 0x77, 0xc4, 0x9c, 0xb9, 0xe4, 0xac, 0x1e, + 0xa3, 0xfa, 0xc2, 0xc7, 0x6f, 0xfe, 0x62, 0x22, + 0x07, 0xae, 0x97, 0x11, 0x90, 0x6f, 0x00, 0x6b, + 0xf0, 0xbd, 0xca, 0x70, 0x6e, 0xbe, 0x3e, 0x3b, + 0xd3, 0x3e, 0x53, 0x3a, 0xfa, 0xa1, 0xdd, 0x8f, + 0x76, 0xa9, 0x5d, 0x9b, 0x82, 0x4d, 0xdc, 0xe0, + 0x95, 0x49, 0x73, 0x4c, 0x76, 0x91, 0x7b, 0x5d, + 0xca, 0x56, 0xbd, 0xfc, 0x01, 0xee, 0x7c, 0x68, + 0x6b, 0x8c, 0xfa, 0x9d, 0xcc, 0x76, 0x44, 0xd5, + 0xbf, 0xbd, 0xeb, 0x74, 0xdb, 0x3a, 0x6c, 0xf6, + 0x13, 0xa4, 0xcb, 0x72, 0xd3, 0x7c, 0xfc, 0xde, + 0x8b, 0x2c, 0x5c, 0x7c, 0x0e, 0x17, 0x02, 0x7b, + 0xb2, 0x88, 0x93, 0xbf, 0x36, 0x55, 0x6f, 0xb9, + 0x18, 0x97, 0xe2, 0x8a, 0x9c, 0xcb, 0x7b, 0x59, + 0x85, 0x0c, 0xe7, 0x74, 0x56, 0x5b, 0x97, 0x52, + 0xda, 0xac, 0xd3, 0xcb, 0x7c, 0xe8, 0x3d, 0x0a, + 0xbe, 0x53, 0xbb, 0xae, 0x67, 0x1d, 0x64, 0xab, + 0xf7, 0xe6, 0x16, 0x7b, 0xf7, 0xc2, 0x7a, 0x75, + 0xf6, 0x74, 0xbd, 0x72, 0x05, 0xe7, 0x1a, 0xed, + 0x8a, 0x4e, 0x15, 0x39, 0x57, 0x53, 0x02, 0xbb, + 0x6f, 0x4c, 0xdd, 0xa8, 0x83, 0x43, 0x0e, 0xf8, + 0x6c, 0xff, 0xf8, 0x79, 0xd9, 0xef, 0x58, 0xff, + 0x08, 0xb4, 0xd6, 0xf3, 0x3e, 0x76, 0x8b, 0xb8, + 0xaa, 0xe2, 0xa8, 0xd5, 0x66, 0x26, 0x8e, 0xd3, + 0x72, 0xfa, 0xcd, 0x27, 0x4d, 0x9a, 0xb7, 0xa2, + 0xfa, 0x04, 0xa1, 0x2e, 0x28, 0x72, 0xbc, 0x38, + 0xf7, 0x24, 0x90, 0x36, 0xb3, 0xdb, 0xf3, 0xd6, + 0x33, 0xb6, 0xac, 0xcf, 0x0b, 0x10, 0xd3, 0x52, + 0xe6, 0x45, 0x9c, 0x5d, 0x1a, 0x78, 0xba, 0xb3, + 0xcb, 0xda, 0xb8, 0x8a, 0xfc, 0x93, 0xaa, 0x11, + 0x3c, 0x85, 0xef, 0xfd, 0xf4, 0x8a, 0x40, 0x28, + 0xf4, 0xb5, 0xc4, 0x71, 0x8d, 0xde, 0x73, 0xcd, + 0x2c, 0x1c, 0xdf, 0x92, 0xf7, 0xe4, 0xd2, 0xf1, + 0x48, 0x75, 0xb4, 0x8c, 0xef, 0x8b, 0xb9, 0xf3, + 0x25, 0x6b, 0x43, 0xc4, 0x99, 0x5f, 0x52, 0x26, + 0xd5, 0x53, 0x6a, 0x4a, 0xdb, 0x90, 0x1e, 0x18, + 0xc8, 0x54, 0x23, 0x51, 0xf4, 0xf9, 0xa9, 0x8d, + 0xd3, 0xdb, 0x3c, 0xac, 0xcc, 0xc4, 0xe1, 0xe8, + 0xdb, 0x9c, 0xba, 0x70, 0xb8, 0xfb, 0x76, 0x63, + 0xbf, 0x83, 0xba, 0xdf, 0xe4, 0x7f, 0x0f, 0xcf, + 0x80, 0x4a, 0x07, 0x59, 0xec, 0x0a, 0x93, 0xba, + 0xc3, 0x98, 0x95, 0x55, 0x37, 0x33, 0xc1, 0x7c, + 0x50, 0x0b, 0xea, 0xb7, 0x18, 0x5b, 0x54, 0x2d, + 0xdb, 0x7c, 0x28, 0x7a, 0x33, 0x08, 0xbd, 0x2a, + 0x63, 0xf0, 0x0a, 0x18, 0x2f, 0x4b, 0x01, 0xac, + 0x12, 0xc0, 0x4a, 0x19, 0xcc, 0x4f, 0xb4, 0xbe, + 0xe6, 0x30, 0x7a, 0x40, 0xb6, 0x4e, 0xe4, 0xfc, + 0x0f, 0x59, 0x75, 0x71, 0xca, 0x8a, 0x36, 0xe0, + 0x7c, 0x39, 0x5a, 0xc3, 0xe9, 0x08, 0xbe, 0x5a, + 0x6f, 0x11, 0xff, 0x15, 0x31, 0x00, 0xbf, 0xb0, + 0x88, 0x27, 0xcc, 0x7a, 0xa1, 0x7d, 0x0e, 0x51, + 0xd4, 0x48, 0xe9, 0xea, 0xce, 0xd7, 0x3b, 0xbc, + 0x3b, 0x4b, 0x8b, 0x8c, 0x98, 0x29, 0x6d, 0xbd, + 0x0c, 0x27, 0xec, 0xae, 0x54, 0x71, 0xfe, 0xe0, + 0xce, 0x7e, 0xb9, 0x6b, 0x9e, 0xdd, 0x9f, 0x17, + 0x93, 0x30, 0x8e, 0xa4, 0x48, 0x85, 0x42, 0x7e, + 0x1e, 0xee, 0xe7, 0x70, 0x65, 0x04, 0x22, 0xaa, + 0xa7, 0xbf, 0x63, 0x09, 0xd9, 0xb4, 0xfb, 0x0b, + 0x8b, 0x26, 0xe9, 0x95, 0xd1, 0x83, 0x95, 0x43, + 0xed, 0x34, 0xc2, 0xb4, 0x84, 0x5a, 0x1e, 0x8a, + 0x15, 0x33, 0x39, 0x42, 0xdd, 0xaa, 0x1d, 0xec, + 0xed, 0x1f, 0xf2, 0x2e, 0x6f, 0xbc, 0x10, 0x05, + 0x0f, 0xfb, 0x15, 0xe2, 0x55, 0x65, 0xe1, 0x0d, + 0xec, 0xa3, 0xc3, 0xb1, 0x63, 0x57, 0x6f, 0x91, + 0x3a, 0x35, 0xb5, 0x66, 0x40, 0xfc, 0xd8, 0xe6, + 0xf9, 0x8f, 0xed, 0x3e, 0xec, 0xd4, 0xd8, 0x39, + 0xf8, 0x49, 0xe8, 0x0e, 0x62, 0xe1, 0xc6, 0x19, + 0x9e, 0x1b, 0xda, 0xae, 0x4a, 0x36, 0xc4, 0x88, + 0x9c, 0x82, 0x77, 0x3b, 0x4d, 0x08, 0x8c, 0x0f, + 0x6a, 0x95, 0xb4, 0xb3, 0x50, 0xd3, 0x7b, 0x52, + 0x77, 0x39, 0x24, 0x6d, 0xec, 0xde, 0xb1, 0x8a, + 0x5c, 0xa0, 0x85, 0x8a, 0x90, 0x05, 0x42, 0xb1, + 0xd3, 0x04, 0xb7, 0xe0, 0x4d, 0x70, 0x7b, 0x6c, + 0x51, 0xc4, 0x01, 0x4b, 0xfb, 0xc2, 0x9b, 0xce, + 0xe1, 0x7c, 0x06, 0x51, 0x99, 0xf2, 0xa0, 0x35, + 0x1d, 0xf2, 0x1f, 0x88, 0x38, 0x49, 0xa1, 0x8c, + 0xe6, 0x43, 0x59, 0xc4, 0x48, 0x9f, 0x53, 0x4f, + 0xe7, 0xef, 0x89, 0xf3, 0x0e, 0x69, 0x95, 0x94, + 0xe6, 0x0e, 0x76, 0xfe, 0x45, 0xfd, 0x23, 0x1d, + 0x5e, 0x05, 0xfb, 0x59, 0xe5, 0xa9, 0x83, 0xa1, + 0x5f, 0x9e, 0xf3, 0x3d, 0x8a, 0x5d, 0xb0, 0xea, + 0x83, 0xd6, 0x91, 0x26, 0x68, 0xe1, 0x57, 0x13, + 0xa5, 0xf1, 0x9d, 0x8c, 0xb2, 0xed, 0x08, 0x1d, + 0x04, 0x6c, 0xbe, 0x9e, 0x49, 0x3b, 0x6b, 0x65, + 0xe1, 0xf8, 0xda, 0xe4, 0x7f, 0xb0, 0xa8, 0xd5, + 0x66, 0x2a, 0xbe, 0x45, 0x77, 0xfe, 0x88, 0xe1, + 0x4e, 0x06, 0x24, 0xbe, 0xc9, 0x37, 0x43, 0x12, + 0x62, 0x37, 0x39, 0xc5, 0xf3, 0x65, 0xac, 0x83, + 0xd1, 0x89, 0xa1, 0x3b, 0x75, 0x4b, 0xa6, 0xf0, + 0x3b, 0x5d, 0x4a, 0xff, 0xef, 0x11, 0x97, 0xb3, + 0x49, 0xcf, 0x4f, 0xe1, 0xab, 0x37, 0xf5, 0x9c, + 0x90, 0x61, 0x0a, 0x38, 0x10, 0x5d, 0xf7, 0x3b, + 0x47, 0x7c, 0x1f, 0x75, 0x30, 0xd6, 0x6a, 0xfd, + 0x2d, 0xba, 0xa3, 0xc5, 0x35, 0xaa, 0xf6, 0x30, + 0xcf, 0x4d, 0x7a, 0x6e, 0x2d, 0xea, 0x32, 0xb6, + 0x67, 0x92, 0x2e, 0x6b, 0x48, 0xd8, 0x47, 0x0d, + 0x21, 0xf3, 0x3f, 0xd8, 0xef, 0xf1, 0xff, 0x19, + 0x7f, 0x3b, 0x6d, 0x8c, 0x9f, 0x44, 0xf3, 0xb2, + 0x8a, 0x7a, 0x7c, 0x2e, 0x87, 0x15, 0x3f, 0xc2, + 0x8f, 0xd9, 0x2b, 0x87, 0xb7, 0x0f, 0x6f, 0x9e, + 0x97, 0xde, 0x68, 0xcd, 0x8e, 0x82, 0x15, 0xe9, + 0x5a, 0x9a, 0xf2, 0x71, 0xf6, 0xa0, 0x1f, 0x56, + 0x18, 0xec, 0x51, 0x0e, 0x31, 0x72, 0x0a, 0xe3, + 0xd9, 0xa6, 0x1c, 0x36, 0xca, 0xa3, 0x46, 0xc2, + 0xbd, 0xc3, 0x6f, 0x0e, 0xe7, 0xce, 0xe7, 0xde, + 0xc8, 0xcd, 0x7b, 0xbe, 0x8a, 0x3a, 0xde, 0xa3, + 0x39, 0x3e, 0x8d, 0x53, 0xd1, 0x87, 0xf3, 0x87, + 0xeb, 0xe7, 0xa8, 0x89, 0x0a, 0x11, 0xbc, 0xbc, + 0x33, 0xf9, 0xff, 0xe8, 0xc4, 0x21, 0xbf +}; diff --git a/libpcsxcore/socket.c b/libpcsxcore/socket.c new file mode 100644 index 0000000..2e0dc87 --- /dev/null +++ b/libpcsxcore/socket.c @@ -0,0 +1,254 @@ +/* Pcsx - Pc Psx Emulator + * Copyright (C) 1999-2003 Pcsx Team + * + * This program is free software; you can redistribute it and/or modify + * it 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; if not, see . + */ + +#ifdef _WIN32 +#include +#endif + +#include "psxcommon.h" +#include "socket.h" + +#ifndef _WIN32 +#include +#include +#include +#include +#include +#include +#endif + +static int server_socket = 0; +static int client_socket = 0; + +static char tbuf[513]; +static int ptr = 0; + +#define PORT_NUMBER 12345 + +int StartServer() { + struct in_addr localhostaddr; + struct sockaddr_in localsocketaddr; + +#ifdef _WIN32 + WSADATA wsaData; + + if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) + return -1; +#endif + + server_socket = socket(AF_INET, SOCK_STREAM, 0); + +#ifdef _WIN32 + if (server_socket == INVALID_SOCKET) + return -1; +#else + if (server_socket == -1) + return -1; +#endif + + SetsNonblock(); + + memset((void *)&localhostaddr, 0, sizeof(localhostaddr)); + memset(&localsocketaddr, 0, sizeof(struct sockaddr_in)); + +#ifdef _WIN32 + localhostaddr.S_un.S_addr = htonl(INADDR_ANY); +#else + localhostaddr.s_addr = htonl(INADDR_ANY); +#endif + localsocketaddr.sin_family = AF_INET; + localsocketaddr.sin_addr = localhostaddr; + localsocketaddr.sin_port = htons(PORT_NUMBER); + + if (bind(server_socket, (struct sockaddr *) &localsocketaddr, sizeof(localsocketaddr)) < 0) + return -1; + + if (listen(server_socket, 1) != 0) + return -1; + + return 0; +} + +void StopServer() { +#ifdef _WIN32 + shutdown(server_socket, SD_BOTH); + closesocket(server_socket); + WSACleanup(); +#else + shutdown(server_socket, SHUT_RDWR); + close(server_socket); +#endif +} + +void GetClient() { + int new_socket; + char hello[256]; + + new_socket = accept(server_socket, 0, 0); + +#ifdef _WIN32 + if (new_socket == INVALID_SOCKET) + return; +#else + if (new_socket == -1) + return; +#endif + if (client_socket) + CloseClient(); + client_socket = new_socket; + +#ifndef _WIN32 + { + int flags; + flags = fcntl(client_socket, F_GETFL, 0); + fcntl(client_socket, F_SETFL, flags | O_NONBLOCK); + } +#endif + + sprintf(hello, "000 PCSX Version %s - Debug console\r\n", PACKAGE_VERSION); + WriteSocket(hello, strlen(hello)); + ptr = 0; +} + +void CloseClient() { + if (client_socket) { +#ifdef _WIN32 + shutdown(client_socket, SD_BOTH); + closesocket(client_socket); +#else + shutdown(client_socket, SHUT_RDWR); + close(client_socket); +#endif + client_socket = 0; + } +} + +int HasClient() { + return client_socket ? 1 : 0; +} + +int ReadSocket(char * buffer, int len) { + int r; + char * endl; + + if (!client_socket) + return -1; + + r = recv(client_socket, tbuf + ptr, 512 - ptr, 0); + + if (r == 0) { + client_socket = 0; + if (!ptr) + return 0; + } +#ifdef _WIN32 + if (r == SOCKET_ERROR) +#else + if (r == -1) +#endif + { + if (ptr == 0) + return -1; + r = 0; + } + ptr += r; + tbuf[ptr] = 0; + + endl = strstr(tbuf, "\r\n"); + + if (endl) { + r = endl - tbuf; + strncpy(buffer, tbuf, r); + + r += 2; + memmove(tbuf, tbuf + r, 512 - r); + ptr -= r; + memset(tbuf + r, 0, 512 - r); + r -= 2; + + } else { + r = 0; + } + + buffer[r] = 0; + + return r; +} + +int RawReadSocket(char * buffer, int len) { + int r; + int mlen = len < ptr ? len : ptr; + + if (!client_socket) + return -1; + + if (ptr) { + memcpy(buffer, tbuf, mlen); + ptr -= mlen; + memmove(tbuf, tbuf + mlen, 512 - mlen); + } + + if (len - mlen) + r = recv(client_socket, buffer + mlen, len - mlen, 0); + + if (r == 0) { + client_socket = 0; + if (!ptr) + return 0; + } +#ifdef _WIN32 + if (r == SOCKET_ERROR) +#else + if (r == -1) +#endif + { + if (ptr == 0) + return -1; + r = 0; + } + + r += mlen; + + return r; +} + +void WriteSocket(char * buffer, int len) { + if (!client_socket) + return; + + send(client_socket, buffer, len, 0); +} + +void SetsBlock() { +#ifdef _WIN32 + u_long b = 0; + ioctlsocket(server_socket, FIONBIO, &b); +#else + int flags = fcntl(server_socket, F_GETFL, 0); + fcntl(server_socket, F_SETFL, flags & ~O_NONBLOCK); +#endif +} + +void SetsNonblock() { +#ifdef _WIN32 + u_long b = 1; + ioctlsocket(server_socket, FIONBIO, &b); +#else + int flags = fcntl(server_socket, F_GETFL, 0); + fcntl(server_socket, F_SETFL, flags | O_NONBLOCK); +#endif +} diff --git a/libpcsxcore/socket.h b/libpcsxcore/socket.h new file mode 100644 index 0000000..7ee0deb --- /dev/null +++ b/libpcsxcore/socket.h @@ -0,0 +1,43 @@ +/* Pcsx - Pc Psx Emulator + * Copyright (C) 1999-2003 Pcsx Team + * + * This program is free software; you can redistribute it and/or modify + * it 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; if not, see . + */ + +#ifndef __SOCKET_H__ +#define __SOCKET_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +int StartServer(); +void StopServer(); + +void GetClient(); +void CloseClient(); + +int HasClient(); + +int ReadSocket(char * buffer, int len); +int RawReadSocket(char * buffer, int len); +void WriteSocket(char * buffer, int len); + +void SetsBlock(); +void SetsNonblock(); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/spu.c b/libpcsxcore/spu.c new file mode 100644 index 0000000..a60c047 --- /dev/null +++ b/libpcsxcore/spu.c @@ -0,0 +1,28 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* Sound (SPU) functions. +*/ + +#include "spu.h" + +void CALLBACK SPUirq(void) { + psxHu32ref(0x1070) |= SWAPu32(0x200); +} diff --git a/libpcsxcore/spu.h b/libpcsxcore/spu.h new file mode 100644 index 0000000..85010cb --- /dev/null +++ b/libpcsxcore/spu.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __SPU_H__ +#define __SPU_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" +#include "plugins.h" +#include "r3000a.h" +#include "psxmem.h" + +#define H_SPUirqAddr 0x0da4 +#define H_SPUaddr 0x0da6 +#define H_SPUdata 0x0da8 +#define H_SPUctrl 0x0daa +#define H_SPUstat 0x0dae +#define H_SPUon1 0x0d88 +#define H_SPUon2 0x0d8a +#define H_SPUoff1 0x0d8c +#define H_SPUoff2 0x0d8e + +void CALLBACK SPUirq(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/system.h b/libpcsxcore/system.h new file mode 100644 index 0000000..c869fdf --- /dev/null +++ b/libpcsxcore/system.h @@ -0,0 +1,42 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __SYSTEM_H__ +#define __SYSTEM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +int SysInit(); // Init mem and plugins +void SysReset(); // Resets mem +void SysPrintf(const char *fmt, ...); // Printf used by bios syscalls +void SysMessage(const char *fmt, ...); // Message used to print msg to users +void *SysLoadLibrary(const char *lib); // Loads Library +void *SysLoadSym(void *lib, const char *sym); // Loads Symbol from Library +const char *SysLibError(); // Gets previous error loading sysbols +void SysCloseLibrary(void *lib); // Closes Library +void SysUpdate(); // Called on VBlank (to update i.e. pads) +void SysRunGui(); // Returns to the Gui +void SysClose(); // Close mem and plugins + +#ifdef __cplusplus +} +#endif +#endif -- cgit v1.2.3