From f2259c5424b3d3655569d23628130db95c2dee13 Mon Sep 17 00:00:00 2001 From: Telekatz Date: Sat, 1 Jul 2017 21:56:25 +0200 Subject: [PATCH] Initial transfer from sourceforge --- .cproject | 78 + .project | 27 + Asixtool/asix-testcode/Makefile | 35 + Asixtool/asix-testcode/Makefile.bak | 35 + Asixtool/asix-testcode/ax110xx.h | 462 ++ Asixtool/asix-testcode/cpu_ax110xx.c | 177 + Asixtool/asix-testcode/cpu_ax110xx.h | 61 + Asixtool/asix-testcode/interrupt_ax110xx.c | 188 + Asixtool/asix-testcode/interrupt_ax110xx.h | 25 + Asixtool/asix-testcode/main.c | 162 + Asixtool/asix-testcode/main.c.bak | 162 + Asixtool/asix-testcode/types_ax110xx.h | 88 + Asixtool/asix-testcode/uart/uart.c | 821 +++ Asixtool/asix-testcode/uart/uart.h | 74 + Asixtool/sdcc/README | 2 + Asixtool/sdcc/ax110xx.patch | 103 + Asixtool/trunk/Kopie von Makefile | 37 + Asixtool/trunk/LICENSE | 674 +++ Asixtool/trunk/Makefile | 33 + Asixtool/trunk/asix_serial.c | 237 + Asixtool/trunk/asix_serial.h | 30 + Asixtool/trunk/bootcom.c | 389 ++ Asixtool/trunk/bootcom.h | 28 + Asixtool/trunk/infohelper.c | 97 + Asixtool/trunk/infohelper.h | 30 + Asixtool/trunk/main.c | 312 ++ betty_TAE/MSP430/trunk/Makefile | 72 + betty_TAE/MSP430/trunk/cc1100.c | 158 + betty_TAE/MSP430/trunk/cc1100.h | 57 + betty_TAE/MSP430/trunk/hardware.c | 61 + betty_TAE/MSP430/trunk/hardware.h | 58 + betty_TAE/MSP430/trunk/main.c | 67 + betty_TAE/MSP430/trunk/rf.c | 163 + betty_TAE/MSP430/trunk/rf.h | 45 + betty_scart/trunk/LICENSE | 674 +++ betty_scart/trunk/Makefile | 95 + betty_scart/trunk/Makefile.local.WinSDCC | 22 + betty_scart/trunk/Makefile.local.linuxSDCC | 22 + betty_scart/trunk/ScartProg.exe | Bin 0 -> 68096 bytes betty_scart/trunk/betty_scart.bin | Bin 0 -> 8096 bytes betty_scart/trunk/boop_icp.py | 86 + betty_scart/trunk/cc1100.c | 221 + betty_scart/trunk/cc1100.h | 128 + betty_scart/trunk/cmd.c | 217 + betty_scart/trunk/cmd.h | 43 + betty_scart/trunk/main.c | 176 + betty_scart/trunk/readme.txt | 45 + betty_scart/trunk/rf.c | 223 + betty_scart/trunk/rf.h | 53 + betty_scart/trunk/serial.c | 178 + betty_scart/trunk/serial.h | 63 + betty_scart/trunk/timer.c | 27 + betty_scart/trunk/timer.h | 25 + bmp2b/trunk/Makefile | 69 + bmp2b/trunk/README1ST | 34 + bmp2b/trunk/betty.bmp | Bin 0 -> 21558 bytes bmp2b/trunk/betty2.bmp | Bin 0 -> 61494 bytes bmp2b/trunk/bmp.c | 219 + bmp2b/trunk/bmp.h | 85 + bmp2b/trunk/bmp2b.c | 168 + bmp2b/trunk/bmp2b.tar.bz2 | Bin 0 -> 12308 bytes boop/branches/ram_version/readme.txt | 1 + .../telekatz_soundtest/Boop.pnproj | 1 + .../ram_version/telekatz_soundtest/CHANGELOG | 2 + .../ram_version/telekatz_soundtest/LICENSE | 674 +++ .../ram_version/telekatz_soundtest/Make.conf | 4 + .../ram_version/telekatz_soundtest/Makefile | 98 + .../telekatz_soundtest/Makefile.local | 24 + .../Makefile.local.Telekatz | 23 + .../telekatz_soundtest/Makefile.local.WinARM | 20 + .../Makefile.local.linuxARM | 25 + .../ram_version/telekatz_soundtest/README | 25 + .../ram_version/telekatz_soundtest/b.h | 24 + .../ram_version/telekatz_soundtest/batt.c | 80 + .../ram_version/telekatz_soundtest/batt.h | 27 + .../ram_version/telekatz_soundtest/boop.pnps | 1 + .../telekatz_soundtest/boop_flash.ppg | 1 + .../ram_version/telekatz_soundtest/cc1100.c | 158 + .../ram_version/telekatz_soundtest/cc1100.h | 56 + .../ram_version/telekatz_soundtest/crt.s | 199 + .../ram_version/telekatz_soundtest/externs.h | 7 + .../ram_version/telekatz_soundtest/flash.c | 174 + .../ram_version/telekatz_soundtest/flash.h | 33 + .../telekatz_soundtest/fonts/charset.bits | 118 + .../telekatz_soundtest/fonts/charset.info | 22 + .../telekatz_soundtest/fonts/smooth.bits | 279 + .../telekatz_soundtest/fonts/smooth.info | 17 + .../ram_version/telekatz_soundtest/fonty.c | 433 ++ .../ram_version/telekatz_soundtest/fonty.h | 31 + .../ram_version/telekatz_soundtest/global.c | 46 + .../ram_version/telekatz_soundtest/global.h | 57 + .../ram_version/telekatz_soundtest/infrared.c | 181 + .../ram_version/telekatz_soundtest/infrared.h | 60 + .../ram_version/telekatz_soundtest/ir_itt.c | 228 + .../ram_version/telekatz_soundtest/ir_itt.h | 30 + .../ram_version/telekatz_soundtest/ir_nrc17.c | 221 + .../ram_version/telekatz_soundtest/ir_nrc17.h | 30 + .../ram_version/telekatz_soundtest/ir_rc5.c | 171 + .../ram_version/telekatz_soundtest/ir_rc5.h | 30 + .../ram_version/telekatz_soundtest/ir_rca.c | 184 + .../ram_version/telekatz_soundtest/ir_rca.h | 30 + .../ram_version/telekatz_soundtest/ir_rcmm.c | 190 + .../ram_version/telekatz_soundtest/ir_rcmm.h | 30 + .../ram_version/telekatz_soundtest/ir_rec80.c | 195 + .../ram_version/telekatz_soundtest/ir_rec80.h | 30 + .../telekatz_soundtest/ir_recs80.c | 165 + .../telekatz_soundtest/ir_recs80.h | 30 + .../ram_version/telekatz_soundtest/ir_sirc.c | 191 + .../ram_version/telekatz_soundtest/ir_sirc.h | 30 + .../telekatz_soundtest/ir_spaceenc.c | 285 + .../telekatz_soundtest/ir_spaceenc.h | 33 + .../ram_version/telekatz_soundtest/irq.c | 82 + .../ram_version/telekatz_soundtest/irq.h | 72 + .../telekatz_soundtest/itt_codes.h | 10 + .../ram_version/telekatz_soundtest/keyboard.c | 101 + .../ram_version/telekatz_soundtest/keyboard.h | 83 + .../ram_version/telekatz_soundtest/lcd.c | 617 ++ .../ram_version/telekatz_soundtest/lcd.h | 47 + .../ram_version/telekatz_soundtest/lpc2220.h | 285 + .../ram_version/telekatz_soundtest/lpc2220.ld | 66 + .../telekatz_soundtest/lpc2220_rom.ld | 113 + .../ram_version/telekatz_soundtest/main.c | 242 + .../ram_version/telekatz_soundtest/serial.c | 237 + .../ram_version/telekatz_soundtest/serial.h | 42 + .../telekatz_soundtest/sirc_codes.h | 7 + .../ram_version/telekatz_soundtest/sound3.h | 1571 ++++++ .../telekatz_soundtest/soundcore.c | 961 ++++ .../telekatz_soundtest/soundcore.h | 63 + .../ram_version/telekatz_soundtest/sounds.h | 4417 +++++++++++++++ .../telekatz_soundtest/spaceenc_codes.h | 8 + boop/trunk/CHANGELOG | 2 + boop/trunk/LICENSE | 674 +++ boop/trunk/Make.conf | 5 + boop/trunk/Makefile | 150 + boop/trunk/Makefile.local.Telekatz | 23 + boop/trunk/Makefile.local.WinARM | 21 + boop/trunk/Makefile.local.linuxARM | 19 + boop/trunk/README | 17 + boop/trunk/adc/Make.conf | 1 + boop/trunk/adc/adc.c | 164 + boop/trunk/adc/adc.h | 32 + boop/trunk/adc/adcirq.c | 38 + boop/trunk/adc/adcirq.h | 24 + boop/trunk/audio/Make.conf | 2 + boop/trunk/audio/sid.c | 165 + boop/trunk/audio/sid.h | 118 + boop/trunk/audio/sidfiles.h | 1004 ++++ boop/trunk/audio/sound.c | 114 + boop/trunk/audio/sound.h | 38 + boop/trunk/audio/soundirq.c | 226 + boop/trunk/audio/soundirq.h | 24 + boop/trunk/audio/sounds.h | 4417 +++++++++++++++ boop/trunk/betty.cfg | 110 + boop/trunk/boop_rom.bin | Bin 0 -> 268208 bytes boop/trunk/buffer.c | 153 + boop/trunk/buffer.h | 35 + boop/trunk/cc1100/Make.conf | 1 + boop/trunk/cc1100/cc1100.c | 329 ++ boop/trunk/cc1100/cc1100.h | 131 + boop/trunk/cc1100/fs20.c | 343 ++ boop/trunk/cc1100/fs20.h | 29 + boop/trunk/cc1100/rf.c | 502 ++ boop/trunk/cc1100/rf.h | 110 + boop/trunk/cc1100/scan.c | 151 + boop/trunk/cc1100/scan.h | 39 + boop/trunk/crt.s | 268 + boop/trunk/display/GrayScaler.exe | Bin 0 -> 380928 bytes boop/trunk/display/Hourglas_2bpp.bmp | Bin 0 -> 758 bytes boop/trunk/display/Hourglas_t_3bpp_t.bmp | Bin 0 -> 2198 bytes boop/trunk/display/Make.conf | 1 + boop/trunk/display/backlight.c | 113 + boop/trunk/display/backlight.h | 29 + boop/trunk/display/boop_logo | 2592 +++++++++ boop/trunk/display/drawDigit.c | 127 + boop/trunk/display/drawDigit.h | 68 + boop/trunk/display/drawIcon.c | 363 ++ boop/trunk/display/fonts/charset.bits | 118 + boop/trunk/display/fonts/charset.info | 22 + boop/trunk/display/fonts/smooth.bits | 279 + boop/trunk/display/fonts/smooth.info | 17 + boop/trunk/display/fonty.c | 636 +++ boop/trunk/display/fonty.h | 49 + boop/trunk/display/icon.h | 113 + boop/trunk/display/iconHourglas.h | 173 + boop/trunk/display/iconHourglas2.h | 173 + boop/trunk/display/iconHourglas2_t.h | 178 + boop/trunk/display/iconHourglas_t.h | 178 + boop/trunk/display/lcd.c | 1242 +++++ boop/trunk/display/lcd.h | 153 + boop/trunk/flash/Make.conf | 1 + boop/trunk/flash/bfs.c | 730 +++ boop/trunk/flash/bfs.h | 86 + boop/trunk/flash/flash.c | 195 + boop/trunk/flash/flash.h | 36 + boop/trunk/games/Make.conf | 1 + boop/trunk/games/c4_map.h | 64 + boop/trunk/games/connect4.c | 965 ++++ boop/trunk/games/connect4.h | 39 + boop/trunk/games/gamesmenu.c | 35 + boop/trunk/games/gamesmenu.h | 24 + boop/trunk/games/sokoban.c | 614 ++ boop/trunk/games/sokoban.h | 64 + boop/trunk/games/sokoban_levels.h | 4968 +++++++++++++++++ boop/trunk/games/tic_tac_toe.c | 375 ++ boop/trunk/games/tic_tac_toe.h | 29 + boop/trunk/global.c | 131 + boop/trunk/global.h | 94 + boop/trunk/gui/Cross_2bpp.bmp | Bin 0 -> 2406 bytes boop/trunk/gui/Cross_t_3bpp_t.bmp | Bin 0 -> 2406 bytes boop/trunk/gui/FF_2bpp.bmp | Bin 0 -> 574 bytes boop/trunk/gui/FR_2bpp.bmp | Bin 0 -> 574 bytes boop/trunk/gui/Leo_Gray_128_2bpp.bmp | Bin 0 -> 25014 bytes boop/trunk/gui/Make.conf | 1 + boop/trunk/gui/Pause_2bpp.bmp | Bin 0 -> 574 bytes boop/trunk/gui/Play_2bpp.bmp | Bin 0 -> 574 bytes boop/trunk/gui/Stop_2bpp.bmp | Bin 0 -> 574 bytes boop/trunk/gui/controls.c | 1017 ++++ boop/trunk/gui/controls.h | 194 + boop/trunk/gui/iconCross.h | 144 + boop/trunk/gui/iconCross_t.h | 148 + boop/trunk/gui/iconFf.h | 56 + boop/trunk/gui/iconFr.h | 56 + boop/trunk/gui/iconHourglas.h | 173 + boop/trunk/gui/iconHourglas_t.h | 178 + boop/trunk/gui/iconLeo_gray_128.h | 1189 ++++ boop/trunk/gui/iconPause.h | 56 + boop/trunk/gui/iconPlay.h | 56 + boop/trunk/gui/iconStop.h | 56 + boop/trunk/gui/mainmenu.c | 124 + boop/trunk/gui/mainmenu.h | 24 + boop/trunk/gui/menu.c | 250 + boop/trunk/gui/menu.h | 50 + boop/trunk/gui/settingsmenu.c | 196 + boop/trunk/gui/settingsmenu.h | 38 + boop/trunk/gui/testmenu.c | 1247 +++++ boop/trunk/gui/testmenu.h | 26 + boop/trunk/infrared/Make.conf | 5 + boop/trunk/infrared/codes.c | 264 + boop/trunk/infrared/codes.h | 111 + boop/trunk/infrared/encoders.c | 52 + boop/trunk/infrared/encoders.h | 65 + boop/trunk/infrared/infrared.c | 177 + boop/trunk/infrared/infrared.h | 123 + boop/trunk/infrared/infrared_encoders.h | 34 + boop/trunk/infrared/infraredirq.c | 67 + boop/trunk/infrared/infraredirq.h | 25 + boop/trunk/infrared/ir_capture.c | 710 +++ boop/trunk/infrared/ir_capture.h | 62 + boop/trunk/infrared/ir_codes/itt/seleco_019 | 62 + boop/trunk/infrared/ir_codes/itt/seleco_049 | 62 + boop/trunk/infrared/ir_codes/itt/seleco_108 | 62 + boop/trunk/infrared/ir_codes/itt/seleco_131 | 62 + .../infrared/ir_codes/lirc/apple_remote1 | 1 + boop/trunk/infrared/ir_codes/lirc/fs20 | 1 + boop/trunk/infrared/ir_codes/lirc/hx2262 | 1 + .../trunk/infrared/ir_codes/lirc/olympus_rm-1 | 1 + boop/trunk/infrared/ir_codes/lirc/rev008340 | 1 + .../infrared/ir_codes/lirc/samsung_ue46b6000 | 1 + boop/trunk/infrared/ir_codes/lirc/str_de545 | 1 + boop/trunk/infrared/ir_codes/lirc/ufs910 | 1 + boop/trunk/infrared/ir_codes/lirc/ufs922 | 1 + boop/trunk/infrared/ir_codes/nrc17/dbox2 | 64 + .../infrared/ir_codes/nrc17/grundig_tp720 | 64 + boop/trunk/infrared/ir_codes/rc5/HARMONY_655 | 62 + .../rc5/technisat_satreceiver_103TS103 | 1 + boop/trunk/infrared/ir_codes/rc5/tv | 1 + boop/trunk/infrared/ir_codes/rc6/dvd | 1 + boop/trunk/infrared/ir_codes/rc6/tv | 1 + boop/trunk/infrared/ir_codes/rc6/ufs922 | 1 + boop/trunk/infrared/ir_codes/rca/xbox | 62 + boop/trunk/infrared/ir_codes/rcmm/galaxis | 62 + boop/trunk/infrared/ir_codes/rcmm/ufs910 | 1 + .../trunk/infrared/ir_codes/rec80/rak_sc957wk | 62 + .../trunk/infrared/ir_codes/recs80/seleco_020 | 62 + .../trunk/infrared/ir_codes/recs80/seleco_157 | 62 + boop/trunk/infrared/ir_codes/rf/cc1100_a0 | 62 + boop/trunk/infrared/ir_codes/rf/cc1100_a1 | 62 + boop/trunk/infrared/ir_codes/sirc/UFD400 | 62 + boop/trunk/infrared/ir_codes/sirc/rm-pp411 | 64 + boop/trunk/infrared/ir_codes/sirc/tv | 64 + .../infrared/ir_codes/spaceenc/schneider_dtv3 | 62 + .../ir_codes/spaceenc/schneider_dtv3_xtra | 55 + .../infrared/ir_codes/spaceenc/seleco_027 | 62 + boop/trunk/infrared/ir_itt.c | 213 + boop/trunk/infrared/ir_itt.h | 29 + boop/trunk/infrared/ir_lirc.c | 451 ++ boop/trunk/infrared/ir_lirc.h | 63 + boop/trunk/infrared/ir_nrc17.c | 211 + boop/trunk/infrared/ir_nrc17.h | 29 + boop/trunk/infrared/ir_raw.c | 164 + boop/trunk/infrared/ir_raw.h | 29 + boop/trunk/infrared/ir_rc5.c | 160 + boop/trunk/infrared/ir_rc5.h | 29 + boop/trunk/infrared/ir_rc6.c | 224 + boop/trunk/infrared/ir_rc6.h | 29 + boop/trunk/infrared/ir_rca.c | 189 + boop/trunk/infrared/ir_rca.h | 29 + boop/trunk/infrared/ir_rcmm.c | 197 + boop/trunk/infrared/ir_rcmm.h | 29 + boop/trunk/infrared/ir_rec80.c | 186 + boop/trunk/infrared/ir_rec80.h | 29 + boop/trunk/infrared/ir_recs80.c | 144 + boop/trunk/infrared/ir_recs80.h | 29 + boop/trunk/infrared/ir_rf.c | 127 + boop/trunk/infrared/ir_rf.h | 29 + boop/trunk/infrared/ir_selector.c | 311 ++ boop/trunk/infrared/ir_selector.h | 41 + boop/trunk/infrared/ir_sirc.c | 161 + boop/trunk/infrared/ir_sirc.h | 29 + boop/trunk/infrared/ir_spaceenc.c | 254 + boop/trunk/infrared/ir_spaceenc.h | 32 + boop/trunk/interrupt/Make.conf | 1 + boop/trunk/interrupt/irq.c | 93 + boop/trunk/interrupt/irq.h | 71 + boop/trunk/keyboard/Make.conf | 2 + boop/trunk/keyboard/keyboard.c | 150 + boop/trunk/keyboard/keyboard.h | 197 + boop/trunk/keyboard/keyirq.c | 195 + boop/trunk/keyboard/keyirq.h | 35 + boop/trunk/lpc2220.h | 290 + boop/trunk/lpc2220_rom.ld | 144 + boop/trunk/main.c | 417 ++ boop/trunk/rtc/Make.conf | 1 + boop/trunk/rtc/i2c.c | 131 + boop/trunk/rtc/i2c.h | 51 + boop/trunk/rtc/rtc.c | 432 ++ boop/trunk/rtc/rtc.h | 106 + boop/trunk/rtc/rtctimer.c | 103 + boop/trunk/rtc/rtctimer.h | 42 + boop/trunk/serial/Make.conf | 2 + boop/trunk/serial/redirector.c | 306 + boop/trunk/serial/redirector.h | 41 + boop/trunk/serial/serial.c | 301 + boop/trunk/serial/serial.h | 60 + boop/trunk/serial/serirq.c | 71 + boop/trunk/sound3.h | 1571 ++++++ boop/trunk/syscalls.c | 22 + boop/trunk/timer/Make.conf | 2 + boop/trunk/timer/timerfuncs.c | 169 + boop/trunk/timer/timerfuncs.h | 53 + boop/trunk/timer/timerirq.c | 70 + boop/trunk/timer/timerirq.h | 41 + boop/trunk/tools/Make.conf | 1 + boop/trunk/tools/scart_icp.c | 715 +++ boop/trunk/tools/scart_icp.h | 22 + boop/trunk/tools/scart_image.h | 27 + boop/trunk/tools/scart_image_data.h | 484 ++ boop/trunk/tools/toolsmenu.c | 34 + boop/trunk/tools/toolsmenu.h | 21 + lpctool/testing/ChangeLog | 8 + lpctool/testing/Makefile | 41 + lpctool/testing/Makefile.inc | 37 + lpctool/testing/Makefile.local.WinARM | 25 + lpctool/testing/Makefile.local.linuxARM | 25 + lpctool/testing/baudrate.h | 9 + lpctool/testing/bootcom.c | 308 + lpctool/testing/bootcom.h | 12 + lpctool/testing/fla.sh | 4 + lpctool/testing/flashtool/Makefile | 51 + lpctool/testing/flashtool/bin2h.c | 30 + lpctool/testing/flashtool/charset.bits | 118 + lpctool/testing/flashtool/charset.info | 22 + lpctool/testing/flashtool/crt.s | 163 + lpctool/testing/flashtool/flash.c | 230 + lpctool/testing/flashtool/flash.h | 16 + lpctool/testing/flashtool/fonty.c | 175 + lpctool/testing/flashtool/fonty.h | 14 + lpctool/testing/flashtool/irq.c | 43 + lpctool/testing/flashtool/lcd.c | 450 ++ lpctool/testing/flashtool/lcd.h | 42 + lpctool/testing/flashtool/lpc2220.h | 261 + lpctool/testing/flashtool/lpc2220.ld | 60 + lpctool/testing/flashtool/lpc2220_rom.ld | 61 + lpctool/testing/flashtool/ramtool.c | 368 ++ lpctool/testing/flashtool/serial.c | 247 + lpctool/testing/flashtool/serial.h | 24 + lpctool/testing/infohelper.c | 104 + lpctool/testing/infohelper.h | 14 + lpctool/testing/lpctool.c | 492 ++ lpctool/testing/lpctool_serial.c | 259 + lpctool/testing/lpctool_serial.h | 16 + lpctool/testing/toolcmd.h | 31 + lpctool/testing/toolcom.c | 549 ++ lpctool/testing/toolcom.h | 21 + lpctool/trunk/ChangeLog | 8 + lpctool/trunk/Makefile | 114 + lpctool/trunk/Makefile.local.WinARM | 25 + lpctool/trunk/Makefile.local.linuxARM | 25 + lpctool/trunk/bin2h.c | 30 + lpctool/trunk/bootcom.c | 307 + lpctool/trunk/bootcom.h | 12 + lpctool/trunk/charset.bits | 118 + lpctool/trunk/charset.info | 22 + lpctool/trunk/crt.s | 163 + lpctool/trunk/flash.c | 230 + lpctool/trunk/flash.h | 16 + lpctool/trunk/fonty.c | 171 + lpctool/trunk/fonty.h | 14 + lpctool/trunk/infohelper.c | 78 + lpctool/trunk/infohelper.h | 12 + lpctool/trunk/irq.c | 43 + lpctool/trunk/lcd.c | 450 ++ lpctool/trunk/lcd.h | 42 + lpctool/trunk/lpc2220.h | 261 + lpctool/trunk/lpc2220.ld | 60 + lpctool/trunk/lpc2220_rom.ld | 61 + lpctool/trunk/lpctool.c | 485 ++ lpctool/trunk/lpctool_serial.c | 247 + lpctool/trunk/lpctool_serial.h | 15 + lpctool/trunk/ramtool.c | 357 ++ lpctool/trunk/serial.c | 246 + lpctool/trunk/serial.h | 24 + lpctool/trunk/toolcmd.h | 31 + lpctool/trunk/toolcom.c | 528 ++ lpctool/trunk/toolcom.h | 21 + 415 files changed, 73200 insertions(+) create mode 100644 .cproject create mode 100644 .project create mode 100644 Asixtool/asix-testcode/Makefile create mode 100644 Asixtool/asix-testcode/Makefile.bak create mode 100644 Asixtool/asix-testcode/ax110xx.h create mode 100644 Asixtool/asix-testcode/cpu_ax110xx.c create mode 100644 Asixtool/asix-testcode/cpu_ax110xx.h create mode 100644 Asixtool/asix-testcode/interrupt_ax110xx.c create mode 100644 Asixtool/asix-testcode/interrupt_ax110xx.h create mode 100644 Asixtool/asix-testcode/main.c create mode 100644 Asixtool/asix-testcode/main.c.bak create mode 100644 Asixtool/asix-testcode/types_ax110xx.h create mode 100644 Asixtool/asix-testcode/uart/uart.c create mode 100644 Asixtool/asix-testcode/uart/uart.h create mode 100644 Asixtool/sdcc/README create mode 100644 Asixtool/sdcc/ax110xx.patch create mode 100644 Asixtool/trunk/Kopie von Makefile create mode 100644 Asixtool/trunk/LICENSE create mode 100644 Asixtool/trunk/Makefile create mode 100644 Asixtool/trunk/asix_serial.c create mode 100644 Asixtool/trunk/asix_serial.h create mode 100644 Asixtool/trunk/bootcom.c create mode 100644 Asixtool/trunk/bootcom.h create mode 100644 Asixtool/trunk/infohelper.c create mode 100644 Asixtool/trunk/infohelper.h create mode 100644 Asixtool/trunk/main.c create mode 100644 betty_TAE/MSP430/trunk/Makefile create mode 100644 betty_TAE/MSP430/trunk/cc1100.c create mode 100644 betty_TAE/MSP430/trunk/cc1100.h create mode 100644 betty_TAE/MSP430/trunk/hardware.c create mode 100644 betty_TAE/MSP430/trunk/hardware.h create mode 100644 betty_TAE/MSP430/trunk/main.c create mode 100644 betty_TAE/MSP430/trunk/rf.c create mode 100644 betty_TAE/MSP430/trunk/rf.h create mode 100644 betty_scart/trunk/LICENSE create mode 100644 betty_scart/trunk/Makefile create mode 100644 betty_scart/trunk/Makefile.local.WinSDCC create mode 100644 betty_scart/trunk/Makefile.local.linuxSDCC create mode 100644 betty_scart/trunk/ScartProg.exe create mode 100644 betty_scart/trunk/betty_scart.bin create mode 100644 betty_scart/trunk/boop_icp.py create mode 100644 betty_scart/trunk/cc1100.c create mode 100644 betty_scart/trunk/cc1100.h create mode 100644 betty_scart/trunk/cmd.c create mode 100644 betty_scart/trunk/cmd.h create mode 100644 betty_scart/trunk/main.c create mode 100644 betty_scart/trunk/readme.txt create mode 100644 betty_scart/trunk/rf.c create mode 100644 betty_scart/trunk/rf.h create mode 100644 betty_scart/trunk/serial.c create mode 100644 betty_scart/trunk/serial.h create mode 100644 betty_scart/trunk/timer.c create mode 100644 betty_scart/trunk/timer.h create mode 100644 bmp2b/trunk/Makefile create mode 100644 bmp2b/trunk/README1ST create mode 100644 bmp2b/trunk/betty.bmp create mode 100644 bmp2b/trunk/betty2.bmp create mode 100644 bmp2b/trunk/bmp.c create mode 100644 bmp2b/trunk/bmp.h create mode 100644 bmp2b/trunk/bmp2b.c create mode 100644 bmp2b/trunk/bmp2b.tar.bz2 create mode 100644 boop/branches/ram_version/readme.txt create mode 100644 boop/branches/ram_version/telekatz_soundtest/Boop.pnproj create mode 100644 boop/branches/ram_version/telekatz_soundtest/CHANGELOG create mode 100644 boop/branches/ram_version/telekatz_soundtest/LICENSE create mode 100644 boop/branches/ram_version/telekatz_soundtest/Make.conf create mode 100644 boop/branches/ram_version/telekatz_soundtest/Makefile create mode 100644 boop/branches/ram_version/telekatz_soundtest/Makefile.local create mode 100644 boop/branches/ram_version/telekatz_soundtest/Makefile.local.Telekatz create mode 100644 boop/branches/ram_version/telekatz_soundtest/Makefile.local.WinARM create mode 100644 boop/branches/ram_version/telekatz_soundtest/Makefile.local.linuxARM create mode 100644 boop/branches/ram_version/telekatz_soundtest/README create mode 100644 boop/branches/ram_version/telekatz_soundtest/b.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/batt.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/batt.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/boop.pnps create mode 100644 boop/branches/ram_version/telekatz_soundtest/boop_flash.ppg create mode 100644 boop/branches/ram_version/telekatz_soundtest/cc1100.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/cc1100.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/crt.s create mode 100644 boop/branches/ram_version/telekatz_soundtest/externs.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/flash.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/flash.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/fonts/charset.bits create mode 100644 boop/branches/ram_version/telekatz_soundtest/fonts/charset.info create mode 100644 boop/branches/ram_version/telekatz_soundtest/fonts/smooth.bits create mode 100644 boop/branches/ram_version/telekatz_soundtest/fonts/smooth.info create mode 100644 boop/branches/ram_version/telekatz_soundtest/fonty.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/fonty.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/global.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/global.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/infrared.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/infrared.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_itt.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_itt.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_nrc17.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_nrc17.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_rc5.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_rc5.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_rca.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_rca.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_rcmm.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_rcmm.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_rec80.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_rec80.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_recs80.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_recs80.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_sirc.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_sirc.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_spaceenc.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/ir_spaceenc.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/irq.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/irq.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/itt_codes.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/keyboard.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/keyboard.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/lcd.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/lcd.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/lpc2220.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/lpc2220.ld create mode 100644 boop/branches/ram_version/telekatz_soundtest/lpc2220_rom.ld create mode 100644 boop/branches/ram_version/telekatz_soundtest/main.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/serial.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/serial.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/sirc_codes.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/sound3.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/soundcore.c create mode 100644 boop/branches/ram_version/telekatz_soundtest/soundcore.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/sounds.h create mode 100644 boop/branches/ram_version/telekatz_soundtest/spaceenc_codes.h create mode 100644 boop/trunk/CHANGELOG create mode 100644 boop/trunk/LICENSE create mode 100644 boop/trunk/Make.conf create mode 100644 boop/trunk/Makefile create mode 100644 boop/trunk/Makefile.local.Telekatz create mode 100644 boop/trunk/Makefile.local.WinARM create mode 100644 boop/trunk/Makefile.local.linuxARM create mode 100644 boop/trunk/README create mode 100644 boop/trunk/adc/Make.conf create mode 100644 boop/trunk/adc/adc.c create mode 100644 boop/trunk/adc/adc.h create mode 100644 boop/trunk/adc/adcirq.c create mode 100644 boop/trunk/adc/adcirq.h create mode 100644 boop/trunk/audio/Make.conf create mode 100644 boop/trunk/audio/sid.c create mode 100644 boop/trunk/audio/sid.h create mode 100644 boop/trunk/audio/sidfiles.h create mode 100644 boop/trunk/audio/sound.c create mode 100644 boop/trunk/audio/sound.h create mode 100644 boop/trunk/audio/soundirq.c create mode 100644 boop/trunk/audio/soundirq.h create mode 100644 boop/trunk/audio/sounds.h create mode 100644 boop/trunk/betty.cfg create mode 100644 boop/trunk/boop_rom.bin create mode 100644 boop/trunk/buffer.c create mode 100644 boop/trunk/buffer.h create mode 100644 boop/trunk/cc1100/Make.conf create mode 100644 boop/trunk/cc1100/cc1100.c create mode 100644 boop/trunk/cc1100/cc1100.h create mode 100644 boop/trunk/cc1100/fs20.c create mode 100644 boop/trunk/cc1100/fs20.h create mode 100644 boop/trunk/cc1100/rf.c create mode 100644 boop/trunk/cc1100/rf.h create mode 100644 boop/trunk/cc1100/scan.c create mode 100644 boop/trunk/cc1100/scan.h create mode 100644 boop/trunk/crt.s create mode 100644 boop/trunk/display/GrayScaler.exe create mode 100644 boop/trunk/display/Hourglas_2bpp.bmp create mode 100644 boop/trunk/display/Hourglas_t_3bpp_t.bmp create mode 100644 boop/trunk/display/Make.conf create mode 100644 boop/trunk/display/backlight.c create mode 100644 boop/trunk/display/backlight.h create mode 100644 boop/trunk/display/boop_logo create mode 100644 boop/trunk/display/drawDigit.c create mode 100644 boop/trunk/display/drawDigit.h create mode 100644 boop/trunk/display/drawIcon.c create mode 100644 boop/trunk/display/fonts/charset.bits create mode 100644 boop/trunk/display/fonts/charset.info create mode 100644 boop/trunk/display/fonts/smooth.bits create mode 100644 boop/trunk/display/fonts/smooth.info create mode 100644 boop/trunk/display/fonty.c create mode 100644 boop/trunk/display/fonty.h create mode 100644 boop/trunk/display/icon.h create mode 100644 boop/trunk/display/iconHourglas.h create mode 100644 boop/trunk/display/iconHourglas2.h create mode 100644 boop/trunk/display/iconHourglas2_t.h create mode 100644 boop/trunk/display/iconHourglas_t.h create mode 100644 boop/trunk/display/lcd.c create mode 100644 boop/trunk/display/lcd.h create mode 100644 boop/trunk/flash/Make.conf create mode 100644 boop/trunk/flash/bfs.c create mode 100644 boop/trunk/flash/bfs.h create mode 100644 boop/trunk/flash/flash.c create mode 100644 boop/trunk/flash/flash.h create mode 100644 boop/trunk/games/Make.conf create mode 100644 boop/trunk/games/c4_map.h create mode 100644 boop/trunk/games/connect4.c create mode 100644 boop/trunk/games/connect4.h create mode 100644 boop/trunk/games/gamesmenu.c create mode 100644 boop/trunk/games/gamesmenu.h create mode 100644 boop/trunk/games/sokoban.c create mode 100644 boop/trunk/games/sokoban.h create mode 100644 boop/trunk/games/sokoban_levels.h create mode 100644 boop/trunk/games/tic_tac_toe.c create mode 100644 boop/trunk/games/tic_tac_toe.h create mode 100644 boop/trunk/global.c create mode 100644 boop/trunk/global.h create mode 100644 boop/trunk/gui/Cross_2bpp.bmp create mode 100644 boop/trunk/gui/Cross_t_3bpp_t.bmp create mode 100644 boop/trunk/gui/FF_2bpp.bmp create mode 100644 boop/trunk/gui/FR_2bpp.bmp create mode 100644 boop/trunk/gui/Leo_Gray_128_2bpp.bmp create mode 100644 boop/trunk/gui/Make.conf create mode 100644 boop/trunk/gui/Pause_2bpp.bmp create mode 100644 boop/trunk/gui/Play_2bpp.bmp create mode 100644 boop/trunk/gui/Stop_2bpp.bmp create mode 100644 boop/trunk/gui/controls.c create mode 100644 boop/trunk/gui/controls.h create mode 100644 boop/trunk/gui/iconCross.h create mode 100644 boop/trunk/gui/iconCross_t.h create mode 100644 boop/trunk/gui/iconFf.h create mode 100644 boop/trunk/gui/iconFr.h create mode 100644 boop/trunk/gui/iconHourglas.h create mode 100644 boop/trunk/gui/iconHourglas_t.h create mode 100644 boop/trunk/gui/iconLeo_gray_128.h create mode 100644 boop/trunk/gui/iconPause.h create mode 100644 boop/trunk/gui/iconPlay.h create mode 100644 boop/trunk/gui/iconStop.h create mode 100644 boop/trunk/gui/mainmenu.c create mode 100644 boop/trunk/gui/mainmenu.h create mode 100644 boop/trunk/gui/menu.c create mode 100644 boop/trunk/gui/menu.h create mode 100644 boop/trunk/gui/settingsmenu.c create mode 100644 boop/trunk/gui/settingsmenu.h create mode 100644 boop/trunk/gui/testmenu.c create mode 100644 boop/trunk/gui/testmenu.h create mode 100644 boop/trunk/infrared/Make.conf create mode 100644 boop/trunk/infrared/codes.c create mode 100644 boop/trunk/infrared/codes.h create mode 100644 boop/trunk/infrared/encoders.c create mode 100644 boop/trunk/infrared/encoders.h create mode 100644 boop/trunk/infrared/infrared.c create mode 100644 boop/trunk/infrared/infrared.h create mode 100644 boop/trunk/infrared/infrared_encoders.h create mode 100644 boop/trunk/infrared/infraredirq.c create mode 100644 boop/trunk/infrared/infraredirq.h create mode 100644 boop/trunk/infrared/ir_capture.c create mode 100644 boop/trunk/infrared/ir_capture.h create mode 100644 boop/trunk/infrared/ir_codes/itt/seleco_019 create mode 100644 boop/trunk/infrared/ir_codes/itt/seleco_049 create mode 100644 boop/trunk/infrared/ir_codes/itt/seleco_108 create mode 100644 boop/trunk/infrared/ir_codes/itt/seleco_131 create mode 100644 boop/trunk/infrared/ir_codes/lirc/apple_remote1 create mode 100644 boop/trunk/infrared/ir_codes/lirc/fs20 create mode 100644 boop/trunk/infrared/ir_codes/lirc/hx2262 create mode 100644 boop/trunk/infrared/ir_codes/lirc/olympus_rm-1 create mode 100644 boop/trunk/infrared/ir_codes/lirc/rev008340 create mode 100644 boop/trunk/infrared/ir_codes/lirc/samsung_ue46b6000 create mode 100644 boop/trunk/infrared/ir_codes/lirc/str_de545 create mode 100644 boop/trunk/infrared/ir_codes/lirc/ufs910 create mode 100644 boop/trunk/infrared/ir_codes/lirc/ufs922 create mode 100644 boop/trunk/infrared/ir_codes/nrc17/dbox2 create mode 100644 boop/trunk/infrared/ir_codes/nrc17/grundig_tp720 create mode 100644 boop/trunk/infrared/ir_codes/rc5/HARMONY_655 create mode 100644 boop/trunk/infrared/ir_codes/rc5/technisat_satreceiver_103TS103 create mode 100644 boop/trunk/infrared/ir_codes/rc5/tv create mode 100644 boop/trunk/infrared/ir_codes/rc6/dvd create mode 100644 boop/trunk/infrared/ir_codes/rc6/tv create mode 100644 boop/trunk/infrared/ir_codes/rc6/ufs922 create mode 100644 boop/trunk/infrared/ir_codes/rca/xbox create mode 100644 boop/trunk/infrared/ir_codes/rcmm/galaxis create mode 100644 boop/trunk/infrared/ir_codes/rcmm/ufs910 create mode 100644 boop/trunk/infrared/ir_codes/rec80/rak_sc957wk create mode 100644 boop/trunk/infrared/ir_codes/recs80/seleco_020 create mode 100644 boop/trunk/infrared/ir_codes/recs80/seleco_157 create mode 100644 boop/trunk/infrared/ir_codes/rf/cc1100_a0 create mode 100644 boop/trunk/infrared/ir_codes/rf/cc1100_a1 create mode 100644 boop/trunk/infrared/ir_codes/sirc/UFD400 create mode 100644 boop/trunk/infrared/ir_codes/sirc/rm-pp411 create mode 100644 boop/trunk/infrared/ir_codes/sirc/tv create mode 100644 boop/trunk/infrared/ir_codes/spaceenc/schneider_dtv3 create mode 100644 boop/trunk/infrared/ir_codes/spaceenc/schneider_dtv3_xtra create mode 100644 boop/trunk/infrared/ir_codes/spaceenc/seleco_027 create mode 100644 boop/trunk/infrared/ir_itt.c create mode 100644 boop/trunk/infrared/ir_itt.h create mode 100644 boop/trunk/infrared/ir_lirc.c create mode 100644 boop/trunk/infrared/ir_lirc.h create mode 100644 boop/trunk/infrared/ir_nrc17.c create mode 100644 boop/trunk/infrared/ir_nrc17.h create mode 100644 boop/trunk/infrared/ir_raw.c create mode 100644 boop/trunk/infrared/ir_raw.h create mode 100644 boop/trunk/infrared/ir_rc5.c create mode 100644 boop/trunk/infrared/ir_rc5.h create mode 100644 boop/trunk/infrared/ir_rc6.c create mode 100644 boop/trunk/infrared/ir_rc6.h create mode 100644 boop/trunk/infrared/ir_rca.c create mode 100644 boop/trunk/infrared/ir_rca.h create mode 100644 boop/trunk/infrared/ir_rcmm.c create mode 100644 boop/trunk/infrared/ir_rcmm.h create mode 100644 boop/trunk/infrared/ir_rec80.c create mode 100644 boop/trunk/infrared/ir_rec80.h create mode 100644 boop/trunk/infrared/ir_recs80.c create mode 100644 boop/trunk/infrared/ir_recs80.h create mode 100644 boop/trunk/infrared/ir_rf.c create mode 100644 boop/trunk/infrared/ir_rf.h create mode 100644 boop/trunk/infrared/ir_selector.c create mode 100644 boop/trunk/infrared/ir_selector.h create mode 100644 boop/trunk/infrared/ir_sirc.c create mode 100644 boop/trunk/infrared/ir_sirc.h create mode 100644 boop/trunk/infrared/ir_spaceenc.c create mode 100644 boop/trunk/infrared/ir_spaceenc.h create mode 100644 boop/trunk/interrupt/Make.conf create mode 100644 boop/trunk/interrupt/irq.c create mode 100644 boop/trunk/interrupt/irq.h create mode 100644 boop/trunk/keyboard/Make.conf create mode 100644 boop/trunk/keyboard/keyboard.c create mode 100644 boop/trunk/keyboard/keyboard.h create mode 100644 boop/trunk/keyboard/keyirq.c create mode 100644 boop/trunk/keyboard/keyirq.h create mode 100644 boop/trunk/lpc2220.h create mode 100644 boop/trunk/lpc2220_rom.ld create mode 100644 boop/trunk/main.c create mode 100644 boop/trunk/rtc/Make.conf create mode 100644 boop/trunk/rtc/i2c.c create mode 100644 boop/trunk/rtc/i2c.h create mode 100644 boop/trunk/rtc/rtc.c create mode 100644 boop/trunk/rtc/rtc.h create mode 100644 boop/trunk/rtc/rtctimer.c create mode 100644 boop/trunk/rtc/rtctimer.h create mode 100644 boop/trunk/serial/Make.conf create mode 100644 boop/trunk/serial/redirector.c create mode 100644 boop/trunk/serial/redirector.h create mode 100644 boop/trunk/serial/serial.c create mode 100644 boop/trunk/serial/serial.h create mode 100644 boop/trunk/serial/serirq.c create mode 100644 boop/trunk/sound3.h create mode 100644 boop/trunk/syscalls.c create mode 100644 boop/trunk/timer/Make.conf create mode 100644 boop/trunk/timer/timerfuncs.c create mode 100644 boop/trunk/timer/timerfuncs.h create mode 100644 boop/trunk/timer/timerirq.c create mode 100644 boop/trunk/timer/timerirq.h create mode 100644 boop/trunk/tools/Make.conf create mode 100644 boop/trunk/tools/scart_icp.c create mode 100644 boop/trunk/tools/scart_icp.h create mode 100644 boop/trunk/tools/scart_image.h create mode 100644 boop/trunk/tools/scart_image_data.h create mode 100644 boop/trunk/tools/toolsmenu.c create mode 100644 boop/trunk/tools/toolsmenu.h create mode 100644 lpctool/testing/ChangeLog create mode 100644 lpctool/testing/Makefile create mode 100644 lpctool/testing/Makefile.inc create mode 100644 lpctool/testing/Makefile.local.WinARM create mode 100644 lpctool/testing/Makefile.local.linuxARM create mode 100644 lpctool/testing/baudrate.h create mode 100644 lpctool/testing/bootcom.c create mode 100644 lpctool/testing/bootcom.h create mode 100644 lpctool/testing/fla.sh create mode 100644 lpctool/testing/flashtool/Makefile create mode 100644 lpctool/testing/flashtool/bin2h.c create mode 100644 lpctool/testing/flashtool/charset.bits create mode 100644 lpctool/testing/flashtool/charset.info create mode 100644 lpctool/testing/flashtool/crt.s create mode 100644 lpctool/testing/flashtool/flash.c create mode 100644 lpctool/testing/flashtool/flash.h create mode 100644 lpctool/testing/flashtool/fonty.c create mode 100644 lpctool/testing/flashtool/fonty.h create mode 100644 lpctool/testing/flashtool/irq.c create mode 100644 lpctool/testing/flashtool/lcd.c create mode 100644 lpctool/testing/flashtool/lcd.h create mode 100644 lpctool/testing/flashtool/lpc2220.h create mode 100644 lpctool/testing/flashtool/lpc2220.ld create mode 100644 lpctool/testing/flashtool/lpc2220_rom.ld create mode 100644 lpctool/testing/flashtool/ramtool.c create mode 100644 lpctool/testing/flashtool/serial.c create mode 100644 lpctool/testing/flashtool/serial.h create mode 100644 lpctool/testing/infohelper.c create mode 100644 lpctool/testing/infohelper.h create mode 100644 lpctool/testing/lpctool.c create mode 100644 lpctool/testing/lpctool_serial.c create mode 100644 lpctool/testing/lpctool_serial.h create mode 100644 lpctool/testing/toolcmd.h create mode 100644 lpctool/testing/toolcom.c create mode 100644 lpctool/testing/toolcom.h create mode 100644 lpctool/trunk/ChangeLog create mode 100644 lpctool/trunk/Makefile create mode 100644 lpctool/trunk/Makefile.local.WinARM create mode 100644 lpctool/trunk/Makefile.local.linuxARM create mode 100644 lpctool/trunk/bin2h.c create mode 100644 lpctool/trunk/bootcom.c create mode 100644 lpctool/trunk/bootcom.h create mode 100644 lpctool/trunk/charset.bits create mode 100644 lpctool/trunk/charset.info create mode 100644 lpctool/trunk/crt.s create mode 100644 lpctool/trunk/flash.c create mode 100644 lpctool/trunk/flash.h create mode 100644 lpctool/trunk/fonty.c create mode 100644 lpctool/trunk/fonty.h create mode 100644 lpctool/trunk/infohelper.c create mode 100644 lpctool/trunk/infohelper.h create mode 100644 lpctool/trunk/irq.c create mode 100644 lpctool/trunk/lcd.c create mode 100644 lpctool/trunk/lcd.h create mode 100644 lpctool/trunk/lpc2220.h create mode 100644 lpctool/trunk/lpc2220.ld create mode 100644 lpctool/trunk/lpc2220_rom.ld create mode 100644 lpctool/trunk/lpctool.c create mode 100644 lpctool/trunk/lpctool_serial.c create mode 100644 lpctool/trunk/lpctool_serial.h create mode 100644 lpctool/trunk/ramtool.c create mode 100644 lpctool/trunk/serial.c create mode 100644 lpctool/trunk/serial.h create mode 100644 lpctool/trunk/toolcmd.h create mode 100644 lpctool/trunk/toolcom.c create mode 100644 lpctool/trunk/toolcom.h diff --git a/.cproject b/.cproject new file mode 100644 index 0000000..6a3b3ee --- /dev/null +++ b/.cproject @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + make + + debug + true + true + true + + + make + + clean + true + true + true + + + make + + program + true + true + true + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..800256a --- /dev/null +++ b/.project @@ -0,0 +1,27 @@ + + + Boop + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/Asixtool/asix-testcode/Makefile b/Asixtool/asix-testcode/Makefile new file mode 100644 index 0000000..79d72fe --- /dev/null +++ b/Asixtool/asix-testcode/Makefile @@ -0,0 +1,35 @@ +SDCCPATH=/opt/sdcc/ +SDCCBIN=$(SDCCPATH)/bin/ +SDCCEXTRA=$(SDCCPATH)/share/sdcc/ + +SDCC=$(SDCCBIN)/sdcc +SDCCINC=$(SDCCEXTRA)/include/mcs51/ +SDCCLIB=$(SDCCEXTRA)/lib/large/ +SDCCMFLAGS=-mds390 --use-asix --opt-code-size --stack-size 0x80 +SDCCLFLAGS=--xram-loc 0x0000 --xram-size 0x8000 --iram-size 0x80 --code-loc 0x000000 --code-size 0x080000 --stack-loc 0x80 --idata-loc 0x30 + +OBJECTS=cpu_ax110xx.rel interrupt_ax110xx.rel main.rel uart/uart.rel + +all : asix.bin + +asix.bin: asix.ihx + $(SDCCBIN)/makebin -p asix.bin + +asix.ihx: $(OBJECTS) + $(SDCC) -I$(SDCCINC) $(SDCCMFLAGS) $(SDCCLFLAGS) $(OBJECTS) -o asix.ihx + +cpu_ax110xx.rel: cpu_ax110xx.c cpu_ax110xx.h ax110xx.h + $(SDCC) -I$(SDCCINC) $(SDCCMFLAGS) -c cpu_ax110xx.c + +interrupt_ax110xx.rel: interrupt_ax110xx.c interrupt_ax110xx.h ax110xx.h + $(SDCC) -I$(SDCCINC) $(SDCCMFLAGS) -c interrupt_ax110xx.c + +main.rel: main.c ax110xx.h interrupt_ax110xx.h cpu_ax110xx.h + $(SDCC) -I$(SDCCINC) $(SDCCMFLAGS) -c main.c + +uart/uart.rel: uart/uart.c ax110xx.h + $(SDCC) -I$(SDCCINC) $(SDCCMFLAGS) -c -o uart/ uart/uart.c + +clean: + rm -f mon.ihx *.asm *.lst *.rel *.rst *.sym *.cdb *.map *.ihx *.lnk *.hex *.mem *.bin *~ + cd uart; rm -f *.asm *.lst *.rel *.rst *.sym *.cdb *.map *.ihx *.lnk *.hex *.mem *.bin *~; cd .. diff --git a/Asixtool/asix-testcode/Makefile.bak b/Asixtool/asix-testcode/Makefile.bak new file mode 100644 index 0000000..187fc65 --- /dev/null +++ b/Asixtool/asix-testcode/Makefile.bak @@ -0,0 +1,35 @@ +SDCCPATH=F:/Tools/SDCC +SDCCBIN=$(SDCCPATH)/bin +SDCCEXTRA=$(SDCCPATH)/share/sdcc/ + +SDCC=$(SDCCBIN)/sdcc +SDCCINC=$(SDCCPATH)/include/mcs51 +SDCCLIB=$(SDCCPATH)/lib/large/ +SDCCMFLAGS=-mds390 --use-asix --opt-code-size --stack-size 0x80 +SDCCLFLAGS=--xram-loc 0x0000 --xram-size 0x8000 --iram-size 0x80 --code-loc 0x000000 --code-size 0x080000 --stack-loc 0x80 --idata-loc 0x30 + +OBJECTS=cpu_ax110xx.rel interrupt_ax110xx.rel main.rel uart/uart.rel + +all : asix.bin + +asix.bin: asix.ihx + $(SDCCBIN)/makebin -p asix.bin + +asix.ihx: $(OBJECTS) + $(SDCC) -I$(SDCCINC) $(SDCCMFLAGS) $(SDCCLFLAGS) $(OBJECTS) -o asix.ihx + +cpu_ax110xx.rel: cpu_ax110xx.c cpu_ax110xx.h ax110xx.h + $(SDCC) -I$(SDCCINC) $(SDCCMFLAGS) -c cpu_ax110xx.c + +interrupt_ax110xx.rel: interrupt_ax110xx.c interrupt_ax110xx.h ax110xx.h + $(SDCC) -I$(SDCCINC) $(SDCCMFLAGS) -c interrupt_ax110xx.c + +main.rel: main.c ax110xx.h interrupt_ax110xx.h cpu_ax110xx.h + $(SDCC) -I$(SDCCINC) $(SDCCMFLAGS) -c main.c + +uart/uart.rel: uart/uart.c ax110xx.h + $(SDCC) -I$(SDCCINC) $(SDCCMFLAGS) -c -o uart/ uart/uart.c + +clean: + rm -f mon.ihx *.asm *.lst *.rel *.rst *.sym *.cdb *.map *.ihx *.lnk *.hex *.mem *.bin *~ + cd uart; rm -f *.asm *.lst *.rel *.rst *.sym *.cdb *.map *.ihx *.lnk *.hex *.mem *.bin *~; cd .. diff --git a/Asixtool/asix-testcode/ax110xx.h b/Asixtool/asix-testcode/ax110xx.h new file mode 100644 index 0000000..99cc846 --- /dev/null +++ b/Asixtool/asix-testcode/ax110xx.h @@ -0,0 +1,462 @@ +#ifndef AX110XX_H +#define AX110XX_H + +/* Byte Registers */ +__sfr __at (0x80) P0; // Port 0 +__sfr __at (0x81) SP; // Stack Pointer +__sfr __at (0x82) DPL0; // Data Pointer 0 Low Byte +__sfr __at (0x83) DPH0; // Data Pointer 0 High Byte +__sfr __at (0x82) DPL; // Data Pointer 0 Low Byte +__sfr __at (0x83) DPH; // Data Pointer 0 High Byte +__sfr __at (0x84) DPL1; // Data Pointer 1 Low Byte +__sfr __at (0x85) DPH1; // Data Pointer 1 High Byte +__sfr __at (0x86) DPS; // Data Pointers Select Register +__sfr __at (0x87) PCON; // Power Configuration Register +__sfr __at (0x88) TCON; // Timer 0,1 Configuration Register +__sfr __at (0x89) TMOD; // Timer 0,1 Control Mode Register +__sfr __at (0x8A) TL0; // Timer 0 Low Byte Counter +__sfr __at (0x8B) TL1; // Timer 1 Low Byte Counter +__sfr __at (0x8C) TH0; // Timer 0 High Byte Counter +__sfr __at (0x8D) TH1; // Timer 1 High Byte Counter +__sfr __at (0x8E) CKCON; // Clock Control Register +__sfr __at (0x8F) CSREPR; // Software Reset and External Program RAM Select Register + +__sfr __at (0x90) P1; // Port 1 +__sfr __at (0x91) EIF; // Extended Interrupt Flag Register +__sfr __at (0x92) WTST; // Program Wait States Register +__sfr __at (0x93) DPX0; // Data Pointer Extended Register 0 +__sfr __at (0x93) DPX; // Data Pointer Extended Register 0 +__sfr __at (0x94) SDSTSR; // Software Timer and Software DMA complete interrupt status +__sfr __at (0x95) DPX1; // Data Pointer Extended Register 1 +__sfr __at (0x96) I2CCIR; // I2C Command Index Register +__sfr __at (0x97) I2CDR; // I2C Data Register +__sfr __at (0x98) SCON0; // UART 0 Configuration Register +__sfr __at (0x99) SBUF0; // UART 0 Buffer Register +__sfr __at (0x9A) DBAR; // DMA Bus Arbitration Register +__sfr __at (0x9B) DCIR; // DMA Command Index Register +__sfr __at (0x9C) DDR; // DMA Data Register +__sfr __at (0x9D) ACON; // Address Control Register +__sfr __at (0x9E) PISSR1; // Peripheral Interrupt Status Summary Register 1 +__sfr __at (0x9F) PISSR2; // Peripheral Interrupt Status Summary Register 2 + +__sfr __at (0xA0) P2; // Port 2 +/* Local Bus Master Mode */ +__sfr __at (0xA1) LMSR; // Local Bus Mode Setup Register +__sfr __at (0xA2) LCR; // Local Bus Command Register +__sfr __at (0xA3) LSR; // Local Bus Status Register +__sfr __at (0xA4) LDALR; // Local Bus Device Address Low Register +__sfr __at (0xA5) LDAHR; // Local Bus Device Address High Register +__sfr __at (0xA6) LDCSR; // Local Bus Device Chip Select Register +/* Local Bus Slave Mode */ +__sfr __at (0xA1) LSAIER; // Local Bus Slave mode Action and Interrupt Enable Register +__sfr __at (0xA2) LSCR; // Local Bus Slave mode Command Register +__sfr __at (0xA3) LSSR; // Local Bus Slave mode Status Register +__sfr __at (0xA4) XMWLR; // External Master Write-read Low Register +__sfr __at (0xA5) XMWHR; // External Master Write-read High Register +__sfr __at (0xA6) XMRLR; // External Master Read-only Low Register +__sfr __at (0xA7) XMRHR; // External Master Read-only High Register +__sfr __at (0xA8) IE; // Interrupt Enable register +__sfr __at (0xA9) LDLR; // Local Bus Data Low Register +__sfr __at (0xAA) LDHR; // Local Bus Data High Register +__sfr __at (0xAB) DMALR; // Local Bus DMA Address Low Register +__sfr __at (0xAC) DMAMR; // Local Bus DMA Address Medium Register +__sfr __at (0xAD) DMAHR; // Local Bus DMA Address High Register +__sfr __at (0xAE) TCIR; // TOE Command Index Register +__sfr __at (0xAF) TDR; // TOE Data Register + +__sfr __at (0xB0) P3; // Port 3 +__sfr __at (0xB1) CCAPL0; // PCA Module 0 Compare/Capture Low Byte Register +__sfr __at (0xB2) CCAPL1; // PCA Module 1 Compare/Capture Low Byte Register +__sfr __at (0xB3) CCAPL2; // PCA Module 2 Compare/Capture Low Byte Register +__sfr __at (0xB4) CCAPL3; // PCA Module 3 Compare/Capture Low Byte Register +__sfr __at (0xB5) CCAPL4; // PCA Module 4 Compare/Capture Low Byte Register +__sfr __at (0xB6) MCIR; // MAC Command Index Register +__sfr __at (0xB7) MDR; // MAC Data Register +__sfr __at (0xB8) IP; // Interrupt Priority Register +__sfr __at (0xB9) CCAPH0; // PCA Module 0 Compare/Capture High Byte Register +__sfr __at (0xBA) CCAPH1; // PCA Module 1 Compare/Capture High Byte Register +__sfr __at (0xBB) CCAPH2; // PCA Module 2 Compare/Capture High Byte Register +__sfr __at (0xBC) CCAPH3; // PCA Module 3 Compare/Capture High Byte Register +__sfr __at (0xBD) CCAPH4; // PCA Module 4 Compare/Capture High Byte Register +__sfr __at (0xBE) EPCR; // Ethernet PHY Command Index Register +__sfr __at (0xBF) EPDR; // Ethernet PHY Data Register + +__sfr __at (0xC0) SCON1; // UART 1 Configuration Register +__sfr __at (0xC1) SBUF1; // UART 1 Buffer Register +__sfr __at (0xC2) CMOD; // PCA Timer/Counter Mode Register +__sfr __at (0xC3) CCON; // PCA Timer/Counter Control Register +__sfr __at (0xC4) CL; // PCA Timer/Counter Low +__sfr __at (0xC5) CH; // PCA Timer/Counter High +__sfr __at (0xC8) T2CON; // Timer 2 Configuration Register +__sfr __at (0xC9) T2IF; // Timer 2 Interrupt Flags +__sfr __at (0xCA) RLDL; // Timer 2 Reload Low Byte +__sfr __at (0xCB) RLDH; // Timer 2 Reload High Byte +__sfr __at (0xCC) TL2; // Timer 2 Low Byte Counter +__sfr __at (0xCD) TH2; // Timer 2 High Byte Counter +__sfr __at (0xCE) SPICIR; // SPI Command Index Register +__sfr __at (0xCF) SPIDR; // SPI Data Register + +__sfr __at (0xD0) PSW; // Program Status Word +__sfr __at (0xD1) CCAPM0; // PCA Compare/Capture Module Mode Register 0 +__sfr __at (0xD2) CCAPM1; // PCA Compare/Capture Module Mode Register 1 +__sfr __at (0xD3) CCAPM2; // PCA Compare/Capture Module Mode Register 2 +__sfr __at (0xD4) CCAPM3; // PCA Compare/Capture Module Mode Register 3 +__sfr __at (0xD5) CCAPM4; // PCA Compare/Capture Module Mode Register 4 +__sfr __at (0xD6) OWCIR; // OneWire Command Index Register +__sfr __at (0xD7) OWDR; // OneWire Data Register +__sfr __at (0xD8) WDCON; // Watchdog Configuration +__sfr __at (0xDE) CANCIR; // CAN Bus Command Index Register +__sfr __at (0xDF) CANDR; // CAN Bus Data Register + +__sfr __at (0xE0) ACC; // Accumulator +/* UART2 registers */ +__sfr __at (0xE1) UR2_DLL;// High Speed UART2 Divisor Latch Low Register +__sfr __at (0xE1) UR2_THR;// High Speed UART2 Transmit Holding Register for Writing +__sfr __at (0xE1) UR2_RBR;// High Speed UART2 Receive Buffer Register for Reading +__sfr __at (0xE2) UR2_DLH;// High Speed UART2 Divisor Latch High Register +__sfr __at (0xE2) UR2_IER;// High Speed UART2 Interrupt Enable Register +__sfr __at (0xE3) UR2_FCR;// High Speed UART2 FIFO Control Register for Writing +__sfr __at (0xE3) UR2_IIR;// High Speed UART2 Interrupt Identification Register for Reading +__sfr __at (0xE4) UR2_LCR;// High Speed UART2 Line Control Register +__sfr __at (0xE5) UR2_MCR;// High Speed UART2 Modem Control Register +__sfr __at (0xE6) UR2_LSR;// High Speed UART2 Line Status Register +__sfr __at (0xE7) UR2_MSR;// High Speed UART2 Modem Status Register +__sfr __at (0xE8) EIE; // External Interrupt Enable +__sfr __at (0xE9) STATUS; // Status Register +__sfr __at (0xEA) MXAX; // MOVX @Ri Extended Register +__sfr __at (0xEB) TA; // Timed Access Protection + +__sfr __at (0xF0) B; // B Working Register +__sfr __at (0xF8) EIP; // Extended Interrupt Priority Register +__sfr __at (0xF9) MD0; // MDU Data 0 +__sfr __at (0xFA) MD1; // MDU Data 1 +__sfr __at (0xFB) MD2; // MDU Data 2 +__sfr __at (0xFC) MD3; // MDU Data 3 +__sfr __at (0xFD) MD4; // MDU Data 4 +__sfr __at (0xFE) MD5; // MDU Data 5 +__sfr __at (0xFF) ARCON ;// MDU Control Register + +/* Bit Registers */ + +/* P0 (0x80) Bit Registers */ +__sbit __at (0x80) P0_0; +__sbit __at (0x81) P0_1; +__sbit __at (0x82) P0_2; +__sbit __at (0x83) P0_3; +__sbit __at (0x84) P0_4; +__sbit __at (0x85) P0_5; +__sbit __at (0x86) P0_6; +__sbit __at (0x87) P0_7; + +/* DPS (0x86) Bit Values */ +#define SEL_ 0x01 +#define TSL_ 0x20 +#define ID0_ 0x40 +#define ID1_ 0x80 + +/* PCON (0x87) Bit Values */ +#define PMM_ 0x01 +#define STOP_ 0x02 +#define SWB_ 0x04 +#define PWE_ 0x10 +#define SMOD1_ 0x40 +#define SMOD2_ 0x80 + +/* TCON (0x88) Bit Registers */ +__sbit __at (0x88) IT0; +__sbit __at (0x89) IE0; +__sbit __at (0x8A) IT1; +__sbit __at (0x8B) IE1; +__sbit __at (0x8C) TR0; +__sbit __at (0x8D) TF0; +__sbit __at (0x8E) TR1; +__sbit __at (0x8F) TF1; + +/* TMOD (0x89) Bit Values */ +#define T0_M0_ 0x01 +#define T0_M1_ 0x02 +#define T0_CT_ 0x04 +#define T0_GATE_ 0x08 +#define T1_M0_ 0x10 +#define T1_M1_ 0x20 +#define T1_CT_ 0x40 +#define T1_GATE_ 0x80 + +#define T1_MASK_ 0xF0 +#define T0_MASK_ 0x0F + +/* CKCON (0x8E) Bit Values */ +#define MD0_ 0x01 +#define MD1_ 0x02 +#define MD2_ 0x04 +#define T0M_ 0x08 +#define T1M_ 0x10 +#define T2M_ 0x20 +#define WD0_ 0x40 +#define WD1_ 0x80 + +/* CSREPR (0x8F) Bit Values */ +#define SW_RST 0x01 +#define SW_RBT 0x02 +#define FARM 0x04 +#define FAES 0x08 +#define PMS 0x10 +#define SCS_100M 0xC0 +#define SCS_75M 0x80 +#define SCS_50M 0x40 +#define SCS_25M 0x00 + +/* P1 (0x90) Bit Registers */ +__sbit __at (0x90) P1_0; +__sbit __at (0x91) P1_1; +__sbit __at (0x92) P1_2; +__sbit __at (0x93) P1_3; +__sbit __at (0x94) P1_4; +__sbit __at (0x95) P1_5; +__sbit __at (0x96) P1_6; +__sbit __at (0x97) P1_7; + +/* EIF (0x91) Bit Values */ +#define INT2F 0x01 +#define INT3F 0x02 +#define INT4F 0x04 +#define INT5F 0x08 +#define INT6F 0x10 + +/* SCON0 (0x98) Bit Registers */ +__sbit __at (0x98) RI0; +__sbit __at (0x99) TI0; +__sbit __at (0x9A) RB08; +__sbit __at (0x9B) TB08; +__sbit __at (0x9C) REN0; +__sbit __at (0x9D) SM02; +__sbit __at (0x9E) SM01; +__sbit __at (0x9F) SM00; + +/* DBAR (0x9A) Bit Values */ +#define BUS_REQ 0x01 +#define BUS_GRANT 0x80 + +/* ACON (0x9D) Bit Values */ +#define FLAT_MODE 0x02 +#define LARGE_MODE 0x00 + +/* PISSR1 (0x9E) Bit Values */ +#define LB_INT_STU 0x01 +#define LB_EXT_INT_STU 0x02 +#define ETH_INT_STU 0x04 +#define TOE_INT_STU 0x08 +#define OW_INT_STU 0x10 +#define SPI_INT_STU 0x20 +#define I2C_INT_STU 0x40 +#define CAN_INT_STU 0x80 + +/* PISSR2 (0x9F) Bit Values */ +#define UART2_INT_STU 0x01 + +/* P2 (0xA0) Bit Registers */ +__sbit __at (0xA0) P2_0; +__sbit __at (0xA1) P2_1; +__sbit __at (0xA2) P2_2; +__sbit __at (0xA3) P2_3; +__sbit __at (0xA4) P2_4; +__sbit __at (0xA5) P2_5; +__sbit __at (0xA6) P2_6; +__sbit __at (0xA7) P2_7; + +/* IE (0xA8) Bit Registers */ +__sbit __at (0xA8) EX0; /* 1=Enable External interrupt 0 */ +__sbit __at (0xA9) ET0; /* 1=Enable Timer 0 interrupt */ +__sbit __at (0xAA) EX1; /* 1=Enable External interrupt 1 */ +__sbit __at (0xAB) ET1; /* 1=Enable Timer 1 interrupt */ +__sbit __at (0xAC) ES0; /* 1=Enable Serial port 0 interrupt */ +__sbit __at (0xAD) ET2; /* 1=Enable Timer 2 interrupt */ +__sbit __at (0xAE) ES1; /* 1=Enable Serial port 1 interrupt */ +__sbit __at (0xAF) EA; /* 0=Disable all interrupts */ + +/* P3 (0xB0) Bit Registers (Mnemonics & Ports) */ +__sbit __at (0xB0) P3_0; +__sbit __at (0xB1) P3_1; +__sbit __at (0xB2) P3_2; +__sbit __at (0xB3) P3_3; +__sbit __at (0xB4) P3_4; +__sbit __at (0xB5) P3_5; +__sbit __at (0xB6) P3_6; +__sbit __at (0xB7) P3_7; + +__sbit __at (0xB0) RXD; /* Serial data input */ +__sbit __at (0xB1) TXD; /* Serial data output */ +__sbit __at (0xB2) INT0; /* External interrupt 0 */ +__sbit __at (0xB3) INT1; /* External interrupt 1 */ +__sbit __at (0xB4) T0; /* Timer 0 external input */ +__sbit __at (0xB5) T1; /* Timer 1 external input */ +__sbit __at (0xB6) WR; /* External data memory write strobe */ +__sbit __at (0xB7) RD; /* External data memory read strobe */ + +/* IP (0xB8) Bit Registers */ +__sbit __at (0xB8) PX0; +__sbit __at (0xB9) PT0; +__sbit __at (0xBA) PX1; +__sbit __at (0xBB) PT1; +__sbit __at (0xBC) PS0; +__sbit __at (0xBD) PT2; +__sbit __at (0xBE) PS1; + +/* SCON1 (0xC0) Bit Registers */ +__sbit __at (0xC0) RI1; +__sbit __at (0xC1) TI1; +__sbit __at (0xC2) RB18; +__sbit __at (0xC3) TB18; +__sbit __at (0xC4) REN1; +__sbit __at (0xC5) SM12; +__sbit __at (0xC6) SM11; +__sbit __at (0xC7) SM10; + +/* CMOM (0xC2) Bit Values */ +#define PCA_ECF 0x01 +#define PCA_T0_OF 0x08 +#define PCA_EXT_CLK 0x0E +#define PCA_GATE_OFF 0x80 + +/* CCON (0xC3) Bit Values */ +#define PCA_CCF0 0x01 +#define PCA_CCF1 0x02 +#define PCA_CCF2 0x04 +#define PCA_CCF3 0x08 +#define PCA_CCF4 0x10 +#define PCA_CR 0x40 +#define PCA_CF 0x80 + +/* T2CON (0xC8) Bit Registers */ +__sbit __at (0xC8) CPRL2; +__sbit __at (0xC9) CT2; +__sbit __at (0xCA) TR2; +__sbit __at (0xCB) EXEN2; +__sbit __at (0xCC) TCLK; +__sbit __at (0xCD) RCLK; +__sbit __at (0xCE) EXF2; +__sbit __at (0xCF) TF2; + +/* PSW (0xD0) Bit Registers */ +__sbit __at (0xD0) P; +__sbit __at (0xD1) F1; +__sbit __at (0xD2) OV; +__sbit __at (0xD3) RS0; +__sbit __at (0xD4) RS1; +__sbit __at (0xD5) F0; +__sbit __at (0xD6) AC; +__sbit __at (0xD7) CY; + +/* CCAPM0-4 (0xD1-0xD5) Bit Values */ +#define ECCFs 0x01 +#define PWMs 0x02 +#define TOGs 0x04 +#define MATs 0x08 +#define CAPNs 0x10 +#define CAPPs 0x20 +#define ECOMs 0x40 +#define CEXs 0x80 + +/* PSW (0xD8) Bit Registers */ +__sbit __at (0xD8) RWT; +__sbit __at (0xD9) EWT; +__sbit __at (0xDA) WTRF; +__sbit __at (0xDB) WDIF; + +/* Interrupt Vectors: Address = (N * 8) + 3 */ +#define IE0_VECTOR 0 /* 0x03 External Interrupt 0 */ +#define TF0_VECTOR 1 /* 0x0B Timer 0 */ +#define IE1_VECTOR 2 /* 0x13 External Interrupt 1 */ +#define TF1_VECTOR 3 /* 0x1B Timer 1 */ +#define SIO0_VECTOR 4 /* 0x23 Serial port */ +#define TF2_VECTOR 5 /* 0x2B Timer 2 */ +#define SIO1_VECTOR 6 /* 0x33 Serial port */ +#define DMA_VECTOR 7 /* 0x3B Internal DMA Transfer */ +#define PCA_VECTOR 8 /* 0x43 Internal Programmable Counter Array */ +#define PIR_VECTOR 9 /* 0x4B Internal Peripherial IRQ */ +#define SDMA_VECTOR 10 /* 0x53 Internal Software DMA */ +#define WU_VECTOR 11 /* 0x5B Wake-Up */ +#define WDT_VECTOR 12 /* 0x63 Internal Watchdog */ + +/* UR2_IER (0xE2) Bit Values */ +#define UR2_RDI_ENB 0x01 +#define UR2_THRI_ENB 0x02 +#define UR2_RLSI_ENB 0x04 +#define UR2_MSI_ENB 0x08 + +/* UR2_IIR (0xE3) Bit Values */ +#define UR2_NONE_INTR 0x01 +#define UR2_RLS_INTR 0x06 +#define UR2_RD_TRIG_INTR 0x04 +#define UR2_RD_TI_INTR 0x0C +#define UR2_THRE_INTR 0x02 +#define UR2_MS_INTR 0x00 + +/* UR2_FCR (0xE3) Bit Values */ +#define UR2_FIFO_MODE 0x01 +#define UR2_RXFIFO_RST 0x02 +#define UR2_TXFIFO_RST 0x04 +#define UR2_TRIG_01 0x00 +#define UR2_TRIG_04 0x40 +#define UR2_TRIG_08 0x80 +#define UR2_TRIG_14 0xC0 + +/* UR2_LCR (0xE4) Bit Values */ +#define UR2_CHAR_5 0x00 +#define UR2_CHAR_6 0x01 +#define UR2_CHAR_7 0x02 +#define UR2_CHAR_8 0x03 +#define UR2_STOP_10 0x00 +#define UR2_STOP_15 0x04 +#define UR2_PARITY_ENB 0x08 +#define UR2_EVEN_PARITY 0x10 +#define UR2_STICK_PARITY 0x20 +#define UR2_BREAK_ENB 0x40 +#define UR2_DLAB_ENB 0x80 + +/* UR2_MCR (0xE5) Bit Values */ +#define UR2_DTR 0x01 +#define UR2_RTS 0x02 +#define UR2_OUT1 0x04 +#define UR2_OUT2 0x08 +#define UR2_LOOPBACK 0x10 +#define UR2_RS485_RECEIVE 0x40 +#define UR2_RS485_DRIVE 0x80 + +/* UR2_LSR (0xE6) Bit Values */ +#define UR2_DR 0x01 +#define UR2_OE 0x02 +#define UR2_PE 0x04 +#define UR2_FE 0x08 +#define UR2_BI 0x10 +#define UR2_THRE 0x20 +#define UR2_TEMT 0x40 +#define UR2_FRAME_ERR 0x80 + +/* UR2_MSR (0xE7) Bit Values */ +#define UR2_DCTS 0x01 +#define UR2_DDSR 0x02 +#define UR2_TERI 0x04 +#define UR2_DDCD 0x08 +#define UR2_CTS 0x10 +#define UR2_DSR 0x20 +#define UR2_RI 0x40 +#define UR2_DCD 0x80 + +/* EIE (0xE8) Bit Registers */ +__sbit __at (0xE8) EINT2; +__sbit __at (0xE9) EINT3; +__sbit __at (0xEA) EINT4; +__sbit __at (0xEB) EINT5; +__sbit __at (0xEC) EINT6; +__sbit __at (0xED) EWDI; + +/* EIP (0xF8) Bit Registers */ +__sbit __at (0xF8) PINT2; +__sbit __at (0xF9) PINT3; +__sbit __at (0xFA) PINT4; +__sbit __at (0xFB) PINT5; +__sbit __at (0xFC) PINT6; +__sbit __at (0xFD) PWDI; + +#endif diff --git a/Asixtool/asix-testcode/cpu_ax110xx.c b/Asixtool/asix-testcode/cpu_ax110xx.c new file mode 100644 index 0000000..c90d9f7 --- /dev/null +++ b/Asixtool/asix-testcode/cpu_ax110xx.c @@ -0,0 +1,177 @@ +#include "ax110xx.h" +#include "interrupt_ax110xx.h" +#include "cpu_ax110xx.h" +#include "types_ax110xx.h" + +static unsigned char globeInt = 0; +static unsigned char cpuSysClk = 0; +static unsigned char memShadow = 0; +static unsigned char progWtst = 0; +static unsigned char dataStretch = 0; + +void AX11000_Init(void) +{ + EA = 0; // turn off globe interrupt + + P0 = 0xFF; + P1 = 0xFF; + P2 = 0xFF; + P3 = 0xFF; + + /* Check program wait-state and data memory wait-state */ + if (CSREPR & PMS) + { + memShadow = 1; + + /* for real chip */ + switch (CSREPR & (BIT6|BIT7)) + { + case SCS_100M : + cpuSysClk = SCS_100M; + WTST = 0x01; + CKCON = 0x01; + break; + case SCS_50M : + cpuSysClk = SCS_50M; + WTST = 0x00; + CKCON = 0x01; + break; + case SCS_25M : + cpuSysClk = SCS_25M; + WTST = 0x00; + CKCON = 0x01; + break; + } + } + else + { + memShadow = 0; + + /* for real chip */ + switch (CSREPR & (BIT6|BIT7)) + { + case SCS_100M : + cpuSysClk = SCS_100M; + WTST = 0x07; + CKCON = 0x01; + break; + case SCS_50M : + cpuSysClk = SCS_50M; + WTST = 0x03; + CKCON = 0x01; + break; + case SCS_25M : + cpuSysClk = SCS_25M; + WTST = 0x01; + CKCON = 0x01; + break; + } + } + + progWtst = WTST & 0x07; + dataStretch = CKCON & 0x07; + + PCON &= ~SWB_; // Turn off switchback function. + + EIF &= ~INT5F; // Clear the flag of interrupt 5. + EIF &= ~INT6F; // Clear the flag of interrupt 6. + if (WTRF) + { + CSREPR |= SW_RST; + WTRF = 0; // Clear Watch Dog Time Out Reset Flag. + } + + PINT2 = 1; // INT2 priority is at high level for DMA request. + + EXTINT0(OFF); // EINT0 interrupt. + EXTINT1(OFF); // EINT1 interrupt. + EXTINT2(OFF); // EINT2 interrupt for DMA request. + EXTINT3(OFF); // EINT3 interrupt for PCA. + EXTINT4(OFF); // EINT4 interrupt for peripheral device. + EXTINT5(OFF); // EINT5 interrupt for software timer. + EXTINT6(OFF); // EINT6 interrupt for wake-up of power management mode and stop mode. + + if (globeInt & BIT7) + EA = globeInt & BIT0; + else + EA = 1; // Enable the globe interrupt. +} + +unsigned char AX11000_GetSysClk(void) +{ + return cpuSysClk; +} + +unsigned char AX11000_GetMemSdw(void) +{ + return memShadow; +} + +unsigned char AX11000_GetProgWst(void) +{ + return progWtst; +} + +unsigned char AX11000_GetDataSth(void) +{ + return dataStretch; +} + +void AX11000_SoftReset(void) +{ + if (EA) + globeInt = BIT0 | BIT7; // BIT0:EA bit record ; BIT7:Software reset record. + else + globeInt = BIT7; + + EA = 0; + + CSREPR |= SW_RST; +} + +void AX11000_SoftReboot(void) +{ + CSREPR |= SW_RBT; +} + +void AX11000_WatchDogSetting(unsigned char wdIntrEnb, unsigned char wdRstEnb, unsigned char wdPrty, unsigned char wdTime) +{ + CKCON |= wdTime; + + if (wdIntrEnb & WD_INTR_ENABLE) + { + EWDI = 1; + } + else + { + EWDI = 0; + } + + if (wdRstEnb & WD_RESET_ENABLE) + { + TA = 0xAA; + TA = 0x55; + EWT = 1; + } + else + { + TA = 0xAA; + TA = 0x55; + EWT = 0; + } + + if (wdPrty & WD_HIGH_PRIORITY) + { + PWDI = 1; + } + else + { + PWDI = 0; + } + + TA = 0xAA; + TA = 0x55; + RWT = 1; + WTRF = 0; + WDIF = 0; +} diff --git a/Asixtool/asix-testcode/cpu_ax110xx.h b/Asixtool/asix-testcode/cpu_ax110xx.h new file mode 100644 index 0000000..bb4d5e9 --- /dev/null +++ b/Asixtool/asix-testcode/cpu_ax110xx.h @@ -0,0 +1,61 @@ +#ifndef AX11000_H +#define AX11000_H + +#define GET_SYS_VALUE 1 // 1:get the system globe value information +#define AX_SWRST_ENB 0 // 1:use software reset function ; 0:not use +#define AX_SWRBT_ENB 0 // 1:use software reboot function ; 0:not use +#define STOE_ENABLE 0 +#define AX_WATCHDOG_ENB 0 // 1:involve watchdog function ; 0:not use + +/*-------------------------------------------------------------*/ +#define RUNTIME_CODE_START_AT_0H 0 /* 0: runtime code start at 0h */ +#define RUNTIME_CODE_START_AT_24kH 1 /* 1: runtime code start at 24kh. */ +#define RUNTIME_CODE_START_ADDRESS (RUNTIME_CODE_START_AT_0H) + +/* MACRO DECLARATIONS */ +#define AX_DBG_LED(value) {P1 = value;} // debug LED port, default is P1 + +/* NAMING CONSTANT DECLARATIONS */ +#define PROG_WTST_0 0 +#define PROG_WTST_1 1 +#define PROG_WTST_2 2 +#define PROG_WTST_3 3 +#define PROG_WTST_4 4 +#define PROG_WTST_5 5 +#define PROG_WTST_6 6 +#define PROG_WTST_7 7 +#define DATA_STRETCH_0 0 +#define DATA_STRETCH_1 1 +#define DATA_STRETCH_2 2 +#define DATA_STRETCH_3 3 +#define DATA_STRETCH_4 4 +#define DATA_STRETCH_5 5 +#define DATA_STRETCH_6 6 +#define DATA_STRETCH_7 7 + +#define SHADOW_MEM_ENB 0x10 +#define SYS_CLK_100M 0xC0 +#define SYS_CLK_50M 0x40 +#define SYS_CLK_25M 0x00 + +#define WD_INTR_ENABLE 1 +#define WD_INTR_DISABLE 0 +#define WD_RESET_ENABLE 1 +#define WD_RESET_DISABLE 0 +#define WD_HIGH_PRIORITY 1 +#define WD_LOW_PRIORITY 0 +#define WD_INTERVAL_131K 0x00 +#define WD_INTERVAL_1M WD0_ +#define WD_INTERVAL_8M WD1_ +#define WD_INTERVAL_67M WD1_|WD0_ + +void AX11000_Init(void); +unsigned char AX11000_GetSysClk(void); +unsigned char AX11000_GetMemSdw(void); +unsigned char AX11000_GetProgWst(void); +unsigned char AX11000_GetDataSth(void); +void AX11000_SoftReset(void); +void AX11000_SoftReboot(void); +void AX11000_WatchDogSetting(unsigned char wdIntrEnb, unsigned char wdRstEnb, unsigned char wdPrty, unsigned char wdTime); + +#endif /* End of AX11000_H */ diff --git a/Asixtool/asix-testcode/interrupt_ax110xx.c b/Asixtool/asix-testcode/interrupt_ax110xx.c new file mode 100644 index 0000000..2f47b04 --- /dev/null +++ b/Asixtool/asix-testcode/interrupt_ax110xx.c @@ -0,0 +1,188 @@ +#include "ax110xx.h" +#include "cpu_ax110xx.h" +#include "interrupt_ax110xx.h" +#include "types_ax110xx.h" + +#if LBI_IRQ_ENABLE +#include "lbi.h" +#endif + +#if ETH_IRQ_ENABLE +#include "ethernet/mac.h" +#include "ethernet/stoe.h" +#endif + +#if I2C_IRQ_ENABLE +#include "i2c.h" +#endif + +#if SPI_IRQ_ENABLE +#include "spi.h" +#endif + +#if ONEWIRE_IRQ_ENABLE +#include "onewire.h" +#endif + +#if CAN_IRQ_ENABLE +#include "can.h" +#endif + +#if HSUART_IRQ_ENABLE +#include "hsuart.h" +#endif + +void ax11000_PeripherialISR(void) __interrupt 9; + +#if POWER_MANAGEMENT_IRQ_ENABLE +void ax11000_PmmISR(void); +#endif + +#if WATCHDOG_IRQ_ENB +void ax11000_WatchDogISR(void); +#endif + +void ax11000_PeripherialISR(void) __interrupt 9 +{ + unsigned int intrStt1 = 0; + unsigned int intrStt2 = 0; + + /* Interrupt type check */ + while (1) + { + EA = 0; + intrStt1 = PISSR1; + intrStt2 = PISSR2; + EA = 1; + + if ((intrStt1 == 0) && (intrStt2 == 0)) + break; + +#if LBI_IRQ_ENABLE + if (intrStt1 & LB_INT_STU) + { + LocalBusFunc(); + } + + if (intrStt1 & LB_EXT_INT_STU) + { + LocalBusAccessCompleteFunc(); + } +#endif + +#if ETH_IRQ_ENABLE +#if (MAC_GET_INTSTATUS_MODE == MAC_INTERRUPT_MODE) + if (intrStt1 & ETH_INT_STU) + { + MAC_SetInterruptFlag(); + } +#endif +#endif + +#if ETH_IRQ_ENABLE +#if (STOE_GET_INTSTATUS_MODE == STOE_INTERRUPT_MODE) + if (intrStt1 & TOE_INT_STU) + { + STOE_SetInterruptFlag(); + } +#endif +#endif + +#if CAN_IRQ_ENABLE + if (intrStt1 & CAN_INT_STU) + { + CAN_Func(); + } +#endif + +#if I2C_IRQ_ENABLE + if (intrStt1 & I2C_INT_STU) + { + I2C_Func(); + } +#endif + +#if SPI_IRQ_ENABLE + if (intrStt1 & SPI_INT_STU) + { + SPI_Func(); + } +#endif + +#if ONEWIRE_IRQ_ENABLE + if (intrStt1 & OW_INT_STU) + { + ONEWIRE_Func(); + } +#endif + +#if HSUART_IRQ_ENABLE + if (intrStt2 & UART2_INT_STU) + { + HSUR_Func(); + } +#endif + } +} + +#if POWER_MANAGEMENT_IRQ_ENABLE +void ax11000_PmmISR(void) __interrupt 11 +{ + unsigned int wakeStatus = 0; + unsigned int mode = 0; + unsigned int sysClk = 0; + unsigned int canReg = 0; + unsigned int intEnb = 0; + + EA = 0; + EIF &= ~INT6F; // Clear the flag of interrupt 6. + EA = 1; + + + + wakeStatus = PCON; + if (!(wakeStatus & SWB_)) + { + PCON &= ~ (PMM_ | STOP_); + } + +#if ETH_IRQ_ENABLE + /* Ethernet wake up function */ + /* disable wake up interrupt */ + MDR = 0; + MCIR = MAC_STOP_PMM_INT_ENABLE_REG; + /* clear MAC status register */ + CLI_MacRd((ULONG)MAC_STOP_PMM_INT_STATUS_REG, &WakeStatus, 1); + STOE_Standby = 0; +#endif + +#if CAN_IRQ_ENABLE + /* CAN wake up function */ + CAN_WakeUpEvent(0); // 0 for exit power management mode +#endif +} +#endif + +#if WATCHDOG_IRQ_ENB +ax11000_WatchDogISR(void) __interrupt 12 +{ + if (EWDI) + { + if (EWT) + { + TA = 0xAA; + TA = 0x55; + WDIF = 0; // clear WatchDog Interrupt Flag. + WTRF = 0; // clear the Watchdog Timer Reset Flag. + RWT = 1; // reset watchdog timer. + } + else + { + TA = 0xAA; + TA = 0x55; + WDIF = 0; //clear WatchDog Interrupt Flag. + RWT = 1; // reset watchdog timer. + } + } +} +#endif diff --git a/Asixtool/asix-testcode/interrupt_ax110xx.h b/Asixtool/asix-testcode/interrupt_ax110xx.h new file mode 100644 index 0000000..e423a14 --- /dev/null +++ b/Asixtool/asix-testcode/interrupt_ax110xx.h @@ -0,0 +1,25 @@ +#ifndef INTERRUPT_AX110XX_H +#define INTERRUPT_AX110XX_H + +#define LBI_IRQ_ENABLE 0 // Local Bus IRQ; 1:On 2:Off +#define ETH_IRQ_ENABLE 0 // Ethernet IRQ; 1:On 2:Off +#define I2C_IRQ_ENABLE 0 // I2C IRQ; 1:On 2:Off +#define SPI_IRQ_ENABLE 0 // SPI IRQ; 1:On 2:Off +#define ONEWIRE_IRQ_ENABLE 0 // OneWire IRQ; 1:On 2:Off +#define CAN_IRQ_ENABLE 0 // CAN IRQ; 1:On 2:Off +#define HSUART_IRQ_ENABLE 0 // HS-Uart IRQ; 1:On 2:Off +#define BOOTLDR_IRQ 0 // Bootloader Source Code; 1:On 2:Off +#define POWER_MANAGEMENT_IRQ_ENABLE 0 // Power Management Wake-Up IRQ; 1:On 2:Off +#define WATCHDOG_IRQ_ENABLE 0 // Watchdog IRQ; 1:On 2:Off + +#define ON 1 +#define OFF 0 +#define EXTINT0(val) {EX0 = val;} +#define EXTINT1(val) {EX1 = val;} +#define EXTINT2(val) {EINT2 = val;} +#define EXTINT3(val) {EINT3 = val;} +#define EXTINT4(val) {EINT4 = val;} +#define EXTINT5(val) {EINT5 = val;} +#define EXTINT6(val) {EINT6 = val;} + +#endif diff --git a/Asixtool/asix-testcode/main.c b/Asixtool/asix-testcode/main.c new file mode 100644 index 0000000..932d5e1 --- /dev/null +++ b/Asixtool/asix-testcode/main.c @@ -0,0 +1,162 @@ +#include <8052.h> + +#include "ax110xx.h" +#include "interrupt_ax110xx.h" +#include "cpu_ax110xx.h" +#include "types_ax110xx.h" +#include "uart/uart.h" + +#define ERASE_EVENT 1 +#define WRITE_EVENT 2 +#define READ_EVENT 3 + +extern void ax11000_PeripherialISR(void) __interrupt 9; +#if UART0_ENABLE +extern void uart0_ISR(void) __interrupt 4 __using 2; +#endif +#if UART1_ENABLE +extern void uart1_ISR(void) __interrupt 6 __using 2; +#endif + + +volatile unsigned char hi_flag = 1; +volatile unsigned char timer = 0; +volatile unsigned char tstate = 0; + + +void timer0_irq_proc(void) __interrupt 1 using 2 +{ + timer++; + + if (timer == 0) + { + tstate = 1; + } + + switch(tstate) + { + case 1: + case 16: + P1_0 = 0; + break; + case 8: + case 24: + P1_0 = 1; + break; + default: break; + } + + if(tstate) + tstate++; + + TR0 = 0; /* Stop Timer 0 counting */ + TH0 = 0x00; + TL0 = 0x00; + TR0 = 1; /* Start counting again */ +} + +void pause(unsigned char len) +{ + unsigned char a; + unsigned int b; + a=len; + b=0xFFFF; + while(a--) + { + while(b--) + { + __asm + nop + __endasm; + } + } +} + +unsigned char _sdcc_external_startup() +{ + return 0; +} + +void putstring(char *string) +{ + unsigned char sc; + sc = 0; + while(string[sc] != 0) + putchar(string[sc++]); +} + +const char hval[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; + +void putHexB(unsigned char b) +{ + putchar(hval[b>>4]); + putchar(hval[b&0x0F]); +} + +void putHexW(unsigned int w) +{ + putHexB(w>>8); + putHexB(w&0xFF); +} + +void putHexD(unsigned long d) +{ + putHexW(d>>16); + putHexW(d&0xFFFF); +} + +void main(void) +{ + AX11000_Init(); + + switch (CSREPR & (BIT6|BIT7)) + { + case SCS_100M : + goto three; + break; + case SCS_50M : + goto two; + break; + case SCS_25M : + goto one; + break; + } + + goto none; + +three: + P1 = 0x00; + pause(0x07); + P1 = 0xFF; + pause(0x07); +two: + P1 = 0x00; + pause(0x07); + P1 = 0xFF; + pause(0x07); +one: + P1 = 0x00; + pause(0x07); + P1 = 0xFF; +none: + + TCON = 0; /* timer control register, byte operation */ + TH0 = 0x00; + TL0 = 0x00; + TR0 = 1; /* start timer0 */ + ET0 = 1; /* Enable Timer 0 overflow interrupt IE.1 */ + TI = 0; /* clear this out */ + + UART_SetPort(0); + + TMOD = (TMOD & 0xF0) | 0x01; /* timer control mode, byte operation */ + + EA = 1; /* Enable Interrupts */ + + while (1) + { + pause(0x0F); + + putstring("Hello World!\n\r"); + } +} diff --git a/Asixtool/asix-testcode/main.c.bak b/Asixtool/asix-testcode/main.c.bak new file mode 100644 index 0000000..5100add --- /dev/null +++ b/Asixtool/asix-testcode/main.c.bak @@ -0,0 +1,162 @@ +#include <8052.h> + +#include "ax110xx.h" +#include "interrupt_ax110xx.h" +#include "cpu_ax110xx.h" +#include "types_ax110xx.h" +#include "uart/uart.h" + +#define ERASE_EVENT 1 +#define WRITE_EVENT 2 +#define READ_EVENT 3 + +extern void ax11000_PeripherialISR(void) __interrupt 9; +#if UART0_ENABLE +extern void uart0_ISR(void) __interrupt 4 __using 2; +#endif +#if UART1_ENABLE +extern void uart1_ISR(void) __interrupt 6 __using 2; +#endif + + +volatile unsigned char hi_flag = 1; +volatile unsigned char timer = 0; +volatile unsigned char tstate = 0; + + +void timer0_irq_proc(void) __interrupt 1 using 2 +{ + timer++; + + if (timer == 0) + { + tstate = 1; + } + + switch(tstate) + { + case 1: + case 16: + P1_0 = 0; + break; + case 8: + case 24: + P1_0 = 1; + break; + default: break; + } + + if(tstate) + tstate++; + + TR0 = 0; /* Stop Timer 0 counting */ + TH0 = 0x00; + TL0 = 0x00; + TR0 = 1; /* Start counting again */ +} + +void pause(unsigned char len) +{ + unsigned char a; + unsigned int b; + a=len; + b=0xFFFF; + while(a--) + { + while(b--) + { + __asm + nop + __endasm; + } + } +} + +unsigned char _sdcc_external_startup() +{ + return 0; +} + +void putstring(char *string) +{ + unsigned char sc; + sc = 0; + while(string[sc] != 0) + putchar(string[sc++]); +} + +const char hval[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; + +void putHexB(unsigned char b) +{ + putchar(hval[b>>4]); + putchar(hval[b&0x0F]); +} + +void putHexW(unsigned int w) +{ + putHexB(w>>8); + putHexB(w&0xFF); +} + +void putHexD(unsigned long d) +{ + putHexW(d>>16); + putHexW(d&0xFFFF); +} + +void main(void) +{ + AX11000_Init(); + + switch (CSREPR & (BIT6|BIT7)) + { + case SCS_100M : + goto three; + break; + case SCS_50M : + goto two; + break; + case SCS_25M : + goto one; + break; + } + + goto none; + +three: + P1 = 0x00; + pause(0x07); + P1 = 0xFF; + pause(0x07); +two: + P1 = 0x00; + pause(0x07); + P1 = 0xFF; + pause(0x07); +one: + P1 = 0x00; + pause(0x07); + P1 = 0xFF; +none: + + TCON = 0; /* timer control register, byte operation */ + TH0 = 0x00; + TL0 = 0x00; + TR0 = 1; /* start timer0 */ + ET0 = 1; /* Enable Timer 0 overflow interrupt IE.1 */ + TI = 0; /* clear this out */ + + UART_SetPort(0); + + TMOD = (TMOD & 0xF0) | 0x01; /* timer control mode, byte operation */ + + EA = 1; /* Enable Interrupts */ + + while (1) + { + pause(0x0F); + + putstring("Hello betty World!\n\r"); + } +} diff --git a/Asixtool/asix-testcode/types_ax110xx.h b/Asixtool/asix-testcode/types_ax110xx.h new file mode 100644 index 0000000..fa1cbe5 --- /dev/null +++ b/Asixtool/asix-testcode/types_ax110xx.h @@ -0,0 +1,88 @@ +/* + ********************************************************************************* + * Copyright (c) 2005 ASIX Electronic Corporation All rights reserved. + * + * This is unpublished proprietary source code of ASIX Electronic Corporation + * + * The copyright notice above does not evidence any actual or intended + * publication of such source code. + ********************************************************************************* + */ +/*================================================================================ + * Module Name : types.h + * Purpose : Definition of type. + * Author : Robin Lee + * Date : 2005-12-28 + * Notes : None. + * $Log: types.h,v $ + * Revision 1.1 2006/04/07 11:36:17 robin6633 + * no message + * + *================================================================================ + */ + +#ifndef TYPES_H +#define TYPES_H + +#ifndef NULL + #define NULL ((void *) 0L) +#endif + +typedef unsigned short int BOOL; + +#define TRUE 1 +#define FALSE 0 + +/* Bit Definitions for Bitwise Operation */ +#define BIT0 0x00000001 +#define BIT1 0x00000002 +#define BIT2 0x00000004 +#define BIT3 0x00000008 +#define BIT4 0x00000010 +#define BIT5 0x00000020 +#define BIT6 0x00000040 +#define BIT7 0x00000080 +#define BIT8 0x00000100 +#define BIT9 0x00000200 +#define BIT10 0x00000400 +#define BIT11 0x00000800 +#define BIT12 0x00001000 +#define BIT13 0x00002000 +#define BIT14 0x00004000 +#define BIT15 0x00008000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 + +#define LOW_BYTE(word) (unsigned char)(word & 0x00FF) +#define HIGH_BYTE(word) (unsigned char)((word & 0xFF00) >> 8) + +/* Keil compiler user define */ +#define XDATA xdata +#define IDATA idata +#define BDATA bdata +#define CODE code +#define FAR far + +/* Serial interface command direction */ +#define SI_WR BIT0 +#define SI_RD BIT1 + +#define FLASH_WR_ENB (PCON |= PWE_) +#define FLASH_WR_DISB (PCON &= ~PWE_) + + +#endif /* end of TYPES_H */ diff --git a/Asixtool/asix-testcode/uart/uart.c b/Asixtool/asix-testcode/uart/uart.c new file mode 100644 index 0000000..613208f --- /dev/null +++ b/Asixtool/asix-testcode/uart/uart.c @@ -0,0 +1,821 @@ +/* + ********************************************************************************* + * Copyright (c) 2005 ASIX Electronic Corporation All rights reserved. + * + * This is unpublished proprietary source code of ASIX Electronic Corporation + * + * The copyright notice above does not evidence any actual or intended + * publication of such source code. + ********************************************************************************* + */ +/*================================================================================ + * Module Name : uart.c + * Purpose : The UART module driver. It manages the character + * buffer and handles the ISR. This driver includes UART0 and UART1. + * Author : Robin Lee + * Date : 2006-01-10 + * Notes : None. + * $Log: uart.c,v $ + * Revision 1.1 2006/04/07 11:39:14 robin6633 + * no message + * + *================================================================================ + */ + +/* INCLUDE FILE DECLARATIONS */ +#include "../ax110xx.h" +#include "uart.h" + + + +#if HSUR_ENABLE +#include "hsuart.h" +#endif + + +/* STATIC VARIABLE DECLARATIONS */ +#if UART0_ENABLE +static unsigned char uart0_TxBuf[MAX_TX_UART0_BUF_SIZE]; +static unsigned int uart0_TxHead = 0; +static unsigned int uart0_TxTail = 0; +static unsigned int uart0_TxCount = 0; +static unsigned char uart0_TxFlag = 0; +static unsigned char uart0_RxBuf[MAX_RX_UART0_BUF_SIZE]; +static unsigned int uart0_RxHead = 0; +static unsigned int uart0_RxTail = 0; +static unsigned char uart0_Mode = 0; +unsigned int uart0_RxCount = 0; +#endif + +#if UART1_ENABLE +static unsigned char uart1_TxBuf[MAX_TX_UART1_BUF_SIZE]; +static unsigned int uart1_TxHead = 0; +static unsigned int uart1_TxTail = 0; +static unsigned int uart1_TxCount = 0; +static unsigned char uart1_TxFlag = 0; +static unsigned char uart1_RxBuf[MAX_RX_UART1_BUF_SIZE]; +static unsigned int uart1_RxHead = 0; +static unsigned int uart1_RxTail = 0; +static unsigned char uart1_Mode = 0; +unsigned int uart1_RxCount = 0; +#endif +static unsigned char uartPort = 0; + + +/* LOCAL SUBPROGRAM DECLARATIONS */ +#if UART0_ENABLE +//void uart0_ISR(void); +static void uart0_Init(void); +static signed char uart0_PutChar(signed char c); +static signed char uart0_GetKey(void); +static signed char UART0_NoBlockGetkey(void); +#endif +#if UART1_ENABLE +//void uart1_ISR(void); +static void uart1_Init(void); +static signed char uart1_PutChar(signed char c); +static signed char uart1_GetKey(void); +static signed char uart1_NoBlockGetkey(void); +#endif + + + +/* LOCAL SUBPROGRAM BODIES */ +#if UART0_ENABLE +/* + * ---------------------------------------------------------------------------- + * static void UART0_ISR(void) + * Purpose : UART0 interrupt service routine. For sending out, it puts data + * from software buffer into hardware serial buffer register (SBUF0). + * For receiving, it gets data from hardware serial buffer register + * (SBUF0) and stores into software buffer. + * Params : none + * Returns : none + * Note : none + * ---------------------------------------------------------------------------- + */ +void uart0_ISR(void) __interrupt 4 __using 2 +{ + unsigned char parity = 0; + + if (RI0) + { + EA = 0; + if (uart0_RxCount != MAX_RX_UART0_BUF_SIZE) + { + uart0_RxBuf[uart0_RxHead] = SBUF0; + + if (uart0_Mode & BIT1) + { + parity = UART_ParityChk((unsigned char)uart0_RxBuf[uart0_RxHead]); + if (RB08 != parity) + P3 = 0xE7; + } + + uart0_RxCount++; + uart0_RxHead++; + uart0_RxHead &= MAX_RX_UART0_MASK; + } + RI0 = 0; + EA = 1; + } /* End of if(RI0) */ + + if (TI0) + { + EA = 0; + + uart0_TxTail++; + uart0_TxTail &= MAX_TX_UART0_MASK; + uart0_TxCount--; + if (uart0_TxCount > 0) + { + SBUF0 = uart0_TxBuf[uart0_TxTail]; + + if (uart0_Mode & BIT1) + { + parity = UART_ParityChk((unsigned char)uart0_TxBuf[uart0_TxTail]); + if (parity) + TB08 = 1; + else + TB08 = 0; + } + } + else + uart0_TxFlag = 0; + + TI0 = 0; + EA = 1; + + } /* End of if(TI0) */ + +} /* End of UART_Int */ + +/* + * ---------------------------------------------------------------------------- + * static void uart0_Init(void) + * Purpose : Setting operation mode of UART0 and initiating the global values. + * Params : none + * Returns : none + * Note : none + * ---------------------------------------------------------------------------- + */ +static void uart0_Init(void) +{ + unsigned char sysClk = 0; + unsigned int i; + + uart0_TxHead = 0; + uart0_TxTail = 0; + uart0_TxCount = 0; + uart0_TxFlag = 0; + uart0_RxHead = 0; + uart0_RxTail = 0; + uart0_RxCount = 0; + for (i=0 ; i 0) + { + SBUF1 = uart1_TxBuf[uart1_TxTail]; + + if (uart1_Mode & BIT1) + { + parity = UART_ParityChk((unsigned char)uart1_TxBuf[uart1_TxTail]); + if (parity) + TB18 = 1; + else + TB18 = 0; + } + } + else + uart1_TxFlag = 0; + + TI1 = 0; + EA = 1; + + } /* End of if(TI0) */ + +} + +/* + * ---------------------------------------------------------------------------- + * static void uart1_Init(void) + * Purpose : Setting operation mode of UART1 and initiating the global values. + * Params : none + * Returns : none + * Note : none + * ---------------------------------------------------------------------------- + */ +static void uart1_Init(void) +{ + unsigned char sysClk = 0; + unsigned int i; + + uart1_TxHead = 0; + uart1_TxTail = 0; + uart1_TxCount = 0; + uart1_TxFlag = 0; + uart1_RxHead = 0; + uart1_RxTail = 0; + uart1_RxCount = 0; + for (i=0 ; i ++ ++ * src/ds390/main.c: added ax110xx target to ds390 (option --use-asix) ++ * src/SDCCglobl.h: added ax110xx target to ds390 (option --use-asix) ++ + 2007-11-17 Raphael Neider + + * src/pic/main.c (_asmCmd): include debug arguments (-g as $3) +diff -crB sdcc/src/ds390/main.c sdcc-asix/src/ds390/main.c +*** sdcc/src/ds390/main.c 2007-06-18 20:24:42.000000000 +0200 +--- sdcc-asix/src/ds390/main.c 2007-11-30 05:12:58.453530081 +0100 +*************** +*** 21,26 **** +--- 21,27 ---- + #define OPTION_STACK_8BIT "--stack-8bit" + #define OPTION_FLAT24_MODEL "--model-flat24" + #define OPTION_STACK_SIZE "--stack-size" ++ #define OPTION_USE_ASIX "--use-asix" + + static OPTION _ds390_options[] = + { +*************** +*** 33,38 **** +--- 34,40 ---- + { 0, "--use-accelerator", &options.useAccelerator, "generate code for ds390 arithmetic accelerator"}, + { 0, "--protect-sp-update", &options.protect_sp_update, "will disable interrupts during ESP:SP updates"}, + { 0, "--parms-in-bank1", &options.parms_in_bank1, "use Bank1 for parameter passing"}, ++ { 0, OPTION_USE_ASIX, &options.use_asix, "generate code for the asix chip" }, + { 0, NULL } + }; + +*************** +*** 253,258 **** +--- 255,265 ---- + fputs ("ma\t=\t0xD3\n", of); + fputs ("mb\t=\t0xD4\n", of); + fputs ("mc\t=\t0xD5\n", of); ++ if(options.use_asix) ++ { ++ fputs ("ta\t=\t0xEB\n", of); ++ fputs ("acon\t=\t0x9D\n", of); ++ } + fputs ("F1\t=\t0xD1\t; user flag\n", of); + if (options.parms_in_bank1) { + int i ; +*************** +*** 290,295 **** +--- 297,311 ---- + return TRUE; + } + ++ if(options.use_asix) ++ { ++ fprintf (stderr, ++ "*** warning: targeting for asix\n"); ++ dbuf_printf (oBuf, ".flat24 off\n"); ++ dbuf_printf (oBuf, "\tljmp\t__reset_vect\n"); ++ dbuf_printf (oBuf, ".flat24 on\n"); ++ } ++ else + dbuf_printf (oBuf, "\tajmp\t__reset_vect\n"); + + /* now for the other interrupts */ +*************** +*** 305,310 **** +--- 321,336 ---- + } + } + ++ if(options.use_asix) ++ { ++ dbuf_printf (oBuf, ".flat24 off\n"); ++ dbuf_printf (oBuf, "__reset_vect:\n"); ++ dbuf_printf (oBuf, "\tmov ta,#0xAA\n"); ++ dbuf_printf (oBuf, "\tmov ta,#0x55\n"); ++ dbuf_printf (oBuf, "\tmov acon,#0x02\n"); ++ dbuf_printf (oBuf, ".flat24 on\n"); ++ } ++ else + dbuf_printf (oBuf, "__reset_vect:\n\tljmp\t__sdcc_gsinit_startup\n"); + + return TRUE; +diff -crB sdcc/src/SDCCglobl.h sdcc-asix/src/SDCCglobl.h +*** sdcc/src/SDCCglobl.h 2007-07-27 22:23:22.000000000 +0200 +--- sdcc-asix/src/SDCCglobl.h 2007-11-30 05:06:54.000000000 +0100 +*************** +*** 291,296 **** +--- 291,297 ---- + int unsigned_char; /* use unsigned for char without signed/unsigned modifier */ + char *code_seg; /* segment name to use instead of CSEG */ + char *const_seg; /* segment name to use instead of CONST */ ++ bool use_asix; /* since xram_size=0 is a possibility */ + /* sets */ + set *calleeSavesSet; /* list of functions using callee save */ + set *excludeRegsSet; /* registers excluded from saving */ + + diff --git a/Asixtool/trunk/Kopie von Makefile b/Asixtool/trunk/Kopie von Makefile new file mode 100644 index 0000000..ae1b8bd --- /dev/null +++ b/Asixtool/trunk/Kopie von Makefile @@ -0,0 +1,37 @@ +############################################################### +##### +##### Makefile for asixtool +##### +############################################################### + +############################################################### +##### +##### PATHS (default installation) +##### +############################################################### + +INSTALLDIR_BIN=/usr/local/bin + +-include Makefile.local + +BASE = D:\Programmieren\Cygwin +INCLUDEPATH = $(BASE)\usr\include +##LIBPATH = $(BASE)\lib\gcc\i686-pc-cygwin\3.4.4\include + +############################################################### +##### +##### Do the whole shabang +##### +############################################################### + +all: asixtool + +asixtool: asix_serial.c asix_serial.h bootcom.c bootcom.h infohelper.h infohelper.c main.c + $(BASE)/bin/gcc.exe -Os -Wall asix_serial.c bootcom.c infohelper.c main.c -o asixtool + strip asixtool + + +clean: + $(RM) *.o *~ asixtool + +### EOF diff --git a/Asixtool/trunk/LICENSE b/Asixtool/trunk/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/Asixtool/trunk/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Asixtool/trunk/Makefile b/Asixtool/trunk/Makefile new file mode 100644 index 0000000..acbb881 --- /dev/null +++ b/Asixtool/trunk/Makefile @@ -0,0 +1,33 @@ +############################################################### +##### +##### Makefile for asixtool +##### +############################################################### + +############################################################### +##### +##### PATHS (default installation) +##### +############################################################### + +INSTALLDIR_BIN=/usr/local/bin + +-include Makefile.local + +############################################################### +##### +##### Do the whole shabang +##### +############################################################### + +all: asixtool + +asixtool: asix_serial.c asix_serial.h bootcom.c bootcom.h infohelper.h infohelper.c main.c + gcc -Os -Wall asix_serial.c bootcom.c infohelper.c main.c -o asixtool + strip asixtool + + +clean: + $(RM) *.o *~ asixtool + +### EOF diff --git a/Asixtool/trunk/asix_serial.c b/Asixtool/trunk/asix_serial.c new file mode 100644 index 0000000..05e30f0 --- /dev/null +++ b/Asixtool/trunk/asix_serial.c @@ -0,0 +1,237 @@ +/* + asix-serial.c - serial port routines (host) to access the asix chip + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "asix_serial.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "infohelper.h" + +#define MAX(x,y) ((x) > (y) ? (x) : (y)) +#define MIN(x,y) ((x) < (y) ? (x) : (y)) + +static int serialDev = -1; +static struct termios term; + +void setBaud(unsigned int baud) +{ + // change baudrate + switch(baud) + { + case 921600: + cfsetispeed(&term,B921600); + cfsetospeed(&term,B921600); + break; + default: + cfsetispeed(&term,B115200); + cfsetospeed(&term,B115200); + break; + } +} + +void setFlow(unsigned char flow) +{ + if(flow == 0) + { + term.c_iflag&=~(IXON|IXOFF|IXANY|INLCR|ICRNL); + } + else + { + term.c_iflag&=~(INLCR|ICRNL|IXANY); + term.c_iflag|=(IXON|IXOFF); + } +} + +void setTimeout(unsigned int tout) +{ + term.c_cc[VMIN]=0; + term.c_cc[VTIME]=tout; // 10 seconds timeout +} + +int openSerial(char *dev, unsigned int speed) +{ + + serialDev=open(dev,O_RDWR); + if(serialDev<0) { + printf("cannot acces %s\n",dev); + return serialDev; + } + + setDTR(0); + setRTS(0); + + tcgetattr(serialDev,&term); + + setBaud(speed); + + term.c_cflag = (term.c_cflag & ~CSIZE) | CS8 | PARENB; + term.c_cflag |= CLOCAL | CREAD; + + term.c_cflag &= ~CSTOPB; + term.c_iflag=IGNBRK; + + term.c_iflag |= IXON | IXOFF; + + term.c_lflag=0; + + term.c_oflag=0; + + + setTimeout(2); + + setFlow(0); + + if (tcsetattr(serialDev, TCSANOW, &term)!=0) + return printError("setattr stage 1 failed"); + + + if (tcgetattr(serialDev, &term)!=0) + return printError("getattr failed"); + + + term.c_cflag &= ~CRTSCTS; + + if (tcsetattr(serialDev, TCSANOW, &term)!=0) + return printError("setattr stage 2 failed"); + + return serialDev; +} + +int closeSerial(void) +{ + if(serialDev) + { + tcflush(serialDev, TCIOFLUSH); + close(serialDev); + return 0; + } + else + return serialDev; +} + +int reconfSerial(unsigned int baud, unsigned char flow, unsigned char tout) +{ + if(serialDev > 0) + { + + setBaud(baud); + setFlow(flow); + setTimeout(tout); + return tcsetattr(serialDev,TCSANOW,&term); + } + else + return serialDev; +} + +#define XFERSIZE 16 + +int sendBuf(unsigned int len, char *buf) +{ + unsigned int boff; + int ret; + + if(serialDev > 0) + { + boff = 0; + while (boff < len) + { + ret = write (serialDev, buf+boff, MIN (len - boff, XFERSIZE)); + if (ret < 0 && errno != EAGAIN) + { + perror ("error writing to serial port"); + return 0; + } + boff += ret; + } + return boff; + } + return 0; +} + +int sendBufE(unsigned int len, char *buf) +{ + return(getBuf(sendBuf(len,buf), buf)); +} + +int getBuf(unsigned int len, char *buf) +{ + unsigned int boff; + int ret; + + if(serialDev > 0) + { + boff = 0; + ret = read (serialDev, buf+boff, MIN (len - boff, XFERSIZE)); + if (ret < 0 && errno != EAGAIN) + { + perror ("error reading from serial port"); + return 0; + } + boff += ret; + return boff; + } + return 0; +} + +void setDTR(unsigned char val) +{ + int mcs; + if(serialDev) + { + ioctl (serialDev, TIOCMGET, &mcs); + if(val) + { + mcs |= TIOCM_DTR; + ioctl (serialDev, TIOCMSET, &mcs); + } + else + { + mcs &= ~TIOCM_DTR; + ioctl (serialDev, TIOCMSET, &mcs); + } + } +} + +void setRTS(unsigned char val) +{ + int mcs; + if(serialDev) + { + ioctl (serialDev, TIOCMGET, &mcs); + if(val) + { + mcs |= TIOCM_RTS; + ioctl (serialDev, TIOCMSET, &mcs); + } + else + { + mcs &= ~TIOCM_RTS; + ioctl (serialDev, TIOCMSET, &mcs); + } + } +} + diff --git a/Asixtool/trunk/asix_serial.h b/Asixtool/trunk/asix_serial.h new file mode 100644 index 0000000..fa12144 --- /dev/null +++ b/Asixtool/trunk/asix_serial.h @@ -0,0 +1,30 @@ +/* + asix-serial.h - serial port routines (host) to access the asix chip + Copyright (C) 2007 Ch. Klippel + + 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 3 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 ASIX_SERIAL_H +#define ASIX_DERIAL_H + +int openSerial(char *dev, unsigned int speed); +int closeSerial(void); +int reconfSerial(unsigned int baud, unsigned char flow, unsigned char tout); +int sendBuf(unsigned int len, char *buf); +int getBuf(unsigned int len, char *buf); +void setDTR(unsigned char val); +void setRTS(unsigned char val); + +#endif diff --git a/Asixtool/trunk/bootcom.c b/Asixtool/trunk/bootcom.c new file mode 100644 index 0000000..9ac2d35 --- /dev/null +++ b/Asixtool/trunk/bootcom.c @@ -0,0 +1,389 @@ +/* + bootcom.c - com routines for the asix on.chip bootloader + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "bootcom.h" +#include "stdio.h" +#include "asix_serial.h" +#include "infohelper.h" +#include "fcntl.h" +#include "unistd.h" + +#define MAXSECT 11 + +extern char verbosity; +char buf[5]; +char fbuf[0x080000]; +int do_erase; + +unsigned int sectors[MAXSECT+1] = { + 0x00000, + 0x04000, + 0x06000, + 0x08000, + 0x10000, + 0x20000, + 0x30000, + 0x40000, + 0x50000, + 0x60000, + 0x70000, + 0x80000 +}; + +int findSect(unsigned long adr) +{ + int secnum = 0; + while((sectors[secnum] < adr) && (secnum < MAXSECT)) + { + secnum++; + } + + if(sectors[secnum] > adr) + return secnum-1; + else + return secnum; +} + + +void dumpBuf() +{ + printf("%02X %02X %02X %02X %02X\n",(unsigned char)buf[0],(unsigned char)buf[1],(unsigned char)buf[2],(unsigned char)buf[3],(unsigned char)buf[4]); +} + +void sendCMD(unsigned char a, unsigned char b, unsigned char c, unsigned char d, unsigned char e) +{ + buf[0] = a; + buf[1] = b; + buf[2] = c; + buf[3] = d; + buf[4] = e; + sendBuf(5, buf); +} +int setAccessTime(unsigned char val) +{ + sendCMD(0x81, 0x00, 0x00, 0x00, val); + getBuf(1, buf); + + if(buf[0] == val) + return 1; + + return 0; +} + +int setIntervallTime(unsigned char val) +{ + sendCMD(0x82, 0x00, 0x00, 0x00, val); + getBuf(1, buf); + + if(buf[0] == val) + return 1; + + return 0; +} + +int readFlash(char *name, unsigned int start, unsigned int len) +{ + FILE *outfile; + unsigned int ret, count, cdone; + unsigned char rollover = 0; + + outfile = fopen(name,"w"); + + sendCMD(0x00, 0x00, 0x00, 0x00, 0x00); + ret = getBuf(5, buf); + cdone = 0; + count = start+len; + + printInfoH(1, "bytes to read: ",len); + + for(;start> 8, (start & 0xFF0000) >> 16, 0x00); + + ret = getBuf(1, buf); + + if(ret == 1) + { + fprintf(outfile, "%c",(unsigned char)buf[0]); + fflush(outfile); + } + else + { + printf("FAIL: %02i - %06X - %02X\n",ret, start, (unsigned char) buf[0]); + fprintf(outfile, "%c",(unsigned char)buf[0]); + fflush(outfile); + } + + cdone++; + + if(rollover == 0) + printProgress(0, "reading", cdone, len); + + rollover++; + rollover &= 0x3F; + } + printProgress(0, "reading", cdone, len); + fclose(outfile); + return 1; +} + +void resetFlash(unsigned int start) +{ + sendCMD(0x80, 0x33, 0x03, (start & 0xFF0000) >> 16, 0xF0); + getBuf(1, buf); +} + +void closeWrite(unsigned int start) +{ + sendCMD(0x80, 0x33, 0x03, (start & 0xFF0000) >> 16, 0x90); + getBuf(1, buf); + resetFlash(start); +} + +int eraseFlash(unsigned int adr) +{ + + unsigned char base = (adr & 0xFF0000) >> 16; + + printInfoH(1, "erasing flash at ", adr & 0x00FF0000); + + sendCMD(0x80, 0x55, 0x05, base, 0xAA); + if(!getBuf(1, buf)) + { + goto bailOut; + } + + sendCMD(0x80, 0xAA, 0x02, base, 0x55); + if(!getBuf(1, buf)) + { + goto bailOut; + } + + sendCMD(0x80, 0x55, 0x05, base, 0x80); + if(!getBuf(1, buf)) + { + goto bailOut; + } + + sendCMD(0x80, 0x55, 0x05, base, 0xAA); + if(!getBuf(1, buf)) + { + goto bailOut; + } + + sendCMD(0x80, 0xAA, 0x02, base, 0x55); + if(!getBuf(1, buf)) + { + goto bailOut; + } + + sendCMD(0x80, 0x55, 0x05, base, 0x10); + if(!getBuf(1, buf)) + { + goto bailOut; + } + +waitErase: + sendCMD(0x00, 0x00, 0x00, base, 0x00); + if(!getBuf(1, buf)) + { + goto bailOut1; + } + if(buf[0] == 0x0A || buf[0] == 0x4E) + goto waitErase; + if((unsigned char)buf[0] != 0xFF) + goto bailOut2; + + printInfoS(1, "successfully erased flash", 0); + resetFlash(adr); + return 1; + +bailOut: + return printError("cant issue chip erase sequence, aborting!"); +bailOut1: + return printError("no response during chip erase active, aborting"); +bailOut2: + return printError("cant erase chip, aborting"); +} + + +int eraseSector(unsigned int adr) +{ + + unsigned char baseH = (adr & 0xFF0000) >> 16; + unsigned char baseM = (adr & 0xFF00) >> 8; + unsigned char baseL = adr & 0xFF; + + printInfoH(1, "erasing sector at ", adr); + + sendCMD(0x80, 0x55, 0x05, 0x00, 0xAA); + if(!getBuf(1, buf)) + { + goto bailOut; + } + + sendCMD(0x80, 0xAA, 0x02, 0x00, 0x55); + if(!getBuf(1, buf)) + { + goto bailOut; + } + + sendCMD(0x80, 0x55, 0x05, 0x00, 0x80); + if(!getBuf(1, buf)) + { + goto bailOut; + } + + sendCMD(0x80, 0x55, 0x05, 0x00, 0xAA); + if(!getBuf(1, buf)) + { + goto bailOut; + } + + sendCMD(0x80, 0xAA, 0x02, 0x00, 0x55); + if(!getBuf(1, buf)) + { + goto bailOut; + } + + sendCMD(0x80, baseL, baseM, baseH, 0x30); + if(!getBuf(1, buf)) + { + goto bailOut; + } + +waitErase: + sendCMD(0x00, baseL, baseM, baseH, 0x00); + if(!getBuf(1, buf)) + { + goto bailOut1; + } + + if(buf[0] == 0x0A || buf[0] == 0x4E) + goto waitErase; + + + + if((unsigned char)buf[0] != 0xFF) + goto bailOut2; + + printInfoS(1, "successfully erased sector",0); + resetFlash(adr); + return 1; + +bailOut: + return printError("cant issue sector erase sequence"); +bailOut1: + return printError("no response during secttor erase active"); +bailOut2: + return printError("cant erase sector"); +} + + +unsigned int writeFlash(char *name, unsigned int start, unsigned int len) +{ + int infile, flen; + unsigned int ret, count, cdone; + unsigned char rollover = 0; + + sendCMD(0x00, 0x00, 0x00, 0x00, 0x00); + ret = getBuf(1, buf); + + infile = open(name,O_RDONLY); + flen = read(infile, fbuf, 0x80000); + + if(flen < len) + { + printInfoH(1, "adjusting number of bytes to ",flen); + len = flen; + } + + cdone = 0; + count = start+len; + + if(do_erase) + { + unsigned char startsec, endsec; + startsec = findSect(start); + endsec = findSect(start+len-1); +nextsect: + if(!eraseSector(sectors[startsec])) + { + return(printError("error at auto-erase")); + } + if(startsec != endsec) + { + startsec++; + goto nextsect; + } + } + + printInfoH(1, "bytes to write: ",len); + +retry: + + sendCMD(0x80, 0x55, 0x05, (start & 0xFF0000) >> 16, 0xAA); + ret = getBuf(1, buf); + + sendCMD(0x80, 0xAA, 0x02, (start & 0xFF0000) >> 16, 0x55); + ret = getBuf(1, buf); + + sendCMD(0x80, 0x55, 0x05, (start & 0xFF0000) >> 16, 0x20); + ret = getBuf(1, buf); + + for(;start> 16, 0xA0); + ret = getBuf(1, buf); + + sendCMD(0xC0, start & 0xFF, (start & 0xFF00) >> 8, (start & 0xFF0000) >> 16, (unsigned char) fbuf[cdone]); + ret = getBuf(2, buf); + + if(ret == 1) + { + sleep(1); + closeWrite(start); + printf("\nretrying\n"); + goto retry; + } + + if((ret != 2)) + { + closeWrite(start); + return printError("error during write: short response"); + } + + if((unsigned char)fbuf[cdone] != (unsigned char)buf[1]) + { + closeWrite(start); + return printError("error during write: data mismatch"); + } + + cdone++; + + if(rollover == 0) + printProgress(0, "writing", cdone, len); + + rollover++; + rollover &= 0x3F; + } + printProgress(0, "writing", cdone, len); + closeWrite(start); + close(infile); + return len; +} diff --git a/Asixtool/trunk/bootcom.h b/Asixtool/trunk/bootcom.h new file mode 100644 index 0000000..e5910ce --- /dev/null +++ b/Asixtool/trunk/bootcom.h @@ -0,0 +1,28 @@ +/* + bootcom.h - com routines for the asix on.chip bootloader + Copyright (C) 2007 Ch. Klippel + + 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 3 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 BOOTCOM_H +#define BOOTCOM_H + +int readFlash(char *name, unsigned int start, unsigned int len); +unsigned int writeFlash(char *name, unsigned int start, unsigned int len); +int eraseFlash(unsigned int adr); +int eraseSector(unsigned int adr); + + +#endif diff --git a/Asixtool/trunk/infohelper.c b/Asixtool/trunk/infohelper.c new file mode 100644 index 0000000..f1a2cb8 --- /dev/null +++ b/Asixtool/trunk/infohelper.c @@ -0,0 +1,97 @@ +/* + infohelper.c - info-display routines (host) + Copyright (C) 2007 Ch. Klippel + + 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 3 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 + +#include "infohelper.h" + +char verbosity; + +int printError(char *err) +{ + printf("ERROR: %s\n",err); + return 0; +} + +int printErrorS(char *err, char *xtra) +{ + if(xtra) + printf("ERROR: %s %s\n", err, xtra); + else + printf("ERROR: %s\n", err); + return 0; +} + +int printInfoS(unsigned char level, char *msg, char *xtra) +{ + if(level <= verbosity) + { + if(xtra) + printf("Info : %s %s\n", msg, xtra); + else + printf("Info : %s\n", msg); + return 1; + } + return 0; +} + +int printInfoH(unsigned char level, char *msg, unsigned int val) +{ + if(level <= verbosity) + { + printf("Info : %s 0x%08X\n", msg, val); + return 1; + } + return 0; +} + +const char heartbeat[] = { ".oOo" }; + +int printProgress(unsigned char level, char *msg, float cval, float maxval) +{ + unsigned int cur, cnt; + + static int beat = 0; + + if(level <= verbosity) + { + cur = (35 / maxval) * cval; + + cnt = 35-cur; + + printf("Progress: ["); + + while(cur--) + printf("*"); + + if(cnt) + printf("%c",heartbeat[beat]); + else + printf("*"); + + while(cnt--) + printf(" "); + + printf("\b]\r"); + fflush(stdout); + beat++; + beat &= 0x03; + } + return 0; +} + diff --git a/Asixtool/trunk/infohelper.h b/Asixtool/trunk/infohelper.h new file mode 100644 index 0000000..f5ed4ab --- /dev/null +++ b/Asixtool/trunk/infohelper.h @@ -0,0 +1,30 @@ +/* + infohelper.h - info-display routines (host) + Copyright (C) 2007 Ch. Klippel + + 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 3 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 TOOL_INFOHELPER +#define TOOL_INFOHELPER + +extern char verbosity; + +int printError(char *err); +int printErrorS(char *err, char *xtra); +int printInfoS(unsigned char level, char *msg, char *xtra); +int printInfoH(unsigned char level, char *msg, unsigned int val); +int printProgress(unsigned char level, char *msg, float cval, float maxval); + +#endif diff --git a/Asixtool/trunk/main.c b/Asixtool/trunk/main.c new file mode 100644 index 0000000..eb5c8b2 --- /dev/null +++ b/Asixtool/trunk/main.c @@ -0,0 +1,312 @@ +/* + main.c - main program + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "stdio.h" +#include "asix_serial.h" +#include "infohelper.h" +#include "fcntl.h" +#include "unistd.h" +#include +#include "bootcom.h" + +#define VERSION_MAJOR 0 +#define VERSION_MINOR 1 + +extern char verbosity; +extern int do_erase; + +unsigned long radr, f0adr, f0len; + +void printHeader(void) +{ + printf("\nasixtool V%i.%i\n\n", VERSION_MAJOR, VERSION_MINOR); + printf("This Software is free Software under GNU GPL 3 or later\n"); + printf("(c) 2007 Ch. Klippel \n\n"); +} + +void printUsage(void) +{ + printf("usage: asixtool [-d NAME] [-a [NAME] [-A ADRDESS]] [-e] [-S] [-c] [-N]\n\n"); + printf(" -d NAME specify serial device, default is /dev/ttyS0\n"); + printf(" -r NAME specify file to read flash into, default is flash_dump.bin\n"); + printf(" -a NAME specify file to write to flash, default is flash.bin\n"); + printf(" -A ADDRESS optionally specifies the start-address to load into/read from flash\n"); + printf(" default is 0x000000 - must be specified in hex\n"); + printf(" -L ADDRESS optionally specifies the maximum number of bytes to load into/read from flash\n"); + printf(" default is 0x080000 - must be specified in hex\n"); + printf(" -e completely erase the flash before writing\n"); + printf(" default is no erase\n"); + printf(" -s erase flash sectors as needed.\n"); + printf(" this is a lot faster if only a few sectors are used\n"); + printf(" -? print this help\n"); + printf("\n"); + printf("ATTENTION: commands are order-sensitive! for example, to set an address, you MUST\n"); + printf("specify the address with -A before you specify any of the -r or -w commands. this\n"); + printf("allows you to upload serveral binary files to serveral places with one command.\n"); +} + +unsigned long parseHex(char *buf) +{ + unsigned char cnt; + unsigned long adr; + + cnt = 0; + adr = 0; + + while(buf[cnt]) + { + adr <<= 4; + if(buf[cnt] >= '0' && buf[cnt] <= '9') + { + adr += (buf[cnt] - '0'); + } + else if(buf[cnt] >= 'A' && buf[cnt] <= 'F') + { + adr += (buf[cnt] - 'A' + 10); + } + else if(buf[cnt] >= 'a' && buf[cnt] <= 'f') + { + adr += (buf[cnt] - 'a' + 10); + } + else if(buf[cnt] == 'x' || buf[cnt] == 'X') + { + adr = 0; + } + else + { + } + cnt++; + } + return adr; +} + +int main(int argc,char **argv) +{ + char sname[256]; + char rname[256]; + char f0name[256]; + int isOpen; + int numw; + + unsigned int baud; + + unsigned char i, cmd; + + baud = 115200; + do_erase = 0; + numw = 0; + isOpen = 0; + sprintf(sname,"/dev/ttyS0"); + sprintf(rname,"flash_dump.bin"); + sprintf(f0name,"flash.bin"); + + f0adr = 0x000000; + f0len = 0x080000; + + printHeader(); + verbosity = 1; + + if(argc <= 1) + goto bailout; + +rescan: + for(i=1;i i+1) && (argv[i+1][0] != '-')) + { + strncpy(sname,argv[++i],256); + printInfoS(1,"opening serial device",sname); + if(isOpen) + { + if(closeSerial() == 0) + { + isOpen = 0; + } + else + { + printError("cant close port"); + return 0; + } + } + if(openSerial(sname, baud)) + { + isOpen = 1; + } + else + { + printError("cant open port"); + return 0; + } + } + else + { + printError("Error in device argument"); + goto bailout; + } + break; + } + } + else + { + switch(cmd) + { + case 'd': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + strncpy(sname,argv[++i],256); + printInfoS(1,"closing serial device",sname); + if(closeSerial() == 0) + { + isOpen = 0; + } + else + { + printError("cant close port"); + return 0; + } + printInfoS(1,"opening serial device",sname); + if(openSerial(sname, baud)) + { + isOpen = 1; + } + else + { + printError("cant open port"); + return 0; + } + } + else + { + printError("Error in device argument"); + goto bailout; + } + break; + case 'r': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + strncpy(rname,argv[++i],256); + } + printInfoS(1,"reading flash image",rname); + numw = readFlash(rname, f0adr, f0len); + if(numw) + { + printInfoS(1, "done reading memory ",0); + } + else + { + printErrorS("Error in reading memory-image",rname); + return 0; + } + break; + case 'a': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + strncpy(f0name,argv[++i],256); + } + printInfoS(1,"writing flash image",f0name); + numw = writeFlash(f0name, f0adr, f0len); + if(numw) + { + printInfoS(1, "done writing memory ",0); + f0len = numw; + } + else + { + printErrorS("Error in writing memory-image",f0name); + return 0; + } + break; + case 'A': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + f0adr = parseHex(argv[++i]); + printInfoH(1,"setting address for flash @",f0adr); + } + else + printInfoH(1,"used -A but no address given, using default",f0adr); + f0len = 0x080000; + break; + case 'L': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + f0len = parseHex(argv[++i]); + printInfoH(1,"setting length for flash @",f0len); + } + else + printInfoH(1,"used -L but no address given, using default",f0len); + break; + case 'e': + printInfoS(1,"erasing flash before write",0); + if(!eraseFlash(f0adr)) + { + printError("cant erase flash"); + return 0; + } + + break; + case 's': + printInfoS(1,"erasing sectors as needed",0); + do_erase = 1; + break; + } + } + } + else + { +bailout: + printUsage(); + return 0; + } + } + + if((isOpen == 0) && (argc > 1)) + { + printInfoS(1,"using serial device",sname); + if(openSerial(sname, baud)) + { + isOpen = 1; + goto rescan; + } + } + else if(isOpen != 0) + { + printInfoS(1,"closing serial device",sname); + closeSerial(); + } + + return 1; +} diff --git a/betty_TAE/MSP430/trunk/Makefile b/betty_TAE/MSP430/trunk/Makefile new file mode 100644 index 0000000..3e2f76a --- /dev/null +++ b/betty_TAE/MSP430/trunk/Makefile @@ -0,0 +1,72 @@ +# makfile configuration +NAME = TAE_MSP +CSOURCES = cc1100.c hardware.c main.c rf.c +#~ ASOURCES = +CPU = msp430f1121 +CPU_CLOCK = 4500000 +COMPORT = /dev/ttyUSB2 +GDBPORT = 3333 +BSLOPT = --invert-reset --comport=${COMPORT} + +ASFLAGS = -mmcu=${CPU} -D_GNU_ASSEMBLER_ -I . +CFLAGS = -mmcu=${CPU} -Os -Wall -g --std=gnu99 -I . -D F_CPU=${CPU_CLOCK} -D HAS_CONFIG_H +#LDFLAGS = -lmspgcc + +#switch the compiler (for the internal make rules) +CC = msp430-gcc +AS = msp430-gcc + +OBJECTS = ${CSOURCES:.c=.o} ${ASOURCES:.S=.o} + + +.PHONY: all FORCE clean download download-jtag download-bsl + +#all should be the first target. it's built when make is run without args +all: ${NAME}.elf ${NAME}.a43 ${NAME}.lst dependencies.d + +#confgigure the next line if you want to use the serial download +program: download-jtag +#~ download: download-bsl + +#additional rules for files +${NAME}.elf: ${OBJECTS} + ${CC} -mmcu=${CPU} -o $@ ${OBJECTS} $(LDFLAGS) + +${NAME}.a43: ${NAME}.elf + msp430-objcopy -O ihex $^ $@ + +${NAME}.lst: ${NAME}.elf +# non uniarch msp430-objdump -dSt --size-sort $^ >$@ + msp430-objdump -dSt $^ >$@ + @echo "----- RAM/Flash Usage -----" + msp430-size $^ + msp430-nm --size-sort $^ + +download-jtag: all +# mspdebug rf2500 "prog ${NAME}.elf" + mspdebug -d ${COMPORT} uif -j "prog ${NAME}.elf" +# msp430-jtag -e ${NAME}.elf + +download-bsl: all + msp430-bsl $(BSLOPT) -e ${NAME}.elf + +debug: all +# mspdebug rf2500 "prog ${NAME}.elf" "setbreak main" run "gdb ${GDBPORT}" +# mspdebug -d ${COMPORT} uif -j "prog ${NAME}.elf" reset "gdb ${GDBPORT}" + mspdebug -d ${COMPORT} uif -j "prog ${NAME}.elf" "setbreak main" run "delbreak 0" "gdb ${GDBPORT}" + +clean: + rm -f ${NAME}.elf ${NAME}.a43 ${NAME}.lst ${OBJECTS} dependencies.d + +#dummy target as dependecy if something has to be build everytime +FORCE: + +#project dependencies +dependencies.d: + $(CC) -MM ${CFLAGS} ${CSOURCES} > dependencies.d +ifdef ASOURCES + $(CC) -MM ${ASFLAGS} ${ASOURCES} >> dependencies.d +endif + +-include dependencies.d + diff --git a/betty_TAE/MSP430/trunk/cc1100.c b/betty_TAE/MSP430/trunk/cc1100.c new file mode 100644 index 0000000..9fb9ca7 --- /dev/null +++ b/betty_TAE/MSP430/trunk/cc1100.c @@ -0,0 +1,158 @@ +/* + cc1100.c + Copyright (C) 2009 + + 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 3 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 "cc1100.h" +#include "hardware.h" +#include +//#include +//#include +//#include + +unsigned char WORsend; +unsigned char cc1100Addr; + +const unsigned char conf[0x2f] = { + +0x29 , 0x06 , 0x06 , 0x47 , 0xD3 , 0x91 , 0x3E , 0x1A , +0x45 , cc1100_addr , cc1100_chan , 0x06 , 0x00 , 0x10 , 0x0B , 0xDA , +0x8A , 0x75 , 0x13 , 0x22 , 0xC1 , 0x35 , 0x07 , 0x0C , +0x18 , 0x16 , 0x6C , 0x43 , 0x40 , 0x91 , 0x46 , 0x50 , +0x78 , 0x56 , 0x10 , 0xA9 , 0x0A , 0x00 , 0x11 , 0x41 , +0x00 , 0x57 , 0x7F , 0x3F , 0x98 , 0x31 , 0x0B +}; + + +void CC1100_Select(void) { + P1OUT &= ~CC_CS; + while (P1IN & CC_MISO); +} + +void CC1100_DeSelect(void) { + P1OUT |= CC_CS; +} + +void cc1100_init(void) { + + unsigned char i; + + P1OUT = (P1OUT & ~CC_MOSI) | (CC_CS | CC_SCLK); + P1DIR |= CC_CS; + P1OUT &= ~CC_CS; + delay(40); + + P1OUT |= CC_CS; + delay(240); + + CC1100_Select(); + + spi_rw(SRES); + while (P1IN & CC_MISO); + + spi_rw(0x00 | BURST); + for (i=0; i < 0x2f; i++) + spi_rw(conf[i]); + CC1100_DeSelect(); + + cc1100Addr = conf[0x09]; + WORsend=0; +} + +unsigned char cc1100_write(unsigned char addr,unsigned char* dat, unsigned char lenght) { + + unsigned char i; + unsigned char status; + + CC1100_Select(); + status = spi_rw(addr | WRITE); + for (i=0; i < lenght; i++) + spi_rw(dat[i]); + CC1100_DeSelect(); + + return(status); +} + +unsigned char cc1100_write1(unsigned char addr,unsigned char dat) { + + unsigned char status; + + CC1100_Select(); + status = spi_rw(addr | WRITE); + spi_rw(dat); + CC1100_DeSelect(); + + return(status); +} + +unsigned char cc1100_read(unsigned char addr, unsigned char* dat, unsigned char lenght) { + + unsigned char i; + unsigned char status; + + CC1100_Select(); + status = spi_rw(addr | READ); + for (i=0; i < lenght; i++) + dat[i]=spi_rw(0x00); + CC1100_DeSelect(); + + return(status); +} + +unsigned char cc1100_read1(unsigned char addr) { + + unsigned char r; + + CC1100_Select(); + r = spi_rw(addr | READ); + r=spi_rw(0x00); + CC1100_DeSelect(); + + return(r); +} + +unsigned char cc1100_strobe(unsigned char cmd) { + + unsigned char status; + + CC1100_Select(); + status = spi_rw(cmd); + CC1100_DeSelect(); + + return(status); +} + +unsigned char spi_rw(unsigned char write) { + + unsigned char z; + + for (z= 8; z > 0; z--) { + P1OUT &= ~CC_SCLK; //SCK = 0; + if (write & 0x80) + P1OUT |= CC_MOSI; //MOSI1 = 1; + else + P1OUT &= ~CC_MOSI; //MOSI1 = 0; + P1OUT |= CC_SCLK; //SCK = 1; + write <<=1; + if (P1IN & CC_MISO) + write |= 0x01; + } + P1OUT &= ~CC_SCLK; + + return(write); +} + + diff --git a/betty_TAE/MSP430/trunk/cc1100.h b/betty_TAE/MSP430/trunk/cc1100.h new file mode 100644 index 0000000..6bef052 --- /dev/null +++ b/betty_TAE/MSP430/trunk/cc1100.h @@ -0,0 +1,57 @@ +/* + cc1100.h + Copyright (C) 2009 + + 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 3 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 cc1100_H +#define cc1100_H + +#define WRITE 0x00 +#define BURST 0x40 +#define READ 0x80 +#define TX_fifo 0x7F +#define RX_fifo 0xff + +#define SRES 0x30 +#define SFSTXON 0x31 +#define SXOFF 0x32 +#define SCAL 0x33 +#define SRX 0x34 +#define STX 0x35 +#define SIDLE 0x36 +#define SWOR 0x38 +#define SPWD 0x39 +#define SFRX 0x3A +#define SFTX 0x3B +#define SWORRST 0x3C +#define SNOP 0x3D +#define PTABLE 0x3E + +#define cc1100_chan 0x01 +#define cc1100_addr 0x02 + +const unsigned char conf[0x2F]; + +void cc1100_init(void); +unsigned char cc1100_write(unsigned char addr, unsigned char* dat, unsigned char lenght); +unsigned char cc1100_write1(unsigned char addr,unsigned char dat); +unsigned char cc1100_read(unsigned char addr, unsigned char* dat, unsigned char lenght); +unsigned char cc1100_read1(unsigned char addr); +unsigned char cc1100_strobe(unsigned char cmd); +unsigned char spi_rw(unsigned char write); + + +#endif diff --git a/betty_TAE/MSP430/trunk/hardware.c b/betty_TAE/MSP430/trunk/hardware.c new file mode 100644 index 0000000..f8c4a9a --- /dev/null +++ b/betty_TAE/MSP430/trunk/hardware.c @@ -0,0 +1,61 @@ +/* + hardware.h - TAE hardware + Copyright (C) 2009 + + 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 3 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 "hardware.h" +#include + +void init_clock(void) { + unsigned char step; + int last, delta; + + + DCOCTL = 0x70; + BCSCTL1 = XT2OFF | DIVA_3 | (DCO_RSEL & 0xF); + BCSCTL2 = 0x00; + + last = 0; + TACTL = TASSEL_2 /* Timer A clock source select: 2 - SMCLK */ + | MC_2 /* Timer A mode control: 2 - Continous up */ + | TACLR; + TACCTL2 = CM1 /* Capture mode 1 */ + | CCIS_1 | SCS | CAP; + for (step = 0x40; step > 0; step >>= 1) { + while (!(TACCTL2 & CCIFG)); + + delta = TACCR2 - last; + if (delta < DCO_ACLK_DELTA) { + DCOCTL += step; + } + else { + DCOCTL -= step; + } + + last = TACCR2; + TACCTL2 &= ~CCIFG; + } + + BCSCTL1 &= ~DIVA_3; + + BCSCTL2 = DIVS_1; + + TACTL = TASSEL1 /* Timer A clock source select 0 */ + | MC_2 /* Timer A mode control: 2 - Continous up */ + | TACLR; + +} + diff --git a/betty_TAE/MSP430/trunk/hardware.h b/betty_TAE/MSP430/trunk/hardware.h new file mode 100644 index 0000000..740b291 --- /dev/null +++ b/betty_TAE/MSP430/trunk/hardware.h @@ -0,0 +1,58 @@ +/* + hardware.h - TAE hardware + Copyright (C) 2009 + + 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 3 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 HARDWARE_H +#define HARDWARE_H + +#define DCO_RSEL 7 +#define DCO_ACLK_DELTA (((F_CPU) + 2047) / 4096) + +//Port 1 +#define CC_CS (1<<0) +#define CC_SCLK (1<<1) +#define CC_MOSI (1<<2) +#define CC_MISO (1<<3) +#define WD_RST (1<<4) +#define CC1100_POWER (1<<5) +#define EXTRA_CURRENT (1<<6) +#define CC1100_APOWER (1<<7) + +//Port2 +#define ACLK (1<<0) +#define VEGA_CLK (1<<1) +#define VEGA_MOSI (1<<2) +#define VEGA_MISO (1<<3) +#define ADC_IN1 (1<<4) +#define LINE_CONTROL (1<<5) +#define XIN (1<<6) +#define XOUT (1<<7) + + +void init_clock(void); + +static void __inline__ delay(register unsigned int n) +{ + __asm__ __volatile__ ( + "1: \n" + " dec %[n] \n" + " nop \n" + " jne 1b \n" + : [n] "+r"(n)); +} + +#endif diff --git a/betty_TAE/MSP430/trunk/main.c b/betty_TAE/MSP430/trunk/main.c new file mode 100644 index 0000000..3a144d4 --- /dev/null +++ b/betty_TAE/MSP430/trunk/main.c @@ -0,0 +1,67 @@ +/* + main.c - TAE MSP + Copyright (C) 2009 + + 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 3 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 "hardware.h" +#include +#include +//#include // delay() +#include "rf.h" + + +int main(void) +{ + WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer + + P1OUT = 0;//CC_CS | CC1100_POWER | CC1100_APOWER | EXTRA_CURRENT; + P1DIR = CC_SCLK | CC_MOSI | CC_CS | WD_RST | CC1100_POWER | CC1100_APOWER | EXTRA_CURRENT; + P1SEL = 0; + P1IES = CC_MISO; + P1IFG = 0; + + P2OUT = 0; + P2DIR = ACLK | VEGA_MISO | ADC_IN1 | LINE_CONTROL; + P2SEL = ACLK | XIN | XOUT; + + + delay(0xffff); + P1OUT = CC_CS | CC1100_POWER | EXTRA_CURRENT; + P2OUT = LINE_CONTROL; + delay(0xffff); + + init_clock(); + + RF_init(); + RF_sendWOR(0); + + eint(); + + for (;;) + { + + TACTL = TASSEL_1 //ACLK + | MC_2 /* Timer A mode control: 2 - Continous up */ + | TACLR; + while(TAR < 0x3200); + P1OUT ^= WD_RST; + //P1OUT ^= CC_SCLK; + //delay(0x8000); + //RF_sendWOR(0); + + } +} + diff --git a/betty_TAE/MSP430/trunk/rf.c b/betty_TAE/MSP430/trunk/rf.c new file mode 100644 index 0000000..e8dd913 --- /dev/null +++ b/betty_TAE/MSP430/trunk/rf.c @@ -0,0 +1,163 @@ +/* + rf.c - + Copyright (C) 2008 + + 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 3 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 "cc1100.h" +#include "hardware.h" +#include "rf.h" +#include +#include +//#include + +unsigned char RFbuf[64]; +volatile unsigned char RFstatus; +unsigned char cc1100Addr; + +void switch_to_idle(void) { + cc1100_strobe(SIDLE); + while (cc1100_read1(0x35 | READ | BURST) != 01); +} + +void RF_init (void) { + cc1100_init(); + RFstatus = 0; + cc1100Addr = conf[0x09]; + cc1100_strobe(SRX); + P1IE = CC_MISO; + +} + +void waitTX(void) +{ + unsigned char status; + unsigned char x; + + x=1; + while (x) { + status = cc1100_strobe(SNOP); + switch ( 0xf0 & status) { + case 0x70: + cc1100_strobe(SFTX); + break; + case 0x10: + if (RFstatus & WORsend) + cc1100_strobe(SIDLE); + x=0; + break; + case 0x00: + if (!(RFstatus & WORsend)) + cc1100_strobe(SRX); + x=0; + break; + } + } +} + +void RF_send(unsigned char* b) { + + unsigned char P1IE_state; + + P1IE_state = (P1IE & CC_MISO); + P1IE &= ~CC_MISO; + + cc1100_write(TX_fifo | BURST,b,b[0]+1); + cc1100_strobe(STX); + waitTX(); + P1IE |= P1IE_state; +} + +void RF_getfifo(unsigned char* b) { + + cc1100_read(RX_fifo, b,1); + cc1100_read(RX_fifo, &b[1],b[0]); + +} + +void RF_sendWOR(unsigned char addr) { + + unsigned char b[2]; + + b[0]=0x01; + b[1]=addr; + + RFstatus |= WORsend; + cc1100_write1(0x18,conf[0x18] & 0xCF); + + cc1100_strobe(SIDLE); + cc1100_strobe(SCAL); + waitTX(); + + TACTL = TASSEL_1 //ACLK + | MC_2 /* Timer A mode control: 2 - Continous up */ + | TACLR; + while(TAR < 0x3800) { + cc1100_write(TX_fifo | BURST,b,2); + cc1100_strobe(STX); + waitTX(); + } + + cc1100_write1(0x18,conf[0x18]); + RFstatus &= ~WORsend; + waitTX(); + P1OUT ^= WD_RST; + +} + +interrupt (PORT1_VECTOR) RF_IRQ (void) { + + if (cc1100_read1(0x3B | READ | BURST) > 0) { + RF_getfifo(RFbuf); + + cc1100_strobe(SIDLE); + cc1100_strobe(SFRX); + cc1100_strobe(SRX); + + struct cc1100frame_ *RXframe; + RXframe = (struct cc1100frame_ *)&RFbuf[0]; + + if (RXframe->len > 3) { + switch ( RXframe->packetType) { + case 0x01: + break; + case 0x02: + if (RXframe->data[0] == 0x01) { + RXframe->destAddr = RXframe->srcAddr; + RXframe->srcAddr = cc1100Addr; + RXframe->data[0] = 0x02; + RXframe->len = 0x04; + switch_to_idle(); + RF_send(RFbuf); + P1OUT ^= WD_RST; + } + else if (RFbuf[headerLen] == 0x02) { + RFstatus |= Received; + } + break; + case 0x03: + break; + } + } + } + + waitTX(); + P1IFG = 0; + P1OUT ^= WD_RST; +} + + + + diff --git a/betty_TAE/MSP430/trunk/rf.h b/betty_TAE/MSP430/trunk/rf.h new file mode 100644 index 0000000..6c842af --- /dev/null +++ b/betty_TAE/MSP430/trunk/rf.h @@ -0,0 +1,45 @@ +/* + rf.h - + Copyright (C) 2008 + + 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 3 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 RF_H +#define RF_H + +#define Received 0x01 +#define WORsend 0x02 + +struct cc1100frame_ { + unsigned char len; + unsigned char destAddr; + unsigned char srcAddr; + unsigned char packetType; + unsigned char data[]; +}; +#define headerLen 0x04 + +unsigned char RFbuf[64]; + +volatile unsigned char RFstatus; + +void RF_IRQ (void); +void RF_init (void); +void RF_getfifo(unsigned char* b); +void RF_send(unsigned char* b); +void RF_sendWOR(unsigned char addr); +void waitTX(void); + +#endif diff --git a/betty_scart/trunk/LICENSE b/betty_scart/trunk/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/betty_scart/trunk/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/betty_scart/trunk/Makefile b/betty_scart/trunk/Makefile new file mode 100644 index 0000000..2ff63c2 --- /dev/null +++ b/betty_scart/trunk/Makefile @@ -0,0 +1,95 @@ +############################################################### +##### +##### Makefile for betty_scart +##### Created at 30.8.2007 02:26 am +##### +##### scart_terminal V0.1 by telekatz - telekatz@gmx.de +##### +############################################################### + +############################################################### +##### +##### PATHS (default installation) +##### +##### You can put your path-config into Makefile.local +##### to override these defaults +##### +############################################################### + + + +SDCCBASE=F:/Tools/SDCC +INCLUDEPATH=$(SDCCBASE)/include +SDCCPATH=$(SDCCBASE)/bin + +PACKER = $(SDCCPATH)/packihx +IMGMAKER = $(SDCCPATH)/makebin +CC=$(SDCCPATH)/sdcc + +-include Makefile.local + +# Target file name. +TARGET = betty_scart + + +# List C source files here. +SRC = main.c \ + serial.c \ + cc1100.c \ + cmd.c \ + rf.c \ + timer.c + + +# Compiler flags. +FLAGS = -mmcs51 --iram-size 0x100 +FLAGS += --model-small +FLAGS += --code-size 8096 +FLAGS += -I$(INCLUDEPATH) +FLAGS += --std-sdcc99 +# For newer SDCC +FLAGS += -Dcode=__code -Didata=__idata -Dbit=__bit + +# Define all object files. +OBJ = $(SRC:.c=.rel) + + +# Default target. +all: $(TARGET).bin + +program: $(TARGET).bin + #ScartProg -a -u -d 'UniProg A' + ScartProg -a + +main.rel: main.c + $(CC) $(FLAGS) -c main.c + +serial.rel: serial.c serial.h + $(CC) $(FLAGS) -c serial.c + +cc1100.rel: cc1100.c cc1100.h + $(CC) $(FLAGS) -c cc1100.c + +cmd.rel: cmd.c cmd.h + $(CC) $(FLAGS) -c cmd.c + +rf.rel: rf.c rf.h + $(CC) $(FLAGS) -c rf.c + +timer.rel: timer.c timer.h + $(CC) $(FLAGS) -c timer.c + +$(TARGET).bin: $(TARGET).hex + cat $(TARGET).hex | $(IMGMAKER) -s 8096 > $(TARGET).bin + + +$(TARGET).hex: $(TARGET).ihx + $(PACKER) $(TARGET).ihx > $(TARGET).hex + +$(TARGET).ihx: $(OBJ) + @echo + @echo Linking $(OBJ) + $(CC) $(FLAGS) $(OBJ) -o $(TARGET).ihx + +clean: + $(RM) -v *.rel *.rst *.sym *.lst *.hex *.asm *.mem *.map *.lnk *.ihx *.bin *~ diff --git a/betty_scart/trunk/Makefile.local.WinSDCC b/betty_scart/trunk/Makefile.local.WinSDCC new file mode 100644 index 0000000..3989b1a --- /dev/null +++ b/betty_scart/trunk/Makefile.local.WinSDCC @@ -0,0 +1,22 @@ +############################################################### +##### +##### Makefile.local.WinSDCC for betty_scart +##### +##### Makefile.local.WinSDCC +##### +############################################################### + +############################################################### +##### +##### PATHS (default installation) +##### +##### You can put your path-config into Makefile.local +##### to override these defaults +##### +############################################################### + +SDCCBASE=F:/Tools/SDCC +INCLUDEPATH=$(SDCCBASE)/include +SDCCPATH=$(SDCCBASE)/bin + +######################## EOF ################################## diff --git a/betty_scart/trunk/Makefile.local.linuxSDCC b/betty_scart/trunk/Makefile.local.linuxSDCC new file mode 100644 index 0000000..5c1e4af --- /dev/null +++ b/betty_scart/trunk/Makefile.local.linuxSDCC @@ -0,0 +1,22 @@ +############################################################### +##### +##### Makefile.local.linuxSDCC for betty_scart +##### +##### Makefile.local.linuxARM +##### +############################################################### + +############################################################### +##### +##### PATHS (default installation) +##### +##### You can put your path-config into Makefile.local +##### to override these defaults +##### +############################################################### + +SDCCBASE=/opt/sdcc +INCLUDEPATH=$(SDCCBASE)/include +SDCCPATH=$(SDCCBASE)/bin + +######################## EOF ################################## diff --git a/betty_scart/trunk/ScartProg.exe b/betty_scart/trunk/ScartProg.exe new file mode 100644 index 0000000000000000000000000000000000000000..e98d463f9b0f6840d86685e097a3dfc4f138ed63 GIT binary patch literal 68096 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 z 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 literal 0 HcmV?d00001 diff --git a/betty_scart/trunk/betty_scart.bin b/betty_scart/trunk/betty_scart.bin new file mode 100644 index 0000000000000000000000000000000000000000..b798dd585f2a03b5169deb1073ec2c7134562a1b GIT binary patch literal 8096 zcmeHKe{2)i9e?-EcjsRhCr3yMl-68q3S$X|0%cTyS%7KM)LJBJT1^AfEovuG%D@jo zHOTplx0N5ZNeCgTy0S4%ZAap5n$R>YiF+B8X{&m@Z5l0qlvYkf1~`E=Kp`aizB@Y! z5iP6s*CgkU^Y?v!z0do+@B6+NjCL#@v;IEs7qd4^hpBe#NZnIE)vqwdw)GM^uZ)uD zNl7g2SHmnuTX&;@wJ1F6C6p5X+Jwk)lx@9s!v1@Nx#RDD`oT4Fd@S2EcKzI)CUg<} zoV!hze>={NSPJ)UltL&wbmH8|`?rW45eFhNB2^ruuG_bzHr_&%Sl!`OwJqWYjY z3DvrwTi8jeEl+UW&tm1-?(bryzI!`X=6CPF%9`#7R=Dn6jY)iFHy$s$caj9?LEfN0VwIb|Tw4+(QNU?Ul)~4Yhwb zPE>rfP?Q zgAAYHGB(PDP3LqTkZI#-`YyM*Lti5DT{*2LDX$#vhf3LIGjhtHk(2w?u|L&&M(cP_ zBv3QzI}@@+gqqRu9f)`~`2v&Fm`!KqWG-ZeGHNDPK$u}OIKyO6MkhLoWc-dGAMa2l z+a>Loc8DBAx~?Og(Xq}J7NW;=RUgtX=yMj|CtbfQ?38SsakWG1P_UN!!d%TrOG6Qt zOm}qIIeTRFMql-3KNgI1Qk6}U3rwyqC+DQ57YZhb7}3(x9ceRW6OB=gG%(}0(*p)0 z;LcoDNtc6j50luKH>1?#BRPCeXti`M>-auqB_yLMEIHjfR4*@u-|#<-+KwRUgY9ij## zZmuZ=L1;$33sIUrKJNZUGOOXGNPm`L)29g&k=Q*#3zXQsQF!CewScA0gH%2 z9ys;fTmXyua&4uds+?cEon2Zo(&;&%9*iBLg=&=~%?zbjqWsf{0?fOk<7I`pCmSQm zlf#AVozt&`A4}LuF8igC?9yqs-z=Y8MH0964Rvy%98?d)_74q6?(?&iGxy2~6ayk7 zdKVCLSQ>?{IkB(+i}Ue?PNfZ4l;{Fchk-JFr`c?os}XkLu#fmrykahSgxTv$h@=D& zPmq+_h}ulaeOqHel6Yu{N&ewnxCE587L7GE%4J|(T?zyn11XU}C&X+GR1jpHAD{P? zc*O$pRZbh&JO6*kE7PKdDbs52DijKuaOe^Mkj9$loQiZaUkg=IU&``0M05YL1(et= z0VQy^68B8%;&fx#(tpuy~E$#xdD zg%+o|b4Gqiz=Ua`L;}XZu{-GwXyh=$uwEKNcl&G?^n@q!p}MdK^<8-_RAJHrTyrKh zX=vMmsPscU-W3;|8aD$b>4Hf#mUdn<+6w*H3N`UkRM_1haT_&TN_-OTn+ln<2FZ_t z^OFXFun2%9uMJrk~9MeOCUvaXlM%5&IddBZHd41K}4+DN4> zJtO%*ykZ8KiHTS_`CP%NB4yY-R-D0sGvyNIf3=x~CsAcc%5$4%7P{L-BT92pr=4(* z`ECcF7+kn8<$PracD{+7C$aN1cK#hZFDT0Z@a<4w!u5I(C#wuznH`@Y$E#Ghtqlf- zB^qPh-5_Iw_wrLg^Y;P`?;z*}7HG;$=%oPKHD2o}@$HF1zTbMrqm*St#c=f#w=IP# z$xu*Y$$vvgq00}OyW7jaM$=Xw;OtgQQkD~S2`CgGBku#R%c{=_BkJSeYempfJA%LX z{$&QktBJajcA^A*X4DUjhUfH@V#U+5Eepv^1H5C-1#G-EWiwL#;-v!$3I;vU$jK}w z`JgsnK$UOIwvI*K-85WA)CZ>AVUko`N*v+M^MO5#94*9qUB_E zKBz6TBSVn+kovQkx{y}0f!;bqwJ$TqLD_qwG;qD_C$ZO6@33(F^%#jE`I>TL2n^+c z>*aaFCzj!3|Fn1Qi(4B}-R`ZC%}w6M?b~16jzlM_o>dWd zJ!>eYlV;CNlx<1%Xrpa$D71-q!TWW)c*N2*(Dt*I= z%GRKU=GDg*xeBQ_G(P7IG$HRw^Xv7Z(3<)+U;oy+Z=>%Nbf~s=(V{@WOEG!tBAX** z#|kg ValsTotal: + ValsPerLine = ValsTotal - ValCount + if ValsPerLine == 0: + break + ValCount += ValsPerLine + + # read data + bufChunk = fileIn.read(ValsPerLine) + + # write line of hex bytes + fileOut.write("\t") + for byteVal in bufChunk: + fileOut.write("0x%02x,%s" % (ord(byteVal), strValSpace)) + fileOut.write("\n") + + + # Close files + fileIn.close() + + fileOut.write("};\n") + fileOut.close() + + sys.stderr.write("Converted %d values.\n\n" % (ValCount)) + +if __name__ == "__main__": + converter = BinToArray() + converter.ConvertFileToArray("betty_scart.bin", "../../boop/trunk/tools/scart_image_data.h", 0, ) diff --git a/betty_scart/trunk/cc1100.c b/betty_scart/trunk/cc1100.c new file mode 100644 index 0000000..5d648c0 --- /dev/null +++ b/betty_scart/trunk/cc1100.c @@ -0,0 +1,221 @@ +/* + cc1100.c + Copyright (C) 2007 + + 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 3 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 +#include "cc1100.h" + +code unsigned char conf[0x2F] = { + 0x29 , //IOCFG2 + 0x2E , //IOCFG1 + 0x06 , //IOCFG0 + 0x47 , //FIFOTHR + 0xD3 , //SYNC1 + 0x91 , //SYNC0 + 0x3E , //PKTLEN + 0x1A , //PKTCTRL1 + 0x45 , //PKTCTRL0 + 0x01 , //ADDR + 0x01 , //CHANNR + 0x06 , //FSCTRL1 + 0x00 , //FSCTRL0 + 0x10 , //FREQ2 + 0x0B , //FREQ1 + 0xDA , //FREQ0 + 0x8A , //MDMCFG4 + 0x75 , //MDMCFG3 + 0x13 , //MDMCFG2 + 0x22 , //MDMCFG1 + 0xC1 , //MDMCFG0 + 0x35 , //DEVIATN + 0x07 , //MCSM2 + 0x03 , //MCSM1 0c + 0x38 , //MCSM0 + 0x16 , //FOCCFG + 0x6C , //BSCFG + 0x43 , //AGCCTRL2 + 0x40 , //AGCCTRL1 + 0x91 , //AGCCTRL0 + 0x46 , //WOREVT1 + 0x50 , //WOREVT0 + 0x78 , //WORCTRL + 0x56 , //FREND1 + 0x10 , //FREND0 + 0xA9 , //FSCAL3 + 0x0A , //FSCAL2 + 0x00 , //FSCAL1 + 0x11 , //FSCAL0 + 0x41 , //RCCTRL1 + 0x00 , //RCCTRL0 + 0x57 , //FSTEST + 0x7F , //PTEST + 0x3F , //AGCTEST + 0x98 , //TEST2 + 0x31 , //TEST1 + 0x0B //TEST0 +}; + +unsigned char spi_rw(unsigned char write) { + + unsigned char z; + + for (z= 8; z; z--) { + SCK = 0; + MOSI1 = (write & 0x80); + SCK = 1; + write <<=1; + if (MISO1) + write |= 0x01; + } + SCK = 0; + + return(write); +} + +unsigned char spi_r() { + + unsigned char z; + unsigned char ret = 0; + MOSI1 = 0; + SCK = 0; + for (z= 8; z; z--) { + SCK = 1; + ret <<=1; + if (MISO1) + ret |= 0x01; + SCK = 0; + } + + return(ret); +} + +void cc1100_init(void) { + + unsigned char i = 0xff; + + SCK = 1; + MOSI1 = 0; + CS = 0; + while(i) { + i--; + } + CS = 1; + i=0xff; + while(i) { + i--; + } + CS = 0; + SCK = 0; + while (MISO1); + spi_rw(SRES); + while (MISO1); + + spi_rw(0x00 | BURST); + for (i=0; i < 0x2f; i++) + spi_rw(conf[i]); + CS = 1; + + cc1100_write1(PATABLE,0xC0); + cc1100_strobe(SIDLE); + cc1100_strobe(SCAL); + cc1100_strobe(SFRX); + cc1100_strobe(SRX); +} + +unsigned char cc1100_write(unsigned char addr, unsigned char* dat, unsigned char lenght) { + + unsigned char i; + unsigned char status; + + CS = 0; + while (MISO1); + status = spi_rw(addr | WRITE); + for (i=0; i < lenght; i++) + spi_rw(dat[i]); + CS = 1; + + return(status); +} + +unsigned char cc1100_write1(unsigned char addr,unsigned char dat) { + + unsigned char status; + + CS = 0; + while (MISO1); + status = spi_rw(addr | WRITE); + spi_rw(dat); + CS = 1; + + return(status); +} + +unsigned char cc1100_read(unsigned char addr, unsigned char* dat, unsigned char lenght) { + + unsigned char i; + unsigned char status; + + CS = 0; + while (MISO1); + status = spi_rw(addr | READ); + for (i=0;lenght; lenght--) + dat[i++]=spi_r(); + CS = 1; + + return(status); +} + +unsigned char cc1100_read1(unsigned char addr) { + + unsigned char r; + + CS = 0; + while (MISO1); + r = spi_rw(addr | READ); + r=spi_rw(0x00); + CS = 1; + + return(r); +} + +unsigned char cc1100_strobe(unsigned char cmd) { + + unsigned char status; + + CS = 0; + while (MISO1); + status = spi_rw(cmd); + CS = 1; + + return(status); +} + +unsigned char cc1100_single(unsigned char b,bit end) { + + unsigned char status; + + if (CS == 1) { + CS = 0; + while (MISO1); + } + status = spi_rw(b); + if (end) + CS = 1; + + return(status); +} + diff --git a/betty_scart/trunk/cc1100.h b/betty_scart/trunk/cc1100.h new file mode 100644 index 0000000..3347126 --- /dev/null +++ b/betty_scart/trunk/cc1100.h @@ -0,0 +1,128 @@ +/* + cc1100.h + Copyright (C) 2007 + + 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 3 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 cc1100_H +#define cc1100_H + +#define MISO1 RST +#define MOSI1 OCB +#define SCK OCC +#define CS KB1 +#define GDO0 KB6 + +#define WRITE 0x00 +#define BURST 0x40 +#define READ 0x80 +#define TX_fifo 0x7F +#define RX_fifo 0xff +#define PATABLE 0x3E + +//Command Strobes +#define SRES 0x30 +#define SFSTXON 0x31 +#define SXOFF 0x32 +#define SCAL 0x33 +#define SRX 0x34 +#define STX 0x35 +#define SIDLE 0x36 +#define SWOR 0x38 +#define SPWD 0x39 +#define SFRX 0x3A +#define SFTX 0x3B +#define SWORRST 0x3C +#define SNOP 0x3D + +//Status Registers +#define PARTNUM (0x30 | READ | BURST) +#define VERSION (0x31 | READ | BURST) +#define FREQEST (0x32 | READ | BURST) +#define LQI (0x33 | READ | BURST) +#define RSSI (0x34 | READ | BURST) +#define MARCSTATE (0x35 | READ | BURST) +#define WORTIME1 (0x36 | READ | BURST) +#define WORTIME0 (0x37 | READ | BURST) +#define PKTSTATUS (0x38 | READ | BURST) +#define VCO_VC_DAC (0x39 | READ | BURST) +#define TXBYTES (0x3A | READ | BURST) +#define RXBYTES (0x3B | READ | BURST) +#define RCCTRL1_STATUS (0x3C | READ | BURST) +#define RCCTRL0_STATUS (0x3D | READ | BURST) + +//Configuration Registers +#define IOCFG2 0x00 // GDO2 output pin configuration +#define IOCFG1 0x01 // GDO1 output pin configuration +#define IOCFG0 0x02 // GDO0 output pin configuration +#define FIFOTHR 0x03 // RX FIFO and TX FIFO thresholds +#define SYNC1 0x04 // Sync word, high byte +#define SYNC0 0x05 // Sync word, low byte +#define PKTLEN 0x06 // Packet length +#define PKTCTRL1 0x07 // Packet automation control +#define PKTCTRL0 0x08 // Packet automation control +#define ADDR 0x09 // Device address +#define CHANNR 0x0A // Channel number +#define FSCTRL1 0x0B // Frequency synthesizer control +#define FSCTRL0 0x0C // Frequency synthesizer control +#define FREQ2 0x0D // Frequency control word, high byte +#define FREQ1 0x0E // Frequency control word, middle byte +#define FREQ0 0x0F // Frequency control word, low byte +#define MDMCFG4 0x10 // Modem configuration +#define MDMCFG3 0x11 // Modem configuration +#define MDMCFG2 0x12 // Modem configuration +#define MDMCFG1 0x13 // Modem configuration +#define MDMCFG0 0x14 // Modem configuration +#define DEVIATN 0x15 // Modem deviation setting +#define MCSM2 0x16 // Main Radio Cntrl State Machine config +#define MCSM1 0x17 // Main Radio Cntrl State Machine config +#define MCSM0 0x18 // Main Radio Cntrl State Machine config +#define FOCCFG 0x19 // Frequency Offset Compensation config +#define BSCFG 0x1A // Bit Synchronization configuration +#define AGCCTRL2 0x1B // AGC control +#define AGCCTRL1 0x1C // AGC control +#define AGCCTRL0 0x1D // AGC control +#define WOREVT1 0x1E // High byte Event 0 timeout +#define WOREVT0 0x1F // Low byte Event 0 timeout +#define WORCTRL 0x20 // Wake On Radio control +#define FREND1 0x21 // Front end RX configuration +#define FREND0 0x22 // Front end TX configuration +#define FSCAL3 0x23 // Frequency synthesizer calibration +#define FSCAL2 0x24 // Frequency synthesizer calibration +#define FSCAL1 0x25 // Frequency synthesizer calibration +#define FSCAL0 0x26 // Frequency synthesizer calibration +#define RCCTRL1 0x27 // RC oscillator configuration +#define RCCTRL0 0x28 // RC oscillator configuration +#define FSTEST 0x29 // Frequency synthesizer cal control +#define PTEST 0x2A // Production test +#define AGCTEST 0x2B // AGC test +#define TEST2 0x2C // Various test settings +#define TEST1 0x2D // Various test settings +#define TEST0 0x2E // Various test settings + +#define MARCSTATE_IDLE 0x01 +#define MARCSTATE_RX 0x0d + +extern code unsigned char conf[0x2F]; + +void cc1100_init(void); +unsigned char cc1100_write(unsigned char addr, unsigned char* dat, unsigned char lenght); +unsigned char cc1100_write1(unsigned char addr,unsigned char dat); +unsigned char cc1100_read(unsigned char addr, unsigned char* dat, unsigned char lenght); +unsigned char cc1100_read1(unsigned char addr); +unsigned char cc1100_strobe(unsigned char cmd); +unsigned char cc1100_single(unsigned char b,bit end); + +#endif diff --git a/betty_scart/trunk/cmd.c b/betty_scart/trunk/cmd.c new file mode 100644 index 0000000..47b3da3 --- /dev/null +++ b/betty_scart/trunk/cmd.c @@ -0,0 +1,217 @@ +/* + cmd.c + Copyright (C) 2007 + + 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 3 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 "serial.h" +#include "cc1100.h" +#include +#include "cmd.h" +#include "rf.h" + +unsigned char redir_dest = 0; +unsigned char redir_baud = baud_19200; + + +void transmit(unsigned char len) { + + struct cc1100frame_ header; + + sendWOR(0); + EKBI = 0; + cc1100_strobe(SIDLE); + while (cc1100_read1(0x35 | READ | BURST) != 01); + header.len = len + headerLen - 1; + header.destAddr = 0; + header.srcAddr = cc1100Addr; + header.packetType = packet_test; + cc1100_write(TX_fifo,(unsigned char *)&header,headerLen); + cc1100_single(TX_fifo | BURST,0); + while(len--) { + cc1100_single(get_inbuf(),0); + } + CS = 1; + cc1100_strobe(STX); + EKBI = 1; + + send_string("TX Done"); +} + +void transmitRedir(unsigned char len, unsigned char dest) { + + struct cc1100frame_ header; + + header.len = len + headerLen - 1; + header.destAddr = dest; + header.srcAddr = cc1100Addr; + header.packetType = packet_redirDAT; + EKBI = 0; + cc1100_write(TX_fifo,(unsigned char *)&header,headerLen); + cc1100_single(TX_fifo | BURST,0); + while(len--) { + cc1100_single(get_inbuf(),0); + } + CS = 1; + cc1100_strobe(STX); + + EKBI = 1; +} + +void transmitB(void) { + + unsigned char l; + unsigned char x; + unsigned char i; + + while(!inbuflen); + l=get_inbuf(); + + if (l < 62) { + cc1100_single(TX_fifo ,0); + cc1100_single(l ,0); + for(i=0; i. +*/ + +#ifndef cmd_H +#define cmd_H + +#define redir_ACK 0 +#define redir_SET 1 +#define redir_START 2 +#define redir_STOP 3 +#define redir_PING 4 + +extern unsigned char redir_dest; +extern unsigned char redir_baud; + +void transmit(unsigned char len); +void transmitRedir(unsigned char len, unsigned char dest); +void transmitB(void); +void print_cc1100confi(void); +void print_cc1100status(void); +void read_byteB(void); +void write_byteB(void); +void read_burst_byteB(void); +void write_burst_byteB(void); +void cmd_strobeB(void); +void send_WORb(void); + +#endif diff --git a/betty_scart/trunk/main.c b/betty_scart/trunk/main.c new file mode 100644 index 0000000..8404b1e --- /dev/null +++ b/betty_scart/trunk/main.c @@ -0,0 +1,176 @@ +/* + main.c + Copyright (C) 2007 + + 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 3 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 // special function register declarations + // for the Philips P89C931 device + +#include "rf.h" +#include "serial.h" +#include "cmd.h" +#include "cc1100.h" +#include "timer.h" + +volatile bit terminal; +volatile bit redirector; + +__sfr __at (0xAD) CMP2_ ; + +void main(void) { + + unsigned char x; + unsigned char len; + + P0M1 &= 0x6c; + P0M2 |= 0x92; + P0 = 0x83; + + P1M1 &= 0x3e; + P1M2 |= 0xcd; + P1 = 0xcd; + + P3M1 &= 0xfe; + P3M2 |= 0x01; + P3 = 0; + + /*PT0AD = 0x24; + TMOD = 0x22; + TAMOD = 0x10; + TCON = 0x50; + AUXR1 = 0x20; + TH0 = 0x22; + TH1 = 0x80; + CMP2_ = 0x24; + */ + + initTimer0(); + initSerial(); + RF_init(); + RF_startIRQ(); + + EA = 1; + + send_string(crlf); + send_string("Ready"); + send_string(crlf); + + terminal = 1; + //redirector = 1; + len =0; + + while (1) { + if(redirector) { + if(inbuflen >= 58) { + transmitRedir(58,redir_dest); + } + else if(inbuflen && TF0) { + transmitRedir(inbuflen,redir_dest); + } + } + else if (terminal) { + if(len < inbuflen) { + x=get_inbuf_index(len++); + if (x == 0x0d) { + send_string(crlf); + inbuf[(inbufindex + len-1) & 0x3F] = 0; + x=get_inbuf(); + len--; + if(len) { + switch(x) { + case 't': + if (inbuflen) { + transmit(len); + len = 0; + send_string(crlf); + } + break; + case 'r': + if (inbuflen) { + transmitRedir(len,0); + len = 0; + send_string("TX Done"); + } + break; + case 's': + print_cc1100status(); + break; + case 'c': + print_cc1100confi(); + break; + case 'b': + terminal = 0; + send_byte(0x01); + break; + case 'w': + sendWOR(0x00); + break; + default: + send_string("Syntax error"); + } + while(len) { + get_inbuf(); + len--; + } + } + else { + send_string("Ready"); + } + send_string(crlf); + } + else { + send_byte(x); + } + } + } + + else { + if (inbuflen) { + x=get_inbuf(); + switch(x) { + case 0x00: + + break; + case 0x01: + transmitB(); + break; + case 0x02: + cmd_strobeB(); + break; + case 0x03: + read_byteB(); + break; + case 0x04: + write_byteB(); + break; + case 0x05: + read_burst_byteB(); + break; + case 0x06: + write_burst_byteB(); + break; + case 0x07: + send_WORb(); + break; + default: + send_byte(0x00); + } + if (!terminal) + send_byte(0x01); + } + } + } +} diff --git a/betty_scart/trunk/readme.txt b/betty_scart/trunk/readme.txt new file mode 100644 index 0000000..9218154 --- /dev/null +++ b/betty_scart/trunk/readme.txt @@ -0,0 +1,45 @@ + +To run the programm the following µC settings has to be changend: + +(with Betty-Heaven -> Scart -> Konfiguration) + +UCFG1: 07 +UCFG2: FF +Boot Vector: 00 +Status Byte: 00 + + +If you use the SCART-Betty-Kombiinterface remove R2, otherwise the programm will not work! + +Serial settings: 38400,n,8,1, no handshake + + +Commands: + + +Terminal Mode: +============== + +t transmitt +s show cc1100 status bytes +c show cc1100 configuration registers +b switch to binary mode +w send WOR packet + +Binary mode: +============ + +0x00 NOP +0x01 ... transmitt n Bytes (n<=61) +0x02 send command strobe to cc1100, get status byte +0x03 read cc1100 single byte +0x04 write cc1100 single byte +0x05 read n bytes cc1100 burst mode +0x06 ... write n bytes cc1100 burst mode +0x07 send WOR packet + +Return value + +0x00 syntax error +0x01 ready +0x02 ... n bytes data received \ No newline at end of file diff --git a/betty_scart/trunk/rf.c b/betty_scart/trunk/rf.c new file mode 100644 index 0000000..f483a28 --- /dev/null +++ b/betty_scart/trunk/rf.c @@ -0,0 +1,223 @@ +/* + rf.c + Copyright (C) 2009 Telekatz + + 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 3 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 +#include "cc1100.h" +#include "cmd.h" +#include "rf.h" +#include "serial.h" + +bit WORsend; +unsigned char cc1100Addr; +extern volatile bit terminal; +extern volatile bit redirector; + +void RF_init (void) { + cc1100_init(); + WORsend=0; + cc1100Addr = conf[0x09]; +} + +void RF_startIRQ (void) { + KBPATN = 0x40; + KBMASK = 0x40; + KBCON = 0x02; + EKBI = 1; +} + +void RF_isr (void) __interrupt (7) { + struct cc1100frameheader_ RXframe; + unsigned char i; + + if(KBPATN & 0x40) { + KBPATN = 0x00; //IRQ on low level + KBCON = 0x02; + return; + } + + RXframe.len = cc1100_read1(RXBYTES); + if (RXframe.len) { + bit startTX = 0; + if(RXframe.len > 3) + cc1100_read(RX_fifo, &RXframe.len,4); + else + cc1100_read(RX_fifo, &RXframe.len,RXframe.len); + + if (RXframe.len > 3) { + if(terminal || redirector) { + bit ACK = 0; + switch ( RXframe.packetType) { + case packet_ping: + if (cc1100_read1(RX_fifo) == 0x01) { + RXframe.len = 0x04; + RXframe.destAddr = RXframe.srcAddr; + RXframe.srcAddr = cc1100Addr; + RXframe.packetType = packet_ping; + cc1100_write(TX_fifo,(unsigned char*)RXframe,4); + cc1100_write1(TX_fifo,0x02); + startTX = 1; + } + break; + case packet_redirDAT: + cc1100_single(RX_fifo | BURST | READ,0); + for(i=3;i 4) { + unsigned char x; + x = cc1100_read1(RX_fifo); + if(x <= baud_115200) { + redir_baud = x; + } + ACK = 1; + } + break; + case redir_START: + redir_dest = RXframe.srcAddr; + setbaud(redir_baud); + redirector = 1; + ACK = 1; + break; + case redir_STOP: + redirector = 0; + setbaud(baud_default); + ACK = 1; + break; + case redir_PING: + ACK = 1; + break; + } + if(ACK) { + RXframe.len = 0x04; + RXframe.destAddr = RXframe.srcAddr; + RXframe.srcAddr = cc1100Addr; + RXframe.packetType = packet_redirCMD; + cc1100_write(TX_fifo,(unsigned char*)RXframe,4); + cc1100_write1(TX_fifo,redir_ACK); + startTX = 1; + } + break; + default: + if ((RXframe.len > 3) && terminal) { + send_string(crlf); + send_string("RX: "); + cc1100_single(RX_fifo | BURST | READ,0); + for(i=3;i + + 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 3 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 RF_H +#define RF_H + +#define packet_test 0x01 +#define packet_ping 0x02 +#define packet_time 0x03 +#define packet_RFenc 0x04 +#define packet_redirDAT 0x05 +#define packet_redirCMD 0x06 + +extern unsigned char cc1100Addr; + +struct cc1100frame_ { + unsigned char len; + unsigned char destAddr; + unsigned char srcAddr; + unsigned char packetType; + unsigned char dat[]; +}; +#define headerLen 0x04 + +struct cc1100frameheader_ { + unsigned char len; + unsigned char destAddr; + unsigned char srcAddr; + unsigned char packetType; +}; + +void RF_init (void); +void waitTX(void); +void sendWOR(unsigned char addr); +void RF_isr (void) __interrupt (7); +void RF_startIRQ (void); + +#endif diff --git a/betty_scart/trunk/serial.c b/betty_scart/trunk/serial.c new file mode 100644 index 0000000..c00194f --- /dev/null +++ b/betty_scart/trunk/serial.c @@ -0,0 +1,178 @@ +/* + serial.c + Copyright (C) 2007 + + 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 3 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 "serial.h" +#include "cmd.h" +#include + +unsigned char inbufindex = 0; +volatile unsigned char inbuflen = 0; +idata unsigned char inbuf[64]; + +unsigned char outbufindex; +volatile unsigned char outbuflen; +idata unsigned char outbuf[64]; + +code unsigned char crlf[] = { 0x0d, 0x0a, 0x00 }; + +const unsigned char baudtable[10][2] = { {45, 27}, //1200 + {22,133}, //2400 + {11, 59}, //4800 + { 5,149}, //9600 + { 3,180}, //14400 + { 2,195}, //19200 + { 1,210}, //28800 + { 1, 89}, //38400 + { 0,225}, //57600 + { 0,104}}; //115200 + + +void setbaud(unsigned char baud) { + + BRGR0 = baudtable[baud][1]; + BRGR1 = baudtable[baud][0]; + +} + +void initSerial(void) { + SCON = (1<<4) | (1<<6) | (1<<1); // Mode1; Enable serial reception + SSTAT |= (1<<7) | (1<<5); + setbaud(baud_default); + BRGCON = 0x03; + RI = 0; + ESR = 1; //Enable serial receive interrupt + TI = 1; + PSR = 1; //Serial receive interrupt priority level 1 + PST = 1; //Serial transmit interrupt priority level 1 + +} + +void send_string(const unsigned char* string) { + + unsigned char i=0; + + while (string[i] != 0) { + send_byte(string[i++]); + } +} + +void send_bytes(unsigned char* h, unsigned char l) { + + unsigned char i=0; + + while (i>4) & 0x0f; + cn += 0x30; + if (cn > 0x39) + cn += 0x07; + send_byte(cn); + + cn = c & 0x0f; + cn += 0x30; + if (cn > 0x39) + cn += 0x07; + send_byte(cn); +} + +void serial_in_isr (void) __interrupt (4) { + if (inbuflen < 64) { + put_inbuf(SBUF); + } + RI = 0; + TF0 = 0; + TH0 = 0; +} + +void serial_out_isr (void) __interrupt (13) { + if (outbuflen) { + SBUF = get_outbuf(); + TI=0; + } + else { + EST = 0; + } +} + +unsigned char get_inbuf(void) { + unsigned char x = 0; + EA = 0; + if(inbuflen) { + inbuflen--; + x = inbuf[(inbufindex++) & 0x3F]; + } + EA = 1; + return(x); +} + +unsigned char get_outbuf(void) { + unsigned char x = 0; + + EA = 0; + if(outbuflen) { + outbuflen--; + x = outbuf[(outbufindex++) & 0x3F]; + } + EA = 1; + return(x); +} + +unsigned char get_inbuf_wait(void) { + unsigned char x; + + while(!inbuflen); + EA = 0; + inbuflen--; + x = inbuf[(inbufindex++) & 0x3F]; + EA = 1; + return(x); +} + +unsigned char get_inbuf_index(unsigned char index) { + return(inbuf[(inbufindex + index) & 0x3F]); +} + +void put_inbuf(unsigned char dat) { + if (inbuflen < 64) + inbuf[(inbufindex + inbuflen++) & 0x3F] = dat; +} + +unsigned char put_outbuf(unsigned char dat) { + EA = 0; + if (outbuflen < 64) { + outbuf[(outbufindex + outbuflen++) & 0x3F] = dat; + EA = 1; + return 1; + } + EA = 1; + return 0; +} diff --git a/betty_scart/trunk/serial.h b/betty_scart/trunk/serial.h new file mode 100644 index 0000000..0723008 --- /dev/null +++ b/betty_scart/trunk/serial.h @@ -0,0 +1,63 @@ +/* + serial.h + Copyright (C) 2007 + + 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 3 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 serial_H +#define serial_H + +#define CTS P0_4 + +#define baud_1200 0 +#define baud_2400 1 +#define baud_4800 2 +#define baud_9600 3 +#define baud_14400 4 +#define baud_19200 5 +#define baud_28800 6 +#define baud_38400 7 +#define baud_57600 8 +#define baud_115200 9 + +#define baud_default baud_38400 + +__sbit __at (0xFE) PST; + +extern code unsigned char crlf[]; +extern unsigned char inbufindex; +extern volatile unsigned char inbuflen; +extern idata unsigned char inbuf[64]; + +extern unsigned char outbufindex; +extern volatile unsigned char outbuflen; +extern idata unsigned char outbuf[64]; + +void setbaud(unsigned char baud); +void initSerial(void); +void send_string(const unsigned char* string); +void send_hexC(unsigned char c); +void send_bytes(unsigned char* h, unsigned char l); +void send_byte(unsigned char h); +void serial_in_isr (void) __interrupt (4); +void serial_out_isr (void) __interrupt (13); +unsigned char get_inbuf(void) ; +unsigned char get_outbuf(void); +unsigned char get_inbuf_wait(void); +unsigned char get_inbuf_index(unsigned char index); +void put_inbuf(unsigned char dat); +unsigned char put_outbuf(unsigned char dat); + +#endif diff --git a/betty_scart/trunk/timer.c b/betty_scart/trunk/timer.c new file mode 100644 index 0000000..0553b5f --- /dev/null +++ b/betty_scart/trunk/timer.c @@ -0,0 +1,27 @@ +/* + timer.c + Copyright (C) 2009 Telekatz + + 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 3 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 + +void initTimer0(void) { + + TMOD |= (1<<0); //Timer0 mode1 + TR0 = 1; //Timer0 run +} + + diff --git a/betty_scart/trunk/timer.h b/betty_scart/trunk/timer.h new file mode 100644 index 0000000..6081056 --- /dev/null +++ b/betty_scart/trunk/timer.h @@ -0,0 +1,25 @@ +/* + timer.h + Copyright (C) 2009 Telekatz + + 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 3 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 timer_H +#define timer_H + +void initTimer0(void); + + +#endif diff --git a/bmp2b/trunk/Makefile b/bmp2b/trunk/Makefile new file mode 100644 index 0000000..e125252 --- /dev/null +++ b/bmp2b/trunk/Makefile @@ -0,0 +1,69 @@ +# native builds +CC = gcc +CFLAGS = -Wall -I/usr/src/linux/include + +# cross build +ARCH = arm-elf +CROSS_CC = $(ARCH)-gcc +CROSS_AS = $(ARCH)-as +CROSS_LD = $(ARCH)-ld +CROSS_OBJCOPY = $(ARCH)-objcopy +CROSS_OPTS = -mcpu=arm7tdmi-s +CROSS_CFLAGS = $(CROSS_OPTS) -Wall -Os +CROSS_ASLAGS = $(CROSS_OPTS) --gstabs +CROSS_RAM_LDFLAGS = -Tlpc2220_ram.ld -nostartfiles -nostdlib +CROSS_ROM_LDFLAGS = -Tlpc2220_rom.ld -nostartfiles -nostdlib + +# build objects +HOST_TARGET = lpcload fwdump font2b +CROSS_TARGET = fwbc.hex fwflash.hex betty.hex + +# betty deps +BETTY_DEPS = system.o uart.o buttons.o spi.o display.o flash.o functions.o +BETTY_DEPS += interrupts.o pwm.o #pffs.o + +# all projects +all: $(HOST_TARGET) $(CROSS_TARGET) + +# bmp2b / font2b +links: + +bmp.c: links + +bmp.o: bmp.c + $(CC) -c $(CFLAGS) -o $@ $< + +bmp2b: bmp.o + +# arm code +arm: arm_clean $(CROSS_TARGET) + +# .o out of .c +%.o: %.c + $(CROSS_CC) -c $(CROSS_CFLAGS) -o $@ $< + +# .o out of .s +%.o: %.s + $(CROSS_AS) $(CROSS_ASLAGS) -o $@ $< + +# .elf out of .o +%.elf: %.o startup.o interrupts.o + $(CROSS_LD) $(CROSS_RAM_LDFLAGS) startup.o interrupts.o -o $@ $< + +# betty is special ;) +betty.elf: betty.o startup.o $(BETTY_DEPS) + #$(CROSS_LD) $(CROSS_ROM_LDFLAGS) startup.o $(BETTY_DEPS) -o $@ $< + $(CROSS_LD) $(CROSS_RAM_LDFLAGS) startup.o $(BETTY_DEPS) -o $@ $< + +# .hex out of .elf +%.hex: %.elf + $(CROSS_OBJCOPY) -O ihex $< $@ + +# host clean +clean: + rm -vf lpcload fwdump + +# arm clean +arm_clean: + rm -vf *.o *.hex *.elf + diff --git a/bmp2b/trunk/README1ST b/bmp2b/trunk/README1ST new file mode 100644 index 0000000..4ab4fd2 --- /dev/null +++ b/bmp2b/trunk/README1ST @@ -0,0 +1,34 @@ + +folgendes: + +um ein Bild betty-tauglich umzuwandeln: + +1. das bild MUSS (!!!1einself) im 24bit-rgb-farbraum sein +2. das bild MUSS 128 px breit und 160 px hoch sein +3. "make bmp2b" eingeben +4. "./bmp2b -c -i bild.bmp -o out" eingeben, wobei bild.bmp die eingangsdatei ist und out die ausgangsdatei +5. es werden zwei dateien erzeugt: erstens "out", also die ausgabedatei; zweitens blook_bild.bmp + in dieser zweiten datei wird das bild mit 4 graustufen dargestellt, so wie es voraussichtlich auf der + betty aussieht +6. das bild kann verwendet werden. zur benutzung als logo zB einfach nach display/boop_logo kopieren. + +...fertig + +viel erfolg. + +damaltor + + + + +das grundprogramm kommt von hackbard@hackdaworld.org, ich habe das makefile etwas angepasst und die ersten zeilen + der ausgabe angepasst. + + +zur erzeugung eines 24bpp bildes aus einem 8bpp: + gimp öffnen + neue datei + 128x160 und rgb auswählen + das bild hineinkopieren + speichern als bmp, erweiterte optionen -> 24 bpp auswählen (!!) + fertig diff --git a/bmp2b/trunk/betty.bmp b/bmp2b/trunk/betty.bmp new file mode 100644 index 0000000000000000000000000000000000000000..94d093314370267b5b5b5388bd1aa7cc34feafcc GIT binary patch literal 21558 zcmc(H4P08+`TxmQ`!d_EwwddaWnKDahs7mox}$ zurg~2AR1@3RX}1=wNZKL-h)mr%!Cc3P8jRjWL=kG+pSGourIXe@3|m~yqK83?f-tn zd(OG%KHukg&U2pgoO92;rC+1nhhhiqGKB7clmdQz@Y{s0g#U0l$4-7d-kAv z?zso;-Mbgj>2y?DT8hfb$`FIWKujhRefi5@M*H^dLtpvIR}hQELgnS<=&N7-Dypcc zKwtaX*U-K9-iyBe^{=DK%1X3<|9-?~vk`~GLHFHvAG-hk`_TgrJb=FOjc=d>2M(Zb ze)F5?Ti^N?`u4ZKjUIgPLG+#Pdq18Qt+L}0_r33-?|=XM z=m$Ue0ea+-N6-&{_(SxgAN>gZ_{Tp+&CSi|CqMZKl1L;-DwQG(!;nlSLvpzsDHICS z($az+ee_Y(+S-bgN+tT~Pk)Nq+S<@#k3ELk+uPCOk3Wu7Diu0(=nzt?)kve!Agxx5 zIyyR#PNzeiot>zws|y`Id>D0iccY*E>}RN_rw1K5as>VS=RZfk_{A^KFMs(<^u!ZS zpx)kIq}S__!C*i}qY?G>^&ykVgpM9Piu(Ke(XnI4(DCEP(UVU;i3SD+(BR-88X6ix zPd)V%I&tCz8Xg`-BO@bdbaWJ%&1Ph=Sdi6fMK+raJ^l34=vTk`75eqBe~o_go8O?{ z{`R-%cfb1``u*>JkN)t7KcJH*Pa?bBj>g8u(D?W``r{w}h$bc`(B$MK!f_lq91i4k zI?nXl7;x z{q?VZMYFTB$mjDRzu%Ak_P4*GKp=qr{`bG5XPh|Ni&C(YbTy(0~5(9~2A*(cIh|dg-N?(918sj9z)= z74+Z#{ull4fB!?TzWOS9?X}m?`Sa(|>#x6#-gx5;^yZsyqEIM=!r?HQpPxr>z4aD) z`|Y>UJMX-M-hKC76p2L8d+)u6-hcmn6pcpF!omVtTwEl6ki3WkZXyn-N&M0dpmV85 z8m-I)(P#*i5?Y8eky__c!QsACQknD7U^kmiFB6!8kxUgnaQv{Kn6i^pu%)2P77C|x z@PXs|=^{FnLZvh4BsLyNvw;sB-^!O4Q%MDd3>*{!-My0NeMWq!MY%S|rZHFH?KF)8{84Om#!Cm|Kyh0L%#O#_&GQ$rX zKitY!OGK4BcI|5viV6#h862kRL&fig5MvjO-PkA;GPZ1^GDV!O4--Ec6tJ6wLaDH! zeAnJe@-`Zu|KZ|C{8bR-RP5TdS7fn@NF?@$EPpiWmsjj6SL!VI#Mqc#Kw*BU@)O=B z9L8mnUN=5rpBNjjDf^J|iNQBCtebK>ChYjwWF_0T(e_6;)c6muh(y{E4YlZI-43UA z-N1AQctahNBV!o}XnNkg5G+Zoz;{OCf+Z&C;Z3X=^YjZ8aea;4k<& z942$;PKHRrqZE+Hv@#|~U|P{cbfLR|N?}UW8bK#CQPL2+G5ArdK)|Has0{FP3`zl+ zOy@MoICw(I3(=66L}l=#>Xy3EXf$G5>46)AzhG6=)5&B~DPP!7S_}*nvqfrt(l`?= z1M!7YkROkRaRJSrXq*kfk1kjROdf9snOs4o6_a5;%Vh8+yzZ5D4wkVgY@tdmSKwh= zeK(WsU((G6;hV}24h#(lSQU-?OJSN#CKc|N@)hAkOGoiC0dS;JDHMKxYd4$Cs1L@O z+Zg<)sj^ayP1dm*4oTVf4q_rctC&Hr2`$C^(QsddLL`((v@)?@pR=HX&scM|{I-TPK0#ZS@)gJ^ML>I#H#(ud-BEe*`R&fm#@P+KS1~v#k zx)9_Sk;=7dwY$djjl%~Q zY;DH`LxCCJz>s)Xqgu*il$MpUMIr{3LgH8~I-RguAZ7!+2;il%ruyJQbi?q8NiH;X za9GyX#wC$?Qm{m7F^$e{Vi)h+xs}pyH<>!vikdPuA5*Ca2DBX8M(Tgbsror=z%AqO zWKA48nL_6^mQzVvx6tKQvk5neIeZbO!Z4{+t&%bE4U~V$pDY9gvT7=c%2srAC~9ih z98q;Cm9&K;l3Oi0yr~Jp+1-Q>z7YP4*()RvQ_kJ;)1xMx$zs%ktU6fh5;M1Pj4G|Q z-z1V&7Zy?&Y`#o|aZH4Fyb%6E*?RG#xS*roVz*m+j~tSzVTnsF;%}1~dyRHe2Tw{P z0lZM6<<~o7<8TK2o+ZS0eS^~dw-5_GS&kIBm$K1tML#T-S*<-s)Q8l)*4{&E2E}By zTJ0Tjsj!&I;1R;>5(8j5?E{PNKWA?J#+^CD8uPX*(kmoNGUG3VD=c;^aM0VMR`>Mw z_8dAwV}d1E`*lsyCK{Wkm2>K?%d_wVv6b^>H(wrG-KITsc=ENyf|U!Ysm%BwKWN`> zv1ps5nAT$L?Um8wI#ZvuPbQQ}`As4|MI2m64F4JQkFGCy`0)74ONw7NKFDvf^qX{A zSyh!-(V>%T%lE5g{r#4{2I--O>iy-Mn)t{UXFpY_#l^c~JVj8PwL8))BucW#AL&x` zwaaA^K8;#h1u?OJ2Dtqu^Wg@Gy1I~5%uIwHvHKImR?f6oau&T#oZr~7av?R91%JWD z#-tExNEj4`NWdB}DB}|@PAyJYb zk#dgW4Dhb%9*jZfi#SXQ1p|DI#UvN1d-l=F*sG==8QTAvCl(f8|H<8tZ+AvscqIST z1X}tz1vin6oZcss0ltLC5pgIq5<@GM$yzKLnMB&NpIv54j{YX*nP{?mJ=_PUw(a6 zaB*?0tnfkqa%qM{3hq)i8nv=jYV{Fy6NgHolkuHX+r&n7=r4+;XUqE5-rI^CpkF}^(S_nx~?#d4K%=b%3UubOSjROY$}yjumxg0OlLLA!6vm#h&Was*~q{1P|OLU`fL@lt$#2){7tYv*~gp2+gL`$lK^5=nKO3_P&NjbuYgQ)<_a+S{t7f zhh1nltQX(UQSkUM@XAVI8oUL9&7MP|4in%XQnO*@=OXd1?s2VXR*K2;$CR#9ti$vv_hT= zf)J^Qz*qIMZK>eEau)jMAH3$W+Xd5EuEvYA$*%@{wUk4nkcu$~!ep}Qe!EVjR&&xi zUv~U8ftN03!52fEqgL}vsg!M1+MXWZ2D4ZcB6U+&s_!ERWCyxL|A)h3GvHU3(zX?9 zjexI~LhK`xs@SQnKgNGH{7d$Kemau_54)>q1zQxYFSwsN22OEa-`=7;CIw$RrRLz;Qv4PKS77F7v|Pfog^pu!Y$>%qTd{}&MmO8Hvt5ovllf@#g5b%>9dM;PaYX6Imy%&RgclOC2(62_t z7mx2}SMP7BE-hq8q}8yQX8hXYR)+>Ngh`&wn%vgHXI8^l~Z+Pg|Q{dlsfX)Ig(> z>Fj#Byj@qtA(K0o>#R;>Bme5R{z+VVJ7deoZ(2==$iWI^cVjgeow`RYWRw;c(5S@% zlU+=q(btI|<-!aMj{Ya(SegE(;{yi@tXe3P9XX;>X+%&~@VLI|;j$G=rh=jTi00r%iR8l#bTPssA2Fh zsk}qpE$Gu2t1AT5_2OTC`7N;FlJP<&y(h}j^$+c@kXJFJ+H!`xdcQ&^?`ZGSTE*=h z?7Y_W+Od)Zv6OTBb(a?kGxqwGis=-i(Xc?yU~9^0BHsQcg$y?7nft7AQ&SVUb$P{W z^=&KU)}2~Sh{(aCev!ObTt#D7(|AT*7l?1}w|AJDWXyHSe=*FY<1Z}Wa&e)!n9;;w z=!`m(xUWxVwJS`p)W7n?arJE%1C*uCYC=RV8kSe_iunv)1GS}B)+9e{()ISXcj(kc z;!#7!BMa?|DNd&c&ELdivf2Cj`=u(tH}_kO8d!ns?c=Ok^h>()Vt}&LNusipjD{Pf ze2I|XB9!do^Vuf3-Ky1KvLn56ai+NkaaR`F7gL-GA5%+U#(C(Fw6TT9;qc{seR8Sn zkT&U2bjn>91C*ss3MC>NZU=R@w__S@ZzGjVu3=ROnqbE+$ChE|U;Oqgv@fPO6aHbA ztV=;G`eJpJZ51c@I8A!(m2h@4Yqt{POd$jsV zqY*cIhidoo@YGFzNq1%-|I}3<`J%+~Tm&w?+k3(1Kd~j1L}VRZ@U={vZJxkPvr?~D zHruBI9;d~q98Nq5PeP6-)A60xwZ61cdSE4)nu-$uXyPxyL8x|e%Hx?m>mAXX?Y61u zS+9F~+Kmx&|K&Q#Or#QBT)cNSx$GkFL-^3jx>~4i+~sly0@e||L1T1zU~l!TYkE>` z2&J!m5qurDkFl_HqXTZtplY zyj&$&{0#W_E~7*z_h0+$axN_qqZ9Ed2R+^)i7yP#l%NqpV%+QYdVG^=$%#`luv>lH zb80#OTd%arbE|-tGHFy7IilIO-+%3IzkdAwPoV9d^y|wd1chi&Ht3mhdWLi`zk!`K z;Zas=ON*rTV0{IPe{e`~kgHQlux5|j>(ncK&<3eIEK^%fytqBS@{G`}>a~{NV)0ja zNa2Ak_g;??7ytwFS5#FA>g)MpdEcmSE)*QC55jKv;bx21?bKsKtM)|2SXqW$NxZ53 zO5vS*c)FPkjk8iK7XQP(qQNPb#{(^{H4qvI*5jxBu>UF)fxT!!d~{S6gkAOXxC9!> zZ4>H}x87yLPsUg)O(-0%@!-(krabORtr2F};Z~435}un2&ILmu|LAC^EfNXMhwv89 ztP966QK~Ci3t(~ag?rYv|7d3mV0#=xLk^EyGZ0z`cXs*aBO!R3!D+MM{_yBf=Nzaa zG(W7Eo^`vNdTz=d@U`)E=%(xy2=nXI0sgcH@EtBE26OyQnR6Z_2FOs*XLFi-odL+t zhv${LGXd||n7S4od?y{*$rD$?rhjLz0PqW)Mu!9N4F<46w-dv|z8ZX<0E|Fi2!+nc zoLx?6|8RKTCjzhRbvP}xcycU~o%{u_5bY26(Dnh1W}3hsm-yzzey}{)2N~ZF=^M2T zhvy@}!W`asDiH9x$A&~WTupSu3!-GN5W@%ky8;0b7r21eS}f{0*&G26;=?bDcMB9X zK9D~$9}4N91p;2@n7(#yt>@p#fXAO+!vhelINajE-7|ROiRM$Yvu?LnJx~Ys2S*tC z;GDdk$)u2F@NUce+8c-_TbXyGa!(RmPo(z3l?c_KXEBUzdKQweulfF zcntq|TX4V_n4NYxC%JTI7-WT>?++iYW9{8bDk?g04m1FTzDDcWz^rS`DS-zu1ov>H zlU;n4cn1%mBg7?NPKF9gMR0f2SL2v+pKTk8gmgx*Z|^{*ZEk)(XtMg}LZ=0+Jtezu zV={||K_Q{@=R>&g)EVG%Y>2n)htkRa?=$s(e(RmnCAScl-dgkdTQoW^0=o++aBw-w z;WIOn2RjMZXY&O?=c9s>GI-7Iw%xZK1QQH}z!7%|r_W5g9k^bX=mY8a-_yj(&RC1r}K9`6VGJ&PuPD*J>r^m>0(_BR|bwBoC8~n9g)*@2jIm(z`w2ZHr~1L z9N-%;i`fho=pAZH1mx+2FN?3dxHXH>(VG*Sanh?1;}78L^q$#Mx-en#A*IzP!RJDR zzkv?W&SJ*!Nu<4{rNb~J%;`k7DctGtddDTp&qC4(-~Oclth^kr`pqLZUtvhUyix-A zFyX~Kfm6D3pzmnd*K*ccDNwY*dw0i=E9z_SBk*_csML+?x&XdKI59Ql@_J{yLkH($ z#-Gvtk0W&B_ShDjd;h)ymLWypM|~~ee%sH1!v%jk+!YuoDlIM9QBuNUmE1?*?=BKq zyiO|?@aYt`DHq|SW~>MCMEA?o|LphXZ_3%W@3FP!9t1mt{-bm4@K#?l4*2t-$eeQU ztakSUWo1Om$BvTHW|!OHaOzu>Ev_lt?FA2L6~PFQU?78B7h4ol;k<5S%Avzu zs@+bvwz<8Xt1ue%daSg?F#%!W_yCJ%oC0t#dk7M}GiPTEvXlU9ZTt(wA4DtqB-7qj zt=-{(2wTF%c-$7_DX(5>IEmv9??5ScWXcT;z~~$}dv>O!GvW7$TZvG%2vb(3fO!e*F~m2wRRWiywl4?xSG^$ozAC(E$QiA*A%e`BRoxspsx#c6;G z(hVG~!&t0ZWh1Gg{lu_g(C^}UCLK1H+vyw|A88&81kTRr_^aa11Our=AwPRX(yBKr zLxrWHB@(daplCa)K6YwS$K^JPWkWvKu~RIg5#UEK38t|)nl*ZZsB_h8KMD9u_SYp? z!Tj&1R??}dg#6Knf1r)WH8dBsH+BY{t*mlZMM;HrW)fp^g+eZiYcygaQReA)Cj76) z=G>9M$fF0ymtA=OD>3U7lk$s<&RU~HJO^P? z`_FV08NHLr;bX^=#+?Kw31TbfM`O|F<~@S$KfbcK*t&8dHMK+n#P1g5Y$j=@rpENm z+&XezK5Jsa4Qn7GR(t#4;4y!ooHgibZ}CbremIdxKQH4i zguC)eNLkn-RwBssZVsRo!L(|WQ?@<)TrJTQM2#9?C^GpzW{!dOd$ znGk2|m10nTg+X5-;pXS%!j8DqAz(d#DRr0dgEn&Rrrdmz5Vwz+mCEL3qYLn72z;+z zZ`JBrj2ee}Xkc${o)fQ0-G-1tb3NHOzMn$|)#g>Ig;QYn6K1`xd1Th>@yrl9@S61+ zrNM5tj}1)e>|Dl8B-R6%Qa45-(uMmuIXSs`B%_{LV{kyQ8#jMoq1G61PrIEk{bGOh<$Lpsm?Jo>$1EM*f!axMgI-t_Y0D>!1nO*j{0Eb; zQIH@0a`P1jt@0ELHiRYPntCzZXSFdDX%L8Pht{nPn=U|t|z-pCd35N z@G+*Ge3n9QHXBCZ<1`Tc!%K)pJs97Z*?e+raxbu$lS>xQt@eQH0Zgg8jK9!LzytZ5 z-28k}5o<(apRyB!pwns8X!Ijorp9@Y5Fb>OCtlqLQ)sRyyMpg$5*A1>07qWq36>Fj z5vYA^WNN}ZHdIF{IhdbIXb6}r2yATo6I?{CTjJQn|INCt{1T00Y;3~JE#lhj_OVHR zUJN~F6UnBa1eVwSh+Eeqa7ta`_V^K(rb6tQNZ*fBIm0u1e zu%ff2REkd5lU<=jJcEuseT=}TmO@dyU>Q9wdZO>uthPOZzL%kuyAn*q{w;(| zTVuG1e=%i1gA_PZTYrP_2~LP{g=kxXiI8GT%-|9Xz?m=vc53jqQS!&olhgsi0Pu!A1b3NG<#0*&o zO=vlsrH5S+Uk3C0pz*uw#d!QtM~dG~aJwFXQ|cy2taXM@+bzXA|9|j-wUf}kNBVcHfBWvUzoX>(e&@`;6zsFl|IX6??0Ndfyi~n#vGOA_vtez`-w|V6{gz1J z_rL%Bf6tPcO*gs8O%6Z&@Z*jy;7AbfdCz;y z1$D+XzBSxu9UV8!Rqp!w*S}8dANj~fI$q-%*B}K)`J3MKrjEp6UVQ9hA2Sg~_=4H6 zw&w3DB*)!*!U-qb_rCXi>QkR;3Lqc-zw(u@jK8GBq^OC|e8e*1*c$G$jy4ClH~E*o z^ri4p@>|~Wmbbdqt?0bt9q)L@o89bYG7$$`Bt81kkN(=%zBXtg%!ai!fA@xY^C|fM z$28sNKKEgT9`>+@J@c8*eDRB4{H$j^i$v)Ep@$x7I^ciNi(ZtZ)L-5&Zw>cZN1J5! zCeOCBKd@td%rvn`{yzNS4?p88`jqRT{xn( zR}kAg;~CEY`T5U({t-tUVG7*tcDK9w)vq4-pC|}<4*DY>`N)4w)6qvCZKm+T zals4wur+pP*3pF{+KmeMr&+#00{kgYdCEsW`q3|a=}Vvg{O7~}gCG20r0}5+edqxX zct8Ttg`JrVYis^49MNu6n9YDwrC`J79q)LDaP*U({3QM#|M_Gh zg`L?N?z4{ekEj$?wQfEbTbKG9oO@L}MDVnyJ&g!XJn_Vc;1i$t#0y{e!gs#&ov(Y{ z>zE+Ms@Z|L?I@fLYis`QG>}$##-6Q!;F6bAbDGq;WtmeqrUggZZo`2IqVSRxnN_l& z=-&6f_e);#5&}x){${s^`>dn=!znn1PXn!hjy&>6+9=65wOwp;z}1EA^j9ECtqFCQ z8orpf<(DnKSbnD-v80G+!`hm^{aC`Ei?m|Gq_*pUvNE!DCM=ZbEqVk5R5OuF=1Bij zu%-Ose0x6DydFgD|8ts1nQPWabEfpPwl&;m9qk!QT>>_ok&#G2vP2c1+d!~aBR+(V zP^_3>6sxG_7Sn`W`e#SLlCKuXG@+(u?M}Sl1uxJ7<5Pw%UCJ%hy=G=MtgZRm?EKuk z!CDGUEY9JFqe|xy1`7XLx5`HZ_)D1=*0xla6zKNcmQ$#G0y2X#r!+;Nmc#h-$Xvj? z-t{hZBvN4R`d7hQ!+qA#9x`1l(7@%R|CFC*O7DF+c zb#(41sxaIrupq?#{F~qW=C{7}t&a52yAu5ESl<5jx2OM+NRDO)H>#W&Aq5NpED=;D zPjQMc{nutm4S&gv64a6{Yw(emR3i&gYc-|8*|4_eZ=s%>F+d4_VWC7PMJ0lBW*L9m zmCt+L^FYSrwzs|QTi)^(SD78mT{S6yVzR`LEPR@BY(B^-(Hwj1u|x^AdnvzJBUyZL zAN&INQ#l;zDOxkRRO416f(nh&?ACCfb+k!iZXP0Q+oe=cCn0V#zTFz`vyL`VFU%8x zXdG3srQw4{59#NpKJ_V^Hke~*$C!cgGM&95CKV)J8!Or?k%d!J=2UNe$RXadBW%MB ze@T6WO$7WgcS+4!Q{<|rOR8y&1Y_Uye>SYG`MZ#LtAdd-BaF#WM;%2)sVdlaygjE=JM{mDjMt2?b&Larm+X~+DGI_IpYqN)Gd?0!`j01Q zj!GsA>4OfU|D?eFn*w~j^r9ENNCh^E@d00+=_BsMMNJVfgJfq4r026?ZOz{v;5%K4 zJE*Is0|F39;f$CPB8YynM#RyVIvY@@xSc)3cWQBNwsU|~|%HXFk{9}Uf zG)JTWcS(lepmvP@<4^gu$%&T>-Wt81b+iR@#Hj!hVH`+71`Vofm&UP~=(e34>Maog z>4caZ*cQs{<0X_|HI_t8{CNTQ!VbP^B7Bv|2z<2J zA_hlgZMsp-T1})^>xI*5%_ErBR^f`LU6?~lSY76V@}r6#?A)jX=4)Q_npeK^mAo)$ zlvYU+VId4A{x0FKrlY$c)ea+rKYz_Z6#PV<#N~vT4e3eZ2NAr=42ppj%0^}tbrzydoT&On_gufL2B#148 zkH4b|Y!3Kzo=_MZYOiK%&!^e*orc+8ex@^>>C%_J^jXewmL_d^9eB`#9`v%8z08X8 z*T4R?M(m~ZH#PKXv-9KfrT=Alke8Qm3ryx(UI}`U0(~|*RO2jc!MWt9oaQ?c0XyUN zSSmAx%Mfen{e_+-cM z(!K1zkxPOf{x@EL!C$76qdLI_@8|8$<6ZL{`R-tJvB>K&o48m{yGUi>;SOU z>t6S|&w0*sh#*n! z4}bW>$3On@7ryX?fAyZpu1I}`mkBjh6# zx0^EfbGx;-vrJD$5OB*+fBI8i9&J&O-g5M5$ESZyKnw7D-RoW)(749??^WQO;}gdrMm2HVn2pW;4m7X!4|W5u zHakBq4}RhwRs}t(iyrerkpQIj0vH)b#z*|DL`~{V)#<#Ti08#$o(PCfBW~w4hAO}Q zub1$bzx?ILKK8NJ1@z}S*SU^$@t^wt5(<^}#z z__IF>W9Km!{J4b(IA0RU^wEMk^;V_%xc>aQ;NWcK%PF*y1^Buik#_orv&>ce1&7$; zZx0Pd@F_WoFg}uU@aex-Fy6MXKb!(3N1K6Se3BFrigMFOzTPS>(}$|F7C2hF^PTT} zv5Q?ye|!_<=Rg1X-~RSDK0*j|-t(S!Esv;1s^_a@@W+{+Gb8jCZPr6c-m?$~_~B3a z8Fr8*-dP3k-DMUOe?oMx@)2FCajlZ^MwMc8O^yCs_Oh28N1w z>(qt=J5&4>x}DUt8S9sXzp>!8 zDP%9=@|VB7ZNo2q@r!F|x!Xwfd~_!Ik81Hxo>4+xAj+I_zLcL_vMy$tB*Bl!$IBX0 zAdASwU3tkeu0P!YZg|PKVK(o=pZ?>?{x}9BL&W&gfBbn~lh=|8f2kxzA|fA&!3lrH zhvzNh(|pR3`SsG?iuEu4j7C!NPvlSk!DoEH=OBuIL_qn$=X~8|?yx@^(b|%z=T=)6 z|1Dboid6)bf`6tX%I`?w!58^h@LK=k&$dVTU4@#e^St5;vjBGdWmwu(l%GV_!e2XE zwEo54=B)@5#_$JIKE|K@;dxv9or*m1_rWd987mU8c3_C+YW4DkYvI3L>tF6N{E-ZQ znru4Q|8WH0Ddm^qeAU69=1V-Ug){Q_gU|Snj(j4cwea7r^)LP`57bl|WO&(g@FnHh zQe%0*my#*|Zo%Iv{x;l5WE1#r-TIg2Bgw)NBhriQ={nHt6oO|6O z;qSwK_^%>@wdntLt$%&ymH`pWP~&K_U^4t=fGz&tDNM07{~LZZsm8%bygI)S>^BpZ~>Nqy)ZOD)K+g`ESwsH~eY4I45x?yn=uE?w$kw zlppO_9{erb@FzYVT-1?0&*h_?Zq2pWAC3I+kAKv7e`_}AzWUX#`gy4SYW-KcLl{~j zh7@Yjf1f`Qc}n50(2Ce;uurc{cKE$~$A7x;Jsy7_oW|eWVSI)@x?8`0u*+Y4_OqYu zomZ>AkE8os+?(F?rpG<*ah5#XgsnMSE3ImSPP;=GS|a`z?PKoqCtj&!^oKV&hc$;ds{yI@7tYpMj&^^D_+rdT=qiG zfBy6PfR@OOYJKK2pV_IMWy*)rZq-K&e>TKtcqleO&UD~uav^DglZ zm1fmxc+@@%Ub;c~@dufoO``Bl9feE@{w{TcN1ohmOm z>V?&O&hsAkxW^BE@PlT}KmF-XD_Z+zYsv34kpA+(cjSC2Kbv3f75v2coG%x^^60aT zxX41Dyl6Z7V-`>_<@A4}_#2lml2fe~E^dqSZ56I~+RwTFs(!L66dr%HC9Wz@7w*<$&j1ntLOU(_g{_v;}5&O@lcc> zf5sQC*^{ng}p?#mS-(9sBWF`xAMgqaQmF%1Q}{C)L_-$L5#5#u0_V5@85K+o zHHpL36+d&;?D<}zTg$VWogb8E|C#YJCh`)AD2ZVqf~>8Cm$u6Dd&MzX;3t94@@s0) zqkAf^g~?tv(leI+OQ7+ps3IwP5zk2QCJ}_+DE1SewoR;a-~RTun*s#EQ(Gf&$^uvL zEsEC?_E%R|N9UJMd>7v5pY_&9(D&VUU%&a|YezP3eJOkO_FFAf&j)4LAN4s+g#A2} zA7AwgIldn5Cs_RiE_?FEH@*@12R`tDzAzG>%lO+=G$_fQ50|YPA!=&%*S^*H*60SE z`thZ^-~I0O+Qqg5_iN(NZjybQH@x8unA3QB{~@Gt;V>3IOu6n8VAGBcI>Gec}_J=+}cMB02hK8K>eO z)m&A_k6IWYxwzzG4}u@9CAFS1^mH5({juR=4es4ye+&7gvi>@Qu675ALkgRj%D3u6 zN1y3=eta8SpAhiN6;$1S-330mAWt-z8m_v;UXg_)!&B5Je>A?L6b6mGD*N$#9jnux z%%1TFmVIC@@|m<2_BvIKpJn-N5=wZ|aEY}KfA(KQMAco5bc{4f2@#N;z*RL(#TM-( z>w0KUrUzZmCC0GlYF$FZ=hEwREt&3E_(aU<fLlbu;$c1Up3$e;{M6w$zVVIsz3+W~f{DUk=t36~3kiXAdtCcH zcQr?cs+Z2<`M_tfX|;!%cP0YmOl8$1f*=teKCuMgxl9uYaPGi=lOb9b_PZqPcd7-e z0~zx|Q#h+h=gkrAXBK!?CJXVEEoydenS9SkdoFpg2=C-Y*SsYDWFdFs%cr{392A}b zg$ejcQE3LeL=gUN6#s*43skb~!dwE}jL2>S>3~Uac#^DB6=akou{lH_7RvOA2*^b@ zB7$c3mdW=(?!V+iJ|^HTZgC5H>3(_D2d+2;LpF0gxBuQ%uGXMXjWMD8$j4n0L|Jv+ z<0Wy+E$SnQC*$KQz+@pQk%BHq(?p3n;7cZ#Q@T{iC3B(7ow>kk*u*n-va9YbnOOzJ zX>xDD#1je|HJHl~fsB+4EKE8Pm3hHD&>#Y8sY`e=S@Hl%C`rj^Q(hh7kOY>Il=-5CY4yoL1xZFz42}ok&+8F^o~X$? z6M;u)q=$Sitqx?5TPXg~|L`xH4+VoGk%dAj{6+GdCStgWc9<7%rtD8Wq**7Lm2y>m zUcg*nZNglIi43NRQ3Bap14{$Xl@b)01?C{pxT=12IGNUQkLj)cxEc;h^uO#6QxgaV z&IltmK8a~W#M|C;q!LCpw6A+2FW>C}>QjDL(E z@aK!|{{&_MmqC@~mmmerazLayeNjL8rkGa%q^3@iL8;^DMrKMMJkcheMAn`~8Hhmi zWd)~A0&RA?nI8usclphSSH0?0){MUYYlqzDl(bw88i>zn``SyDtR+*OHz>4Q{PP;c zka1?3C?x)DQ5>;|)YQ-`DvD(3uyzt{vP;UnCd>cVX;6~U`A-ZbkkNLR)V!TESs^=k z_~(h??o{Vd&MtD(S$e&Q)aL<|$AiSn}sTta2d+;t#k9F4UxQ z%y0N3S&8D|&%)DulZ80oQdroLNo5(I2x9r^`3(Q5CWs4`_+lcE*tGE1l;okzAhl-( zwa@M95Assh9SY~dS2zxcAKAP9^{-Eayj>BxG${Pi}GkM9|=MZS5_41~NL`_{L<)sJ!X)h2&Xf$xaFn&8tA{ai19^n6GFXP@@*nIA!>pRMx|R=+~98=tvq3aj`VltcqDM?T52 z%Xo`FDS+=(HCD)`y;)#cglar2J#Sk3Qu}0xgQT<>w!#UC2v|I7uR%wbVs-+bTqOL# zCpDeX0e#lhxgux|Z7cGvQ6NkSxnK~$L56Z#C{a!WmsBt#Bv|OGOEi<$j*+MT;`~a0 zlZ!+s3dJ*SVb-t>c}MP*n{zt@O9>H{BA_YzIq+M3Zk}!h^JXWTolhQzgrF$lPZl(s z6qE}Rz!8*6L?Ex+LV$GGd9y&YV?`__!^pEjuv^da1&*ebX5kHCEqH_!n^T(4`v<<3 zqxq(ZdDrc2tE4%!_2zf`{Ywpm{sR*I^y4;M9vX&E3iOkG=FQe%+12+i zH3}{jXTZ_JU!KM~btD3)IS7f8<7r1inyT>8M8LeW;V>qEK^1E4XwyUx>Z=^u0WM#s z5lY~5E6f`Bw&}p9`OCoHRsI6M-FyF1@MVlwU@!iG!s}hknPo^NB?N)C3ityKsSM`8 zGVCh2YK}nnfe(DZ1d(zh5s;3`aW14;B8X9PFP%p|@U>}kgU4z1ZDGEtv0IVvj>wSB zHD&}K&Jiw_1Va{{slnW&U{APO+sLu)CIYY$DF93PiGWv4A&F?pEU-o(f^6|+OD8%n zAA^rP>C^nc=We>)>o3^~=FLuahhwtSLn44B!3lsw0H*L*LY^^U&pBCOZ4gPEf>=nM z74h8Va3in!VbPvn!lvYX%3+|w5`ZDJ70NIzzWM0;C!F( zgeOGpi@%=>;1g~8Td=^c8etJoq+s>RM=&PtWu{_t@Q(;w(vAkn6m!*JpPHPB=Ce_* zjxamb^HrGJVe>zn_P0Qb`YQ~*T0O7KB+i&F#83r3^)2z)}f4=Qt#L_zaPWKoIIj`D5@s&W0*~G1TT)&t--Vzv?r9HhC8Q z!U+O(%UUwc&Q~6Pc?!vxFe8bA#GE`Vsz4zuk%EaJM4{>` z`hr6t0(ldG?8LFup7`?U>dDZ|XePE(IJN%UfANc7T;w7b>8~^NYIlGW?Vl!&01#7v z2omQ21sbbP?ZMB>7g{Y$!rT|@98C(V07ron+d^Kk`Q*hkNiwQAMnmSHQX-jh@s5{$xvpO zKoc0}C6_vCk`d-i79+1F`|rk>Catkcj!w-QQeetVd|tp^u{=gC&F$4Ph2xkAwETF2 zjF=#1EDnEmB6yop*K zZ5viBlF!V1_`@IeUl67RGrhm5p;x>7m1NW?r7E;6t6ItBnPO zi2!X*mg$yKm~whd~&xIwh=^816&DJmlP62bY3Cm;V+XE{^X@WT1|){@5ts$ zWWh~1Wy<79hX}^4!Zrcvpg!!xUpYGre)tD9yb{zz;HZ$2)75O|gm!FB@-9h4MnG=S zAp1iQWb_n@&dV#DhFX(Dp34Lcb-|l}bWk7W@@ISm zpDaHn75s={A_8hJ{^4zjz%0ntrDFt6jUP<{p}7Oc@U{JBGU8O+Y%R4_*GOwC^K>Uj{+On_QIe zkNv0i_&AaRs(2EC*^$L8gD-*KoC`#d%9s-z%_m1CktY7aRO_AaCw&Hx8vLu-ALA7V zf=~&3%1<+eh;U&}`5mRWgScAap#L#J;qOR|X}cRE7gya2xM0;$3o=T;Fa91U(R`LC zF>qHydP)ZA-X>ITjm4-bzh6(4S|XtQh!s5<{NsY5j`4}LcPtSw>~0Kyb;^UMDe%o2 z!Kc+3`_IMXp=KZ1wfeTq=_Vi@)Q8rf=)b6gGRF#Wz7i&MlKp3~SsQ+telj3TcgRQc zqx>a;WK@9Hjckz$iBz$5uOuTVircltA%(xk*=Z@~yZl5LH1lUD6ZF%>1cgTN&s;#s76E$Y4oUwQK zK#4mrBT!8uh{z($i6FkiRgRn6m2x8y$eSYx{_AmsZVKcT&+<{|ps{a4<)S?|WB)%u z0>9wM;6n-$zswzEbxe~J7de(7$|w1VL2r%MdjMA&*ivElC07TB8xc)W%FS9PpG=d#5at-A=L-d4f-lX*|!W zCu-bAgxE>PSfN(;x~GH2z6q7PLui&5GS7Ix0SB~zw@$^4mcYz4jCfLM79M1Y2mq(* z=7^((t*Ifo#OC_J=8v7R5j#)SO#%Mb4pL?Z{wljfB5s`9phjZ$ zEkhXpC6!;FHv#FOJ}l%<1L;3X^bnJ-6z~VO_&ZH97a|2W+HjN4>=5mz6I;am_=G_w0-z)%xDR9*>rzBz{h!6FymYd*zi*vzj zK@Q$3RIQs=7@yni$->*#MlTouf5pp}R zF7I=jL)ZkQgZj|yd^caTU6Rjf9V?R?Nx>Z9AX=PvIt^;a5=SILh*o5IVz*2EC4N-f3rN~O$SNjsh#Gdm(Onk(m{P#W@sV2ux5n9 z9M!Hxc$S7Yfw%JNRPyR4pFCOexy_CZ8v7{SYQVODw@%d*Rw19t zqAZ;`o&N}l1R7^;B5((!kXM;=r2xDCBZ{tCl?#M3uHr3dw4#2A;kC9}XW z3s}=ZVwbEVXgJwRMR)#Ei5QS-BnP)ZY3>y0;RBm>D_ws>>b}Won{AP#3 z))Vn(`A0int!)C*L49Zu*rn6(r~f|CYt?2hm=~>Qb;Z%Du*~V8v2Q}}o#Kq4kJ=P5zrO2mb~8@PBLET@wHR literal 0 HcmV?d00001 diff --git a/bmp2b/trunk/bmp.c b/bmp2b/trunk/bmp.c new file mode 100644 index 0000000..cc53c7c --- /dev/null +++ b/bmp2b/trunk/bmp.c @@ -0,0 +1,219 @@ +/* bmp.c -- bmp write/read api + * + * author: hackbard@hackdaworld.dyndns.org + * + */ + +#include "bmp.h" + +int bmp_init(t_bmp *bmp,int outfd) { + + dprintf(outfd,"[bmp] initializing bmp api ...\n"); + + memset(bmp,0,sizeof(t_bmp)); + bmp->outfd=outfd; + + return B_SUCCESS; +} + +int bmp_shutdown(t_bmp *bmp) { + + if(bmp->map!=NULL) { + dprintf(bmp->outfd,"[bmp] free pixmap memory\n"); + free(bmp->map); + } + + dprintf(bmp->outfd,"[bmp] shutdown\n"); + + return B_SUCCESS; +} + +int bmp_check_header_and_info(t_bmp *bmp) { + + dprintf(bmp->outfd,"[bmp] magic identifier: %c%c\n", + bmp->hdr.identifier&0xff,bmp->hdr.identifier>>8); + + if(bmp->info.compression!=0) { + dprintf(bmp->outfd,"[bmp] compression not supported\n"); + return B_NO_SUPPORT; + } + + if(bmp->info.bpp!=24) { + dprintf(bmp->outfd,"[bmp] only true color (24bpp) supported\n"); + return B_NO_SUPPORT; + } + + if(bmp->hdr.offset!=BMP_H_SIZE+BMP_I_SIZE) { + dprintf(bmp->outfd,"[bmp] files with %d bytes offset not supported\n", + bmp->hdr.offset); + return B_NO_SUPPORT; + } + + if(bmp->info.size!=BMP_I_SIZE) { + dprintf(bmp->outfd,"[bmp] files with %d bytes info size not supported\n", + bmp->info.size); + return B_NO_SUPPORT; + } + + return B_SUCCESS; +} + +int bmp_alloc_map(t_bmp *bmp) { + + int size; + + size=bmp->width*bmp->height*3; + + dprintf(bmp->outfd,"[bmp] alloc map memory (%d bytes)\n",size); + + if((bmp->map=(t_pixel *)malloc(size))==NULL) { + dprintf(bmp->outfd,"[bmp] memory map alloc failed\n"); + return B_E_MEM; + } + + return B_SUCCESS; +} + +int bmp_write_file(t_bmp *bmp) { + + int fill,xsize,size; + int y; + unsigned char buf[3]; + + memset(buf,0,3); + + if(!(bmp->mode&WRITE)) { + dprintf(bmp->outfd,"[bmp] write mode not specified\n"); + return B_WRONG_MODE; + } + + xsize=bmp->width*3; + fill=(4-(xsize%4))%4; + size=(xsize+fill)*bmp->height; + + /* construct it */ + bmp->hdr.identifier='B'|('M'<<8); + bmp->hdr.size=size+BMP_H_SIZE+BMP_I_SIZE; + bmp->hdr.offset=BMP_H_SIZE+BMP_I_SIZE; + bmp->info.size=BMP_I_SIZE; + bmp->info.width=bmp->width; + bmp->info.height=bmp->height; + bmp->info.planes=1; + bmp->info.bpp=24; + bmp->info.imagesize=size; + if(bmp->info.xres==0) bmp->info.xres=2048; + if(bmp->info.yres==0) bmp->info.yres=2048; + bmp->info.noc=0; + bmp->info.ic=0; + + /* write it */ + if((bmp->fd=open(bmp->file,O_WRONLY|O_CREAT))<0) { + dprintf(bmp->outfd,"[bmp] unable to open file %s\n",bmp->file); + return B_NO_FILE; + } + + if(write(bmp->fd,&(bmp->hdr),BMP_H_SIZE)outfd,"[bmp] unable to write bmp header\n"); + return B_E_WRITE_DATA; + } + + if(write(bmp->fd,&(bmp->info),BMP_I_SIZE)outfd,"[bmp] unable to write bmp info\n"); + return B_E_WRITE_DATA; + } + + for(y=0;yheight;y++) { + if(write(bmp->fd,bmp->map+y*bmp->width,xsize)outfd,"[bmp] unable to write image data line %d\n",y); + return B_E_WRITE_DATA; + } + if(write(bmp->fd,buf,fill)outfd,"[bmp] unable to write fill bytes\n"); + return B_E_WRITE_DATA; + } + } + + close(bmp->fd); + + return B_SUCCESS; +} + +int bmp_cut_grab_bottom(t_bmp *dst,t_bmp *src,int dz,unsigned char m) { + + int off; + + dst->width=src->width; + dst->height=dz; + + if(dz>src->height) { + dprintf(src->outfd,"[bmp] cut region greater than image height\n"); + return B_E_GEOMETRY; + } + + if(bmp_alloc_map(dst)!=B_SUCCESS) { + dprintf(dst->outfd,"[bmp] no map memory\n"); + return B_E_MEM; + } + + off=(m==GRAB)?0:(src->height-dz)*src->width; + memcpy(dst->map,src->map+off,dz*src->width*sizeof(t_pixel)); + + return B_SUCCESS; +} + +int bmp_read_file(t_bmp *bmp) { + + unsigned char buf[BMP_H_SIZE+BMP_I_SIZE]; + int y,xsize; + int crop; + + if(!(bmp->mode&READ)) { + dprintf(bmp->outfd,"[bmp] read mode not specified\n"); + return B_WRONG_MODE; + } + + if((bmp->fd=open(bmp->file,O_RDONLY))<0) { + dprintf(bmp->outfd,"[bmp] unable to open file %s\n",bmp->file); + return B_NO_FILE; + } + + if(read(bmp->fd,buf,BMP_H_SIZE+BMP_I_SIZE)outfd,"[bmp] error reading bmp header & info\n"); + return B_NO_HI; + } + + memcpy(&(bmp->hdr),buf,BMP_H_SIZE); + memcpy(&(bmp->info),buf+BMP_H_SIZE,BMP_I_SIZE); + + if(bmp_check_header_and_info(bmp)!=B_SUCCESS) { + dprintf(bmp->outfd,"[bmp] header/info check failed\n"); + return B_HI_FAIL; + } + + bmp->width=bmp->info.width; + bmp->height=bmp->info.height; + + bmp->map=(t_pixel *)malloc(bmp->width*bmp->height*sizeof(t_pixel)); + if(bmp->map==NULL) { + dprintf(bmp->outfd,"[bmp] malloc of map memory failed\n"); + return B_E_MEM; + } + + crop=bmp->info.imagesize/bmp->height-bmp->width*(bmp->info.bpp/8); + xsize=(bmp->info.bpp/8)*bmp->width; + + for(y=0;yheight;y++) { + if(read(bmp->fd,bmp->map+y*bmp->width,xsize)outfd,"[bmp] reading image data of line %d failed\n",y); + return B_E_READ_DATA; + } + if(read(bmp->fd,buf,crop)outfd,"[bmp] failed reading rest of line\n"); + return B_E_READ_DATA; + } + } + + close(bmp->fd); + + return B_SUCCESS; +} diff --git a/bmp2b/trunk/bmp.h b/bmp2b/trunk/bmp.h new file mode 100644 index 0000000..0741cd6 --- /dev/null +++ b/bmp2b/trunk/bmp.h @@ -0,0 +1,85 @@ +/* bmp.h -- bmp headers */ + +#ifndef BMP_H +#define BMP_H + +/* includes */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include + +/* defines */ +#define B_SUCCESS 1 +#define B_ERROR -1 +#define B_WRONG_MODE -2 +#define B_NO_FILE -3 +#define B_NO_HI -4 +#define B_NO_SUPPORT -5 +#define B_HI_FAIL -6 +#define B_E_MEM -7 +#define B_E_READ_DATA -8 +#define B_E_WRITE_DATA -9 +#define B_E_GEOMETRY -10 +#define MAX_CHARS_FILE 128 +#define BMP_H_SIZE 14 +#define BMP_I_SIZE 40 +#define GRAB 'g' + +/* bmp specific variables */ +typedef struct s_bmp_hdr { + unsigned short int identifier; + unsigned int size; + unsigned short int reserved1; + unsigned short int reserved2; + unsigned int offset; /* <- 14 + 40 bytes = 0x36 */ +} __attribute__ ((packed)) t_bmp_hdr; /* 14 bytes */ + +typedef struct s_bmp_info { + unsigned int size; /* 40 bytes = 0x28 */ + int width; + int height; + unsigned short int planes; + unsigned short int bpp; + unsigned int compression; + unsigned int imagesize; + unsigned int xres; + unsigned int yres; + unsigned int noc; + unsigned int ic; +} __attribute__ ((packed)) t_bmp_info; /* 40 bytes */ + +typedef struct s_pixel { + unsigned char b; + unsigned char g; + unsigned char r; +} __attribute__ ((packed)) t_pixel; + +typedef struct s_bmp { + int outfd; + int width; + int height; + unsigned char mode; +#define READ (1<<0) +#define WRITE (1<<1) + char file[MAX_CHARS_FILE]; + int fd; + t_bmp_hdr hdr; + t_bmp_info info; + t_pixel *map; +} t_bmp; + +/* function prototypes */ +int bmp_init(t_bmp *bmp,int outfd); +int bmp_shutdown(t_bmp *bmp); +int bmp_check_header_and_info(t_bmp *bmp); +int bmp_alloc_map(t_bmp *bmp); +int bmp_write_file(t_bmp *bmp); +int bmp_cut_grab_bottom(t_bmp *dst,t_bmp *src,int dz,unsigned char m); +int bmp_read_file(t_bmp *bmp); + +#endif diff --git a/bmp2b/trunk/bmp2b.c b/bmp2b/trunk/bmp2b.c new file mode 100644 index 0000000..4f07a5e --- /dev/null +++ b/bmp2b/trunk/bmp2b.c @@ -0,0 +1,168 @@ +/* + * bmp2b.c - convert colored 24 bit bmp to the betty display ram format + * + * author: hackbard@hackdaworld.org + * changed: damaltor@gmail.com + * changelog: edited the first lines of output to fit boop's requirements + * the old line is still there, but commented + * + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include + +#include "bmp.h" + +#define DX 128 +#define DY 160 +#define PM (DY/8) + +#define BINARY 1 +#define CHAR 2 +#define SHOW 3 + +int main(int argc,char **argv) { + + int i,fd; + t_bmp src,dst; + char in[128]; + char out[128]; + char blook[128+8]; + unsigned char stat; + unsigned char buf[2]; + int page,col; + int b,pix; + + stat=0; + for(i=1;i -o [-b/c]\n", + argv[0]); + printf("\n"); + printf(" -b: binary out\n"); + printf(" -c: char array\n\n"); + return -1; + } + } + + /* the bitmap infile */ + bmp_init(&src,1); + src.mode=READ; + strncpy(src.file,in,128); + bmp_read_file(&src); + + /* the bitmap outfile */ + sprintf(blook,"blook_%s",in); + bmp_init(&dst,1); + dst.mode=WRITE; + strncpy(dst.file,blook,128+8); + dst.width=src.width; + dst.height=src.height; + bmp_alloc_map(&dst); + + if((src.width!=DX)|(src.height=!DY)) { + printf("wrong dimensions: %d %d (need: %d %d)\n", + src.width,src.height,DX,DY); + return -1; + } + + /* out file */ + fd=open(out,O_WRONLY|O_CREAT); + if(fd<0) { + perror("open outfile"); + return fd; + } + + if(stat==CHAR) + dprintf(fd,"const unsigned char b_w = %d;\nconst unsigned char b_h = %d;\nconst char b_data[] = {\n",DX,DY); + +// dprintf(fd,"const unsigned char default_logo[%d]={\n",DX*PM*2); +// was the old function + + for(page=0;page%8BG|-)Ow5v^)%5v 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

K8NSqC@4$ttZNv+TU4p|Wo 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 \ No newline at end of file diff --git a/boop/branches/ram_version/telekatz_soundtest/CHANGELOG b/boop/branches/ram_version/telekatz_soundtest/CHANGELOG new file mode 100644 index 0000000..d267b83 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/CHANGELOG @@ -0,0 +1,2 @@ +06.12.2007 : +- starting complete code rework diff --git a/boop/branches/ram_version/telekatz_soundtest/LICENSE b/boop/branches/ram_version/telekatz_soundtest/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/boop/branches/ram_version/telekatz_soundtest/Make.conf b/boop/branches/ram_version/telekatz_soundtest/Make.conf new file mode 100644 index 0000000..a2fb51d --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/Make.conf @@ -0,0 +1,4 @@ +SUBDIRS := adc audio cc1100 display flash games gui infrared interrupt \ + keyboard rtc serial timer tools + +SRCS := crt.s main.c global.c diff --git a/boop/branches/ram_version/telekatz_soundtest/Makefile b/boop/branches/ram_version/telekatz_soundtest/Makefile new file mode 100644 index 0000000..772c841 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/Makefile @@ -0,0 +1,98 @@ +############################################################### +##### +##### Makefile for boop - communicate with betty +##### Created at 30.8.2007 02:26 am +##### +##### boop V0.1 by netguy - ck@mamalala.net +##### Makefile V0.1 by alterego - alteregon@gmx.net +##### +############################################################### + +############################################################### +##### +##### PATHS (default installation) +##### +##### You can put your path-config into Makefile.local +##### to override these defaults +##### +############################################################### + + +ARMBASE=/opt/toolchains/gcc-arm-none-eabi-4_9-2014q4 +INCLUDEPATH=$(ARMBASE)/include +ARMPATH=$(ARMBASE)/bin +TOOLPREFIX=/arm-none-eabi- +BOOTLOADER_DEVICE=/dev/ttyUSB0 + +############################################################### +##### +##### Compiler, Linker and Tools +##### +############################################################### + +CC=$(ARMPATH)$(TOOLPREFIX)gcc +AS=$(ARMPATH)$(TOOLPREFIX)as +#LD=$(ARMPATH)$(TOOLPREFIX)ld +LD=$(CC) +OC=$(ARMPATH)$(TOOLPREFIX)objcopy +OD=$(ARMPATH)$(TOOLPREFIX)objdump + +CPUFLAGS=-mcpu=arm7tdmi-s +OPTFLAGS=-Os +CFLAGS=$(CPUFLAGS) -c -Wall -mthumb-interwork -msoft-float -I$(INCLUDEPATH) -ggdb +ASFLAGS=$(CPUFLAGS) -D --gstabs -mthumb-interwork -mfpu=softfpa +LDFLAGS = -mthumb-interwork -nostartfiles -Xlinker -Map -Xlinker boop.map -Tlpc2220.ld + +THUMBFLAGS=-mthumb + +-include Makefile.local + +############################################################### +##### +##### Do the boop +##### +############################################################### + +all: boop_rom.bin + +boop_rom.bin: boop_ram.elf + $(OC) -O binary boop_ram.elf boop_ram.bin + $(OC) -O ihex boop_ram.elf boop_ram.hex + +boop_ram.elf: crt.o lcd.o fonty.o main.o irq.o keyboard.o soundcore.o + $(LD) -o boop_ram.elf crt.o lcd.o fonty.o main.o irq.o keyboard.o soundcore.o $(LDFLAGS) + +test: boop_ram.elf + $(OD) -h boop_ram.elf + +crt.o: crt.s + $(AS) $(ASFLAGS) -o crt.o crt.s + +irq.o: irq.c irq.h + $(CC) $(CFLAGS) $(OPTFLAGS) -o irq.o irq.c + +keyboard.o: keyboard.c keyboard.h + $(CC) $(CFLAGS) -o keyboard.o keyboard.c + +soundcore.o: soundcore.c soundcore.h + $(CC) $(CFLAGS) -o soundcore.o soundcore.c + +lcd.o: lcd.c lcd.h + $(CC) $(CFLAGS) $(OPTFLAGS) $(THUMBFLAGS) -o lcd.o lcd.c + +fonty.o: fonty.c fonty.h + $(CC) $(CFLAGS) $(OPTFLAGS) $(THUMBFLAGS) -o fonty.o fonty.c + +main.o: main.c + $(CC) $(CFLAGS) $(OPTFLAGS) -o main.o main.c + +ramload: boop_ram.bin + lpctool -d $(BOOTLOADER_DEVICE) -r boop_ram.bin + +resident: boop_ram.bin + lpctool -d $(BOOTLOADER_DEVICE) -i -v -e -a boop_ram.bin + +clean: + $(RM) -v *.o *.elf *.bin *.hex *~ + +### EOF diff --git a/boop/branches/ram_version/telekatz_soundtest/Makefile.local b/boop/branches/ram_version/telekatz_soundtest/Makefile.local new file mode 100644 index 0000000..a7db5e9 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/Makefile.local @@ -0,0 +1,24 @@ +############################################################### +##### +##### Makefile.local.WinARM for boop +##### Created in the early morninghours +##### +##### Makefile.local.WinARM V1.0 by alterego - alteregon@gmx.net +##### +############################################################### + +############################################################### +##### +##### PATHS (default installation) +##### +##### You can put your path-config into Makefile.local +##### to override these defaults +##### +############################################################### + +ARMBASE=/opt/toolchains/gcc-arm-none-eabi-4_9-2014q4 +INCLUDEPATH=$(ARMBASE)/include +ARMPATH=$(ARMBASE)/bin +TOOLPREFIX=/arm-none-eabi- + +######################## EOF ################################## diff --git a/boop/branches/ram_version/telekatz_soundtest/Makefile.local.Telekatz b/boop/branches/ram_version/telekatz_soundtest/Makefile.local.Telekatz new file mode 100644 index 0000000..2a8c536 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/Makefile.local.Telekatz @@ -0,0 +1,23 @@ +############################################################### +##### +##### Makefile.local.WinARM for boop +##### Created in the early morninghours +##### +##### Makefile.local.WinARM V1.0 by alterego - alteregon@gmx.net +##### +##### Copy this file to Makefile.local for your Windows +##### installation +##### +############################################################### + +ARMBASE = F:/Tools/WinARM +INCLUDEPATH = $(ARMBASE)/include +LIBPATH = $(ARMBASE)/arm-elf/lib/interwork +ARMPATH = $(ARMBASE)/bin +TOOLPREFIX = arm-elf- +LPCTOOL = lpctool.exe + +CFLAGS = -Wall -mthumb-interwork -msoft-float -ggdb + +######################## EOF ################################## + diff --git a/boop/branches/ram_version/telekatz_soundtest/Makefile.local.WinARM b/boop/branches/ram_version/telekatz_soundtest/Makefile.local.WinARM new file mode 100644 index 0000000..ffc96ae --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/Makefile.local.WinARM @@ -0,0 +1,20 @@ +############################################################### +##### +##### Makefile.local.WinARM for boop +##### Created in the early morninghours +##### +##### Makefile.local.WinARM V1.0 by alterego - alteregon@gmx.net +##### +##### Copy this file to Makefile.local for your Windows +##### installation +##### +############################################################### + +ARMBASE = c:/WinARM/ +INCLUDEPATH = $(ARMBASE)/include +LIBPATH = $(ARMBASE)/arm-elf/lib/interwork +ARMPATH = $(ARMBASE)/bin +TOOLPREFIX = arm-elf- +LPCTOOL = lpctool.exe + +######################## EOF ################################## diff --git a/boop/branches/ram_version/telekatz_soundtest/Makefile.local.linuxARM b/boop/branches/ram_version/telekatz_soundtest/Makefile.local.linuxARM new file mode 100644 index 0000000..8e68b7a --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/Makefile.local.linuxARM @@ -0,0 +1,25 @@ +############################################################### +##### +##### Makefile.local.linuxARM for boop +##### Created in the early morninghours +##### +##### Makefile.local.linuxARM +##### +############################################################### + +############################################################### +##### +##### PATHS (default installation) +##### +##### You can put your path-config into Makefile.local +##### to override these defaults +##### +############################################################### + +ARMBASE=/opt/armtool/4.1.1 +INCLUDEPATH=$(ARMBASE)/include +LIBPATH=$(ARMBASE)/arm-elf/lib/interwork +ARMPATH=$(ARMBASE)/bin +TOOLPREFIX=/arm-elf- + +######################## EOF ################################## diff --git a/boop/branches/ram_version/telekatz_soundtest/README b/boop/branches/ram_version/telekatz_soundtest/README new file mode 100644 index 0000000..4b95612 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/README @@ -0,0 +1,25 @@ +24.7.2009: + +boop for running in RAM. Created by telekatz for testing sound features. +Run it with +lpctool -r boop_rom.bin -d /dev/ttyUSB2 +See Thread +http://bettyhacks.com/forum/index.php?topic=215.0 + +9.11.2007: + +- serial console: + 115200 baud, 8N1, no handshake + +- serial commands: + 0 - backlight off + 1 - dimmed backlight + 2 - full backlight + . - prints "HELO" + S - prints RCA_Encode status (hex value) + I - prints irIRQ status (hex value) + K - prints keyIRQ status (hex value) + all other inputs are echoed + +- flash boop_rom.bin: + lpctool -i -e -a ./boop_rom.bin -d /dev/ diff --git a/boop/branches/ram_version/telekatz_soundtest/b.h b/boop/branches/ram_version/telekatz_soundtest/b.h new file mode 100644 index 0000000..4eed325 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/b.h @@ -0,0 +1,24 @@ +const unsigned char b_w = 128; +const unsigned char b_h = 160; +const char b_data[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0x80,0xC0,0xE0,0xE0,0xC0,0xE0,0xF0,0xF0,0xE0,0xF0,0xE8,0xF8,0xF0,0xF8,0xE0,0xF8,0x64,0xF8,0x24,0xFC,0x30,0xFC,0x32,0xFC,0x3A,0xFE,0x78,0xFE,0xF8,0xFE,0xF9,0xFE,0xFD,0xFE,0xFD,0xFE,0xFD,0xFE,0xFF,0xFE,0xFF,0xFE,0xFD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0x07,0x0F,0x1F,0x2F,0x7F,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0xFF,0x80,0xF8,0x07,0xC1,0x3E,0x07,0xF8,0xFF,0x00,0xFF,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0xFF,0x7F,0xBF,0x3F,0xFF,0xF0,0x08,0xC0,0xE0,0xC0,0xE0,0xE0,0xC0,0xE0,0xF0,0xE0,0xF0,0x80,0x60,0x80,0xC0,0x80,0xC0,0xC0,0x80,0xC0,0x80,0xC0,0x80,0xC0,0x80,0xC0,0x80,0x80,0xC0,0x80,0xD0,0xF0,0xD0,0xF0,0xE0,0xE0,0xD0,0x80,0x40,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0xE0,0x40,0xE0,0x60,0xE0,0xE0,0xE1,0xE2,0xE3,0xFF,0xE7,0xDF,0xE7,0xDB,0xEF,0xF7,0xE7,0x7B,0xE7,0x3B,0xE7,0xBA,0xE3,0xB4,0xE3,0xB0,0xF1,0xE2,0xF1,0xE2,0xF1,0xF8,0xF9,0xF0,0xF8,0xFD,0xFC,0xF9,0xFC,0x7F,0xBE,0x4D,0xFF,0xCA,0xFF,0xFB,0xFF,0xFD,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xE3,0xFF,0xE3,0xFF,0xE3,0xFF,0xE3,0xFF,0xE3,0xFF,0xE3,0xFF,0xE3,0xFF,0xC3,0xFF,0xC3,0xEF,0x97,0xCF,0xB7,0x9F,0x67,0x9F,0x6F,0x3F,0xDE,0x7E,0x9F,0xFE,0x3C,0xFC,0x7C,0xF8,0xFC,0xF8,0xFC,0xFC,0xFA,0xFE,0xFC,0x3C,0xD8,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x14,0x3C,0xD8,0xF8,0xFC,0xFC,0xF8,0xFE,0xC5,0xFF,0xC3,0xFF,0xE1,0xFF,0x71,0x7F,0xF9,0x7F,0xFF,0xFF,0x7F,0xFF,0x7F,0x7F,0xDF,0x5F,0x2F,0x1F,0x2F,0x1F,0x2F,0x1F,0x2F,0x1F,0x3F,0x1F,0x3F,0x3F,0x1F,0x3F,0x7F,0x18,0x67,0x3F,0x5C,0x1F,0x3F,0x1F,0x0F,0x0F,0x1F,0x0F,0x17,0x07,0x0F,0x07,0x0B,0x03,0x0F,0x8B,0x57,0x9F,0xCF,0x9F,0x8F,0x8F,0x17,0x03,0x0D,0x03,0x0D,0x03,0x05,0x03,0x1D,0x33,0x1D,0x7F,0x33,0x7F,0x3F,0x7F,0x3F,0x3F,0x5F,0x1F,0x7F,0x3F,0xDF,0x7F,0xBE,0xFE,0xFD,0xFE,0xF9,0xFF,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xF8,0xF6,0xE0,0xF0,0xE0,0xC0,0xE0,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0xC0,0x80,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xCF,0xF3,0xFF,0xFF,0xFF,0xFF,0x3F,0xDF,0x1F,0xAC,0x00,0x1F,0x00,0x01,0x00,0x00,0x00,0x80,0xF0,0x08,0x1C,0x22,0x06,0x02,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x01,0x01,0x00,0x83,0x40,0x06,0x83,0x0C,0x86,0x08,0xD4,0x10,0x08,0x10,0x80,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x04,0x0E,0x15,0x1C,0x3F,0x1F,0xBC,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x3F,0x5F,0x0F,0x17,0x03,0x05,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x04,0x18,0x3C,0x38,0x30,0x30,0x78,0x70,0x31,0x71,0x60,0x71,0x60,0x71,0x21,0x33,0x61,0x1F,0x23,0x07,0x03,0x0E,0x07,0x0C,0x1E,0x38,0x10,0x60,0xD0,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x03,0x07,0x8A,0x0F,0x96,0xF6,0x19,0xE0,0xF0,0xE0,0xF2,0x83,0x70,0x00,0x7D,0xF0,0x08,0x00,0x1F,0x04,0x0A,0x04,0x08,0x0C,0xD2,0x0E,0xDD,0x5C,0xA8,0x7C,0xFA,0xF0,0x6A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x1C,0xE1,0x83,0x04,0x02,0x01,0x01,0x12,0x03,0x34,0x07,0x73,0x37,0x4A,0x3F,0xDE,0x7C,0x9B,0x00,0x38,0x00,0x00,0x00,0x00,0x0C,0x32,0x3C,0xFE,0x7C,0xBA,0xFC,0x7F,0xFF,0x7E,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x71,0x70,0xF0,0x70,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x18,0x38,0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0xE3,0x1F,0xE7,0x3F,0xC7,0x5F,0xA3,0x00,0xE7,0x00,0x80,0x00,0x85,0x02,0x05,0x00,0x06,0x0C,0x00,0x00,0x04,0x04,0x09,0x00,0x1F,0x03,0x04,0x01,0x04,0x00,0x00,0x00,0x00,0x00,0x80,0x88,0x48,0xC8,0x98,0x80,0xC0,0x80,0xC0,0x80,0x00,0x80,0x00,0x00,0x80,0x80,0x03,0x81,0x00,0x80,0x07,0x82,0x01,0x00,0x82,0x02,0x85,0x00,0x83,0x01,0x82,0x00,0xC2,0x00,0xC0,0x00,0xC0,0x00,0x60,0x00,0x60,0x00,0x70,0x00,0x3F,0x00,0x1F,0x00,0x17,0x00,0x1F,0x00,0x3F,0x00,0x1F,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x72,0x23,0xE3,0x62,0xC3,0xE7,0xC3,0xC7,0xC7,0x83,0x87,0xC7,0x87,0x8E,0x8E,0x07,0x0E,0x8E,0x0C,0x9E,0x1C,0x08,0x18,0x30,0xE0,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x03,0x00,0xFB,0xFC,0xFB,0xFE,0xFD,0xFE,0x7F,0xFE,0x7F,0xFF,0x2E,0xFF,0xFE,0x1F,0xEE,0x0F,0x1F,0x0F,0x07,0x0F,0x06,0x0F,0x1E,0x0F,0x1F,0x0F,0x1F,0x0F,0xDE,0xFF,0xCF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1E,0xFF,0x0E,0xFE,0x8F,0xFE,0xFF,0xFC,0xFE,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x03,0x03,0x01,0x03,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0xF8,0x77,0xFF,0xC7,0xFF,0x81,0xFF,0xFC,0xFF,0xF0,0xFB,0xE4,0xFF,0xE1,0xF0,0xCF,0x80,0x60,0x00,0xF0,0xC0,0x38,0xC0,0xB0,0xE0,0xF0,0xF8,0xF4,0xFF,0xF0,0xF9,0xE6,0xFF,0xF0,0xFF,0xFC,0xFF,0xFF,0xFF,0x0F,0xFF,0x00,0xFF,0xE0,0xFF,0xF8,0xFF,0xFF,0x7F,0xBF,0x0F,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x80,0xC0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xC0,0xC0,0xE0,0xC0,0xC0,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0xF9,0x06,0xFF,0x37,0xFF,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0x7F,0xFF,0xFE,0xFC,0xFB,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0x3F,0xFF,0x1F,0xFF,0x8F,0xFF,0xEF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x1F,0xAF,0x03,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF3,0x25,0xEF,0xF7,0xF9,0xE1,0xF1,0xE0,0xE1,0xE0,0xE1,0xC1,0xC1,0xC1,0xC1,0x83,0xC3,0x83,0x83,0xC7,0x87,0xC3,0x87,0x8E,0x8E,0x9C,0xF8,0xB4,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0xB0,0x00,0x98,0x08,0xD6,0x0F,0xDA,0x1F,0xC0,0x1F,0xF8,0x3F,0xDE,0x7F,0xBF,0x7F,0x9F,0x0F,0x35,0x0E,0x15,0x07,0x0A,0x07,0x0F,0x0F,0x97,0x9F,0x33,0x3F,0xF1,0xFF,0x78,0xFF,0xFC,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0x0F,0x3F,0x47,0x3F,0x46,0x3C,0x02,0x38,0x04,0x30,0x68,0x60,0x80,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x40,0xC0,0xE1,0xE0,0xE0,0xE0,0xF0,0xF0,0xE1,0xF0,0xE1,0xE1,0xF0,0xE1,0xE1,0xE1,0xC3,0xC3,0xE1,0xC3,0x83,0x83,0x07,0x07,0x03,0x07,0x07,0x07,0x0F,0x07,0x0F,0x0F,0x07,0x0F,0x0F,0x0F,0x1F,0x3F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x04,0x3A,0x08,0xF7,0xCC,0x33,0x28,0x57,0x18,0x27,0x1C,0xE3,0x18,0xE7,0x10,0x29,0x00,0x39,0x10,0x29,0x10,0x29,0x00,0x3D,0x00,0xBF,0x00,0xFC,0x80,0x78,0xE1,0x1A,0x7D,0x82,0x1C,0xEF,0x0E,0xC5,0x07,0xC3,0x03,0xC1,0x01,0x83,0x01,0x80,0x00,0x81,0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xE0,0x00,0xFF,0xC0,0x3F,0x3F,0xC0,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x11,0x38,0x11,0x70,0x30,0xE0,0x70,0xE0,0xE1,0xE0,0xC1,0xC1,0xE0,0xC1,0xC1,0xC1,0xC1,0xC1,0x83,0xC3,0x83,0xC3,0x87,0xC7,0xCE,0xFC,0x6A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xFE,0xF0,0x0E,0x00,0x00,0x00,0x07,0x00,0xFE,0x00,0x80,0x00,0xC0,0x00,0xE0,0xC0,0x38,0x38,0x46,0x0C,0x13,0x03,0x04,0x01,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x0F,0x0F,0x90,0x0F,0xF7,0x0F,0xF5,0x8F,0x76,0xCF,0xB2,0xFC,0xE3,0xFC,0x33,0x0E,0x31,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0xC0,0xE0,0xE0,0xE0,0xE0,0xF0,0xF0,0xE1,0xF1,0xE1,0xE1,0xF3,0xE3,0xE1,0xE3,0xC3,0xC3,0xE3,0xC3,0x83,0x83,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x00,0x7E,0x01,0x1E,0x00,0x0F,0x01,0x1E,0x00,0xFE,0x00,0x80,0x00,0x1F,0xF8,0x07,0x18,0x67,0x03,0x1C,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x80,0x70,0xC0,0xB8,0xE0,0xDC,0xF0,0xEE,0xF8,0xF7,0xFC,0x7B,0xFE,0xFD,0xFF,0xFE,0x3F,0x5F,0x0F,0x17,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x11,0x38,0x11,0x70,0x30,0xE0,0x70,0xE0,0xE1,0xE0,0xC1,0xC1,0xE0,0xC1,0xC1,0xC1,0xC1,0xC1,0x83,0xC3,0x83,0xC3,0x87,0xC7,0xCE,0xFC,0x6A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x63,0x9C,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3C,0xC3,0xFC,0x02,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0xE6,0x04,0x0B,0x02,0x05,0x00,0x03,0x00,0x01,0x03,0x0C,0x1F,0x0F,0x07,0x0B,0x03,0x05,0x1F,0x27,0x3F,0x0F,0x01,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xA0,0xE0,0xE0,0xE0,0xF0,0xF0,0xE0,0xF0,0xE1,0xE1,0xF1,0xE1,0xE3,0xE3,0xC1,0xC3,0xE3,0xC3,0x83,0x83,0x83,0x03,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x78,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0xF8,0x07,0xF8,0x30,0xCF,0x00,0xF8,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x0D,0x00,0x3C,0x00,0xF0,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0xC0,0x00,0xC0,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x40,0x00,0x80,0x00,0x80,0x00,0xC0,0x00,0x40,0x00,0xC0,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x0C,0x7E,0x7C,0x1E,0x3C,0x1C,0x1E,0x1C,0x3C,0x3C,0x18,0x3C,0x38,0x38,0x7C,0x79,0x3A,0x7B,0x7F,0x78,0xFD,0xF0,0x78,0xF0,0x70,0xE0,0xF0,0xE0,0xE1,0xE0,0xC1,0xC1,0xE1,0xC1,0xC3,0xC3,0x83,0xC7,0x83,0xCE,0x84,0xF8,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x1E,0x00,0xF0,0x00,0x80,0x00,0x0F,0x00,0xFF,0x00,0xF0,0x01,0x0E,0x1C,0xE3,0x60,0x9E,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x2C,0xD2,0xC0,0x26,0x80,0x41,0x80,0x40,0x00,0xFC,0x00,0x3D,0x01,0x02,0x00,0x1F,0x00,0xF6,0x20,0x12,0x70,0xA0,0xC0,0x20,0x00,0x00,0x00,0x00,0x00,0x30,0x10,0x78,0x70,0xC3,0x00,0x46,0x00,0x9C,0x20,0x59,0x20,0x13,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x01,0x01,0x03,0x03,0x01,0x03,0x03,0x03,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x37,0x00,0xFF,0x03,0xFC,0x80,0x78,0x00,0x1F,0x00,0xFF,0x03,0xFC,0x1C,0xE3,0x00,0xF8,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x7F,0x80,0xC1,0xC3,0x84,0x40,0xAF,0xE0,0x1C,0x80,0x40,0x00,0xC0,0x00,0xF0,0x00,0xE0,0x00,0x20,0x00,0x47,0x4C,0xA0,0x4C,0xE2,0x2C,0xD2,0x00,0xA4,0x00,0x60,0x00,0x40,0x00,0x6F,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x05,0x0E,0x31,0xE0,0x1F,0x00,0x07,0x00,0xFF,0x00,0xD7,0xC0,0xBF,0xFC,0xE3,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0xBF,0x9F,0x60,0x9F,0x6F,0xCF,0x17,0x80,0x07,0x00,0x00,0x01,0x00,0x03,0x0D,0x1F,0x08,0x0E,0x19,0x0E,0x05,0x0E,0x05,0x0E,0x01,0x0E,0x05,0x0F,0x9C,0x1F,0x6C,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x70,0x28,0x78,0x07,0x78,0xE7,0x40,0xA1,0x3F,0xC0,0x3F,0x5F,0xFF,0x3F,0xF0,0x28,0xF0,0x00,0x78,0xF6,0x7F,0x3E,0x1F,0x3F,0x7F,0x3C,0x3F,0x48,0x03,0x2C,0x00,0x3E,0x00,0x38,0x00,0x20,0x00,0x60,0x00,0x40,0x00,0x47,0x02,0x45,0x00,0x67,0x00,0x61,0x00,0x65,0x00,0x76,0x00,0x66,0x20,0x56,0x04,0x60,0x20,0x1C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; diff --git a/boop/branches/ram_version/telekatz_soundtest/batt.c b/boop/branches/ram_version/telekatz_soundtest/batt.c new file mode 100644 index 0000000..c91b66d --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/batt.c @@ -0,0 +1,80 @@ +/* + batt.c - + Copyright (C) 2007 + + 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 3 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 "lpc2220.h" +#include "batt.h" +#include "lcd.h" + + +void initADC(void) +{ + + /* Setup A/D: 10-bit AIN0 @ 4,2MHz "Non-Burst"-Mode */ + + //PINSEL1 |= (1UL<<28); // set function P0.29 as AIN2 + + // sample AIN0 only => bit 0 = 1 + // CLKDIV = 14 (59/14 = 4.21 < 4.5 MHz) => Bits 8ff = 14-1 + // BURST = 1 => set Bit 16 - wuff: disabled below + // PDN = 1 => set Bit 21 + ADCR = ( 1<<5 | ((14-1)<<8) /*| (1UL<<16)*/ | (1UL<<21) ); + +} +unsigned int getADCvalue(void) +{ + unsigned int val=0; + ADCR = ( 1<<5 | ((14-1)<<8) /*| (1UL<<16)*/ | (1UL<<21) ); + ADCR |= (1UL<<24); /* Start A/D Conversion (START:0=1) */ + while ((ADDR & (1UL<<31)) == 0); /* Wait for the conversion to complete (DONE=1)*/ + val = ((ADDR >> 6) & 0x03FF); /* Extract the A/D result */ + ADCR &=~(1UL<<21); + return val; +} + +void draw_battery(unsigned char x, unsigned char y) +{ + unsigned int val=0; + unsigned char w=0; + + draw_rect(x,y,14,7,1,3,DRAW_PUT); + draw_vline(x+14,y+2,3,3,DRAW_PUT); + draw_block(x+1,y+1,12,5,2,DRAW_ERASE); + + val=getADCvalue(); + + if (val<0x320) + val=0x320; + if (val>0x380) + val=0x380; + + w= (val-0x320)/8; + + draw_block(x+1,y+1,w,5,2,DRAW_PUT); +} + +void draw_ant(unsigned char x, unsigned char y, unsigned char m) { + + draw_vline(x+3,y,7,3,m); + draw_pixel(x,y,3,m); + draw_pixel(x+1,y+1,3,m); + draw_pixel(x+2,y+2,3,m); + draw_pixel(x+6,y,3,m); + draw_pixel(x+5,y+1,3,m); + draw_pixel(x+4,y+2,3,m); + +} diff --git a/boop/branches/ram_version/telekatz_soundtest/batt.h b/boop/branches/ram_version/telekatz_soundtest/batt.h new file mode 100644 index 0000000..b3646e8 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/batt.h @@ -0,0 +1,27 @@ +/* + batt.h - + Copyright (C) 2007 + + 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 3 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 BATT_H +#define BATT_H + +void initADC(void); +unsigned int getADCvalue(void); +void draw_battery(unsigned char x, unsigned char y); +void draw_ant(unsigned char x, unsigned char y, unsigned char m); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/boop.pnps b/boop/branches/ram_version/telekatz_soundtest/boop.pnps new file mode 100644 index 0000000..8d53927 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/boop.pnps @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/boop/branches/ram_version/telekatz_soundtest/boop_flash.ppg b/boop/branches/ram_version/telekatz_soundtest/boop_flash.ppg new file mode 100644 index 0000000..e89667c --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/boop_flash.ppg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/boop/branches/ram_version/telekatz_soundtest/cc1100.c b/boop/branches/ram_version/telekatz_soundtest/cc1100.c new file mode 100644 index 0000000..51d6f36 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/cc1100.c @@ -0,0 +1,158 @@ +/* + batt.c - + Copyright (C) 2007 + + 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 3 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 "lpc2220.h" +#include "cc1100.h" +#include "irq.h" + +const unsigned char conf[0x2F] = { 0x29 , 0x2E , 0x07 , 0x00 , 0xD3 , 0x91 , 0x3D , 0x0C , + 0x05 , 0x00 , 0x00 , 0x06 , 0x00 , 0x20 , 0x28 , 0xC5 , + 0xF5 , 0x75 , 0x83 , 0x22 , 0xE5 , 0x14 , 0x07 , 0x30 , + 0x18 , 0x16 , 0x6C , 0x03 , 0x40 , 0x91 , 0x87 , 0x6B , + 0xF8 , 0x56 , 0x10 , 0xE9 , 0x2A , 0x00 , 0x1F , 0x41 , + 0x00 , 0x59 , 0x7F , 0x3F , 0x81 , 0x35 , 0x09 }; + +volatile unsigned char cc1100rx; + + +void cc1100_init(void) { + + unsigned long xx = 0x200; + + + PINSEL1 &= ~((1<<3) | (1<<5) | (1<<7)); + PCONP &= 0xfffffbff; + PCONP |= (1<<21); + FIOSET0 = SCK1; + FIOCLR0 = MOSI1; + FIOCLR0 = CS1; + while(xx) { + asm volatile("nop" : :); + xx--; + } + FIOSET0 = CS1; + xx=0x200; + while(xx) { + asm volatile("nop" : :); + xx--; + } + FIOCLR0 = CS1; + FIOCLR0 = SCK1; + while (FIOPIN0 & MISO1); + + PINSEL1 |= 0x000002A8; //((1<<3) | (1<<5) | (1<<7)); + SSPCR0 = 0x0007; + SSPCPSR = 0x02; + SSPCR1 = 0x02; + + SSPDR = SRES; + while (FIOPIN0 & MISO1); + while (SSPSR & (1<<4)); + xx = SSPDR; + + cc1100_write((0x00 | BURST ),conf,0x2f); +} + + +unsigned char cc1100_write(unsigned char addr,unsigned char* data, unsigned char lenght) { + + unsigned short i; + unsigned char status; + unsigned char x; + + FIOCLR0 = CS1; + while (FIOPIN0 & MISO1); + SSPDR = (addr | WRITE); + while ((SSPSR & (1<<4))); + status = SSPDR; + for (i=0; i < lenght; i++) { + SSPDR = data[i]; + while ((SSPSR & (1<<4))); + x=SSPDR; + } + FIOSET0 = CS1; + + return(status); + } + +unsigned char cc1100_read(unsigned char addr, unsigned char* data, unsigned char lenght) { + + unsigned short i; + unsigned char status; + + FIOCLR0 = CS1; + while (FIOPIN0 & MISO1); + SSPDR = (addr | READ); + while ((SSPSR & (1<<4))); + status = SSPDR; + for (i=0; i < lenght; i++) { + SSPDR = 0x00; + while ((SSPSR & (1<<4))); + data[i]=SSPDR; + } + FIOSET0 = CS1; + + return(status); +} + +unsigned char cc1100_strobe(unsigned char cmd) { + + unsigned short status; + + FIOCLR0 = CS1; + while (FIOPIN0 & MISO1); + SSPDR = cmd; + while ((SSPSR & (1<<4))); + status = SSPDR; + FIOSET0 = CS1; + + return(status); +} + +void startcc1100IRQ(void) { + PINSEL1 |= 1; + EXTMODE |= 1; + EXTPOLAR |= 1; + EXTINT |= 1; + + VICVectAddr1 = (unsigned long)&(cc1100IRQ); + VICVectCntl1 = VIC_SLOT_EN | INT_SRC_EINT0; + VICIntEnable = INT_EINT0; +} + +void cc1100_getfifo(unsigned char* b) { + + unsigned char cnt; + + cc1100_read(RX_fifo, &cnt,1); + cc1100_read(RX_fifo, b,cnt+2); + b[cnt]=0; + +} + +void __attribute__ ((interrupt("IRQ"))) cc1100IRQ (void) { + + EXTINT = 0x01; + cc1100rx =1; + + + VICVectAddr = 0; +} + + + diff --git a/boop/branches/ram_version/telekatz_soundtest/cc1100.h b/boop/branches/ram_version/telekatz_soundtest/cc1100.h new file mode 100644 index 0000000..db0771b --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/cc1100.h @@ -0,0 +1,56 @@ +/* + batt.h - + Copyright (C) 2007 + + 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 3 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 cc1100_H +#define cc1100_H + +#define MISO1 (1<<18) +#define MOSI1 (1<<19) +#define SCK1 (1<<17) +#define CS1 (1<<23) + +#define WRITE 0x00 +#define BURST 0x40 +#define READ 0x80 +#define TX_fifo 0x7F +#define RX_fifo 0xff + +#define SRES 0x30 +#define SFSTXON 0x31 +#define SXOFF 0x32 +#define SCLA 0x33 +#define SRX 0x34 +#define STX 0x35 +#define SIDLE 0x36 +#define SWOR 0x38 +#define SPWD 0x39 +#define SFRX 0x3A +#define SFTX 0x3B +#define SWORRST 0x3C +#define SNOP 0x3D + + +void cc1100_init(void); +unsigned char cc1100_write(unsigned char addr, unsigned char* data, unsigned char lenght); +unsigned char cc1100_read(unsigned char addr, unsigned char* data, unsigned char lenght); +unsigned char cc1100_strobe(unsigned char cmd); +void startcc1100IRQ(void); +void __attribute__ ((interrupt("IRQ"))) cc1100IRQ (void); +void cc1100_getfifo(unsigned char* b); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/crt.s b/boop/branches/ram_version/telekatz_soundtest/crt.s new file mode 100644 index 0000000..820fdb1 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/crt.s @@ -0,0 +1,199 @@ +/* + crt.s - startup code + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ +.global main + +.global _etext +.global _data +.global _edata +.global __bss_start +.global __bss_end__ +.global _stack + +/* Stack Sizes */ +.set UND_STACK_SIZE, 0x00000004 /* stack for "undefined instruction" interrupts is 4 bytes */ +.set ABT_STACK_SIZE, 0x00000004 /* stack for "abort" interrupts is 4 bytes */ +.set FIQ_STACK_SIZE, 0x00000004 /* stack for "FIQ" interrupts is 4 bytes */ +.set IRQ_STACK_SIZE, 0X00000100 /* stack for "IRQ" normal interrupts is 4 bytes */ +.set SVC_STACK_SIZE, 0x00000004 /* stack for "SVC" supervisor mode is 4 bytes */ + +/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs */ +.set MODE_USR, 0x10 /* Normal User Mode */ +.set MODE_FIQ, 0x11 /* FIQ Processing Fast Interrupts Mode */ +.set MODE_IRQ, 0x12 /* IRQ Processing Standard Interrupts Mode */ +.set MODE_SVC, 0x13 /* Supervisor Processing Software Interrupts Mode */ +.set MODE_ABT, 0x17 /* Abort Processing memory Faults Mode */ +.set MODE_UND, 0x1B /* Undefined Processing Undefined Instructions Mode */ +.set MODE_SYS, 0x1F /* System Running Priviledged Operating System Tasks Mode */ +.set I_BIT, 0x80 /* when I bit is set, IRQ is disabled (program status registers) */ +.set F_BIT, 0x40 /* when F bit is set, FIQ is disabled (program status registers) */ + + +.text +.arm + +.global Reset_Handler +.global _startup +.global _endstartup + +.global ramvectors +.func ramvectors + +ramvectors: + ldr PC, Ram_Reset_Addr + ldr PC, Ram_Undef_Addr + ldr PC, Ram_SWI_Addr + ldr PC, Ram_PAbt_Addr + ldr PC, Ram_DAbt_Addr + nop /* Reserved Vector (holds Philips ISP checksum) */ + ldr PC, [PC,#-0xFF0] /* Route IRQ to VIC */ + ldr PC, Ram_FIQ_Addr + +Ram_Reset_Addr: .word Reset_Handler /* defined in this module below */ +Ram_Undef_Addr: .word UNDEF_Routine /* defined in main.c */ +Ram_SWI_Addr: .word SWI_Routine /* defined in main.c */ +Ram_PAbt_Addr: .word UNDEF_Routine /* defined in main.c */ +Ram_DAbt_Addr: .word UNDEF_Routine /* defined in main.c */ +Ram_IRQ_Addr: .word IRQ_Routine /* defined in main.c */ +Ram_FIQ_Addr: .word FIQ_Routine /* defined in main.c */ + .word 0 /* rounds vectors to 64 bytes total */ +.endfunc + +.section .text + +.func _startup + +_startup: + +# Exception Vectors + +_vectors: + ldr PC, Reset_Addr + +Reset_Addr: .word Reset_Handler + +# Reset Handler + +Reset_Handler: + + /* Setup a stack for each mode - note that this only sets up a usable stack + for User mode. Also each mode is setup with interrupts initially disabled. */ + + ldr r0, =_stack_end + msr CPSR_c, #MODE_UND|I_BIT|F_BIT /* Undefined Instruction Mode */ + mov sp, r0 + sub r0, r0, #UND_STACK_SIZE + msr CPSR_c, #MODE_ABT|I_BIT|F_BIT /* Abort Mode */ + mov sp, r0 + sub r0, r0, #ABT_STACK_SIZE + msr CPSR_c, #MODE_FIQ|I_BIT|F_BIT /* FIQ Mode */ + mov sp, r0 + sub r0, r0, #FIQ_STACK_SIZE + msr CPSR_c, #MODE_IRQ|I_BIT|F_BIT /* IRQ Mode */ + mov sp, r0 + sub r0, r0, #IRQ_STACK_SIZE + msr CPSR_c, #MODE_SVC|I_BIT|F_BIT /* Supervisor Mode */ + mov sp, r0 + sub r0, r0, #SVC_STACK_SIZE + msr CPSR_c, #MODE_SYS|I_BIT|F_BIT /* User Mode */ + mov sp, r0 + + /* Setup Pins and Memory */ + ldr r0,=BCFG0 + ldr r1, =0x10000420 + str r1,[r0] + str r1,[r0,#0x08] + + ldr r0, =BCFG1 + ldr r1, =0xc42 + str r1, [r0] + + ldr r0, =PINSEL0 + ldr r1, =0x00008005 + str r1, [r0] + + ldr r0, =PINSEL1 + ldr r1, =0x20000000 + str r1, [r0] + + ldr r0, =PINSEL2 + ldr r1, =0x0de049d4 + str r1, [r0] + + ldr r0, = IO2SET + ldr r1, =0x1FC0000 + str r1, [r0] + str r1, [r0,#0x04] + + ldr r0, = IO0DIR + ldr r1, =0x002018D0 + str r1, [r0] + + + /* Setup PLL */ + ldr r0, =0xe01fc000 + ldr r2, =0xaa + ldr r3, =0x55 + ldr r1, =0x03 + str r1, [r0,#0x80] + ldr r1, =0x0 + str r1, [r0,#0x100] + ldr r1, =0x42 + str r1,[r0,#0x84] + str r2, [r0,#0x8c] + str r3, [r0,#0x8c] + +_endstartup: + /* Copy .fastcode & .data section (Copy from ROM to RAM) */ + ldr R0, =ramvectors /*_etext*/ + ldr r3, entry_mask /* this and the next instruction are an workaround */ + and r0, r0, r3 /* for some ugly bug in winarm to force msb to 0x80 */ + ldr R1, =0x40000000 /*_data*/ + ldr R2, =_startup +1: + cmp r1,r2 + ldmltia r0!,{r3} + stmltia r1!,{r3} + blt 1b + + /* Clear .bss section (Zero init) */ + mov R0, #0 + ldr R1, =_bss_start + ldr R2, =_bss_end +2: + cmp R1, R2 + strlo R0, [R1], #4 + blo 2b + + ldr r0, =MEMMAP + ldr r1, =0x02 /* irq vectors in ram */ + str r1, [r0] + + mov r0,#0 + mov r1,r0 + mov r2,r0 + mov fp,r0 + mov r7,r0 + ldr r10,=main + mov lr,pc + bx r10 + + + +.endfunc +entry_mask: .word 0x4FFFFFFF /* defined in this module below */ +.end diff --git a/boop/branches/ram_version/telekatz_soundtest/externs.h b/boop/branches/ram_version/telekatz_soundtest/externs.h new file mode 100644 index 0000000..a203dfd --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/externs.h @@ -0,0 +1,7 @@ +#ifndef EXTERNS_H +#define EXTERNS_H + +extern unsigned int keys[2]; +extern unsigned char autorepeat; + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/flash.c b/boop/branches/ram_version/telekatz_soundtest/flash.c new file mode 100644 index 0000000..234c59d --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/flash.c @@ -0,0 +1,174 @@ +/* + flash.c - writing/erasing flash + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "flash.h" +#include "serial.h" +#include "lcd.h" + +const unsigned long secaddr[19] = +{ 0x00000, + 0x02000, + 0x03000, + 0x04000, + 0x08000, + 0x10000, + 0x18000, + 0x20000, + 0x28000, + 0x30000, + 0x38000, + 0x40000, + 0x48000, + 0x50000, + 0x58000, + 0x60000, + 0x68000, + 0x70000, + 0x78000 }; + +unsigned long flash_base; + +int eraseSector(unsigned char chip, unsigned char secnum) +{ + + if(chip == 0) + flash_base = FLASH0_BASE; + else + flash_base = FLASH1_BASE; + + serial_puts("Erasing Sector: 0x"); + putHexW(flash_base + (secaddr[secnum]<<1)); + + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x80; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base + (secaddr[secnum]<<1))) = 0x30; + + if((*((volatile unsigned short *)(flash_base)) & 0x44) == (*((volatile unsigned short *)(flash_base)) & 0x44)) + { + serial_puts(" -- ERROR\n"); + *((volatile unsigned short *)(flash_base)) = 0xF0; + return -1; + } + + + while ((*((volatile unsigned short *)(flash_base)) & 0x44) != (*((volatile unsigned short *)(flash_base)) & 0x44)) + {} + serial_puts(" +> OK\n"); + return 0; +} + +int eraseFlash(unsigned char chip) +{ + if(chip == 0) + flash_base = FLASH0_BASE; + else + flash_base = FLASH1_BASE; + + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x80; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x10; + + if((*((volatile unsigned short *)(flash_base)) & 0x44) == (*((volatile unsigned short *)(flash_base)) & 0x44)) + { + *((volatile unsigned short *)(flash_base)) = 0xF0; + return -1; + } + + + while ((*((volatile unsigned short *)(flash_base)) & 0x44) != (*((volatile unsigned short *)(flash_base)) & 0x44)) + {} + return 0; +} + +int writeWord(unsigned long addr, unsigned short data) +{ + flash_base = addr & 0xFF000000; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xA0; + *((volatile unsigned short *)(addr)) = data; + + if(*((volatile unsigned short *)(addr)) == *((volatile unsigned short *)(addr))) + { + serial_puts("NACK"); + *((volatile unsigned short *)(flash_base)) = 0xF0; + return -1; + } + + while(*((volatile unsigned short *)(addr)) != *((volatile unsigned short *)(addr))) + {} + return 0; +} + +void prepareBulk(unsigned long dst) +{ + flash_base = dst & 0xFF000000; + + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x20; +} + +void endBulk(unsigned long dst) +{ + flash_base = dst & 0xFF000000; + + *((volatile unsigned short *)(flash_base)) = 0x90; + *((volatile unsigned short *)(flash_base)) = 0x00; +} + +int writeBulk(unsigned long src, unsigned long dst, unsigned long cnt) +{ + unsigned short check1, check2; + while(cnt--) + { + *((volatile unsigned short *)dst) = 0xA0; + *((volatile unsigned short *)dst) = *((volatile unsigned short *)src); + +retry: + check1 = *((volatile unsigned short *)dst); + check2 = *((volatile unsigned short *)dst); + if((check1 & 0x40) == (check2 & 0x40)) + goto done; + if(!(check2 & 0x20)) + goto retry; + check1 = *((volatile unsigned short *)dst); + check2 = *((volatile unsigned short *)dst); + if((check1 & 0x40) == (check2 & 0x40)) + goto done; + *((volatile unsigned short *)dst) = 0xF0; + return -1; + +done: + check1 = *((volatile unsigned short *)dst); + check2 = *((volatile unsigned short *)dst); + if(check1 != check2) + goto retry; + + src+=2; + dst+=2; + } + + return 0; +} diff --git a/boop/branches/ram_version/telekatz_soundtest/flash.h b/boop/branches/ram_version/telekatz_soundtest/flash.h new file mode 100644 index 0000000..9b14f65 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/flash.h @@ -0,0 +1,33 @@ +/* + flash.h - writing/erasing flash + Copyright (C) 2007 Ch. Klippel + + 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 3 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 FLASH_H +#define FLASH_H + +#define FLASH0_BASE 0x80000000 +#define FLASH1_BASE 0x82000000 + +void prepareBulk(unsigned long dst); +void endBulk(unsigned long dst); +int eraseSector(unsigned char chip, unsigned char secnum); +int eraseFlash(unsigned char chip); +int writeWord(unsigned long addr, unsigned short data); +int writeBulk(unsigned long src, unsigned long dst, unsigned long cnt); +void lcd_set(unsigned char s); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/fonts/charset.bits b/boop/branches/ram_version/telekatz_soundtest/fonts/charset.bits new file mode 100644 index 0000000..307a269 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/fonts/charset.bits @@ -0,0 +1,118 @@ +const unsigned char charset_bits[] = { + 0x80, 0xc0, 0x80, 0xe0, 0x80, 0xc0, 0x80, 0xf0, 0x01, 0x03, 0x01, 0x07, + 0x01, 0x03, 0x01, 0x0f, 0x80, 0x88, 0xaa, 0xff, 0xff, 0xaa, 0x88, 0x80, + 0x00, 0xc0, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xf0, 0x00, 0x03, 0x00, 0x07, + 0x00, 0x03, 0x00, 0x0f, 0x80, 0x88, 0xaa, 0xab, 0xab, 0xaa, 0x88, 0x80, + 0x80, 0x80, 0x80, 0x70, 0x01, 0x01, 0x01, 0x0e, 0x0e, 0x01, 0x01, 0x01, + 0x70, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x24, + 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x92, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x81, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xaa, 0x02, 0x05, 0x02, 0x00, + 0x3e, 0x41, 0x41, 0x22, 0x02, 0x05, 0x02, 0x00, 0x7f, 0x09, 0x09, 0x01, + 0x1c, 0x22, 0x41, 0x4f, 0x41, 0x22, 0x1c, 0x1c, 0x22, 0x41, 0x4f, 0x47, + 0x22, 0x1c, 0x1c, 0x22, 0x41, 0x4f, 0x4f, 0x2e, 0x1c, 0x1c, 0x22, 0x41, + 0x4f, 0x5f, 0x3e, 0x1c, 0x1c, 0x22, 0x41, 0x7f, 0x7f, 0x3e, 0x1c, 0x1c, + 0x22, 0x71, 0x7f, 0x7f, 0x3e, 0x1c, 0x1c, 0x3a, 0x79, 0x7f, 0x7f, 0x3e, + 0x1c, 0x1c, 0x3e, 0x7d, 0x7f, 0x7f, 0x3e, 0x1c, 0x1c, 0x3e, 0x7f, 0x7f, + 0x7f, 0x3e, 0x1c, 0x00, 0x00, 0x5f, 0x03, 0x00, 0x03, 0x14, 0x7f, 0x14, + 0x7f, 0x14, 0x24, 0x4a, 0xff, 0x4a, 0x32, 0x63, 0x13, 0x08, 0x64, 0x63, + 0x36, 0x49, 0x55, 0x22, 0x50, 0x03, 0x1c, 0x22, 0x41, 0x41, 0x22, 0x1c, + 0x14, 0x08, 0x3e, 0x08, 0x14, 0x08, 0x08, 0x3e, 0x08, 0x08, 0x80, 0x60, + 0x60, 0x08, 0x08, 0x08, 0x08, 0x08, 0x60, 0x60, 0xc0, 0x30, 0x0c, 0x03, + 0x3e, 0x51, 0x49, 0x45, 0x3e, 0x00, 0x42, 0x7f, 0x40, 0x00, 0x42, 0x61, + 0x51, 0x49, 0x46, 0x22, 0x41, 0x49, 0x49, 0x36, 0x18, 0x14, 0x12, 0x7f, + 0x10, 0x27, 0x45, 0x45, 0x45, 0x39, 0x3e, 0x49, 0x49, 0x49, 0x32, 0x61, + 0x11, 0x09, 0x05, 0x03, 0x36, 0x49, 0x49, 0x49, 0x36, 0x26, 0x49, 0x49, + 0x49, 0x3e, 0x6c, 0x6c, 0x80, 0x6c, 0x6c, 0x08, 0x14, 0x22, 0x41, 0x14, + 0x14, 0x14, 0x14, 0x41, 0x22, 0x14, 0x08, 0x02, 0x01, 0x51, 0x09, 0x06, + 0x3e, 0x41, 0x59, 0x55, 0x5e, 0x7e, 0x09, 0x09, 0x09, 0x7e, 0x7f, 0x49, + 0x49, 0x49, 0x36, 0x3e, 0x41, 0x41, 0x41, 0x22, 0x7f, 0x41, 0x41, 0x41, + 0x3e, 0x7f, 0x49, 0x49, 0x41, 0x41, 0x7f, 0x09, 0x09, 0x01, 0x01, 0x3e, + 0x41, 0x41, 0x49, 0x3a, 0x7f, 0x08, 0x08, 0x08, 0x7f, 0x41, 0x7f, 0x41, + 0x30, 0x41, 0x41, 0x41, 0x3f, 0x7f, 0x08, 0x14, 0x22, 0x41, 0x7f, 0x40, + 0x40, 0x40, 0x40, 0x7f, 0x02, 0x0c, 0x02, 0x7f, 0x7f, 0x02, 0x04, 0x08, + 0x7f, 0x3e, 0x41, 0x41, 0x41, 0x3e, 0x7f, 0x09, 0x09, 0x09, 0x06, 0x3e, + 0x41, 0x41, 0x41, 0xbe, 0x7f, 0x09, 0x09, 0x09, 0x76, 0x26, 0x49, 0x49, + 0x49, 0x32, 0x01, 0x01, 0x7f, 0x01, 0x01, 0x3f, 0x40, 0x40, 0x40, 0x3f, + 0x1f, 0x20, 0x40, 0x20, 0x1f, 0x7f, 0x20, 0x10, 0x20, 0x7f, 0x41, 0x22, + 0x1c, 0x22, 0x41, 0x07, 0x08, 0x70, 0x08, 0x07, 0x61, 0x51, 0x49, 0x45, + 0x43, 0x7f, 0x41, 0x41, 0x03, 0x0c, 0x30, 0xc0, 0x41, 0x41, 0x7f, 0x02, + 0x01, 0x02, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01, 0x02, 0x20, 0x54, 0x54, + 0x78, 0x7f, 0x48, 0x48, 0x30, 0x38, 0x44, 0x44, 0x24, 0x30, 0x48, 0x48, + 0x7f, 0x38, 0x54, 0x54, 0x18, 0x08, 0x7e, 0x09, 0x02, 0x98, 0xa4, 0xa4, + 0x78, 0x7f, 0x08, 0x08, 0x70, 0x44, 0x7d, 0x40, 0x44, 0x84, 0x7d, 0x7f, + 0x10, 0x28, 0x44, 0x41, 0x7f, 0x40, 0x7c, 0x04, 0x18, 0x04, 0x78, 0x7c, + 0x08, 0x04, 0x78, 0x38, 0x44, 0x44, 0x38, 0xfc, 0x24, 0x24, 0x18, 0x18, + 0x24, 0x24, 0xfc, 0x7c, 0x08, 0x04, 0x08, 0x48, 0x54, 0x54, 0x24, 0x04, + 0x3f, 0x44, 0x3c, 0x40, 0x20, 0x7c, 0x1c, 0x20, 0x40, 0x20, 0x1c, 0x3c, + 0x40, 0x30, 0x40, 0x3c, 0x44, 0x28, 0x10, 0x28, 0x44, 0x9c, 0xa0, 0xa0, + 0x7c, 0x64, 0x54, 0x54, 0x4c, 0x08, 0x36, 0x41, 0x77, 0x41, 0x36, 0x08, + 0x08, 0x08, 0x2a, 0x1c, 0x08, 0x08, 0x1c, 0x2a, 0x08, 0x08, 0x00, 0x00, + 0x00, 0xdf, 0xdf, 0x07, 0x07, 0x00, 0x07, 0x07, 0x14, 0x3e, 0x14, 0x3e, + 0x14, 0x24, 0x4a, 0xff, 0x4a, 0x32, 0xf3, 0xfb, 0x18, 0xdf, 0xc7, 0x36, + 0x49, 0x55, 0x22, 0x50, 0x04, 0x07, 0x03, 0x3c, 0x7e, 0xc3, 0x81, 0x81, + 0xc3, 0x7e, 0x3c, 0x14, 0x08, 0x3e, 0x08, 0x14, 0x18, 0x7e, 0x7e, 0x18, + 0x80, 0x60, 0x60, 0x18, 0x18, 0x18, 0x18, 0x18, 0x60, 0x60, 0xc0, 0xf0, + 0x3c, 0x0f, 0x03, 0x7e, 0xff, 0xc3, 0xff, 0x7e, 0x04, 0xc6, 0xff, 0xff, + 0xc0, 0xe6, 0xf7, 0xd3, 0xdf, 0xce, 0x42, 0xc3, 0xdb, 0xff, 0x76, 0x38, + 0x3c, 0x36, 0xff, 0xff, 0x5f, 0xdf, 0xdb, 0xfb, 0x73, 0x7e, 0xff, 0xdb, + 0xfb, 0x72, 0x03, 0xf3, 0xfb, 0x0f, 0x07, 0x76, 0xff, 0xdb, 0xff, 0x76, + 0x4e, 0xdf, 0xdb, 0xff, 0x7e, 0x6c, 0x6c, 0x80, 0x6c, 0x6c, 0x18, 0x3c, + 0x66, 0xc3, 0x81, 0x36, 0x36, 0x36, 0x36, 0x81, 0xc3, 0x66, 0x3c, 0x18, + 0x06, 0xd3, 0xd9, 0x0f, 0x06, 0x7e, 0xc3, 0xdb, 0xd7, 0xde, 0xfe, 0xff, + 0x33, 0xff, 0xfe, 0xff, 0xff, 0xdb, 0xff, 0x66, 0x7e, 0xff, 0xc3, 0xe7, + 0x66, 0xff, 0xff, 0xc3, 0xff, 0x7e, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xff, + 0xff, 0x1b, 0x1b, 0x03, 0x7e, 0xff, 0xc3, 0xfb, 0x7a, 0xff, 0xff, 0x18, + 0xff, 0xff, 0xc3, 0xff, 0xff, 0xc3, 0x60, 0xe3, 0xc3, 0xff, 0x7f, 0xff, + 0xff, 0x1c, 0xf7, 0xe3, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xff, 0xfe, 0x0c, + 0xfe, 0xff, 0xff, 0xfe, 0x18, 0x7f, 0xff, 0x7e, 0xff, 0xc3, 0xff, 0x7e, + 0xff, 0xff, 0x1b, 0x1f, 0x0e, 0x7e, 0xff, 0xc3, 0x7f, 0xde, 0xff, 0xff, + 0x1b, 0xff, 0xee, 0x4e, 0xdf, 0xdb, 0xfb, 0x72, 0x03, 0xff, 0xff, 0x03, + 0x03, 0x7f, 0xff, 0xc0, 0xff, 0x7f, 0x3f, 0x7f, 0xc0, 0x7f, 0x3f, 0xff, + 0x7f, 0x30, 0x7f, 0xff, 0xe7, 0xe7, 0x18, 0x18, 0xe7, 0xe7, 0x0f, 0x1f, + 0xf0, 0x1f, 0x0f, 0xe3, 0xf3, 0xdb, 0xcf, 0xc7, 0xff, 0xff, 0xc3, 0xc3, + 0x03, 0x0f, 0x3c, 0xf0, 0xc0, 0xc3, 0xc3, 0xff, 0xff, 0x04, 0x06, 0x03, + 0x06, 0x04, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x03, 0x07, 0x60, 0xf4, 0xd4, + 0xf4, 0xf8, 0xff, 0xff, 0xcc, 0xfc, 0x78, 0x78, 0xfc, 0xcc, 0xcc, 0x48, + 0x78, 0xfc, 0xcc, 0xff, 0xff, 0x78, 0xfc, 0xac, 0xbc, 0xb8, 0x18, 0xfe, + 0xff, 0x1b, 0x1b, 0xb8, 0xbc, 0xac, 0xfc, 0x78, 0xff, 0xff, 0x18, 0xf8, + 0xf0, 0xcc, 0xfd, 0xfd, 0xc0, 0xc0, 0xcc, 0xfd, 0x7d, 0xff, 0xff, 0x10, + 0xfc, 0xec, 0x7f, 0xff, 0xc0, 0xc0, 0xfc, 0xfc, 0x0c, 0xfc, 0x0c, 0xfc, + 0xf8, 0xfc, 0xf8, 0x0c, 0xfc, 0xf8, 0x78, 0xfc, 0xcc, 0xfc, 0x78, 0xfc, + 0xfc, 0x6c, 0x7c, 0x38, 0x38, 0x7c, 0x6c, 0xfc, 0xf8, 0xfc, 0xf8, 0x0c, + 0x1c, 0x18, 0xd8, 0xdc, 0xfc, 0xec, 0x6c, 0x0c, 0x7f, 0xff, 0xcc, 0xcc, + 0x7c, 0xfc, 0xc0, 0x7c, 0xfc, 0x3c, 0x7c, 0xc0, 0x7c, 0x3c, 0x7c, 0xfc, + 0xc0, 0x60, 0xc0, 0xfc, 0x7c, 0xcc, 0xfc, 0x30, 0xfc, 0xdc, 0x9c, 0xbc, + 0xb0, 0xfc, 0x7c, 0xcc, 0xec, 0xfc, 0xdc, 0xcc, 0x10, 0x56, 0xef, 0x81, + 0xef, 0xef, 0x81, 0xee, 0x56, 0x10, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x18, + 0x3c, 0x7e, 0x18, 0x18, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, 0x3e, 0x1f, + 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, 0x3e, 0x1f, 0x8f, 0xe3, 0xf1, 0xf8, 0x7c, + 0x3e, 0x1f, 0x8f, 0xc7, 0xf1, 0xf8, 0x7c, 0x3e, 0x1f, 0x8f, 0xc7, 0xe3, + 0xf8, 0x7c, 0x3e, 0x1f, 0x8f, 0xc7, 0xe3, 0xf1, 0x7c, 0x3e, 0x1f, 0x8f, + 0xc7, 0xe3, 0xf1, 0xf8, 0x3e, 0x1f, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, + 0x1f, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, 0x3e, 0xff, 0xff, 0xe7, 0xc3, + 0xc3, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xc3, 0xc3, 0xe7, 0xff, 0xff, + 0xff, 0xf8, 0xe0, 0xc0, 0xc0, 0xe0, 0xf8, 0xff, 0xff, 0x1f, 0x07, 0x03, + 0x03, 0x07, 0x1f, 0xff, 0x1c, 0x3e, 0x77, 0x63, 0x77, 0x3e, 0x1c, 0x1c, + 0x36, 0x63, 0x41, 0x63, 0x36, 0x1c, 0x1c, 0x08, 0x41, 0x63, 0x41, 0x08, + 0x1c, 0x08, 0x14, 0x22, 0x49, 0x22, 0x14, 0x08, 0x55, 0xaa, 0x55, 0xaa, + 0x55, 0xaa, 0x55, 0xaa, 0x33, 0x33, 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, + 0x33, 0x33, 0x0e, 0x11, 0x0e, 0x12, 0x1f, 0x10, 0x19, 0x15, 0x12, 0x11, + 0x15, 0x0a, 0x07, 0x04, 0x1e, 0x17, 0x15, 0x09, 0x0e, 0x15, 0x09, 0x01, + 0x1d, 0x03, 0x0a, 0x15, 0x0a, 0x12, 0x15, 0x0e, 0x0a, 0x10, 0x0a, 0x04, + 0x0a, 0x11, 0x0a, 0x0a, 0x0a, 0x11, 0x0a, 0x04, 0x01, 0x15, 0x02, 0x01, + 0x03, 0x07, 0x03, 0x01, 0x04, 0x06, 0x07, 0x06, 0x04, 0x04, 0x0e, 0x1f, + 0x1f, 0x0e, 0x04, 0x18, 0x3c, 0x7e, 0x7e, 0x3c, 0x18, 0x3c, 0x42, 0x81, + 0x81, 0x81, 0x81, 0x42, 0x3c, 0x3c, 0x42, 0x99, 0xbd, 0xbd, 0x99, 0x42, + 0x3c, 0x7f, 0x49, 0x41, 0x6b, 0x41, 0x49, 0x7f, 0x80, 0x40, 0x20, 0x10, + 0x0f, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x3e, 0x01, 0x01, 0x01, + 0x01, 0x02, 0x04, 0x38, 0x08, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, + 0x15, 0x0a, 0x15, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/boop/branches/ram_version/telekatz_soundtest/fonts/charset.info b/boop/branches/ram_version/telekatz_soundtest/fonts/charset.info new file mode 100644 index 0000000..5c205b8 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/fonts/charset.info @@ -0,0 +1,22 @@ +const unsigned char charset_info[] = { +0x08, 0x84, 0x48, 0x84, 0x44, 0x44, 0x48, 0x88, // 0- 15 graticule & borders +0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, // 16- 31 graticule & symbols +0x21, 0x35, 0x55, 0x51, 0x33, 0x55, 0x35, 0x24, // 32- 47 ascii, font 1 +0x55, 0x55, 0x55, 0x55, 0x55, 0x23, 0x44, 0x45, // 48- 63 ascii, font 1 +0x55, 0x55, 0x55, 0x55, 0x53, 0x55, 0x55, 0x55, // 64- 80 ascii, font 1 +0x55, 0x55, 0x55, 0x55, 0x55, 0x53, 0x43, 0x35, // 80- 95 ascii, font 1 +0x24, 0x44, 0x44, 0x44, 0x43, 0x34, 0x35, 0x44, // 96-112 ascii, font 1 +0x44, 0x44, 0x34, 0x55, 0x54, 0x43, 0x13, 0x55, // 112-127 ascii, font 1 +0x32, 0x55, 0x55, 0x53, 0x44, 0x54, 0x35, 0x25, // 128-143 ascii, bold font +0x55, 0x55, 0x55, 0x55, 0x55, 0x23, 0x54, 0x55, // 144-159 ascii, bold font +0x55, 0x55, 0x55, 0x55, 0x54, 0x55, 0x55, 0x55, // 160-175 ascii, bold font +0x55, 0x55, 0x55, 0x55, 0x65, 0x54, 0x54, 0x55, // 176-191 ascii, bold font +0x25, 0x55, 0x55, 0x55, 0x54, 0x45, 0x47, 0x55, // 192-207 ascii, bold font +0x55, 0x55, 0x55, 0x57, 0x55, 0x54, 0x24, 0x55, // 208-223 ascii, bold font +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, // 224-239 symbols +0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 240-255 symbols +0x33, 0x33, 0x33, 0x33, 0x33, 0x12, 0x33, 0x33, // 256-271 small numbers +0x55, 0x33, 0x68, 0x87, 0x84, 0x44, 0x44, 0x44 // 272-288 symbols +}; + +const unsigned char charset_dlines = 1; diff --git a/boop/branches/ram_version/telekatz_soundtest/fonts/smooth.bits b/boop/branches/ram_version/telekatz_soundtest/fonts/smooth.bits new file mode 100644 index 0000000..5bda21c --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/fonts/smooth.bits @@ -0,0 +1,279 @@ +const unsigned char smooth_mt_bits[] = { + 0x00, 0x00, 0x00, 0xfc, 0xfc, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x20, 0x20, + 0xe0, 0x3c, 0x20, 0xe0, 0x3c, 0x20, 0x20, 0xe0, 0xf0, 0x10, 0xfc, 0x10, + 0x30, 0x60, 0x78, 0xfc, 0x84, 0xfc, 0x78, 0x00, 0x80, 0x20, 0x18, 0x84, + 0x80, 0x80, 0x00, 0x80, 0xc0, 0x7c, 0x64, 0xc4, 0x84, 0x0c, 0x00, 0x40, + 0xc0, 0x40, 0x00, 0x3c, 0x3c, 0xe0, 0xf8, 0x0c, 0x04, 0x04, 0x08, 0xf0, + 0x80, 0x00, 0x50, 0x60, 0xfc, 0x60, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x78, 0x0c, 0xf0, 0xf8, 0x04, 0x04, 0x04, + 0x0c, 0xf8, 0xc0, 0x08, 0x08, 0xfc, 0xfc, 0x00, 0x00, 0x18, 0x04, 0x04, + 0x04, 0x8c, 0xf8, 0x30, 0x08, 0x04, 0x44, 0x44, 0x44, 0xbc, 0x98, 0x00, + 0x00, 0x80, 0x40, 0x30, 0x08, 0xfc, 0xfc, 0x00, 0x7c, 0x44, 0x44, 0x44, + 0x44, 0x84, 0x00, 0xe0, 0xf8, 0x4c, 0x44, 0x44, 0xc4, 0x8c, 0x00, 0x0c, + 0x04, 0x04, 0x04, 0xc4, 0x74, 0x0c, 0x00, 0x10, 0xb8, 0x44, 0x44, 0x44, + 0xfc, 0xb8, 0x00, 0x70, 0xf8, 0x04, 0x04, 0x04, 0x8c, 0xf8, 0xc0, 0xc0, + 0x00, 0x00, 0xc0, 0x00, 0x80, 0x80, 0x80, 0xc0, 0x40, 0x40, 0x20, 0x20, + 0x30, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x30, 0x20, + 0x20, 0x40, 0x40, 0xc0, 0x80, 0x80, 0x80, 0x08, 0x04, 0x84, 0x84, 0xc4, + 0x78, 0x10, 0x80, 0xc0, 0x20, 0x10, 0x80, 0xc8, 0x48, 0x08, 0x88, 0x90, + 0x10, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x18, 0x1c, 0xf8, 0xc0, + 0x00, 0x00, 0x00, 0x04, 0xfc, 0xfc, 0x84, 0x84, 0x84, 0xc4, 0x78, 0x30, + 0xe0, 0xf0, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x18, 0x00, 0x04, 0xfc, + 0xfc, 0x04, 0x04, 0x04, 0x04, 0x08, 0xf0, 0xe0, 0x04, 0x04, 0xfc, 0xfc, + 0x84, 0x84, 0x84, 0xe4, 0x0c, 0x04, 0xfc, 0xfc, 0x84, 0x84, 0x84, 0x84, + 0xe4, 0x0c, 0xe0, 0xf0, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x00, + 0x04, 0xfc, 0xfc, 0x84, 0x80, 0x80, 0x80, 0x84, 0xfc, 0xfc, 0x04, 0x04, + 0xfc, 0xfc, 0x04, 0x00, 0x00, 0x04, 0x04, 0xfc, 0xfc, 0x04, 0x04, 0xfc, + 0xfc, 0xc4, 0x20, 0x20, 0x14, 0x0c, 0x04, 0x04, 0x00, 0x04, 0xfc, 0xfc, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfc, 0x1c, 0x38, 0xf0, 0xc0, + 0x00, 0x00, 0x80, 0x60, 0x18, 0xfc, 0xfc, 0x04, 0x04, 0xfc, 0x1c, 0x38, + 0x60, 0xc0, 0x80, 0x00, 0x04, 0xfc, 0x04, 0x04, 0xe0, 0xf0, 0x08, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x18, 0xf0, 0x80, 0x04, 0xfc, 0xfc, 0x84, 0x84, + 0x84, 0xc4, 0x78, 0x30, 0xe0, 0xf0, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x18, 0xf0, 0x80, 0x04, 0xfc, 0xfc, 0x84, 0x84, 0x84, 0x84, 0x7c, 0x38, + 0x00, 0x00, 0x38, 0x7c, 0xc4, 0x84, 0x84, 0x84, 0x1c, 0x18, 0x0c, 0x04, + 0x04, 0x04, 0xfc, 0xfc, 0x04, 0x04, 0x04, 0x0c, 0x04, 0xfc, 0xfc, 0x04, + 0x00, 0x00, 0x00, 0x04, 0xfc, 0xfc, 0x04, 0x04, 0x0c, 0x3c, 0xe4, 0x80, + 0x00, 0x00, 0x80, 0x64, 0x0c, 0x04, 0x04, 0x0c, 0xfc, 0xc4, 0x00, 0x00, + 0xe0, 0x1c, 0x7c, 0xc0, 0x00, 0x00, 0xe4, 0x1c, 0x04, 0x04, 0x04, 0x1c, + 0x7c, 0xe0, 0xc0, 0x34, 0x0c, 0x04, 0x04, 0x04, 0x0c, 0x1c, 0x74, 0xe0, + 0x80, 0x40, 0x14, 0x0c, 0x04, 0x0c, 0x04, 0x04, 0x84, 0xc4, 0x74, 0x3c, + 0x0c, 0x04, 0xfc, 0xfc, 0x04, 0x00, 0x0c, 0x78, 0xc0, 0x00, 0x00, 0x04, + 0x04, 0xfc, 0xfc, 0x20, 0x10, 0x18, 0x0c, 0x04, 0x0c, 0x10, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x40, + 0x60, 0x20, 0x20, 0x20, 0xc0, 0x80, 0x00, 0x00, 0x04, 0xfc, 0xfc, 0x20, + 0x20, 0x20, 0xc0, 0x80, 0x80, 0xc0, 0x20, 0x20, 0x20, 0x20, 0x40, 0x80, + 0xc0, 0x20, 0x20, 0x24, 0xfc, 0xfc, 0x00, 0x00, 0x80, 0xc0, 0x20, 0x20, + 0x20, 0x20, 0xc0, 0x00, 0x20, 0xf8, 0xfc, 0x24, 0x24, 0x04, 0x00, 0x80, + 0xc0, 0x20, 0x20, 0x20, 0xe0, 0xe0, 0x20, 0x04, 0xfc, 0xfc, 0x20, 0x20, + 0x20, 0xe0, 0x80, 0x00, 0x20, 0xec, 0xe0, 0x00, 0x00, 0x00, 0x20, 0xec, + 0xec, 0x04, 0xfc, 0xfc, 0x00, 0xa0, 0x60, 0x20, 0x20, 0x04, 0xfc, 0xfc, + 0x00, 0x20, 0xe0, 0xe0, 0x20, 0x20, 0x20, 0xe0, 0xc0, 0x20, 0x20, 0x20, + 0xe0, 0x80, 0x00, 0x20, 0xe0, 0xe0, 0x20, 0x20, 0x20, 0xe0, 0x80, 0x00, + 0x80, 0xc0, 0x20, 0x20, 0x20, 0x60, 0xc0, 0x00, 0x20, 0xe0, 0xe0, 0x20, + 0x20, 0x20, 0x60, 0xc0, 0x00, 0x80, 0xc0, 0x20, 0x20, 0x20, 0xe0, 0xe0, + 0x20, 0x20, 0xe0, 0xe0, 0x20, 0x20, 0x60, 0x60, 0xc0, 0xe0, 0x20, 0x20, + 0x60, 0x60, 0x20, 0xf8, 0xf8, 0x20, 0x20, 0x00, 0x20, 0xe0, 0xe0, 0x00, + 0x00, 0x20, 0xe0, 0xe0, 0x00, 0x20, 0x60, 0xe0, 0x20, 0x00, 0x00, 0xa0, + 0x60, 0x20, 0x20, 0x60, 0xe0, 0x20, 0x00, 0x80, 0xe0, 0x80, 0x00, 0x20, + 0xe0, 0x20, 0x20, 0x60, 0xe0, 0x00, 0x80, 0xe0, 0x20, 0x20, 0x20, 0x20, + 0xe0, 0xa0, 0x00, 0x00, 0xa0, 0x60, 0x20, 0x60, 0x60, 0x20, 0x20, 0xe0, + 0xe0, 0x20, 0x00, 0x00, 0xf8, 0x7c, 0x04, 0x04, 0xfc, 0xfc, 0x04, 0x04, + 0xfc, 0xf0, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x40, 0x6c, 0x20, 0x20, 0x2c, 0xc0, 0x80, 0x00, 0x80, 0xc0, 0x2c, + 0x20, 0x20, 0x6c, 0xc0, 0x00, 0x20, 0xe0, 0xec, 0x00, 0x00, 0x2c, 0xe0, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x39, 0x1c, 0xf9, 0xc0, 0x00, 0x00, + 0x00, 0xe0, 0xf0, 0x08, 0x05, 0x04, 0x04, 0x05, 0x04, 0x18, 0xf0, 0x80, + 0x04, 0xfc, 0xfc, 0x04, 0x01, 0x00, 0x00, 0x05, 0xfc, 0xfc, 0x04, 0x00, + 0x00, 0xf8, 0xfc, 0x04, 0x64, 0xf4, 0x8c, 0x00, 0x00 }; + +const unsigned char smooth_lt_bits[] = { + 0x00, 0x00, 0x00, 0xfc, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0xf8, 0x6c, 0x00, 0xf0, 0x7c, 0x04, 0x00, 0xc0, 0xa0, 0x10, 0xfc, 0x10, + 0x60, 0x10, 0x30, 0x4c, 0x84, 0x4c, 0x30, 0x00, 0x40, 0x70, 0x80, 0x8c, + 0x80, 0x00, 0x00, 0x00, 0xd8, 0x38, 0x4c, 0x84, 0x04, 0x00, 0x0c, 0x00, + 0x40, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x30, 0x00, 0x00, 0x00, 0x3c, 0xf8, + 0x40, 0xd8, 0x50, 0x10, 0xfc, 0x10, 0x50, 0xd8, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0x14, 0xe0, 0x18, 0x08, 0x04, 0x04, + 0x18, 0xf0, 0x20, 0x10, 0x04, 0xfc, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, + 0x04, 0xc4, 0x7c, 0x78, 0x04, 0x08, 0x00, 0x44, 0xe4, 0xe8, 0x38, 0x00, + 0x00, 0x80, 0xe0, 0x00, 0x1c, 0xfc, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x40, + 0x80, 0xc0, 0x80, 0xd0, 0x90, 0x80, 0x04, 0x44, 0x04, 0x88, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x80, 0xac, 0x1c, 0x04, 0xa8, 0xfc, 0xec, 0x44, 0x44, + 0x28, 0x98, 0x00, 0xf8, 0x8c, 0x8c, 0x04, 0x04, 0x00, 0xf0, 0x20, 0xc0, + 0xc0, 0x00, 0xc0, 0xc0, 0x00, 0x80, 0xc0, 0x00, 0xc0, 0x60, 0x60, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x60, 0x60, 0xc0, 0x00, 0xc0, 0x80, 0x00, 0x04, 0x08, 0x04, 0x84, 0x0c, + 0x7c, 0x28, 0x00, 0xe0, 0x70, 0x10, 0xd8, 0x00, 0x00, 0x48, 0x80, 0x88, + 0x30, 0x30, 0xe0, 0x80, 0x00, 0x00, 0x80, 0x40, 0x2c, 0x2c, 0x70, 0xa0, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x84, 0x00, 0x00, 0x84, 0x8c, 0xfc, 0x08, + 0xd0, 0x38, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x08, 0x0c, 0x18, 0x00, 0xfc, + 0x04, 0x00, 0x04, 0x04, 0x08, 0x1c, 0x38, 0xd0, 0x00, 0x00, 0xfc, 0x84, + 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x00, 0x04, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x1c, 0xd0, 0x38, 0x0c, 0x00, 0x04, 0x00, 0x04, 0x08, 0x1c, 0x18, + 0x00, 0x04, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xfc, 0x00, 0x00, + 0x04, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x04, 0x00, 0x00, 0x04, + 0xfc, 0x80, 0xc0, 0x10, 0x08, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0c, 0x7c, 0x60, 0x80, + 0x80, 0x00, 0x00, 0x10, 0x04, 0xfc, 0x04, 0x00, 0x00, 0xfc, 0x0c, 0x30, + 0xf0, 0xc0, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xd0, 0x38, 0x1c, 0x00, + 0x04, 0x00, 0x04, 0x08, 0x28, 0xf0, 0x60, 0x00, 0x04, 0xfc, 0x00, 0x00, + 0x84, 0x0c, 0xfc, 0x08, 0xd0, 0x38, 0x1c, 0x00, 0x04, 0x00, 0x04, 0x08, + 0x28, 0xf0, 0x60, 0x00, 0x04, 0xfc, 0x00, 0x80, 0x84, 0x84, 0xc8, 0x70, + 0x00, 0x00, 0x70, 0xe8, 0xc4, 0xc0, 0x84, 0x84, 0x88, 0x04, 0x1c, 0x00, + 0x00, 0x00, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0xfc, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0xfc, 0x00, 0x00, 0x14, 0x7c, 0xf0, 0x40, + 0x00, 0x00, 0x40, 0xb0, 0x14, 0x00, 0x00, 0x14, 0x7c, 0xa0, 0x00, 0x00, + 0x50, 0x2c, 0xb8, 0xa0, 0x00, 0x00, 0x10, 0x24, 0x00, 0x00, 0x0c, 0x0c, + 0x3c, 0xf0, 0xe0, 0x00, 0x1c, 0x04, 0x00, 0x00, 0x04, 0x3c, 0x38, 0xc0, + 0xc0, 0xe0, 0x3c, 0x04, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xe0, 0x60, 0x1c, + 0x1c, 0x00, 0xfc, 0x04, 0x00, 0x04, 0x14, 0xb4, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0x00, 0x20, 0x30, 0x08, 0x0c, 0x0c, 0x18, 0x18, 0x10, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x08, 0x20, + 0x20, 0x20, 0x20, 0x60, 0xe0, 0x40, 0x00, 0x04, 0x00, 0xfc, 0x40, 0x00, + 0x00, 0x20, 0x60, 0xc0, 0xc0, 0x60, 0x60, 0x20, 0x20, 0x40, 0x20, 0xc0, + 0x60, 0x20, 0x00, 0x00, 0x44, 0xfc, 0x00, 0x00, 0xc0, 0x60, 0x60, 0x20, + 0x20, 0x40, 0xc0, 0x80, 0x00, 0xfc, 0x24, 0x04, 0x04, 0x04, 0x04, 0xc0, + 0x60, 0x20, 0x00, 0x00, 0x40, 0xe0, 0x00, 0x00, 0xfc, 0x40, 0x00, 0x00, + 0x60, 0xc0, 0x40, 0x00, 0x00, 0xe4, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x24, + 0xe4, 0x00, 0xfc, 0x00, 0x80, 0x40, 0x20, 0x20, 0x00, 0x00, 0xfc, 0x00, + 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x60, 0xc0, 0x40, 0x00, 0x00, 0x60, + 0xc0, 0x40, 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x60, 0xc0, 0x40, 0x00, + 0xc0, 0x60, 0x60, 0x20, 0x20, 0x00, 0xc0, 0x80, 0x00, 0xe0, 0x40, 0x40, + 0x00, 0x20, 0x00, 0xc0, 0x80, 0xc0, 0x60, 0x20, 0x00, 0x00, 0x40, 0xe0, + 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x20, 0x60, 0xc0, 0x80, 0x20, 0x20, + 0x20, 0x40, 0x00, 0xfc, 0x24, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xa0, 0xe0, 0x80, 0x00, 0x00, 0x00, + 0xa0, 0x00, 0x00, 0xa0, 0xe0, 0x00, 0x00, 0x40, 0x60, 0x40, 0x00, 0x80, + 0x60, 0x20, 0x20, 0x20, 0xe0, 0x80, 0x00, 0x20, 0x60, 0x00, 0x00, 0x60, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x60, 0x20, 0x00, 0x80, 0xa0, + 0x60, 0x60, 0x00, 0x80, 0xfc, 0x84, 0x04, 0x00, 0xfc, 0x00, 0x00, 0x04, + 0x78, 0x88, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x24, 0x2c, 0x20, 0x64, 0xec, 0x40, 0x00, 0xc0, 0x6c, 0x64, + 0x20, 0x2c, 0x04, 0xc0, 0x80, 0x00, 0xec, 0x04, 0x00, 0x0c, 0x04, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x55, 0x2c, 0x75, 0xa1, 0x00, 0x00, + 0x00, 0xd0, 0x38, 0x1c, 0x00, 0x05, 0x00, 0x04, 0x09, 0x28, 0xf0, 0x60, + 0x00, 0x04, 0xfc, 0x01, 0x00, 0x00, 0x01, 0x00, 0x04, 0xfc, 0x00, 0x00, + 0x00, 0xf8, 0x00, 0x04, 0xf4, 0x9c, 0x08, 0x08, 0x00 }; + +const unsigned char smooth_mb_bits[] = { + 0x00, 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x1e, + 0x03, 0x02, 0x1e, 0x03, 0x02, 0x02, 0x00, 0x08, 0x19, 0x11, 0xff, 0x12, + 0x1e, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x04, 0x01, 0x00, 0x06, 0x0f, 0x10, + 0x10, 0x1f, 0x0f, 0x07, 0x0c, 0x10, 0x10, 0x10, 0x11, 0x13, 0x0e, 0x1e, + 0x11, 0x10, 0x10, 0x00, 0x00, 0x0f, 0x1f, 0x20, 0x40, 0x40, 0x30, 0x1f, + 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x1f, 0x1f, 0x01, 0x01, 0x01, 0x20, 0x38, 0x08, 0x01, 0x01, 0x01, 0x01, + 0x18, 0x00, 0x30, 0x1e, 0x03, 0x00, 0x00, 0x07, 0x0f, 0x10, 0x10, 0x10, + 0x18, 0x0f, 0x01, 0x10, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x18, 0x1c, 0x16, + 0x13, 0x11, 0x10, 0x18, 0x0c, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x02, + 0x03, 0x02, 0x02, 0x12, 0x12, 0x1f, 0x1f, 0x12, 0x0c, 0x10, 0x10, 0x10, + 0x10, 0x0f, 0x07, 0x07, 0x0f, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x02, 0x00, + 0x00, 0x18, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x07, 0x0f, 0x10, 0x10, 0x10, + 0x18, 0x0f, 0x02, 0x00, 0x18, 0x11, 0x11, 0x11, 0x08, 0x07, 0x00, 0x18, + 0x00, 0x00, 0x38, 0x08, 0x01, 0x01, 0x02, 0x02, 0x06, 0x04, 0x04, 0x0c, + 0x08, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x08, 0x0c, + 0x04, 0x04, 0x06, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x3f, 0x20, 0x42, 0x8f, 0x98, 0x90, 0x90, 0x9f, 0x1f, + 0x10, 0x08, 0x07, 0x01, 0x10, 0x18, 0x13, 0x02, 0x02, 0x02, 0x02, 0x13, + 0x1e, 0x18, 0x10, 0x10, 0x1f, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x0e, + 0x03, 0x07, 0x08, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0c, 0x00, 0x10, 0x1f, + 0x1f, 0x10, 0x10, 0x10, 0x10, 0x08, 0x07, 0x03, 0x10, 0x10, 0x1f, 0x1f, + 0x10, 0x10, 0x10, 0x11, 0x18, 0x10, 0x1f, 0x1f, 0x10, 0x10, 0x00, 0x00, + 0x01, 0x00, 0x03, 0x07, 0x08, 0x10, 0x10, 0x10, 0x10, 0x11, 0x1f, 0x0f, + 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x10, + 0x1f, 0x1f, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x7f, 0x3f, 0x00, 0x10, 0x1f, + 0x1f, 0x10, 0x01, 0x02, 0x0c, 0x1c, 0x18, 0x10, 0x00, 0x10, 0x1f, 0x1f, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x1c, 0x10, 0x1f, 0x10, 0x10, 0x00, 0x01, + 0x07, 0x06, 0x01, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x10, 0x1f, 0x10, 0x10, + 0x00, 0x00, 0x03, 0x06, 0x0c, 0x1f, 0x00, 0x00, 0x03, 0x07, 0x08, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x0c, 0x07, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x08, 0x10, 0x10, 0x10, 0x30, 0x50, + 0x4c, 0x07, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x00, 0x01, 0x07, 0x1c, + 0x10, 0x00, 0x0c, 0x1c, 0x10, 0x10, 0x10, 0x11, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x18, + 0x10, 0x10, 0x10, 0x10, 0x0f, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, + 0x1c, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1e, 0x0e, + 0x00, 0x00, 0x00, 0x07, 0x1e, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x10, 0x1c, + 0x12, 0x01, 0x03, 0x17, 0x1c, 0x18, 0x10, 0x00, 0x00, 0x00, 0x10, 0x1f, + 0x1f, 0x10, 0x00, 0x00, 0x00, 0x18, 0x1c, 0x16, 0x13, 0x10, 0x10, 0x10, + 0x10, 0x18, 0x7f, 0x7f, 0x40, 0x00, 0x00, 0x00, 0x03, 0x1e, 0x30, 0x40, + 0x40, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0x1f, 0x11, 0x11, 0x11, 0x1f, 0x1f, 0x10, 0x00, 0x10, 0x1f, 0x1f, 0x10, + 0x10, 0x10, 0x0f, 0x07, 0x07, 0x0f, 0x10, 0x10, 0x10, 0x08, 0x04, 0x07, + 0x0f, 0x10, 0x10, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x07, 0x0f, 0x11, 0x11, + 0x11, 0x11, 0x0d, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x47, + 0xcf, 0x90, 0x90, 0x90, 0xff, 0x7f, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x00, + 0x10, 0x1f, 0x1f, 0x10, 0x10, 0x1f, 0x1f, 0x10, 0xc0, 0x80, 0x80, 0xff, + 0x7f, 0x10, 0x1f, 0x1f, 0x11, 0x12, 0x1c, 0x18, 0x10, 0x10, 0x1f, 0x1f, + 0x10, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x10, + 0x1f, 0x1f, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x10, 0x1f, 0x1f, 0x10, + 0x07, 0x0f, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x03, 0x80, 0xff, 0xff, 0x90, + 0x10, 0x10, 0x18, 0x0f, 0x03, 0x07, 0x0f, 0x10, 0x10, 0x90, 0xff, 0xff, + 0x80, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x18, 0x19, 0x13, 0x13, + 0x1e, 0x0e, 0x00, 0x0f, 0x1f, 0x10, 0x18, 0x08, 0x00, 0x0f, 0x1f, 0x10, + 0x10, 0x00, 0x1f, 0x1f, 0x10, 0x00, 0x00, 0x01, 0x07, 0x1c, 0x0c, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x1e, 0x1c, 0x03, 0x00, 0x0f, 0x1c, 0x07, + 0x00, 0x00, 0x10, 0x18, 0x14, 0x03, 0x17, 0x1c, 0x18, 0x10, 0x00, 0xc0, + 0x80, 0xc7, 0x3c, 0x0c, 0x01, 0x00, 0x00, 0x10, 0x1c, 0x1e, 0x13, 0x11, + 0x10, 0x18, 0x01, 0x01, 0x7e, 0xfc, 0x80, 0x80, 0xff, 0xff, 0x80, 0x80, + 0xfe, 0x3f, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x00, 0x0e, 0x1f, 0x11, 0x11, 0x11, 0x1f, 0x1f, 0x10, 0x07, 0x0f, 0x10, + 0x10, 0x10, 0x18, 0x0f, 0x03, 0x00, 0x0f, 0x1f, 0x10, 0x10, 0x00, 0x1f, + 0x1f, 0x10, 0x10, 0x18, 0x17, 0x03, 0x02, 0x02, 0x02, 0x17, 0x1e, 0x18, + 0x10, 0x03, 0x07, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0c, 0x07, 0x00, + 0x00, 0x03, 0x0f, 0x18, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x07, 0x00, 0x00, + 0x10, 0x1f, 0x1f, 0x18, 0x10, 0x10, 0x11, 0x1b, 0x0e }; + +const unsigned char smooth_lb_bits[] = { + 0x00, 0x00, 0x00, 0x1b, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1f, + 0x07, 0x00, 0x1b, 0x0f, 0x00, 0x00, 0x00, 0x19, 0x11, 0x13, 0xff, 0x13, + 0x06, 0x0e, 0x00, 0x00, 0x10, 0x10, 0x02, 0x02, 0x00, 0x09, 0x1f, 0x19, + 0x10, 0x09, 0x06, 0x0f, 0x1b, 0x08, 0x10, 0x01, 0x13, 0x0e, 0x0c, 0x0c, + 0x1a, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38, 0x40, 0x00, 0x00, 0x68, 0x3f, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x01, 0x00, 0x00, 0x00, 0x50, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x28, 0x2d, 0x05, 0x00, 0x00, 0x03, 0x0c, 0x08, 0x10, 0x10, + 0x0c, 0x07, 0x02, 0x10, 0x10, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x18, + 0x18, 0x18, 0x18, 0x1c, 0x1c, 0x08, 0x10, 0x00, 0x10, 0x01, 0x0f, 0x05, + 0x02, 0x03, 0x00, 0x10, 0x10, 0x1f, 0x12, 0x10, 0x1c, 0x18, 0x10, 0x10, + 0x18, 0x18, 0x0f, 0x03, 0x18, 0x08, 0x00, 0x10, 0x00, 0x0f, 0x05, 0x00, + 0x00, 0x10, 0x15, 0x03, 0x00, 0x00, 0x00, 0x0f, 0x18, 0x18, 0x10, 0x10, + 0x00, 0x1f, 0x05, 0x00, 0x01, 0x11, 0x11, 0x10, 0x1d, 0x0f, 0x03, 0x18, + 0x18, 0x60, 0x38, 0x10, 0x01, 0x03, 0x03, 0x06, 0x00, 0x06, 0x0c, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x0c, 0x06, 0x00, 0x06, 0x03, 0x03, 0x01, 0x00, 0x00, 0x1f, 0x18, 0x00, + 0x00, 0x00, 0x17, 0x18, 0x60, 0x45, 0x5f, 0x00, 0x90, 0x00, 0x08, 0xdf, + 0x40, 0x0c, 0x0f, 0x02, 0x00, 0x1c, 0x06, 0x03, 0x02, 0x02, 0x03, 0x07, + 0x1f, 0x14, 0x00, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x10, 0x11, 0x09, 0x07, + 0x05, 0x0e, 0x18, 0x00, 0x00, 0x10, 0x10, 0x00, 0x0c, 0x04, 0x00, 0x1f, + 0x10, 0x00, 0x10, 0x10, 0x08, 0x1c, 0x0e, 0x05, 0x00, 0x10, 0x1f, 0x10, + 0x10, 0x10, 0x10, 0x11, 0x1c, 0x00, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x05, 0x0e, 0x1c, 0x08, 0x10, 0x00, 0x11, 0x10, 0x01, 0x0f, + 0x00, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1f, 0x00, 0x00, + 0x10, 0x1f, 0x00, 0x40, 0x80, 0x80, 0xc0, 0xff, 0x40, 0x00, 0x00, 0x10, + 0x1f, 0x01, 0x03, 0x07, 0x06, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x18, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x03, + 0x07, 0x06, 0x02, 0x00, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x07, 0x1c, 0x1f, 0x00, 0x00, 0x05, 0x0e, 0x1c, 0x00, + 0x10, 0x00, 0x10, 0x08, 0x0a, 0x07, 0x03, 0x00, 0x10, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x1c, 0x00, 0x10, 0x30, 0x30, 0x08, + 0x0a, 0x07, 0x03, 0x00, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x1a, + 0x10, 0x10, 0x1c, 0x08, 0x10, 0x10, 0x01, 0x11, 0x1b, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0f, 0x04, + 0x10, 0x00, 0x10, 0x18, 0x1c, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x17, + 0x1a, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0b, 0x1d, 0x15, + 0x01, 0x00, 0x00, 0x0b, 0x1d, 0x15, 0x01, 0x00, 0x00, 0x00, 0x18, 0x18, + 0x07, 0x00, 0x01, 0x0e, 0x1e, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1c, 0x1f, 0x11, 0x11, 0x10, 0x10, + 0x10, 0x1c, 0x7f, 0x40, 0x00, 0x40, 0x00, 0x00, 0x05, 0x2d, 0x28, 0x00, + 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x1a, 0x11, 0x01, 0x08, 0x1f, 0x10, 0x00, 0x10, 0x00, 0x1f, 0x08, 0x00, + 0x00, 0x10, 0x18, 0x0f, 0x0f, 0x18, 0x18, 0x10, 0x10, 0x14, 0x0c, 0x0f, + 0x18, 0x10, 0x00, 0x00, 0x08, 0x1f, 0x00, 0x10, 0x0b, 0x1d, 0x18, 0x10, + 0x10, 0x08, 0x09, 0x05, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x8f, + 0x98, 0x90, 0x80, 0x80, 0x48, 0x3f, 0x00, 0x00, 0x1f, 0x10, 0x00, 0x00, + 0x00, 0x1f, 0x10, 0x00, 0x00, 0x1f, 0x10, 0x00, 0x40, 0x80, 0x80, 0x40, + 0x7f, 0x00, 0x1f, 0x12, 0x03, 0x07, 0x1c, 0x10, 0x10, 0x00, 0x1f, 0x10, + 0x00, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x1f, 0x10, 0x00, 0x10, 0x00, + 0x1f, 0x10, 0x10, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x1f, 0x10, 0x00, + 0x0f, 0x1c, 0x18, 0x10, 0x10, 0x00, 0x0f, 0x04, 0x00, 0xff, 0x88, 0x08, + 0x00, 0x10, 0x00, 0x0f, 0x04, 0x0f, 0x18, 0x10, 0x00, 0x00, 0x88, 0xff, + 0x00, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x09, 0x11, 0x11, 0x12, + 0x07, 0x0c, 0x00, 0x1f, 0x10, 0x10, 0x18, 0x00, 0x00, 0x1f, 0x18, 0x10, + 0x00, 0x18, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x1a, 0x1a, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0x18, 0x04, 0x01, 0x17, 0x18, 0x0a, + 0x01, 0x00, 0x00, 0x10, 0x0b, 0x03, 0x07, 0x1c, 0x10, 0x10, 0x00, 0xc0, + 0x81, 0x0b, 0x5e, 0x06, 0x03, 0x00, 0x00, 0x18, 0x18, 0x16, 0x17, 0x13, + 0x10, 0x18, 0x01, 0x03, 0x7f, 0x42, 0x80, 0x00, 0xff, 0x00, 0x00, 0xc0, + 0x7c, 0x42, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x0c, 0x1a, 0x11, 0x01, 0x08, 0x1f, 0x10, 0x00, 0x0f, 0x1c, 0x18, + 0x10, 0x10, 0x00, 0x0f, 0x04, 0x00, 0x1f, 0x18, 0x10, 0x00, 0x18, 0x1f, + 0x10, 0x00, 0x00, 0x14, 0x1e, 0x12, 0x02, 0x02, 0x03, 0x03, 0x1f, 0x14, + 0x00, 0x05, 0x0e, 0x1c, 0x00, 0x10, 0x00, 0x10, 0x08, 0x0a, 0x07, 0x03, + 0x00, 0x04, 0x0f, 0x04, 0x10, 0x00, 0x10, 0x18, 0x1c, 0x0f, 0x00, 0x10, + 0x00, 0x1f, 0x00, 0x08, 0x10, 0x11, 0x11, 0x07, 0x0f }; diff --git a/boop/branches/ram_version/telekatz_soundtest/fonts/smooth.info b/boop/branches/ram_version/telekatz_soundtest/fonts/smooth.info new file mode 100644 index 0000000..75389f2 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/fonts/smooth.info @@ -0,0 +1,17 @@ +const unsigned char smooth_info[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 3, 2, 4,10, 7,13,12, 2, 4, 4, 7, 9, 3, 4, 2, 5, + 8, 5, 8, 8, 8, 7, 8, 8, 8, 8, 2, 3, 9, 9, 9, 7, + +14,11, 9,10,10, 9, 9,10,11, 4, 7,10,10,14,12,11, + 9,11,11, 8,10,11,11,15,10,10, 9, 4, 5, 4, 9, 7, + + 4, 8, 9, 7, 9, 8, 7, 8, 9, 4, 5, 8, 4,14, 9, 8, + 9, 8, 7, 6, 6, 9, 9,12, 8, 9, 7, 6, 2, 6, 9, 0, + + 8, 8, 9,11, 11, 11, 10 +}; + +const unsigned char smooth_dlines = 2; diff --git a/boop/branches/ram_version/telekatz_soundtest/fonty.c b/boop/branches/ram_version/telekatz_soundtest/fonty.c new file mode 100644 index 0000000..d2cca53 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/fonty.c @@ -0,0 +1,433 @@ +/* + fonty.c - drawing text & font handling + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lcd.h" +#include "fonty.h" + +#include "fonts/charset.info" +#include "fonts/charset.bits" +/* +#include "fonts/smooth.info" +#include "fonts/smooth.bits" +*/ +static unsigned char tx, ty, coff, dbl; +unsigned char *font_bits, *font_info, font_dlines; +unsigned char *font_bitsUM, *font_bitsUL, *font_bitsMM, *font_bitsML, *font_bitsLM, *font_bitsLL; + +void set_font(unsigned char f) +{ + switch(f) + { +/* + case 2: + coff = 0; + dbl = 16; + font_info = (unsigned char*) smooth_info; + font_bitsUM = (unsigned char*) smooth_mt_bits; + font_bitsUL = (unsigned char*) smooth_lt_bits; + font_bitsLM = (unsigned char*) smooth_mb_bits; + font_bitsLL = (unsigned char*) smooth_lb_bits; + font_dlines = smooth_dlines; + break; +*/ + case 1: + coff = 0; + dbl = 1; + font_bits = (unsigned char*) charset_bits; + font_info = (unsigned char*) charset_info; + font_dlines = charset_dlines; + break; + default: + coff = 0; + dbl = 0; + font_bits = (unsigned char*) charset_bits; + font_info = (unsigned char*) charset_info; + font_dlines = charset_dlines; + break; + } +} + +void _draw_char(unsigned int ch, unsigned char c, unsigned char m) +{ + unsigned char p,q,r,s,t; + unsigned int cpos, cnt; + + cpos = 0; + + for(cnt=0; cnt>1] & 0x0F); + } + else + { + cpos += (font_info[cnt>>1] >> 4); + } + } + + p = font_info[ch>>1]; + if(ch & 0x01) + { + p &= 0x0F; + } + else + { + p >>= 4; + } + + if(dbl == 1) + { + if(ty & 0x07) + { + t = ty & 0x07; + p <<= 1; + + for(cnt=0;cnt>1)]; + q = 0x00; + + if(s & 0x01) + q += 0x03;; + if(s & 0x02) + q += 0x0C;; + if(s & 0x04) + q += 0x30;; + if(s & 0x08) + q += 0xC0;; + + if(c & 0x02) + s = q << t; + else + s = 0x00; + drawbuf[0][r] = s; + drawbuf[0][r-1] = s; + + if(c & 0x01) + s = q << t; + else + s = 0x00; + drawbuf[1][r] = s; + drawbuf[1][r-1] = s; + } + do_rcu(tx,ty,p,m); + + for(cnt=0;cnt>1)]; + q = 0x00; + + if(s & 0x01) + q += 0x03;; + if(s & 0x02) + q += 0x0C;; + if(s & 0x04) + q += 0x30;; + if(s & 0x08) + q += 0xC0;; + + if(c & 0x02) + s = q >> (8-t); + else + s = 0x00; + drawbuf[0][r] = s; + drawbuf[0][r-1] = s; + + if(c & 0x01) + s = q >> (8-t); + else + s = 0x00; + drawbuf[1][r] = s; + drawbuf[1][r-1] = s; + } + do_rcu(tx,ty+8,p,m); + + for(cnt=0;cnt>1)]; + q = 0x00; + + if(s & 0x10) + q += 0x03;; + if(s & 0x20) + q += 0x0C;; + if(s & 0x40) + q += 0x30;; + if(s & 0x80) + q += 0xC0;; + + if(c & 0x02) + s = q << t; + else + s = 0x00; + drawbuf[0][r] = s; + drawbuf[0][r-1] = s; + + if(c & 0x01) + s = q << t; + else + s = 0x00; + drawbuf[1][r] = s; + drawbuf[1][r-1] = s; + } + do_rcu(tx,ty+8,p,m); + + for(cnt=0;cnt>1)]; + q = 0x00; + + if(s & 0x10) + q += 0x03;; + if(s & 0x20) + q += 0x0C;; + if(s & 0x40) + q += 0x30;; + if(s & 0x80) + q += 0xC0;; + + if(c & 0x02) + s = q >> (8-t); + else + s = 0x00; + drawbuf[0][r] = s; + drawbuf[0][r-1] = s; + + if(c & 0x01) + s = q >> (8-t); + else + s = 0x00; + drawbuf[1][r] = s; + drawbuf[1][r-1] = s; + } + do_rcu(tx,ty+16,p,m); + + } + else + { + p <<= 1; + for(cnt=0;cnt>1)]; + q = 0x00; + + if(s & 0x01) + q += 0x03;; + if(s & 0x02) + q += 0x0C;; + if(s & 0x04) + q += 0x30;; + if(s & 0x08) + q += 0xC0;; + + if(c & 0x02) + s = q; + else + s = 0x00; + drawbuf[0][r] = s; + drawbuf[0][r-1] = s; + + if(c & 0x01) + s = q; + else + s = 0x00; + drawbuf[1][r] = s; + drawbuf[1][r-1] = s; + } + do_rcu(tx,ty,p,m); + for(cnt=0;cnt>1)]; + q = 0x00; + + if(s & 0x10) + q += 0x03;; + if(s & 0x20) + q += 0x0C;; + if(s & 0x40) + q += 0x30;; + if(s & 0x80) + q += 0xC0;; + + if(c & 0x02) + s = q; + else + s = 0x00; + drawbuf[0][r] = s; + drawbuf[0][r-1] = s; + + if(c & 0x01) + s = q; + else + s = 0x00; + drawbuf[1][r] = s; + drawbuf[1][r-1] = s; + } + do_rcu(tx,ty+8,p,m); + } + tx += p+2; + } + else + { + + if(ty & 0x07) + { + s = ty & 0x07; + + for(cnt=0;cnt> (8-s); + else + drawbuf[0][p-cnt-1] = 0x00; + + if(c & 0x01) + drawbuf[1][p-cnt-1] = font_bits[cpos+cnt] >> (8-s); + else + drawbuf[1][p-cnt-1] = 0x00; + } + do_rcu(tx,ty+8,p,m); + } + else + { + for(cnt=0;cnt>4]+coff, c, m); + _draw_char(hval[v & 0x0F]+coff, c, m); +} + +void draw_hexS(unsigned char x, unsigned char y, const unsigned short v, unsigned char c, unsigned char m) +{ + tx = x; + ty = y; + draw_hexC(x, y, v >> 8, c, m); + draw_hexC(tx, ty, v & 0xFF, c, m); +} + +void draw_hexW(unsigned char x, unsigned char y, const unsigned long v, unsigned char c, unsigned char m) +{ + draw_hexS(x, y, v >> 16, c, m); + draw_hexS(tx, ty, v & 0xFFFF, c, m); +} diff --git a/boop/branches/ram_version/telekatz_soundtest/fonty.h b/boop/branches/ram_version/telekatz_soundtest/fonty.h new file mode 100644 index 0000000..ca274b4 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/fonty.h @@ -0,0 +1,31 @@ +/* + fonty.h - drawing text & font handling + Copyright (C) 2007 Ch. Klippel + + 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 3 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 FONTY_H +#define FONTY_H + +extern unsigned char drawbuf[2][128]; + +void set_font(unsigned char f); +void draw_char(unsigned char x, unsigned char y, unsigned char ch, unsigned char c, unsigned char m); +void draw_string(unsigned char x, unsigned char y, char *st, unsigned char c, unsigned char m); +void draw_hexC(unsigned char x, unsigned char y, const unsigned char v, unsigned char c, unsigned char m); +void draw_hexS(unsigned char x, unsigned char y, const unsigned short v, unsigned char c, unsigned char m); +void draw_hexW(unsigned char x, unsigned char y, const unsigned long v, unsigned char c, unsigned char m); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/global.c b/boop/branches/ram_version/telekatz_soundtest/global.c new file mode 100644 index 0000000..e9394c5 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/global.c @@ -0,0 +1,46 @@ +/* + global.c + Copyright (C) 2007 Colibri + + 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 3 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 "lpc2220.h" + +void *memcpy(void *dest,void *src,int count) +{ + char *tmp = (char *) dest, *s = (char *) src; + + while (count--) + *tmp++ = *s++; + + return dest; +} + +int memcmp(const void * cs,const void * ct,int count) +{ + const unsigned char *su1, *su2; + signed char res = 0; + + for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) + if ((res = *su1 - *su2) != 0) + break; + return res; +} + +unsigned char GetHWversion(void) { + if(((IOPIN2 >> 28) & 3) == 3) + return(((((IOPIN0 >> 5) & 1) << 4) | (((IOPIN2 >> 30) & 1) << 3) | (((IOPIN2 >> 16) & 1) << 2) | 3)); + return(((IOPIN2 >> 27) & 2) + ((IOPIN2 >> 29) & 1) + (((IOPIN1 >> 23) & 7) << 2)); +} diff --git a/boop/branches/ram_version/telekatz_soundtest/global.h b/boop/branches/ram_version/telekatz_soundtest/global.h new file mode 100644 index 0000000..4215ebe --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/global.h @@ -0,0 +1,57 @@ +/* + global.h + Copyright (C) 2007 Colibri + + 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 3 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 GLOBAL_H +#define GLOBAL_H + +//Uncomment if you want compile with demo sound +//#define WITH_SOUND + + +typedef unsigned char BOOL; +typedef unsigned char BYTE; +typedef unsigned short WORD; +typedef unsigned long DWORD; + +#define false 0 +#define true 1 + +#define NULL 0 + +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#define min(a,b) (((a) < (b)) ? (a) : (b)) + +#define SPEED_30 0 +#define SPEED_60 1 + +#define SYS_IR 0x20 +#define SYS_KEY 0x40 +#define SYS_TURBO 0x80 + +#ifndef __MAIN_C__ +extern char sysInfo; +#endif /* __MAIN_C__ */ + +#define PCON_IDLE 0x01 +#define PCON_PDOWN 0x02 + +void *memcpy(void *dest,void *src,int count); +int memcmp(const void * cs,const void * ct,int count); +unsigned char GetHWversion(void); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/infrared.c b/boop/branches/ram_version/telekatz_soundtest/infrared.c new file mode 100644 index 0000000..7fc9312 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/infrared.c @@ -0,0 +1,181 @@ +/* + infrared.c - ir carrier generation and encoding core + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "infrared.h" +#include "irq.h" +#include "lpc2220.h" +#include "keyboard.h" + +#include "externs.h" + +static unsigned char c_cnt; +static unsigned int b_len; + +unsigned char mod_enable; +unsigned char hi_border; +unsigned char lo_border; +unsigned int cycles; + +ir_fn irEncoder; +ir_fn irSend; +ir_fn irRepeat; +ir_fn irStop; + +const struct irModule defModule = { defIR, defSender, defRepeater, defStopper, 20, 0, 3 }; + +unsigned long keyMap[42]; + +void initIR(void) +{ + setIR(defModule); +} + +void startIrIRQ(void) +{ + + T1TCR = 0x02; + T1TC = 0; + T1PC = 0; + T1PR = 0x00; + T1MCR = 0x03; + T1TCR = 0x01; + + VICVectAddr1 = (unsigned long)&(irIRQ); + VICVectCntl1 = VIC_SLOT_EN | INT_SRC_TIMER1; + VICIntEnable = INT_TIMER1; +} + +void setIR(struct irModule module) +{ + T1TCR = 0x02; + irEncoder = module.encoder; + irSend = module.sender; + irRepeat = module.repeater; + irStop = module.stopper; + T1MR0 = module.tval; + hi_border = module.hi_border; + lo_border = module.lo_border; + cycles = 100; + T1TCR = 0x01; +} +/* Stubs for various interrupts (may be replaced later) */ +/* ---------------------------------------------------- */ + +void defIR(void) +{ + return; +} + +void defSender(void) +{ + return; +} + +void defRepeater(void) +{ + return; +} +void defStopper(void) +{ + return; +} + +void __attribute__ ((interrupt("IRQ"))) irIRQ(void) +{ + c_cnt++; + if(c_cnt <= hi_border) + { + FIOSET0 = (mod_enable<<21); + } + else + { + FIOCLR0 = (1<<21); + if(c_cnt >= lo_border) + { + c_cnt = 0; + b_len++; + if(b_len >= cycles) + { + irEncoder(); + b_len = 0; + } + } + } + + T1IR = 1; + VICVectAddr = 0; +} + +void runIR(void) +{ + T1TCR = 0x01; +} + +void stopIR(void) +{ + T1TCR = 0x03; +} + +#define doKey( _X, _Y ) if(_X) return keyMap[_Y]; else + +unsigned long getCode(void) +{ + doKey(KEY_A, 0); + doKey(KEY_B, 1); + doKey(KEY_C, 2); + doKey(KEY_D, 3); + doKey(KEY_Betty, 4); + doKey(KEY_Exit, 5); + doKey(KEY_Up, 6); + doKey(KEY_Down, 7); + doKey(KEY_Left, 8); + doKey(KEY_Right, 9); + doKey(KEY_OK, 10); + doKey(KEY_Vplus, 11); + doKey(KEY_Vminus, 12); + doKey(KEY_Mute, 13); + doKey(KEY_Pplus, 14); + doKey(KEY_Pminus, 15); + doKey(KEY_1, 16); + doKey(KEY_2, 17); + doKey(KEY_3, 18); + doKey(KEY_4, 19); + doKey(KEY_5, 20); + doKey(KEY_6, 21); + doKey(KEY_7, 22); + doKey(KEY_8, 23); + doKey(KEY_9, 24); + doKey(KEY_0, 25); + doKey(KEY_Minus, 26); + doKey(KEY_AV, 27); + doKey(KEY_Menu, 28); + doKey(KEY_PiP, 29); + doKey(KEY_AB, 30); + doKey(KEY_16_9, 31); + doKey(KEY_Info, 32); + doKey(KEY_VTX1, 33); + doKey(KEY_VTX2, 34); + doKey(KEY_VTX3, 35); + doKey(KEY_Blue, 36); + doKey(KEY_Yellow, 37); + doKey(KEY_Green, 38); + doKey(KEY_Red, 39); + doKey(KEY_TV, 40); + doKey(KEY_Power, 41); + return 0xFFFFFFFF; +} diff --git a/boop/branches/ram_version/telekatz_soundtest/infrared.h b/boop/branches/ram_version/telekatz_soundtest/infrared.h new file mode 100644 index 0000000..241c157 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/infrared.h @@ -0,0 +1,60 @@ +/* + infrared.h - ir carrier generation and encoding core + Copyright (C) 2007 Ch. Klippel + + 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 3 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 INFRARED_H +#define INFRARED_H + +typedef void(*ir_fn)(void); + +extern ir_fn irSend; +extern ir_fn irRepeat; +extern ir_fn irStop; + +typedef struct irModule +{ + ir_fn encoder; + ir_fn sender; + ir_fn repeater; + ir_fn stopper; + int tval; + unsigned int hi_border; + unsigned int lo_border; +} irModule; + +extern unsigned char mod_enable; +extern unsigned char hi_border; +extern unsigned char lo_border; +extern unsigned int cycles; +extern unsigned long keyMap[42]; + +void defIR(void); +void defSender(void); +void defRepeater(void); +void defStopper(void); + +void irIRQ (void) __attribute__ ((interrupt("IRQ"))) ; + +void initIR(void); +void startIrIRQ(void); +void setIR(struct irModule module); +void runIR(void); +void stopIR(void); +unsigned long getCode(void); + +#endif + diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_itt.c b/boop/branches/ram_version/telekatz_soundtest/ir_itt.c new file mode 100644 index 0000000..04ebf64 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_itt.c @@ -0,0 +1,228 @@ +/* + ir_itt.c - itt protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "infrared.h" +#include "ir_itt.h" +#include "itt_codes.h" + +const struct irModule ITT_Module = +{ + ITT_Encode, + ITT_Send, + ITT_Repeat, + ITT_Stop, + 43, // carrier + 2, // carrier-on + 3 // carrier-off +}; + +const struct irModule ITT2_Module = +{ + ITT_Encode, + ITT_Send, + ITT_Repeat, + ITT_Stop, + 46, // carrier + 1, // carrier-on + 3 // carrier-off +}; + +static unsigned short itt_cmd; +static unsigned short itt_actcmd; +static unsigned char itt_state; +static unsigned char itt_bit; +static unsigned char itt_numbits; +static unsigned char itt_wait; +static unsigned char itt_leadtime; +static unsigned char itt_bittime0; +static unsigned char itt_bittime1; + +#define ITT_IDLE 0x00 +#define ITT_LEADIN_A 0x01 +#define ITT_LEADIN_B 0x02 +#define ITT_START_A 0x03 +#define ITT_START_B 0x04 +#define ITT_BIT_A 0x05 +#define ITT_BIT_B 0x06 +#define ITT_LEADOUT_A 0x07 +#define ITT_LEADOUT_B 0x08 +#define ITT_STOP 0x09 +#define ITT_WAIT 0x0A + +#define ITT_LEADTIME 13 +#define ITT_BITTIME_0 4 +#define ITT_BITTIME_1 8 +#define ITT_WAITTIME 130 + +#define ITT2_LEADTIME 15 +#define ITT2_BITTIME_0 4 +#define ITT2_BITTIME_1 9 + +void ITT_Encode (void) +{ + switch(itt_state) + { + case ITT_IDLE: + mod_enable = 0; + break; + + case ITT_LEADIN_A: + case ITT_START_A: + case ITT_BIT_A: + case ITT_LEADOUT_A: + case ITT_STOP: + cycles = 1; + mod_enable = 1; + itt_state++; + break; + + case ITT_LEADIN_B: + case ITT_LEADOUT_B: + mod_enable = 0; + cycles = itt_leadtime; + itt_state++; + break; + + case ITT_START_B: + mod_enable = 0; + cycles = itt_bittime0; + itt_state++; + break; + + case ITT_BIT_B: + mod_enable = 0; + if(itt_cmd & 0x01) + cycles = itt_bittime1; + else + cycles = itt_bittime0; + itt_cmd >>= 1; + itt_bit++; + if(itt_bit == itt_numbits) + itt_state++; + else + itt_state--; + break; + + case ITT_WAIT: + mod_enable = 0; + cycles = 40; + itt_wait++; + if(itt_wait >= ITT_WAITTIME) + { + itt_bit = 0; + itt_wait = 0; + itt_state = ITT_IDLE; + } + break; + } +} + +void ITT_Init(unsigned char map) +{ + itt_state = ITT_IDLE; + itt_cmd = 0x0000; + itt_actcmd = 0x0000; + itt_bit = 0x00; + itt_numbits = 0x0A; + itt_wait = 0; + ITT_LoadMap(map); + cycles = 1; +} + +void ITT_Send(void) +{ + itt_actcmd = getCode(); + ITT_Repeat(); +} + +void ITT_Repeat(void) +{ + if(itt_actcmd != 0x0000) + { + if(itt_state == ITT_IDLE) + { + itt_cmd = itt_actcmd; + itt_state++; + runIR(); + } + } +} + +void ITT_Stop(void) +{ +waitend1: + if(itt_state != ITT_IDLE) + goto waitend1; + + itt_state++; + + if(itt_actcmd != 0x00000000) + { +waitend2: + if(itt_state != ITT_IDLE) + goto waitend2; + } + itt_actcmd = 0x0000; + stopIR(); +} + +void ITT_CopyMap(unsigned short *map) +{ + int x; + for(x=0;x<42;x++) + { + keyMap[x] = map[x]; + } +} + +void ITT_LoadMap(unsigned char map) +{ + switch(map) + { + case 0: + itt_leadtime = ITT_LEADTIME; + itt_bittime0 = ITT_BITTIME_0; + itt_bittime1 = ITT_BITTIME_1; + setIR(ITT_Module); + ITT_CopyMap((unsigned short*)ITT_seleco_019); + break; + case 1: + itt_leadtime = ITT_LEADTIME; + itt_bittime0 = ITT_BITTIME_0; + itt_bittime1 = ITT_BITTIME_1; + setIR(ITT_Module); + ITT_CopyMap((unsigned short*)ITT_seleco_049); + break; + case 2: + itt_leadtime = ITT2_LEADTIME; + itt_bittime0 = ITT2_BITTIME_0; + itt_bittime1 = ITT2_BITTIME_1; + setIR(ITT2_Module); + ITT_CopyMap((unsigned short*)ITT_seleco_108); + break; + default: + itt_leadtime = ITT_LEADTIME; + itt_bittime0 = ITT_BITTIME_0; + itt_bittime1 = ITT_BITTIME_1; + setIR(ITT_Module); + ITT_CopyMap((unsigned short*)ITT_seleco_131); + break; + } +} + + diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_itt.h b/boop/branches/ram_version/telekatz_soundtest/ir_itt.h new file mode 100644 index 0000000..cf8fa75 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_itt.h @@ -0,0 +1,30 @@ +/* + ir_itt.h - itt protocol ir encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_ITT_H +#define IR_ITT_H + +void ITT_Encode (void) ; + +void ITT_Init(unsigned char map); +void ITT_Send(void); +void ITT_Repeat(void); +void ITT_Stop(void); +void ITT_LoadMap(unsigned char map); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_nrc17.c b/boop/branches/ram_version/telekatz_soundtest/ir_nrc17.c new file mode 100644 index 0000000..b7820d8 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_nrc17.c @@ -0,0 +1,221 @@ +/* + ir_nrc17.c - nokia remote control 17 encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "infrared.h" +#include "ir_nrc17.h" +#include "nrc17_codes.h" + +#define NRC17_IDLE 0x00 +#define NRC17_PRE_A 0x01 +#define NRC17_PRE_B 0x02 +#define NRC17_START_A 0x03 +#define NRC17_START_B 0x04 +#define NRC17_BIT_A 0x05 +#define NRC17_BIT_B 0x06 +#define NRC17_WAIT 0x07 + +#define NRC17_BONTIME 19 +#define NRC17_BOFFTIME 19 +#define NRC17_PTIME 95 +#define NRC17_GTIME 156 +#define NRC17_WTIME 38 + +#define NRC17_STARTSTOP_DBOX2 0xFEFF +#define NRC17_STARTSTOP_TP720 0x01FF + +const struct irModule NRC17_Module = +{ + NRC17_Encode, + NRC17_Send, + NRC17_Repeat, + NRC17_Stop, + 40, // carrier + 1, // carrier-on + 4 // carrier-off +}; + + +static unsigned short nrc17_cmd; +static unsigned short nrc17_actcmd; +static unsigned short nrc17_startstop; +static unsigned char nrc17_state; +static unsigned char nrc17_bit; +static unsigned char nrc17_numbits; +static unsigned short nrc17_wait; +static unsigned short nrc17_pause; + +void NRC17_Encode(void) +{ + switch(nrc17_state) + { + case NRC17_IDLE: + mod_enable = 0; + break; + + case NRC17_PRE_A: + case NRC17_START_A: + cycles = NRC17_BONTIME; // 0.5 ms + mod_enable = 1; + nrc17_state++; + break; + + case NRC17_PRE_B: + case NRC17_START_B: + if(nrc17_state == NRC17_PRE_B) + cycles = NRC17_PTIME; // 2,5 ms + else + cycles = NRC17_BOFFTIME; // 0.5 ms + mod_enable = 0; + nrc17_state++; + break; + + case NRC17_BIT_A: + if(nrc17_cmd & 0x0001) + mod_enable = 1; + else + mod_enable = 0; + nrc17_cmd >>= 1; + nrc17_state++; + break; + + case NRC17_BIT_B: + if(mod_enable == 1) + mod_enable = 0; + else + mod_enable = 1; + nrc17_bit++; + if(nrc17_bit == nrc17_numbits) + nrc17_state++; + else + nrc17_state--; + break; + + case NRC17_WAIT: + mod_enable = 0; + nrc17_wait++; + cycles = NRC17_BONTIME; // 1 ms + if(nrc17_wait >= nrc17_pause) + { + nrc17_bit = 0; + nrc17_wait = 0; + nrc17_pause = NRC17_PTIME; + nrc17_state = NRC17_IDLE; + } + break; + + } +} + +void NRC17_CopyMap(unsigned char xtra, unsigned short *map) +{ + int x; + for(x=0;x<42;x++) + { + keyMap[x] = map[x]; + } +} + +void NRC17_LoadMap(unsigned char map) +{ + switch(map) + { + case 0: // nokia dbox2, 16 bit data + NRC17_CopyMap(0x00, (unsigned short*)NRC17_dbox2); + nrc17_startstop = NRC17_STARTSTOP_DBOX2; + nrc17_numbits = 16; + break; + case 1: // tp720 - tv, 9 bit data + NRC17_CopyMap(0x00, (unsigned short*)NRC17_grundig_tp720); + nrc17_startstop = NRC17_STARTSTOP_TP720; + nrc17_numbits = 9; + break; + case 2 : // tp720 - sat, 9 bit data + NRC17_CopyMap(0x40, (unsigned short*)NRC17_grundig_tp720); + nrc17_startstop = NRC17_STARTSTOP_TP720; + nrc17_numbits = 9; + break; + default : // tp720 - video, 9 bit data + NRC17_CopyMap(0x80, (unsigned short*)NRC17_grundig_tp720); + nrc17_startstop = NRC17_STARTSTOP_TP720; + nrc17_numbits = 9; + break; + } +} + +void NRC17_Init(unsigned char map) +{ + nrc17_state = NRC17_IDLE; + nrc17_cmd = 0x0000; + nrc17_actcmd = 0x0000; + nrc17_bit = 0x00; + nrc17_numbits = 16; + nrc17_wait = 0; + nrc17_pause = NRC17_BONTIME; + NRC17_LoadMap(map); + setIR(NRC17_Module); +} + +void NRC17_Send(void) +{ + nrc17_actcmd = getCode(); + if(nrc17_actcmd != 0x0000) + { + if(nrc17_state == NRC17_IDLE) + { + nrc17_pause = NRC17_WTIME; + nrc17_cmd = nrc17_startstop; + nrc17_state++; + runIR(); + } + } +} + +void NRC17_Repeat(void) +{ + if(nrc17_actcmd != 0x0000) + { + if(nrc17_state == NRC17_IDLE) + { + nrc17_pause = NRC17_GTIME; + nrc17_cmd = nrc17_actcmd; + nrc17_state++; + } + } +} + +void NRC17_Stop(void) +{ + if(nrc17_actcmd != 0x0000) + { +retry: + if(nrc17_state == NRC17_IDLE) + { + nrc17_cmd = nrc17_startstop; + nrc17_state++; + } + else + goto retry; + +waitend: + if(nrc17_state != NRC17_IDLE) + goto waitend; + } + nrc17_actcmd = 0x0000; + stopIR(); +} + diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_nrc17.h b/boop/branches/ram_version/telekatz_soundtest/ir_nrc17.h new file mode 100644 index 0000000..96ea18f --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_nrc17.h @@ -0,0 +1,30 @@ +/* + ir_nrc17.h - nokia remote control 17 encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_NRC17_H +#define IR_NRC17_H + +void NRC17_Encode (void) ; + +void NRC17_LoadMap(unsigned char map); +void NRC17_Init(unsigned char map); +void NRC17_Send(void); +void NRC17_Repeat(void); +void NRC17_Stop(void); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_rc5.c b/boop/branches/ram_version/telekatz_soundtest/ir_rc5.c new file mode 100644 index 0000000..5ffdd36 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_rc5.c @@ -0,0 +1,171 @@ +/* + ir_rc5.c - phillips rc5 protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "infrared.h" +#include "ir_rc5.h" +#include "rc5_codes.h" + +const struct irModule RC5_Module = +{ + RC5_Encode, + RC5_Send, + RC5_Repeat, + RC5_Stop, + 42, // carrier + 1, // carrier-on + 4 // carrier-off +}; + +static unsigned short rc5_cmd; +static unsigned short rc5_actcmd; +static unsigned char rc5_state; +static unsigned char rc5_bit; +static unsigned char rc5_wait; +static unsigned char rc5_toggle; + +#define RC5_IDLE 0x00 +#define RC5_START_A 0x01 +#define RC5_START_B 0x02 +#define RC5_BIT_A 0x03 +#define RC5_BIT_B 0x04 +#define RC5_WAIT 0x05 + + +#define RC5_BITTIME 32 +#define RC5_WAITTIME 100 + +void RC5_Encode (void) +{ + switch(rc5_state) + { + case RC5_IDLE: + mod_enable = 0; + break; + + case RC5_START_A: + mod_enable = 0; + rc5_state++; + break; + + case RC5_START_B: + mod_enable = 1; + rc5_state++; + break; + + case RC5_BIT_A: + if(rc5_cmd & 0x1000) + mod_enable = 0; + else + mod_enable = 1; + rc5_cmd <<= 1; + rc5_state++; + break; + + case RC5_BIT_B: + if(mod_enable == 0) + mod_enable = 1; + else + mod_enable = 0; + rc5_bit++; + if(rc5_bit == 13) + rc5_state++; + else + rc5_state--; + break; + + case RC5_WAIT: + mod_enable = 0; + rc5_wait++; + if(rc5_wait >= RC5_WAITTIME) + { + rc5_bit = 0; + rc5_wait = 0; + rc5_state = RC5_IDLE; + } + break; + } +} + +void RC5_Init(unsigned char map) +{ + rc5_state = RC5_IDLE; + rc5_cmd = 0x0000; + rc5_actcmd = 0x0000; + rc5_bit = 0x00; + rc5_wait = 0; + RC5_LoadMap(map); + setIR(RC5_Module); + cycles = RC5_BITTIME; +} + +void RC5_Send(void) +{ + rc5_actcmd = getCode(); + + if(rc5_toggle & 0x01) + rc5_actcmd &= 0xF7FF; + RC5_Repeat(); +} + +void RC5_Repeat(void) +{ + if(rc5_actcmd != 0x0000) + { + if(rc5_state == RC5_IDLE) + { + rc5_cmd = rc5_actcmd; + rc5_state++; + runIR(); + } + } +} + +void RC5_Stop(void) +{ + if(rc5_actcmd != 0x00000000) + { +waitend: + if(rc5_state != RC5_IDLE) + goto waitend; + } + + rc5_toggle++; + rc5_actcmd = 0x0000; + stopIR(); +} + +void RC5_CopyMap(unsigned short *map) +{ + int x; + for(x=0;x<42;x++) + { + keyMap[x] = map[x]; + } +} + +void RC5_LoadMap(unsigned char map) +{ + switch(map) + { + default: + RC5_CopyMap((unsigned short*)RC5_tv); + break; + } +} + + diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_rc5.h b/boop/branches/ram_version/telekatz_soundtest/ir_rc5.h new file mode 100644 index 0000000..f820b7a --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_rc5.h @@ -0,0 +1,30 @@ +/* + ir_rc5.h - phillips rc5 protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_RC5_H +#define IR_RC5_H + +void RC5_Encode (void) ; + +void RC5_Init(unsigned char map); +void RC5_Send(void); +void RC5_Repeat(void); +void RC5_Stop(void); +void RC5_LoadMap(unsigned char map); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_rca.c b/boop/branches/ram_version/telekatz_soundtest/ir_rca.c new file mode 100644 index 0000000..808cc55 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_rca.c @@ -0,0 +1,184 @@ +/* + ir_rca.c - space modulated protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "infrared.h" +#include "ir_rca.h" +#include "rca_codes.h" + +const struct irModule RCA_Module = +{ + RCA_Encode, + RCA_Send, + RCA_Repeat, + RCA_Stop, + 37, // carrier + 1, // carrier-on + 3 // carrier-off +}; + +static unsigned int rca_cmd; +static unsigned int rca_actcmd; +static unsigned char rca_state; +static unsigned char rca_bit; +static unsigned char rca_wait; + +#define RCA_IDLE 0x00 +#define RCA_PRE_A 0x01 +#define RCA_PRE_B 0x02 +#define RCA_BIT_A 0x03 +#define RCA_BIT_B 0x04 +#define RCA_IBIT_A 0x05 +#define RCA_IBIT_B 0x06 +#define RCA_STOP 0x07 +#define RCA_WAIT 0x08 + +#define RCA_NUMBITS 12 +#define RCA_BITTIME 28 +#define RCA_BIT0 2*RCA_BITTIME +#define RCA_BIT1 4*RCA_BITTIME +#define RCA_PRETIME 8*RCA_BITTIME +#define RCA_WAITTIME 30 + +void RCA_Encode (void) +{ + switch(rca_state) + { + case RCA_IDLE: + mod_enable = 0; + break; + + case RCA_PRE_A: + cycles = RCA_PRETIME; + mod_enable = 1; + rca_state++; + break; + + case RCA_PRE_B: + mod_enable = 0; + rca_cmd = rca_actcmd; + rca_state++; + break; + + case RCA_BIT_A: + case RCA_IBIT_A: + case RCA_STOP: + cycles = RCA_BITTIME; + mod_enable = 1; + rca_state++; + break; + + case RCA_BIT_B: + case RCA_IBIT_B: + mod_enable = 0; + if(rca_cmd & 0x0800) + cycles = RCA_BIT1; + else + cycles = RCA_BIT0; + rca_cmd <<= 1; + rca_bit++; + if(rca_bit == RCA_NUMBITS) + { + if(rca_state == RCA_BIT_B) + { + rca_cmd = ~rca_actcmd; + rca_bit = 0; + } + rca_state++; + } + else + rca_state--; + break; + + case RCA_WAIT: + mod_enable = 0; + cycles = RCA_BITTIME; + rca_wait++; + if(rca_wait >= RCA_WAITTIME) + { + rca_bit = 0; + rca_wait = 0; + rca_state = RCA_IDLE; + } + break; + } +} + +void RCA_Init(unsigned char map) +{ + rca_state = RCA_IDLE; + rca_cmd = 0x0000; + rca_actcmd = 0x0000; + rca_bit = 0x00; + rca_wait = 0; + RCA_LoadMap(map); + setIR(RCA_Module); + cycles = RCA_BITTIME; +} + +void RCA_Send(void) +{ + rca_actcmd = getCode(); + RCA_Repeat(); +} + +void RCA_Repeat(void) +{ + if(rca_actcmd != 0x0000) + { + if(rca_state == RCA_IDLE) + { + rca_state++; + runIR(); + } + } +} + +void RCA_Stop(void) +{ + if(rca_actcmd != 0x00000000) + { +waitend: + if(rca_state != RCA_IDLE) + goto waitend; + } + stopIR(); +} + +void RCA_CopyMapPC(unsigned short pre, unsigned char *map) +{ + int x; + for(x=0;x<42;x++) + { + if(map[x] != 0) + keyMap[x] = pre | map[x]; + else + keyMap[x] = 0x0000; + } +} + +void RCA_LoadMap(unsigned char map) +{ + switch(map) + { + default: + RCA_CopyMapPC(0x0500, (unsigned char*)RCA_xbox); + break; + } +} + + diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_rca.h b/boop/branches/ram_version/telekatz_soundtest/ir_rca.h new file mode 100644 index 0000000..495b7b8 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_rca.h @@ -0,0 +1,30 @@ +/* + ir_rca.h - rca protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_RCA_H +#define IR_RCA_H + +void RCA_Encode (void) ; + +void RCA_Init(unsigned char map); +void RCA_Send(void); +void RCA_Repeat(void); +void RCA_Stop(void); +void RCA_LoadMap(unsigned char map); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_rcmm.c b/boop/branches/ram_version/telekatz_soundtest/ir_rcmm.c new file mode 100644 index 0000000..7f5a505 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_rcmm.c @@ -0,0 +1,190 @@ +/* + ir_rcmm.c - phillips rc5 protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "infrared.h" +#include "ir_rcmm.h" +#include "rcmm_codes.h" + +const struct irModule RCMM_Module = +{ + RCMM_Encode, + RCMM_Send, + RCMM_Repeat, + RCMM_Stop, + 42, // carrier + 1, // carrier-on + 4 // carrier-off +}; + +static unsigned int rcmm_cmd; +static unsigned int rcmm_actcmd; +static unsigned char rcmm_state; +static unsigned char rcmm_bit; +static unsigned short rcmm_wait; +static unsigned short rcmm_pause; +static unsigned char rcmm_len; +static unsigned char rcmm_trail; + +#define RCMM_IDLE 0x00 +#define RCMM_HEADER_A 0x01 +#define RCMM_HEADER_B 0x02 +#define RCMM_BIT_A 0x03 +#define RCMM_BIT_B 0x04 +#define RCMM_TRAIL 0x05 +#define RCMM_WAIT 0x06 + +#define RCMM_HEADER_ON 15 +#define RCMM_HEADER_OFF 10 +#define RCMM_BIT_ON 6 +#define RCMM_BIT_00 10 +#define RCMM_BIT_01 16 +#define RCMM_BIT_10 22 +#define RCMM_BIT_11 28 +#define RCMM_PTIME 110; + +const unsigned char rcmm_times[4] = { RCMM_BIT_00, RCMM_BIT_01, RCMM_BIT_10, RCMM_BIT_11 }; + +void RCMM_Encode (void) +{ + switch(rcmm_state) + { + case RCMM_IDLE: + mod_enable = 0; + break; + + case RCMM_HEADER_A: + case RCMM_BIT_A: + mod_enable = 1; + if(rcmm_state == RCMM_HEADER_A) + cycles = RCMM_HEADER_ON; + else + cycles = RCMM_BIT_ON; + rcmm_state++; + break; + + case RCMM_HEADER_B: + mod_enable = 0; + cycles = RCMM_HEADER_OFF; + rcmm_state++; + break; + + case RCMM_BIT_B: + mod_enable = 0; + cycles = rcmm_times[(rcmm_cmd & 0xC0000000) >> 30]; + rcmm_cmd <<= 2; + rcmm_bit += 2; + if(rcmm_bit == rcmm_len) + rcmm_state++; + else + rcmm_state--; + break; + + case RCMM_TRAIL: + if(rcmm_trail) + { + mod_enable = 1; + cycles = RCMM_BIT_ON; + } + else + cycles = 1; + rcmm_state++; + break; + + case RCMM_WAIT: + mod_enable = 0; + rcmm_wait++; + cycles = RCMM_BIT_ON; // 1 ms + if(rcmm_wait >= rcmm_pause) + { + rcmm_bit = 0; + rcmm_wait = 0; + rcmm_pause = RCMM_PTIME; + rcmm_state = RCMM_IDLE; + } + break; + + + } +} + +void RCMM_Init(unsigned char map) +{ + rcmm_cmd = 0x00000000; + rcmm_actcmd = 0x00000000; + rcmm_state = RCMM_IDLE; + rcmm_bit = 0; + rcmm_wait = 0; + rcmm_pause = RCMM_PTIME; + RCMM_LoadMap(map); + setIR(RCMM_Module); +} + +void RCMM_Send(void) +{ + rcmm_actcmd = getCode(); + RCMM_Repeat(); +} + +void RCMM_Repeat(void) +{ + if(rcmm_actcmd != 0x00000000) + { + if(rcmm_state == RCMM_IDLE) + { + rcmm_cmd = rcmm_actcmd; + rcmm_state++; + runIR(); + } + } +} + +void RCMM_Stop(void) +{ + if(rcmm_actcmd != 0x00000000) + { +waitend: + if(rcmm_state != RCMM_IDLE) + goto waitend; + } + rcmm_actcmd = 0x0000; + stopIR(); +} + +void RCMM_CopyMapPrefix(unsigned int prefix, unsigned char *map) +{ + int x; + for(x=0;x<42;x++) + { + keyMap[x] = prefix + map[x]; + } + keyMap[0] = 0x00000000; +} + +void RCMM_LoadMap(unsigned char map) +{ + switch(map) + { + default: + RCMM_CopyMapPrefix(0x0D500800, (unsigned char*)RCMM_galaxis); + rcmm_len = 32; + rcmm_trail = 1; + break; + } +} + + diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_rcmm.h b/boop/branches/ram_version/telekatz_soundtest/ir_rcmm.h new file mode 100644 index 0000000..35fce71 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_rcmm.h @@ -0,0 +1,30 @@ +/* + ir_rcmm.h - phillips rc5 protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_RCMM_H +#define IR_RCMM_H + +void RCMM_Encode (void) ; + +void RCMM_Init(unsigned char map); +void RCMM_Send(void); +void RCMM_Repeat(void); +void RCMM_Stop(void); +void RCMM_LoadMap(unsigned char map); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_rec80.c b/boop/branches/ram_version/telekatz_soundtest/ir_rec80.c new file mode 100644 index 0000000..daf2bb2 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_rec80.c @@ -0,0 +1,195 @@ +/* + ir_rec80.c - nec rec80 and derivates ir encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "infrared.h" +#include "ir_rec80.h" +#include "rec80_codes.h" + +const struct irModule REC80_Module = +{ + REC80_Encode, + REC80_Send, + REC80_Repeat, + REC80_Stop, + 47, // carrier + 1, // carrier-on + 4, // carrier-off +}; + +static unsigned int rec80_cmd; +static unsigned int rec80_actcmd; +static unsigned int rec80_preamble; +static unsigned char rec80_state; +static unsigned char rec80_bit; +static unsigned char rec80_numbits; +static unsigned short rec80_wait; +static unsigned short rec80_pause; + +#define REC80_IDLE 0x00 +#define REC80_HEAD_A 0x01 +#define REC80_HEAD_B 0x02 +#define REC80_PRE_A 0x03 +#define REC80_PRE_B 0x04 +#define REC80_BIT_A 0x05 +#define REC80_BIT_B 0x06 +#define REC80_TRAIL 0x07 +#define REC80_WAIT 0x08 + +#define REC80_HEADER_1 128 +#define REC80_HEADER_0 51 +#define REC80_BONTIME 13 +#define REC80_BITTIME_0 13 +#define REC80_BITTIME_1 38 +#define REC80_WAITTIME 187 + +void REC80_Encode (void) +{ + switch(rec80_state) + { + case REC80_IDLE: + mod_enable = 0; + break; + + case REC80_HEAD_B: + mod_enable = 0; + cycles = REC80_HEADER_0; + rec80_cmd = rec80_preamble; + rec80_bit = 0; + rec80_state++; + break; + + case REC80_HEAD_A: + case REC80_PRE_A: + case REC80_BIT_A: + case REC80_TRAIL: + mod_enable = 1; + if(rec80_state == REC80_HEAD_A) + cycles = REC80_HEADER_1; + else + cycles = REC80_BONTIME; + rec80_state++; + break; + + case REC80_PRE_B: + case REC80_BIT_B: + mod_enable = 0; + if(rec80_cmd & 0x01) + cycles = REC80_BITTIME_1; + else + cycles = REC80_BITTIME_0; + rec80_cmd >>= 1; + rec80_bit++; + if(rec80_bit == rec80_numbits) + { + if(rec80_state == REC80_PRE_B) + { + rec80_bit = 0; + rec80_cmd = rec80_actcmd; + } + rec80_state++; + } + else + rec80_state--; + break; + + case REC80_WAIT: + mod_enable = 0; + rec80_wait++; + cycles = REC80_BONTIME; // 1 ms + if(rec80_wait >= rec80_pause) + { + rec80_bit = 0; + rec80_wait = 0; + rec80_state = REC80_IDLE; + } + break; + } +} + +void REC80_Init(unsigned char map) +{ + rec80_cmd = 0x00000000; + rec80_actcmd = 0x00000000; + rec80_bit = 0; + rec80_numbits = 24; + rec80_wait = 0; + rec80_pause = REC80_WAITTIME; + rec80_state = REC80_IDLE; + REC80_LoadMap(map); + setIR(REC80_Module); +} + +void REC80_Send(void) +{ + rec80_actcmd = getCode(); + + if(rec80_actcmd & 0x80000000) + rec80_numbits = 24; + else + rec80_numbits = 0; + + rec80_actcmd &= 0x0FFFFFFF; + + REC80_Repeat(); +} + +void REC80_Repeat(void) +{ + if(rec80_actcmd != 0x00000000) + { + if(rec80_state == REC80_IDLE) + { + rec80_state++; + runIR(); + } + } +} + +void REC80_Stop(void) +{ + if(rec80_actcmd != 0x00000000) + { +waitend: + if(rec80_state != REC80_IDLE) + goto waitend; + } + rec80_actcmd = 0x00000000; + stopIR(); +} + +void REC80_CopyMap(unsigned int *map) +{ + int x; + for(x=0;x<42;x++) + { + keyMap[x] = map[x]; + } +} + +void REC80_LoadMap(unsigned char map) +{ + switch(map) + { + default: + rec80_preamble = 0x00A02002; + REC80_CopyMap((unsigned int*)REC80_rak_sc957wk); + break; + } +} + + diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_rec80.h b/boop/branches/ram_version/telekatz_soundtest/ir_rec80.h new file mode 100644 index 0000000..ae1d73c --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_rec80.h @@ -0,0 +1,30 @@ +/* + ir_rec80.h - nec rec80 and derivates ir encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_REC80_H +#define IR_REC80_H + +void REC80_Encode (void) ; + +void REC80_Init(unsigned char map); +void REC80_Send(void); +void REC80_Repeat(void); +void REC80_Stop(void); +void REC80_LoadMap(unsigned char map); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_recs80.c b/boop/branches/ram_version/telekatz_soundtest/ir_recs80.c new file mode 100644 index 0000000..6bf980b --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_recs80.c @@ -0,0 +1,165 @@ +/* + ir_recs80.c - space modulated protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "infrared.h" +#include "ir_recs80.h" +#include "recs80_codes.h" + +const struct irModule RECS80_Module = +{ + RECS80_Encode, + RECS80_Send, + RECS80_Repeat, + RECS80_Stop, + 40, // carrier + 1, // carrier-on + 4 // carrier-off +}; + +static unsigned int recs80_cmd; +static unsigned int recs80_actcmd; +static unsigned char recs80_state; +static unsigned char recs80_bit; +static unsigned char recs80_wait; +static unsigned char recs80_toggle; + +#define RECS80_IDLE 0x00 +#define RECS80_BIT_A 0x01 +#define RECS80_BIT_B 0x02 +#define RECS80_STOP 0x03 +#define RECS80_WAIT 0x04 + +#define RECS80_NUMBITS 11 +#define RECS80_BITTIME 7 +#define RECS80_BIT0 27*RECS80_BITTIME +#define RECS80_BIT1 41*RECS80_BITTIME +#define RECS80_WAITTIME 10 + +void RECS80_Encode (void) +{ + switch(recs80_state) + { + case RECS80_IDLE: + mod_enable = 0; + break; + + case RECS80_BIT_A: + case RECS80_STOP: + cycles = RECS80_BITTIME; + mod_enable = 1; + recs80_state++; + break; + + case RECS80_BIT_B: + mod_enable = 0; + if(recs80_cmd & 0x0400) + cycles = RECS80_BIT1; + else + cycles = RECS80_BIT0; + recs80_cmd <<= 1; + recs80_bit++; + if(recs80_bit == RECS80_NUMBITS) + recs80_state++; + else + recs80_state--; + break; + + case RECS80_WAIT: + mod_enable = 0; + cycles = RECS80_BIT0; + recs80_wait++; + if(recs80_wait >= RECS80_WAITTIME) + { + recs80_bit = 0; + recs80_wait = 0; + recs80_state = RECS80_IDLE; + } + break; + } +} + +void RECS80_Init(unsigned char map) +{ + recs80_state = RECS80_IDLE; + recs80_cmd = 0x0000; + recs80_actcmd = 0x0000; + recs80_bit = 0x00; + recs80_wait = 0; + recs80_toggle = 1; + RECS80_LoadMap(map); + setIR(RECS80_Module); + cycles = RECS80_BITTIME; +} + +void RECS80_Send(void) +{ + recs80_actcmd = getCode(); + + if(recs80_toggle & 0x01) + recs80_actcmd |= 0x0200; + RECS80_Repeat(); +} + +void RECS80_Repeat(void) +{ + if(recs80_actcmd != 0x0000) + { + if(recs80_state == RECS80_IDLE) + { + recs80_cmd = recs80_actcmd; + recs80_state++; + runIR(); + } + } +} + +void RECS80_Stop(void) +{ + if(recs80_actcmd != 0x00000000) + { +waitend: + if(recs80_state != RECS80_IDLE) + goto waitend; + } + recs80_toggle++; + stopIR(); +} + +void RECS80_CopyMap(unsigned short *map) +{ + int x; + for(x=0;x<42;x++) + { + keyMap[x] = map[x]; + } +} + +void RECS80_LoadMap(unsigned char map) +{ + switch(map) + { + case 0: + RECS80_CopyMap((unsigned short*)RECS80_seleco_020); + break; + default: + RECS80_CopyMap((unsigned short*)RECS80_seleco_157); + break; + } +} + + diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_recs80.h b/boop/branches/ram_version/telekatz_soundtest/ir_recs80.h new file mode 100644 index 0000000..d094f15 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_recs80.h @@ -0,0 +1,30 @@ +/* + ir_recs80.h - phillips recs80 protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_RECS80_H +#define IR_RECS80_H + +void RECS80_Encode (void) ; + +void RECS80_Init(unsigned char map); +void RECS80_Send(void); +void RECS80_Repeat(void); +void RECS80_Stop(void); +void RECS80_LoadMap(unsigned char map); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_sirc.c b/boop/branches/ram_version/telekatz_soundtest/ir_sirc.c new file mode 100644 index 0000000..29e6b01 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_sirc.c @@ -0,0 +1,191 @@ +/* + ir_sirc.c - sony sirc protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "infrared.h" +#include "ir_sirc.h" +#include "sirc_codes.h" + +static unsigned int sirc_cmd; +static unsigned int sirc_actcmd; +static unsigned char sirc_state; +static unsigned char sirc_bit; +static unsigned char sirc_numbits; +static unsigned short sirc_wait; +static unsigned short sirc_pause; + +#define SIRC_IDLE 0x00 +#define SIRC_START_A 0x01 +#define SIRC_START_B 0x02 +#define SIRC_BIT_A 0x03 +#define SIRC_BIT_B 0x04 +#define SIRC_WAIT 0x05 + +#define SIRC_STARTLEN 96 +#define SIRC_BITLEN_0 24 +#define SIRC_BITLEN_1 48 +#define SIRC_BITOFF 24 +#define SIRC_GTIME 45 + +const struct irModule SIRC_Module = +{ + SIRC_Encode, + SIRC_Send, + SIRC_Repeat, + SIRC_Stop, + 38, // carrier + 1, // carrier-on + 4, // carrier-off +}; + +void SIRC_Encode (void) +{ + switch(sirc_state) + { + case SIRC_IDLE: + mod_enable = 0; + break; + + case SIRC_START_A: + mod_enable = 1; + cycles = SIRC_STARTLEN; + sirc_state++; + break; + + case SIRC_START_B: + mod_enable = 0; + cycles = SIRC_BITOFF; + sirc_state++; + break; + + case SIRC_BIT_A: + mod_enable = 1; + if(sirc_cmd & 0x01) + cycles = SIRC_BITLEN_1; + else + cycles = SIRC_BITLEN_0; + sirc_cmd >>= 1; + sirc_state++; + break; + + case SIRC_BIT_B: + mod_enable = 0; + cycles = SIRC_BITOFF; + sirc_bit++; + if(sirc_bit == sirc_numbits) + sirc_state++; + else + sirc_state--; + break; + + case SIRC_WAIT: + mod_enable = 0; + sirc_wait++; + cycles = SIRC_BITOFF; // 1 ms + if(sirc_wait >= sirc_pause) + { + sirc_bit = 0; + sirc_wait = 0; + sirc_state = SIRC_IDLE; + } + break; + + } +} + +void SIRC_Init(unsigned char map) +{ + sirc_cmd = 0x00000000; + sirc_actcmd = 0x00000000; + sirc_bit = 0; + sirc_numbits = 12; + sirc_wait = 0; + sirc_pause = SIRC_GTIME; + sirc_state = SIRC_IDLE; + SIRC_LoadMap(map); + setIR(SIRC_Module); +} + +void SIRC_Send(void) +{ + sirc_actcmd = getCode(); + + if(sirc_actcmd & 0x800000) + sirc_numbits = 20; + else if(sirc_actcmd & 0x8000) + sirc_numbits = 15; + else + sirc_numbits = 12; + SIRC_Repeat(); +} + +void SIRC_Repeat(void) +{ + if(sirc_actcmd != 0x00000000) + { + if(sirc_state == SIRC_IDLE) + { + sirc_cmd = sirc_actcmd; + sirc_state++; + runIR(); + } + } +} + +void SIRC_Stop(void) +{ + if(sirc_actcmd != 0x00000000) + { +waitend: + if(sirc_state != SIRC_IDLE) + goto waitend; + } + sirc_actcmd = 0x0000; + stopIR(); +} + +void SIRC_CopyMapS(unsigned int pre, unsigned short *map) +{ + int x; + for(x=0;x<42;x++) + { + keyMap[x] = map[x]; + } +} + +void SIRC_CopyMapI(unsigned int pre, unsigned int *map) +{ + int x; + for(x=0;x<42;x++) + { + keyMap[x] = map[x]; + } +} + +void SIRC_LoadMap(unsigned char map) +{ + switch(map) + { + case 0: + SIRC_CopyMapS(0x8000, (unsigned short*)SIRC_rm_pp411_av2); + break; + default: + SIRC_CopyMapS(0, (unsigned short*)SIRC_tv); + break; + } +} + diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_sirc.h b/boop/branches/ram_version/telekatz_soundtest/ir_sirc.h new file mode 100644 index 0000000..35c28b1 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_sirc.h @@ -0,0 +1,30 @@ +/* + ir_sirc.h - sony sirc protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_SIRC_H +#define IR_SIRC_H + +void SIRC_Encode (void) ; + +void SIRC_Init(unsigned char map); +void SIRC_Send(void); +void SIRC_Repeat(void); +void SIRC_Stop(void); +void SIRC_LoadMap(unsigned char map); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_spaceenc.c b/boop/branches/ram_version/telekatz_soundtest/ir_spaceenc.c new file mode 100644 index 0000000..bb24046 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_spaceenc.c @@ -0,0 +1,285 @@ +/* + ir_spaceenc.c - space modulated protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "infrared.h" +#include "ir_spaceenc.h" +#include "spaceenc_codes.h" + +const struct irModule SPACEENC_Module = +{ + SPACEENC_Encode, + SPACEENC_Send, + SPACEENC_Repeat, + SPACEENC_Stop, + 37, // carrier + 1, // carrier-on + 4 // carrier-off +}; + +const struct irModule SPACEENC2_Module = +{ + SPACEENC_Encode, + SPACEENC2_Send, + SPACEENC2_Repeat, + SPACEENC2_Stop, + 37, // carrier + 1, // carrier-on + 4 // carrier-off +}; + +static unsigned int spaceenc_cmd; +static unsigned int spaceenc_pre; +static unsigned int spaceenc_actcmd; +static unsigned int spaceenc_bit; +static unsigned char spaceenc_state; +static unsigned char spaceenc_numbits; +static unsigned char spaceenc_prebits; +static unsigned char spaceenc_wait; +static unsigned char spaceenc_waittime; + +static unsigned char spaceenc_bittime; +static unsigned char spaceenc_bit0; +static unsigned char spaceenc_bit1; + +static unsigned int *spaceenc_codes; +static unsigned char *spaceenc_precodes; + +#define SPACEENC_IDLE 0x00 +#define SPACEENC_PRE_A 0x01 +#define SPACEENC_PRE_B 0x02 +#define SPACEENC_BIT_A 0x03 +#define SPACEENC_BIT_B 0x04 +#define SPACEENC_STOP 0x05 +#define SPACEENC_WAIT 0x06 + +#define SPACEENC_NUMBITS 6 +#define SPACEENC_BITTIME 20 +#define SPACEENC_BIT0 65 +#define SPACEENC_BIT1 150 +#define SPACEENC_WAITTIME 59 + +#define SPACEENC2_BITTIME 14 +#define SPACEENC2_BIT0 7 +#define SPACEENC2_BIT1 28 +#define SPACEENC2_WAITTIME 170 + +void SPACEENC_Encode (void) +{ + switch(spaceenc_state) + { + case SPACEENC_IDLE: + mod_enable = 0; + break; + + case SPACEENC_PRE_A: + case SPACEENC_BIT_A: + cycles = spaceenc_bittime; + mod_enable = 1; + spaceenc_state++; + break; + + case SPACEENC_PRE_B: + mod_enable = 0; + if(spaceenc_cmd & 0x01) + cycles = spaceenc_bit1; + else + cycles = spaceenc_bit0; + spaceenc_cmd >>= 1; + spaceenc_bit++; + if(spaceenc_bit == spaceenc_prebits) + { + spaceenc_state = SPACEENC_BIT_A; + spaceenc_bit = 0; + spaceenc_cmd = spaceenc_codes[spaceenc_actcmd]; + } + else + { + spaceenc_state--; + } + break; + + case SPACEENC_BIT_B: + mod_enable = 0; + if(spaceenc_cmd & 0x01) + cycles = spaceenc_bit1; + else + cycles = spaceenc_bit0; + spaceenc_cmd >>= 1; + spaceenc_bit++; + if(spaceenc_bit == spaceenc_numbits) + spaceenc_state++; + else + spaceenc_state--; + break; + + case SPACEENC_STOP: + cycles = spaceenc_bittime; + mod_enable = 1; + spaceenc_state++; + break; + + case SPACEENC_WAIT: + mod_enable = 0; + spaceenc_wait++; + if(spaceenc_wait >= spaceenc_waittime) + { + spaceenc_bit = 0; + spaceenc_wait = 0; + spaceenc_state = SPACEENC_IDLE; + } + break; + } +} + +void SPACEENC_Init(unsigned char map) +{ + spaceenc_state = SPACEENC_IDLE; + spaceenc_cmd = 0x0000; + spaceenc_actcmd = 0x0000; + spaceenc_wait = 0; + spaceenc_bit = 0; + SPACEENC_LoadMap(map); + cycles = SPACEENC_BITTIME; +} + +void SPACEENC_Send(void) +{ + spaceenc_actcmd = getCode(); + SPACEENC_Repeat(); + runIR(); +} + +void SPACEENC_Repeat(void) +{ + if(spaceenc_actcmd != 0x00000000) + { + if(spaceenc_state == SPACEENC_IDLE) + { + spaceenc_cmd = spaceenc_actcmd; + spaceenc_state = SPACEENC_BIT_A; + } + } +} + +void SPACEENC_Stop(void) +{ +waitend1: + while(spaceenc_state != SPACEENC_IDLE) + goto waitend1; + + if(spaceenc_actcmd != 0x00000000) + { + SPACEENC_Repeat(); + +waitend2: + if(spaceenc_state != SPACEENC_IDLE) + goto waitend2; + } + spaceenc_actcmd = 0x00000000; + stopIR(); +} + +void SPACEENC2_Send(void) +{ + spaceenc_actcmd = getCode(); + SPACEENC2_Repeat(); +} + +void SPACEENC2_Repeat(void) +{ + if(spaceenc_actcmd != 0x00000000) + { + if(spaceenc_state == SPACEENC_IDLE) + { + spaceenc_cmd = spaceenc_precodes[spaceenc_actcmd]; + spaceenc_state = SPACEENC_PRE_A; + runIR(); + } + } +} + +void SPACEENC2_Stop(void) +{ + if(spaceenc_actcmd != 0x00000000) + { +waitend2: + if(spaceenc_state != SPACEENC_IDLE) + goto waitend2; + } + spaceenc_actcmd = 0x00000000; + stopIR(); +} + +void SPACEENC_CopyMapC(unsigned char *map) +{ + int x; + for(x=0;x<42;x++) + { + keyMap[x] = map[x]; + } +} + +void SPACEENC_CopyMapS(unsigned short *map) +{ + int x; + for(x=0;x<42;x++) + { + keyMap[x] = map[x]; + } +} + +void SPACEENC_CopyMapI(unsigned int *map) +{ + int x; + for(x=0;x<42;x++) + { + keyMap[x] = map[x]; + } +} + +void SPACEENC_LoadMap(unsigned char map) +{ + switch(map) + { + case 0: + SPACEENC_CopyMapC((unsigned char*)SPACEENC_seleco_027); + spaceenc_numbits = SPACEENC_NUMBITS; + spaceenc_prebits = 0; + spaceenc_pre = 0x00; + spaceenc_bittime = SPACEENC_BITTIME; + spaceenc_bit0 = SPACEENC_BIT0; + spaceenc_bit1 = SPACEENC_BIT1; + spaceenc_waittime = SPACEENC_WAITTIME; + setIR(SPACEENC_Module); + break; + default: + SPACEENC_CopyMapC((unsigned char*)SPACEENC_schneider_dtv3); + spaceenc_numbits = 32; + spaceenc_prebits = 8; + spaceenc_bittime = SPACEENC2_BITTIME; + spaceenc_bit0 = SPACEENC2_BIT0; + spaceenc_bit1 = SPACEENC2_BIT1; + spaceenc_waittime = SPACEENC2_WAITTIME; + spaceenc_codes = (unsigned int*) dtv3_codes; + spaceenc_precodes = (unsigned char*) dtv3_pre; + setIR(SPACEENC2_Module); + break; + } +} + + diff --git a/boop/branches/ram_version/telekatz_soundtest/ir_spaceenc.h b/boop/branches/ram_version/telekatz_soundtest/ir_spaceenc.h new file mode 100644 index 0000000..a1238db --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/ir_spaceenc.h @@ -0,0 +1,33 @@ +/* + ir_spaceenc.h - space modulated protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_SPACEENC_H +#define IR_SPACEENC_H + +void SPACEENC_Encode (void) ; + +void SPACEENC_Init(unsigned char map); +void SPACEENC_Send(void); +void SPACEENC_Repeat(void); +void SPACEENC_Stop(void); +void SPACEENC2_Send(void); +void SPACEENC2_Repeat(void); +void SPACEENC2_Stop(void); +void SPACEENC_LoadMap(unsigned char map); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/irq.c b/boop/branches/ram_version/telekatz_soundtest/irq.c new file mode 100644 index 0000000..9992c8d --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/irq.c @@ -0,0 +1,82 @@ +/* + irq.c - irq core functions + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lpc2220.h" +#include "irq.h" + +#define IRQ_MASK 0x00000080 + +static inline unsigned asm_get_cpsr(void) +{ + unsigned long retval; + asm volatile (" mrs %0, cpsr" : "=r" (retval) : /* no inputs */ ); + return retval; + +} + +static inline void asm_set_cpsr(unsigned val) +{ + asm volatile (" msr cpsr, %0" : /* no outputs */ : "r" (val) ); +} + +unsigned enableIRQ(void) +{ + unsigned _cpsr; + + _cpsr = asm_get_cpsr(); + asm_set_cpsr(_cpsr & ~IRQ_MASK); + return _cpsr; +} + +unsigned disableIRQ(void) +{ + unsigned _cpsr; + + _cpsr = asm_get_cpsr(); + asm_set_cpsr(_cpsr | IRQ_MASK); + return _cpsr; +} + +unsigned restoreIRQ(unsigned oldCPSR) +{ + unsigned _cpsr; + + _cpsr = asm_get_cpsr(); + asm_set_cpsr((_cpsr & ~IRQ_MASK) | (oldCPSR & IRQ_MASK)); + return _cpsr; +} + +void IRQ_Routine (void) { + +} + +void FIQ_Routine (void) { + while (1) ; +} + + +void SWI_Routine (void) { + while (1) ; +} + + +void UNDEF_Routine (void) { + while (1) ; +} + + diff --git a/boop/branches/ram_version/telekatz_soundtest/irq.h b/boop/branches/ram_version/telekatz_soundtest/irq.h new file mode 100644 index 0000000..798224b --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/irq.h @@ -0,0 +1,72 @@ +/* + irq.h - irq core functions + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IRQ_H +#define IRQ_H + +#define INT_WDT 0x00000001 +#define INT_CORE0 0x00000004 +#define INT_CORE1 0x00000008 +#define INT_TIMER0 0x00000010 +#define INT_TIMER1 0x00000020 +#define INT_UART0 0x00000040 +#define INT_UART1 0x00000080 +#define INT_PWM 0x00000100 +#define INT_I2C 0x00000200 +#define INT_SPI0 0x00000400 +#define INT_SPI1 0x00000800 +#define INT_PLL 0x00001000 +#define INT_RTC 0x00002000 +#define INT_EINT0 0x00004000 +#define INT_EINT1 0x00008000 +#define INT_EINT2 0x00010000 +#define INT_EINTT2 0x00020000 +#define INT_ADC 0x00040000 + +#define INT_SRC_WDT 0 +#define INT_SRC_CORE0 2 +#define INT_SRC_CORE1 3 +#define INT_SRC_TIMER0 4 +#define INT_SRC_TIMER1 5 +#define INT_SRC_UART0 6 +#define INT_SRC_UART1 7 +#define INT_SRC_PWM 8 +#define INT_SRC_I2C 9 +#define INT_SRC_SPI0 10 +#define INT_SRC_SPI1 11 +#define INT_SRC_PLL 12 +#define INT_SRC_RTC 13 +#define INT_SRC_EINT0 14 +#define INT_SRC_EINT1 15 +#define INT_SRC_EINT2 16 +#define INT_SRC_EINT3 17 +#define INT_SRC_ADC 18 + +#define VIC_SLOT_EN 0x00000020 + +void IRQ_Routine (void) __attribute__ ((interrupt("IRQ"))); +void FIQ_Routine (void) __attribute__ ((interrupt("FIQ"))); +void SWI_Routine (void) __attribute__ ((interrupt("SWI"))); +void UNDEF_Routine (void) __attribute__ ((interrupt("UNDEF"))); + + +unsigned enableIRQ(void); +unsigned disableIRQ(void); +unsigned restoreIRQ(unsigned oldCPSR); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/itt_codes.h b/boop/branches/ram_version/telekatz_soundtest/itt_codes.h new file mode 100644 index 0000000..da46d08 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/itt_codes.h @@ -0,0 +1,10 @@ +#ifndef ITT_CODES_H +#define ITT_CODES_H + +#include "ir-codes/itt/seleco_019" +#include "ir-codes/itt/seleco_049" +#include "ir-codes/itt/seleco_108" +#include "ir-codes/itt/seleco_131" + +#endif + diff --git a/boop/branches/ram_version/telekatz_soundtest/keyboard.c b/boop/branches/ram_version/telekatz_soundtest/keyboard.c new file mode 100644 index 0000000..546a168 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/keyboard.c @@ -0,0 +1,101 @@ +/* + keyboard.c - button handling + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "keyboard.h" +#include "lpc2220.h" +#include "irq.h" + +unsigned int keys[2]; +unsigned char autorepeat; +unsigned char batcnt; + +static unsigned int xkeys[2]; +static unsigned int keytest; +static unsigned char half; +static int x; + +void initKeys(void) +{ + keys[0] = 0; + keys[1] = 0; +} + +void startKeyIRQ(void) +{ + autorepeat = 0; + + T0TCR = 0x02; + T0TC = 187490; + T0PR = 0x03; // 7.500.000 Hz / 4 = 1.875.000 Hz + T0MR0 = 187500; // 1.875.000 Hz / 187.500 = 10 Hz + T0MCR = 0x03; + T0TCR = 0x01; + + VICVectAddr15 = (unsigned long)&(keyIRQ); + VICVectCntl15 = VIC_SLOT_EN | INT_SRC_TIMER0; + VICIntEnable = INT_TIMER0; +} + +/* Stubs for various interrupts (may be replaced later) */ +/* ---------------------------------------------------- */ + +void __attribute__ ((interrupt("IRQ"))) keyIRQ(void) +{ + xkeys[0] = 0; + xkeys[1] = 0; + keytest = 0x01; + half = 0; + + batcnt--; + + for(x=(1<<18); x!=(1<<23); x<<=1) + { + IOCLR2=x; + testLine(FIOPIN0&(1<<28)); + testLine(FIOPIN0&(1<<27)); + testLine(FIOPIN0&(1<<22)); + testLine(FIOPIN0&(1<<13)); + testLine(IOPIN3&(1<<21)); + testLine(IOPIN3&(1<<20)); + IOSET2=x; + } + + keytest = 0x01; + half = 1; + + for(; x!=(1<<25); x<<=1) + { + IOCLR2=x; + testLine(FIOPIN0&(1<<28)); + testLine(FIOPIN0&(1<<27)); + testLine(FIOPIN0&(1<<22)); + testLine(FIOPIN0&(1<<13)); + testLine(IOPIN3&(1<<21)); + testLine(IOPIN3&(1<<20)); + IOSET2=x; + } + + keys[0] = xkeys[0]; + keys[1] = xkeys[1]; + if(autorepeat < AUTO_TIMEOUT) + autorepeat++; + T0IR = 1; + VICVectAddr = 0; + + +} diff --git a/boop/branches/ram_version/telekatz_soundtest/keyboard.h b/boop/branches/ram_version/telekatz_soundtest/keyboard.h new file mode 100644 index 0000000..1875ad8 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/keyboard.h @@ -0,0 +1,83 @@ +/* + keyboard.h - button handling + Copyright (C) 2007 Ch. Klippel + + 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 3 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 KEYBOARD_H +#define KEYBOARD_H + +#define KEY_5 (keys[0] & 0x00000001) +#define KEY_6 (keys[0] & 0x00000002) +#define KEY_C (keys[0] & 0x00000004) +#define KEY_B (keys[0] & 0x00000008) +#define KEY_A (keys[0] & 0x00000010) +#define KEY_1 (keys[0] & 0x00000020) +#define KEY_8 (keys[0] & 0x00000040) +#define KEY_9 (keys[0] & 0x00000080) +#define KEY_D (keys[0] & 0x00000100) +#define KEY_Up (keys[0] & 0x00000200) +#define KEY_Betty (keys[0] & 0x00000400) +#define KEY_4 (keys[0] & 0x00000800) +#define KEY_0 (keys[0] & 0x00001000) +#define KEY_AV (keys[0] & 0x00002000) +#define KEY_Right (keys[0] & 0x00004000) +#define KEY_Left (keys[0] & 0x00008000) +#define KEY_Vplus (keys[0] & 0x00010000) +#define KEY_7 (keys[0] & 0x00020000) +#define KEY_AB (keys[0] & 0x00040000) +#define KEY_16_9 (keys[0] & 0x00080000) +#define KEY_Exit (keys[0] & 0x00100000) +#define KEY_OK (keys[0] & 0x00200000) +#define KEY_Vminus (keys[0] & 0x00400000) +#define KEY_Minus (keys[0] & 0x00800000) +#define KEY_VTX2 (keys[0] & 0x01000000) +#define KEY_VTX3 (keys[0] & 0x02000000) +#define KEY_Pplus (keys[0] & 0x04000000) +#define KEY_Down (keys[0] & 0x08000000) +#define KEY_Menu (keys[0] & 0x10000000) +#define KEY_PiP (keys[0] & 0x20000000) + +#define KEY_Yellow (keys[1] & 0x00000001) +#define KEY_Blue (keys[1] & 0x00000002) +#define KEY_Pminus (keys[1] & 0x00000004) +#define KEY_Mute (keys[1] & 0x00000008) +#define KEY_Info (keys[1] & 0x00000010) +#define KEY_VTX1 (keys[1] & 0x00000020) +#define KEY_TV (keys[1] & 0x00000040) +#define KEY_Power (keys[1] & 0x00000080) +#define KEY_3 (keys[1] & 0x00000100) +#define KEY_2 (keys[1] & 0x00000200) +#define KEY_Red (keys[1] & 0x00000400) +#define KEY_Green (keys[1] & 0x00000800) + +#define AUTO_TIMEOUT 5 + +#define testLine(_c) \ +{ \ + if(!(_c)) \ + { \ + xkeys[half] |= keytest; \ + } \ + keytest <<= 1; \ +} + +void __attribute__ ((interrupt("IRQ"))) keyIRQ (void); + +void startKeyIRQ(void); +void initKeys(void); +void scanKeys(void); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/lcd.c b/boop/branches/ram_version/telekatz_soundtest/lcd.c new file mode 100644 index 0000000..71af337 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/lcd.c @@ -0,0 +1,617 @@ +/* + lcd.c - lcd control & graphics primitives + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lpc2220.h" +#include "lcd.h" +#include "fonty.h" +//#include "b.h" + +void pause(unsigned int ptime) +{ + unsigned long xx; + xx = ptime * 750; + while(xx) + { + xx--; + }; +} + +void lcd_set(unsigned char s) +{ + if(s == 0) + { + LCD_CMD = 0xA0; // set segment remap (00H mapped to seg0) + LCD_CMD = 0xC8; // set com output scan direction (remapped mode) + } + else + { + LCD_CMD = 0xA1; // set segment remap (7FH mapped to seg0) + LCD_CMD = 0xC0; // set com output scan direction (normal mode) + } +} + +void lcd_init(unsigned char s) +{ + + LCD_CMD = 0xE1; // exit power save mode + LCD_CMD = 0xE2; // software reset + pause(0x32); + LCD_CMD = 0xAB; // start internal oscillator + LCD_CMD = 0x27; // set internal regulator resistor ratio (8.1) + LCD_CMD = 0x81; // volume cmd + LCD_CMD = 0x3A; // volume cmd value + LCD_CMD = 0x65; // set DC-DC converter factor (4x) + LCD_CMD = 0x60; // set upper window corner ax cmd + LCD_CMD = 0x1C; // set upper window corner ax value + LCD_CMD = 0x61; // set upper window corner ay cmd + LCD_CMD = 0x0A; // set upper window corner ay value + LCD_CMD = 0x62; // set lower window corner bx cmd + LCD_CMD = 0x75; // set lower window corner bx value + LCD_CMD = 0x63; // set lower window corner by cmd + LCD_CMD = 0x81; // set lower window corner by value + LCD_CMD = 0x90; // set PWM and FRC (4-frames) + LCD_CMD = 0x88; // set white mode frame 2nd and 1st cmd + LCD_CMD = 0x00; // set white mode frame 2nd and 1st value + LCD_CMD = 0x89; // set white mode frame 4th and 3rd cmd + LCD_CMD = 0x00; // set white mode frame 4th and 3rd value + LCD_CMD = 0x8A; // set light gray mode frame 2nd and 1st cmd + LCD_CMD = 0x36; // set light gray mode frame 2nd and 1st value + LCD_CMD = 0x8B; // set light gray mode frame 4th and 3rd cmd + LCD_CMD = 0x63; // set light gray mode frame 4th and 3rd vakue + LCD_CMD = 0x8C; // set dark gray mode frame 2nd and 1st cmd + LCD_CMD = 0x67; // set dark gray mode frame 2nd and 1st value + LCD_CMD = 0x8D; // set dark gray mode frame 4th and 3rd cmd + LCD_CMD = 0x76; // set dark gray mode frame 4th and 3rd vakue + LCD_CMD = 0x8E; // set black mode frame 2nd and 1st cmd + LCD_CMD = 0xAC; // set black mode frame 2nd and 1st value + LCD_CMD = 0x8F; // set black mode frame 4th and 3rd cmd + LCD_CMD = 0xCA; // set black mode frame 4th and 3rd value + LCD_CMD = 0x66; // set DC-DC converter factor (5x) + lcd_set(s); + +// LCD_CMD = 0x2E; // set power control register (boost on, reg on, buffer off) + +// pause(0x64); + + LCD_CMD = 0x2f; // set power control register (boost on, reg on, buffer on) 0x2F; + LCD_CMD = 0xA4; // set entire display on, normal mode) + LCD_CMD = 0xA6; // set normal display mode, inverse = 0xA7 + + + lcd_fill(0x00); + + LCD_CMD = 0xAF; + + set_font(0); +} + +void lcd_enable(unsigned char e) +{ + if(e) + { + LCD_CMD = 0xAF; // set display on + } + else + { + LCD_CMD = 0xAE; // set display off + } +} + +void lcd_fill(unsigned char f) +{ + unsigned char x,y; + for(y=0;y<20;y++) + { + LCD_CMD = 0xB0; + LCD_CMD = y; + LCD_CMD = 0x10; + LCD_CMD = 0x00; + for(x=0;x<128;x++) + { + LCD_DATA = f; + LCD_DATA = f; + } + } +} + +void draw_logo(void) +{/* + unsigned short f; + unsigned char x,y; + f=0; + for(y=0;y>3;y++) + { + LCD_CMD = 0xB0; + LCD_CMD = y; + LCD_CMD = 0x10; + LCD_CMD = 0x00; + for(x=0;x> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + q = LCD_DATA; + q = l; + + while(q--) + { + rcubuf[0][q] = LCD_DATA; + rcubuf[1][q] = LCD_DATA; + } + + q = LCD_DATA; + + LCD_CMD = 0xB0; + LCD_CMD = (y >> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + q = l; + + switch(m) + { + case DRAW_PUT: // draw put + while(q--) + { + LCD_DATA = rcubuf[0][q] | drawbuf[0][q]; + LCD_DATA = rcubuf[1][q] | drawbuf[1][q]; + } + break; + case DRAW_XOR: // draw xor + while(q--) + { + LCD_DATA = rcubuf[0][q] ^ drawbuf[0][q]; + LCD_DATA = rcubuf[1][q] ^ drawbuf[1][q]; + } + break; + case DRAW_ERASE: // draw erase + while(q--) + { + LCD_DATA = rcubuf[0][q] & ~drawbuf[0][q]; + LCD_DATA = rcubuf[1][q] & ~drawbuf[1][q]; + } + break; + } +} + +void do_rcuS(unsigned char x, unsigned char y, unsigned char m) +{ + unsigned char q; + + LCD_CMD = 0xB0; + LCD_CMD = (y >> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + q = LCD_DATA; + rcubuf[0][0] = LCD_DATA; + rcubuf[1][0] = LCD_DATA; + + q = LCD_DATA; + + LCD_CMD = 0xB0; + LCD_CMD = (y >> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + switch(m) + { + case 0: // draw put + LCD_DATA = rcubuf[0][0] | drawbuf[0][0]; + LCD_DATA = rcubuf[1][0] | drawbuf[1][0]; + break; + case 1: // draw xor + LCD_DATA = rcubuf[0][0] ^ drawbuf[0][0]; + LCD_DATA = rcubuf[1][0] ^ drawbuf[1][0]; + break; + case 2: // draw erase + LCD_DATA = rcubuf[0][0] & ~drawbuf[0][0]; + LCD_DATA = rcubuf[1][0] & ~drawbuf[1][0]; + break; + } +} + +void draw_block(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char c, unsigned char m) +{ + unsigned char q,s; + unsigned char yy,ss,vv,ww,xx; + unsigned char segm; + + s = y; + + if(h) + { + + + + yy = h; + ss = y >> 3; + vv = y & 0x07; + + ww = yy & 0x07; + + segm = 0xFF; + + xx = 8; + if(yy < 8) + { + segm >>= (8-ww); + xx -= (8-ww); + if(vv > (8-xx)) + { + xx = yy -(vv-(8-xx)); + } + else + { + xx = yy; + } + } + else + { + xx -= vv; + } + + segm <<= vv; + + q = w; + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = segm; + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = segm; + else + drawbuf[1][q] = 0; + } + do_rcu(x,s,w,m); + + yy -= xx; + + while(yy > 8) + { + s += 8; + yy -= 8; + q = w; + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = 0xFF; + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = 0xFF; + else + drawbuf[1][q] = 0; + } + do_rcu(x,s,w,m); + } + + if(yy) + { + s += 8; + q = w; + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = 0xFF >> (8-yy); + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = 0xFF >> (8-yy); + else + drawbuf[1][q] = 0; + } + do_rcu(x,s,w,m); + } + } +} + +void draw_hline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m) +{ + unsigned char p,q; + + q = l; + p = 0x01 << (y & 0x07); + + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = p; + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = p; + else + drawbuf[1][q] = 0; + } + do_rcu(x,y,l,m); +} + +void draw_vline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m) +{ + unsigned char s; + unsigned char yy,ss,vv,ww,xx; + unsigned char segm; + + s = y; + + if(l) + { + + + + yy = l; + ss = y >> 3; + vv = y & 0x07; + + ww = yy & 0x07; + + segm = 0xFF; + + xx = 8; + if(yy < 8) + { + segm >>= (8-ww); + xx -= (8-ww); + if(vv > (8-xx)) + { + xx = yy -(vv-(8-xx)); + } + else + { + xx = yy; + } + } + else + { + xx -= vv; + } + + segm <<= vv; + + if(c & 0x02) + drawbuf[0][0] = segm; + else + drawbuf[0][0] = 0; + + if(c & 0x01) + drawbuf[1][0] = segm; + else + drawbuf[1][0] = 0; + + do_rcuS(x,s,m); + + yy -= xx; + + while(yy > 8) + { + s += 8; + yy -= 8; + if(c & 0x02) + drawbuf[0][0] = 0xFF; + else + drawbuf[0][0] = 0; + + if(c & 0x01) + drawbuf[1][0] = 0xFF; + else + drawbuf[1][0] = 0; + do_rcuS(x,s,m); + } + + if(yy) + { + s += 8; + if(c & 0x02) + drawbuf[0][0] = 0xFF >> (8-yy); + else + drawbuf[0][0] = 0; + + if(c & 0x01) + drawbuf[1][0] = 0xFF >> (8-yy); + else + drawbuf[1][0] = 0; + do_rcuS(x,s,m); + } + } +} + +void draw_rect(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char lw, unsigned char c, unsigned char m) +{ + if(lw) + { + if(lw == 1) + { + draw_hline(x, y, w, c, m); + draw_hline(x, y+h-1, w, c, m); + + draw_vline(x, y+1, h-2, c, m); + draw_vline(x+w-1, y+1, h-2, c, m); + } + else + { + draw_block(x, y, w, lw, c, m); + draw_block(x, y+h-lw, w, lw, c, m); + draw_block(x, y+lw, lw, h-(2*lw), c, m); + draw_block(x+w-lw, y+lw, lw, h-(2*lw), c, m); + } + } +} + +void draw_pixel(unsigned char x, unsigned char y, unsigned char c, unsigned char m) +{ + unsigned char p; + + p = 0x01 << (y & 0x07); + + if(c & 0x02) + drawbuf[0][0] = p; + else + drawbuf[0][0] = 0; + + if(c & 0x01) + drawbuf[1][0] = p; + else + drawbuf[1][0] = 0; + + do_rcuS(x,y,m); +} + +void draw_line(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char c, unsigned char m) +{ + unsigned char i,dx,dy,px,py; + unsigned int x,y; + + if (y2 > y1) // incl. POSITIVE + { + dx=x2-x1; + dy=y2-y1; + px=x1; + py=y1; + draw_pixel(x1, y1, c, m); // first pixel + if (dx>=dy) // incl. is more horizontal than vertical + { + y = y1; + for(i=0;i=dx) + { + y-=dx; + py+=1; + } + px+=1; + draw_pixel(px, py, c, m); + } + } + else // incl. is more vertical than horizontal + { + x = x1; + for(i=0;i=dy) + { + x-=dy; + px+=1; + } + py+=1; + draw_pixel(px, py, c, m); //?????? + } + }; + } + else if (y2 < y1) // incl. NEGATIVE + { + dx=x2-x1; + dy=y1-y2; // inverted to produce a positive value + dx=dx; + dy=dy; + px=x1; + py=y2; // Note: due to inverted "dy", + draw_pixel(x2, y2, c, m); // the first pixel became the last one + if (dx>=dy) // incl. is more horizontal than vertical + { + y = y1; + py=y1; + for(i=0;i=dx) + { + y-=dx; + py-=1; + } + px+=1; + draw_pixel(px, py, c, m); + } + } + else // incl. is more vertical than horizontal + { + x = x1; + px=x2; + for(i=0;i=dy) + { + x-=dy; + px-=1; + } + py+=1; + draw_pixel(px, py, c, m); + } + }; + } +} + +void draw_circle(unsigned char cx, unsigned char cy, unsigned char radius, unsigned char c, unsigned char m) +{ + signed int tswitch; + unsigned char y, x = 0; + unsigned char d; + + d = cy - cx; + y = radius; + tswitch = 3 - 2 * radius; + while (x <= y) + { + draw_pixel(cx + x, cy + y, c, m); + draw_pixel(cx + x, cy - y, c, m); + draw_pixel(cx - x, cy + y, c, m); + draw_pixel(cx - x, cy - y, c, m); + + draw_pixel(cy + y - d, cy + x, c, m); + draw_pixel(cy + y - d, cy - x, c, m); + draw_pixel(cy - y - d, cy + x, c, m); + draw_pixel(cy - y - d, cy - x, c, m); + + if (tswitch < 0) + { + tswitch += (4 * x + 6); + } + else + { + tswitch += (4 * (x - y) + 10); + y--; + } + x++; + } +} + + diff --git a/boop/branches/ram_version/telekatz_soundtest/lcd.h b/boop/branches/ram_version/telekatz_soundtest/lcd.h new file mode 100644 index 0000000..8aaa59d --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/lcd.h @@ -0,0 +1,47 @@ +/* + lcd.h - lcd control & graphics primitives + Copyright (C) 2007 Ch. Klippel + + 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 3 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 LCD_H +#define LCD_H + +// the lcd data & command ports +#define LCD_CMD (*((volatile unsigned char *) 0x81000000)) +#define LCD_DATA (*((volatile unsigned char *) 0x81000001)) + +// drawmodes +#define DRAW_PUT 0 +#define DRAW_XOR 1 +#define DRAW_ERASE 2 + +void lcd_init(unsigned char s); +void lcd_enable(unsigned char e); +void do_rcu(unsigned char x, unsigned char y, unsigned char l, unsigned char m); +void do_rcuS(unsigned char x, unsigned char y, unsigned char m); +void pause(unsigned int ptime); + +void lcd_fill(unsigned char f); +void draw_logo(void); +void draw_block(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char c, unsigned char m); +void draw_hline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m); +void draw_vline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m); +void draw_rect(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char lw, unsigned char c, unsigned char m); +void draw_pixel(unsigned char x, unsigned char y, unsigned char c, unsigned char m); +void draw_line(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char c, unsigned char m); +void draw_circle(unsigned char cx, unsigned char cy, unsigned char radius, unsigned char c, unsigned char m); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/lpc2220.h b/boop/branches/ram_version/telekatz_soundtest/lpc2220.h new file mode 100644 index 0000000..0a65789 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/lpc2220.h @@ -0,0 +1,285 @@ +/* + lpc2220.h - register definitions + Copyright (C) 2007 Ch. Klippel + + 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 3 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 LPC2220_H +#define LPC2220_H + +/* External Memory Controller (EMC) */ +#define BCFG0 (*((volatile unsigned long *) 0xFFE00000)) +#define BCFG1 (*((volatile unsigned long *) 0xFFE00004)) +#define BCFG2 (*((volatile unsigned long *) 0xFFE00008)) +#define BCFG3 (*((volatile unsigned long *) 0xFFE0000C)) + +/* Vectored Interrupt Controller (VIC) */ +#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000)) +#define VICFIQStatus (*((volatile unsigned long *) 0xFFFFF004)) +#define VICRawIntr (*((volatile unsigned long *) 0xFFFFF008)) +#define VICIntSelect (*((volatile unsigned long *) 0xFFFFF00C)) +#define VICIntEnable (*((volatile unsigned long *) 0xFFFFF010)) +#define VICIntEnClr (*((volatile unsigned long *) 0xFFFFF014)) +#define VICSoftInt (*((volatile unsigned long *) 0xFFFFF018)) +#define VICSoftIntClr (*((volatile unsigned long *) 0xFFFFF01C)) +#define VICProtection (*((volatile unsigned long *) 0xFFFFF020)) +#define VICVectAddr (*((volatile unsigned long *) 0xFFFFF030)) +#define VICDefVectAddr (*((volatile unsigned long *) 0xFFFFF034)) +#define VICVectAddr0 (*((volatile unsigned long *) 0xFFFFF100)) +#define VICVectAddr1 (*((volatile unsigned long *) 0xFFFFF104)) +#define VICVectAddr2 (*((volatile unsigned long *) 0xFFFFF108)) +#define VICVectAddr3 (*((volatile unsigned long *) 0xFFFFF10C)) +#define VICVectAddr4 (*((volatile unsigned long *) 0xFFFFF110)) +#define VICVectAddr5 (*((volatile unsigned long *) 0xFFFFF114)) +#define VICVectAddr6 (*((volatile unsigned long *) 0xFFFFF118)) +#define VICVectAddr7 (*((volatile unsigned long *) 0xFFFFF11C)) +#define VICVectAddr8 (*((volatile unsigned long *) 0xFFFFF120)) +#define VICVectAddr9 (*((volatile unsigned long *) 0xFFFFF124)) +#define VICVectAddr10 (*((volatile unsigned long *) 0xFFFFF128)) +#define VICVectAddr11 (*((volatile unsigned long *) 0xFFFFF12C)) +#define VICVectAddr12 (*((volatile unsigned long *) 0xFFFFF130)) +#define VICVectAddr13 (*((volatile unsigned long *) 0xFFFFF134)) +#define VICVectAddr14 (*((volatile unsigned long *) 0xFFFFF138)) +#define VICVectAddr15 (*((volatile unsigned long *) 0xFFFFF13C)) +#define VICVectCntl0 (*((volatile unsigned long *) 0xFFFFF200)) +#define VICVectCntl1 (*((volatile unsigned long *) 0xFFFFF204)) +#define VICVectCntl2 (*((volatile unsigned long *) 0xFFFFF208)) +#define VICVectCntl3 (*((volatile unsigned long *) 0xFFFFF20C)) +#define VICVectCntl4 (*((volatile unsigned long *) 0xFFFFF210)) +#define VICVectCntl5 (*((volatile unsigned long *) 0xFFFFF214)) +#define VICVectCntl6 (*((volatile unsigned long *) 0xFFFFF218)) +#define VICVectCntl7 (*((volatile unsigned long *) 0xFFFFF21C)) +#define VICVectCntl8 (*((volatile unsigned long *) 0xFFFFF220)) +#define VICVectCntl9 (*((volatile unsigned long *) 0xFFFFF224)) +#define VICVectCntl10 (*((volatile unsigned long *) 0xFFFFF228)) +#define VICVectCntl11 (*((volatile unsigned long *) 0xFFFFF22C)) +#define VICVectCntl12 (*((volatile unsigned long *) 0xFFFFF230)) +#define VICVectCntl13 (*((volatile unsigned long *) 0xFFFFF234)) +#define VICVectCntl14 (*((volatile unsigned long *) 0xFFFFF238)) +#define VICVectCntl15 (*((volatile unsigned long *) 0xFFFFF23C)) + +#define SCS (*((volatile unsigned char *) 0xE01FC1A0)) +#define FIOPIN0 (*((volatile unsigned long *) 0x3FFFC014)) +#define FIOSET0 (*((volatile unsigned long *) 0x3FFFC018)) +#define FIODIR0 (*((volatile unsigned long *) 0x3FFFC000)) +#define FIOCLR0 (*((volatile unsigned long *) 0x3FFFC01C)) + +/* Pin Connect Block */ +#define PINSEL0 (*((volatile unsigned long *) 0xE002C000)) +#define PINSEL1 (*((volatile unsigned long *) 0xE002C004)) +#define PINSEL2 (*((volatile unsigned long *) 0xE002C014)) + +/* General Purpose Input/Output (GPIO) */ +#define IOPIN0 (*((volatile unsigned long *) 0xE0028000)) +#define IOSET0 (*((volatile unsigned long *) 0xE0028004)) +#define IODIR0 (*((volatile unsigned long *) 0xE0028008)) +#define IOCLR0 (*((volatile unsigned long *) 0xE002800C)) +#define IOPIN1 (*((volatile unsigned long *) 0xE0028010)) +#define IOSET1 (*((volatile unsigned long *) 0xE0028014)) +#define IODIR1 (*((volatile unsigned long *) 0xE0028018)) +#define IOCLR1 (*((volatile unsigned long *) 0xE002801C)) +#define IOPIN2 (*((volatile unsigned long *) 0xE0028020)) +#define IOSET2 (*((volatile unsigned long *) 0xE0028024)) +#define IODIR2 (*((volatile unsigned long *) 0xE0028028)) +#define IOCLR2 (*((volatile unsigned long *) 0xE002802C)) +#define IOPIN3 (*((volatile unsigned long *) 0xE0028030)) +#define IOSET3 (*((volatile unsigned long *) 0xE0028034)) +#define IODIR3 (*((volatile unsigned long *) 0xE0028038)) +#define IOCLR3 (*((volatile unsigned long *) 0xE002803C)) + +/* Phase Locked Loop (PLL) */ +#define PLLCON (*((volatile unsigned char *) 0xE01FC080)) +#define PLLCFG (*((volatile unsigned char *) 0xE01FC084)) +#define PLLSTAT (*((volatile unsigned short*) 0xE01FC088)) +#define PLLFEED (*((volatile unsigned char *) 0xE01FC08C)) + +/* VPB Divider */ +#define VPBDIV (*((volatile unsigned char *) 0xE01FC100)) + +/* Power Control */ +#define PCON (*((volatile unsigned char *) 0xE01FC0C0)) +#define PCONP (*((volatile unsigned long *) 0xE01FC0C4)) + +/* External Interrupts */ +#define EXTINT (*((volatile unsigned char *) 0xE01FC140)) +#define EXTWAKE (*((volatile unsigned char *) 0xE01FC144)) +#define EXTMODE (*((volatile unsigned char *) 0xE01FC148)) +#define EXTPOLAR (*((volatile unsigned char *) 0xE01FC14C)) + +/* Timer 0 */ +#define T0IR (*((volatile unsigned long *) 0xE0004000)) +#define T0TCR (*((volatile unsigned long *) 0xE0004004)) +#define T0TC (*((volatile unsigned long *) 0xE0004008)) +#define T0PR (*((volatile unsigned long *) 0xE000400C)) +#define T0PC (*((volatile unsigned long *) 0xE0004010)) +#define T0MCR (*((volatile unsigned long *) 0xE0004014)) +#define T0MR0 (*((volatile unsigned long *) 0xE0004018)) +#define T0MR1 (*((volatile unsigned long *) 0xE000401C)) +#define T0MR2 (*((volatile unsigned long *) 0xE0004020)) +#define T0MR3 (*((volatile unsigned long *) 0xE0004024)) +#define T0CCR (*((volatile unsigned long *) 0xE0004028)) +#define T0CR0 (*((volatile unsigned long *) 0xE000402C)) +#define T0CR1 (*((volatile unsigned long *) 0xE0004030)) +#define T0CR2 (*((volatile unsigned long *) 0xE0004034)) +#define T0CR3 (*((volatile unsigned long *) 0xE0004038)) +#define T0EMR (*((volatile unsigned long *) 0xE000403C)) + +/* Timer 1 */ +#define T1IR (*((volatile unsigned long *) 0xE0008000)) +#define T1TCR (*((volatile unsigned long *) 0xE0008004)) +#define T1TC (*((volatile unsigned long *) 0xE0008008)) +#define T1PR (*((volatile unsigned long *) 0xE000800C)) +#define T1PC (*((volatile unsigned long *) 0xE0008010)) +#define T1MCR (*((volatile unsigned long *) 0xE0008014)) +#define T1MR0 (*((volatile unsigned long *) 0xE0008018)) +#define T1MR1 (*((volatile unsigned long *) 0xE000801C)) +#define T1MR2 (*((volatile unsigned long *) 0xE0008020)) +#define T1MR3 (*((volatile unsigned long *) 0xE0008024)) +#define T1CCR (*((volatile unsigned long *) 0xE0008028)) +#define T1CR0 (*((volatile unsigned long *) 0xE000802C)) +#define T1CR1 (*((volatile unsigned long *) 0xE0008030)) +#define T1CR2 (*((volatile unsigned long *) 0xE0008034)) +#define T1CR3 (*((volatile unsigned long *) 0xE0008038)) +#define T1EMR (*((volatile unsigned long *) 0xE000803C)) + +/* Pulse Width Modulator (PWM) */ +#define PWMIR (*((volatile unsigned long *) 0xE0014000)) +#define PWMTCR (*((volatile unsigned long *) 0xE0014004)) +#define PWMTC (*((volatile unsigned long *) 0xE0014008)) +#define PWMPR (*((volatile unsigned long *) 0xE001400C)) +#define PWMPC (*((volatile unsigned long *) 0xE0014010)) +#define PWMMCR (*((volatile unsigned long *) 0xE0014014)) +#define PWMMR0 (*((volatile unsigned long *) 0xE0014018)) +#define PWMMR1 (*((volatile unsigned long *) 0xE001401C)) +#define PWMMR2 (*((volatile unsigned long *) 0xE0014020)) +#define PWMMR3 (*((volatile unsigned long *) 0xE0014024)) +#define PWMMR4 (*((volatile unsigned long *) 0xE0014040)) +#define PWMMR5 (*((volatile unsigned long *) 0xE0014044)) +#define PWMMR6 (*((volatile unsigned long *) 0xE0014048)) +#define PWMCCR (*((volatile unsigned long *) 0xE0014028)) +#define PWMCR0 (*((volatile unsigned long *) 0xE001402C)) +#define PWMCR1 (*((volatile unsigned long *) 0xE0014030)) +#define PWMCR2 (*((volatile unsigned long *) 0xE0014034)) +#define PWMCR3 (*((volatile unsigned long *) 0xE0014038)) +#define PWMEMR (*((volatile unsigned long *) 0xE001403C)) +#define PWMPCR (*((volatile unsigned long *) 0xE001404C)) +#define PWMLER (*((volatile unsigned long *) 0xE0014050)) + +/* Universal Asynchronous Receiver Transmitter 0 (UART0) */ +#define U0RBR (*((volatile unsigned char *) 0xE000C000)) +#define U0THR (*((volatile unsigned char *) 0xE000C000)) +#define U0IER (*((volatile unsigned char *) 0xE000C004)) +#define U0IIR (*((volatile unsigned char *) 0xE000C008)) +#define U0FCR (*((volatile unsigned char *) 0xE000C008)) +#define U0LCR (*((volatile unsigned char *) 0xE000C00C)) +#define U0MCR (*((volatile unsigned char *) 0xE000C010)) +#define U0LSR (*((volatile unsigned char *) 0xE000C014)) +#define U0MSR (*((volatile unsigned char *) 0xE000C018)) +#define U0SCR (*((volatile unsigned char *) 0xE000C01C)) +#define U0FDR (*((volatile unsigned char *) 0xE000C028)) +#define U0DLL (*((volatile unsigned char *) 0xE000C000)) +#define U0DLM (*((volatile unsigned char *) 0xE000C004)) + +/* Universal Asynchronous Receiver Transmitter 1 (UART1) */ +#define U1RBR (*((volatile unsigned char *) 0xE0010000)) +#define U1THR (*((volatile unsigned char *) 0xE0010000)) +#define U1IER (*((volatile unsigned char *) 0xE0010004)) +#define U1IIR (*((volatile unsigned char *) 0xE0010008)) +#define U1FCR (*((volatile unsigned char *) 0xE0010008)) +#define U1LCR (*((volatile unsigned char *) 0xE001000C)) +#define U1MCR (*((volatile unsigned char *) 0xE0010010)) +#define U1LSR (*((volatile unsigned char *) 0xE0010014)) +#define U1MSR (*((volatile unsigned char *) 0xE0010018)) +#define U1SCR (*((volatile unsigned char *) 0xE001001C)) +#define U1DLL (*((volatile unsigned char *) 0xE0010000)) +#define U1DLM (*((volatile unsigned char *) 0xE0010004)) + +/* I2C Interface */ +#define I2CONSET (*((volatile unsigned char *) 0xE001C000)) +#define I2STAT (*((volatile unsigned char *) 0xE001C004)) +#define I2DAT (*((volatile unsigned char *) 0xE001C008)) +#define I2ADR (*((volatile unsigned char *) 0xE001C00C)) +#define I2SCLH (*((volatile unsigned short*) 0xE001C010)) +#define I2SCLL (*((volatile unsigned short*) 0xE001C014)) +#define I2CONCLR (*((volatile unsigned char *) 0xE001C018)) + +/* SPI0 (Serial Peripheral Interface 0) */ +#define S0SPCR (*((volatile unsigned char *) 0xE0020000)) +#define S0SPSR (*((volatile unsigned char *) 0xE0020004)) +#define S0SPDR (*((volatile unsigned char *) 0xE0020008)) +#define S0SPCCR (*((volatile unsigned char *) 0xE002000C)) +#define S0SPTCR (*((volatile unsigned char *) 0xE0020010)) +#define S0SPTSR (*((volatile unsigned char *) 0xE0020014)) +#define S0SPTOR (*((volatile unsigned char *) 0xE0020018)) +#define S0SPINT (*((volatile unsigned char *) 0xE002001C)) + +/* SPI1 (Serial Peripheral Interface 1) */ +#define S1SPCR (*((volatile unsigned char *) 0xE0030000)) +#define S1SPSR (*((volatile unsigned char *) 0xE0030004)) +#define S1SPDR (*((volatile unsigned char *) 0xE0030008)) +#define S1SPCCR (*((volatile unsigned char *) 0xE003000C)) +#define S1SPTCR (*((volatile unsigned char *) 0xE0030010)) +#define S1SPTSR (*((volatile unsigned char *) 0xE0030014)) +#define S1SPTOR (*((volatile unsigned char *) 0xE0030018)) +#define S1SPINT (*((volatile unsigned char *) 0xE003001C)) + +/* Real Time Clock */ +#define ILR (*((volatile unsigned char *) 0xE0024000)) +#define CTC (*((volatile unsigned short*) 0xE0024004)) +#define CCR (*((volatile unsigned char *) 0xE0024008)) +#define CIIR (*((volatile unsigned char *) 0xE002400C)) +#define AMR (*((volatile unsigned char *) 0xE0024010)) +#define CTIME0 (*((volatile unsigned long *) 0xE0024014)) +#define CTIME1 (*((volatile unsigned long *) 0xE0024018)) +#define CTIME2 (*((volatile unsigned long *) 0xE002401C)) +#define SEC (*((volatile unsigned char *) 0xE0024020)) +#define MIN (*((volatile unsigned char *) 0xE0024024)) +#define HOUR (*((volatile unsigned char *) 0xE0024028)) +#define DOM (*((volatile unsigned char *) 0xE002402C)) +#define DOW (*((volatile unsigned char *) 0xE0024030)) +#define DOY (*((volatile unsigned short*) 0xE0024034)) +#define MONTH (*((volatile unsigned char *) 0xE0024038)) +#define YEAR (*((volatile unsigned short*) 0xE002403C)) +#define ALSEC (*((volatile unsigned char *) 0xE0024060)) +#define ALMIN (*((volatile unsigned char *) 0xE0024064)) +#define ALHOUR (*((volatile unsigned char *) 0xE0024068)) +#define ALDOM (*((volatile unsigned char *) 0xE002406C)) +#define ALDOW (*((volatile unsigned char *) 0xE0024070)) +#define ALDOY (*((volatile unsigned short*) 0xE0024074)) +#define ALMON (*((volatile unsigned char *) 0xE0024078)) +#define ALYEAR (*((volatile unsigned short*) 0xE002407C)) +#define PREINT (*((volatile unsigned short*) 0xE0024080)) +#define PREFRAC (*((volatile unsigned short*) 0xE0024084)) + +/* A/D Converter */ +#define ADCR (*((volatile unsigned long *) 0xE0034000)) +#define ADDR (*((volatile unsigned long *) 0xE0034004)) + +/* Watchdog */ +#define WDMOD (*((volatile unsigned char *) 0xE0000000)) +#define WDTC (*((volatile unsigned long *) 0xE0000004)) +#define WDFEED (*((volatile unsigned char *) 0xE0000008)) +#define WDTV (*((volatile unsigned long *) 0xE000000C)) + +/* Memory Mapping control register */ +#define MEMMAP (*((volatile unsigned long *) 0xE01FC040)) + +#define SSPCR0 (*((volatile unsigned long *) 0xE005C000)) +#define SSPCR1 (*((volatile unsigned char *) 0xE005C004)) +#define SSPDR (*((volatile unsigned char *) 0xE005C008)) +#define SSPSR (*((volatile unsigned char *) 0xE005C00C)) +#define SSPCPSR (*((volatile unsigned char *) 0xE005C010)) + +#endif /* __ASM_ARCH_HARDWARE_H */ diff --git a/boop/branches/ram_version/telekatz_soundtest/lpc2220.ld b/boop/branches/ram_version/telekatz_soundtest/lpc2220.ld new file mode 100644 index 0000000..27e6dfd --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/lpc2220.ld @@ -0,0 +1,66 @@ +/* identify the Entry Point */ + +ENTRY(Reset_Handler) + +/* specify the LPC2106 memory areas */ + +MEMORY +{ + flash : ORIGIN = 0x00000000, LENGTH = 128K /* free FLASH EPROM area */ + ram : ORIGIN = 0x40000200, LENGTH = 64K - 0x200 /* free RAM area */ +} + +/* define a global symbol _stack_end */ + +_stack_end = 0x4000FEDC; + +/* now define the output sections */ + +SECTIONS +{ + startup : + { + *(.startup) + } >ram /* the startup code goes into FLASH */ + + .text : /* collect all sections that should go into FLASH after startup */ + { + *(.text) /* all .text sections (code) */ + *(.rodata) /* all .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* all .glue_7 sections (no idea what these are) */ + *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ + _etext = .; /* define a global symbol _etext just after the last code byte */ + } >ram /* put all the above into FLASH */ + + .data : /* collect all initialized .data sections that go into RAM */ + { + _data = .; /* create a global symbol marking the start of the .data section */ + *(.data) /* all .data sections */ + _edata = .; /* define a global symbol marking the end of the .data section */ + } >ram /* put all the above into RAM (but load the LMA copy into FLASH) */ + + .bss : /* collect all uninitialized .bss sections that go into RAM */ + { + _bss_start = .; /* define a global symbol marking the start of the .bss section */ + *(.bss) /* all .bss sections */ + } >ram /* put all the above in RAM (it will be cleared in the startup code */ + + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + _bss_end = . ; /* define a global symbol marking the end of the .bss section */ + + _end = .; /* define a global symbol marking the end of application RAM */ +} + +PROVIDE( MEMMAP = 0xE01FC040 ); +PROVIDE( BCFG0 = 0xFFE00000 ); +PROVIDE( BCFG1 = 0xFFE00004 ); +PROVIDE( BCFG2 = 0xFFE00008 ); +PROVIDE( PINSEL0 = 0xE002C000 ); +PROVIDE( PINSEL1 = 0xE002C004 ); +PROVIDE( PINSEL2 = 0xE002C014 ); +PROVIDE( IO0PIN = 0xE0028000 ); +PROVIDE( IO0DIR = 0xE0028008 ); +PROVIDE( IO2SET = 0xE0028024 ); +PROVIDE( VICVectAddr = 0xFFFFF030 ); + diff --git a/boop/branches/ram_version/telekatz_soundtest/lpc2220_rom.ld b/boop/branches/ram_version/telekatz_soundtest/lpc2220_rom.ld new file mode 100644 index 0000000..73ff62a --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/lpc2220_rom.ld @@ -0,0 +1,113 @@ +/* + lpc2220.ld - linker script, flash based + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +/* identify the Entry Point */ + +ENTRY(_startup) + +/* specify the LPC2106 memory areas */ + +MEMORY +{ + ram : ORIGIN = 0x40000000, LENGTH = 64K /* free RAM area */ + flash : ORIGIN = 0x80000000, LENGTH = 1M /* FLASH ROM */ +} + +/* define a global symbol _stack_end */ + +_stack_end = 0x4000FEDC; + +/* now define the output sections */ + +SECTIONS +{ + . = 0; /* set location counter to address zero */ + + startup : + { + *(.startup) + } >flash /* the startup code goes into FLASH */ + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + + .text : /* collect all sections that should go into FLASH after startup */ + { + *(.text) /* all .text sections (code) */ + *(.rodata) /* all .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* all .glue_7 sections (no idea what these are) */ + *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ + _etext = .; /* define a global symbol _etext just after the last code byte */ + } >flash /* put all the above into FLASH */ + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + + .fastcode : + { + __fastcode_load = LOADADDR(.fastcode); + __fastcode_start = .; + /* functions with __attribute__ ((section (".text.fastcode")))*/ + *(.text.fastcode) + *(.text.ramvectors) + *(.text.keyIRQ) + *(.text.soundIRQ) + *(.text.irIRQ) + *(.text.scanKeys) + *(.text.defIR) + *(.text.RC5_Encode) + *(.text.RCMM_Encode) + *(.text.NRC17_Encode) + *(.text.SIRC_Encode) + *(.text.REC80_Encode) + *(.text.ITT_Encode) + *(.text.SPACEENC_Encode) + *(.text.RECS80_Encode) + *(.text.RCA_Encode) + . = ALIGN (4); + __fastcode_end = .; + } >ram AT>flash + + + .data : /* collect all initialized .data sections that go into RAM */ + { + _data = .; /* create a global symbol marking the start of the .data section */ + *(.data) /* all .data sections */ + _edata = .; /* define a global symbol marking the end of the .data section */ + } >ram AT >flash /* put all the above into RAM (but load the LMA copy into FLASH) */ + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + + .bss : /* collect all uninitialized .bss sections that go into RAM */ + { + _bss_start = .; /* define a global symbol marking the start of the .bss section */ + *(.bss) /* all .bss sections */ + } >ram /* put all the above in RAM (it will be cleared in the startup code */ + + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + _bss_end = . ; /* define a global symbol marking the end of the .bss section */ +} +_end = .; /* define a global symbol marking the end of application RAM */ + +PROVIDE( MEMMAP = 0xE01FC040 ); +PROVIDE( BCFG0 = 0xFFE00000 ); +PROVIDE( BCFG1 = 0xFFE00004 ); +PROVIDE( BCFG2 = 0xFFE00008 ); +PROVIDE( PINSEL0 = 0xE002C000 ); +PROVIDE( PINSEL1 = 0xE002C004 ); +PROVIDE( PINSEL2 = 0xE002C014 ); +PROVIDE( IO0PIN = 0xE0028000 ); +PROVIDE( IO0DIR = 0xE0028008 ); +PROVIDE( IO2SET = 0xE0028024 ); +PROVIDE( VICVectAddr = 0xFFFFF030 ); diff --git a/boop/branches/ram_version/telekatz_soundtest/main.c b/boop/branches/ram_version/telekatz_soundtest/main.c new file mode 100644 index 0000000..a8bd367 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/main.c @@ -0,0 +1,242 @@ +/* + main.c - main program routines + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +//#define WITH_SOUND + +typedef volatile unsigned int *reg32_t; + +#include "lpc2220.h" +#include "lcd.h" +#include "irq.h" +#include "soundcore.h" +#include "fonty.h" +#include "keyboard.h" +#include "externs.h" + +static unsigned int old_tval; + +unsigned long checksum; +unsigned short count; +unsigned long adr; +const char hval[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; + +unsigned char idle; +unsigned char ccbuf[64]; + +extern unsigned char cc1100rx; +extern unsigned char batcnt; + +#define KEY_IDLE 0x00 +#define KEY_PRESS 0x01 +#define KEY_HOLD 0x02 +#define KEY_RELEASE 0x03 + +#define SPEED_30 0 +#define SPEED_60 1 + +void setSpeed(unsigned char sp) +{ + disableIRQ(); + switch(sp) + { + case SPEED_60: // turbo speed (60 mhz) + BCFG0 = 0x100005EF; + PLLCFG = 0x45; // 0100.0101 = PSEL=10=4 MSEL=00101=6 = 240mhz Fcco + PLLFEED = 0xAA; + PLLFEED = 0x55; + + VPBDIV = 0x00; + + BCFG0 = 0x100004A0; + BCFG2 = 0x100004A0; + BCFG1 = 0x00000C21; + break; + + case SPEED_30: // normal speed (30 mhz) + default: + BCFG0 = 0x100005EF; + PLLCFG = 0x42; // 0100.0010 = PSEL=10=4 MSEL=00010=3 + PLLFEED = 0xAA; + PLLFEED = 0x55; + + VPBDIV = 0x02; + + BCFG0 = 0x10000420; + BCFG2 = 0x10000420; + BCFG1 = 0x00000400; + break; + } + enableIRQ(); +} + + +int main(void) +{ + unsigned char key_state, bl_vol; + unsigned int oldkeys[2], ok[2]; + + setSpeed(SPEED_30); + + //************************************************************************************* + + + + //************************************************************************************* + oldkeys[0] = 0; + oldkeys[1] = 0; + ok[0] = 0; + ok[1] = 0; + key_state = KEY_IDLE; + old_tval = 0; + bl_vol = 0xff; + lcd_init(0); + SCS |= 0x01; + FIODIR0 |= ((1<<21) | (1<<4) | (1<<11) | (1<<6) | (1<<23) | (1<<19) | (1<<17)); + + initKeys(); + //initIR(); + IODIR0 |= (1<<12); + //VPBDIV = 0x02; + startKeyIRQ(); + startPWMIRQ(); + + idle =0; + enableIRQ(); + + while (1) + { + + switch(key_state) + { + case KEY_IDLE: + if(keys[0] != oldkeys[0] || keys[1] != oldkeys[1]) + { + if(keys[0] != 0 || keys[1] != 0) + { + draw_hexW(72,140,ok[0],3,DRAW_ERASE); + draw_hexW(72,150,ok[1],3,DRAW_ERASE); + draw_hexW(72,140,keys[0],3,DRAW_PUT); + draw_hexW(72,150,keys[1],3,DRAW_PUT); + ok[0] = keys[0]; + ok[1] = keys[1]; + key_state = KEY_PRESS; + } + + oldkeys[0] = keys[0]; + oldkeys[1] = keys[1]; + + if(KEY_A) + { + if(timeout & 0x08) + timeout = 0; + else + timeout = 0x08; + } + else if(KEY_B) + { + + + } + else if(KEY_C) + { + + } + else if(KEY_D) + { + + } + else if(KEY_Vminus) + { + FIOCLR0 |= (1<<11); + } + else if(KEY_Vplus) + { + FIOSET0 |= (1<<11); + playSID(); + } + else if(KEY_OK) + { + + } + else if(KEY_Mute) + { + + } + else if(KEY_1) + { + + } + else if(KEY_2) + { + + } + else if(KEY_3) + { + + } + else if(KEY_4) + { + + } + else if(KEY_5) + { + + } + else if(KEY_6) + { + + } + else if(KEY_7) + { + + } + else if(KEY_8) + { + + } + else if(KEY_9) + { + + } + } + break; + case KEY_PRESS: + //irSend(); + key_state = KEY_HOLD; + autorepeat = 0; + break; + case KEY_HOLD: + if(autorepeat >= AUTO_TIMEOUT) + //irRepeat(); + + if(keys[0] == 0 && keys[1] == 0) + key_state = KEY_RELEASE; + + break; + case KEY_RELEASE: + //irStop(); + key_state = KEY_IDLE; + break; + } + + + } + return 0; +} + + diff --git a/boop/branches/ram_version/telekatz_soundtest/serial.c b/boop/branches/ram_version/telekatz_soundtest/serial.c new file mode 100644 index 0000000..9ceb8be --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/serial.c @@ -0,0 +1,237 @@ +/* + * minor changes (c) 2007 ch.klippel + * + * (C) Copyright 2004 + * DAVE Srl + * http://www.dave-tech.it + * http://www.wawnet.biz + * mailto:info@wawnet.biz + * + * (C) Copyright 2002-2004 + * Wolfgang Denk, DENX Software Engineering, + * + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH + * Marius Groeger + * + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH + * Alex Zuepke + * + * Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "lpc2220.h" +#include "serial.h" + +/* flush serial input queue. returns 0 on success or negative error + * number otherwise + */ +int serial_flush_input(void) +{ + volatile unsigned int tmp; + + /* keep on reading as long as the receiver is not empty */ + while(RX_DATA(U0LSR)) { + tmp = GET_CHAR(U0RBR); + } + + return 0; +} + + +/* flush output queue. returns 0 on success or negative error number + * otherwise + */ +int serial_flush_output(void) +{ + /* wait until the transmitter is no longer busy */ + while(TX_READY(U0LSR)==0) { + } + + return 0; +} + + +void serial_setbrg (unsigned int baudrate) +{ + + /* get correct divisor */ + U0LCR = 0x83; + + switch(baudrate) { + + case 75: + U0DLL = 161; + U0DLM = 1; + U0FDR = (1 << 4) + 14; + break; + + case 150: + U0DLL = 195; + U0DLM = 0; + U0FDR = (1 << 4) + 15; + break; + + case 300: + U0DLL = 184; + U0DLM = 0; + U0FDR = (2 << 4) + 15; + break; + + case 600: + U0DLL = 156; + U0DLM = 0; + U0FDR = (1 << 4) + 4; + break; + + case 1200: + U0DLL = 130; + U0DLM = 0; + U0FDR = (7 << 4) + 14; + break; + + case 2400: + U0DLL = 180; + U0DLM = 0; + U0FDR = (12 << 4) + 1; + break; + + case 4800: + U0DLL = 90; + U0DLM = 0; + U0FDR = (1 << 4) + 4; + break; + + case 9600: + U0DLL = 23; + U0DLM = 0; + U0FDR = (8 << 4) + 9; + break; + + case 19200: + U0DLL = 11; + U0DLM = 0; + U0FDR = (9 << 4) + 11; + break; + + case 38400: + U0DLL = 5; + U0DLM = 0; + U0FDR = (9 << 4) + 13; + break; + + case 57600: + U0DLL = 6; + U0DLM = 0; + U0FDR = (14 << 4) + 5; + break; + + case 115200: + U0DLL = 3; + U0DLM = 0; + U0FDR = (14 << 4) + 5; + break; + } + U0LCR = 0x03; + + serial_flush_output(); + serial_flush_input(); +} + + +/* + * Initialise the serial port with the given baudrate. The settings + * are always 8 data bits, no parity, 1 stop bit, no start bits. + * + */ +int serial_init (void) +{ +// PINSEL0=0x05; // pin select -> tx, rx + serial_setbrg (115200); +// serial_setbrg (57600); + U0FCR = 0x07; // enable fifo + return (0); +} + + +/* + * Output a single byte to the serial port. + */ +void serial_putc (const char c) +{ + /* wait for room in the transmit FIFO */ + while(TX_READY(U0LSR)==0); + + PUT_CHAR(U0THR,c); +} + +/* + * Read a single byte from the serial port. Returns 1 on success, 0 + * otherwise. When the function is succesfull, the character read is + * written into its argument c. + */ +int serial_tstc (void) +{ + return (RX_DATA(U0LSR)); +} + +/* + * Read a single byte from the serial port. Returns 1 on success, 0 + * otherwise. When the function is succesfull, the character read is + * written into its argument c. + */ +int serial_getc (void) +{ + int rv; + + for(;;) { + rv = serial_tstc(); + + if(rv > 0) + return (GET_CHAR(U0RBR)); + } +} + +void +serial_puts (const char *s) +{ + while (*s != 0) { + serial_putc (*s++); + } +} + +const char hval[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; + +void putHexC(const unsigned char v) +{ + serial_putc(hval[v>>4]); + serial_putc(hval[v & 0x0F]); +} + +void putHexS(const unsigned short v) +{ + putHexC(v >> 8); + putHexC(v & 0xFF); +} + +void putHexW(const unsigned long v) +{ + putHexS(v >> 16); + putHexS(v & 0xFFFF); +} diff --git a/boop/branches/ram_version/telekatz_soundtest/serial.h b/boop/branches/ram_version/telekatz_soundtest/serial.h new file mode 100644 index 0000000..95739b6 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/serial.h @@ -0,0 +1,42 @@ +/* + serial.h - serial port functions + Copyright (C) 2007 Ch. Klippel + + 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 3 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 BOOP_SERIAL_H +#define BOOP_SERIAL_H + +#define USRRxData (1 << 0) +#define USRTxHoldEmpty (1 << 6) +#define GET_CHAR(p) p +#define PUT_CHAR(p,c) (p= (unsigned )(c)) +#define TX_READY(s) ((s) & USRTxHoldEmpty) +#define RX_DATA(s) ((s) & USRRxData) + +int serial_flush_input(void); +int serial_flush_output(void); +void serial_setbrg (unsigned int baudrate); +int serial_init (void); +void serial_putc (const char c); +int serial_tstc (void); +int serial_getc (void); +void serial_puts (const char *s); + +void putHexC(const unsigned char v); +void putHexS(const unsigned short v); +void putHexW(const unsigned long v); + +#endif /* BOOP_SERIAL_H */ diff --git a/boop/branches/ram_version/telekatz_soundtest/sirc_codes.h b/boop/branches/ram_version/telekatz_soundtest/sirc_codes.h new file mode 100644 index 0000000..83b1bac --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/sirc_codes.h @@ -0,0 +1,7 @@ +#ifndef SIRC_CODES_H +#define SIRC_CODES_H + +#include "./ir-codes/sirc/rm-pp411" +#include "./ir-codes/sirc/tv" + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/sound3.h b/boop/branches/ram_version/telekatz_soundtest/sound3.h new file mode 100644 index 0000000..01655d7 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/sound3.h @@ -0,0 +1,1571 @@ +#define sound3_len 25060 +const unsigned char sound3_data[] = { +0x80,0x80,0x80,0x80, +0x7F,0x7F,0x80,0x80,0x80,0x81,0x81,0x81,0x81,0x81,0x80,0x80,0x80,0x80,0x80,0x80, +0x7F,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x81, +0x81,0x82,0x82,0x81,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x81,0x81,0x81,0x81,0x80, +0x80,0x80,0x81,0x81,0x81,0x81,0x82,0x82,0x82,0x81,0x81,0x81,0x81,0x81,0x81,0x80, +0x80,0x80,0x80,0x80,0x81,0x81,0x82,0x81,0x81,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7F, +0x7F,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x7F,0x7F,0x7F,0x80,0x81,0x81, +0x81,0x81,0x80,0x7F,0x7F,0x7E,0x7E,0x7F,0x80,0x80,0x81,0x81,0x81,0x81,0x81,0x81, +0x81,0x81,0x81,0x81,0x80,0x80,0x81,0x82,0x83,0x83,0x83,0x83,0x82,0x81,0x81,0x80, +0x80,0x80,0x81,0x82,0x82,0x83,0x82,0x82,0x81,0x80,0x80,0x80,0x7F,0x7F,0x7F,0x7F, +0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x80,0x7F,0x7F,0x7F,0x80,0x80,0x81,0x81,0x81,0x81, +0x81,0x80,0x80,0x7F,0x7E,0x7E,0x7E,0x7E,0x7F,0x7F,0x7F,0x7F,0x7C,0x77,0x71,0x67, +0x5F,0x58,0x55,0x55,0x58,0x5B,0x5D,0x5D,0x5B,0x58,0x54,0x4D,0x42,0x38,0x3F,0x56, +0x6D,0x81,0x94,0xA6,0xB7,0xC1,0xC8,0xD0,0xDA,0xE3,0xE8,0xEA,0xE6,0xDE,0xD3,0xC5, +0xB7,0xAA,0x9F,0x9A,0x99,0x97,0x95,0x96,0x96,0x95,0x92,0x8F,0x8D,0x8E,0x8E,0x90, +0x8F,0x87,0x80,0x79,0x70,0x68,0x62,0x65,0x6B,0x6F,0x73,0x76,0x76,0x77,0x7B,0x7D, +0x77,0x72,0x6C,0x68,0x6B,0x72,0x7F,0x8A,0x8E,0x8C,0x83,0x6E,0x59,0x48,0x38,0x30, +0x2C,0x2B,0x2E,0x39,0x47,0x4E,0x54,0x5C,0x60,0x5E,0x58,0x56,0x5A,0x67,0x78,0x8D, +0xA2,0xB6,0xC1,0xC3,0xC0,0xBB,0xB2,0xAA,0xA1,0x93,0x89,0x85,0x83,0x80,0x81,0x84, +0x82,0x7D,0x72,0x63,0x55,0x48,0x40,0x3F,0x48,0x55,0x63,0x76,0x89,0x95,0x91,0x90, +0x89,0x83,0x7E,0x7B,0x7A,0x75,0x70,0x67,0x6D,0x75,0x7F,0x93,0xAB,0xB9,0xB6,0xAE, +0x9B,0x90,0x7B,0x6B,0x66,0x5F,0x5E,0x6A,0x76,0x7D,0x7F,0x82,0x85,0x7D,0x78,0x77, +0x82,0x89,0x99,0xAB,0xC3,0xC5,0xB3,0xA6,0xA0,0x93,0x85,0x8C,0x97,0x9F,0x9B,0x8A, +0x71,0x5C,0x53,0x57,0x62,0x77,0x88,0x9A,0xA6,0xAC,0xB0,0xB5,0xC5,0xD1,0xD6,0xCF, +0xCE,0xCE,0xC4,0xAE,0x97,0x81,0x71,0x65,0x5F,0x5D,0x5C,0x57,0x43,0x35,0x2C,0x27, +0x29,0x32,0x45,0x59,0x6B,0x76,0x75,0x74,0x78,0x7D,0x7D,0x77,0x71,0x73,0x78,0x70, +0x6A,0x63,0x55,0x4F,0x51,0x5B,0x57,0x54,0x60,0x6F,0x7A,0x8C,0xAB,0xCB,0xE5,0xEE, +0xD6,0xAD,0x84,0x6D,0x6F,0x7B,0x86,0x82,0x78,0x6C,0x5C,0x50,0x4E,0x53,0x59,0x6D, +0x74,0x7F,0x89,0x85,0x90,0x9F,0xB9,0xCA,0xCF,0xD3,0xD8,0xE1,0xE1,0xD2,0xB0,0x86, +0x6B,0x74,0x86,0x88,0x84,0x86,0x88,0x85,0x8C,0x98,0x97,0x95,0x93,0x92,0x8E,0x86, +0x87,0x8C,0x8D,0x8B,0x7E,0x6A,0x53,0x40,0x3C,0x3D,0x3C,0x48,0x5E,0x6F,0x7B,0x88, +0x8F,0x88,0x81,0x82,0x7D,0x72,0x6C,0x68,0x64,0x5B,0x56,0x5B,0x62,0x6A,0x6A,0x6F, +0x73,0x73,0x70,0x69,0x5F,0x5F,0x5C,0x54,0x57,0x5F,0x6B,0x77,0x86,0xA3,0xC9,0xDD, +0xD5,0xC9,0xC1,0xBA,0xB7,0xB6,0xB3,0xAA,0xA0,0x96,0x94,0x93,0x90,0x8A,0x87,0x7D, +0x71,0x67,0x5B,0x55,0x55,0x59,0x5B,0x5B,0x59,0x5F,0x79,0x8F,0x9B,0x9B,0x8F,0x86, +0x7E,0x7E,0x84,0x84,0x74,0x6B,0x6C,0x67,0x5D,0x54,0x51,0x5E,0x6E,0x6C,0x63,0x60, +0x67,0x73,0x7F,0x79,0x64,0x58,0x62,0x77,0x78,0x6B,0x63,0x5E,0x5C,0x5E,0x57,0x4F, +0x55,0x60,0x65,0x69,0x65,0x5D,0x60,0x6B,0x73,0x71,0x76,0x7F,0x8C,0x95,0x96,0x93, +0xA3,0xBE,0xC5,0xC4,0xCA,0xD6,0xD5,0xBC,0xAA,0x9F,0x97,0x9A,0xA4,0xA5,0xA6,0xAB, +0xAC,0xB1,0xB5,0xAC,0x9E,0x91,0x86,0x7E,0x83,0x8D,0x99,0xA7,0xAA,0xA4,0xA2,0x9E, +0x9D,0x9A,0x91,0x89,0x85,0x7B,0x73,0x79,0x83,0x81,0x72,0x68,0x62,0x5A,0x52,0x5A, +0x6E,0x86,0x98,0xA0,0xA3,0x9F,0x95,0x87,0x79,0x73,0x6D,0x68,0x66,0x68,0x69,0x6A, +0x6A,0x6D,0x6E,0x6C,0x6E,0x69,0x5F,0x59,0x5C,0x62,0x67,0x6B,0x6C,0x6C,0x6F,0x79, +0x80,0x7C,0x73,0x6D,0x68,0x68,0x6A,0x76,0x8C,0xA5,0xB6,0xBD,0xBD,0xB3,0xAB,0xAB, +0xAE,0xAF,0xB2,0xB3,0xA4,0x97,0x8D,0x81,0x76,0x69,0x62,0x63,0x60,0x58,0x4B,0x3B, +0x31,0x37,0x45,0x4E,0x56,0x5F,0x72,0x86,0x90,0x95,0x90,0x84,0x89,0x93,0x9B,0xA1, +0xA3,0xAA,0xA7,0xA0,0x96,0x96,0x97,0x91,0x96,0x99,0x99,0x95,0x8F,0x8C,0x89,0x8E, +0x94,0x8B,0x79,0x64,0x4B,0x37,0x2F,0x33,0x40,0x50,0x5E,0x69,0x63,0x57,0x53,0x50, +0x46,0x41,0x46,0x56,0x68,0x77,0x85,0x8F,0x92,0x9A,0xA2,0xA8,0xAC,0xB0,0xB1,0xB0, +0xB1,0xB7,0xB5,0xB0,0xAC,0xA5,0xA7,0xA8,0x9F,0x93,0x8A,0x87,0x8B,0x8A,0x85,0x7B, +0x6E,0x61,0x56,0x52,0x59,0x62,0x65,0x6B,0x77,0x81,0x7F,0x75,0x75,0x7E,0x86,0x8B, +0x8E,0x96,0x9E,0x9B,0x94,0x8F,0x89,0x92,0xA3,0xAE,0xB3,0xAD,0xA1,0x94,0x87,0x7B, +0x74,0x70,0x6C,0x69,0x61,0x55,0x48,0x47,0x52,0x63,0x71,0x73,0x75,0x77,0x7E,0x84, +0x7A,0x6E,0x70,0x77,0x7E,0x7C,0x79,0x7C,0x7C,0x79,0x75,0x70,0x71,0x76,0x7E,0x81, +0x84,0x85,0x7D,0x73,0x6F,0x75,0x81,0x84,0x88,0x88,0x7E,0x68,0x50,0x4F,0x60,0x72, +0x7D,0x84,0x80,0x6F,0x59,0x49,0x44,0x46,0x57,0x74,0x8B,0x91,0x8B,0x8A,0x8C,0x8B, +0x86,0x83,0x84,0x84,0x89,0x90,0x98,0xAA,0xBF,0xC9,0xCB,0xD1,0xCE,0xBD,0xAF,0xAC, +0xA8,0x9C,0x91,0x8A,0x88,0x8E,0x91,0x91,0x96,0xA2,0xAF,0xB3,0xAE,0x9D,0x86,0x73, +0x6C,0x6D,0x74,0x7F,0x7E,0x78,0x7E,0x89,0x8C,0x85,0x84,0x89,0x8B,0x8C,0x8A,0x81, +0x7D,0x85,0x8F,0x8E,0x87,0x8A,0x99,0xA7,0xAF,0xA9,0xA0,0x93,0x87,0x7D,0x76,0x76, +0x79,0x7E,0x7D,0x73,0x6B,0x67,0x6C,0x75,0x76,0x78,0x7A,0x7D,0x81,0x78,0x6B,0x66, +0x65,0x63,0x66,0x6B,0x6A,0x61,0x56,0x51,0x54,0x5F,0x69,0x75,0x82,0x8B,0x90,0x8C, +0x85,0x80,0x85,0x8C,0x8D,0x88,0x7B,0x67,0x57,0x4A,0x44,0x49,0x52,0x5A,0x65,0x6F, +0x70,0x71,0x6D,0x63,0x52,0x4A,0x45,0x42,0x49,0x55,0x66,0x75,0x7C,0x7D,0x78,0x73, +0x72,0x75,0x72,0x65,0x5F,0x64,0x71,0x7F,0x89,0x96,0xA6,0xB3,0xB4,0xB0,0xA9,0xA3, +0x9A,0x96,0x9A,0xA0,0xAB,0xB7,0xC0,0xC0,0xB9,0xA6,0x8E,0x7C,0x7A,0x7E,0x7C,0x79, +0x7A,0x79,0x75,0x71,0x78,0x83,0x87,0x86,0x7B,0x6B,0x67,0x6B,0x7A,0x91,0xA2,0xA7, +0xA9,0xAD,0xB0,0xB0,0xAE,0xA4,0x92,0x85,0x80,0x7F,0x7D,0x78,0x73,0x7F,0x98,0xA7, +0xA1,0x91,0x86,0x81,0x7B,0x6F,0x62,0x57,0x55,0x56,0x55,0x51,0x58,0x68,0x78,0x80, +0x80,0x7D,0x7B,0x80,0x89,0x92,0x8F,0x83,0x77,0x6F,0x6A,0x67,0x67,0x6C,0x6F,0x72, +0x73,0x73,0x78,0x80,0x82,0x7F,0x7A,0x7A,0x7F,0x86,0x92,0xA8,0xBD,0xC7,0xC7,0xC5, +0xC6,0xCB,0xC8,0xB8,0xA1,0x85,0x72,0x6C,0x6B,0x68,0x66,0x74,0x8E,0x9F,0xA5,0x9D, +0x88,0x6E,0x57,0x4E,0x51,0x5B,0x65,0x71,0x7B,0x80,0x76,0x65,0x5D,0x5D,0x61,0x5D, +0x52,0x4C,0x46,0x3C,0x3C,0x44,0x52,0x67,0x80,0x8F,0x90,0x87,0x80,0x7D,0x7A,0x7C, +0x81,0x83,0x7D,0x72,0x67,0x64,0x69,0x73,0x82,0x91,0xA1,0xAA,0xA4,0x91,0x7D,0x70, +0x69,0x6C,0x73,0x79,0x87,0x98,0xA6,0xB0,0xBB,0xD0,0xDE,0xDC,0xD8,0xD8,0xD1,0xBE, +0xA9,0x9E,0xA3,0xAE,0xAE,0xA2,0x8E,0x7B,0x74,0x78,0x7D,0x80,0x85,0x8A,0x8B,0x87, +0x7F,0x7E,0x83,0x87,0x83,0x76,0x6A,0x65,0x67,0x73,0x86,0x96,0x9F,0x9B,0x8C,0x7F, +0x75,0x6C,0x64,0x59,0x50,0x51,0x5A,0x64,0x68,0x66,0x68,0x74,0x84,0x8C,0x88,0x86, +0x86,0x7D,0x6D,0x64,0x5A,0x46,0x33,0x31,0x3B,0x41,0x3F,0x3A,0x3C,0x43,0x4F,0x5B, +0x61,0x61,0x69,0x74,0x78,0x7A,0x7A,0x7C,0x7F,0x7E,0x7E,0x83,0x8B,0x94,0x9B,0x9D, +0x92,0x88,0x89,0x89,0x80,0x76,0x74,0x7A,0x7E,0x80,0x83,0x88,0x8B,0x8F,0x98,0xA3, +0xAC,0xB0,0xA9,0x9D,0x97,0x99,0x96,0x8A,0x7A,0x78,0x7D,0x7D,0x77,0x73,0x7F,0x94, +0xA8,0xB1,0xAE,0xA9,0xA6,0x9D,0x8B,0x7D,0x72,0x6F,0x75,0x80,0x8B,0x90,0x90,0x84, +0x72,0x6B,0x74,0x79,0x76,0x7B,0x7D,0x72,0x6C,0x74,0x81,0x8A,0x8C,0x84,0x71,0x5F, +0x56,0x58,0x5C,0x59,0x51,0x4D,0x51,0x5F,0x6A,0x6B,0x73,0x86,0x93,0x98,0x98,0x96, +0x90,0x89,0x8B,0x9B,0xAC,0xB3,0xB5,0xB6,0xB9,0xB6,0xAE,0xA5,0x9F,0x9C,0xA0,0xA9, +0xAB,0xA4,0x9A,0x97,0x97,0x96,0x93,0x8F,0x88,0x7A,0x6D,0x65,0x68,0x74,0x7B,0x7D, +0x7A,0x76,0x78,0x83,0x92,0x9A,0x97,0x90,0x8B,0x8F,0x92,0x89,0x7D,0x79,0x77,0x6F, +0x65,0x5D,0x5E,0x6C,0x80,0x88,0x85,0x83,0x82,0x81,0x7C,0x77,0x74,0x77,0x7C,0x7F, +0x81,0x82,0x83,0x7C,0x6B,0x5B,0x56,0x5C,0x5F,0x5C,0x57,0x54,0x53,0x50,0x51,0x5D, +0x71,0x7D,0x83,0x87,0x86,0x84,0x85,0x8C,0x9B,0xA7,0xA2,0x92,0x88,0x88,0x8C,0x96, +0xA1,0xA3,0x98,0x89,0x7F,0x78,0x70,0x6C,0x72,0x7B,0x7A,0x73,0x6E,0x6E,0x74,0x78, +0x7A,0x7D,0x81,0x81,0x74,0x63,0x59,0x5B,0x65,0x6D,0x72,0x75,0x77,0x7A,0x81,0x83, +0x86,0x8C,0x84,0x76,0x6D,0x70,0x7C,0x88,0x8A,0x86,0x87,0x8D,0x8A,0x8A,0x96,0xA0, +0x98,0x8A,0x88,0x94,0x9F,0x9F,0x99,0x8E,0x84,0x81,0x7C,0x7B,0x80,0x82,0x7F,0x7A, +0x75,0x72,0x77,0x84,0x92,0x9B,0x9C,0x93,0x85,0x7A,0x78,0x84,0x94,0x9C,0x9A,0x8E, +0x84,0x87,0x8C,0x87,0x76,0x62,0x4E,0x41,0x43,0x56,0x6D,0x75,0x73,0x6F,0x76,0x84, +0x8C,0x8C,0x8B,0x87,0x81,0x7B,0x79,0x7E,0x7F,0x7B,0x74,0x74,0x7E,0x8B,0x92,0x93, +0x83,0x6F,0x67,0x65,0x61,0x5C,0x5A,0x5C,0x62,0x68,0x6B,0x6F,0x6D,0x63,0x5F,0x68, +0x74,0x7B,0x7D,0x7C,0x87,0x9C,0xAA,0xAA,0x9F,0x99,0xA3,0xA8,0xA5,0xA5,0xA3,0xA0, +0xA0,0x9E,0x9F,0xA7,0xA9,0xA4,0x9A,0x90,0x8D,0x8E,0x8A,0x85,0x81,0x7D,0x7A,0x76, +0x76,0x7C,0x86,0x8C,0x89,0x85,0x7E,0x76,0x70,0x6B,0x6B,0x71,0x74,0x6E,0x66,0x69, +0x79,0x8D,0x9B,0xA1,0x9D,0x96,0x93,0x92,0x8F,0x8E,0x8E,0x8C,0x86,0x81,0x83,0x85, +0x80,0x7B,0x7E,0x82,0x80,0x7F,0x81,0x81,0x7C,0x7D,0x7E,0x79,0x7A,0x7B,0x74,0x6D, +0x6B,0x73,0x80,0x92,0x9A,0x90,0x89,0x89,0x85,0x79,0x67,0x5B,0x63,0x75,0x7F,0x7B, +0x72,0x6E,0x76,0x80,0x88,0x8C,0x91,0x97,0x97,0x97,0x99,0x93,0x83,0x74,0x71,0x70, +0x6D,0x66,0x62,0x64,0x70,0x84,0x98,0xA2,0xA0,0x9C,0x97,0x91,0x8B,0x84,0x7E,0x7A, +0x72,0x67,0x65,0x76,0x8B,0x8F,0x87,0x82,0x86,0x8B,0x86,0x75,0x66,0x6A,0x75,0x7D, +0x83,0x85,0x85,0x89,0x90,0x90,0x85,0x74,0x62,0x50,0x42,0x46,0x5D,0x6D,0x6E,0x72, +0x81,0x8F,0x91,0x8B,0x84,0x7E,0x76,0x7A,0x8A,0x92,0x8C,0x87,0x8B,0x8F,0x8B,0x80, +0x75,0x6D,0x61,0x54,0x4D,0x53,0x5C,0x5D,0x55,0x46,0x40,0x4B,0x5B,0x67,0x6E,0x70, +0x6F,0x72,0x7C,0x85,0x81,0x75,0x70,0x77,0x86,0x91,0x93,0x96,0x9A,0x9D,0xA4,0xAE, +0xB8,0xB3,0xA2,0x94,0x8C,0x82,0x7C,0x81,0x8E,0x9A,0x9B,0x9B,0xA6,0xB0,0xAE,0x9E, +0x8D,0x85,0x7D,0x71,0x76,0x8E,0xA1,0xA5,0x9F,0x99,0x91,0x86,0x86,0x89,0x88,0x77, +0x64,0x61,0x6D,0x7C,0x87,0x8D,0x8A,0x80,0x76,0x70,0x74,0x83,0x8D,0x89,0x7E,0x7C, +0x79,0x73,0x75,0x7F,0x7D,0x6C,0x5C,0x63,0x79,0x81,0x7E,0x7B,0x73,0x6E,0x69,0x60, +0x60,0x6A,0x70,0x77,0x84,0x94,0x9C,0x95,0x8C,0x87,0x85,0x8D,0x91,0x8F,0x8E,0x8C, +0x8D,0x93,0x9F,0xAC,0xB1,0xA5,0x91,0x87,0x88,0x89,0x87,0x82,0x7B,0x7B,0x80,0x85, +0x92,0xA7,0xB1,0xAF,0xAB,0xA5,0xA0,0x99,0x88,0x72,0x60,0x52,0x52,0x64,0x7B,0x8B, +0x97,0x9D,0x97,0x82,0x6E,0x6A,0x73,0x74,0x69,0x62,0x65,0x68,0x63,0x62,0x6E,0x82, +0x95,0x90,0x7E,0x78,0x80,0x80,0x6D,0x5F,0x65,0x77,0x83,0x84,0x8B,0x95,0x98,0x9E, +0xA6,0x9F,0x90,0x8E,0x89,0x75,0x61,0x55,0x53,0x56,0x5B,0x63,0x6D,0x7B,0x7E,0x73, +0x66,0x5D,0x58,0x55,0x55,0x56,0x50,0x4D,0x5E,0x7B,0x96,0xA8,0xA8,0x99,0x88,0x7B, +0x79,0x84,0x8A,0x8C,0x94,0x9B,0x93,0x86,0x85,0x8A,0x93,0x95,0x85,0x73,0x6B,0x66, +0x64,0x69,0x69,0x6A,0x71,0x71,0x73,0x7E,0x8D,0x98,0x94,0x8A,0x8E,0x9A,0x9C,0x94, +0x90,0x8C,0x87,0x82,0x7C,0x77,0x79,0x85,0x99,0xA2,0x97,0x8A,0x83,0x82,0x89,0x89, +0x81,0x84,0x90,0x8E,0x82,0x7F,0x81,0x78,0x68,0x5E,0x5F,0x5D,0x5A,0x5E,0x5C,0x56, +0x51,0x56,0x62,0x74,0x83,0x85,0x87,0x8B,0x8C,0x8E,0x94,0x95,0x8C,0x88,0x94,0xAC, +0xBC,0xBC,0xBC,0xBE,0xB5,0xAB,0x9F,0x91,0x84,0x7B,0x70,0x6F,0x78,0x7E,0x79,0x78, +0x78,0x69,0x59,0x51,0x45,0x3A,0x33,0x31,0x36,0x3E,0x47,0x53,0x62,0x69,0x68,0x67, +0x6F,0x7E,0x88,0x8E,0x92,0x9A,0xA9,0xB9,0xBE,0xBF,0xC1,0xBF,0xBB,0xB0,0xA1,0x9A, +0x9E,0xA5,0xA8,0xA9,0xA4,0x99,0x8B,0x7F,0x78,0x6A,0x5F,0x60,0x61,0x62,0x6A,0x6E, +0x6D,0x70,0x76,0x7C,0x81,0x91,0x9D,0x9A,0x92,0x86,0x80,0x82,0x87,0x8A,0x94,0xA4, +0xAD,0xAD,0xA7,0xA7,0xAF,0xAC,0xA4,0x97,0x82,0x7F,0x8C,0x98,0xA3,0xA2,0x8D,0x7A, +0x75,0x70,0x66,0x60,0x63,0x65,0x64,0x61,0x63,0x65,0x63,0x5E,0x58,0x58,0x5A,0x56, +0x58,0x67,0x78,0x81,0x7D,0x7F,0x8B,0x91,0x8B,0x83,0x83,0x84,0x82,0x85,0x8E,0x91, +0x8A,0x85,0x7B,0x6B,0x6F,0x81,0x95,0xA5,0xA8,0x9B,0x93,0x97,0x96,0x8F,0x91,0x97, +0x8F,0x75,0x5A,0x58,0x65,0x71,0x79,0x80,0x82,0x7D,0x78,0x75,0x70,0x69,0x62,0x61, +0x64,0x62,0x64,0x6F,0x80,0x8F,0x9D,0xAD,0xB5,0xAE,0x98,0x7D,0x73,0x72,0x70,0x6C, +0x69,0x6C,0x6F,0x6E,0x6C,0x6B,0x68,0x69,0x69,0x64,0x5B,0x4E,0x46,0x47,0x54,0x63, +0x6D,0x6F,0x71,0x72,0x70,0x74,0x77,0x75,0x71,0x68,0x65,0x73,0x89,0x96,0x9B,0xA0, +0xA8,0xA8,0xA8,0xAA,0xA9,0xA2,0x99,0x90,0x8D,0x8D,0x8E,0x8E,0x90,0x89,0x7D,0x75, +0x6C,0x6F,0x7B,0x7B,0x73,0x73,0x77,0x7B,0x78,0x6F,0x6A,0x6A,0x67,0x6D,0x7B,0x7A, +0x7B,0x84,0x89,0x86,0x80,0x85,0x8B,0x87,0x83,0x7F,0x7C,0x87,0x96,0xA8,0xBF,0xC7, +0xBD,0xBD,0xCB,0xC6,0xAE,0x93,0x82,0x78,0x73,0x75,0x7D,0x86,0x82,0x70,0x5D,0x60, +0x73,0x81,0x85,0x82,0x73,0x66,0x6C,0x7F,0x8D,0x8C,0x82,0x76,0x69,0x60,0x5E,0x5E, +0x60,0x63,0x69,0x77,0x83,0x87,0x95,0x9D,0x9C,0xA3,0xA5,0x9A,0x93,0x99,0x9D,0x9E, +0x9E,0x9E,0x9D,0x95,0x8A,0x7A,0x72,0x77,0x7B,0x84,0x95,0x92,0x83,0x81,0x87,0x8B, +0x88,0x7E,0x74,0x69,0x5B,0x5D,0x6A,0x6E,0x6C,0x69,0x69,0x6C,0x6F,0x72,0x6E,0x64, +0x66,0x73,0x89,0xA0,0xAF,0xB9,0xC1,0xB4,0x9D,0x95,0x96,0x8B,0x84,0x83,0x73,0x59, +0x54,0x6E,0x8D,0x9C,0x95,0x7D,0x69,0x69,0x73,0x6A,0x5F,0x6A,0x79,0x7F,0x7B,0x7B, +0x7F,0x87,0x88,0x83,0x7C,0x74,0x6D,0x71,0x78,0x7B,0x78,0x7D,0x89,0x8F,0x8A,0x7A, +0x70,0x6B,0x6A,0x73,0x7A,0x7A,0x81,0x8D,0x8F,0x91,0x94,0x90,0x88,0x7D,0x73,0x72, +0x74,0x7A,0x82,0x81,0x82,0x89,0x89,0x80,0x79,0x71,0x6D,0x74,0x84,0x8D,0x85,0x74, +0x6C,0x68,0x65,0x63,0x5D,0x5B,0x64,0x66,0x5F,0x67,0x78,0x8A,0x9A,0xA2,0x9E,0x92, +0x8B,0x8E,0x96,0x99,0xA0,0xAE,0xB0,0xA5,0x91,0x84,0x77,0x67,0x5F,0x60,0x5F,0x58, +0x4A,0x41,0x4B,0x55,0x65,0x7B,0x7E,0x7E,0x84,0x8B,0x89,0x82,0x7C,0x78,0x79,0x7D, +0x80,0x86,0x89,0x8C,0x90,0x8D,0x89,0x8E,0x95,0x92,0x8B,0x86,0x8B,0x96,0x99,0x97, +0x93,0x93,0x9A,0xA3,0x9E,0x87,0x73,0x67,0x6A,0x6B,0x66,0x64,0x65,0x6B,0x74,0x7A, +0x78,0x72,0x6B,0x68,0x6E,0x75,0x72,0x69,0x6C,0x7D,0x83,0x79,0x6D,0x72,0x7F,0x85, +0x8E,0x9A,0xA6,0xAF,0xAE,0xA8,0xA1,0x97,0x91,0x9A,0xA5,0xA3,0x9E,0x9D,0x9B,0x96, +0x8D,0x87,0x8C,0x8F,0x7E,0x6C,0x6E,0x74,0x81,0x94,0x9D,0x93,0x83,0x7E,0x86,0x8D, +0x86,0x7A,0x73,0x6F,0x69,0x65,0x63,0x62,0x64,0x67,0x67,0x6D,0x79,0x7D,0x7B,0x81, +0x8D,0x96,0x9B,0xA1,0xA2,0xA0,0x9F,0xA7,0xB0,0xAF,0xA8,0x9D,0x95,0x8F,0x8D,0x8B, +0x8A,0x8F,0x92,0x83,0x6F,0x6B,0x73,0x77,0x77,0x71,0x65,0x57,0x4F,0x54,0x5B,0x5E, +0x5F,0x5A,0x59,0x62,0x6E,0x7A,0x7F,0x83,0x86,0x83,0x82,0x7A,0x6D,0x6D,0x7A,0x8F, +0xA5,0xB6,0xAF,0x97,0x8D,0x93,0x9B,0xA6,0x9E,0x88,0x7E,0x79,0x70,0x68,0x66,0x70, +0x84,0x99,0xA1,0x9A,0x90,0x87,0x7A,0x69,0x56,0x43,0x34,0x31,0x3C,0x4F,0x64,0x76, +0x7E,0x82,0x86,0x87,0x85,0x81,0x78,0x74,0x80,0x91,0x95,0x9A,0xA5,0xA1,0x92,0x87, +0x8C,0x94,0x8D,0x89,0x8B,0x88,0x84,0x7D,0x71,0x6A,0x5D,0x58,0x60,0x67,0x6D,0x73, +0x79,0x81,0x82,0x7C,0x71,0x6A,0x67,0x64,0x62,0x67,0x74,0x84,0x8F,0x96,0xA0,0xA9, +0xAF,0xB1,0xB4,0xB1,0x9D,0x8D,0x88,0x8A,0x8E,0x91,0x98,0xA2,0x9F,0x92,0x86,0x72, +0x60,0x56,0x48,0x3E,0x3C,0x3A,0x3B,0x3E,0x47,0x55,0x61,0x6D,0x74,0x7A,0x79,0x73, +0x78,0x83,0x80,0x6C,0x66,0x76,0x8C,0x9A,0xA6,0xB1,0xB4,0xB3,0xAA,0x9B,0x91,0x8D, +0x90,0x91,0x95,0xA0,0xAA,0xB7,0xBC,0xB5,0xA5,0x8D,0x72,0x61,0x62,0x64,0x61,0x63, +0x69,0x6C,0x6D,0x6D,0x73,0x74,0x6B,0x64,0x5E,0x57,0x5C,0x6B,0x79,0x86,0x92,0x9D, +0x99,0x92,0x9A,0xA5,0xAF,0xAB,0xA4,0xA5,0x9D,0x8E,0x88,0x92,0xA0,0x98,0x86,0x89, +0x95,0xA3,0xB4,0xB7,0xAA,0x9D,0x90,0x83,0x7C,0x74,0x64,0x54,0x5D,0x69,0x61,0x51, +0x4F,0x54,0x55,0x57,0x60,0x62,0x5E,0x63,0x6D,0x74,0x7A,0x7F,0x83,0x8B,0x9D,0xB2, +0xBD,0xBE,0xB9,0xB3,0xAA,0x9B,0x8F,0x8E,0x98,0x92,0x85,0x87,0x93,0xAA,0xB5,0xB8, +0xB5,0x9E,0x7F,0x70,0x6F,0x68,0x57,0x4A,0x4E,0x59,0x61,0x6C,0x74,0x74,0x6F,0x62, +0x5E,0x61,0x5D,0x56,0x58,0x6C,0x87,0x8F,0x90,0x91,0x89,0x83,0x8D,0x90,0x86,0x83, +0x8D,0x9A,0x8C,0x6C,0x60,0x75,0x92,0x98,0x90,0x89,0x78,0x6C,0x72,0x78,0x76,0x72, +0x65,0x5A,0x57,0x58,0x5B,0x67,0x72,0x6D,0x61,0x63,0x6D,0x71,0x6B,0x65,0x6E,0x79, +0x76,0x73,0x7A,0x84,0x88,0x83,0x8A,0x9D,0xAB,0xA6,0x8C,0x7D,0x87,0x91,0x95,0xA0, +0xA9,0xA1,0x96,0x8D,0x8F,0xA0,0xAC,0xA3,0x8A,0x73,0x6F,0x74,0x70,0x5B,0x49,0x49, +0x60,0x79,0x84,0x7D,0x73,0x78,0x7B,0x81,0x87,0x78,0x66,0x67,0x6D,0x6D,0x71,0x7E, +0x86,0x8B,0x95,0xA5,0xAD,0xAF,0xA8,0x99,0x8D,0x83,0x80,0x83,0x7E,0x7C,0x7E,0x7B, +0x75,0x71,0x71,0x71,0x69,0x62,0x6B,0x76,0x79,0x72,0x6A,0x74,0x7B,0x79,0x7B,0x85, +0x99,0xA3,0xA0,0x99,0x8F,0x8C,0x8A,0x89,0x87,0x7D,0x78,0x7F,0x88,0x95,0x9E,0x9A, +0x91,0x91,0x95,0x99,0x91,0x82,0x86,0x82,0x76,0x76,0x81,0x8A,0x87,0x7B,0x7C,0x7B, +0x6B,0x65,0x6F,0x72,0x77,0x7F,0x6C,0x54,0x5C,0x78,0x81,0x76,0x76,0x79,0x71,0x6A, +0x6D,0x79,0x81,0x77,0x75,0x8C,0x9B,0x99,0x9D,0xA7,0xA8,0xA4,0xA0,0xA1,0x9E,0x8B, +0x6F,0x63,0x6C,0x74,0x77,0x72,0x66,0x67,0x6E,0x73,0x7A,0x80,0x81,0x75,0x71,0x85, +0x88,0x77,0x73,0x7E,0x82,0x82,0x83,0x7E,0x8C,0x9D,0x9A,0xA2,0xA6,0x9D,0x96,0x90, +0x8B,0x8B,0x92,0x91,0x8F,0x9C,0xA6,0xAA,0xAB,0xA8,0x9F,0x93,0x83,0x70,0x64,0x60, +0x65,0x74,0x81,0x80,0x7C,0x7D,0x7B,0x80,0x7C,0x78,0x82,0x89,0x80,0x6B,0x62,0x72, +0x7E,0x82,0x83,0x7B,0x6E,0x6E,0x77,0x83,0x8A,0x8E,0x87,0x79,0x7C,0x89,0x89,0x83, +0x79,0x6C,0x61,0x64,0x72,0x7E,0x8C,0x92,0x82,0x6A,0x5F,0x64,0x6C,0x70,0x64,0x57, +0x63,0x76,0x85,0x91,0x93,0x7F,0x70,0x75,0x78,0x7C,0x81,0x7D,0x7C,0x80,0x7F,0x90, +0xA3,0xA0,0x98,0x99,0x95,0x86,0x7F,0x77,0x69,0x5F,0x61,0x69,0x6F,0x72,0x75,0x7A, +0x7E,0x74,0x69,0x6A,0x6B,0x70,0x7E,0x82,0x73,0x6F,0x84,0x9D,0xAA,0xAD,0xAA,0xA0, +0x96,0x88,0x75,0x6C,0x6A,0x5D,0x5B,0x64,0x72,0x7D,0x7F,0x78,0x75,0x77,0x70,0x68, +0x6D,0x73,0x73,0x73,0x70,0x79,0x81,0x7F,0x7E,0x88,0x91,0x89,0x7C,0x87,0x91,0x82, +0x74,0x7D,0x8D,0x92,0x8B,0x94,0x9E,0x9D,0x9B,0x9B,0xAC,0xB0,0x90,0x7A,0x86,0x8B, +0x84,0x7C,0x65,0x54,0x57,0x62,0x70,0x7D,0x81,0x78,0x72,0x6C,0x6B,0x6E,0x71,0x75, +0x76,0x6C,0x69,0x72,0x7A,0x8C,0xA0,0xAF,0xAF,0x9A,0x8F,0x89,0x7F,0x7A,0x7F,0x84, +0x83,0x82,0x80,0x80,0x8C,0xA3,0xB9,0xC5,0xC2,0xAE,0xA3,0xA5,0x99,0x8C,0x8F,0x8B, +0x8C,0x98,0x97,0x8B,0x86,0x81,0x6D,0x68,0x6F,0x72,0x6E,0x62,0x60,0x6E,0x74,0x7B, +0x84,0x7E,0x7B,0x89,0x97,0x96,0x90,0x87,0x84,0x89,0x83,0x7B,0x7A,0x71,0x74,0x7E, +0x7F,0x86,0x90,0x9B,0x9D,0x8F,0x8B,0x8E,0x94,0x92,0x7F,0x72,0x72,0x75,0x6F,0x6B, +0x77,0x7B,0x64,0x57,0x62,0x60,0x57,0x52,0x53,0x60,0x5D,0x51,0x59,0x60,0x5D,0x70, +0x80,0x7C,0x72,0x74,0x6E,0x5D,0x64,0x6E,0x70,0x81,0x93,0x97,0x93,0x96,0xA1,0xA9, +0xAB,0xA5,0xAB,0xAF,0x9E,0x96,0x93,0x86,0x7E,0x82,0x87,0x84,0x7C,0x7F,0x80,0x81, +0x86,0x82,0x76,0x77,0x7E,0x7B,0x73,0x71,0x70,0x72,0x7A,0x7C,0x8B,0x9A,0x9B,0x92, +0x86,0x86,0x8C,0x8C,0x8B,0x8E,0x91,0x90,0x99,0xA0,0x92,0x7C,0x81,0x93,0x95,0x88, +0x7A,0x7A,0x7A,0x73,0x6A,0x66,0x68,0x6C,0x72,0x6C,0x67,0x6B,0x71,0x86,0x98,0x87, +0x6B,0x6F,0x85,0x8C,0x87,0x76,0x66,0x6D,0x6D,0x6A,0x7A,0x82,0x7D,0x79,0x74,0x6C, +0x69,0x69,0x6D,0x75,0x7D,0x7B,0x78,0x82,0x86,0x7F,0x80,0x8A,0x86,0x7B,0x7F,0x84, +0x7A,0x72,0x72,0x73,0x71,0x6E,0x62,0x51,0x4E,0x54,0x66,0x75,0x72,0x6E,0x70,0x6D, +0x77,0x8F,0x92,0x8A,0x9A,0xA8,0xA3,0xAB,0xB7,0xB6,0xAC,0xA1,0x99,0x9D,0xA8,0xA2, +0x8E,0x84,0x87,0x89,0x7F,0x72,0x62,0x5F,0x71,0x81,0x7F,0x7A,0x7B,0x7D,0x81,0x82, +0x89,0x93,0x9C,0x9A,0x89,0x7B,0x7F,0x89,0x90,0x85,0x75,0x7F,0x8A,0x8E,0x87,0x85, +0x8E,0x84,0x76,0x78,0x81,0x87,0x85,0x88,0x86,0x75,0x67,0x63,0x71,0x83,0x85,0x82, +0x8D,0x8F,0x82,0x85,0x8A,0x7B,0x6E,0x70,0x78,0x7D,0x75,0x67,0x6C,0x7A,0x89,0x95, +0x87,0x6F,0x65,0x6F,0x80,0x8F,0x8D,0x84,0x84,0x88,0x8D,0x91,0x93,0x98,0xA0,0xA8, +0xAA,0x9F,0x97,0x8E,0x78,0x72,0x7D,0x78,0x75,0x7D,0x85,0x7F,0x7D,0x8A,0x7E,0x6E, +0x7A,0x87,0x88,0x82,0x7E,0x85,0x8E,0x90,0x8D,0x91,0x99,0xA1,0xA0,0x96,0x9A,0x99, +0x8E,0x7F,0x76,0x77,0x6C,0x67,0x6F,0x77,0x7D,0x7B,0x74,0x78,0x70,0x66,0x6E,0x7D, +0x85,0x7A,0x67,0x67,0x79,0x86,0x88,0x85,0x80,0x7F,0x75,0x6C,0x6F,0x73,0x79,0x76, +0x67,0x67,0x73,0x7A,0x69,0x58,0x65,0x75,0x7E,0x8B,0x86,0x7C,0x82,0x86,0x83,0x7C, +0x7B,0x7B,0x7D,0x81,0x7F,0x6D,0x5A,0x5D,0x63,0x62,0x60,0x60,0x5B,0x5F,0x74,0x87, +0x9B,0x99,0x86,0x8C,0xAD,0xB1,0x9F,0x97,0x8B,0x80,0x85,0x8A,0x89,0x7F,0x7D,0x7E, +0x79,0x7B,0x71,0x5C,0x62,0x73,0x71,0x69,0x76,0x89,0x86,0x7A,0x73,0x76,0x79,0x74, +0x78,0x86,0x91,0x85,0x6A,0x67,0x76,0x85,0x8C,0x91,0x97,0x91,0x91,0x95,0x95,0xA0, +0x9F,0x99,0x9F,0xA2,0xA2,0x9B,0x9A,0x9C,0x94,0x82,0x70,0x74,0x7A,0x72,0x69,0x70, +0x7C,0x78,0x80,0x89,0x7D,0x73,0x76,0x79,0x74,0x66,0x60,0x6B,0x79,0x7F,0x84,0x8D, +0x97,0x9C,0x9B,0x8A,0x79,0x77,0x71,0x6B,0x6F,0x7C,0x88,0x8E,0xA2,0xB4,0xAE,0x9E, +0x8D,0x82,0x7F,0x7B,0x80,0x7F,0x7F,0x80,0x7D,0x84,0x85,0x79,0x71,0x68,0x63,0x5F, +0x57,0x4C,0x4D,0x5C,0x63,0x68,0x69,0x69,0x73,0x78,0x7E,0x8C,0x92,0x98,0x99,0x99, +0x9E,0xA7,0xB0,0xA9,0xA6,0xAA,0xA9,0xAF,0xAD,0xA2,0x97,0x8C,0x81,0x77,0x78,0x75, +0x6D,0x6D,0x74,0x7C,0x84,0x8B,0x83,0x72,0x76,0x85,0x86,0x79,0x70,0x70,0x70,0x77, +0x7E,0x81,0x88,0x8D,0x87,0x83,0x83,0x84,0x8E,0x99,0x9A,0x97,0x8B,0x81,0x86,0x8F, +0x8E,0x88,0x92,0x9E,0xA4,0x99,0x81,0x7D,0x7B,0x67,0x53,0x50,0x53,0x55,0x5B,0x5F, +0x5E,0x5E,0x5F,0x63,0x68,0x6A,0x60,0x62,0x77,0x77,0x6B,0x74,0x84,0x8F,0x93,0x97, +0x96,0x8A,0x7A,0x80,0x9A,0xA2,0x99,0x98,0x9C,0x8E,0x81,0x85,0x8D,0x97,0x9E,0x9F, +0x8E,0x7E,0x76,0x70,0x78,0x8B,0x8F,0x80,0x75,0x67,0x56,0x4E,0x4A,0x54,0x65,0x6D, +0x74,0x77,0x6E,0x68,0x7C,0x98,0xA3,0xA4,0xA3,0x95,0x86,0x87,0x91,0x9F,0xA6,0x95, +0x78,0x6E,0x71,0x71,0x71,0x70,0x6E,0x6C,0x6F,0x76,0x84,0x96,0x8E,0x84,0x84,0x7E, +0x7A,0x71,0x64,0x6A,0x73,0x77,0x7D,0x87,0x92,0x8A,0x6F,0x61,0x66,0x73,0x75,0x6B, +0x64,0x6C,0x77,0x7E,0x78,0x73,0x7D,0x84,0x89,0x8A,0x89,0x88,0x84,0x7B,0x7A,0x7F, +0x86,0x8F,0x9A,0x9B,0x8A,0x74,0x79,0x8F,0x97,0x91,0x80,0x73,0x6F,0x72,0x75,0x77, +0x81,0x84,0x7F,0x7B,0x76,0x78,0x8D,0xA3,0xA0,0x94,0x8B,0x80,0x76,0x67,0x5F,0x5C, +0x63,0x6E,0x6F,0x7A,0x91,0x9A,0x95,0x96,0xA2,0xAE,0x9C,0x8B,0x9D,0xA2,0x96,0x8F, +0x8C,0x8F,0x84,0x7F,0x81,0x75,0x66,0x5E,0x63,0x68,0x66,0x68,0x70,0x7E,0x84,0x7E, +0x77,0x75,0x82,0x88,0x94,0xAB,0xAE,0xA4,0x9A,0x91,0x88,0x84,0x89,0x91,0x8C,0x88, +0x8B,0x88,0x81,0x85,0x9A,0xA3,0x98,0x8B,0x82,0x92,0xAB,0xA9,0x95,0x87,0x74,0x65, +0x6A,0x76,0x7B,0x7E,0x7B,0x7B,0x79,0x7F,0x83,0x80,0x7A,0x67,0x63,0x66,0x67,0x7B, +0x7D,0x72,0x78,0x88,0x8D,0x7B,0x76,0x7F,0x7E,0x76,0x75,0x7A,0x86,0x91,0x94,0x8F, +0x87,0x87,0x8A,0x88,0x82,0x7E,0x7D,0x76,0x70,0x73,0x80,0x80,0x78,0x67,0x56,0x68, +0x82,0x88,0x7A,0x6F,0x72,0x7A,0x86,0x88,0x82,0x7C,0x7E,0x7A,0x6A,0x56,0x54,0x65, +0x74,0x8C,0x96,0x8A,0x87,0x93,0x9E,0x9F,0x9D,0x9B,0x94,0x8D,0x8F,0x87,0x78,0x6C, +0x6A,0x71,0x7D,0x84,0x86,0x82,0x6E,0x63,0x6C,0x7A,0x7A,0x6A,0x6D,0x83,0x86,0x79, +0x6F,0x75,0x86,0x96,0x9D,0x96,0x83,0x75,0x6D,0x65,0x62,0x69,0x75,0x81,0x8E,0x94, +0x8A,0x77,0x79,0x7F,0x76,0x71,0x70,0x7B,0x89,0x8D,0x8B,0x81,0x7C,0x7E,0x74,0x5F, +0x55,0x51,0x58,0x67,0x6D,0x71,0x72,0x7B,0x8B,0x93,0x8F,0x81,0x80,0x8E,0x87,0x7F, +0x81,0x85,0x8E,0x9B,0xB0,0xAC,0x94,0x93,0x99,0x8E,0x75,0x64,0x5C,0x57,0x57,0x61, +0x70,0x77,0x7D,0x87,0x8D,0x89,0x83,0x91,0xA1,0x97,0x8B,0x91,0x9B,0x98,0x9E,0xA4, +0xA5,0xA8,0x9D,0x84,0x70,0x6B,0x76,0x7C,0x89,0x97,0x95,0x92,0x8C,0x93,0x94,0x76, +0x6A,0x71,0x75,0x71,0x6B,0x69,0x6E,0x80,0x95,0x8B,0x72,0x71,0x7A,0x83,0x8B,0x91, +0x9C,0x9D,0x8B,0x86,0x8F,0x88,0x77,0x74,0x78,0x84,0x8F,0x8E,0x8B,0x96,0x9D,0x9D, +0x9C,0x96,0x98,0x92,0x82,0x6F,0x61,0x59,0x53,0x5E,0x69,0x62,0x60,0x67,0x6E,0x6F, +0x67,0x66,0x65,0x63,0x6A,0x6E,0x76,0x80,0x8A,0x93,0x9A,0x98,0x96,0x9C,0x99,0x91, +0x8C,0x83,0x80,0x81,0x81,0x81,0x8A,0x93,0x8F,0x87,0x84,0x78,0x77,0x85,0x91,0x99, +0x99,0x8E,0x77,0x62,0x55,0x57,0x74,0x82,0x72,0x6D,0x70,0x73,0x80,0x8C,0x8D,0x93, +0x93,0x88,0x7D,0x7C,0x87,0x99,0x9C,0x93,0x91,0x91,0x92,0x9D,0xAE,0xAD,0x9B,0x8B, +0x7C,0x71,0x6A,0x62,0x69,0x6E,0x77,0x80,0x87,0x8D,0x80,0x70,0x6B,0x6D,0x76,0x7C, +0x7B,0x78,0x73,0x6F,0x66,0x5E,0x5E,0x5E,0x62,0x67,0x65,0x5D,0x62,0x75,0x7E,0x7D, +0x76,0x76,0x7F,0x82,0x8A,0x92,0xA3,0xAE,0xAB,0xA4,0x94,0x91,0x96,0x83,0x6F,0x72, +0x7D,0x83,0x8D,0x90,0x7B,0x66,0x60,0x5B,0x62,0x78,0x7A,0x6F,0x66,0x61,0x6F,0x89, +0x8C,0x84,0x7D,0x68,0x58,0x5F,0x63,0x68,0x74,0x84,0x93,0x9B,0x92,0x88,0x8F,0x9F, +0x9E,0x97,0x95,0x97,0x8C,0x7E,0x79,0x85,0x8A,0x80,0x87,0x93,0x8F,0x89,0x83,0x76, +0x6A,0x63,0x5E,0x54,0x52,0x5F,0x6E,0x80,0x83,0x8A,0x99,0x95,0x8C,0x8D,0x89,0x85, +0x83,0x7E,0x88,0x91,0x92,0x9E,0x9B,0x93,0x95,0x8D,0x85,0x7D,0x7D,0x82,0x7D,0x7B, +0x6E,0x5E,0x6C,0x79,0x81,0x8C,0x89,0x75,0x6F,0x87,0x96,0x91,0x99,0x95,0x87,0x80, +0x75,0x6C,0x6B,0x6B,0x68,0x6A,0x71,0x78,0x78,0x77,0x79,0x7E,0x8B,0x94,0x98,0x91, +0x89,0x82,0x89,0xA3,0xAF,0xAF,0xAF,0xAB,0xA1,0x8F,0x7D,0x81,0x84,0x81,0x7B,0x82, +0x7F,0x77,0x78,0x84,0x84,0x79,0x63,0x5F,0x74,0x72,0x72,0x82,0x92,0x94,0x91,0x8E, +0x88,0x8A,0x94,0x8C,0x83,0x8C,0x93,0x99,0x9F,0x98,0x8D,0x91,0x99,0x9E,0x93,0x7D, +0x72,0x7E,0x87,0x7C,0x7B,0x7B,0x82,0x85,0x79,0x68,0x66,0x68,0x6D,0x70,0x73,0x7A, +0x71,0x67,0x65,0x6D,0x6B,0x65,0x6E,0x7C,0x7F,0x82,0x6F,0x5E,0x69,0x7C,0x84,0x7A, +0x7F,0x7E,0x76,0x7A,0x8C,0x97,0x89,0x66,0x61,0x71,0x79,0x84,0x86,0x81,0x7A,0x7E, +0x78,0x6B,0x6C,0x79,0x80,0x87,0x87,0x85,0x8F,0x93,0x83,0x81,0x83,0x82,0x84,0x76, +0x6C,0x6C,0x69,0x65,0x68,0x66,0x6D,0x7B,0x84,0x82,0x80,0x7F,0x80,0x87,0x7F,0x76, +0x79,0x86,0x8E,0x81,0x75,0x7C,0x8B,0x95,0x88,0x79,0x85,0x92,0x8D,0x8E,0x91,0x8B, +0x9D,0xA9,0xA5,0xAE,0xAE,0xA2,0x9B,0x98,0x8D,0x7E,0x79,0x73,0x6D,0x68,0x61,0x71, +0x80,0x75,0x59,0x4E,0x51,0x50,0x56,0x65,0x71,0x79,0x6E,0x65,0x7D,0x89,0x85,0x86, +0x87,0x92,0x9D,0xA4,0x99,0x7B,0x63,0x66,0x7C,0x88,0x87,0x83,0x80,0x7F,0x83,0x88, +0x81,0x78,0x6F,0x6D,0x69,0x60,0x74,0x88,0x8F,0x91,0x97,0x9D,0x9C,0x90,0x94,0x91, +0x7E,0x6E,0x74,0x80,0x7B,0x78,0x78,0x84,0x8A,0x88,0x8B,0x93,0x91,0x90,0x97,0x9A, +0x9D,0xA2,0xA5,0x94,0x83,0x85,0x91,0x8F,0x8D,0x8E,0x92,0x91,0x83,0x73,0x70,0x74, +0x76,0x76,0x76,0x6B,0x66,0x68,0x69,0x83,0x8C,0x8B,0x8A,0x7B,0x78,0x85,0x84,0x79, +0x68,0x6B,0x7D,0x84,0x8E,0x8B,0x86,0x8C,0x98,0xA3,0xA0,0x94,0x8B,0x72,0x6D,0x75, +0x72,0x79,0x8A,0x8E,0x82,0x70,0x6B,0x6F,0x79,0x70,0x66,0x72,0x7B,0x81,0x81,0x8C, +0x8E,0x80,0x72,0x6E,0x75,0x7C,0x81,0x7A,0x70,0x7A,0x84,0x86,0x7F,0x80,0x89,0x87, +0x81,0x79,0x7E,0x89,0x8D,0x85,0x7B,0x78,0x7B,0x78,0x75,0x78,0x7F,0x8A,0x8A,0x81, +0x7D,0x81,0x8C,0x82,0x74,0x78,0x81,0x86,0x89,0x84,0x85,0x83,0x67,0x53,0x61,0x75, +0x71,0x6A,0x6A,0x71,0x85,0x8C,0x92,0x9A,0x9F,0xA0,0x9D,0x9C,0x9B,0xA0,0xA3,0x9D, +0x97,0x8C,0x81,0x7E,0x7F,0x73,0x66,0x64,0x6C,0x6C,0x74,0x8A,0x93,0x8A,0x76,0x76, +0x83,0x75,0x6C,0x81,0x8A,0x84,0x86,0x93,0x9E,0x9D,0x99,0x8E,0x82,0x7A,0x6D,0x69, +0x68,0x61,0x57,0x57,0x5A,0x6A,0x7B,0x7B,0x7C,0x83,0x8A,0x87,0x80,0x7C,0x72,0x6D, +0x6E,0x70,0x7B,0x86,0x8C,0x90,0x83,0x67,0x68,0x74,0x6C,0x63,0x61,0x61,0x77,0x82, +0x78,0x76,0x74,0x79,0x7D,0x73,0x7D,0x8F,0x93,0x8B,0x71,0x5F,0x6E,0x84,0x94,0x9B, +0x95,0x7F,0x6A,0x68,0x7B,0x90,0x96,0x96,0xA2,0xA9,0xA6,0x96,0x92,0x9D,0x92,0x8B, +0x90,0x91,0x88,0x7E,0x7C,0x87,0x90,0x87,0x7F,0x7D,0x77,0x75,0x79,0x67,0x65,0x76, +0x7D,0x79,0x81,0x92,0x9C,0xA0,0xA0,0x98,0x8A,0x80,0x73,0x77,0x7B,0x75,0x7E,0x95, +0x97,0x88,0x83,0x8E,0x85,0x73,0x73,0x7B,0x85,0x7D,0x65,0x5B,0x78,0x94,0x9A,0x98, +0x94,0x8D,0x89,0x88,0x80,0x7B,0x72,0x66,0x66,0x7D,0x89,0x77,0x71,0x6D,0x75,0x8C, +0x8D,0x8A,0x8D,0x92,0x94,0x94,0x94,0x94,0x98,0x96,0x88,0x78,0x79,0x72,0x67,0x69, +0x65,0x6B,0x7D,0x80,0x71,0x72,0x74,0x6D,0x6D,0x7A,0x7C,0x7B,0x80,0x7F,0x82,0x93, +0xA7,0xA5,0xA4,0xB0,0xB1,0x9A,0x83,0x79,0x72,0x6F,0x73,0x74,0x79,0x84,0x87,0x7F, +0x7C,0x82,0x82,0x85,0x8D,0x94,0x87,0x78,0x73,0x73,0x72,0x78,0x85,0x93,0xAE,0xBC, +0xA8,0x87,0x7B,0x7E,0x6C,0x60,0x64,0x58,0x4A,0x60,0x7B,0x7B,0x7A,0x78,0x6E,0x6F, +0x82,0x85,0x7D,0x6F,0x55,0x5B,0x76,0x81,0x70,0x60,0x62,0x61,0x6A,0x76,0x7B,0x88, +0x8A,0x7C,0x71,0x6D,0x8C,0xAC,0x9F,0x84,0x85,0x95,0x8D,0x8D,0x98,0x96,0x8D,0x7C, +0x6A,0x5A,0x53,0x57,0x61,0x67,0x5E,0x5D,0x6A,0x7C,0x86,0x88,0x86,0x88,0x8B,0x86, +0x8B,0x9A,0x8F,0x7A,0x72,0x78,0x7F,0x80,0x7E,0x7D,0x8D,0x9E,0x9A,0x8E,0x80,0x7B, +0x7E,0x81,0x8B,0x92,0x95,0x92,0x87,0x83,0x81,0x84,0x8A,0x8F,0x8C,0x74,0x67,0x77, +0x80,0x87,0x96,0xAA,0xB3,0x9F,0x8B,0x7E,0x77,0x71,0x7B,0x85,0x80,0x7E,0x8C,0xA4, +0xAF,0xA9,0xA5,0xA0,0x90,0x76,0x69,0x75,0x7C,0x7D,0x78,0x6B,0x76,0x89,0x98,0x99, +0x87,0x79,0x72,0x72,0x6D,0x6A,0x6C,0x61,0x6C,0x7F,0x81,0x79,0x73,0x73,0x6E,0x63, +0x59,0x52,0x5E,0x77,0x77,0x6A,0x63,0x75,0x89,0x8E,0x8F,0x8A,0x83,0x79,0x83,0x93, +0x93,0x82,0x76,0x81,0x8F,0x99,0x94,0x75,0x62,0x6B,0x81,0x94,0x89,0x80,0x87,0x80, +0x78,0x7D,0x7A,0x7C,0x83,0x7C,0x6B,0x61,0x6A,0x7A,0x83,0x87,0x8B,0xA1,0xA8,0x98, +0x8D,0x89,0x84,0x7C,0x6D,0x6A,0x7A,0x86,0x92,0xA9,0xAA,0x8E,0x7E,0x95,0xA2,0x89, +0x79,0x79,0x82,0x90,0x8F,0x7F,0x7F,0x8E,0x9C,0xA6,0x99,0x85,0x84,0x7F,0x77,0x79, +0x79,0x71,0x66,0x62,0x68,0x70,0x76,0x71,0x6D,0x78,0x85,0x91,0x95,0x93,0x8D,0x8E, +0x98,0x8D,0x7A,0x7D,0x95,0x97,0x85,0x7F,0x82,0x7E,0x72,0x6D,0x7C,0x7E,0x6F,0x67, +0x63,0x67,0x71,0x7D,0x80,0x7A,0x85,0x9A,0xA6,0xA8,0x9D,0x87,0x81,0x85,0x80,0x71, +0x63,0x5D,0x5D,0x69,0x78,0x79,0x6C,0x71,0x78,0x76,0x7B,0x74,0x6C,0x74,0x8A,0x97, +0x8B,0x82,0x88,0x8F,0x91,0x88,0x86,0x88,0x7C,0x6A,0x6A,0x70,0x75,0x6B,0x70,0x82, +0x82,0x7D,0x81,0x81,0x7D,0x88,0x8D,0x8A,0x7E,0x70,0x75,0x7B,0x7F,0x7D,0x71,0x6D, +0x73,0x7A,0x8B,0x8F,0x82,0x8C,0xA5,0xAB,0xA9,0xA8,0x99,0x81,0x76,0x7A,0x7A,0x72, +0x70,0x76,0x7E,0x82,0x6F,0x61,0x68,0x6F,0x67,0x59,0x5A,0x53,0x4A,0x56,0x6B,0x6B, +0x68,0x7E,0x93,0x92,0x8E,0x90,0x8D,0x8C,0x8C,0x7F,0x7C,0x8F,0x8E,0x7D,0x7F,0x91, +0xA5,0xA7,0xA4,0x90,0x7C,0x7B,0x6B,0x61,0x6F,0x84,0x8C,0x82,0x76,0x7C,0x8B,0x94, +0x90,0x89,0x85,0x7C,0x76,0x78,0x84,0x82,0x77,0x7C,0x7F,0x74,0x69,0x75,0x84,0x81, +0x81,0x8E,0x9D,0xA5,0xA5,0xA7,0xA5,0x9B,0x93,0x90,0x97,0xA1,0x98,0x90,0x95,0x97, +0x91,0x86,0x7C,0x82,0x7D,0x68,0x60,0x61,0x6E,0x78,0x75,0x79,0x7F,0x82,0x8D,0x8E, +0x7E,0x75,0x86,0x96,0x97,0x8B,0x7E,0x85,0x87,0x86,0x8F,0x9B,0x95,0x84,0x7D,0x7F, +0x7C,0x70,0x73,0x82,0x81,0x7E,0x82,0x8A,0x92,0x98,0x9B,0x95,0x87,0x7F,0x80,0x7B, +0x79,0x78,0x67,0x5E,0x5C,0x67,0x7F,0x8A,0x75,0x56,0x57,0x61,0x61,0x5E,0x6D,0x77, +0x68,0x71,0x8C,0x93,0x8F,0x8A,0x90,0xA2,0x9C,0x78,0x62,0x5D,0x5C,0x62,0x6C,0x6E, +0x6E,0x71,0x7E,0x8E,0x96,0x9A,0x90,0x8B,0x8E,0x8D,0x87,0x78,0x6B,0x6E,0x87,0x9A, +0x9C,0x8E,0x7B,0x7D,0x81,0x70,0x5A,0x4D,0x48,0x59,0x66,0x64,0x74,0x8B,0x8B,0x87, +0x88,0x87,0x91,0x97,0x91,0x8E,0x8F,0x8E,0x8C,0x89,0x8A,0x90,0xA2,0xAC,0x9C,0x81, +0x7C,0x85,0x8B,0x93,0x93,0x88,0x7E,0x70,0x73,0x7C,0x74,0x73,0x78,0x7F,0x81,0x7A, +0x76,0x7A,0x7F,0x83,0x85,0x77,0x6E,0x69,0x64,0x6E,0x79,0x81,0x8A,0x94,0x8F,0x8A, +0x8D,0x94,0x96,0x98,0x90,0x79,0x70,0x7F,0x92,0x9F,0x96,0x88,0x7E,0x7F,0x7F,0x76, +0x6F,0x69,0x68,0x6B,0x6D,0x67,0x62,0x72,0x8B,0x8D,0x77,0x6C,0x7D,0x86,0x82,0x72, +0x63,0x66,0x6D,0x71,0x7D,0x8F,0x9D,0x98,0x8A,0x86,0x87,0x86,0x84,0x7D,0x7D,0x7D, +0x79,0x7D,0x89,0x8E,0x88,0x8E,0x9D,0xA3,0x97,0x83,0x6E,0x62,0x6A,0x73,0x73,0x6D, +0x68,0x66,0x5C,0x5A,0x68,0x76,0x80,0x85,0x7E,0x7C,0x7C,0x7D,0x88,0x95,0x8D,0x84, +0x7D,0x7D,0x9C,0xB8,0xB8,0xAB,0xA6,0xA3,0x92,0x8A,0x85,0x7A,0x69,0x51,0x52,0x6E, +0x84,0x8F,0x92,0x90,0x95,0x9F,0xA1,0x93,0x7B,0x6B,0x7D,0x97,0x87,0x6B,0x6E,0x73, +0x73,0x70,0x74,0x71,0x6C,0x71,0x70,0x72,0x76,0x85,0x97,0x8A,0x7D,0x88,0x90,0x92, +0x98,0x9F,0x9E,0x91,0x89,0x85,0x82,0x7F,0x7C,0x8B,0x8D,0x84,0x7D,0x7F,0x7F,0x80, +0x8D,0x96,0x8E,0x80,0x7B,0x76,0x6E,0x73,0x77,0x7A,0x76,0x6A,0x64,0x5F,0x68,0x78, +0x80,0x78,0x7A,0x88,0x93,0xA9,0xAD,0x91,0x74,0x78,0x87,0x8A,0x82,0x75,0x76,0x83, +0x84,0x7B,0x75,0x7A,0x7A,0x7A,0x79,0x79,0x76,0x6C,0x6C,0x78,0x7C,0x7E,0x88,0x8D, +0x8D,0x89,0x7E,0x79,0x77,0x7A,0x84,0x8B,0x92,0x89,0x8A,0x9A,0x95,0x89,0x89,0x90, +0x8D,0x80,0x7E,0x92,0x98,0x85,0x76,0x72,0x6E,0x70,0x77,0x7C,0x78,0x72,0x69,0x5B, +0x5E,0x70,0x7D,0x7C,0x80,0x79,0x6D,0x74,0x78,0x75,0x75,0x7A,0x77,0x65,0x5B,0x5E, +0x6B,0x6F,0x61,0x63,0x79,0x89,0x8D,0x84,0x83,0x88,0x85,0x8C,0x93,0x89,0x85,0x8B, +0x8F,0x86,0x74,0x76,0x77,0x6C,0x68,0x6E,0x73,0x78,0x7B,0x7F,0x76,0x6E,0x77,0x81, +0x88,0x8C,0x8D,0x8E,0x92,0x91,0x93,0x9F,0x9F,0x8E,0x75,0x72,0x77,0x7A,0x7E,0x80, +0x8E,0x93,0x93,0x94,0x93,0x90,0x8B,0x88,0x86,0x88,0x8C,0x8E,0x8C,0x8C,0x96,0x95, +0x89,0x87,0x80,0x6E,0x6D,0x72,0x6B,0x70,0x79,0x83,0x91,0x86,0x78,0x83,0x8E,0x8A, +0x86,0x92,0x9A,0x8F,0x8E,0x90,0x84,0x81,0x78,0x65,0x65,0x78,0x84,0x93,0x94,0x89, +0x92,0x91,0x7E,0x7B,0x87,0x88,0x87,0x87,0x7C,0x6E,0x73,0x7B,0x83,0x83,0x74,0x73, +0x7F,0x80,0x77,0x78,0x80,0x8B,0x8A,0x77,0x6A,0x6C,0x7B,0x81,0x87,0x96,0x9C,0x99, +0x98,0x98,0x91,0x88,0x78,0x6C,0x67,0x63,0x66,0x6E,0x79,0x87,0x90,0x8A,0x85,0x85, +0x83,0x76,0x6D,0x61,0x5C,0x68,0x83,0x9B,0x95,0x85,0x7E,0x88,0x90,0x84,0x6E,0x6D, +0x71,0x75,0x75,0x73,0x7E,0x8D,0x99,0x9C,0x99,0x9B,0x99,0x95,0x8F,0x81,0x75,0x79, +0x7F,0x78,0x67,0x59,0x5A,0x67,0x7A,0x77,0x70,0x7D,0x85,0x83,0x86,0x85,0x80,0x7B, +0x75,0x70,0x75,0x7E,0x86,0x92,0x94,0x8D,0x83,0x7B,0x83,0x8D,0x86,0x72,0x76,0x87, +0x90,0x9E,0x9D,0x91,0x8C,0x83,0x7E,0x75,0x6B,0x62,0x52,0x53,0x63,0x64,0x5D,0x5F, +0x5B,0x58,0x68,0x79,0x7E,0x86,0x91,0x8E,0x83,0x8A,0x9A,0xA4,0xA0,0x95,0x87,0x86, +0x8E,0x95,0x92,0x7D,0x7B,0x89,0x86,0x76,0x6E,0x77,0x8C,0x8B,0x82,0x87,0x82,0x7D, +0x7D,0x7D,0x7C,0x6F,0x70,0x82,0x81,0x76,0x6F,0x71,0x75,0x78,0x78,0x78,0x82,0x88, +0x8D,0x8F,0x93,0x97,0x8C,0x86,0x8D,0x8C,0x8F,0x94,0x92,0x8E,0x8F,0x99,0xA9,0xA5, +0x8F,0x77,0x64,0x67,0x70,0x72,0x69,0x6A,0x73,0x74,0x74,0x81,0x8E,0x88,0x7F,0x7D, +0x79,0x75,0x76,0x79,0x79,0x79,0x7D,0x84,0x8F,0x8C,0x88,0x8C,0x87,0x7B,0x7A,0x7E, +0x7E,0x7D,0x79,0x81,0x93,0x91,0x83,0x87,0x8C,0x81,0x71,0x7E,0x87,0x72,0x5E,0x60, +0x6E,0x77,0x76,0x7B,0x7F,0x77,0x6F,0x75,0x86,0x90,0x90,0x7E,0x66,0x66,0x70,0x7E, +0x88,0x82,0x80,0x87,0x96,0x96,0x8D,0x8B,0x92,0x95,0x91,0x96,0x91,0x85,0x76,0x6F, +0x76,0x7E,0x84,0x86,0x85,0x85,0x87,0x8A,0x8C,0x88,0x85,0x80,0x78,0x76,0x78,0x7B, +0x76,0x6E,0x73,0x7E,0x90,0x8D,0x78,0x70,0x77,0x7F,0x7F,0x80,0x81,0x88,0x92,0x8D, +0x95,0xAD,0xAD,0x9D,0x9D,0x9D,0x95,0x95,0x8A,0x76,0x71,0x79,0x82,0x84,0x82,0x81, +0x75,0x6C,0x70,0x6E,0x70,0x7C,0x8B,0x86,0x71,0x6C,0x73,0x81,0x8B,0x7F,0x7A,0x83, +0x8E,0x96,0x8D,0x7F,0x79,0x79,0x81,0x7E,0x76,0x7A,0x78,0x78,0x81,0x8C,0x92,0x83, +0x78,0x7C,0x79,0x70,0x74,0x84,0x8C,0x7D,0x76,0x7C,0x7E,0x72,0x6D,0x76,0x71,0x66, +0x6D,0x71,0x75,0x76,0x6B,0x6B,0x70,0x6C,0x67,0x70,0x7E,0x8A,0x95,0x94,0x7E,0x79, +0x83,0x83,0x7D,0x7D,0x81,0x7D,0x82,0x89,0x85,0x8A,0x8B,0x7B,0x7B,0x7F,0x6F,0x74, +0x7A,0x74,0x80,0x92,0x8E,0x80,0x85,0x8F,0x8F,0x8D,0x82,0x73,0x71,0x79,0x77,0x70, +0x71,0x7A,0x76,0x76,0x82,0x7F,0x6F,0x62,0x62,0x71,0x77,0x7B,0x82,0x7C,0x78,0x7F, +0x88,0x8D,0x8A,0x7A,0x73,0x89,0x98,0x8F,0x8F,0x96,0x98,0x91,0x87,0x88,0x8B,0x8B, +0x88,0x7D,0x79,0x7C,0x77,0x7E,0x8E,0x86,0x76,0x77,0x7F,0x86,0x8E,0x93,0x99,0x8D, +0x75,0x6F,0x75,0x71,0x6F,0x75,0x7B,0x80,0x8F,0x91,0x80,0x70,0x7A,0x81,0x85,0x93, +0x9E,0x94,0x87,0x82,0x8E,0xA4,0xA7,0x9E,0x94,0x7E,0x77,0x80,0x71,0x75,0x80,0x86, +0x90,0x92,0x91,0x8F,0x8F,0x90,0x83,0x82,0x91,0x90,0x97,0x87,0x6B,0x6D,0x74,0x6E, +0x65,0x75,0x8C,0x92,0x94,0x83,0x79,0x80,0x7B,0x79,0x75,0x72,0x6B,0x66,0x6F,0x81, +0x91,0x9B,0x9C,0x9C,0x90,0x78,0x7E,0x7E,0x7D,0x75,0x75,0x77,0x64,0x65,0x7C,0x91, +0x9C,0x98,0x85,0x7A,0x6A,0x61,0x69,0x77,0x6F,0x61,0x6D,0x89,0x8D,0x84,0x7B,0x85, +0x96,0x8C,0x84,0x81,0x7B,0x70,0x6A,0x73,0x7A,0x78,0x72,0x6D,0x73,0x74,0x69,0x6A, +0x6E,0x66,0x64,0x79,0x83,0x88,0x8E,0x88,0x7B,0x7D,0x87,0x8F,0x88,0x7C,0x77,0x74, +0x72,0x6C,0x69,0x72,0x81,0x7E,0x73,0x6B,0x6F,0x7B,0x8D,0x9B,0x9C,0x9D,0x92,0x86, +0x86,0x8C,0x8D,0x97,0x9D,0x94,0x84,0x8A,0x8F,0x87,0x7B,0x7C,0x8B,0x92,0x81,0x6D, +0x74,0x85,0x8D,0x85,0x7C,0x86,0x94,0x9D,0x96,0x87,0x85,0x7A,0x6E,0x70,0x77,0x72, +0x68,0x7A,0x89,0x83,0x7F,0x83,0x8D,0x84,0x7B,0x8D,0x94,0x91,0x94,0x98,0x8B,0x81, +0x87,0x89,0x7E,0x76,0x75,0x74,0x74,0x6C,0x66,0x6F,0x7A,0x79,0x74,0x73,0x72,0x6D, +0x68,0x6C,0x7C,0x8D,0x99,0x9A,0x8F,0x8B,0x94,0x8D,0x77,0x74,0x7A,0x7B,0x7B,0x77, +0x74,0x6E,0x65,0x6F,0x81,0x87,0x82,0x7D,0x73,0x6F,0x6B,0x6F,0x7B,0x7C,0x7B,0x8F, +0x99,0x91,0x8F,0x94,0x8D,0x7A,0x74,0x81,0x88,0x87,0x86,0x8A,0x8A,0x8C,0x9A,0xA1, +0x8A,0x7C,0x7F,0x75,0x6E,0x6B,0x66,0x71,0x7F,0x79,0x71,0x7D,0x82,0x77,0x6D,0x71, +0x72,0x62,0x64,0x7B,0x86,0x81,0x81,0x83,0x80,0x7B,0x76,0x80,0x84,0x84,0x8F,0x9F, +0xA6,0xA5,0x9D,0x8D,0x8A,0x91,0x90,0x87,0x6F,0x62,0x76,0x8A,0x88,0x78,0x73,0x7E, +0x7D,0x7B,0x75,0x67,0x6B,0x7D,0x80,0x7A,0x83,0x90,0x93,0x97,0x9A,0x9A,0x92,0x84, +0x7F,0x79,0x7F,0x8C,0x8A,0x83,0x7E,0x7C,0x80,0x91,0x9F,0x9D,0x9B,0x9E,0x99,0x89, +0x7F,0x81,0x8A,0x8E,0x90,0x8F,0x89,0x8C,0x88,0x7E,0x7C,0x70,0x63,0x6A,0x74,0x6B, +0x68,0x6E,0x6F,0x67,0x67,0x78,0x84,0x80,0x83,0x8B,0x8F,0x91,0x94,0x99,0x9A,0x98, +0x93,0x83,0x73,0x6E,0x77,0x7B,0x77,0x76,0x7A,0x7E,0x80,0x84,0x84,0x82,0x7F,0x71, +0x68,0x72,0x7B,0x7B,0x79,0x78,0x7D,0x85,0x7F,0x74,0x70,0x64,0x56,0x57,0x62,0x65, +0x66,0x72,0x7F,0x84,0x86,0x82,0x85,0x8D,0x8A,0x80,0x7D,0x82,0x82,0x7E,0x83,0x88, +0x89,0x92,0x94,0x8B,0x7A,0x69,0x6A,0x7A,0x7D,0x71,0x76,0x81,0x7C,0x6E,0x65,0x70, +0x76,0x70,0x71,0x68,0x62,0x6B,0x76,0x80,0x86,0x85,0x89,0x8F,0x8D,0x83,0x8B,0x9C, +0xA2,0x9C,0x8E,0x88,0x82,0x84,0x89,0x93,0x9D,0x9B,0x95,0x94,0x90,0x87,0x86,0x82, +0x75,0x7B,0x78,0x73,0x73,0x67,0x64,0x70,0x78,0x78,0x7A,0x87,0x8A,0x84,0x8A,0x96, +0x98,0x95,0x98,0x97,0x84,0x77,0x7F,0x84,0x79,0x76,0x71,0x77,0x8A,0x91,0x8E,0x8C, +0x94,0x8F,0x7B,0x75,0x75,0x83,0x86,0x74,0x77,0x8C,0x90,0x8C,0x91,0x91,0x8F,0x90, +0x81,0x72,0x72,0x6F,0x6B,0x70,0x6A,0x63,0x73,0x83,0x7C,0x72,0x7A,0x82,0x7E,0x73, +0x6B,0x70,0x76,0x7E,0x87,0x8A,0x8A,0x89,0x8E,0x8F,0x90,0x98,0x91,0x7D,0x7B,0x8E, +0x99,0x95,0x8E,0x8B,0x92,0x90,0x7F,0x71,0x71,0x7D,0x7E,0x77,0x7D,0x8D,0x9A,0xA4, +0x9A,0x84,0x7E,0x83,0x80,0x75,0x68,0x60,0x60,0x67,0x70,0x70,0x6E,0x6C,0x73,0x7A, +0x7A,0x7C,0x88,0x9B,0x9A,0x8A,0x84,0x81,0x86,0x8C,0x86,0x87,0x8E,0x83,0x77,0x78, +0x75,0x6F,0x70,0x7F,0x7C,0x72,0x74,0x79,0x75,0x65,0x6E,0x80,0x82,0x82,0x75,0x6C, +0x71,0x70,0x6F,0x72,0x7B,0x82,0x7F,0x78,0x6F,0x72,0x83,0x88,0x83,0x84,0x89,0x86, +0x81,0x8A,0x8E,0x8B,0x88,0x8B,0x9B,0x9E,0x8D,0x83,0x82,0x86,0x81,0x70,0x6F,0x88, +0x8F,0x82,0x7A,0x77,0x81,0x91,0x94,0x91,0x8C,0x81,0x82,0x85,0x80,0x83,0x94,0x95, +0x87,0x83,0x8D,0x92,0x8D,0x87,0x7C,0x74,0x6C,0x6A,0x6E,0x75,0x73,0x82,0x93,0x8E, +0x8A,0x90,0x8E,0x88,0x87,0x81,0x84,0x8B,0x89,0x89,0x83,0x77,0x73,0x71,0x79,0x86, +0x8E,0x87,0x76,0x6E,0x6C,0x71,0x78,0x75,0x71,0x6E,0x63,0x68,0x7C,0x82,0x82,0x85, +0x88,0x82,0x82,0x83,0x77,0x67,0x60,0x5C,0x6C,0x7B,0x71,0x72,0x7A,0x7B,0x7E,0x84, +0x82,0x83,0x86,0x81,0x7B,0x79,0x83,0x93,0x9C,0x9D,0x91,0x86,0x89,0x8F,0x8C,0x7F, +0x71,0x6B,0x69,0x6C,0x6E,0x6F,0x75,0x6C,0x5D,0x62,0x7A,0x89,0x7C,0x71,0x87,0x9A, +0x9B,0x9C,0x9B,0x97,0x93,0x8D,0x87,0x87,0x8B,0x84,0x77,0x76,0x78,0x81,0x86,0x87, +0x86,0x7F,0x75,0x76,0x8A,0x9F,0xA0,0x92,0x87,0x8C,0x8F,0x88,0x87,0x8F,0x8F,0x8D, +0x8C,0x7C,0x6D,0x70,0x74,0x75,0x75,0x7A,0x89,0x90,0x86,0x7A,0x72,0x73,0x70,0x70, +0x73,0x7D,0x8A,0x92,0x99,0xA5,0xAC,0xA5,0x90,0x85,0x81,0x74,0x60,0x50,0x57,0x6A, +0x78,0x7E,0x89,0x8F,0x8F,0x8B,0x82,0x83,0x80,0x72,0x68,0x69,0x71,0x77,0x76,0x75, +0x7D,0x87,0x88,0x7A,0x75,0x7F,0x84,0x84,0x85,0x85,0x8B,0x96,0x97,0x86,0x7E,0x89, +0x97,0x99,0x8F,0x82,0x79,0x84,0x91,0x8B,0x7D,0x79,0x7A,0x74,0x6E,0x77,0x7D,0x73, +0x73,0x7E,0x88,0x8D,0x90,0x8C,0x7B,0x72,0x78,0x80,0x7E,0x7F,0x7E,0x79,0x7E,0x81, +0x80,0x7D,0x7B,0x84,0x98,0x9E,0x8D,0x7B,0x78,0x79,0x74,0x73,0x7D,0x88,0x83,0x77, +0x74,0x7A,0x89,0x8B,0x8A,0x8A,0x7D,0x74,0x78,0x7B,0x7D,0x7D,0x73,0x6C,0x71,0x75, +0x76,0x78,0x7E,0x7C,0x73,0x7A,0x7E,0x75,0x6E,0x70,0x7C,0x8A,0x8E,0x8B,0x81,0x7E, +0x76,0x7B,0x8C,0x8F,0x84,0x74,0x6D,0x72,0x79,0x7E,0x80,0x7E,0x85,0x8A,0x81,0x6F, +0x68,0x71,0x73,0x63,0x64,0x78,0x90,0x98,0x8F,0x83,0x81,0x8C,0x85,0x72,0x6C,0x68, +0x6A,0x76,0x80,0x85,0x86,0x85,0x86,0x85,0x84,0x91,0x93,0x7C,0x6E,0x73,0x78,0x79, +0x8C,0x94,0x8F,0x97,0xA2,0x9E,0x94,0x96,0x94,0x89,0x81,0x80,0x7D,0x89,0x93,0x8B, +0x80,0x7C,0x7E,0x7E,0x82,0x80,0x7E,0x81,0x80,0x76,0x66,0x70,0x86,0x7D,0x6B,0x70, +0x83,0x92,0x98,0x95,0x8E,0x91,0x91,0x92,0x95,0x96,0x8D,0x84,0x84,0x86,0x86,0x90, +0x9C,0x92,0x8B,0x93,0x89,0x75,0x6B,0x6B,0x6B,0x69,0x74,0x77,0x69,0x6C,0x79,0x76, +0x79,0x82,0x8A,0x88,0x76,0x62,0x61,0x6D,0x71,0x78,0x85,0x8F,0x8A,0x77,0x7A,0x8B, +0x87,0x81,0x7F,0x7E,0x7D,0x7F,0x7E,0x7D,0x80,0x83,0x8B,0x85,0x75,0x77,0x7A,0x75, +0x7D,0x8E,0x94,0x8A,0x78,0x75,0x7E,0x83,0x84,0x71,0x64,0x6F,0x76,0x7C,0x8B,0x8A, +0x7E,0x88,0x91,0x82,0x76,0x78,0x79,0x74,0x76,0x78,0x79,0x85,0x8E,0x82,0x83,0x90, +0x83,0x6C,0x6D,0x78,0x78,0x7A,0x83,0x87,0x8E,0x93,0x97,0x91,0x84,0x94,0x9F,0x94, +0x82,0x78,0x7A,0x7A,0x7E,0x8B,0x93,0x8D,0x8D,0x90,0x82,0x74,0x77,0x7E,0x7F,0x78, +0x6C,0x72,0x84,0x7E,0x6C,0x69,0x7D,0x8B,0x80,0x74,0x71,0x82,0x8B,0x83,0x72,0x72, +0x88,0x9E,0xA4,0x97,0x86,0x7E,0x7D,0x77,0x72,0x74,0x76,0x78,0x79,0x7D,0x8D,0x8D, +0x8D,0x89,0x7C,0x7B,0x79,0x6D,0x73,0x7F,0x85,0x82,0x77,0x75,0x79,0x7B,0x7A,0x7D, +0x85,0x85,0x85,0x8D,0x8A,0x79,0x66,0x69,0x73,0x75,0x7A,0x88,0x94,0x8D,0x84,0x92, +0x98,0x8C,0x7C,0x7D,0x83,0x78,0x71,0x74,0x7F,0x87,0x93,0x91,0x86,0x7C,0x76,0x7F, +0x7F,0x77,0x70,0x67,0x68,0x72,0x74,0x73,0x70,0x84,0x92,0x7D,0x6E,0x7B,0x85,0x87, +0x87,0x88,0x8A,0x8B,0x8F,0x92,0x8F,0x89,0x86,0x87,0x8B,0x8B,0x97,0xA3,0x99,0x83, +0x78,0x78,0x79,0x71,0x64,0x5E,0x67,0x72,0x6E,0x6D,0x75,0x72,0x6F,0x7B,0x7A,0x6D, +0x6A,0x68,0x71,0x80,0x8C,0x90,0x91,0x94,0x92,0x8B,0x8F,0x8B,0x7E,0x7F,0x79,0x6F, +0x6F,0x7E,0x8B,0x8C,0x8D,0x93,0x8E,0x86,0x7E,0x80,0x8A,0x86,0x76,0x71,0x7D,0x7D, +0x7B,0x80,0x7E,0x7F,0x7E,0x7D,0x77,0x73,0x7C,0x7C,0x7A,0x86,0x91,0x9D,0x9D,0x98, +0x97,0x98,0x9B,0x97,0x8E,0x83,0x80,0x87,0x94,0x92,0x85,0x82,0x86,0x88,0x87,0x7E, +0x7A,0x7B,0x78,0x7D,0x88,0x86,0x86,0x90,0x97,0x8B,0x7E,0x74,0x6C,0x6B,0x70,0x7C, +0x81,0x7B,0x79,0x7D,0x7C,0x86,0x8C,0x81,0x7D,0x85,0x84,0x8F,0xA0,0x96,0x91,0x96, +0x94,0x88,0x7F,0x71,0x5E,0x56,0x5D,0x69,0x67,0x68,0x77,0x89,0x91,0x85,0x71,0x6A, +0x67,0x5B,0x60,0x6F,0x7C,0x88,0x90,0x9A,0x96,0x7D,0x6E,0x76,0x7C,0x75,0x6D,0x72, +0x7B,0x7D,0x7D,0x86,0x90,0x88,0x81,0x85,0x86,0x78,0x6A,0x61,0x5E,0x60,0x6A,0x7B, +0x8C,0x90,0x89,0x85,0x85,0x80,0x79,0x72,0x71,0x7B,0x79,0x6D,0x6C,0x74,0x7D,0x90, +0x9E,0x9F,0x9A,0x8E,0x7F,0x77,0x80,0x85,0x82,0x82,0x89,0x83,0x78,0x7A,0x83,0x80, +0x7F,0x87,0x83,0x7A,0x77,0x77,0x7A,0x82,0x89,0x88,0x7E,0x7D,0x86,0x8B,0x81,0x7E, +0x86,0x87,0x7C,0x76,0x7D,0x8A,0x94,0x99,0x94,0x85,0x82,0x87,0x8E,0x93,0x90,0x85, +0x88,0x8D,0x8C,0x8C,0x85,0x82,0x86,0x82,0x80,0x80,0x83,0x83,0x82,0x82,0x78,0x72, +0x75,0x80,0x8B,0x92,0x8B,0x7C,0x75,0x79,0x78,0x73,0x73,0x73,0x75,0x79,0x7F,0x81, +0x82,0x81,0x87,0x91,0x90,0x79,0x6E,0x6A,0x67,0x70,0x7A,0x84,0x89,0x8A,0x89,0x86, +0x82,0x7D,0x6F,0x67,0x6F,0x6F,0x70,0x7C,0x82,0x86,0x8F,0x97,0x9D,0x94,0x86,0x85, +0x85,0x82,0x7E,0x7B,0x84,0x86,0x81,0x75,0x75,0x81,0x7F,0x71,0x79,0x87,0x7E,0x7C, +0x83,0x88,0x83,0x82,0x83,0x80,0x7A,0x6F,0x6C,0x78,0x83,0x80,0x7C,0x81,0x87,0x89, +0x7F,0x6F,0x76,0x7E,0x7E,0x7D,0x83,0x81,0x7A,0x86,0x93,0x9D,0x97,0x85,0x7A,0x78, +0x7B,0x86,0x88,0x82,0x84,0x89,0x8C,0x86,0x82,0x7F,0x7D,0x87,0x8D,0x83,0x75,0x79, +0x84,0x87,0x85,0x6F,0x69,0x73,0x79,0x7A,0x79,0x79,0x72,0x6C,0x75,0x82,0x85,0x8B, +0x90,0x92,0x98,0x9E,0x9A,0x96,0x8C,0x7C,0x75,0x7B,0x7B,0x82,0x87,0x7C,0x79,0x7C, +0x7D,0x7B,0x7C,0x79,0x71,0x6D,0x6A,0x6D,0x78,0x8D,0x9E,0x9D,0x92,0x85,0x74,0x6F, +0x70,0x73,0x78,0x7A,0x7C,0x8B,0x8F,0x87,0x7B,0x7E,0x7E,0x7A,0x82,0x84,0x7D,0x7B, +0x81,0x88,0x8B,0x85,0x7D,0x73,0x6C,0x63,0x5F,0x6B,0x79,0x83,0x89,0x8B,0x86,0x81, +0x8A,0x93,0x8F,0x83,0x77,0x7A,0x82,0x88,0x8C,0x86,0x80,0x7E,0x83,0x8C,0x8D,0x8B, +0x8E,0x86,0x77,0x75,0x7A,0x79,0x76,0x7B,0x7D,0x7D,0x80,0x84,0x83,0x78,0x73,0x79, +0x74,0x6B,0x69,0x7A,0x86,0x83,0x81,0x83,0x93,0x91,0x7B,0x7A,0x85,0x8D,0x87,0x7D, +0x82,0x82,0x73,0x6A,0x7C,0x8D,0x8D,0x83,0x7B,0x7D,0x80,0x83,0x7E,0x7F,0x86,0x7E, +0x79,0x7C,0x7D,0x7B,0x79,0x7B,0x83,0x87,0x7F,0x7C,0x70,0x66,0x75,0x7A,0x6B,0x68, +0x77,0x85,0x86,0x86,0x8C,0x91,0x8A,0x88,0x92,0x92,0x88,0x85,0x7C,0x70,0x71,0x84, +0x8F,0x8F,0x95,0x8B,0x82,0x89,0x96,0x94,0x91,0x91,0x8A,0x77,0x69,0x6A,0x74,0x88, +0x91,0x87,0x7F,0x7F,0x83,0x80,0x7D,0x7F,0x83,0x8A,0x87,0x7B,0x7C,0x7F,0x76,0x83, +0x94,0x96,0x91,0x8E,0x89,0x82,0x81,0x8C,0x8D,0x86,0x85,0x81,0x85,0x90,0x98,0x96, +0x8D,0x89,0x80,0x77,0x72,0x6D,0x6A,0x5C,0x58,0x65,0x73,0x7C,0x7F,0x80,0x81,0x82, +0x79,0x69,0x70,0x87,0x8A,0x88,0x84,0x7C,0x7D,0x8D,0x99,0x90,0x81,0x70,0x69,0x75, +0x7F,0x7F,0x78,0x7A,0x89,0x8C,0x84,0x7D,0x7A,0x74,0x75,0x7C,0x81,0x82,0x7C,0x75, +0x73,0x71,0x6F,0x73,0x71,0x6C,0x66,0x67,0x69,0x66,0x6F,0x81,0x8C,0x87,0x7E,0x82, +0x8C,0x94,0x98,0x8B,0x84,0x8D,0x8C,0x7F,0x82,0x8A,0x8D,0x8E,0x8F,0x99,0x95,0x84, +0x81,0x89,0x89,0x7C,0x6E,0x6D,0x6F,0x7C,0x89,0x7E,0x73,0x6E,0x6A,0x77,0x87,0x89, +0x83,0x89,0x97,0x9A,0x92,0x90,0x8F,0x85,0x7B,0x76,0x75,0x7B,0x81,0x83,0x7E,0x80, +0x80,0x83,0x87,0x8A,0x8D,0x8E,0x82,0x71,0x6E,0x74,0x7A,0x7B,0x76,0x7A,0x85,0x81, +0x6F,0x69,0x6B,0x70,0x79,0x76,0x6D,0x69,0x74,0x83,0x89,0x80,0x82,0x8B,0x8C,0x88, +0x7F,0x83,0x91,0x8F,0x8B,0x8F,0x8A,0x7A,0x77,0x81,0x7D,0x77,0x7E,0x86,0x89,0x7C, +0x71,0x7C,0x86,0x84,0x7F,0x79,0x74,0x75,0x76,0x79,0x79,0x7A,0x7E,0x7E,0x88,0x8C, +0x87,0x8E,0x8E,0x85,0x81,0x85,0x8C,0x8B,0x88,0x8F,0x99,0x96,0x91,0x94,0x9C,0x94, +0x87,0x85,0x84,0x7E,0x76,0x70,0x6F,0x72,0x74,0x70,0x79,0x8B,0x8C,0x83,0x85,0x8A, +0x83,0x78,0x73,0x78,0x7C,0x7B,0x7D,0x82,0x86,0x8B,0x8F,0x94,0x93,0x8D,0x86,0x85, +0x86,0x7E,0x73,0x6B,0x75,0x87,0x83,0x77,0x7C,0x86,0x87,0x78,0x71,0x7B,0x7B,0x79, +0x7A,0x75,0x77,0x72,0x6C,0x6B,0x71,0x7A,0x79,0x7C,0x7D,0x78,0x79,0x76,0x73,0x73, +0x75,0x78,0x75,0x77,0x7D,0x7D,0x83,0x88,0x92,0x95,0x8C,0x88,0x8A,0x8C,0x8B,0x83, +0x82,0x86,0x82,0x7B,0x78,0x7B,0x7E,0x82,0x7E,0x7A,0x7D,0x7C,0x74,0x71,0x70,0x71, +0x80,0x88,0x76,0x76,0x93,0x94,0x83,0x7D,0x81,0x80,0x7F,0x80,0x81,0x89,0x91,0x91, +0x94,0x9B,0x97,0x8D,0x8D,0x82,0x70,0x78,0x8A,0x86,0x79,0x78,0x7E,0x86,0x83,0x7F, +0x80,0x88,0x87,0x7F,0x7E,0x87,0x8B,0x7D,0x6F,0x78,0x8D,0x90,0x87,0x82,0x85,0x85, +0x79,0x77,0x80,0x87,0x8D,0x86,0x74,0x77,0x89,0x8E,0x87,0x81,0x7A,0x7D,0x8A,0x8E, +0x82,0x7D,0x7D,0x74,0x6C,0x6D,0x74,0x73,0x6F,0x6B,0x73,0x72,0x68,0x72,0x7C,0x77, +0x72,0x7F,0x8F,0x8F,0x77,0x68,0x71,0x7E,0x7B,0x7D,0x82,0x82,0x7D,0x83,0x8B,0x90, +0x8B,0x83,0x84,0x84,0x87,0x79,0x67,0x6E,0x7B,0x7F,0x7A,0x78,0x81,0x86,0x83,0x7A, +0x73,0x7D,0x88,0x85,0x7E,0x81,0x89,0x8C,0x90,0x92,0x84,0x7E,0x85,0x87,0x81,0x7C, +0x7C,0x74,0x6E,0x6F,0x74,0x88,0x97,0x8E,0x80,0x7D,0x85,0x89,0x81,0x7B,0x81,0x87, +0x86,0x8B,0x99,0x9F,0x93,0x88,0x87,0x86,0x82,0x8A,0x8D,0x7E,0x7B,0x81,0x88,0x8E, +0x83,0x74,0x7A,0x7A,0x71,0x6F,0x74,0x77,0x7A,0x7D,0x7F,0x7F,0x79,0x73,0x76,0x7C, +0x76,0x75,0x82,0x94,0x95,0x8D,0x8D,0x82,0x78,0x75,0x7D,0x8B,0x8D,0x88,0x8A,0x92, +0x9E,0x97,0x7A,0x71,0x7B,0x82,0x83,0x7E,0x7E,0x79,0x78,0x7A,0x7A,0x7E,0x7F,0x74, +0x76,0x80,0x87,0x8E,0x8A,0x7D,0x7A,0x77,0x76,0x73,0x67,0x6B,0x77,0x7E,0x81,0x81, +0x83,0x8B,0x8D,0x81,0x75,0x78,0x7F,0x7E,0x82,0x84,0x86,0x91,0x95,0x8B,0x88,0x8D, +0x92,0x86,0x74,0x73,0x77,0x7B,0x83,0x81,0x72,0x6E,0x7A,0x80,0x7E,0x75,0x7A,0x80, +0x79,0x7D,0x7E,0x77,0x77,0x78,0x7F,0x7C,0x78,0x83,0x91,0x91,0x92,0x93,0x91,0x8B, +0x7E,0x7A,0x77,0x71,0x78,0x7E,0x81,0x88,0x85,0x7A,0x7E,0x83,0x73,0x6B,0x70,0x71, +0x73,0x7D,0x7E,0x7B,0x7B,0x74,0x6E,0x71,0x79,0x7E,0x80,0x81,0x7D,0x77,0x7E,0x7D, +0x81,0x8A,0x82,0x7A,0x83,0x87,0x7F,0x81,0x81,0x7C,0x7B,0x81,0x8B,0x90,0x8D,0x83, +0x7A,0x79,0x7A,0x82,0x90,0x92,0x8F,0x95,0x97,0x8A,0x77,0x6E,0x72,0x73,0x76,0x77, +0x7D,0x83,0x81,0x82,0x7F,0x83,0x8A,0x85,0x85,0x84,0x7F,0x7F,0x88,0x8F,0x8A,0x8E, +0x8D,0x89,0x8F,0x8D,0x89,0x94,0x92,0x89,0x8F,0x98,0x92,0x89,0x88,0x8A,0x84,0x7B, +0x78,0x73,0x78,0x7E,0x7A,0x76,0x75,0x79,0x71,0x6B,0x6E,0x6C,0x75,0x7F,0x7A,0x7D, +0x86,0x83,0x80,0x7F,0x79,0x76,0x74,0x74,0x74,0x7C,0x83,0x7C,0x7A,0x83,0x8B,0x82, +0x78,0x7B,0x87,0x8E,0x88,0x81,0x84,0x8B,0x87,0x7E,0x79,0x7E,0x7F,0x7D,0x7C,0x7D, +0x88,0x8A,0x7D,0x7C,0x7C,0x69,0x66,0x76,0x78,0x71,0x76,0x88,0x93,0x87,0x7D,0x82, +0x81,0x7A,0x7F,0x87,0x81,0x6B,0x66,0x7E,0x95,0x8F,0x79,0x6B,0x6F,0x72,0x69,0x6E, +0x84,0x8F,0x8C,0x8A,0x93,0x98,0x90,0x8A,0x84,0x7F,0x7B,0x7C,0x82,0x82,0x7D,0x7B, +0x7F,0x86,0x8D,0x8E,0x87,0x81,0x7D,0x7C,0x7A,0x83,0x8E,0x92,0x8E,0x89,0x87,0x86, +0x85,0x86,0x8A,0x8B,0x84,0x7D,0x80,0x7E,0x72,0x66,0x68,0x76,0x7D,0x81,0x8D,0x98, +0x96,0x87,0x83,0x8B,0x8D,0x8E,0x91,0x8E,0x86,0x7C,0x7C,0x86,0x87,0x82,0x81,0x82, +0x8B,0x8C,0x81,0x7E,0x7E,0x7A,0x70,0x6B,0x6B,0x72,0x78,0x75,0x75,0x76,0x71,0x66, +0x62,0x6B,0x79,0x81,0x83,0x7F,0x7A,0x7F,0x86,0x82,0x82,0x8C,0x8F,0x88,0x82,0x82, +0x83,0x82,0x7F,0x81,0x7C,0x75,0x80,0x8A,0x90,0x8E,0x7D,0x6F,0x67,0x6D,0x7A,0x7F, +0x7C,0x7E,0x86,0x7F,0x74,0x77,0x81,0x7B,0x69,0x6A,0x75,0x79,0x78,0x74,0x73,0x7F, +0x91,0x94,0x88,0x7C,0x74,0x76,0x78,0x78,0x7D,0x88,0x8C,0x8C,0x8D,0x93,0x9D,0x97, +0x8A,0x83,0x85,0x85,0x80,0x85,0x8C,0x8D,0x90,0x8C,0x84,0x7D,0x77,0x75,0x72,0x70, +0x70,0x71,0x76,0x8A,0x8F,0x82,0x7B,0x74,0x71,0x77,0x82,0x82,0x80,0x85,0x8D,0x91, +0x8A,0x82,0x89,0x98,0x99,0x90,0x8C,0x8F,0x97,0x8F,0x7D,0x7D,0x7F,0x7B,0x70,0x68, +0x6F,0x7A,0x81,0x87,0x86,0x85,0x7E,0x77,0x72,0x70,0x6E,0x6D,0x74,0x79,0x81,0x8C, +0x8E,0x88,0x86,0x8A,0x85,0x7B,0x74,0x74,0x7B,0x84,0x8C,0x88,0x86,0x8C,0x90,0x92, +0x8C,0x88,0x85,0x85,0x8D,0x89,0x76,0x71,0x79,0x78,0x73,0x75,0x7F,0x86,0x86,0x88, +0x80,0x73,0x69,0x65,0x6B,0x73,0x73,0x72,0x75,0x75,0x73,0x76,0x85,0x92,0x8B,0x7C, +0x7A,0x82,0x83,0x7E,0x80,0x86,0x88,0x8C,0x8F,0x8D,0x87,0x80,0x80,0x85,0x89,0x8E, +0x96,0x98,0x8E,0x83,0x7C,0x80,0x89,0x88,0x81,0x7E,0x7D,0x76,0x6B,0x6D,0x76,0x75, +0x75,0x75,0x77,0x7A,0x77,0x72,0x79,0x7D,0x71,0x70,0x81,0x8C,0x85,0x7E,0x7D,0x7F, +0x80,0x83,0x87,0x85,0x83,0x87,0x95,0xA1,0x9E,0x90,0x84,0x89,0x8D,0x8C,0x8C,0x8A, +0x8C,0x8B,0x86,0x7E,0x74,0x6B,0x67,0x6A,0x6D,0x70,0x75,0x74,0x75,0x7D,0x75,0x66, +0x67,0x71,0x6C,0x66,0x73,0x84,0x88,0x8A,0x8B,0x89,0x8F,0x8E,0x7F,0x76,0x74,0x7B, +0x8C,0x92,0x94,0x95,0x92,0x96,0x98,0x96,0x8C,0x86,0x81,0x78,0x72,0x6D,0x72,0x7F, +0x81,0x83,0x84,0x81,0x81,0x84,0x85,0x7D,0x72,0x71,0x73,0x73,0x76,0x79,0x77,0x71, +0x7B,0x89,0x82,0x7C,0x7D,0x79,0x80,0x81,0x7D,0x82,0x91,0x9A,0x97,0x94,0x9B,0x9D, +0x9C,0x8D,0x83,0x8A,0x7D,0x73,0x79,0x83,0x83,0x7E,0x81,0x7D,0x79,0x7C,0x73,0x71, +0x76,0x6C,0x63,0x69,0x6D,0x6C,0x76,0x7F,0x7E,0x79,0x7C,0x75,0x73,0x70,0x6D,0x79, +0x85,0x7B,0x72,0x7D,0x91,0x95,0x90,0x8A,0x89,0x95,0x8E,0x89,0x96,0x93,0x89,0x8D, +0x91,0x88,0x83,0x84,0x7F,0x7F,0x7E,0x75,0x79,0x89,0x8A,0x84,0x78,0x6E,0x6C,0x69, +0x61,0x57,0x61,0x6D,0x73,0x82,0x89,0x85,0x86,0x89,0x8E,0x8C,0x89,0x8B,0x88,0x8F, +0x93,0x94,0x9A,0x93,0x83,0x85,0x8A,0x8C,0x87,0x86,0x7D,0x7F,0x8F,0x90,0x92,0x9B, +0x94,0x87,0x82,0x83,0x83,0x84,0x85,0x79,0x7A,0x77,0x6D,0x70,0x77,0x74,0x6F,0x6F, +0x72,0x75,0x7D,0x7E,0x81,0x93,0x84,0x74,0x7A,0x7F,0x7F,0x80,0x7E,0x82,0x85,0x85, +0x7F,0x7E,0x86,0x81,0x81,0x7F,0x7F,0x86,0x8C,0x89,0x7F,0x7A,0x79,0x75,0x76,0x76, +0x76,0x77,0x73,0x70,0x60,0x63,0x72,0x73,0x6C,0x68,0x6A,0x71,0x78,0x81,0x87,0x83, +0x7E,0x88,0x8C,0x85,0x84,0x8A,0x87,0x7F,0x83,0x8D,0x93,0x90,0x94,0x92,0x85,0x82, +0x8A,0x93,0x90,0x82,0x7F,0x7B,0x79,0x81,0x7E,0x7D,0x7F,0x84,0x83,0x7F,0x86,0x7D, +0x6F,0x72,0x77,0x81,0x88,0x84,0x83,0x87,0x8A,0x7F,0x7A,0x7C,0x7D,0x83,0x83,0x6F, +0x6F,0x7E,0x91,0x94,0x89,0x8E,0x94,0x92,0x86,0x85,0x91,0x88,0x77,0x7B,0x83,0x84, +0x77,0x7A,0x80,0x7A,0x74,0x79,0x7E,0x77,0x6F,0x74,0x72,0x6D,0x77,0x7F,0x84,0x87, +0x86,0x85,0x83,0x7C,0x77,0x7C,0x82,0x7E,0x7A,0x79,0x83,0x8C,0x8C,0x8A,0x7F,0x76, +0x76,0x7C,0x80,0x7F,0x7D,0x81,0x82,0x83,0x83,0x85,0x86,0x7E,0x7B,0x82,0x79,0x79, +0x83,0x82,0x7B,0x78,0x7D,0x82,0x84,0x78,0x6E,0x6E,0x79,0x7B,0x77,0x71,0x72,0x82, +0x8F,0x88,0x7F,0x81,0x8D,0x90,0x8D,0x80,0x75,0x82,0x87,0x7B,0x72,0x7C,0x85,0x89, +0x8A,0x88,0x82,0x87,0x89,0x81,0x7E,0x84,0x8A,0x8E,0x93,0x90,0x91,0x91,0x85,0x83, +0x8A,0x89,0x8F,0x8F,0x81,0x7B,0x83,0x89,0x86,0x7A,0x70,0x6B,0x6A,0x6C,0x6E,0x7C, +0x87,0x89,0x84,0x81,0x84,0x84,0x81,0x81,0x84,0x8D,0x8E,0x87,0x7E,0x7A,0x82,0x8F, +0x90,0x82,0x79,0x7F,0x86,0x82,0x7D,0x84,0x8F,0x8F,0x8C,0x8B,0x8B,0x7D,0x75,0x72, +0x6A,0x66,0x61,0x5C,0x5B,0x5E,0x5F,0x69,0x77,0x7B,0x79,0x7A,0x79,0x7E,0x86,0x86, +0x85,0x8A,0x90,0x94,0x97,0x9B,0x99,0x91,0x85,0x83,0x8C,0x88,0x79,0x71,0x74,0x72, +0x6E,0x77,0x83,0x82,0x81,0x81,0x80,0x82,0x7C,0x7B,0x7D,0x74,0x75,0x7C,0x7D,0x80, +0x7A,0x74,0x7E,0x8A,0x87,0x7E,0x7E,0x85,0x85,0x81,0x82,0x86,0x81,0x7C,0x79,0x79, +0x7C,0x79,0x80,0x8B,0x8A,0x84,0x86,0x8F,0x94,0x91,0x90,0x90,0x90,0x8D,0x86,0x80, +0x7C,0x80,0x84,0x82,0x84,0x81,0x7D,0x75,0x6B,0x6D,0x69,0x6B,0x75,0x77,0x74,0x77, +0x82,0x89,0x82,0x7C,0x7D,0x88,0x91,0x8C,0x78,0x6D,0x71,0x75,0x79,0x7E,0x7E,0x7B, +0x7E,0x80,0x7F,0x85,0x8F,0x9B,0x9E,0x91,0x86,0x8C,0x93,0x88,0x7B,0x74,0x7A,0x83, +0x83,0x7F,0x7E,0x7E,0x80,0x79,0x71,0x75,0x7F,0x79,0x6F,0x73,0x7A,0x7B,0x7E,0x85, +0x84,0x7F,0x7D,0x79,0x79,0x82,0x85,0x86,0x8F,0x95,0x90,0x8D,0x96,0x92,0x83,0x7E, +0x72,0x6E,0x7C,0x82,0x84,0x8D,0x92,0x8F,0x8B,0x88,0x7B,0x73,0x77,0x71,0x62,0x64, +0x72,0x71,0x6F,0x73,0x7A,0x79,0x78,0x77,0x7C,0x86,0x8A,0x87,0x81,0x7E,0x85,0x89, +0x8A,0x8C,0x90,0x91,0x8D,0x85,0x83,0x87,0x8C,0x8B,0x8A,0x85,0x78,0x71,0x71,0x75, +0x7A,0x7F,0x84,0x81,0x7F,0x82,0x83,0x80,0x79,0x7B,0x83,0x79,0x6F,0x6F,0x76,0x7E, +0x82,0x7D,0x70,0x69,0x75,0x83,0x8C,0x8B,0x84,0x8B,0x93,0x91,0x83,0x78,0x7D,0x85, +0x91,0x9A,0x92,0x8D,0x91,0x94,0x97,0x96,0x8D,0x7C,0x69,0x6D,0x7E,0x84,0x89,0x8F, +0x8A,0x7F,0x7B,0x7A,0x7A,0x76,0x6B,0x5F,0x5C,0x60,0x6E,0x7C,0x7C,0x77,0x78,0x7E, +0x81,0x83,0x83,0x7C,0x80,0x8F,0x8F,0x88,0x8F,0x9A,0xA0,0xA0,0x96,0x87,0x7E,0x7E, +0x7A,0x7A,0x84,0x83,0x7D,0x84,0x84,0x76,0x6F,0x80,0x90,0x89,0x76,0x6D,0x70,0x72, +0x70,0x75,0x7A,0x77,0x6C,0x6A,0x71,0x73,0x75,0x79,0x80,0x86,0x85,0x8A,0x89,0x85, +0x87,0x86,0x84,0x8D,0x92,0x81,0x6E,0x70,0x80,0x8A,0x85,0x7C,0x74,0x74,0x77,0x75, +0x77,0x7F,0x7B,0x77,0x7A,0x77,0x76,0x84,0x91,0x93,0x7E,0x6C,0x74,0x80,0x7E,0x7C, +0x7E,0x7B,0x6E,0x6A,0x74,0x7A,0x84,0x8B,0x8C,0x86,0x80,0x8D,0x94,0x8C,0x8A,0x89, +0x7F,0x78,0x7F,0x8D,0x90,0x84,0x74,0x73,0x7B,0x82,0x87,0x8A,0x8E,0x8B,0x90,0x98, +0x94,0x88,0x85,0x87,0x83,0x7C,0x79,0x81,0x83,0x7A,0x75,0x7A,0x82,0x7D,0x7B,0x75, +0x69,0x6A,0x73,0x7E,0x8B,0x8F,0x93,0x93,0x8F,0x88,0x84,0x89,0x8A,0x87,0x7F,0x7A, +0x88,0x94,0x90,0x88,0x7F,0x7C,0x7D,0x7E,0x84,0x84,0x80,0x7C,0x82,0x8A,0x85,0x84, +0x88,0x82,0x7B,0x82,0x89,0x83,0x7F,0x81,0x7B,0x73,0x78,0x7D,0x78,0x6D,0x6C,0x76, +0x7E,0x82,0x7C,0x72,0x73,0x76,0x74,0x74,0x7B,0x81,0x7E,0x82,0x8D,0x89,0x83,0x82, +0x84,0x85,0x7D,0x76,0x6F,0x6E,0x7C,0x82,0x81,0x82,0x82,0x80,0x7C,0x7F,0x87,0x87, +0x81,0x7B,0x76,0x7A,0x83,0x85,0x85,0x82,0x81,0x82,0x83,0x82,0x80,0x85,0x8B,0x8B, +0x82,0x76,0x71,0x6D,0x72,0x75,0x73,0x79,0x84,0x87,0x85,0x7B,0x76,0x7C,0x84,0x89, +0x82,0x78,0x77,0x75,0x76,0x83,0x88,0x82,0x83,0x84,0x83,0x87,0x8C,0x8A,0x84,0x79, +0x75,0x81,0x84,0x80,0x85,0x8D,0x8E,0x8E,0x8C,0x85,0x7F,0x82,0x85,0x87,0x86,0x7C, +0x7D,0x83,0x82,0x82,0x7E,0x78,0x76,0x7B,0x7F,0x80,0x8A,0x93,0x8D,0x82,0x7E,0x85, +0x93,0x98,0x8F,0x8F,0x8C,0x8B,0x8C,0x89,0x83,0x78,0x79,0x7A,0x71,0x6B,0x6E,0x77, +0x78,0x7B,0x88,0x8A,0x82,0x7B,0x79,0x7B,0x7B,0x78,0x7D,0x80,0x7C,0x75,0x72,0x75, +0x7B,0x87,0x86,0x7C,0x7B,0x7D,0x79,0x79,0x82,0x82,0x75,0x72,0x7D,0x91,0xA1,0xA2, +0x95,0x84,0x79,0x78,0x77,0x70,0x6A,0x66,0x66,0x69,0x69,0x6A,0x76,0x80,0x77,0x6F, +0x73,0x71,0x71,0x77,0x7F,0x86,0x88,0x83,0x83,0x86,0x89,0x8C,0x87,0x8A,0x8B,0x88, +0x7F,0x78,0x81,0x8D,0x8C,0x84,0x83,0x87,0x89,0x88,0x8C,0x92,0x92,0x8B,0x84,0x80, +0x82,0x81,0x7D,0x76,0x77,0x78,0x70,0x70,0x7D,0x8A,0x89,0x89,0x86,0x7A,0x75,0x7A, +0x7D,0x7D,0x7F,0x87,0x8E,0x83,0x78,0x7E,0x8B,0x99,0x9F,0x99,0x92,0x8C,0x82,0x7C, +0x7F,0x82,0x80,0x80,0x85,0x8C,0x8A,0x87,0x8F,0x8A,0x7B,0x70,0x6D,0x6D,0x72,0x75, +0x76,0x7B,0x82,0x85,0x82,0x7F,0x82,0x85,0x87,0x7A,0x68,0x6C,0x7D,0x81,0x7D,0x80, +0x85,0x86,0x84,0x7B,0x78,0x7C,0x7A,0x79,0x81,0x89,0x91,0x93,0x92,0x92,0x8F,0x8D, +0x8D,0x8D,0x88,0x80,0x78,0x7B,0x88,0x85,0x7B,0x71,0x6B,0x71,0x7A,0x78,0x6A,0x62, +0x66,0x6C,0x73,0x81,0x87,0x86,0x86,0x7F,0x7A,0x7A,0x7D,0x83,0x87,0x88,0x88,0x8A, +0x93,0x9A,0x94,0x86,0x7F,0x80,0x81,0x83,0x83,0x7C,0x77,0x78,0x7B,0x80,0x8B,0x91, +0x8A,0x7F,0x6D,0x60,0x65,0x72,0x6F,0x6C,0x70,0x74,0x7C,0x7F,0x81,0x80,0x7B,0x74, +0x70,0x72,0x72,0x6E,0x74,0x79,0x79,0x84,0x94,0x98,0x95,0x95,0x95,0x93,0x90,0x8A, +0x88,0x8C,0x89,0x81,0x7D,0x79,0x79,0x85,0x8C,0x84,0x79,0x76,0x7B,0x82,0x85,0x7F, +0x76,0x73,0x71,0x72,0x7B,0x82,0x7B,0x71,0x78,0x7D,0x78,0x73,0x72,0x7B,0x7E,0x7D, +0x82,0x83,0x82,0x8A,0x8F,0x92,0x95,0x96,0x97,0x96,0x9A,0x9D,0x96,0x8A,0x7F,0x76, +0x78,0x84,0x88,0x84,0x80,0x80,0x83,0x85,0x7D,0x74,0x71,0x75,0x76,0x77,0x7F,0x83, +0x86,0x8D,0x8F,0x8C,0x89,0x84,0x7F,0x7F,0x7B,0x7B,0x83,0x88,0x87,0x88,0x8A,0x86, +0x7A,0x6C,0x70,0x81,0x91,0x8B,0x77,0x78,0x87,0x8E,0x89,0x78,0x6A,0x65,0x6A,0x73, +0x78,0x79,0x78,0x7B,0x78,0x71,0x77,0x84,0x84,0x7A,0x72,0x6E,0x70,0x78,0x79,0x79, +0x81,0x8D,0x94,0x92,0x8D,0x8C,0x8D,0x8A,0x85,0x7F,0x78,0x77,0x7C,0x7C,0x71,0x6B, +0x73,0x7F,0x87,0x85,0x81,0x84,0x88,0x7D,0x72,0x71,0x71,0x71,0x71,0x7A,0x83,0x83, +0x8A,0x90,0x91,0x8E,0x88,0x87,0x92,0x93,0x80,0x78,0x84,0x85,0x7F,0x7E,0x82,0x86, +0x8B,0x8A,0x81,0x82,0x87,0x8A,0x8C,0x89,0x85,0x83,0x82,0x82,0x7E,0x7C,0x7C,0x80, +0x76,0x70,0x7C,0x86,0x7E,0x71,0x6E,0x72,0x7A,0x7C,0x80,0x95,0x9F,0x92,0x84,0x84, +0x8B,0x8E,0x8A,0x7F,0x7B,0x7E,0x7F,0x7C,0x7D,0x81,0x86,0x87,0x80,0x7A,0x76,0x70, +0x6E,0x72,0x75,0x7B,0x80,0x82,0x7B,0x7A,0x81,0x7D,0x73,0x70,0x78,0x7A,0x73,0x74, +0x81,0x90,0x97,0x8D,0x87,0x88,0x85,0x86,0x88,0x81,0x7F,0x82,0x82,0x88,0x8C,0x86, +0x81,0x84,0x85,0x85,0x79,0x6D,0x70,0x78,0x78,0x71,0x6F,0x76,0x7B,0x7B,0x73,0x70, +0x7B,0x7A,0x79,0x81,0x84,0x84,0x8C,0x91,0x8A,0x83,0x89,0x8D,0x84,0x7F,0x85,0x8C, +0x8F,0x88,0x83,0x88,0x8D,0x86,0x83,0x8C,0x89,0x80,0x7A,0x76,0x75,0x7F,0x86,0x7A, +0x75,0x7F,0x7F,0x80,0x84,0x82,0x7A,0x77,0x74,0x73,0x75,0x74,0x73,0x75,0x7B,0x7B, +0x81,0x84,0x85,0x8A,0x89,0x84,0x7A,0x6E,0x73,0x80,0x88,0x8B,0x91,0x95,0x8B,0x88, +0x89,0x81,0x7E,0x7E,0x7D,0x7D,0x7C,0x7E,0x78,0x77,0x75,0x74,0x7A,0x77,0x74,0x78, +0x77,0x77,0x7D,0x85,0x88,0x85,0x83,0x80,0x80,0x7E,0x7C,0x86,0x8E,0x8A,0x85,0x82, +0x84,0x7A,0x71,0x70,0x72,0x7D,0x87,0x8F,0x94,0x8F,0x84,0x85,0x8D,0x91,0x90,0x91, +0x8C,0x83,0x87,0x87,0x83,0x89,0x88,0x82,0x7F,0x7A,0x7B,0x7A,0x75,0x75,0x7F,0x83, +0x7F,0x78,0x6E,0x5F,0x63,0x76,0x7B,0x7F,0x80,0x81,0x7F,0x85,0x8B,0x8D,0x92,0x8A, +0x7E,0x82,0x84,0x7F,0x84,0x8B,0x8B,0x8A,0x8F,0x8E,0x89,0x85,0x83,0x8A,0x90,0x7C, +0x69,0x76,0x84,0x7E,0x7C,0x7E,0x7C,0x81,0x80,0x7A,0x79,0x77,0x75,0x7B,0x7F,0x7C, +0x75,0x73,0x72,0x73,0x73,0x76,0x77,0x7D,0x86,0x84,0x86,0x88,0x85,0x84,0x7B,0x77, +0x7D,0x7E,0x81,0x84,0x84,0x88,0x91,0x97,0x95,0x91,0x8C,0x85,0x7E,0x7A,0x78,0x7A, +0x82,0x87,0x7F,0x79,0x7D,0x77,0x6D,0x73,0x7D,0x86,0x85,0x7E,0x7D,0x78,0x6E,0x67, +0x69,0x76,0x81,0x86,0x85,0x84,0x8D,0x90,0x84,0x7F,0x7E,0x7B,0x7C,0x7D,0x7F,0x83, +0x85,0x85,0x86,0x85,0x82,0x7C,0x75,0x71,0x70,0x70,0x7C,0x8B,0x8D,0x86,0x7B,0x79, +0x7E,0x75,0x72,0x7F,0x83,0x79,0x79,0x82,0x83,0x80,0x83,0x81,0x7F,0x7E,0x7B,0x83, +0x94,0x95,0x8A,0x8C,0x91,0x8C,0x8C,0x8E,0x8B,0x8B,0x8A,0x79,0x77,0x81,0x80,0x7F, +0x7D,0x78,0x75,0x74,0x76,0x7A,0x7E,0x7D,0x77,0x7B,0x84,0x87,0x88,0x85,0x7F,0x7A, +0x74,0x79,0x83,0x8A,0x87,0x85,0x86,0x7E,0x78,0x77,0x79,0x7F,0x89,0x8B,0x89,0x8B, +0x8D,0x8E,0x91,0x91,0x86,0x7D,0x7E,0x7F,0x82,0x88,0x8B,0x85,0x7F,0x7E,0x80,0x81, +0x77,0x71,0x6E,0x6D,0x77,0x80,0x7D,0x7B,0x81,0x82,0x83,0x86,0x84,0x7B,0x76,0x7F, +0x86,0x88,0x86,0x84,0x89,0x8B,0x7F,0x73,0x76,0x81,0x8B,0x8A,0x7F,0x79,0x7F,0x80, +0x78,0x77,0x7C,0x81,0x81,0x81,0x83,0x83,0x81,0x7F,0x7D,0x75,0x70,0x77,0x74,0x68, +0x6D,0x78,0x78,0x75,0x77,0x7D,0x84,0x81,0x76,0x76,0x7C,0x79,0x78,0x86,0x95,0x9B, +0x99,0x8F,0x82,0x7A,0x78,0x6D,0x64,0x70,0x7C,0x7C,0x7F,0x87,0x8B,0x8A,0x89,0x8E, +0x8D,0x89,0x82,0x7A,0x79,0x87,0x91,0x8B,0x86,0x86,0x86,0x85,0x81,0x75,0x79,0x8C, +0x87,0x78,0x78,0x7C,0x7B,0x77,0x73,0x78,0x7E,0x77,0x72,0x7E,0x8F,0x8E,0x89,0x8B, +0x8C,0x8A,0x85,0x85,0x85,0x86,0x8C,0x91,0x93,0x92,0x8D,0x87,0x81,0x7C,0x7F,0x78, +0x73,0x78,0x7A,0x7D,0x82,0x8B,0x8F,0x8D,0x8A,0x8B,0x8C,0x85,0x82,0x86,0x84,0x7A, +0x7D,0x83,0x86,0x7B,0x6A,0x62,0x5E,0x5E,0x60,0x68,0x74,0x78,0x79,0x7E,0x81,0x83, +0x89,0x8F,0x94,0x95,0x95,0x93,0x92,0x97,0x8B,0x7C,0x7D,0x80,0x82,0x80,0x7F,0x80, +0x85,0x84,0x7F,0x80,0x83,0x79,0x71,0x72,0x73,0x73,0x75,0x83,0x8B,0x7A,0x6E,0x6F, +0x6D,0x62,0x5F,0x6B,0x74,0x6E,0x6E,0x78,0x81,0x7F,0x73,0x76,0x83,0x87,0x87,0x88, +0x95,0x9A,0x96,0x91,0x95,0xA2,0x9A,0x87,0x7A,0x78,0x7A,0x7D,0x7E,0x83,0x8C,0x8E, +0x87,0x7A,0x76,0x6E,0x64,0x68,0x70,0x71,0x6D,0x72,0x7A,0x82,0x88,0x85,0x7D,0x79, +0x75,0x71,0x6F,0x73,0x7A,0x7F,0x8C,0x98,0x9A,0x99,0x97,0x91,0x8B,0x85,0x83,0x88, +0x91,0x8F,0x86,0x87,0x8D,0x8D,0x8C,0x8C,0x86,0x81,0x83,0x82,0x7A,0x76,0x72,0x6E, +0x6D,0x6D,0x70,0x74,0x76,0x76,0x77,0x7B,0x85,0x8B,0x8E,0x91,0x8A,0x83,0x7E,0x82, +0x94,0x9A,0x8E,0x88,0x92,0x97,0x8B,0x8A,0x97,0x9B,0x8E,0x82,0x80,0x7E,0x7A,0x7D, +0x78,0x7A,0x84,0x85,0x80,0x7E,0x7D,0x7D,0x7D,0x7E,0x7C,0x72,0x69,0x67,0x6A,0x70, +0x77,0x7D,0x7C,0x7A,0x7F,0x89,0x87,0x7A,0x77,0x7E,0x7E,0x80,0x82,0x86,0x8B,0x8D, +0x90,0x91,0x8E,0x8D,0x87,0x84,0x81,0x7D,0x75,0x6C,0x71,0x7A,0x7D,0x7C,0x77,0x71, +0x6A,0x65,0x63,0x69,0x73,0x7C,0x7E,0x76,0x71,0x78,0x79,0x79,0x81,0x86,0x84,0x83, +0x7D,0x73,0x75,0x85,0x8D,0x84,0x7C,0x7B,0x7F,0x80,0x80,0x80,0x86,0x8E,0x8D,0x8D, +0x8F,0x88,0x7E,0x7D,0x83,0x8B,0x8A,0x7F,0x79,0x78,0x76,0x75,0x79,0x7B,0x73,0x6C, +0x6E,0x7A,0x85,0x8B,0x8B,0x85,0x84,0x88,0x89,0x8A,0x8D,0x85,0x7F,0x7D,0x83,0x88, +0x83,0x7F,0x87,0x90,0x8E,0x88,0x86,0x8B,0x93,0x91,0x87,0x7F,0x81,0x88,0x8A,0x89, +0x85,0x81,0x7C,0x79,0x77,0x7B,0x82,0x88,0x8B,0x87,0x7F,0x78,0x76,0x79,0x7D,0x7D, +0x80,0x83,0x82,0x7E,0x7B,0x7C,0x83,0x83,0x81,0x81,0x80,0x80,0x84,0x81,0x77,0x79, +0x7D,0x7F,0x81,0x80,0x84,0x86,0x81,0x81,0x80,0x81,0x7A,0x69,0x68,0x7A,0x8F,0x97, +0x90,0x8A,0x87,0x86,0x81,0x7B,0x78,0x6C,0x6D,0x7C,0x80,0x79,0x7A,0x86,0x8A,0x7F, +0x76,0x7A,0x7B,0x6E,0x64,0x74,0x86,0x85,0x80,0x83,0x88,0x8A,0x86,0x7A,0x6F,0x74, +0x7E,0x85,0x8A,0x8B,0x85,0x80,0x81,0x84,0x8A,0x84,0x7F,0x81,0x80,0x76,0x73,0x7E, +0x89,0x8C,0x87,0x7F,0x82,0x88,0x84,0x7B,0x78,0x7B,0x7B,0x78,0x77,0x74,0x73,0x75, +0x74,0x72,0x75,0x79,0x7D,0x80,0x7E,0x7C,0x83,0x8E,0x93,0x96,0x92,0x92,0x94,0x8C, +0x89,0x8A,0x88,0x81,0x7C,0x80,0x8B,0x87,0x7C,0x78,0x77,0x73,0x74,0x7F,0x80,0x79, +0x76,0x74,0x77,0x80,0x84,0x84,0x83,0x7E,0x73,0x70,0x79,0x80,0x81,0x7F,0x84,0x8B, +0x82,0x76,0x7B,0x8C,0x94,0x8C,0x86,0x82,0x84,0x87,0x8B,0x93,0x91,0x8A,0x88,0x88, +0x86,0x84,0x83,0x85,0x7F,0x76,0x76,0x7D,0x84,0x89,0x84,0x85,0x88,0x83,0x83,0x88, +0x87,0x7D,0x7A,0x7C,0x7B,0x75,0x75,0x7D,0x83,0x83,0x7F,0x86,0x8C,0x84,0x79,0x7A, +0x84,0x87,0x89,0x8C,0x86,0x7A,0x72,0x73,0x79,0x82,0x83,0x7F,0x81,0x80,0x7B,0x78, +0x79,0x7A,0x74,0x6E,0x71,0x71,0x6A,0x64,0x69,0x7A,0x86,0x81,0x76,0x73,0x7A,0x7E, +0x76,0x73,0x7A,0x85,0x87,0x89,0x8D,0x87,0x7E,0x80,0x7D,0x7B,0x85,0x89,0x8A,0x88, +0x84,0x80,0x7E,0x88,0x86,0x7A,0x80,0x88,0x86,0x80,0x7E,0x84,0x84,0x7D,0x74,0x73, +0x76,0x71,0x68,0x6A,0x7B,0x87,0x89,0x83,0x7F,0x7F,0x82,0x83,0x82,0x84,0x85,0x7E, +0x77,0x7B,0x88,0x92,0xA1,0xA4,0x98,0x90,0x90,0x89,0x80,0x7C,0x7B,0x7C,0x82,0x85, +0x83,0x87,0x88,0x84,0x7E,0x7B,0x7E,0x7D,0x79,0x79,0x79,0x82,0x8F,0x90,0x8A,0x83, +0x7D,0x80,0x82,0x77,0x6D,0x6F,0x76,0x7B,0x80,0x82,0x84,0x89,0x87,0x7D,0x83,0x8C, +0x8A,0x7E,0x74,0x73,0x7D,0x87,0x86,0x80,0x83,0x87,0x89,0x87,0x87,0x85,0x7E,0x79, +0x79,0x7A,0x7E,0x82,0x7D,0x76,0x78,0x84,0x8E,0x90,0x83,0x7A,0x7C,0x7D,0x76,0x7D, +0x86,0x82,0x79,0x78,0x76,0x73,0x77,0x79,0x7D,0x80,0x82,0x86,0x90,0x95,0x94,0x89, +0x7E,0x78,0x79,0x7C,0x7B,0x80,0x83,0x87,0x87,0x84,0x83,0x81,0x77,0x77,0x83,0x84, +0x79,0x78,0x7D,0x7E,0x84,0x8D,0x89,0x82,0x81,0x7F,0x7F,0x7E,0x7E,0x7B,0x75,0x6C, +0x70,0x78,0x78,0x70,0x6B,0x74,0x7E,0x7D,0x79,0x7C,0x81,0x8D,0x92,0x8E,0x8A,0x88, +0x82,0x7A,0x76,0x7C,0x83,0x81,0x7E,0x84,0x90,0x91,0x8E,0x8B,0x81,0x76,0x6D,0x73, +0x7D,0x7C,0x7A,0x75,0x74,0x77,0x77,0x7E,0x84,0x81,0x79,0x6D,0x68,0x67,0x6A,0x7F, +0x8B,0x84,0x80,0x84,0x85,0x8A,0x92,0x90,0x88,0x89,0x85,0x7B,0x77,0x7D,0x85,0x88, +0x8B,0x8B,0x85,0x85,0x7B,0x7E,0x98,0xA0,0x98,0x99,0x9A,0x8D,0x80,0x83,0x86,0x7F, +0x77,0x71,0x75,0x79,0x74,0x6C,0x65,0x6B,0x77,0x7A,0x7E,0x7E,0x7B,0x7B,0x7D,0x81, +0x84,0x89,0x8A,0x85,0x8A,0x90,0x86,0x82,0x89,0x83,0x7C,0x84,0x8B,0x89,0x8E,0x91, +0x8F,0x8E,0x8E,0x90,0x91,0x86,0x76,0x72,0x76,0x78,0x77,0x7F,0x87,0x89,0x80,0x75, +0x75,0x7A,0x7B,0x74,0x74,0x76,0x76,0x72,0x71,0x76,0x7B,0x7C,0x7B,0x7B,0x7D,0x78, +0x73,0x79,0x84,0x8A,0x87,0x85,0x82,0x80,0x86,0x8C,0x89,0x85,0x7F,0x7D,0x84,0x89, +0x86,0x85,0x83,0x7C,0x7B,0x80,0x7A,0x6D,0x67,0x6C,0x77,0x7D,0x7F,0x83,0x80,0x79, +0x7A,0x7A,0x7C,0x79,0x76,0x77,0x78,0x81,0x87,0x87,0x8A,0x92,0x94,0x8D,0x89,0x84, +0x7A,0x79,0x7C,0x7E,0x83,0x85,0x8A,0x91,0x8B,0x82,0x7F,0x82,0x82,0x7D,0x79,0x73, +0x72,0x77,0x7A,0x79,0x79,0x7E,0x80,0x7E,0x7A,0x71,0x76,0x83,0x85,0x80,0x7D,0x7F, +0x84,0x82,0x81,0x8C,0x98,0x98,0x89,0x7F,0x7D,0x85,0x8D,0x89,0x84,0x85,0x88,0x85, +0x7E,0x78,0x7C,0x83,0x7E,0x7A,0x88,0x93,0x8C,0x85,0x84,0x7E,0x81,0x82,0x7B,0x79, +0x75,0x72,0x78,0x7D,0x79,0x79,0x84,0x87,0x7C,0x79,0x84,0x85,0x85,0x82,0x7D,0x82, +0x85,0x86,0x8A,0x8D,0x8C,0x87,0x84,0x82,0x7A,0x7A,0x7C,0x80,0x83,0x88,0x8D,0x97, +0x97,0x8A,0x84,0x89,0x84,0x7A,0x75,0x73,0x77,0x75,0x6C,0x6D,0x78,0x7B,0x73,0x71, +0x7B,0x81,0x7D,0x75,0x6F,0x73,0x79,0x74,0x74,0x7C,0x7D,0x7E,0x8A,0x95,0x94,0x92, +0x8D,0x87,0x84,0x7C,0x78,0x7F,0x83,0x80,0x7A,0x7E,0x85,0x82,0x7C,0x7B,0x80,0x81, +0x7C,0x75,0x75,0x79,0x72,0x68,0x68,0x6C,0x6F,0x72,0x76,0x7F,0x84,0x85,0x83,0x7B, +0x79,0x78,0x78,0x7D,0x7F,0x7E,0x81,0x89,0x94,0x92,0x84,0x7F,0x80,0x7E,0x7A,0x7C, +0x81,0x84,0x81,0x79,0x79,0x88,0x93,0x90,0x8A,0x8F,0x95,0x8F,0x86,0x84,0x88,0x89, +0x85,0x80,0x7A,0x7A,0x7C,0x7D,0x7C,0x75,0x7A,0x85,0x85,0x7D,0x75,0x71,0x79,0x82, +0x82,0x85,0x8C,0x91,0x8C,0x88,0x89,0x8D,0x92,0x8F,0x89,0x84,0x7C,0x7B,0x86,0x8D, +0x8A,0x8A,0x8C,0x88,0x83,0x7E,0x7E,0x83,0x86,0x85,0x88,0x89,0x81,0x7B,0x7D,0x7D, +0x78,0x75,0x73,0x73,0x74,0x6E,0x6E,0x7C,0x86,0x86,0x82,0x7E,0x7F,0x80,0x7C,0x7D, +0x89,0x8C,0x88,0x89,0x8D,0x8A,0x86,0x89,0x8B,0x83,0x78,0x7C,0x81,0x7C,0x76,0x76, +0x7F,0x89,0x8A,0x88,0x85,0x83,0x7A,0x72,0x70,0x6F,0x6E,0x70,0x76,0x75,0x73,0x70, +0x6F,0x77,0x81,0x7D,0x78,0x7C,0x7F,0x7C,0x78,0x7A,0x82,0x87,0x8A,0x89,0x86,0x7D, +0x76,0x7D,0x86,0x85,0x7F,0x7B,0x76,0x76,0x75,0x75,0x7B,0x86,0x89,0x86,0x83,0x80, +0x7D,0x7B,0x7A,0x74,0x6D,0x6E,0x79,0x7E,0x7D,0x7C,0x82,0x86,0x8A,0x8A,0x88,0x87, +0x83,0x7D,0x7E,0x81,0x7F,0x77,0x70,0x77,0x82,0x88,0x85,0x81,0x84,0x8B,0x8D,0x87, +0x86,0x89,0x87,0x86,0x8A,0x8E,0x91,0x8F,0x8D,0x89,0x89,0x8B,0x86,0x81,0x75,0x68, +0x6A,0x72,0x77,0x7D,0x83,0x83,0x7B,0x76,0x79,0x82,0x89,0x88,0x89,0x8E,0x90,0x8B, +0x86,0x85,0x84,0x80,0x83,0x88,0x85,0x7E,0x7C,0x84,0x8B,0x8D,0x8B,0x8C,0x8E,0x8A, +0x80,0x7F,0x82,0x81,0x7E,0x7C,0x82,0x89,0x89,0x84,0x85,0x88,0x85,0x80,0x7C,0x74, +0x6D,0x6C,0x73,0x7D,0x81,0x7C,0x7A,0x7E,0x7D,0x76,0x77,0x79,0x77,0x78,0x79,0x81, +0x8A,0x8E,0x8F,0x8C,0x8C,0x8B,0x82,0x75,0x6E,0x6D,0x75,0x7B,0x7D,0x7E,0x80,0x83, +0x84,0x81,0x7C,0x7C,0x81,0x88,0x89,0x80,0x73,0x70,0x6E,0x6C,0x72,0x78,0x77,0x73, +0x74,0x74,0x71,0x6F,0x70,0x78,0x7F,0x85,0x85,0x82,0x80,0x7C,0x7E,0x86,0x88,0x86, +0x85,0x85,0x84,0x7F,0x7E,0x80,0x7E,0x7E,0x80,0x7C,0x78,0x7B,0x80,0x85,0x92,0x9C, +0x97,0x91,0x92,0x87,0x79,0x74,0x74,0x76,0x73,0x71,0x75,0x80,0x8A,0x8B,0x86,0x85, +0x84,0x7A,0x71,0x74,0x7A,0x7B,0x7D,0x83,0x8F,0x9B,0x9D,0x96,0x8D,0x83,0x7F,0x7D, +0x7D,0x84,0x88,0x87,0x86,0x86,0x8F,0x9D,0xA0,0x99,0x8D,0x7E,0x74,0x76,0x78,0x78, +0x7D,0x7F,0x7F,0x81,0x7F,0x76,0x76,0x7F,0x7D,0x78,0x7D,0x81,0x81,0x81,0x86,0x8B, +0x8A,0x86,0x82,0x79,0x72,0x73,0x76,0x7A,0x80,0x8A,0x91,0x92,0x8E,0x88,0x84,0x83, +0x82,0x81,0x85,0x87,0x81,0x77,0x76,0x7B,0x7F,0x7C,0x75,0x6E,0x68,0x6A,0x6C,0x6C, +0x6B,0x6C,0x72,0x78,0x7E,0x80,0x7F,0x83,0x83,0x7B,0x7A,0x7F,0x86,0x87,0x88,0x8E, +0x94,0x97,0x95,0x92,0x92,0x88,0x79,0x6F,0x6F,0x74,0x6E,0x71,0x7E,0x7D,0x7A,0x7E, +0x81,0x80,0x77,0x70,0x6B,0x6A,0x6E,0x6E,0x76,0x82,0x86,0x8A,0x8E,0x88,0x7F,0x7E, +0x83,0x81,0x7B,0x79,0x7F,0x82,0x7F,0x7A,0x77,0x7D,0x88,0x8A,0x8A,0x8D,0x8E,0x8B, +0x8B,0x8E,0x91,0x8A,0x7D,0x79,0x76,0x75,0x74,0x73,0x7D,0x86,0x86,0x83,0x7F,0x7B, +0x79,0x77,0x75,0x78,0x81,0x86,0x88,0x8D,0x8C,0x85,0x84,0x85,0x85,0x80,0x79,0x7A, +0x7B,0x7D,0x80,0x84,0x8B,0x8C,0x85,0x83,0x8D,0x94,0x90,0x8E,0x8C,0x85,0x82,0x82, +0x82,0x84,0x82,0x80,0x81,0x81,0x78,0x74,0x78,0x7F,0x84,0x85,0x82,0x80,0x7F,0x7F, +0x80,0x7E,0x7B,0x7B,0x7E,0x7E,0x7F,0x82,0x85,0x89,0x8B,0x88,0x85,0x86,0x89,0x8B, +0x85,0x80,0x7F,0x86,0x8F,0x95,0x96,0x93,0x87,0x80,0x7F,0x7D,0x76,0x72,0x6B,0x67, +0x69,0x6B,0x6E,0x72,0x75,0x76,0x7C,0x83,0x80,0x76,0x74,0x74,0x7A,0x82,0x81,0x7F, +0x82,0x82,0x7C,0x81,0x8F,0x8E,0x82,0x7B,0x75,0x71,0x74,0x7D,0x84,0x87,0x84,0x81, +0x81,0x7D,0x71,0x6F,0x74,0x77,0x77,0x73,0x75,0x82,0x83,0x7A,0x74,0x79,0x7E,0x7B, +0x7C,0x7E,0x84,0x8B,0x87,0x84,0x86,0x8B,0x87,0x7E,0x80,0x80,0x7B,0x7B,0x7B,0x80, +0x8A,0x8C,0x89,0x87,0x88,0x86,0x7D,0x7B,0x7F,0x84,0x83,0x85,0x8B,0x8B,0x8E,0x91, +0x88,0x77,0x6F,0x74,0x76,0x72,0x76,0x80,0x89,0x8F,0x89,0x7F,0x7C,0x7C,0x7E,0x7D, +0x7E,0x7E,0x79,0x77,0x78,0x7E,0x88,0x8C,0x8C,0x8C,0x8E,0x8D,0x83,0x7C,0x81,0x87, +0x89,0x82,0x80,0x7F,0x81,0x8C,0x91,0x8E,0x8A,0x8E,0x88,0x7C,0x74,0x73,0x75,0x76, +0x77,0x7C,0x80,0x7F,0x7D,0x80,0x82,0x7D,0x7A,0x83,0x85,0x7D,0x80,0x84,0x84,0x81, +0x83,0x85,0x88,0x83,0x78,0x78,0x7F,0x82,0x83,0x80,0x7D,0x83,0x83,0x7C,0x76,0x79, +0x81,0x8A,0x87,0x7C,0x7C,0x8A,0x8D,0x8A,0x86,0x7D,0x78,0x7A,0x74,0x6B,0x6A,0x70, +0x78,0x7A,0x7C,0x7C,0x88,0x8E,0x87,0x85,0x89,0x85,0x85,0x86,0x82,0x7D,0x80,0x7F, +0x7D,0x83,0x82,0x7B,0x7F,0x7C,0x74,0x75,0x76,0x75,0x70,0x74,0x79,0x79,0x7A,0x7B, +0x83,0x8F,0x8D,0x87,0x89,0x88,0x83,0x7C,0x77,0x76,0x7D,0x81,0x80,0x7C,0x7F,0x7F, +0x7E,0x7E,0x81,0x7F,0x7B,0x7C,0x7A,0x75,0x76,0x7D,0x83,0x85,0x82,0x87,0x8A,0x8A, +0x85,0x7F,0x7A,0x82,0x84,0x7F,0x7C,0x7E,0x85,0x82,0x82,0x7C,0x7B,0x7A,0x75,0x71, +0x7A,0x81,0x8B,0x8F,0x8D,0x83,0x7B,0x7D,0x7F,0x7D,0x81,0x88,0x8B,0x8A,0x88,0x8B, +0x88,0x89,0x80,0x83,0x8F,0x95,0x8D,0x85,0x80,0x82,0x87,0x8D,0x8F,0x87,0x7F,0x73, +0x72,0x73,0x76,0x81,0x8E,0x8B,0x82,0x75,0x75,0x78,0x7C,0x7F,0x7E,0x86,0x8B,0x85, +0x83,0x82,0x80,0x83,0x84,0x85,0x7F,0x82,0x7E,0x7D,0x84,0x84,0x80,0x87,0x8A,0x87, +0x84,0x8A,0x8E,0x82,0x7A,0x76,0x75,0x70,0x65,0x67,0x78,0x82,0x8A,0x88,0x85,0x80, +0x81,0x80,0x7A,0x7B,0x7D,0x7A,0x7C,0x78,0x72,0x78,0x7C,0x7C,0x78,0x7C,0x7A,0x75, +0x76,0x74,0x74,0x81,0x82,0x87,0x92,0x97,0x97,0x8D,0x82,0x78,0x7C,0x87,0x8B,0x88, +0x82,0x78,0x77,0x78,0x7C,0x7D,0x76,0x72,0x70,0x73,0x77,0x70,0x70,0x75,0x7A,0x85, +0x8A,0x8D,0x87,0x81,0x7C,0x78,0x73,0x74,0x75,0x78,0x79,0x7B,0x80,0x87,0x8F,0x8E, +0x88,0x8C,0x8E,0x85,0x80,0x7F,0x84,0x82,0x81,0x83,0x84,0x85,0x80,0x7A,0x7D,0x80, +0x7C,0x76,0x79,0x7E,0x7D,0x7D,0x7F,0x80,0x83,0x87,0x83,0x83,0x85,0x80,0x7B,0x7D, +0x84,0x8A,0x89,0x83,0x81,0x7F,0x7F,0x84,0x89,0x89,0x89,0x89,0x87,0x82,0x80,0x7D, +0x81,0x85,0x80,0x7B,0x7E,0x7E,0x81,0x87,0x86,0x83,0x81,0x81,0x82,0x80,0x7D,0x7E, +0x82,0x87,0x8A,0x89,0x87,0x85,0x81,0x84,0x89,0x8B,0x8B,0x8A,0x85,0x80,0x7E,0x7F, +0x81,0x7F,0x7B,0x76,0x7B,0x85,0x88,0x84,0x85,0x88,0x8D,0x8A,0x86,0x89,0x8A,0x81, +0x76,0x72,0x73,0x72,0x6B,0x6D,0x7A,0x82,0x81,0x7D,0x7C,0x7F,0x7D,0x74,0x70,0x71, +0x74,0x7D,0x88,0x8C,0x8A,0x86,0x87,0x8B,0x89,0x81,0x78,0x75,0x71,0x69,0x69,0x77, +0x82,0x85,0x87,0x88,0x86,0x86,0x7F,0x74,0x73,0x7A,0x7A,0x71,0x6F,0x70,0x72,0x7C, +0x83,0x81,0x7B,0x76,0x70,0x6D,0x71,0x73,0x78,0x80,0x84,0x87,0x8B,0x8F,0x8D,0x84, +0x7E,0x7F,0x82,0x80,0x7A,0x77,0x7E,0x87,0x89,0x88,0x87,0x81,0x79,0x79,0x7F,0x81, +0x7F,0x87,0x8F,0x90,0x8D,0x88,0x86,0x85,0x85,0x8A,0x8E,0x85,0x7C,0x79,0x7E,0x85, +0x84,0x7E,0x7F,0x85,0x85,0x82,0x7F,0x80,0x85,0x8B,0x8C,0x8D,0x8C,0x85,0x7F,0x7F, +0x80,0x7F,0x7B,0x7B,0x7E,0x7F,0x7E,0x7F,0x83,0x83,0x84,0x86,0x87,0x85,0x81,0x7E, +0x7B,0x7A,0x7D,0x84,0x8D,0x8F,0x8D,0x8F,0x90,0x8C,0x84,0x7E,0x7F,0x7F,0x7B,0x7A, +0x7F,0x81,0x81,0x82,0x84,0x81,0x78,0x71,0x70,0x6F,0x6A,0x6B,0x73,0x79,0x7B,0x7B, +0x7A,0x7B,0x7F,0x86,0x88,0x88,0x8D,0x8C,0x86,0x82,0x84,0x88,0x8C,0x8E,0x88,0x80, +0x77,0x76,0x7C,0x7C,0x79,0x78,0x7C,0x80,0x7C,0x7C,0x82,0x83,0x80,0x79,0x78,0x79, +0x77,0x79,0x7D,0x82,0x84,0x7F,0x79,0x75,0x70,0x6A,0x65,0x67,0x6E,0x73,0x7B,0x80, +0x80,0x7F,0x7E,0x82,0x87,0x8C,0x91,0x91,0x8C,0x84,0x85,0x88,0x87,0x86,0x86,0x86, +0x85,0x7E,0x7E,0x80,0x83,0x84,0x7E,0x77,0x73,0x70,0x70,0x73,0x75,0x79,0x7E,0x83, +0x89,0x89,0x88,0x82,0x76,0x70,0x74,0x79,0x7D,0x83,0x89,0x8D,0x93,0x94,0x8F,0x90, +0x8D,0x87,0x81,0x80,0x83,0x87,0x8D,0x8F,0x8A,0x88,0x87,0x89,0x87,0x81,0x7B,0x75, +0x71,0x6E,0x6F,0x76,0x79,0x7E,0x87,0x8A,0x87,0x86,0x86,0x83,0x7C,0x7A,0x7C,0x7F, +0x81,0x83,0x85,0x87,0x8B,0x91,0x94,0x97,0x96,0x91,0x88,0x7F,0x7E,0x87,0x91,0x92, +0x8D,0x8B,0x8A,0x83,0x7F,0x79,0x74,0x6F,0x67,0x63,0x6B,0x76,0x7C,0x81,0x84,0x81, +0x81,0x86,0x85,0x7E,0x75,0x71,0x73,0x77,0x78,0x7B,0x81,0x85,0x84,0x82,0x82,0x85, +0x84,0x7F,0x7D,0x7E,0x7F,0x7C,0x7D,0x86,0x8B,0x89,0x86,0x82,0x80,0x7C,0x7A,0x7B, +0x77,0x6E,0x68,0x6A,0x6F,0x6F,0x6D,0x6C,0x6E,0x71,0x73,0x78,0x7B,0x7E,0x7F,0x7D, +0x81,0x80,0x7A,0x77,0x78,0x78,0x76,0x7A,0x82,0x8C,0x90,0x89,0x80,0x81,0x80,0x83, +0x86,0x85,0x8C,0x92,0x8F,0x8A,0x8B,0x8E,0x8A,0x86,0x83,0x7D,0x79,0x76,0x71,0x71, +0x74,0x7A,0x81,0x80,0x7D,0x78,0x75,0x7A,0x7E,0x84,0x84,0x82,0x82,0x85,0x86,0x84, +0x83,0x86,0x88,0x90,0x90,0x8E,0x91,0x92,0x8D,0x8C,0x91,0x95,0x8E,0x88,0x83,0x84, +0x8A,0x88,0x7D,0x75,0x76,0x7C,0x7B,0x7A,0x7E,0x82,0x8C,0x8E,0x85,0x7B,0x76,0x7E, +0x83,0x7C,0x7A,0x7F,0x85,0x86,0x7E,0x7C,0x80,0x83,0x7F,0x7F,0x80,0x7C,0x77,0x7A, +0x7B,0x81,0x87,0x8B,0x89,0x82,0x81,0x82,0x85,0x85,0x7F,0x7D,0x81,0x89,0x89,0x7A, +0x73,0x76,0x76,0x75,0x73,0x77,0x81,0x80,0x7B,0x76,0x77,0x7C,0x80,0x84,0x81,0x7D, +0x81,0x84,0x87,0x86,0x83,0x83,0x7A,0x74,0x75,0x7A,0x7B,0x76,0x7A,0x82,0x86,0x80, +0x77,0x78,0x7E,0x7F,0x7A,0x71,0x73,0x7D,0x85,0x87,0x89,0x8F,0x90,0x8A,0x82,0x7E, +0x79,0x75,0x74,0x78,0x78,0x78,0x7C,0x82,0x83,0x7D,0x7B,0x81,0x85,0x7F,0x78,0x75, +0x77,0x7B,0x7D,0x7C,0x83,0x8D,0x8C,0x84,0x7D,0x7E,0x81,0x83,0x84,0x80,0x7C,0x7C, +0x7C,0x80,0x84,0x87,0x8A,0x8B,0x81,0x79,0x7E,0x85,0x88,0x84,0x7A,0x7B,0x87,0x8B, +0x85,0x80,0x81,0x82,0x82,0x7F,0x7E,0x7F,0x80,0x7E,0x7E,0x7F,0x7F,0x7E,0x7D,0x79, +0x73,0x73,0x79,0x7B,0x7F,0x86,0x8E,0x93,0x94,0x92,0x8F,0x8A,0x80,0x78,0x78,0x81, +0x89,0x8F,0x92,0x94,0x95,0x92,0x8E,0x89,0x84,0x7B,0x77,0x7A,0x7B,0x79,0x7B,0x87, +0x8E,0x85,0x7A,0x7A,0x81,0x82,0x78,0x6C,0x6A,0x73,0x79,0x7C,0x7A,0x7B,0x81,0x86, +0x88,0x85,0x81,0x81,0x89,0x88,0x82,0x82,0x83,0x82,0x7B,0x75,0x79,0x85,0x8D,0x84, +0x7E,0x85,0x87,0x81,0x7D,0x78,0x73,0x73,0x71,0x72,0x77,0x78,0x76,0x77,0x78,0x74, +0x7A,0x83,0x82,0x7A,0x77,0x78,0x79,0x7B,0x7C,0x7D,0x87,0x89,0x84,0x83,0x83,0x81, +0x7D,0x7B,0x7A,0x80,0x82,0x7D,0x78,0x7A,0x79,0x80,0x8C,0x90,0x8B,0x83,0x7F,0x7D, +0x7C,0x78,0x74,0x77,0x7B,0x77,0x7D,0x8C,0x92,0x90,0x88,0x7D,0x7A,0x7B,0x75,0x70, +0x78,0x7F,0x81,0x88,0x87,0x82,0x88,0x8C,0x86,0x88,0x87,0x7C,0x76,0x80,0x86,0x8E, +0x92,0x87,0x80,0x7F,0x79,0x77,0x85,0x87,0x7B,0x7F,0x86,0x86,0x89,0x8B,0x8C,0x8B, +0x83,0x7C,0x81,0x89,0x84,0x81,0x82,0x7E,0x7B,0x84,0x82,0x7B,0x7D,0x79,0x74,0x74, +0x7A,0x7C,0x80,0x84,0x84,0x8B,0x8A,0x86,0x84,0x83,0x80,0x82,0x8B,0x8E,0x83,0x83, +0x83,0x7D,0x7E,0x7F,0x77,0x7C,0x7A,0x79,0x80,0x80,0x7E,0x7D,0x81,0x7D,0x79,0x84, +0x8A,0x86,0x88,0x89,0x8B,0x82,0x79,0x70,0x74,0x79,0x6F,0x70,0x78,0x75,0x7E,0x85, +0x84,0x85,0x7E,0x7C,0x79,0x76,0x6B,0x6B,0x7C,0x87,0x84,0x89,0x89,0x8C,0x93,0x90, +0x8B,0x84,0x8E,0x87,0x7E,0x82,0x84,0x84,0x81,0x78,0x78,0x79,0x7B,0x7C,0x80,0x7C, +0x73,0x7B,0x7F,0x72,0x6A,0x6C,0x6E,0x73,0x74,0x7D,0x80,0x86,0x88,0x88,0x8C,0x8A, +0x85,0x88,0x7B,0x72,0x7B,0x82,0x85,0x82,0x82,0x81,0x82,0x87,0x89,0x81,0x80,0x84, +0x87,0x84,0x79,0x77,0x84,0x7C,0x7B,0x79,0x7B,0x79,0x73,0x73,0x74,0x7A,0x7A,0x71, +0x78,0x7F,0x7B,0x84,0x84,0x83,0x86,0x8D,0x8E,0x87,0x88,0x86,0x80,0x8D,0x86,0x7F, +0x85,0x86,0x8A,0x86,0x84,0x85,0x8B,0x8D,0x7B,0x76,0x82,0x82,0x84,0x88,0x8A,0x90, +0x90,0x8A,0x7F,0x7C,0x7D,0x72,0x75,0x7B,0x6C,0x72,0x7B,0x7F,0x80,0x84,0x87,0x8A, +0x87,0x7D,0x73,0x7C,0x83,0x7E,0x82,0x8A,0x96,0x9D,0x96,0x88,0x82,0x83,0x81,0x79, +0x7F,0x7F,0x7D,0x80,0x80,0x87,0x8D,0x89,0x88,0x80,0x77,0x72,0x75,0x79,0x76,0x7D, +0x80,0x79,0x7C,0x7D,0x7A,0x7C,0x7A,0x75,0x76,0x7A,0x7C,0x7C,0x82,0x7F,0x7A,0x7E, +0x7F,0x82,0x86,0x82,0x80,0x80,0x84,0x85,0x86,0x83,0x7E,0x83,0x88,0x82,0x81,0x83, +0x7F,0x7D,0x7D,0x80,0x80,0x7D,0x76,0x74,0x7B,0x7C,0x7A,0x7C,0x78,0x78,0x7A,0x7A, +0x78,0x7B,0x83,0x82,0x7B,0x7E,0x82,0x84,0x86,0x89,0x8D,0x8C,0x84,0x7E,0x7B,0x77, +0x72,0x79,0x82,0x81,0x7E,0x7B,0x79,0x76,0x77,0x7B,0x83,0x8C,0x8E,0x8E,0x8D,0x86, +0x7D,0x81,0x88,0x89,0x83,0x7D,0x7B,0x80,0x84,0x7E,0x77,0x7A,0x80,0x81,0x76,0x6B, +0x6C,0x75,0x7F,0x89,0x8B,0x8B,0x8A,0x88,0x87,0x87,0x87,0x81,0x7E,0x7E,0x7E,0x7D, +0x81,0x81,0x7B,0x77,0x7B,0x81,0x88,0x8E,0x8E,0x8B,0x8C,0x8D,0x89,0x85,0x84,0x7E, +0x7A,0x7A,0x7E,0x80,0x7E,0x7F,0x81,0x80,0x7F,0x81,0x81,0x7E,0x7C,0x79,0x7B,0x80, +0x7F,0x7C,0x80,0x8E,0x94,0x90,0x8B,0x8B,0x8A,0x81,0x7B,0x80,0x84,0x85,0x84,0x7F, +0x7C,0x82,0x86,0x8B,0x8E,0x88,0x7F,0x7F,0x80,0x7D,0x7A,0x75,0x72,0x73,0x74,0x76, +0x7E,0x85,0x83,0x7D,0x7A,0x79,0x75,0x73,0x76,0x82,0x87,0x7F,0x7B,0x78,0x78,0x7B, +0x80,0x87,0x8A,0x82,0x79,0x7B,0x7D,0x79,0x79,0x81,0x83,0x83,0x85,0x80,0x7E,0x80, +0x80,0x7D,0x82,0x87,0x83,0x7D,0x78,0x75,0x75,0x74,0x77,0x7D,0x7D,0x79,0x7A,0x7F, +0x82,0x7E,0x78,0x72,0x6A,0x6A,0x77,0x7F,0x7D,0x7C,0x7F,0x82,0x85,0x87,0x86,0x85, +0x85,0x81,0x7C,0x7A,0x80,0x8B,0x8F,0x93,0x94,0x90,0x8C,0x8B,0x8C,0x88,0x7F,0x7A, +0x7D,0x85,0x8A,0x86,0x84,0x84,0x81,0x7D,0x76,0x74,0x74,0x75,0x74,0x72,0x7A,0x7F, +0x80,0x86,0x8F,0x8E,0x8A,0x88,0x85,0x88,0x8B,0x8C,0x89,0x8A,0x89,0x88,0x8B,0x87, +0x7E,0x7D,0x7E,0x7B,0x7F,0x86,0x88,0x84,0x83,0x81,0x81,0x86,0x87,0x83,0x81,0x7E, +0x7E,0x7C,0x78,0x74,0x79,0x7A,0x76,0x7D,0x83,0x80,0x7D,0x7A,0x75,0x73,0x71,0x77, +0x7E,0x88,0x94,0x99,0x98,0x90,0x8B,0x8A,0x85,0x80,0x7E,0x7C,0x7B,0x7C,0x84,0x87, +0x81,0x80,0x86,0x8B,0x83,0x72,0x6B,0x6A,0x6C,0x6B,0x68,0x6F,0x78,0x7F,0x7F,0x7C, +0x7E,0x7D,0x78,0x7A,0x79,0x7A,0x7B,0x7F,0x82,0x83,0x88,0x8C,0x8B,0x8F,0x91,0x8D, +0x87,0x81,0x7A,0x72,0x70,0x74,0x77,0x7A,0x7C,0x7E,0x84,0x83,0x84,0x84,0x84,0x87, +0x86,0x7F,0x76,0x73,0x75,0x76,0x74,0x6D,0x6E,0x79,0x7A,0x7B,0x80,0x7E,0x7A,0x7C, +0x84,0x88,0x85,0x87,0x87,0x84,0x82,0x82,0x88,0x8C,0x8E,0x90,0x90,0x8D,0x85,0x7B, +0x78,0x73,0x72,0x77,0x79,0x7A,0x82,0x8D,0x8F,0x8A,0x87,0x86,0x86,0x81,0x79,0x79, +0x7E,0x80,0x7D,0x78,0x78,0x7E,0x8A,0x93,0x8B,0x83,0x83,0x83,0x7F,0x79,0x7C,0x83, +0x88,0x8C,0x89,0x87,0x8C,0x8E,0x8C,0x84,0x81,0x86,0x88,0x85,0x7C,0x7A,0x7E,0x79, +0x76,0x7C,0x84,0x84,0x7C,0x7F,0x88,0x88,0x81,0x7B,0x7C,0x82,0x83,0x83,0x85,0x86, +0x84,0x81,0x84,0x85,0x82,0x7E,0x78,0x7A,0x7F,0x80,0x80,0x7F,0x7E,0x7F,0x7F,0x83, +0x86,0x85,0x80,0x77,0x79,0x7E,0x81,0x84,0x87,0x86,0x81,0x7B,0x7B,0x7C,0x79,0x77, +0x78,0x78,0x77,0x77,0x78,0x77,0x78,0x77,0x78,0x7C,0x7A,0x7B,0x80,0x82,0x7E,0x79, +0x77,0x77,0x77,0x77,0x73,0x75,0x79,0x7D,0x7A,0x7A,0x81,0x89,0x89,0x84,0x7D,0x78, +0x7C,0x84,0x85,0x7F,0x78,0x7A,0x82,0x87,0x87,0x87,0x8C,0x8C,0x85,0x82,0x83,0x87, +0x8B,0x87,0x7E,0x79,0x7B,0x7F,0x7E,0x7E,0x7E,0x81,0x84,0x83,0x7E,0x76,0x72,0x6F, +0x70,0x74,0x77,0x7E,0x8A,0x8F,0x90,0x95,0x9B,0x97,0x8C,0x83,0x7F,0x7E,0x7E,0x7F, +0x80,0x86,0x90,0x90,0x8C,0x8B,0x89,0x85,0x81,0x7B,0x77,0x7A,0x82,0x88,0x89,0x8B, +0x8C,0x8B,0x87,0x7B,0x73,0x72,0x73,0x72,0x6F,0x74,0x7C,0x82,0x84,0x85,0x87,0x87, +0x83,0x7F,0x7E,0x83,0x89,0x8B,0x88,0x88,0x8A,0x88,0x83,0x85,0x84,0x81,0x7E,0x7C, +0x77,0x77,0x79,0x79,0x7A,0x7B,0x7C,0x7E,0x7B,0x77,0x75,0x75,0x73,0x72,0x74,0x75, +0x7B,0x82,0x85,0x8A,0x8B,0x84,0x81,0x83,0x82,0x7A,0x74,0x75,0x7B,0x82,0x88,0x87, +0x8A,0x91,0x90,0x8C,0x86,0x7E,0x75,0x70,0x70,0x74,0x7E,0x85,0x87,0x8B,0x89,0x82, +0x7D,0x7B,0x7D,0x7A,0x75,0x6B,0x6A,0x78,0x7F,0x82,0x86,0x84,0x7F,0x75,0x71,0x75, +0x7A,0x7E,0x7D,0x82,0x89,0x88,0x89,0x84,0x7D,0x7B,0x7E,0x85,0x85,0x83,0x88,0x8D, +0x89,0x85,0x87,0x89,0x84,0x7F,0x7E,0x7F,0x80,0x78,0x75,0x7A,0x83,0x88,0x82,0x7C, +0x7B,0x7E,0x7E,0x75,0x76,0x7C,0x7D,0x7E,0x7C,0x77,0x79,0x7F,0x84,0x85,0x83,0x81, +0x84,0x87,0x7E,0x78,0x81,0x8A,0x8D,0x8F,0x8D,0x8C,0x8A,0x89,0x8B,0x8A,0x85,0x81, +0x81,0x81,0x7E,0x82,0x8D,0x8F,0x86,0x7D,0x7D,0x7B,0x7A,0x7D,0x7C,0x78,0x7C,0x80, +0x81,0x81,0x88,0x8F,0x88,0x7F,0x78,0x79,0x7F,0x7C,0x7D,0x83,0x82,0x87,0x8F,0x91, +0x89,0x80,0x80,0x7A,0x76,0x79,0x79,0x7E,0x82,0x83,0x8A,0x87,0x80,0x76,0x75,0x78, +0x7B,0x7B,0x78,0x71,0x74,0x79,0x7D,0x83,0x86,0x87,0x85,0x81,0x7A,0x74,0x76,0x7B, +0x82,0x89,0x88,0x88,0x87,0x86,0x7D,0x75,0x79,0x7A,0x76,0x77,0x7D,0x7B,0x77,0x73, +0x7B,0x7E,0x82,0x82,0x81,0x82,0x7A,0x78,0x7E,0x7A,0x75,0x76,0x79,0x85,0x87,0x87, +0x84,0x88,0x80,0x72,0x71,0x71,0x71,0x78,0x7C,0x7E,0x8E,0x98,0x94,0x8C,0x8D,0x88, +0x84,0x82,0x7C,0x74,0x76,0x75,0x7F,0x85,0x84,0x8B,0x96,0x97,0x89,0x85,0x8B,0x8C, +0x83,0x7D,0x7C,0x81,0x81,0x7C,0x79,0x7C,0x7D,0x7E,0x78,0x75,0x77,0x7E,0x82,0x7E, +0x7F,0x7F,0x86,0x86,0x89,0x87,0x86,0x86,0x90,0x8F,0x86,0x7F,0x7F,0x7E,0x79,0x76, +0x7B,0x7C,0x78,0x78,0x7A,0x86,0x8D,0x8F,0x8B,0x8E,0x8A,0x7E,0x7A,0x83,0x86,0x82, +0x83,0x87,0x85,0x85,0x82,0x77,0x72,0x70,0x6F,0x77,0x80,0x7C,0x75,0x73,0x7C,0x80, +0x85,0x85,0x85,0x84,0x7F,0x7A,0x77,0x7D,0x7D,0x7E,0x7E,0x7C,0x7F,0x85,0x83,0x80, +0x7E,0x82,0x81,0x7E,0x7E,0x77,0x7E,0x86,0x87,0x8B,0x8B,0x88,0x84,0x7E,0x7D,0x7D, +0x81,0x7F,0x78,0x7D,0x81,0x80,0x80,0x7C,0x7C,0x7C,0x7C,0x7D,0x7E,0x80,0x7E,0x7F, +0x81,0x7F,0x82,0x81,0x7C,0x7A,0x77,0x75,0x73,0x77,0x7E,0x82,0x8B,0x90,0x8E,0x8C, +0x83,0x7D,0x7E,0x7E,0x81,0x82,0x85,0x89,0x88,0x81,0x7D,0x84,0x86,0x7C,0x73,0x70, +0x73,0x77,0x7A,0x77,0x75,0x7C,0x80,0x80,0x83,0x80,0x7C,0x82,0x84,0x80,0x7D,0x7D, +0x7E,0x7F,0x82,0x82,0x82,0x84,0x81,0x7B,0x7A,0x7D,0x81,0x82,0x84,0x8A,0x89,0x83, +0x7F,0x82,0x84,0x84,0x80,0x7B,0x7F,0x87,0x86,0x81,0x7E,0x7C,0x78,0x79,0x7E,0x80, +0x81,0x80,0x7F,0x82,0x84,0x89,0x8F,0x91,0x95,0x95,0x8E,0x84,0x7D,0x79,0x76,0x77, +0x7E,0x81,0x82,0x86,0x90,0x96,0x91,0x8A,0x82,0x7D,0x7A,0x75,0x72,0x78,0x82,0x85, +0x86,0x89,0x87,0x82,0x7E,0x7D,0x79,0x72,0x70,0x74,0x7C,0x7F,0x7F,0x85,0x8F,0x8F, +0x8D,0x88,0x80,0x80,0x80,0x7F,0x80,0x83,0x83,0x83,0x86,0x84,0x7D,0x79,0x76,0x72, +0x6A,0x67,0x6D,0x79,0x83,0x88,0x8A,0x88,0x85,0x82,0x81,0x7E,0x76,0x6B,0x6B,0x74, +0x7E,0x83,0x85,0x86,0x86,0x80,0x7B,0x78,0x7C,0x82,0x7F,0x7E,0x84,0x89,0x88,0x86, +0x8B,0x8F,0x87,0x80,0x7D,0x79,0x79,0x7C,0x7C,0x7C,0x7E,0x7E,0x7F,0x83,0x81,0x7D, +0x7D,0x7D,0x7E,0x7E,0x7E,0x7F,0x82,0x80,0x7C,0x81,0x86,0x82,0x7C,0x7A,0x79,0x7C, +0x7E,0x80,0x87,0x8A,0x85,0x87,0x8E,0x8D,0x85,0x80,0x7C,0x77,0x74,0x72,0x73,0x7B, +0x80,0x82,0x84,0x84,0x84,0x84,0x85,0x87,0x8A,0x88,0x82,0x7F,0x81,0x80,0x83,0x8B, +0x8D,0x8B,0x85,0x7E,0x78,0x76,0x7A,0x80,0x87,0x88,0x82,0x7F,0x7E,0x7F,0x7F,0x7C, +0x78,0x77,0x7C,0x84,0x88,0x86,0x80,0x7E,0x81,0x7F,0x7B,0x76,0x76,0x7B,0x77,0x73, +0x78,0x83,0x87,0x82,0x80,0x81,0x83,0x86,0x82,0x7E,0x80,0x86,0x8A,0x8C,0x90,0x92, +0x8B,0x87,0x85,0x84,0x7F,0x7B,0x7C,0x7E,0x7A,0x7C,0x84,0x86,0x84,0x83,0x85,0x7F, +0x7C,0x7F,0x7C,0x7E,0x7C,0x74,0x70,0x6F,0x76,0x7E,0x82,0x80,0x79,0x77,0x77,0x77, +0x7D,0x81,0x85,0x86,0x81,0x81,0x83,0x8B,0x93,0x90,0x8F,0x89,0x84,0x7E,0x76,0x77, +0x76,0x71,0x71,0x71,0x75,0x7D,0x82,0x81,0x7A,0x76,0x78,0x7C,0x82,0x7C,0x78,0x7E, +0x81,0x81,0x7D,0x7C,0x81,0x7F,0x7C,0x7B,0x7E,0x7F,0x7A,0x78,0x7B,0x80,0x88,0x89, +0x86,0x82,0x82,0x83,0x7E,0x7D,0x7F,0x80,0x82,0x80,0x7D,0x7F,0x80,0x83,0x83,0x80, +0x7F,0x81,0x81,0x7C,0x7A,0x7F,0x84,0x86,0x80,0x7B,0x7E,0x84,0x88,0x85,0x7F,0x7E, +0x7F,0x83,0x80,0x80,0x8C,0x93,0x8F,0x89,0x88,0x8B,0x8A,0x87,0x82,0x7E,0x82,0x86, +0x86,0x85,0x7F,0x7D,0x7F,0x7F,0x7C,0x7C,0x7F,0x7E,0x7A,0x7A,0x7C,0x83,0x89,0x86, +0x83,0x81,0x7F,0x81,0x84,0x83,0x7E,0x7B,0x7C,0x7D,0x83,0x89,0x89,0x85,0x7F,0x82, +0x8A,0x8B,0x82,0x7A,0x7C,0x81,0x83,0x83,0x84,0x88,0x87,0x83,0x7D,0x7B,0x7A,0x7C, +0x7A,0x7A,0x7C,0x7A,0x71,0x6D,0x70,0x72,0x77,0x7F,0x87,0x8A,0x88,0x86,0x83,0x7D, +0x75,0x6E,0x70,0x77,0x7E,0x83,0x87,0x8A,0x8B,0x8A,0x87,0x84,0x80,0x7B,0x78,0x76, +0x73,0x71,0x77,0x7E,0x81,0x81,0x83,0x88,0x8D,0x89,0x7F,0x7A,0x7D,0x7C,0x75,0x74, +0x78,0x7D,0x7D,0x7B,0x7B,0x7E,0x80,0x82,0x83,0x83,0x83,0x82,0x82,0x83,0x7E,0x7B, +0x7E,0x82,0x85,0x88,0x8B,0x87,0x80,0x7D,0x80,0x87,0x88,0x7E,0x7A,0x7D,0x84,0x86, +0x83,0x82,0x81,0x80,0x7C,0x79,0x7B,0x80,0x82,0x82,0x80,0x7D,0x7A,0x7D,0x82,0x80, +0x80,0x82,0x83,0x83,0x7E,0x7C,0x84,0x89,0x86,0x7D,0x7F,0x85,0x87,0x89,0x8B,0x8B, +0x8E,0x8B,0x83,0x7A,0x76,0x78,0x7A,0x7C,0x7E,0x82,0x87,0x8B,0x89,0x83,0x7C,0x7A, +0x7B,0x7B,0x7A,0x79,0x79,0x7B,0x7D,0x7F,0x84,0x8C,0x92,0x90,0x87,0x80,0x80,0x83, +0x83,0x82,0x84,0x85,0x85,0x85,0x85,0x80,0x7A,0x76,0x74,0x76,0x79,0x7B,0x7C,0x7D, +0x7F,0x81,0x82,0x81,0x7F,0x83,0x84,0x7D,0x79,0x7B,0x80,0x86,0x8E,0x8D,0x82,0x7D, +0x7C,0x7B,0x7A,0x75,0x6F,0x73,0x76,0x76,0x7C,0x88,0x8C,0x86,0x84,0x80,0x7B,0x7C, +0x77,0x72,0x73,0x75,0x75,0x7A,0x85,0x85,0x82,0x83,0x7F,0x79,0x7D,0x7E,0x7D,0x7E, +0x7D,0x7D,0x82,0x87,0x83,0x7C,0x80,0x83,0x82,0x7D,0x75,0x79,0x82,0x81,0x7C,0x7F, +0x85,0x86,0x84,0x83,0x7C,0x7B,0x80,0x80,0x7F,0x7B,0x7A,0x7F,0x82,0x7C,0x7F,0x85, +0x83,0x7A,0x7A,0x7F,0x84,0x90,0x97,0x91,0x93,0x98,0x8F,0x83,0x7C,0x7B,0x80,0x88, +0x85,0x7F,0x83,0x88,0x84,0x83,0x7E,0x76,0x74,0x78,0x78,0x7C,0x7F,0x79,0x79,0x82, +0x86,0x8C,0x98,0x8F,0x81,0x7A,0x73,0x71,0x79,0x78,0x7D,0x87,0x8F,0x8A,0x88,0x8D, +0x8C,0x89,0x81,0x78,0x78,0x81,0x7A,0x7D,0x83,0x81,0x83,0x8E,0x8D,0x87,0x83,0x83, +0x7E,0x7D,0x77,0x75,0x85,0x85,0x7A,0x73,0x79,0x7B,0x7E,0x7B,0x74,0x71,0x79,0x7C, +0x7A,0x7F,0x7E,0x83,0x85,0x7E,0x7F,0x80,0x82,0x80,0x7A,0x80,0x83,0x8C,0x8D,0x83, +0x83,0x86,0x81,0x7E,0x79,0x75,0x7A,0x7D,0x7C,0x78,0x7F,0x84,0x83,0x8A,0x88,0x81, +0x7A,0x73,0x73,0x71,0x74,0x74,0x75,0x7B,0x7C,0x7E,0x86,0x84,0x83,0x86,0x8C,0x8B, +0x82,0x7D,0x79,0x7C,0x83,0x80,0x86,0x85,0x86,0x89,0x82,0x79,0x76,0x7C,0x85,0x7E, +0x7B,0x79,0x76,0x7D,0x7B,0x7D,0x83,0x85,0x89,0x85,0x81,0x82,0x83,0x87,0x7E,0x7C, +0x82,0x81,0x85,0x81,0x7F,0x86,0x84,0x84,0x85,0x84,0x88,0x7E,0x7D,0x80,0x81,0x86, +0x83,0x83,0x88,0x84,0x84,0x85,0x7F,0x7C,0x7B,0x81,0x83,0x7F,0x7B,0x73,0x77,0x7A, +0x78,0x7F,0x81,0x80,0x7F,0x85,0x85,0x81,0x84,0x87,0x86,0x86,0x82,0x7B,0x7B,0x7E, +0x85,0x8B,0x90,0x8E,0x84,0x80,0x85,0x87,0x89,0x82,0x7D,0x7D,0x7F,0x7D,0x7B,0x7F, +0x86,0x8A,0x89,0x83,0x7E,0x83,0x83,0x7F,0x7E,0x7B,0x7C,0x7E,0x7E,0x7C,0x7A,0x7D, +0x81,0x7E,0x79,0x75,0x79,0x7A,0x75,0x75,0x7A,0x79,0x7A,0x81,0x88,0x87,0x88,0x86, +0x83,0x7D,0x71,0x70,0x77,0x7E,0x83,0x83,0x7D,0x7D,0x81,0x85,0x82,0x82,0x82,0x79, +0x75,0x78,0x7C,0x81,0x7F,0x7D,0x7F,0x84,0x85,0x85,0x86,0x86,0x81,0x80,0x82,0x7E, +0x79,0x79,0x7E,0x7C,0x78,0x75,0x70,0x71,0x72,0x77,0x7C,0x82,0x83,0x82,0x83,0x7F, +0x78,0x79,0x7A,0x7F,0x84,0x85,0x86,0x8E,0x95,0x98,0x95,0x8F,0x88,0x81,0x7E,0x7B, +0x7A,0x7C,0x7D,0x7D,0x7D,0x7C,0x7D,0x81,0x86,0x89,0x86,0x81,0x7F,0x81,0x82,0x86, +0x88,0x87,0x81,0x7B,0x7A,0x7B,0x7E,0x83,0x85,0x86,0x82,0x7E,0x7E,0x7F,0x7F,0x82, +0x82,0x80,0x7F,0x84,0x8B,0x8B,0x86,0x7E,0x7C,0x81,0x86,0x84,0x7D,0x79,0x7E,0x82, +0x83,0x81,0x81,0x84,0x84,0x84,0x85,0x84,0x84,0x86,0x85,0x7D,0x75,0x76,0x7B,0x7C, +0x77,0x74,0x79,0x80,0x84,0x84,0x87,0x86,0x7F,0x7B,0x76,0x73,0x74,0x76,0x79,0x7F, +0x87,0x8B,0x8F,0x92,0x8F,0x88,0x81,0x7A,0x74,0x76,0x79,0x7F,0x83,0x84,0x84,0x84, +0x85,0x82,0x7D,0x7C,0x7E,0x7D,0x79,0x76,0x78,0x7C,0x7A,0x7A,0x7B,0x7D,0x83,0x86, +0x86,0x85,0x82,0x7F,0x80,0x83,0x84,0x84,0x86,0x86,0x85,0x84,0x86,0x88,0x86,0x82, +0x7D,0x79,0x7B,0x7B,0x77,0x75,0x76,0x80,0x88,0x85,0x83,0x86,0x85,0x81,0x79,0x7A, +0x77,0x74,0x75,0x76,0x7B,0x7E,0x81,0x87,0x87,0x83,0x7F,0x7B,0x75,0x73,0x7F,0x88, +0x89,0x89,0x85,0x81,0x7F,0x7F,0x82,0x82,0x83,0x80,0x76,0x72,0x71,0x77,0x7A,0x79, +0x79,0x7B,0x7B,0x7A,0x80,0x87,0x88,0x87,0x88,0x8A,0x8B,0x87,0x87,0x88,0x81,0x7B, +0x7D,0x85,0x8B,0x8A,0x8B,0x8A,0x89,0x89,0x83,0x7F,0x7D,0x7B,0x7E,0x7C,0x7C,0x7E, +0x7F,0x83,0x80,0x80,0x7E,0x7C,0x7F,0x80,0x7D,0x7E,0x7D,0x83,0x85,0x82,0x7F,0x7C, +0x7E,0x81,0x7D,0x85,0x8B,0x87,0x82,0x7D,0x78,0x75,0x7B,0x85,0x88,0x89,0x85,0x83, +0x81,0x7E,0x80,0x82,0x80,0x7D,0x7B,0x81,0x84,0x83,0x86,0x85,0x80,0x7E,0x7A,0x7B, +0x7A,0x78,0x78,0x75,0x71,0x75,0x7B,0x7C,0x79,0x79,0x7D,0x80,0x80,0x81,0x7F,0x7D, +0x7E,0x7E,0x80,0x7F,0x7E,0x80,0x80,0x7F,0x7F,0x80,0x80,0x7C,0x7C,0x80,0x83,0x82, +0x7D,0x7D,0x80,0x7F,0x7B,0x7F,0x85,0x85,0x84,0x85,0x80,0x7C,0x7A,0x7B,0x81,0x81, +0x7C,0x7A,0x7C,0x7C,0x78,0x76,0x77,0x78,0x7D,0x7F,0x7E,0x82,0x8A,0x8C,0x90,0x95, +0x98,0x95,0x8E,0x88,0x7F,0x77,0x74,0x73,0x77,0x7D,0x7D,0x7B,0x7B,0x7B,0x7C,0x81, +0x84,0x82,0x7D,0x7C,0x80,0x7E,0x7A,0x7E,0x87,0x8C,0x8A,0x87,0x87,0x83,0x7D,0x7A, +0x7C,0x82,0x86,0x86,0x87,0x84,0x81,0x7F,0x80,0x84,0x88,0x8B,0x8B,0x8C,0x8E,0x8C, +0x85,0x7D,0x79,0x78,0x77,0x7B,0x7D,0x7D,0x79,0x78,0x7B,0x7E,0x84,0x88,0x83,0x7D, +0x7C,0x7D,0x7F,0x81,0x82,0x80,0x7B,0x7A,0x7D,0x82,0x86,0x87,0x85,0x81,0x81,0x80, +0x7A,0x79,0x7C,0x80,0x81,0x7F,0x81,0x87,0x8C,0x8C,0x89,0x8A,0x8D,0x8A,0x83,0x7C, +0x7A,0x7D,0x81,0x84,0x86,0x88,0x85,0x7F,0x7D,0x7C,0x79,0x77,0x75,0x71,0x70,0x72, +0x73,0x74,0x75,0x77,0x7A,0x7C,0x7D,0x81,0x88,0x8B,0x86,0x83,0x87,0x8C,0x8E,0x8B, +0x85,0x80,0x82,0x82,0x7D,0x7B,0x7F,0x81,0x81,0x7C,0x74,0x6F,0x71,0x75,0x7B,0x80, +0x81,0x82,0x88,0x88,0x86,0x88,0x88,0x85,0x81,0x7A,0x74,0x77,0x77,0x72,0x70,0x74, +0x78,0x7A,0x7A,0x79,0x77,0x7A,0x80,0x80,0x83,0x86,0x8C,0x90,0x8C,0x89,0x8D,0x8C, +0x87,0x81,0x80,0x82,0x84,0x82,0x7B,0x7A,0x7F,0x7E,0x7A,0x7C,0x80,0x83,0x83,0x86, +0x88,0x85,0x81,0x7D,0x81,0x83,0x7F,0x81,0x86,0x87,0x83,0x82,0x87,0x89,0x85,0x81, +0x7E,0x85,0x88,0x7C,0x76,0x79,0x82,0x8C,0x91,0x90,0x8B,0x8B,0x89,0x86,0x8B,0x87, +0x7F,0x87,0x84,0x7B,0x78,0x7E,0x83,0x81,0x7F,0x78,0x79,0x7F,0x77,0x70,0x72,0x71, +0x70,0x72,0x77,0x7F,0x8D,0x92,0x89,0x8A,0x8D,0x89,0x8B,0x85,0x73,0x71,0x77,0x7E, +0x7E,0x80,0x82,0x86,0x8C,0x8D,0x89,0x8B,0x88,0x7A,0x6E,0x69,0x6D,0x7A,0x7D,0x7A, +0x7D,0x7F,0x75,0x71,0x73,0x76,0x79,0x7E,0x7C,0x78,0x75,0x76,0x7D,0x7F,0x7B,0x79, +0x7E,0x82,0x7F,0x84,0x82,0x7D,0x7E,0x81,0x81,0x84,0x8D,0x8C,0x80,0x7C,0x7E,0x85, +0x88,0x85,0x87,0x85,0x81,0x7F,0x7B,0x77,0x72,0x75,0x7D,0x73,0x72,0x75,0x76,0x7C, +0x7F,0x84,0x87,0x87,0x8F,0x87,0x86,0x83,0x82,0x86,0x7E,0x78,0x7A,0x79,0x7B,0x7E, +0x7C,0x80,0x81,0x86,0x85,0x82,0x8B,0x8D,0x8C,0x87,0x83,0x84,0x85,0x87,0x82,0x7F, +0x82,0x7E,0x7E,0x76,0x75,0x78,0x75,0x74,0x78,0x7B,0x81,0x81,0x82,0x81,0x7E,0x89, +0x91,0x89,0x87,0x88,0x8B,0x89,0x83,0x80,0x7D,0x7D,0x7D,0x81,0x86,0x8B,0x89,0x87, +0x81,0x7E,0x85,0x88,0x83,0x7D,0x7C,0x7D,0x7F,0x80,0x7D,0x7F,0x87,0x8B,0x8A,0x7F, +0x77,0x7D,0x7D,0x77,0x76,0x7C,0x80,0x82,0x81,0x80,0x7E,0x84,0x89,0x85,0x83,0x82, +0x7C,0x7F,0x80,0x82,0x83,0x87,0x8B,0x85,0x84,0x86,0x86,0x82,0x7C,0x7B,0x7A,0x77, +0x79,0x7C,0x7D,0x7F,0x7F,0x7D,0x77,0x76,0x7A,0x7A,0x79,0x77,0x7B,0x81,0x7F,0x7F, +0x83,0x8B,0x8D,0x85,0x7F,0x77,0x72,0x7A,0x7D,0x7D,0x7A,0x7A,0x7D,0x7B,0x7D,0x7D, +0x7A,0x7D,0x80,0x7B,0x76,0x78,0x81,0x85,0x85,0x85,0x82,0x80,0x7F,0x82,0x85,0x86, +0x88,0x83,0x7B,0x79,0x7D,0x84,0x87,0x84,0x82,0x80,0x7F,0x7A,0x75,0x78,0x7D,0x80, +0x81,0x82,0x85,0x86,0x84,0x81,0x82,0x86,0x84,0x7F,0x7E,0x82,0x84,0x84,0x86,0x86, +0x83,0x85,0x86,0x87,0x85,0x81,0x80,0x7F,0x80,0x81,0x82,0x88,0x8B,0x8B,0x85,0x7C, +0x7C,0x80,0x7E,0x7C,0x7F,0x80,0x7F,0x7F,0x83,0x87,0x86,0x85,0x84,0x85,0x83,0x80, +0x7F,0x7C,0x79,0x78,0x7A,0x80,0x85,0x84,0x7E,0x76,0x78,0x7B,0x7E,0x7E,0x7E,0x80, +0x80,0x81,0x84,0x84,0x83,0x81,0x82,0x86,0x89,0x8A,0x8A,0x84,0x7D,0x7C,0x7F,0x82, +0x7F,0x7C,0x77,0x75,0x77,0x79,0x7F,0x82,0x84,0x85,0x83,0x80,0x7B,0x77,0x76,0x76, +0x75,0x73,0x73,0x77,0x7C,0x7F,0x81,0x7F,0x80,0x80,0x7F,0x7D,0x7B,0x7F,0x80,0x82, +0x83,0x81,0x81,0x83,0x82,0x86,0x87,0x85,0x86,0x87,0x89,0x85,0x82,0x80,0x7D,0x7B, +0x79,0x76,0x78,0x7B,0x80,0x85,0x85,0x85,0x87,0x8A,0x85,0x7C,0x79,0x77,0x74,0x72, +0x71,0x79,0x7F,0x85,0x8B,0x8B,0x89,0x83,0x7F,0x7E,0x7D,0x80,0x7C,0x73,0x76,0x7D, +0x83,0x85,0x87,0x8C,0x8E,0x8E,0x8B,0x84,0x81,0x80,0x87,0x8D,0x87,0x82,0x7E,0x7B, +0x7A,0x7D,0x84,0x82,0x7C,0x79,0x77,0x7C,0x7D,0x7D,0x83,0x82,0x7E,0x79,0x79,0x79, +0x75,0x7A,0x7F,0x83,0x89,0x89,0x89,0x88,0x83,0x81,0x7D,0x7B,0x78,0x7C,0x86,0x87, +0x86,0x8D,0x90,0x8C,0x85,0x86,0x87,0x88,0x87,0x80,0x79,0x75,0x75,0x79,0x7B,0x7A, +0x81,0x85,0x84,0x80,0x7C,0x7A,0x79,0x7D,0x82,0x84,0x87,0x89,0x8F,0x90,0x8A,0x86, +0x86,0x82,0x79,0x79,0x7B,0x79,0x7B,0x80,0x83,0x82,0x80,0x7E,0x7D,0x7B,0x7C,0x78, +0x71,0x6B,0x6C,0x7D,0x8A,0x89,0x88,0x86,0x82,0x7B,0x79,0x7C,0x79,0x75,0x76,0x7C, +0x82,0x83,0x86,0x88,0x83,0x7B,0x7D,0x83,0x80,0x7A,0x79,0x78,0x7C,0x80,0x80,0x81, +0x87,0x8C,0x87,0x80,0x7C,0x78,0x77,0x77,0x77,0x7F,0x83,0x83,0x7E,0x79,0x76,0x73, +0x75,0x7A,0x7C,0x7B,0x7C,0x84,0x89,0x88,0x8C,0x90,0x8E,0x83,0x79,0x78,0x7C,0x7E, +0x7F,0x7F,0x81,0x83,0x85,0x8A,0x8C,0x88,0x82,0x80,0x80,0x7D,0x7D,0x82,0x86,0x8C, +0x91,0x90,0x8A,0x83,0x7D,0x7F,0x84,0x84,0x80,0x79,0x77,0x78,0x7D,0x80,0x80,0x81, +0x81,0x7C,0x7B,0x7B,0x7D,0x80,0x84,0x85,0x82,0x80,0x7F,0x81,0x86,0x89,0x8C,0x8E, +0x8A,0x85,0x86,0x86,0x84,0x82,0x81,0x7E,0x7B,0x7A,0x78,0x76,0x7B,0x81,0x81,0x7E, +0x7B,0x7E,0x82,0x80,0x7C,0x7D,0x7E,0x7C,0x7A,0x7E,0x7E,0x7F,0x7E,0x7F,0x7F,0x82, +0x85,0x82,0x7C,0x7A,0x79,0x7B,0x7D,0x7E,0x7E,0x7F,0x81,0x85,0x85,0x83,0x80,0x7E, +0x7B,0x76,0x74,0x75,0x76,0x78,0x7B,0x7E,0x81,0x85,0x88,0x86,0x81,0x80,0x82,0x85, +0x84,0x84,0x85,0x87,0x89,0x89,0x88,0x86,0x84,0x7F,0x7E,0x7B,0x78,0x75,0x76,0x77, +0x78,0x76,0x77,0x7B,0x80,0x79,0x75,0x7B,0x80,0x81,0x84,0x86,0x87,0x87,0x87,0x84, +0x80,0x80,0x7F,0x80,0x82,0x7E,0x7D,0x80,0x82,0x84,0x87,0x84,0x83,0x84,0x85,0x7E, +0x7C,0x7D,0x7F,0x7F,0x7E,0x7E,0x80,0x82,0x81,0x7F,0x81,0x84,0x86,0x89,0x87,0x80, +0x7D,0x79,0x76,0x77,0x77,0x7A,0x7C,0x7E,0x7B,0x7C,0x82,0x83,0x81,0x7F,0x7D,0x80, +0x83,0x7F,0x7E,0x86,0x89,0x86,0x86,0x8A,0x8B,0x87,0x87,0x84,0x85,0x85,0x80,0x7E, +0x7B,0x77,0x7B,0x81,0x81,0x80,0x86,0x86,0x84,0x87,0x89,0x84,0x83,0x85,0x82,0x80, +0x7D,0x79,0x7A,0x7B,0x79,0x78,0x7E,0x80,0x7D,0x80,0x7C,0x7E,0x81,0x82,0x85,0x88, +0x8C,0x8E,0x8F,0x8F,0x87,0x86,0x8C,0x87,0x85,0x85,0x83,0x80,0x7E,0x79,0x74,0x75, +0x76,0x72,0x76,0x75,0x72,0x7A,0x7E,0x79,0x78,0x7D,0x7D,0x7A,0x7D,0x7F,0x7E,0x82, +0x86,0x84,0x84,0x82,0x7F,0x7C,0x7B,0x78,0x80,0x82,0x7D,0x7F,0x83,0x87,0x82,0x83, +0x84,0x81,0x7E,0x7C,0x7C,0x7D,0x7B,0x7A,0x7A,0x7E,0x79,0x7E,0x84,0x79,0x74,0x7B, +0x76,0x74,0x7A,0x7A,0x7C,0x7D,0x85,0x87,0x83,0x87,0x81,0x82,0x84,0x81,0x86,0x88, +0x89,0x89,0x85,0x84,0x84,0x89,0x86,0x82,0x84,0x86,0x87,0x8A,0x81,0x7F,0x81,0x76, +0x75,0x78,0x81,0x83,0x83,0x85,0x83,0x7F,0x7C,0x77,0x7C,0x77,0x77,0x7F,0x85,0x87, +0x82,0x85,0x87,0x83,0x7E,0x7D,0x7A,0x80,0x7D,0x82,0x86,0x87,0x8D,0x90,0x8A,0x8D, +0x8B,0x8A,0x82,0x7A,0x7E,0x7E,0x83,0x89,0x8B,0x82,0x7D,0x7E,0x7A,0x7A,0x7E,0x79, +0x79,0x7A,0x78,0x7A,0x7F,0x83,0x83,0x82,0x86,0x81,0x77,0x7A,0x72,0x76,0x7B,0x7B, +0x7B,0x7E,0x83,0x86,0x82,0x7E,0x7B,0x7D,0x83,0x83,0x7C,0x7B,0x7F,0x83,0x87,0x89, +0x90,0x91,0x93,0x8F,0x85,0x81,0x81,0x7C,0x78,0x79,0x7C,0x78,0x74,0x74,0x76,0x78, +0x78,0x7A,0x7A,0x7B,0x7A,0x79,0x79,0x78,0x79,0x7E,0x86,0x8A,0x84,0x7F,0x82,0x84, +0x84,0x85,0x85,0x83,0x7D,0x77,0x78,0x82,0x8D,0x91,0x89,0x80,0x7F,0x80,0x7F,0x81, +0x82,0x84,0x86,0x89,0x86,0x7F,0x7B,0x78,0x71,0x6B,0x6A,0x6F,0x7A,0x7F,0x79,0x76, +0x7D,0x81,0x7F,0x7B,0x7B,0x7B,0x79,0x76,0x78,0x7C,0x83,0x84,0x85,0x89,0x8B,0x8A, +0x87,0x86,0x86,0x87,0x89,0x8C,0x8D,0x8C,0x8A,0x85,0x80,0x7F,0x80,0x83,0x83,0x7F, +0x79,0x78,0x7B,0x7B,0x7A,0x7C,0x7E,0x7F,0x7D,0x79,0x7B,0x81,0x86,0x8C,0x8A,0x82, +0x7C,0x7C,0x82,0x84,0x83,0x80,0x7E,0x7F,0x7E,0x7D,0x7E,0x83,0x8B,0x8F,0x8C,0x8A, +0x89,0x8B,0x8C,0x8C,0x8B,0x8A,0x8A,0x86,0x7F,0x7C,0x7C,0x7E,0x81,0x81,0x81,0x7B, +0x74,0x70,0x6F,0x73,0x76,0x7B,0x80,0x80,0x81,0x80,0x7C,0x78,0x75,0x72,0x74,0x7A, +0x81,0x85,0x83,0x84,0x86,0x88,0x86,0x86,0x89,0x8C,0x88,0x82,0x80,0x7E,0x7D,0x81, +0x84,0x83,0x81,0x7D,0x7B,0x7A,0x75,0x72,0x74,0x77,0x7A,0x7A,0x79,0x76,0x78,0x7F, +0x7F,0x7B,0x76,0x74,0x78,0x7C,0x7F,0x85,0x8A,0x8B,0x87,0x88,0x85,0x7F,0x81,0x81, +0x84,0x82,0x80,0x80,0x7D,0x7D,0x80,0x83,0x85,0x82,0x81,0x80,0x7B,0x79,0x79,0x7A, +0x81,0x80,0x7E,0x80,0x81,0x82,0x80,0x80,0x7F,0x7D,0x80,0x80,0x80,0x80,0x7F,0x80, +0x84,0x86,0x86,0x86,0x88,0x88,0x84,0x82,0x81,0x83,0x85,0x83,0x85,0x89,0x86,0x83, +0x7F,0x7C,0x76,0x76,0x7B,0x80,0x83,0x7E,0x7E,0x86,0x88,0x84,0x86,0x8A,0x88,0x80, +0x7F,0x81,0x81,0x83,0x84,0x82,0x80,0x7B,0x7E,0x7E,0x77,0x72,0x73,0x7E,0x86,0x88, +0x85,0x7E,0x7E,0x7E,0x7D,0x7C,0x7B,0x7D,0x81,0x82,0x84,0x88,0x8C,0x89,0x84,0x86, +0x85,0x81,0x84,0x84,0x82,0x83,0x86,0x8A,0x88,0x85,0x82,0x7C,0x79,0x75,0x74,0x76, +0x7A,0x7C,0x7B,0x7C,0x7D,0x80,0x7E,0x7C,0x7F,0x84,0x81,0x7A,0x77,0x78,0x7C,0x7C, +0x81,0x85,0x80,0x7E,0x7F,0x85,0x89,0x85,0x85,0x84,0x87,0x87,0x85,0x85,0x81,0x7D, +0x79,0x7B,0x81,0x80,0x7C,0x7D,0x81,0x80,0x79,0x75,0x75,0x75,0x75,0x75,0x77,0x7E, +0x84,0x85,0x82,0x7D,0x7A,0x79,0x7D,0x7E,0x7A,0x78,0x77,0x7C,0x82,0x82,0x7D,0x7A, +0x7B,0x7F,0x84,0x8D,0x91,0x8D,0x8A,0x8B,0x8B,0x87,0x81,0x83,0x83,0x81,0x7C,0x78, +0x78,0x79,0x7D,0x7B,0x78,0x79,0x79,0x78,0x77,0x76,0x79,0x80,0x88,0x8A,0x84,0x7F, +0x7F,0x82,0x83,0x7E,0x7E,0x84,0x89,0x8A,0x86,0x85,0x84,0x82,0x83,0x83,0x84,0x85, +0x88,0x8C,0x8C,0x8D,0x8F,0x90,0x8E,0x88,0x84,0x81,0x80,0x81,0x83,0x83,0x84,0x84, +0x80,0x7C,0x7B,0x78,0x73,0x70,0x6F,0x71,0x77,0x7A,0x7B,0x7E,0x81,0x83,0x84,0x86, +0x83,0x83,0x83,0x82,0x81,0x82,0x85,0x8B,0x8E,0x91,0x8E,0x89,0x85,0x80,0x7A,0x78, +0x79,0x79,0x77,0x75,0x78,0x7D,0x86,0x89,0x84,0x7E,0x7D,0x7E,0x7B,0x77,0x70,0x6F, +0x72,0x73,0x71,0x75,0x7B,0x80,0x7D,0x80,0x81,0x80,0x82,0x83,0x7F,0x7D,0x80,0x82, +0x81,0x83,0x85,0x85,0x88,0x8B,0x86,0x81,0x7E,0x7C,0x7E,0x7A,0x76,0x76,0x7A,0x81, +0x82,0x83,0x83,0x84,0x82,0x81,0x81,0x80,0x7C,0x7B,0x7E,0x7E,0x7A,0x7B,0x7E,0x7C, +0x80,0x84,0x81,0x83,0x85,0x81,0x7D,0x77,0x75,0x76,0x80,0x8A,0x89,0x87,0x85,0x83, +0x85,0x86,0x86,0x88,0x88,0x84,0x7E,0x7F,0x81,0x84,0x81,0x7D,0x7E,0x83,0x84,0x86, +0x87,0x80,0x7B,0x7B,0x81,0x7E,0x83,0x84,0x81,0x82,0x80,0x7F,0x81,0x80,0x82,0x7E, +0x86,0x8A,0x7C,0x7D,0x7D,0x79,0x77,0x7A,0x81,0x81,0x80,0x83,0x7D,0x80,0x80,0x80, +0x83,0x7E,0x83,0x82,0x7F,0x81,0x84,0x85,0x87,0x88,0x8C,0x83,0x86,0x85,0x7F,0x80, +0x79,0x75,0x7C,0x80,0x82,0x82,0x87,0x8B,0x83,0x87,0x7F,0x7A,0x80,0x7F,0x80,0x81, +0x7E,0x81,0x7B,0x7C,0x82,0x82,0x85,0x80,0x7E,0x78,0x77,0x78,0x79,0x79,0x7F,0x7C, +0x80,0x86,0x89,0x89,0x86,0x86,0x82,0x80,0x82,0x7F,0x7E,0x81,0x7E,0x7F,0x78,0x7B, +0x7F,0x81,0x7F,0x7D,0x79,0x76,0x74,0x75,0x74,0x78,0x81,0x80,0x7E,0x79,0x7A,0x79, +0x79,0x7C,0x7F,0x84,0x8E,0x89,0x84,0x84,0x7D,0x7A,0x7B,0x7F,0x7C,0x77,0x7D,0x7D, +0x80,0x85,0x88,0x87,0x82,0x7E,0x7B,0x7D,0x80,0x7D,0x7D,0x7D,0x7F,0x80,0x83,0x81, +0x82,0x7F,0x77,0x71,0x6F,0x74,0x7B,0x83,0x86,0x81,0x84,0x87,0x8B,0x8E,0x86,0x81, +0x82,0x84,0x82,0x82,0x82,0x81,0x82,0x88,0x86,0x87,0x8A,0x86,0x85,0x86,0x85,0x87, +0x8C,0x88,0x81,0x85,0x8B,0x8A,0x86,0x7E,0x75,0x76,0x78,0x78,0x79,0x7B,0x7A,0x79, +0x79,0x77,0x7A,0x82,0x83,0x85,0x89,0x86,0x84,0x87,0x84,0x7F,0x83,0x8A,0x8B,0x89, +0x86,0x83,0x83,0x88,0x89,0x8C,0x8E,0x89,0x87,0x87,0x80,0x76,0x73,0x74,0x71,0x73, +0x78,0x7A,0x7B,0x7A,0x78,0x79,0x7C,0x7B,0x7C,0x7B,0x7C,0x7A,0x79,0x7B,0x82,0x8B, +0x8B,0x86,0x83,0x81,0x80,0x7B,0x76,0x73,0x73,0x78,0x7C,0x81,0x80,0x7E,0x80,0x85, +0x89,0x8C,0x8A,0x84,0x80,0x7D,0x7B,0x76,0x78,0x7E,0x81,0x82,0x81,0x7E,0x7D,0x7B, +0x7C,0x78,0x75,0x75,0x78,0x7A,0x7B,0x7F,0x86,0x8A,0x8C,0x8A,0x85,0x87,0x8A,0x8C, +0x86,0x80,0x7A,0x78,0x7A,0x7C,0x7C,0x7B,0x7A,0x7C,0x7E,0x7E,0x80,0x81,0x83,0x84, +0x82,0x82,0x84,0x88,0x84,0x7F,0x80,0x84,0x8B,0x8E,0x8A,0x86,0x81,0x7C,0x78,0x75, +0x74,0x73,0x75,0x7B,0x81,0x85,0x86,0x86,0x87,0x85,0x84,0x87,0x8A,0x88,0x81,0x7B, +0x76,0x74,0x7A,0x81,0x86,0x83,0x7E,0x7E,0x7F,0x7F,0x7D,0x7D,0x7F,0x82,0x84,0x85, +0x83,0x84,0x84,0x84,0x86,0x87,0x85,0x83,0x83,0x83,0x80,0x80,0x80,0x7F,0x81,0x7E, +0x7D,0x80,0x87,0x89,0x85,0x82,0x80,0x82,0x85,0x83,0x7A,0x76,0x78,0x7B,0x7E,0x83, +0x89,0x8B,0x88,0x85,0x7F,0x7C,0x7E,0x7B,0x78,0x76,0x79,0x7D,0x83,0x85,0x86,0x87, +0x88,0x86,0x81,0x7C,0x7A,0x7A,0x78,0x76,0x79,0x7E,0x84,0x85,0x84,0x83,0x80,0x7C, +0x79,0x79,0x78,0x76,0x78,0x7C,0x7D,0x81,0x84,0x87,0x83,0x7F,0x7E,0x81,0x81,0x7E, +0x7D,0x7E,0x7E,0x7F,0x7E,0x7D,0x7F,0x83,0x81,0x7F,0x7E,0x7D,0x7B,0x7B,0x78,0x75, +0x74,0x79,0x7D,0x7F,0x81,0x82,0x7D,0x7B,0x7A,0x7D,0x83,0x86,0x83,0x82,0x83,0x85, +0x82,0x80,0x7F,0x7D,0x7D,0x7C,0x7B,0x7E,0x81,0x83,0x86,0x8B,0x8D,0x8D,0x8E,0x8B, +0x85,0x80,0x80,0x87,0x8C,0x8C,0x8B,0x87,0x7F,0x77,0x73,0x73,0x75,0x75,0x77,0x79, +0x7B,0x7F,0x81,0x86,0x8B,0x8B,0x88,0x83,0x81,0x82,0x82,0x83,0x82,0x81,0x83,0x88, +0x8A,0x86,0x7F,0x7E,0x7F,0x81,0x82,0x83,0x87,0x89,0x87,0x84,0x80,0x81,0x84,0x87, +0x86,0x82,0x81,0x81,0x82,0x80,0x7D,0x79,0x76,0x76,0x77,0x74,0x75,0x76,0x78,0x78, +0x78,0x7B,0x7F,0x82,0x87,0x86,0x84,0x83,0x81,0x7E,0x7C,0x7D,0x7D,0x7E,0x80,0x82, +0x85,0x89,0x8A,0x89,0x86,0x85,0x83,0x81,0x7F,0x80,0x7F,0x7E,0x7D,0x79,0x76,0x77, +0x7B,0x7E,0x80,0x7F,0x7D,0x79,0x74,0x71,0x75,0x7B,0x80,0x82,0x82,0x7F,0x7D,0x7E, +0x81,0x85,0x86,0x87,0x86,0x81,0x7C,0x7D,0x82,0x81,0x7D,0x7A,0x78,0x7C,0x84,0x86, +0x85,0x87,0x89,0x89,0x84,0x7D,0x7B,0x7B,0x7E,0x7E,0x7F,0x7E,0x80,0x83,0x85,0x81, +0x7D,0x7C,0x7D,0x7A,0x78,0x78,0x7D,0x81,0x83,0x83,0x7F,0x79,0x7A,0x7D,0x7E,0x7D, +0x79,0x77,0x7B,0x80,0x82,0x84,0x87,0x8A,0x88,0x83,0x80,0x82,0x87,0x8E,0x8F,0x8B, +0x89,0x86,0x84,0x82,0x7F,0x7E,0x7B,0x79,0x79,0x77,0x76,0x79,0x7F,0x89,0x8A,0x84, +0x7E,0x7C,0x7D,0x7E,0x7F,0x84,0x83,0x84,0x87,0x8C,0x8B,0x89,0x89,0x83,0x7F,0x7E, +0x7B,0x7B,0x7C,0x81,0x85,0x85,0x88,0x88,0x87,0x88,0x88,0x85,0x80,0x7F,0x80,0x84, +0x82,0x83,0x7F,0x7E,0x82,0x7C,0x7B,0x7D,0x7C,0x7A,0x75,0x74,0x76,0x77,0x7A,0x7B, +0x7D,0x83,0x85,0x81,0x84,0x84,0x85,0x86,0x88,0x83,0x7E,0x7E,0x7C,0x7C,0x7D,0x80, +0x83,0x82,0x81,0x7A,0x72,0x78,0x82,0x8A,0x88,0x89,0x8B,0x83,0x7B,0x79,0x74,0x77, +0x7C,0x7B,0x78,0x78,0x7D,0x82,0x7F,0x79,0x74,0x70,0x71,0x6F,0x73,0x79,0x7A,0x7F, +0x82,0x87,0x86,0x85,0x83,0x80,0x7F,0x7C,0x7C,0x7E,0x80,0x86,0x91,0x92,0x8D,0x8A, +0x85,0x82,0x81,0x82,0x7D,0x7A,0x83,0x81,0x80,0x87,0x85,0x83,0x84,0x7F,0x74,0x70, +0x79,0x78,0x79,0x7B,0x7B,0x7F,0x81,0x85,0x84,0x83,0x86,0x85,0x84,0x83,0x82,0x85, +0x80,0x78,0x86,0x8B,0x8C,0x8A,0x82,0x89,0x87,0x89,0x8C,0x8C,0x8E,0x86,0x84,0x81, +0x7B,0x7E,0x7D,0x7C,0x78,0x78,0x7A,0x76,0x79,0x79,0x74,0x78,0x80,0x81,0x85,0x85, +0x88,0x85,0x82,0x83,0x80,0x85,0x86,0x83,0x87,0x82,0x81,0x7E,0x78,0x79,0x7A,0x7F, +0x7A,0x7E,0x83,0x81,0x86,0x8A,0x88,0x8A,0x8A,0x8A,0x85,0x7F,0x79,0x70,0x73,0x72, +0x6F,0x7A,0x7C,0x78,0x7A,0x77,0x7A,0x77,0x7D,0x85,0x7F,0x84,0x87,0x84,0x88,0x88, +0x89,0x84,0x7E,0x81,0x7F,0x83,0x8B,0x8C,0x8B,0x86,0x85,0x82,0x7E,0x7F,0x79,0x78, +0x78,0x76,0x7B,0x83,0x89,0x87,0x83,0x86,0x83,0x7C,0x75,0x6E,0x6E,0x71,0x76,0x7B, +0x79,0x7D,0x82,0x80,0x80,0x7E,0x7A,0x76,0x77,0x79,0x78,0x7B,0x81,0x83,0x81,0x7F, +0x80,0x82,0x88,0x8A,0x87,0x88,0x89,0x88,0x86,0x86,0x83,0x7D,0x7D,0x81,0x81,0x80, +0x7F,0x7F,0x81,0x83,0x82,0x7F,0x7B,0x79,0x77,0x75,0x76,0x7C,0x80,0x80,0x81,0x7C, +0x78,0x79,0x7D,0x7D,0x7C,0x7E,0x82,0x84,0x88,0x86,0x83,0x86,0x87,0x89,0x8B,0x8E, +0x8F,0x88,0x83,0x80,0x7F,0x82,0x84,0x85,0x85,0x83,0x87,0x87,0x86,0x82,0x7F,0x81, +0x82,0x7F,0x7C,0x7B,0x7D,0x80,0x84,0x88,0x86,0x82,0x81,0x82,0x82,0x80,0x7F,0x7D, +0x7B,0x7F,0x83,0x85,0x88,0x87,0x86,0x80,0x7B,0x79,0x76,0x7A,0x7F,0x81,0x82,0x82, +0x86,0x86,0x86,0x86,0x82,0x7F,0x7E,0x7A,0x77,0x79,0x7F,0x83,0x85,0x8A,0x83,0x7C, +0x7B,0x79,0x74,0x71,0x70,0x6F,0x73,0x7C,0x83,0x89,0x8D,0x89,0x84,0x7E,0x79,0x7C, +0x7F,0x81,0x80,0x7D,0x7C,0x79,0x76,0x74,0x73,0x76,0x76,0x7B,0x83,0x82,0x7E,0x7F, +0x84,0x89,0x8E,0x8C,0x82,0x7B,0x7A,0x7A,0x7D,0x7E,0x7F,0x80,0x80,0x7F,0x7F,0x81, +0x81,0x7D,0x7B,0x7A,0x7A,0x7D,0x7E,0x80,0x81,0x80,0x83,0x86,0x83,0x85,0x88,0x88, +0x84,0x82,0x81,0x7E,0x7D,0x7E,0x7F,0x81,0x89,0x8A,0x84,0x80,0x7E,0x80,0x83,0x82, +0x82,0x82,0x81,0x81,0x82,0x87,0x87,0x80,0x7B,0x7D,0x83,0x83,0x7F,0x7D,0x7E,0x80, +0x86,0x88,0x83,0x81,0x7F,0x7B,0x78,0x78,0x78,0x77,0x7B,0x81,0x87,0x89,0x8A,0x8A, +0x86,0x84,0x80,0x80,0x86,0x86,0x84,0x82,0x85,0x88,0x84,0x80,0x7E,0x7D,0x7A,0x78, +0x76,0x78,0x7C,0x7F,0x81,0x80,0x80,0x80,0x81,0x80,0x7E,0x7D,0x7F,0x83,0x86,0x86, +0x87,0x83,0x81,0x80,0x7D,0x79,0x76,0x78,0x7A,0x7C,0x7F,0x82,0x83,0x84,0x84,0x86, +0x87,0x87,0x84,0x80,0x7E,0x7F,0x82,0x83,0x81,0x7E,0x80,0x81,0x81,0x82,0x82,0x7D, +0x79,0x78,0x77,0x75,0x75,0x74,0x77,0x7B,0x80,0x81,0x82,0x83,0x84,0x85,0x83,0x80, +0x80,0x7F,0x7C,0x7C,0x7C,0x7D,0x80,0x87,0x8A,0x86,0x82,0x82,0x84,0x83,0x7C,0x78, +0x79,0x79,0x79,0x7C,0x81,0x82,0x83,0x83,0x7F,0x7C,0x7A,0x76,0x72,0x71,0x74,0x77, +0x78,0x7A,0x7B,0x7A,0x7D,0x82,0x89,0x8E,0x8D,0x8B,0x89,0x88,0x89,0x8A,0x89,0x85, +0x81,0x7E,0x80,0x81,0x7F,0x7F,0x82,0x82,0x80,0x7C,0x76,0x78,0x7D,0x7D,0x7B,0x79, +0x7D,0x82,0x89,0x8C,0x8B,0x8B,0x8B,0x89,0x85,0x83,0x82,0x81,0x81,0x82,0x7E,0x80, +0x84,0x84,0x83,0x81,0x84,0x89,0x8C,0x8C,0x84,0x81,0x7D,0x78,0x76,0x77,0x79,0x7E, +0x85,0x89,0x88,0x8B,0x8A,0x86,0x82,0x7F,0x7E,0x7E,0x7E,0x80,0x7D,0x7C,0x7E,0x82, +0x83,0x83,0x84,0x81,0x79,0x76,0x77,0x7B,0x82,0x85,0x87,0x87,0x88,0x86,0x81,0x83, +0x82,0x7D,0x7D,0x79,0x76,0x76,0x79,0x75,0x74,0x75,0x74,0x7B,0x79,0x77,0x77,0x74, +0x7B,0x83,0x7F,0x7A,0x7D,0x85,0x84,0x80,0x81,0x7D,0x80,0x85,0x81,0x7E,0x7E,0x80, +0x80,0x7F,0x83,0x84,0x85,0x87,0x86,0x84,0x85,0x88,0x82,0x7F,0x7E,0x7E,0x7C,0x7D, +0x7D,0x79,0x7A,0x7F,0x80,0x7E,0x7A,0x7A,0x7B,0x7C,0x79,0x76,0x79,0x7B,0x7B,0x78, +0x7E,0x82,0x81,0x85,0x89,0x8B,0x88,0x85,0x81,0x7D,0x80,0x84,0x83,0x84,0x89,0x8A, +0x89,0x89,0x86,0x83,0x83,0x85,0x80,0x80,0x7E,0x7A,0x84,0x89,0x86,0x81,0x7F,0x80, +0x7E,0x7E,0x7C,0x79,0x7E,0x78,0x78,0x80,0x7F,0x87,0x84,0x80,0x7A,0x79,0x82,0x7D, +0x83,0x82,0x74,0x81,0x82,0x87,0x8B,0x8C,0x8E,0x8A,0x8B,0x84,0x7A,0x80,0x82,0x81, +0x87,0x82,0x82,0x80,0x7C,0x7B,0x77,0x7A,0x7B,0x7D,0x81,0x77,0x7C,0x80,0x7B,0x85, +0x86,0x89,0x8B,0x89,0x8A,0x81,0x84,0x83,0x78,0x83,0x7B,0x7A,0x83,0x7D,0x7B,0x79, +0x7F,0x85,0x83,0x8A,0x84,0x7D,0x87,0x7F,0x7C,0x79,0x75,0x79,0x7A,0x82,0x81,0x7F, +0x85,0x7B,0x7C,0x7E,0x7D,0x80,0x7A,0x79,0x79,0x7C,0x84,0x82,0x86,0x84,0x7F,0x80, +0x81,0x85,0x87,0x80,0x7B,0x75,0x74,0x76,0x76,0x7A,0x7A,0x7D,0x84,0x86,0x88,0x84, +0x7E,0x7A,0x7A,0x7C,0x7A,0x7D,0x7F,0x7D,0x7E,0x7F,0x83,0x87,0x87,0x82,0x7E,0x7E, +0x7D,0x7B,0x7D,0x7C,0x7C,0x7D,0x7C,0x7B,0x7A,0x7D,0x7D,0x7F,0x83,0x84,0x84,0x85, +0x83,0x82,0x7E,0x7D,0x7F,0x83,0x84,0x83,0x83,0x81,0x80,0x84,0x88,0x89,0x86,0x84, +0x82,0x7E,0x7B,0x7A,0x7C,0x80,0x85,0x89,0x88,0x86,0x87,0x87,0x84,0x82,0x7F,0x82, +0x83,0x82,0x83,0x82,0x82,0x82,0x82,0x82,0x80,0x81,0x82,0x81,0x7F,0x7E,0x7F,0x7F, +0x81,0x82,0x80,0x80,0x81,0x82,0x83,0x82,0x7F,0x80,0x84,0x88,0x87,0x84,0x84,0x81, +0x80,0x7E,0x7A,0x7B,0x7C,0x7E,0x80,0x82,0x83,0x7F,0x80,0x80,0x7C,0x79,0x77,0x76, +0x76,0x79,0x7F,0x7F,0x81,0x83,0x80,0x82,0x81,0x7E,0x7E,0x7B,0x7C,0x7D,0x80,0x84, +0x85,0x89,0x8A,0x86,0x84,0x81,0x7F,0x7B,0x79,0x7B,0x79,0x78,0x7A,0x7D,0x81,0x83, +0x83,0x80,0x7E,0x7F,0x7D,0x78,0x76,0x73,0x75,0x79,0x83,0x88,0x83,0x7E,0x7A,0x7C, +0x7F,0x7D,0x7D,0x7C,0x7E,0x7F,0x7F,0x86,0x87,0x84,0x7F,0x7E,0x86,0x89,0x88,0x87, +0x85,0x85,0x80,0x81,0x84,0x85,0x87,0x86,0x81,0x7F,0x7D,0x7B,0x7A,0x7A,0x7A,0x7A, +0x7B,0x7C,0x7A,0x79,0x79,0x7B,0x7F,0x82,0x81,0x84,0x89,0x87,0x83,0x81,0x81,0x80, +0x7C,0x7B,0x7C,0x7E,0x7F,0x83,0x84,0x84,0x88,0x8C,0x8A,0x87,0x88,0x87,0x84,0x80, +0x7A,0x7B,0x80,0x80,0x7E,0x7F,0x82,0x84,0x83,0x80,0x7A,0x7A,0x7E,0x7E,0x7D,0x7A, +0x7D,0x82,0x87,0x89,0x88,0x87,0x85,0x82,0x80,0x7F,0x80,0x80,0x7D,0x7B,0x7D,0x82, +0x86,0x87,0x88,0x87,0x85,0x83,0x83,0x84,0x85,0x87,0x86,0x81,0x7E,0x7B,0x7A,0x7B, +0x7B,0x7B,0x7E,0x7F,0x7B,0x74,0x74,0x7B,0x80,0x80,0x7D,0x7A,0x7C,0x81,0x82,0x7F, +0x80,0x80,0x80,0x81,0x83,0x84,0x83,0x80,0x7E,0x7C,0x7C,0x7E,0x81,0x83,0x85,0x87, +0x88,0x83,0x7D,0x77,0x76,0x7A,0x7D,0x7D,0x7C,0x7F,0x82,0x7F,0x7B,0x77,0x79,0x7A, +0x79,0x79,0x7A,0x7B,0x7A,0x7A,0x7C,0x7D,0x7C,0x7B,0x7B,0x7C,0x7C,0x7C,0x7D,0x7E, +0x82,0x87,0x8A,0x89,0x85,0x82,0x81,0x82,0x82,0x7F,0x7E,0x85,0x8A,0x88,0x85,0x87, +0x87,0x84,0x80,0x80,0x82,0x86,0x85,0x7E,0x78,0x77,0x7B,0x80,0x80,0x7D,0x7F,0x84, +0x86,0x88,0x84,0x7E,0x80,0x82,0x81,0x7F,0x81,0x83,0x82,0x81,0x81,0x81,0x88,0x86, +0x7E,0x79,0x7A,0x7D,0x7E,0x85,0x88,0x86,0x86,0x83,0x7F,0x83,0x82,0x89,0x86,0x83, +0x87,0x83,0x86,0x83,0x82,0x80,0x7C,0x81,0x7E,0x7A,0x82,0x82,0x7F,0x7B,0x78,0x79, +0x7F,0x7F,0x80,0x7C,0x83,0x87,0x84,0x86,0x7E,0x80,0x81,0x7B,0x7D,0x79,0x7F,0x83, +0x80,0x7E,0x76,0x7F,0x7C,0x7A,0x7F,0x79,0x7E,0x83,0x84,0x84,0x82,0x86,0x84,0x83, +0x85,0x83,0x83,0x88,0x82,0x78,0x7A,0x78,0x7F,0x7A,0x7E,0x7F,0x7D,0x83,0x7E,0x84, +0x80,0x80,0x7E,0x72,0x72,0x78,0x7A,0x7D,0x7F,0x83,0x84,0x89,0x89,0x86,0x83,0x84, +0x80,0x80,0x7F,0x79,0x79,0x7F,0x81,0x7F,0x80,0x87,0x82,0x82,0x7F,0x7D,0x7B,0x7B, +0x78,0x74,0x7A,0x81,0x81,0x83,0x7F,0x7F,0x7E,0x7E,0x7B,0x78,0x7B,0x7C,0x7C,0x78, +0x77,0x7C,0x81,0x8B,0x89,0x8E,0x8A,0x8A,0x8C,0x83,0x81,0x81,0x87,0x87,0x84,0x85, +0x82,0x81,0x80,0x7D,0x78,0x7A,0x78,0x74,0x7B,0x7D,0x81,0x84,0x82,0x80,0x7A,0x7E, +0x80,0x83,0x83,0x82,0x82,0x80,0x7E,0x7C,0x7C,0x7B,0x7C,0x80,0x81,0x86,0x8B,0x84, +0x83,0x86,0x85,0x83,0x84,0x84,0x87,0x8A,0x8A,0x86,0x88,0x8E,0x8D,0x8D,0x8D,0x83, +0x7E,0x7D,0x7A,0x78,0x73,0x72,0x77,0x7B,0x7C,0x7A,0x7C,0x7E,0x7F,0x83,0x84,0x83, +0x83,0x82,0x81,0x82,0x81,0x7E,0x7E,0x82,0x84,0x88,0x89,0x89,0x8A,0x87,0x82,0x7C, +0x78,0x78,0x76,0x75,0x75,0x76,0x7A,0x7D,0x80,0x83,0x85,0x85,0x82,0x7B,0x78,0x77, +0x78,0x7A,0x7C,0x7F,0x7D,0x7A,0x7A,0x78,0x79,0x7C,0x7E,0x7F,0x81,0x84,0x86,0x87, +0x86,0x81,0x80,0x7E,0x7D,0x80,0x82,0x83,0x80,0x7D,0x7A,0x77,0x79,0x79,0x78,0x7C, +0x7E,0x7E,0x7D,0x7B,0x7D,0x7F,0x83,0x85,0x82,0x83,0x82,0x81,0x7F,0x7C,0x82,0x89, +0x8A,0x85,0x82,0x82,0x85,0x8A,0x88,0x81,0x7B,0x7A,0x7A,0x7B,0x78,0x7A,0x7F,0x84, +0x86,0x85,0x85,0x84,0x83,0x82,0x7F,0x7D,0x7F,0x80,0x81,0x84,0x83,0x81,0x7F,0x80, +0x88,0x89,0x87,0x84,0x85,0x86,0x88,0x88,0x84,0x80,0x81,0x83,0x88,0x82,0x7F,0x81, +0x81,0x7E,0x76,0x76,0x78,0x7B,0x81,0x7F,0x80,0x83,0x85,0x82,0x81,0x80,0x7D,0x7D, +0x79,0x7C,0x81,0x83,0x82,0x7C,0x7D,0x7D,0x7E,0x83,0x82,0x7E,0x7D,0x7A,0x7F,0x82, +0x86,0x89,0x8A,0x88,0x82,0x83,0x83,0x81,0x80,0x7F,0x82,0x80,0x7D,0x7E,0x78,0x7B, +0x7B,0x7A,0x80,0x81,0x84,0x84,0x80,0x7F,0x7B,0x7D,0x7F,0x7D,0x7B,0x7D,0x7F,0x83, +0x81,0x7E,0x81,0x82,0x83,0x80,0x7C,0x7B,0x7D,0x82,0x7F,0x7C,0x7E,0x81,0x86,0x85, +0x86,0x85,0x82,0x82,0x7E,0x7C,0x7C,0x7D,0x7F,0x7B,0x75,0x76,0x7A,0x7D,0x7F,0x7F, +0x80,0x7E,0x7B,0x7C,0x7D,0x81,0x81,0x81,0x82,0x80,0x81,0x81,0x84,0x83,0x82,0x81, +0x7E,0x7F,0x81,0x82,0x82,0x80,0x7E,0x7D,0x7E,0x80,0x80,0x7F,0x7E,0x7C,0x7B,0x7B, +0x7B,0x7B,0x79,0x7C,0x80,0x80,0x82,0x81,0x7E,0x79,0x79,0x7D,0x7D,0x7F,0x7F,0x81, +0x87,0x8B,0x8A,0x86,0x83,0x84,0x8A,0x8E,0x8D,0x89,0x89,0x89,0x88,0x87,0x86,0x83, +0x83,0x84,0x86,0x84,0x80,0x80,0x81,0x80,0x81,0x82,0x7F,0x78,0x73,0x72,0x6E,0x72, +0x79,0x7F,0x84,0x86,0x85,0x83,0x83,0x88,0x88,0x89,0x85,0x7E,0x7D,0x7E,0x81,0x81, +0x84,0x88,0x87,0x85,0x84,0x84,0x84,0x81,0x7B,0x7A,0x7D,0x85,0x88,0x85,0x85,0x82, +0x84,0x84,0x82,0x83,0x80,0x7F,0x7F,0x7B,0x75,0x70,0x70,0x72,0x78,0x7E,0x7E,0x80, +0x82,0x7F,0x7C,0x7B,0x7C,0x7B,0x7D,0x7B,0x79,0x79,0x7A,0x79,0x7D,0x81,0x82,0x83, +0x83,0x85,0x83,0x80,0x7F,0x7F,0x85,0x83,0x80,0x7E,0x7A,0x80,0x83,0x85,0x84,0x7D, +0x7B,0x7A,0x80,0x7F,0x7E,0x7D,0x7B,0x7D,0x79,0x80,0x85,0x86,0x83,0x7C,0x7C,0x76, +0x78,0x7B,0x7C,0x7D,0x7B,0x84,0x83,0x88,0x8C,0x8B,0x88,0x85,0x83,0x80,0x7E,0x7E, +0x7C,0x7C,0x7F,0x83,0x83,0x8A,0x8A,0x8B,0x8C,0x88,0x84,0x79,0x77,0x74,0x74,0x7A, +0x7B,0x7D,0x80,0x81,0x81,0x80,0x7E,0x7F,0x83,0x82,0x81,0x81,0x80,0x82,0x83,0x85, +0x84,0x89,0x85,0x89,0x87,0x82,0x81,0x7E,0x83,0x82,0x81,0x82,0x7B,0x7F,0x82,0x81, +0x87,0x85,0x85,0x88,0x8B,0x89,0x86,0x7F,0x78,0x78,0x7A,0x7B,0x7A,0x7C,0x7D,0x7C, +0x7B,0x77,0x7B,0x80,0x80,0x7C,0x7A,0x7A,0x7A,0x81,0x85,0x80,0x81,0x82,0x86,0x8A, +0x88,0x88,0x85,0x80,0x80,0x7E,0x7E,0x7D,0x7C,0x7F,0x83,0x88,0x8C,0x8E,0x8B,0x84, +0x7E,0x7B,0x7C,0x7C,0x7C,0x7B,0x78,0x78,0x79,0x79,0x79,0x7A,0x7A,0x77,0x74,0x74, +0x76,0x78,0x7D,0x81,0x81,0x82,0x82,0x82,0x83,0x81,0x80,0x81,0x84,0x86,0x87,0x89, +0x88,0x83,0x7D,0x76,0x7A,0x7F,0x80,0x7F,0x7E,0x7E,0x80,0x83,0x84,0x81,0x82,0x80, +0x7A,0x77,0x76,0x73,0x72,0x74,0x78,0x7D,0x81,0x83,0x84,0x85,0x81,0x7E,0x7C,0x7D, +0x7F,0x7E,0x7E,0x80,0x82,0x86,0x8B,0x8F,0x8E,0x89,0x84,0x81,0x80,0x80,0x7B,0x7A, +0x7E,0x82,0x84,0x84,0x88,0x89,0x87,0x82,0x7A,0x75,0x75,0x78,0x7C,0x7D,0x7B,0x7D, +0x81,0x86,0x85,0x83,0x84,0x81,0x82,0x83,0x84,0x8A,0x8E,0x91,0x90,0x90,0x8C,0x87, +0x85,0x82,0x7D,0x7C,0x78,0x78,0x7B,0x80,0x86,0x87,0x86,0x82,0x82,0x82,0x7F,0x7F, +0x7A,0x79,0x7A,0x7C,0x7C,0x7B,0x80,0x7D,0x7B,0x7B,0x77,0x7A,0x7B,0x7E,0x83,0x85, +0x87,0x88,0x87,0x83,0x7E,0x7E,0x82,0x81,0x80,0x7E,0x7F,0x81,0x80,0x7D,0x7C,0x7E, +0x81,0x7F,0x7B,0x78,0x7A,0x7E,0x7D,0x7F,0x81,0x83,0x86,0x83,0x82,0x7E,0x7D,0x7D, +0x79,0x75,0x75,0x78,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x80,0x7A,0x7C,0x7D,0x82,0x81, +0x80,0x80,0x7F,0x83,0x84,0x84,0x83,0x7F,0x7E,0x7D,0x7F,0x7E,0x7B,0x7C,0x7B,0x7C, +0x7E,0x7F,0x80,0x80,0x80,0x82,0x83,0x83,0x84,0x85,0x88,0x89,0x87,0x85,0x81,0x7F, +0x7D,0x7A,0x7B,0x7B,0x7A,0x7A,0x7C,0x80,0x81,0x83,0x84,0x85,0x83,0x83,0x84,0x83, +0x7F,0x7E,0x80,0x81,0x82,0x81,0x82,0x82,0x7F,0x7B,0x79,0x7A,0x7C,0x7D,0x80,0x82, +0x85,0x87,0x88,0x89,0x89,0x87,0x83,0x80,0x83,0x85,0x84,0x81,0x7E,0x7D,0x7D,0x7F, +0x81,0x80,0x81,0x81,0x82,0x82,0x82,0x82,0x81,0x7F,0x7F,0x7C,0x7C,0x80,0x80,0x7E, +0x7F,0x81,0x81,0x85,0x85,0x81,0x81,0x7E,0x7E,0x80,0x83,0x84,0x82,0x85,0x89,0x86, +0x88,0x88,0x85,0x83,0x80,0x7F,0x82,0x82,0x83,0x80,0x7A,0x78,0x79,0x7F,0x7D,0x7B, +0x7D,0x79,0x79,0x75,0x73,0x73,0x78,0x7F,0x7F,0x83,0x84,0x81,0x82,0x80,0x7F,0x80, +0x7F,0x82,0x84,0x83,0x85,0x83,0x82,0x82,0x7F,0x7E,0x7D,0x80,0x81,0x81,0x7F,0x7F, +0x81,0x83,0x83,0x7F,0x7A,0x78,0x76,0x74,0x74,0x73,0x75,0x76,0x79,0x7C,0x7C,0x7B, +0x7D,0x80,0x82,0x81,0x7E,0x7F,0x81,0x82,0x83,0x82,0x86,0x85,0x86,0x86,0x82,0x82, +0x7F,0x82,0x85,0x87,0x87,0x85,0x89,0x87,0x84,0x7E,0x7D,0x7F,0x7C,0x7C,0x7A,0x7C, +0x7E,0x7D,0x7F,0x7F,0x81,0x84,0x85,0x86,0x84,0x84,0x7F,0x7E,0x81,0x84,0x88,0x87, +0x86,0x83,0x82,0x81,0x80,0x7F,0x7B,0x7D,0x7F,0x80,0x82,0x84,0x86,0x87,0x89,0x8A, +0x86,0x86,0x84,0x85,0x83,0x84,0x83,0x81,0x80,0x7B,0x79,0x7B,0x7A,0x79,0x76,0x77, +0x7C,0x7D,0x80,0x80,0x82,0x87,0x87,0x85,0x81,0x7F,0x83,0x82,0x81,0x82,0x80,0x80, +0x80,0x7D,0x7B,0x7D,0x80,0x84,0x83,0x81,0x80,0x82,0x85,0x83,0x80,0x81,0x80,0x7E, +0x7B,0x77,0x77,0x76,0x76,0x76,0x76,0x75,0x77,0x7C,0x7E,0x7F,0x7D,0x7E,0x80,0x81, +0x81,0x82,0x84,0x86,0x84,0x84,0x85,0x86,0x86,0x84,0x82,0x80,0x7E,0x7C,0x7B,0x7E, +0x7F,0x7E,0x7E,0x7F,0x81,0x83,0x84,0x82,0x7F,0x7C,0x7B,0x7E,0x82,0x83,0x83,0x82, +0x7F,0x7A,0x77,0x79,0x7E,0x81,0x80,0x7E,0x7F,0x7F,0x7D,0x7B,0x7B,0x7F,0x82,0x82, +0x81,0x80,0x7F,0x7B,0x7B,0x7F,0x82,0x85,0x87,0x89,0x8A,0x89,0x87,0x86,0x86,0x81, +0x7C,0x7D,0x7D,0x7D,0x7C,0x79,0x79,0x7A,0x80,0x87,0x88,0x87,0x85,0x84,0x80,0x7D, +0x7A,0x79,0x7D,0x82,0x84,0x81,0x7F,0x82,0x85,0x89,0x87,0x81,0x7D,0x78,0x77,0x78, +0x7B,0x7F,0x82,0x87,0x86,0x86,0x88,0x88,0x85,0x7E,0x7C,0x7E,0x84,0x85,0x85,0x87, +0x85,0x84,0x81,0x7F,0x7C,0x7D,0x82,0x82,0x82,0x82,0x82,0x83,0x85,0x82,0x80,0x7F, +0x7E,0x80,0x81,0x80,0x7D,0x7A,0x7A,0x7D,0x84,0x88,0x87,0x84,0x81,0x80,0x80,0x7F, +0x7B,0x7A,0x7B,0x7B,0x7D,0x7E,0x7E,0x7F,0x80,0x81,0x84,0x82,0x7F,0x7F,0x7F,0x7D, +0x7D,0x7F,0x82,0x84,0x85,0x86,0x83,0x7E,0x78,0x74,0x73,0x72,0x73,0x76,0x79,0x7C, +0x80,0x81,0x7E,0x7D,0x7E,0x81,0x83,0x83,0x80,0x7C,0x7A,0x7B,0x7E,0x83,0x85,0x86, +0x85,0x83,0x7E,0x7A,0x78,0x7A,0x7F,0x82,0x83,0x7F,0x7D,0x7B,0x7A,0x7A,0x7B,0x7E, +0x7F,0x7F,0x81,0x80,0x7F,0x80,0x82,0x85,0x87,0x87,0x85,0x82,0x80,0x7F,0x80,0x82, +0x84,0x85,0x88,0x88,0x85,0x86,0x86,0x84,0x80,0x7C,0x7D,0x80,0x81,0x80,0x7E,0x7E, +0x7F,0x80,0x81,0x81,0x7F,0x80,0x80,0x7D,0x7D,0x7E,0x83,0x86,0x83,0x81,0x7E,0x81, +0x85,0x84,0x84,0x88,0x88,0x8C,0x8B,0x89,0x87,0x86,0x86,0x83,0x7F,0x7C,0x7A,0x78, +0x78,0x79,0x7C,0x7E,0x81,0x80,0x7E,0x7B,0x7E,0x81,0x7F,0x7F,0x80,0x81,0x82,0x82, +0x80,0x80,0x7D,0x80,0x80,0x7E,0x7B,0x7A,0x7A,0x7C,0x7C,0x81,0x85,0x87,0x88,0x8A, +0x89,0x88,0x82,0x7F,0x81,0x81,0x82,0x7E,0x7B,0x7B,0x7A,0x79,0x79,0x78,0x7A,0x7B, +0x7D,0x7D,0x79,0x78,0x7D,0x83,0x86,0x85,0x83,0x84,0x85,0x85,0x84,0x83,0x83,0x81, +0x7E,0x7B,0x7A,0x7A,0x7A,0x7B,0x7E,0x81,0x82,0x82,0x80,0x7D,0x7A,0x7A,0x7B,0x7D, +0x7E,0x7E,0x80,0x82,0x85,0x85,0x82,0x81,0x7D,0x7A,0x78,0x79,0x7D,0x81,0x84,0x85, +0x85,0x85,0x85,0x85,0x83,0x7F,0x7C,0x7C,0x81,0x86,0x87,0x85,0x82,0x82,0x80,0x7F, +0x7D,0x7A,0x7B,0x7E,0x80,0x7D,0x7B,0x7C,0x7C,0x7D,0x7B,0x7A,0x7C,0x7E,0x7E,0x7B, +0x7B,0x7E,0x82,0x84,0x82,0x80,0x81,0x83,0x84,0x84,0x83,0x82,0x83,0x84,0x84,0x83, +0x85,0x8A,0x8E,0x8E,0x89,0x85,0x84,0x83,0x83,0x82,0x81,0x80,0x80,0x7F,0x80,0x82, +0x82,0x7F,0x7D,0x7C,0x7D,0x7E,0x7D,0x7B,0x7B,0x7C,0x7F,0x80,0x81,0x82,0x84,0x83, +0x81,0x7E,0x7D,0x81,0x86,0x87,0x86,0x87,0x86,0x86,0x84,0x84,0x84,0x85,0x85,0x83, +0x81,0x7F,0x7A,0x77,0x78,0x7D,0x84,0x87,0x85,0x82,0x80,0x80,0x7F,0x7B,0x77,0x76, +0x7A,0x7C,0x7B,0x77,0x76,0x79,0x7B,0x7C,0x7B,0x7B,0x7E,0x7E,0x7E,0x7E,0x7E,0x7F, +0x7F,0x7F,0x7E,0x7E,0x82,0x86,0x86,0x86,0x85,0x83,0x80,0x7F,0x7F,0x7C,0x77,0x73, +0x75,0x7B,0x82,0x86,0x87,0x84,0x80,0x7D,0x7C,0x7C,0x7A,0x78,0x76,0x78,0x7A,0x7B, +0x7E,0x81,0x81,0x7F,0x7E,0x7F,0x81,0x82,0x82,0x83,0x86,0x87,0x87,0x86,0x84,0x82, +0x83,0x85,0x84,0x81,0x80,0x82,0x83,0x84,0x84,0x83,0x84,0x83,0x81,0x7E,0x7D,0x7E, +0x7F,0x80,0x80,0x7F,0x7F,0x7E,0x7F,0x7F,0x7F,0x81,0x81,0x80,0x7F,0x80,0x82,0x83, +0x83,0x82,0x81,0x81,0x82,0x82,0x81,0x82,0x82,0x82,0x81,0x81,0x83,0x86,0x89,0x89, +0x87,0x84,0x81,0x80,0x81,0x83,0x83,0x80,0x7F,0x80,0x81,0x81,0x7F,0x7E,0x7D,0x7F, +0x81,0x81,0x7E,0x7B,0x79,0x79,0x7B,0x7C,0x7E,0x7E,0x7C,0x7A,0x79,0x7A,0x7C,0x7E, +0x7E,0x7E,0x82,0x86,0x89,0x88,0x88,0x87,0x87,0x89,0x89,0x8A,0x89,0x85,0x84,0x83, +0x82,0x7F,0x7C,0x7A,0x79,0x78,0x77,0x76,0x77,0x79,0x7B,0x7C,0x7D,0x7F,0x7F,0x79, +0x74,0x73,0x75,0x79,0x7E,0x82,0x85,0x86,0x87,0x87,0x88,0x86,0x84,0x82,0x81,0x80, +0x7E,0x7E,0x81,0x84,0x85,0x84,0x83,0x83,0x84,0x81,0x7C,0x78,0x77,0x77,0x76,0x77, +0x78,0x77,0x77,0x79,0x7D,0x7E,0x7D,0x7D,0x7E,0x81,0x83,0x81,0x7F,0x80,0x80,0x7F, +0x7E,0x7E,0x80,0x83,0x85,0x85,0x84,0x81,0x7F,0x7E,0x7F,0x82,0x86,0x89,0x89,0x85, +0x80,0x7E,0x7E,0x7E,0x7D,0x7F,0x84,0x88,0x88,0x87,0x84,0x81,0x81,0x83,0x84,0x82, +0x7E,0x7B,0x7A,0x7B,0x7D,0x81,0x83,0x82,0x82,0x81,0x7F,0x7D,0x7D,0x7F,0x82,0x85, +0x86,0x86,0x86,0x83,0x81,0x82,0x85,0x89,0x8A,0x8B,0x8A,0x8A,0x87,0x81,0x7F,0x7F, +0x80,0x80,0x7F,0x80,0x82,0x82,0x83,0x84,0x83,0x80,0x7E,0x80,0x80,0x7E,0x7A,0x79, +0x7A,0x7B,0x7B,0x78,0x76,0x76,0x76,0x77,0x78,0x7A,0x7D,0x81,0x85,0x89,0x8B,0x8B, +0x89,0x87,0x84,0x81,0x7E,0x7B,0x79,0x7A,0x7D,0x80,0x82,0x82,0x81,0x80,0x7F,0x7D, +0x7A,0x7A,0x78,0x76,0x75,0x77,0x7B,0x7E,0x7E,0x7E,0x7F,0x80,0x7F,0x7B,0x78,0x77, +0x78,0x7D,0x81,0x81,0x80,0x81,0x82,0x82,0x83,0x87,0x8A,0x8B,0x8A,0x86,0x81,0x7F, +0x7F,0x7E,0x7B,0x78,0x78,0x7B,0x7F,0x80,0x7F,0x7F,0x7E,0x7F,0x82,0x83,0x82,0x83, +0x83,0x80,0x80,0x82,0x84,0x80,0x7B,0x7B,0x7F,0x83,0x83,0x82,0x82,0x82,0x81,0x81, +0x81,0x80,0x7F,0x7C,0x78,0x79,0x7D,0x81,0x85,0x88,0x88,0x86,0x85,0x84,0x86,0x87, +0x86,0x85,0x83,0x83,0x85,0x85,0x85,0x85,0x84,0x84,0x83,0x7F,0x7A,0x78,0x79,0x7A, +0x7B,0x7D,0x81,0x85,0x89,0x89,0x85,0x80,0x7D,0x79,0x78,0x77,0x76,0x77,0x79,0x7B, +0x7D,0x80,0x82,0x85,0x87,0x88,0x88,0x88,0x87,0x86,0x85,0x84,0x83,0x85,0x87,0x85, +0x81,0x81,0x81,0x81,0x81,0x7F,0x7D,0x7C,0x7E,0x7F,0x80,0x81,0x81,0x7F,0x7D,0x7D, +0x80,0x80,0x80,0x7F,0x7E,0x7A,0x76,0x75,0x79,0x7B,0x79,0x79,0x7C,0x81,0x85,0x86, +0x84,0x81,0x80,0x81,0x82,0x81,0x7F,0x7D,0x7D,0x7F,0x80,0x7F,0x80,0x80,0x81,0x80, +0x7F,0x7F,0x80,0x7F,0x7C,0x7C,0x7D,0x7E,0x7E,0x7E,0x7F,0x7F,0x7F,0x7C,0x7A,0x79, +0x78,0x77,0x76,0x77,0x77,0x7A,0x7D,0x81,0x85,0x84,0x84,0x83,0x82,0x85,0x86,0x84, +0x80,0x7F,0x82,0x86,0x89,0x89,0x86,0x83,0x80,0x7C,0x79,0x78,0x7A,0x7F,0x80,0x7F, +0x7E,0x7E,0x7E,0x7D,0x7C,0x7B,0x7B,0x7C,0x7E,0x7F,0x7F,0x80,0x83,0x85,0x84,0x84, +0x86,0x86,0x84,0x84,0x86,0x8A,0x8B,0x8A,0x8A,0x8A,0x8A,0x8C,0x8C,0x8A,0x87,0x83, +0x80,0x80,0x82,0x84,0x84,0x84,0x83,0x81,0x80,0x7D,0x7B,0x79,0x78,0x76,0x78,0x78, +0x77,0x78,0x7C,0x7F,0x80,0x82,0x81,0x80,0x7C,0x7A,0x7C,0x7F,0x82,0x83,0x85,0x88, +0x8B,0x8D,0x8C,0x8B,0x88,0x85,0x84,0x82,0x81,0x7E,0x7D,0x7C,0x7C,0x7E,0x7E,0x7E, +0x7E,0x7F,0x7F,0x7E,0x7A,0x76,0x75,0x76,0x77,0x78,0x7A,0x7C,0x7B,0x78,0x76,0x78, +0x7B,0x7E,0x7D,0x7D,0x7E,0x7F,0x80,0x83,0x85,0x85,0x83,0x82,0x82,0x84,0x85,0x86, +0x86,0x83,0x7E,0x79,0x77,0x79,0x79,0x79,0x7A,0x7D,0x80,0x80,0x80,0x82,0x82,0x83, +0x83,0x82,0x81,0x81,0x81,0x81,0x82,0x85,0x87,0x85,0x82,0x7E,0x7B,0x7A,0x7C,0x7D, +0x7A,0x78,0x79,0x7D,0x7F,0x7E,0x7F,0x81,0x83,0x83,0x82,0x82,0x83,0x84,0x85,0x84, +0x83,0x83,0x84,0x85,0x86,0x86,0x83,0x7F,0x7E,0x80,0x81,0x81,0x80,0x7E,0x7D,0x7E, +0x82,0x85,0x86,0x88,0x88,0x86,0x81,0x7C,0x7B,0x7C,0x7D,0x7B,0x7A,0x7C,0x7E,0x7E, +0x7C,0x79,0x78,0x7A,0x80,0x84,0x85,0x84,0x85,0x87,0x8A,0x8D,0x8E,0x8B,0x87,0x83, +0x80,0x7F,0x80,0x7E,0x7C,0x7B,0x7C,0x7E,0x80,0x81,0x82,0x81,0x7F,0x7D,0x7D,0x7E, +0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x7D,0x7E,0x81,0x83,0x84,0x85,0x85,0x85,0x85,0x83, +0x82,0x81,0x80,0x80,0x80,0x80,0x81,0x82,0x82,0x81,0x7F,0x7F,0x7F,0x7F,0x7F,0x7B, +0x79,0x79,0x7C,0x7E,0x7D,0x7C,0x7C,0x7B,0x79,0x77,0x77,0x77,0x78,0x7A,0x7D,0x80, +0x83,0x86,0x86,0x85,0x81,0x80,0x81,0x85,0x87,0x84,0x7F,0x7D,0x7D,0x7E,0x7E,0x7E, +0x80,0x81,0x81,0x80,0x80,0x7F,0x7E,0x7C,0x7B,0x7A,0x79,0x7B,0x7B,0x7B,0x79,0x78, +0x7A,0x7E,0x82,0x82,0x81,0x7F,0x7C,0x7A,0x79,0x7B,0x7D,0x80,0x83,0x85,0x87,0x88, +0x88,0x87,0x88,0x87,0x86,0x86,0x85,0x85,0x85,0x84,0x83,0x83,0x83,0x81,0x80,0x81, +0x83,0x83,0x85,0x85,0x84,0x80,0x7D,0x7A,0x77,0x74,0x76,0x7A,0x7F,0x83,0x84,0x84, +0x84,0x85,0x84,0x80,0x7C,0x7A,0x7B,0x7E,0x82,0x87,0x8B,0x8D,0x8E,0x8D,0x8A,0x85, +0x81,0x7F,0x7D,0x7D,0x80,0x85,0x88,0x89,0x88,0x87,0x85,0x83,0x82,0x80,0x7A,0x76, +0x74,0x73,0x74,0x76,0x78,0x7B,0x7E,0x7F,0x7F,0x7E,0x7F,0x7E,0x7C,0x7C,0x80,0x84, +0x85,0x82,0x80,0x80,0x84,0x88,0x8C,0x8C,0x88,0x84,0x82,0x82,0x80,0x7C,0x7B,0x7B, +0x7B,0x77,0x74,0x74,0x74,0x75,0x79,0x7D,0x81,0x82,0x80,0x7E,0x7E,0x80,0x80,0x7F, +0x7E,0x7C,0x7B,0x7E,0x83,0x87,0x87,0x84,0x82,0x81,0x82,0x83,0x82,0x7F,0x7C,0x7A, +0x7A,0x7E,0x82,0x84,0x84,0x84,0x83,0x81,0x7F,0x7E,0x7D,0x7C,0x7D,0x7C,0x7D,0x7E, +0x7E,0x7E,0x7E,0x7F,0x7F,0x7D,0x7B,0x79,0x79,0x7C,0x81,0x83,0x84,0x87,0x88,0x86, +0x84,0x83,0x81,0x80,0x7F,0x7F,0x80,0x82,0x82,0x81,0x80,0x7F,0x7E,0x7E,0x7E,0x82, +0x86,0x88,0x88,0x86,0x84,0x7F,0x7B,0x7A,0x79,0x78,0x78,0x7A,0x7C,0x7E,0x82,0x85, +0x87,0x85,0x81,0x7F,0x7C,0x7B,0x7C,0x7E,0x80,0x82,0x85,0x89,0x8E,0x91,0x8F,0x88, +0x84,0x81,0x81,0x81,0x7F,0x7F,0x80,0x82,0x84,0x85,0x85,0x82,0x80,0x7E,0x7D,0x7E, +0x7D,0x7C,0x7A,0x79,0x78,0x7A,0x7E,0x83,0x86,0x89,0x88,0x84,0x82,0x80,0x7F,0x7F, +0x80,0x83,0x86,0x87,0x86,0x85,0x84,0x82,0x80,0x7C,0x7A,0x79,0x7C,0x7F,0x81,0x80, +0x80,0x83,0x86,0x83,0x7F,0x7C,0x7A,0x78,0x77,0x77,0x79,0x7B,0x7E,0x7E,0x7A,0x76, +0x74,0x76,0x7C,0x82,0x85,0x86,0x88,0x89,0x89,0x88,0x85,0x80,0x7C,0x79,0x77,0x77, +0x79,0x7A,0x7B,0x7C,0x7F,0x81,0x82,0x81,0x7E,0x7B,0x79,0x7B,0x7D,0x7D,0x7C,0x7B, +0x7D,0x7F,0x80,0x82,0x82,0x80,0x7D,0x7C,0x7C,0x7E,0x80,0x82,0x82,0x81,0x80,0x80, +0x80,0x7F,0x7E,0x7F,0x81,0x82,0x82,0x83,0x86,0x89,0x8A,0x87,0x83,0x80,0x7D,0x7A, +0x79,0x7B,0x7E,0x80,0x83,0x87,0x8B,0x8A,0x85,0x7F,0x7E,0x7E,0x7F,0x81,0x82,0x84, +0x86,0x87,0x87,0x86,0x84,0x83,0x82,0x7F,0x7E,0x7F,0x81,0x81,0x7F,0x7E,0x7D,0x7F, +0x83,0x85,0x84,0x81,0x80,0x80,0x80,0x81,0x7F,0x7E,0x7F,0x82,0x82,0x80,0x81,0x84, +0x85,0x83,0x7F,0x7C,0x7C,0x7E,0x80,0x81,0x83,0x86,0x88,0x89,0x87,0x85,0x83,0x81, +0x7F,0x7D,0x7D,0x7D,0x7C,0x7C,0x7D,0x7B,0x7A,0x79,0x7B,0x7B,0x7C,0x7D,0x7C,0x79, +0x79,0x7B,0x80,0x82,0x83,0x83,0x84,0x86,0x85,0x82,0x80,0x81,0x81,0x80,0x80,0x81, +0x81,0x80,0x7F,0x7F,0x81,0x81,0x80,0x80,0x80,0x80,0x7F,0x80,0x7F,0x7E,0x7E,0x7D, +0x7C,0x79,0x78,0x79,0x7A,0x79,0x77,0x78,0x7C,0x80,0x7F,0x7D,0x7D,0x80,0x82,0x83, +0x83,0x82,0x81,0x81,0x81,0x81,0x81,0x81,0x82,0x83,0x84,0x85,0x86,0x85,0x84,0x80, +0x7B,0x78,0x78,0x79,0x7A,0x7B,0x7C,0x7C,0x7D,0x7D,0x7B,0x7A,0x79,0x7A,0x7D,0x80, +0x81,0x81,0x82,0x85,0x88,0x89,0x88,0x86,0x85,0x83,0x82,0x81,0x7F,0x7D,0x7F,0x81, +0x82,0x84,0x85,0x86,0x86,0x84,0x82,0x84,0x86,0x86,0x84,0x81,0x7F,0x7F,0x7E,0x7D, +0x7D,0x7F,0x7F,0x80,0x80,0x7F,0x80,0x82,0x84,0x86,0x86,0x86,0x86,0x84,0x82,0x81, +0x81,0x83,0x84,0x84,0x84,0x83,0x83,0x85,0x85,0x83,0x81,0x80,0x81,0x82,0x82,0x82, +0x82,0x82,0x82,0x82,0x82,0x81,0x7F,0x7D,0x7C,0x7B,0x7A,0x7A,0x7B,0x7C,0x7D,0x7E, +0x7F,0x7F,0x7E,0x7B,0x79,0x79,0x7B,0x7C,0x7E,0x80,0x82,0x83,0x85,0x85,0x84,0x81, +0x7E,0x7F,0x80,0x7E,0x7A,0x79,0x7B,0x7D,0x7E,0x80,0x82,0x83,0x80,0x7E,0x7C,0x7A, +0x78,0x77,0x76,0x76,0x77,0x79,0x7C,0x7E,0x7E,0x7E,0x7F,0x80,0x81,0x81,0x7F,0x7D, +0x7C,0x7C,0x7C,0x7C,0x7D,0x7F,0x81,0x80,0x7F,0x81,0x84,0x89,0x8A,0x88,0x85,0x83, +0x82,0x80,0x7E,0x7C,0x7A,0x7A,0x7E,0x83,0x85,0x84,0x84,0x85,0x86,0x85,0x83,0x83, +0x83,0x82,0x7E,0x7C,0x7A,0x7A,0x7B,0x7D,0x7F,0x81,0x82,0x83,0x84,0x84,0x83,0x81, +0x80,0x80,0x80,0x82,0x86,0x89,0x88,0x83,0x80,0x7D,0x7D,0x7E,0x7E,0x7E,0x7F,0x80, +0x82,0x85,0x89,0x8B,0x8B,0x89,0x86,0x83,0x81,0x81,0x82,0x82,0x82,0x82,0x82,0x80, +0x7E,0x7C,0x7C,0x7D,0x7E,0x80,0x81,0x80,0x7E,0x7D,0x7B,0x7A,0x7C,0x7E,0x7F,0x80, +0x81,0x83,0x83,0x81,0x7F,0x7E,0x7F,0x80,0x81,0x83,0x83,0x84,0x84,0x83,0x82,0x7F, +0x7D,0x7B,0x7C,0x7E,0x81,0x83,0x83,0x81,0x82,0x85,0x84,0x81,0x7C,0x79,0x79,0x7A, +0x7D,0x7F,0x82,0x85,0x83,0x80,0x7E,0x7E,0x7D,0x7B,0x79,0x77,0x77,0x7B,0x80,0x83, +0x81,0x7F,0x80,0x82,0x84,0x83,0x81,0x81,0x81,0x7F,0x7C,0x7A,0x7A,0x7C,0x7E,0x7F, +0x7F,0x7F,0x7D,0x7A,0x78,0x76,0x74,0x76,0x7A,0x7D,0x80,0x83,0x85,0x84,0x81,0x80, +0x7F,0x7F,0x7F,0x7F,0x81,0x83,0x83,0x82,0x81,0x82,0x82,0x81,0x7F,0x81,0x84,0x83, +0x80,0x7F,0x82,0x85,0x86,0x86,0x85,0x80,0x7B,0x79,0x79,0x7B,0x7D,0x7E,0x7F,0x7D, +0x7B,0x7A,0x7D,0x82,0x84,0x84,0x85,0x85,0x86,0x85,0x83,0x83,0x85,0x86,0x87,0x88, +0x88,0x86,0x84,0x84,0x84,0x84,0x83,0x84,0x85,0x83,0x81,0x83,0x85,0x86,0x85,0x84, +0x82,0x80,0x7F,0x7F,0x7F,0x7E,0x7F,0x81,0x83,0x84,0x84,0x81,0x7E,0x7C,0x7B,0x7A, +0x7B,0x7F,0x82,0x83,0x81,0x7F,0x7F,0x81,0x82,0x81,0x7F,0x7F,0x80,0x81,0x82,0x81, +0x81,0x83,0x82,0x81,0x80,0x7F,0x7F,0x7F,0x7F,0x7E,0x7E,0x7D,0x7C,0x7B,0x79,0x79, +0x7B,0x7D,0x7D,0x7B,0x7A,0x7C,0x7E,0x7F,0x7F,0x7D,0x7A,0x78,0x76,0x75,0x76,0x79, +0x7D,0x80,0x82,0x83,0x83,0x83,0x82,0x80,0x80,0x7F,0x7F,0x80,0x81,0x81,0x80,0x80, +0x83,0x85,0x87,0x86,0x83,0x80,0x7C,0x79,0x75,0x75,0x78,0x7D,0x7F,0x7F,0x7F,0x82, +0x86,0x87,0x86,0x84,0x81,0x7E,0x7A,0x77,0x74,0x76,0x7C,0x80,0x83,0x86,0x89,0x8C, +0x8C,0x8A,0x87,0x86,0x85,0x82,0x80,0x7E,0x7C,0x7D,0x7F,0x81,0x83,0x84,0x83,0x82, +0x81,0x81,0x80,0x7E,0x7D,0x7D,0x7E,0x80,0x81,0x82,0x84,0x86,0x85,0x84,0x83,0x81, +0x7F,0x7D,0x7D,0x7E,0x80,0x82,0x83,0x84,0x85,0x85,0x85,0x85,0x82,0x7F,0x7D,0x7C, +0x7B,0x7A,0x79,0x79,0x7B,0x7F,0x82,0x86,0x88,0x88,0x85,0x81,0x81,0x81,0x82,0x82, +0x81,0x81,0x81,0x83,0x84,0x82,0x81,0x80,0x81,0x81,0x81,0x80,0x80,0x81,0x83,0x85, +0x85,0x82,0x80,0x80,0x80,0x7E,0x7B,0x7A,0x7D,0x7F,0x80,0x7D,0x7C,0x7B,0x7A,0x78, +0x78,0x7A,0x7E,0x81,0x83,0x85,0x87,0x88,0x86,0x84,0x83,0x80,0x7D,0x7B,0x7A,0x79, +0x78,0x79,0x7C,0x7E,0x81,0x81,0x81,0x80,0x80,0x81,0x82,0x83,0x82,0x81,0x80,0x7F, +0x7E,0x7C,0x7C,0x80,0x82,0x82,0x80,0x7E,0x7C,0x7B,0x7C,0x7D,0x7E,0x7D,0x7C,0x7C, +0x7B,0x7A,0x79,0x7A,0x7B,0x7B,0x7A,0x7C,0x7F,0x81,0x80,0x7F,0x81,0x83,0x82,0x80, +0x7F,0x80,0x80,0x7F,0x7F,0x83,0x87,0x8A,0x89,0x86,0x83,0x82,0x83,0x84,0x83,0x83, +0x84,0x85,0x83,0x80,0x7E,0x7E,0x7D,0x7C,0x7B,0x7A,0x7D,0x81,0x84,0x86,0x86,0x84, +0x83,0x82,0x81,0x80,0x80,0x81,0x83,0x85,0x85,0x87,0x88,0x88,0x86,0x84,0x84,0x83, +0x81,0x7F,0x7E,0x7E,0x7E,0x7F,0x82,0x85,0x86,0x85,0x82,0x80,0x81,0x82,0x81,0x7F, +0x7D,0x7C,0x7E,0x7F,0x7F,0x7F,0x80,0x81,0x83,0x83,0x82,0x82,0x82,0x7F,0x7D,0x7E, +0x7F,0x7F,0x7E,0x7F,0x82,0x83,0x82,0x82,0x83,0x83,0x82,0x81,0x80,0x7D,0x7A,0x7A, +0x7B,0x7C,0x7D,0x7B,0x7A,0x7C,0x7F,0x81,0x81,0x7F,0x7B,0x78,0x79,0x7B,0x7A,0x7A, +0x7C,0x7E,0x7F,0x7F,0x80,0x80,0x80,0x7F,0x7E,0x7E,0x80,0x83,0x85,0x85,0x82,0x80, +0x7F,0x80,0x81,0x81,0x81,0x83,0x85,0x84,0x81,0x7F,0x7D,0x7C,0x7A,0x78,0x7A,0x7C, +0x7E,0x7E,0x7D,0x7D,0x7E,0x81,0x82,0x81,0x7F,0x7E,0x7F,0x7E,0x7B,0x7A,0x7B,0x7C, +0x7D,0x7E,0x81,0x84,0x86,0x86,0x85,0x84,0x82,0x80,0x7F,0x80,0x81,0x81,0x83,0x86, +0x89,0x8B,0x8C,0x8C,0x8A,0x86,0x80,0x7B,0x78,0x79,0x7A,0x7C,0x7D,0x7D,0x7C,0x7E, +0x81,0x82,0x81,0x7F,0x7B,0x79,0x79,0x7C,0x7F,0x83,0x86,0x87,0x87,0x86,0x84,0x83, +0x81,0x81,0x81,0x81,0x81,0x80,0x7F,0x7E,0x80,0x80,0x80,0x7F,0x7F,0x80,0x83,0x87, +0x8A,0x8C,0x8C,0x8A,0x86,0x80,0x7C,0x7A,0x79,0x7B,0x7E,0x81,0x81,0x81,0x81,0x80, +0x7E,0x7E,0x7E,0x80,0x81,0x81,0x81,0x80,0x80,0x82,0x83,0x84,0x83,0x82,0x81,0x80, +0x7E,0x7E,0x7D,0x7C,0x7E,0x81,0x83,0x83,0x81,0x7F,0x7E,0x80,0x83,0x85,0x84,0x81, +0x7D,0x7B,0x7C,0x7D,0x7E,0x7E,0x7E,0x7E,0x7F,0x80,0x7E,0x7A,0x77,0x76,0x77,0x77, +0x77,0x78,0x7B,0x7D,0x7E,0x7E,0x7F,0x81,0x81,0x7F,0x7E,0x7E,0x7F,0x7F,0x7F,0x7E, +0x7F,0x81,0x81,0x82,0x82,0x83,0x84,0x85,0x85,0x83,0x81,0x81,0x82,0x80,0x7D,0x7B, +0x7C,0x7C,0x7C,0x79,0x78,0x79,0x7A,0x7A,0x7A,0x7A,0x7B,0x7C,0x7C,0x7B,0x7C,0x7E, +0x81,0x83,0x85,0x86,0x85,0x83,0x83,0x84,0x85,0x84,0x85,0x86,0x89,0x8B,0x8B,0x89, +0x86,0x85,0x85,0x85,0x84,0x84,0x84,0x85,0x86,0x85,0x83,0x7F,0x7A,0x77,0x78,0x7C, +0x80,0x82,0x82,0x81,0x80,0x7F,0x7F,0x7F,0x7F,0x7D,0x7C,0x7B,0x7D,0x7F,0x81,0x84, +0x85,0x84,0x84,0x84,0x86,0x85,0x84,0x83,0x83,0x84,0x86,0x8B,0x8D,0x8C,0x88,0x85, +0x82,0x7E,0x7B,0x7A,0x7C,0x7E,0x7F,0x7E,0x7C,0x79,0x78,0x78,0x79,0x79,0x79,0x78, +0x78,0x77,0x77,0x7A,0x7D,0x7F,0x80,0x81,0x83,0x84,0x85,0x85,0x85,0x83,0x83,0x85, +0x87,0x86,0x83,0x81,0x83,0x84,0x83,0x80,0x7F,0x80,0x82,0x81,0x7F,0x7D,0x7B,0x78, +0x76,0x76,0x77,0x77,0x78,0x79,0x79,0x79,0x7B,0x7E,0x81,0x81,0x80,0x7E,0x7C,0x7B, +0x7A,0x79,0x79,0x7B,0x80,0x85,0x89,0x8A,0x89,0x89,0x89,0x87,0x84,0x81,0x7F,0x80, +0x81,0x80,0x7F,0x7F,0x82,0x84,0x85,0x82,0x7D,0x7A,0x78,0x77,0x76,0x75,0x77,0x7B, +0x7E,0x7F,0x7E,0x7E,0x7E,0x7E,0x7D,0x7C,0x7D,0x80,0x82,0x82,0x83,0x85,0x85,0x84, +0x83,0x84,0x86,0x86,0x83,0x81,0x82,0x85,0x86,0x86,0x85,0x84,0x84,0x85,0x85,0x84, +0x82,0x81,0x81,0x82,0x83,0x81,0x7D,0x7B,0x7B,0x7C,0x7E,0x7F,0x7F,0x7F,0x7F,0x80, +0x81,0x84,0x85,0x84,0x83,0x83,0x86,0x88,0x88,0x86,0x85,0x86,0x85,0x85,0x86,0x85, +0x83,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x84,0x85,0x83,0x7E,0x7C,0x7C,0x7C,0x7D, +0x7F,0x80,0x81,0x81,0x81,0x7F,0x7E,0x7E,0x7E,0x7D,0x7A,0x77,0x76,0x78,0x7A,0x7D, +0x7F,0x80,0x82,0x85,0x89,0x8A,0x89,0x86,0x81,0x7E,0x7D,0x7D,0x7D,0x7B,0x79,0x76, +0x76,0x78,0x7B,0x7E,0x7F,0x80,0x80,0x7F,0x7B,0x79,0x7B,0x7E,0x7F,0x81,0x81,0x82, +0x81,0x7D,0x7B,0x79,0x79,0x78,0x77,0x78,0x79,0x7B,0x7C,0x7C,0x7E,0x80,0x82,0x83, +0x83,0x83,0x83,0x83,0x82,0x7F,0x7D,0x7C,0x7D,0x7E,0x80,0x84,0x86,0x86,0x85,0x85, +0x86,0x85,0x83,0x81,0x7E,0x7D,0x7D,0x7F,0x81,0x84,0x87,0x89,0x8A,0x8A,0x86,0x81, +0x7F,0x7F,0x7E,0x7D,0x7E,0x80,0x82,0x81,0x80,0x7D,0x7B,0x7A,0x7A,0x7B,0x7C,0x7E, +0x00 +}; diff --git a/boop/branches/ram_version/telekatz_soundtest/soundcore.c b/boop/branches/ram_version/telekatz_soundtest/soundcore.c new file mode 100644 index 0000000..89a9176 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/soundcore.c @@ -0,0 +1,961 @@ +/* + soundcore.c - sound core routines (output, ipol, mixing, ...) + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "irq.h" +#include "soundcore.h" +#include "lpc2220.h" + +#define AUTO_OFF_TIME 0xf000 + +static unsigned char bl_val, cmp_val; +unsigned char out1; +unsigned char timeout; +static unsigned int auto_timeout; + +struct t_voice voices[MAXVOICES]; + +//*************************************************************************** + +typedef unsigned short uint16_t; +typedef unsigned char uint8_t; +typedef signed char int8_t; +typedef signed short int16_t; +typedef unsigned long uint32_t; + + +#define FALSE 0 +#define TRUE 1 + +// CPU clock 16MHz +#define F_CPU 16000000 + +#define FINT (F_CPU/512) // 512=256PWM steps / 0.5 step per PWM interrupt +// FINT = 31250Hz @F_CPU16MHz + +#define FS (FINT/2) +// FS = 15625Hz @F_CPU16MHz + +#define MAXTIME 6000 +#define OSCILLATORS 3 + +struct IIR_filter* filter04_06; + +uint16_t freq_coefficient[OSCILLATORS]; + +uint16_t mstimer=0; + +uint16_t noise; + +// SID registers + +struct Voice +{ + uint16_t Freq; // Frequency: FreqLo/FreqHi + uint16_t PW; // PulseWitdht: PW LO/HI only 12 bits used in SID + uint8_t ControlReg; // NOISE,RECTANGLE,SAWTOOTH,TRIANGLE,TEST,RINGMOD,SYNC,GATE + uint8_t AttackDecay; // bit0-3 decay, bit4-7 attack + uint8_t SustainRelease; // bit0-3 release, bit4-7 sustain +}; + +struct Blocks +{ + struct Voice voice1; + struct Voice voice2; + struct Voice voice3; + uint16_t FC; // not implemented + uint8_t RES_Filt; // partly implemented + uint8_t Mode_Vol; // partly implemented + uint8_t POTX; // not implemented + uint8_t POTY; // not implemented + uint8_t OSC3_Random;// not implemented + uint8_t ENV3; // not implemented +}; + +#define NUMREGISTERS 29 + +union Soundprocessor +{ + struct Blocks block; + uint8_t sidregister[NUMREGISTERS]; +} Sid; + +// SID voice controll register bits +#define GATE (1<<0) +#define SYNC (1<<1) // not implemented +#define RINGMOD (1<<2) // implemented +#define TEST (1<<3) // not implemented +#define TRIANGLE (1<<4) +#define SAWTOOTH (1<<5) +#define RECTANGLE (1<<6) +#define NOISE (1<<7) + +// SID RES/FILT ( reg.23 ) +#define FILT1 (1<<0) +#define FILT2 (1<<1) +#define FILT3 (1<<2) +// SID MODE/VOL ( reg.24 ) +#define VOICE3OFF (1<<7) + +// attack, decay, release envelope timings +uint16_t AttackRate[16]={2,4,16,24,38,58,68,80,100,250,500,800,1000,3000,5000,8000}; +uint16_t DecayReleaseRate[16]={6,24,48,72,114,168,204,240,300,750,1500,2400,3000,9000,15000,24000}; + +// oszillator waveform arrays +int8_t wave0[256]; +int8_t wave1[256]; +int8_t wave2[256]; + +// envelope arrays + +uint8_t envelope[OSCILLATORS]; + +uint16_t m_attack[OSCILLATORS]; +uint16_t m_decay[OSCILLATORS]; +uint16_t m_release[OSCILLATORS]; + +uint8_t release_flag[OSCILLATORS]; +uint8_t attackdecay_flag[OSCILLATORS]; + + +int16_t level_sustain[OSCILLATORS]; +//int test[9]; +//struct IIR_filter filter04_06; +// = {0,0,0,0, B0, B1, B2, A1, A2}; //initialize filter with 0.4 cutoff frequency + +//uint16_t t_attack[OSCILLATORS]; +//uint16_t t_decay[OSCILLATORS]; +//uint16_t t_release[OSCILLATORS]; + +/************************************************************************ + + interrupt routine + + - calculate waverform phases + - calculate waveforms + - set PWM output + - increase system timer + +************************************************************************/ +uint8_t get_wavenum(struct Voice *voice) +{ + uint8_t n; + + if(voice==&Sid.block.voice1) n=0; + if(voice==&Sid.block.voice2) n=1; + if(voice==&Sid.block.voice3) n=2; + + return n; +} + +void setfreq(struct Voice *voice,uint16_t freq) +{ + uint32_t templong; + uint8_t n; + + n=get_wavenum(voice); + + templong=freq; + freq_coefficient[n]=templong*65536/FS; +} + +void init_waveform(struct Voice *voice) +{ + uint16_t n; + int16_t val; + uint8_t wavetype; + int8_t *wave_array; + + wavetype=voice->ControlReg; + + n=get_wavenum(voice); + + if(n==0) wave_array=wave0; + if(n==1) wave_array=wave1; + if(n==2) wave_array=wave2; + + val=-128; + + for(n=0;n<256;n++) + { + *wave_array=0xFF; + + if(wavetype&SAWTOOTH) + { + *wave_array&=val; + } + + if(wavetype&TRIANGLE) + { + if(n&0x80) *wave_array&=((n^0xFF)<<1)-128; + else *wave_array&=(n<<1)-128; + } + + if(wavetype&RECTANGLE) + { + if(n>(voice->PW >> 4)) // SID has 12Bit pwm, here we use only 8Bit + { + *wave_array&=127; + } + else *wave_array&=-127; + } + + // if(wavetype&NOISE) *wave_array&=zufall(); + // noise has to be online calculated + + val++; + wave_array++; + } +} +//#define MAXLEVEL ( 0xFFFF / OSCILLATORS ) +#define MAXLEVEL 19000 +#define SUSTAINFAKTOR ( MAXLEVEL / 15 ) + +void setenvelope(struct Voice *voice) +{ + uint8_t n; + + n=get_wavenum(voice); + attackdecay_flag[n]=TRUE; + +// t_attack[n]=AttackRate[voice->AttackDecay>>4]; +// t_decay[n]=DecayReleaseRate[voice->AttackDecay&0x0F]; +// t_release[n]=DecayReleaseRate[voice->SustainRelease&0x0F]; + level_sustain[n]=(voice->SustainRelease>>4)*SUSTAINFAKTOR; + +// m_attack[n]=MAXLEVEL/t_attack[n]; + m_attack[n]=MAXLEVEL/AttackRate[voice->AttackDecay>>4]; +// m_decay[n]=(MAXLEVEL-level_sustain[n]*SUSTAINFAKTOR)/t_decay[n]; + m_decay[n]=(MAXLEVEL-level_sustain[n]*SUSTAINFAKTOR)/DecayReleaseRate[voice->AttackDecay&0x0F]; + +// m_release[n]=(level_sustain[n]*SUSTAINFAKTOR)/t_release[n]; + m_release[n]=(level_sustain[n])/DecayReleaseRate[voice->SustainRelease&0x0F]; +} +/************************************************************************ + + uint8_t set_sidregister(uint8_t regnum, uint8_t value) + + The registers of the virtual SID are set by this routine. + For some registers it is necessary to transform the SID-register + values to some internal settings of the emulator. + To select this registers and to start the calculation, the switch/ + case statement is used. + For instance: If setting the SID status register, new waveforms in + the waveform array are calculated. + + 4.2007 ch + +************************************************************************/ +uint8_t set_sidregister(uint8_t regnum, uint8_t value) +{ + //uint16_t temp; + uint8_t regnum1; + + regnum1=regnum; + + if (regnum > 13) regnum++; + if (regnum > 6 ) regnum++; + + if(regnum>NUMREGISTERS-1) return 1; + Sid.sidregister[regnum]=value; + + switch(regnum1) + { + //voice1 + case 1: + { + //temp=(Sid.sidregister[0]+(Sid.sidregister[1]<<8))/17; + //setfreq(&Sid.block.voice1,temp); + + freq_coefficient[0]=(Sid.sidregister[0]+(Sid.sidregister[1]<<8))/4; + + }break; + case 3: init_waveform(&Sid.block.voice1);break; + case 4: init_waveform(&Sid.block.voice1);break; + case 5: setenvelope(&Sid.block.voice1);break; + case 6: setenvelope(&Sid.block.voice1);break; + + //voice2 + case 8: + { + //temp=(Sid.sidregister[7]+(Sid.sidregister[8]<<8))/17; + //setfreq(&Sid.block.voice2,temp); + freq_coefficient[1]=(Sid.sidregister[7]+(Sid.sidregister[8]<<8))/4; + }break; + case 10: init_waveform(&Sid.block.voice2);break; + case 11: init_waveform(&Sid.block.voice2);break; + case 12: setenvelope(&Sid.block.voice2);break; + case 13: setenvelope(&Sid.block.voice2);break; + + //voice3 + case 15: + { + //temp=(Sid.sidregister[14]+(Sid.sidregister[15]<<8))/17; + //setfreq(&Sid.block.voice3,temp); + freq_coefficient[2]=(Sid.sidregister[14]+(Sid.sidregister[15]<<8))/4; + }break; + case 17: init_waveform(&Sid.block.voice3);break; + case 18: init_waveform(&Sid.block.voice3);break; + case 19: setenvelope(&Sid.block.voice3);break; + case 20: setenvelope(&Sid.block.voice3);break; + } + return 0; +} + + +void startPWMIRQ(void) +{ + timeout = 0; + auto_timeout = 0; + out1 = 0; + + PWMTC = 0; +// PWMPR = 0; + PWMPR = 0; + PWMMR0 = 0x1FF; // pwm rate + PWMMR2 = 0x00; // pwm value + PWMLER = 0x05; + PWMMCR = 0x03; + PWMPCR = (1<<10); + PWMTCR = 0x03; + PWMTCR = 0x09; + + VICVectAddr0 = (unsigned long)&(soundIRQ); + VICVectCntl0 = VIC_SLOT_EN | INT_SRC_PWM; + //VICIntSelect |= INT_PWM; + VICIntEnable = INT_PWM; + +} + + +void setBL(unsigned char level) +{ + bl_val = level; +} + +unsigned char getBL(void) +{ + return bl_val; +} + + + +void __attribute__ ((interrupt("IRQ"))) soundIRQ (void) +{ + + PWMIR = 0x01; + + static uint16_t phase0,phase1,phase2; + static int16_t temp,temp1; + static uint8_t k,flag=0; + static uint8_t timer; + static uint16_t noise8; + static uint16_t sig0,sig1,sig2; + static uint16_t tempphase; + + + + //DEBUGPIN_ON; // Pin to measure processing time + + flag^=1; + if(flag) + { + //DEBUGPIN_ON; // Pin to measure processing time + // Voice1 + tempphase=phase0+freq_coefficient[0]; //0.88us + if(Sid.block.voice1.ControlReg&NOISE) + { + if((tempphase^phase0)&0x4000) sig0=noise8*envelope[0]; + } + else + { + if(Sid.block.voice1.ControlReg&RINGMOD) + { + if(phase2&0x8000) sig0=envelope[0]*-wave0[phase0>>8]; + else sig0=envelope[0]*wave0[phase0>>8]; + } + else sig0=envelope[0]*wave0[phase0>>8]; //2.07us + } + phase0=tempphase; + + // Voice2 + tempphase=phase1+freq_coefficient[1]; //0.88us + if(Sid.block.voice2.ControlReg&NOISE) + { + if((tempphase^phase1)&0x4000) sig1=noise8*envelope[1]; + } + else + { + if(Sid.block.voice2.ControlReg&RINGMOD) + { + if(phase0&0x8000) sig1=envelope[1]*-wave1[phase1>>8]; + else sig1=envelope[1]*wave1[phase1>>8]; + } + else sig1=0xff*wave1[phase1>>8]; //2.07us + } + phase1=tempphase; + + // Voice3 + tempphase=phase2+freq_coefficient[2]; //0.88us + if(Sid.block.voice3.ControlReg&NOISE) + { + if((tempphase^phase2)&0x4000) sig2=noise8*envelope[2]; + } + else + { + if(Sid.block.voice3.ControlReg&RINGMOD) + { + if(phase1&0x8000) sig2=envelope[2]*-wave2[phase2>>8]; + else sig2=envelope[2]*wave2[phase2>>8]; + } + else sig2=envelope[2]*wave2[phase2>>8]; //2.07us + } + phase2=tempphase; + } + else + { + + // temp=sig0+sig1+sig2; + + // voice filter selection + temp=0; // direct output variable + temp1=0; // filter output variable + if(Sid.block.RES_Filt&FILT1) temp1+=sig0; + else temp+=sig0; + if(Sid.block.RES_Filt&FILT2) temp1+=sig1; + else temp+=sig1; + if(Sid.block.RES_Filt&FILT3) temp1+=sig2; + else if(!(Sid.block.Mode_Vol&VOICE3OFF))temp+=sig2; // voice 3 with specal turn off bit + + //filterOutput = IIR2((struct IIR_filter*)&filter04_06, filterInput); + //IIR2(filter04_06, temp1); + k=(temp>>8)+128; + k+=temp1>>10; // not real filter implemeted yet + + //OCR1A=k; // Output to PWM + PWMMR2 = k; + PWMLER = 0x04; + + //DEBUGPIN_ON; // Pin to measure processing time + + // noise generator + for(k=1;k<2;k++) + { + temp1 = noise; + noise=noise << 1; + + temp1 ^= noise; + if ( ( temp1 & 0x4000 ) == 0x4000 ) + { + noise |= 1; + } + } + noise8=noise>>6; +#ifdef NOISEOFF + noise8=0; +#endif + } + + timer--; + if(timer==0) + { + mstimer++; // increase millisecond timer + // mstimerrate=0.992 milli seconds @FCPU16MHz + timer=31; + } + + + VICVectAddr = 0; +} + + + +// SID Registers +#define VOICE1 0 +#define VOICE2 7 +#define VOICE3 14 +#define CONTROLREG 4 +#define ATTACKDECAY 5 +#define SUSTAINRELEASE 6 + +// SID Control Register Bits +#define GATE (1<<0) +#define GATEOFF 0 +#define SYNC (1<<1) // not implemented +#define RINGMOD (1<<2) +#define TEST (1<<3) // not implemented +#define TRIANGLE (1<<4) +#define SAWTOOTH (1<<5) +#define RECTANGLE (1<<6) +#define NOISE (1<<7) + +// notes VOICE1 +#define C1_1 1+VOICE1,0x02,0+VOICE1,0x25, +#define C2_1 1+VOICE1,0x04,0+VOICE1,0x49, +#define C3_1 1+VOICE1,0x08,0+VOICE1,0x93, +#define C4_1 1,0x11,0,0x25, +#define D4_1 1,0x13,0,0x3F, +#define E4_1 1,0x15,0,0x9A, +#define F4_1 1,0x16,0,0xE3, +#define G4_1 1,0x19,0,0x81, +#define A4_1 1,0x1C,0,0xC6, +#define B4_1 1,0x20,0,0x5E, +#define C5_1 1,0x22,0,0x4B, + +// notes VOICE3 +#define C2_2 1+VOICE2,0x04,0+VOICE2,0x49, +#define C4_2 1+VOICE2,0x11,0+VOICE2,0x25, +#define D4_2 1+VOICE2,0x13,0+VOICE2,0x3F, +#define E4_2 1+VOICE2,0x15,0+VOICE2,0x9A, + +// notes VOICE3 +#define C2_3 1+VOICE3,0x04,0+VOICE3,0x49, +#define C4_3 1+VOICE3,0x11,0+VOICE3,0x25, +#define D4_3 1+VOICE3,0x13,0+VOICE3,0x3F, +#define E4_3 1+VOICE3,0x15,0+VOICE3,0x9A, +#define F4_3 1+VOICE3,0x16,0+VOICE3,0xE3, +#define G4_3 1+VOICE3,0x19,0+VOICE3,0x81, +#define A4_3 1+VOICE3,0x1C,0+VOICE3,0xC6, +#define B4_3 1+VOICE3,0x20,0+VOICE3,0x5E, +#define C5_3 1+VOICE3,0x22,0+VOICE3,0x4B, + +// waveforms +#define SETNOISE_1 4,0x81,5,0xBB,6,0xAD, +#define SETNOISE_2 11,0x81,12,0xBB,13,0xAD, +#define SETNOISE_3 18,0x81,19,0xBB,20,0xAD, +#define SETTRIANGLE_1 4,0x11,5,0xBB,6,0xAA, +#define SETTRIANGLE_2 4+VOICE2,0x11,5+VOICE2,0xBB,6+VOICE2,0xAA, +#define SETTRIANGLE_3 4+VOICE3,0x11,5+VOICE3,0xBB,6+VOICE3,0xAA, +#define SETRECTANGLE_1 VOICE1+CONTROLREG,RECTANGLE+GATE,5+VOICE1,0xBB,6+VOICE1,0xAA, + +#define SLOWATTACK 0xB0 +#define FASTATTACK 0x00 +#define SLOWDECAY 0x0A +#define FASTDECAY 0x00 +#define SUSTAINQUITE 0x00 +#define SUSTAINNORM 0xA0 +#define SUSTAINLOUD 0xF0 +#define SLOWRELEASE 0x09 +#define FASTRELEASE 0x00 + + +// pause controll, no SID registers, values will be interpreted by the EMULATOR +#define QUARTER 0xF0,0x00,0xF1,0x01, // pause quarter tone +#define HALF 0xF0,0x00,0xF1,0x02, // pause half tone +#define ONESEC 0xF0,0x00,0xF1,0x04, // pause 2 seconds +#define TWOSEC 0xF0,0x00,0xF1,0x08, // pause 2 seconds +#define FIVESEC 0xF0,0x00,0xF1,40, // pause 2 seconds +#define STOP 0xFF,0xFF, // stops sound generation + +/**************************************************************************** + + static uint8_t sound[] + + Sound Data Array + + The main programm parses the sound data array. + It reads the register address and data from the array + and writes it to the "virtual SID registers". + 0xF0,0xF1 and 0xFF are no SID registers and interpreted as + controll code for the parser. F0+256*F1 gives the value in milliseconds + to pause parsing and let the SID playing it's sound. + After the pause the next register values are read and written to the SID. + At the end of the array ther should be the values 0xFF,0xFF which stop + the parser and stop sound generation. + + syntax: + +static uint8_t sound[] PROGMEM ={ + sidregister,value, + sidregister,value, + .... + 0xF0,pauselowvalue, + 0xF1,pausehighvalue, + .... + sidregister,value, + sidregister,value, + 0xF0,pauselowvalue, + 0xF1,pausehighvalue, + 0xFF,0xFF // stop command, turn sound off +}; + + April 2007 (c) Christoph Haberer, christoph(at)roboterclub-freiburg.de + +****************************************************************************/ +static uint8_t sound[] = { + +/************************************************************* + attack,decay,sustain,release example +*************************************************************/ + + + SETTRIANGLE_1 // set triangle waveform + + ATTACKDECAY+VOICE1,SLOWATTACK+SLOWDECAY, + SUSTAINRELEASE+VOICE1,SUSTAINNORM+SLOWRELEASE, + + + //ATTACKDECAY+VOICE1,0xAA, + //SUSTAINRELEASE+VOICE1,0x1A, + + //ATTACKDECAY+VOICE1,FASTATTACK+5, + //ATTACKDECAY+VOICE1,0xA, + //SUSTAINRELEASE+VOICE1,0x8A, + //SUSTAINRELEASE+VOICE1,SUSTAINQUITE+FASTRELEASE, + + C4_1 // note C4 one channel1 ( voice1 ) + TWOSEC // wait 2 seconds + //FIVESEC + + VOICE1+CONTROLREG,TRIANGLE+GATEOFF, // gate off to start release cycle + + TWOSEC // wait 2 seconds + + //STOP + +/************************************************************* + tone latter +*************************************************************/ + + SETTRIANGLE_1 + C4_1 + HALF + D4_1 + HALF + E4_1 + HALF + F4_1 + HALF + G4_1 + HALF + A4_1 + HALF + B4_1 + HALF + C5_1 + HALF + + TWOSEC + +/************************************************************* + 3 tone example +*************************************************************/ + + SETTRIANGLE_1 + C4_1 + HALF + SETTRIANGLE_2 + E4_2 + HALF + SETTRIANGLE_3 + G4_3 + HALF + + TWOSEC + + // start release cycle + VOICE1+CONTROLREG,TRIANGLE+GATEOFF, + VOICE2+CONTROLREG,TRIANGLE+GATEOFF, + VOICE3+CONTROLREG,TRIANGLE+GATEOFF, + + TWOSEC + TWOSEC + +/************************************************************* + PWM example +*************************************************************/ + + SETRECTANGLE_1 + C4_1 + + 2,0x00, // set PWM value + 3,0x04, // set PWM value + ONESEC + + 2,0x00, // set PWM value + 3,0x06, // set PWM value + ONESEC + + 2,0x00, // set PWM value + 3,0x08, // set PWM value + TWOSEC + +/************************************************************* + ring modulation example +*************************************************************/ + + SETTRIANGLE_1 + F4_1 + + 6,0x8B, // sustain/release + + SETTRIANGLE_3 + C4_3 + 6+VOICE3,0x08, // sustain/release + + VOICE1+CONTROLREG,0x14, // set ringmod, gate off for decay + VOICE3+CONTROLREG,0x00, // gate off + + TWOSEC + TWOSEC + +/************************************************************* + noise example +*************************************************************/ + + // shotnoise + 1,0x40, + 0,0x00, + SETNOISE_1 + ATTACKDECAY+VOICE1,FASTATTACK+5, + SUSTAINRELEASE+VOICE1,SUSTAINQUITE+FASTRELEASE, + QUARTER + + // shotnoise + 1,0x40, + 0,0x00, + SETNOISE_1 + ATTACKDECAY+VOICE1,FASTATTACK+5, + SUSTAINRELEASE+VOICE1,SUSTAINQUITE+FASTRELEASE, + QUARTER + + // shotnoise + 1,0x40, + 0,0x00, + SETNOISE_1 + ATTACKDECAY+VOICE1,FASTATTACK+5, + SUSTAINRELEASE+VOICE1,SUSTAINQUITE+FASTRELEASE, + QUARTER + + VOICE1+CONTROLREG,NOISE+GATEOFF, + + TWOSEC + + // light noise + SETNOISE_1 + 1,0x40, + 0,0x00, + + ATTACKDECAY+VOICE1,SLOWATTACK+SLOWDECAY, + SUSTAINRELEASE+VOICE1,SUSTAINNORM+0x0B, + TWOSEC + + VOICE1+CONTROLREG,NOISE+GATEOFF, + TWOSEC + + // dark noise + SETNOISE_1 + 1,0x05, + 0,0x00, + TWOSEC + +/************************************************************* + 3 tone example +*************************************************************/ + + SETTRIANGLE_1 + C4_1 + HALF + SETTRIANGLE_2 + E4_2 + HALF + SETTRIANGLE_3 + G4_3 + HALF + + TWOSEC + + // start release cycle + VOICE1+CONTROLREG,TRIANGLE+GATEOFF, + VOICE2+CONTROLREG,TRIANGLE+GATEOFF, + VOICE3+CONTROLREG,TRIANGLE+GATEOFF, + + TWOSEC + TWOSEC + + +/************************************************************* + 3 tone gong +*************************************************************/ +/* + SETTRIANGLE_1 + ATTACKDECAY+VOICE1,FASTATTACK+SLOWDECAY, + SUSTAINRELEASE+VOICE1,1+SLOWRELEASE, + C4_1 + HALF + + SETTRIANGLE_2 + ATTACKDECAY+VOICE2,FASTATTACK+SLOWDECAY, + SUSTAINRELEASE+VOICE2,1+SLOWRELEASE, + D4_2 + HALF + + SETTRIANGLE_3 + ATTACKDECAY+VOICE3,FASTATTACK+SLOWDECAY, + SUSTAINRELEASE+VOICE3,1+SLOWRELEASE, + E4_3 + HALF + + TWOSEC + + // start release cycle + VOICE1+CONTROLREG,TRIANGLE+GATEOFF, + VOICE2+CONTROLREG,TRIANGLE+GATEOFF, + VOICE3+CONTROLREG,TRIANGLE+GATEOFF, +*/ +/*************************************************************/ + STOP + }; + + +void playSID(void) { + + int16_t amp[OSCILLATORS]; + uint16_t schedule_timer,temp; + uint8_t n,flag; + uint8_t controll_regadr[3]; + uint16_t soundindex; + + soundindex = 0; + schedule_timer=0; + noise = 0xaa; + + controll_regadr[0] = 4; + controll_regadr[1] = 12; + controll_regadr[2] = 20; + +// struct Voice voice; + + attackdecay_flag[0]=TRUE; + attackdecay_flag[1]=TRUE; + attackdecay_flag[2]=TRUE; + + //initialize SID-registers + + Sid.sidregister[6]=0xF0; + Sid.sidregister[14]=0xF0; + Sid.sidregister[22]=0xF0; + setenvelope(&Sid.block.voice1); + setenvelope(&Sid.block.voice2); + setenvelope(&Sid.block.voice3); + + // set all amplitudes to zero + for(n=0;nMAXLEVEL) + { + amp[n]=MAXLEVEL; + attackdecay_flag[n]=FALSE; // if level reached, then switch to decay + } + } + else // decay cycle + { + if(amp[n]>level_sustain[n]) + { + amp[n]-=m_decay[n]; + if(amp[n]0) + { + amp[n]-=m_release[n]; + if(amp[n]<0) amp[n]=0; + } + } + envelope[n]=amp[n]>>8; + } + //DEBUGPIN_OFF; // Pin to measure processing time + + //DEBUGPIN_ON; // Pin to measure processing time + if(schedule_timer==0) + { +// schedule_timer=MAXTIME; + + flag=TRUE; + while(flag) + { + n=sound[soundindex]; + soundindex++; + + if(n + + 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 3 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 SOUNDCORE_H +#define SOUNDCORE_H + +#define SOUND_OFF 0x00 +#define SOUND_ON 0x01 + +#define MODE_STOP 0x01 +#define MODE_START 0x02 +#define MODE_ONESHOT 0x04 +#define MODE_LOOP 0x08 +#define MODE_SAMPLE 0x10 +#define MODE_SYNTH 0x20 +#define MODE_FREE 0x40 + +#define MAXVOICES 16 + +typedef void(*callback_fn)(void *voice); + +struct t_voice +{ + callback_fn callback; + unsigned char *buffer; + unsigned char mode; + unsigned int len; + unsigned int pos; + short speed; +}; + +extern unsigned char timeout; + +void startPWMIRQ(void); +void __attribute__ ((interrupt("IRQ"))) soundIRQ (void); + +void setBL(unsigned char level); +unsigned char getBL(void); +void initSound(void); +void switchSound(unsigned char onoff); +void playSound(unsigned char *sound, unsigned long len); +void stopSound(void); +void waitSound(void); +void initVoices(void); + +void playSID(void); + +#endif diff --git a/boop/branches/ram_version/telekatz_soundtest/sounds.h b/boop/branches/ram_version/telekatz_soundtest/sounds.h new file mode 100644 index 0000000..2fd1f10 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/sounds.h @@ -0,0 +1,4417 @@ +#define sound1_len 0x0000371C +const unsigned char sound1_data[] = { + 0x80,0x7D,0x7B,0x7A,0x7A,0x7D,0x7F,0x80,0x7E,0x7D,0x7F,0x7D,0x7C,0x7F,0x80,0x81, + 0x83,0x83,0x82,0x80,0x7F,0x7D,0x7D,0x7E,0x87,0x8D,0x90,0x92,0x81,0x77,0x6D,0x6B, + 0x72,0x7A,0x77,0x76,0x6B,0x5A,0x80,0x7F,0x73,0x8A,0x8A,0x83,0x7B,0x86,0x80,0x77, + 0x7B,0x75,0x79,0x7C,0x7F,0x7A,0x7A,0x7D,0x7F,0x7D,0x7A,0x88,0x89,0x86,0x88,0x7A, + 0x7E,0x8F,0x8B,0x8B,0xA2,0xA3,0x9A,0x9A,0x82,0x7F,0x93,0x8E,0x98,0xA7,0x97,0x94, + 0x9D,0x95,0x77,0x78,0x8A,0x8F,0x94,0x89,0x79,0x6D,0x6C,0x6B,0x66,0x75,0x7A,0x6E, + 0x6A,0x62,0x5B,0x57,0x5C,0x5E,0x5D,0x61,0x5A,0x59,0x57,0x54,0x61,0x6F,0x70,0x69, + 0x6B,0x73,0x6F,0x63,0x64,0x74,0x7F,0x7D,0x76,0x74,0x71,0x71,0x6E,0x70,0x78,0x77, + 0x79,0x78,0x77,0x7D,0x86,0xA1,0xA9,0x9A,0x8F,0x8C,0x8F,0x8E,0x8F,0x8D,0x8C,0x8D, + 0x90,0x97,0x8C,0x78,0x7B,0x89,0x8C,0x8E,0x96,0x9E,0x97,0x8F,0x89,0x84,0x8C,0x92, + 0x94,0x8D,0x88,0x81,0x7C,0x86,0x8C,0x91,0x99,0x9A,0x95,0x8E,0x8C,0x8B,0x88,0x8D, + 0x94,0x95,0x8F,0x8C,0x88,0x8C,0x93,0x99,0x9A,0x99,0x95,0x8D,0x8E,0x88,0x90,0xA3, + 0xA8,0xA3,0x93,0x87,0x84,0x80,0x80,0x86,0x84,0x7A,0x6E,0x65,0x60,0x5F,0x68,0x6E, + 0x68,0x5C,0x52,0x4B,0x4A,0x57,0x62,0x69,0x70,0x6A,0x5D,0x5C,0x5F,0x63,0x68,0x70, + 0x70,0x67,0x68,0x67,0x6B,0x77,0x78,0x70,0x6C,0x61,0x5D,0x61,0x67,0x76,0x78,0x78, + 0x73,0x70,0x74,0x7D,0x88,0x97,0x9E,0x96,0x95,0x90,0x89,0x92,0x98,0x96,0x95,0x87, + 0x7A,0x79,0x7D,0x87,0x95,0xA1,0xA1,0x96,0x8F,0x8C,0x89,0x8E,0x93,0x8D,0x89,0x86, + 0x7E,0x83,0x93,0x96,0x94,0x91,0x84,0x7D,0x7F,0x8B,0x98,0x9E,0xA2,0x99,0x8C,0x89, + 0x8C,0x90,0x9B,0x95,0x8F,0x8F,0x8C,0x92,0x9E,0xA6,0xA7,0x9E,0x8D,0x82,0x82,0x8C, + 0x98,0xA2,0xA0,0x9B,0x91,0x85,0x85,0x82,0x80,0x7C,0x6F,0x63,0x60,0x62,0x68,0x70, + 0x6C,0x66,0x5B,0x4F,0x50,0x57,0x5F,0x66,0x69,0x68,0x5F,0x5E,0x62,0x62,0x69,0x6A, + 0x66,0x63,0x6A,0x72,0x76,0x7B,0x75,0x6A,0x60,0x5A,0x5A,0x61,0x6C,0x70,0x73,0x74, + 0x73,0x7A,0x80,0x86,0x8F,0x93,0x94,0x95,0x99,0x9C,0x9E,0x9E,0x95,0x8A,0x80,0x7D, + 0x7E,0x87,0x8E,0x92,0x97,0x97,0x95,0x8E,0x8A,0x88,0x83,0x82,0x84,0x87,0x8E,0x94, + 0x99,0x9C,0x96,0x8C,0x82,0x7F,0x85,0x8D,0x9B,0xA5,0xA5,0xA4,0x9D,0x98,0x93,0x8D, + 0x8D,0x8D,0x93,0x9A,0x9F,0xA4,0xA4,0xA1,0x96,0x8D,0x89,0x8A,0x8D,0x93,0x99,0x9C, + 0xA1,0x9E,0x95,0x85,0x7C,0x76,0x78,0x7F,0x7B,0x7A,0x78,0x71,0x6D,0x65,0x5C,0x52, + 0x50,0x55,0x59,0x65,0x6A,0x6B,0x6C,0x64,0x59,0x50,0x4E,0x54,0x59,0x65,0x71,0x71, + 0x74,0x71,0x6C,0x63,0x5B,0x60,0x62,0x65,0x6C,0x71,0x75,0x70,0x6A,0x61,0x5B,0x62, + 0x6B,0x7C,0x8D,0x93,0x9D,0x9E,0x9F,0x9E,0x94,0x92,0x90,0x92,0x95,0x9B,0x9F,0x98, + 0x95,0x89,0x7F,0x7C,0x7B,0x85,0x8D,0x90,0x90,0x8C,0x88,0x82,0x7A,0x7B,0x7B,0x7D, + 0x82,0x88,0x92,0x9B,0xA0,0x98,0x8B,0x81,0x7F,0x8B,0x9B,0xA0,0xA0,0x9A,0x95,0x94, + 0x90,0x92,0x8E,0x8A,0x96,0x99,0xA0,0xA9,0xAB,0xA2,0x94,0x87,0x7D,0x83,0x8F,0x96, + 0x9B,0x96,0x8E,0x88,0x7B,0x74,0x72,0x6E,0x70,0x6B,0x6D,0x74,0x73,0x77,0x68,0x52, + 0x4D,0x4C,0x57,0x67,0x6B,0x69,0x61,0x5C,0x5A,0x54,0x55,0x55,0x5C,0x62,0x68,0x72, + 0x73,0x78,0x6A,0x5A,0x56,0x50,0x5D,0x67,0x69,0x6D,0x66,0x63,0x60,0x5B,0x5F,0x63, + 0x6D,0x7E,0x89,0x99,0xA6,0xA9,0xA5,0x93,0x88,0x85,0x8D,0x9D,0x9F,0xA4,0x99,0x8F, + 0x8C,0x7F,0x7E,0x7B,0x7C,0x85,0x84,0x8E,0x92,0x93,0x8D,0x79,0x73,0x6F,0x7B,0x88, + 0x90,0x95,0x8C,0x8D,0x8E,0x89,0x87,0x87,0x8B,0x97,0x9B,0x9E,0xA2,0x9C,0x99,0x8E, + 0x87,0x87,0x8E,0x9C,0xA3,0xA4,0xA1,0x9C,0x93,0x8A,0x88,0x84,0x8A,0x8F,0x8B,0x96, + 0x99,0x97,0x8D,0x78,0x6E,0x6A,0x73,0x7F,0x7E,0x79,0x72,0x6C,0x63,0x60,0x5A,0x58, + 0x60,0x63,0x68,0x71,0x70,0x6D,0x62,0x51,0x50,0x57,0x63,0x70,0x71,0x74,0x73,0x6C, + 0x67,0x60,0x5C,0x60,0x66,0x65,0x69,0x72,0x72,0x6F,0x5E,0x4E,0x56,0x59,0x6C,0x7B, + 0x7D,0x89,0x8A,0x8D,0x8B,0x8C,0x8E,0x94,0x9C,0x9B,0xA3,0xA6,0xA3,0x9A,0x84,0x7F, + 0x84,0x85,0x93,0x91,0x8F,0x8D,0x85,0x81,0x7A,0x7D,0x7F,0x87,0x89,0x8C,0x95,0x95, + 0x95,0x88,0x7A,0x7E,0x89,0x94,0x9E,0x9D,0x9B,0x95,0x91,0x8C,0x88,0x8B,0x91,0x99, + 0x97,0xA1,0xA6,0xA4,0x9E,0x8F,0x86,0x8B,0x97,0xA0,0x9F,0x9B,0x95,0x8C,0x88,0x83, + 0x81,0x82,0x8C,0x8C,0x8A,0x8D,0x84,0x80,0x6D,0x60,0x60,0x65,0x72,0x75,0x74,0x70, + 0x69,0x62,0x5F,0x5A,0x5B,0x60,0x66,0x66,0x6D,0x73,0x71,0x67,0x59,0x58,0x5E,0x6B, + 0x76,0x77,0x70,0x6A,0x62,0x5A,0x5D,0x5D,0x5F,0x65,0x62,0x6A,0x78,0x81,0x7C,0x6D, + 0x68,0x73,0x85,0x99,0xA5,0xA3,0xA2,0x9E,0x98,0x93,0x94,0x98,0x99,0x96,0x9A,0x9E, + 0x9F,0x96,0x86,0x79,0x74,0x81,0x86,0x8F,0x92,0x8B,0x88,0x81,0x7C,0x78,0x7E,0x88, + 0x93,0x95,0x99,0x9B,0x92,0x8B,0x83,0x81,0x85,0x93,0x9F,0xA4,0xA0,0x94,0x8B,0x82, + 0x88,0x8D,0x95,0x97,0x94,0xA1,0xA4,0xA5,0x90,0x80,0x81,0x84,0x93,0x9B,0x99,0x92, + 0x8B,0x85,0x7E,0x79,0x7C,0x7E,0x7A,0x7E,0x85,0x83,0x7E,0x6C,0x59,0x57,0x5F,0x6A, + 0x70,0x75,0x73,0x6C,0x64,0x5C,0x56,0x59,0x64,0x69,0x6C,0x76,0x7B,0x76,0x68,0x5B, + 0x57,0x60,0x6C,0x71,0x70,0x71,0x69,0x61,0x5A,0x56,0x5A,0x68,0x73,0x75,0x7F,0x84, + 0x83,0x7D,0x79,0x7D,0x8C,0x9D,0xAA,0xAF,0xA9,0x9F,0x91,0x8B,0x8D,0x92,0x98,0x8C, + 0x91,0x9B,0x9E,0x97,0x7A,0x6D,0x6E,0x7A,0x8B,0x8E,0x8A,0x8A,0x89,0x81,0x79,0x75, + 0x7B,0x89,0x8C,0x94,0x9B,0x99,0x90,0x81,0x7C,0x7E,0x8E,0x98,0xA0,0xA0,0x99,0x91, + 0x84,0x85,0x86,0x93,0x91,0x8E,0x9E,0xA3,0xA9,0x97,0x7F,0x79,0x7F,0x90,0x94,0x91, + 0x8E,0x88,0x82,0x79,0x71,0x71,0x7A,0x79,0x7C,0x82,0x7D,0x78,0x66,0x5D,0x5A,0x60, + 0x70,0x77,0x7D,0x73,0x67,0x5E,0x5B,0x5C,0x66,0x67,0x60,0x72,0x78,0x81,0x70,0x59, + 0x54,0x52,0x67,0x71,0x72,0x70,0x6B,0x62,0x5B,0x57,0x5D,0x6A,0x6A,0x77,0x7C,0x83, + 0x88,0x7B,0x79,0x7B,0x8A,0x9B,0xA6,0xAB,0xA5,0x9D,0x8A,0x84,0x85,0x90,0x99,0x91, + 0x99,0x97,0x92,0x84,0x6F,0x6C,0x70,0x83,0x8C,0x90,0x8C,0x82,0x7C,0x71,0x74,0x7B, + 0x84,0x82,0x8D,0x99,0x9A,0x93,0x7C,0x76,0x77,0x87,0x96,0x9A,0x9C,0x98,0x90,0x80, + 0x7B,0x81,0x8F,0x9B,0x9F,0xA0,0x9C,0x97,0x8D,0x80,0x7C,0x83,0x8C,0x99,0x9B,0x8F, + 0x83,0x73,0x6E,0x76,0x7B,0x7F,0x78,0x7D,0x86,0x83,0x78,0x60,0x5A,0x5D,0x6D,0x79, + 0x79,0x78,0x6F,0x68,0x61,0x5C,0x63,0x6F,0x65,0x70,0x7A,0x7B,0x7B,0x65,0x5B,0x59, + 0x62,0x6D,0x70,0x72,0x72,0x6E,0x5C,0x57,0x57,0x62,0x71,0x72,0x7B,0x7E,0x80,0x7A, + 0x73,0x75,0x7D,0x93,0x9F,0xA7,0xA9,0x9D,0x93,0x8C,0x8B,0x96,0x97,0x91,0x9C,0xA0, + 0xA0,0x8B,0x72,0x6F,0x72,0x80,0x8A,0x8C,0x8A,0x85,0x7C,0x71,0x6F,0x79,0x81,0x80, + 0x8E,0x8F,0x90,0x89,0x76,0x75,0x76,0x86,0x92,0x97,0x99,0x95,0x8B,0x7F,0x7E,0x84, + 0x94,0x97,0x9C,0xA4,0x9F,0x9A,0x86,0x7F,0x81,0x8C,0x99,0x9B,0x9A,0x92,0x87,0x7C, + 0x78,0x80,0x85,0x80,0x8A,0x8D,0x8D,0x84,0x6D,0x64,0x64,0x73,0x7C,0x7E,0x81,0x7C, + 0x70,0x65,0x60,0x63,0x73,0x79,0x7A,0x7E,0x78,0x72,0x65,0x5C,0x61,0x6A,0x77,0x7D, + 0x7B,0x77,0x69,0x5B,0x58,0x5D,0x6B,0x70,0x72,0x7C,0x7E,0x7A,0x69,0x64,0x6D,0x7A, + 0x90,0x97,0x9D,0x9F,0x96,0x8F,0x88,0x92,0x9C,0x94,0x9D,0xA5,0xA8,0xA0,0x85,0x7A, + 0x75,0x80,0x89,0x8A,0x8D,0x8C,0x83,0x70,0x6A,0x70,0x7E,0x86,0x85,0x8A,0x88,0x84, + 0x76,0x6F,0x72,0x7A,0x8D,0x92,0x96,0x96,0x89,0x81,0x79,0x81,0x8E,0x8A,0x97,0x9D, + 0xA3,0x9F,0x87,0x81,0x7E,0x8C,0x9A,0x9D,0x9F,0x9A,0x8F,0x7F,0x79,0x82,0x87,0x87, + 0x8E,0x8F,0x94,0x8E,0x75,0x6C,0x69,0x73,0x7F,0x83,0x86,0x82,0x74,0x65,0x5E,0x67, + 0x77,0x7A,0x7B,0x80,0x7D,0x78,0x6A,0x5E,0x60,0x6C,0x79,0x7D,0x80,0x7B,0x6D,0x63, + 0x5C,0x64,0x71,0x70,0x75,0x7A,0x7A,0x77,0x63,0x5F,0x67,0x70,0x81,0x85,0x8C,0x92, + 0x86,0x7C,0x7D,0x89,0x98,0x9C,0x9C,0xA1,0xA3,0x9D,0x8D,0x82,0x85,0x8D,0x93,0x8E, + 0x8C,0x8D,0x84,0x78,0x6E,0x70,0x7D,0x7D,0x7C,0x84,0x85,0x85,0x78,0x6A,0x6E,0x73, + 0x7F,0x81,0x81,0x8B,0x89,0x80,0x78,0x79,0x84,0x88,0x86,0x90,0x96,0x96,0x8F,0x7F, + 0x81,0x85,0x8E,0x96,0x93,0x99,0x99,0x8D,0x83,0x7C,0x86,0x8F,0x88,0x8E,0x92,0x91, + 0x8E,0x79,0x75,0x74,0x79,0x84,0x7D,0x82,0x83,0x7C,0x71,0x66,0x6D,0x79,0x78,0x76, + 0x7C,0x7D,0x81,0x72,0x66,0x67,0x6B,0x78,0x77,0x78,0x7A,0x79,0x70,0x64,0x65,0x70, + 0x75,0x71,0x79,0x7B,0x7E,0x76,0x64,0x66,0x69,0x76,0x7D,0x7D,0x88,0x8A,0x86,0x7B, + 0x78,0x84,0x92,0x8E,0x8F,0x98,0x99,0x9D,0x88,0x80,0x82,0x84,0x91,0x8B,0x8C,0x90, + 0x8B,0x7F,0x73,0x73,0x80,0x83,0x7D,0x87,0x89,0x8D,0x81,0x6F,0x73,0x72,0x7C,0x82, + 0x81,0x89,0x89,0x81,0x72,0x70,0x7C,0x86,0x82,0x83,0x8B,0x8F,0x8F,0x7B,0x75,0x7A, + 0x7E,0x88,0x88,0x8A,0x8E,0x8C,0x81,0x74,0x76,0x82,0x84,0x81,0x8B,0x8B,0x8E,0x85, + 0x72,0x75,0x74,0x7C,0x82,0x81,0x89,0x87,0x7F,0x72,0x6C,0x76,0x82,0x80,0x80,0x87, + 0x87,0x87,0x79,0x6F,0x72,0x77,0x81,0x80,0x83,0x88,0x84,0x7B,0x70,0x6F,0x7A,0x81, + 0x7E,0x86,0x8B,0x8B,0x84,0x73,0x74,0x75,0x7E,0x86,0x84,0x8E,0x8D,0x85,0x7B,0x74, + 0x7C,0x87,0x89,0x87,0x8D,0x8E,0x8E,0x81,0x75,0x78,0x7B,0x85,0x86,0x84,0x8A,0x86, + 0x7C,0x71,0x6D,0x76,0x80,0x7C,0x81,0x84,0x85,0x82,0x6E,0x6D,0x6F,0x76,0x7E,0x7C, + 0x83,0x85,0x80,0x74,0x6D,0x75,0x7F,0x81,0x7E,0x85,0x88,0x8A,0x81,0x72,0x77,0x79, + 0x82,0x86,0x83,0x8A,0x8A,0x84,0x78,0x73,0x7C,0x86,0x85,0x84,0x8B,0x8A,0x8C,0x7F, + 0x75,0x79,0x7B,0x85,0x85,0x86,0x8C,0x8A,0x81,0x75,0x75,0x82,0x88,0x81,0x86,0x8B, + 0x8C,0x89,0x78,0x77,0x78,0x7F,0x86,0x81,0x87,0x88,0x85,0x7B,0x71,0x76,0x81,0x84, + 0x7E,0x87,0x8B,0x8A,0x84,0x75,0x76,0x7A,0x82,0x86,0x84,0x8B,0x8C,0x86,0x7B,0x74, + 0x7A,0x88,0x86,0x85,0x8E,0x8C,0x90,0x80,0x77,0x78,0x79,0x86,0x83,0x84,0x8A,0x88, + 0x82,0x72,0x71,0x79,0x80,0x80,0x7C,0x84,0x86,0x85,0x7A,0x6F,0x72,0x75,0x80,0x81, + 0x7F,0x85,0x85,0x7C,0x73,0x70,0x7A,0x82,0x7E,0x88,0x88,0x8A,0x89,0x77,0x77,0x72, + 0x7A,0x86,0x82,0x88,0x8A,0x88,0x7D,0x72,0x79,0x81,0x88,0x85,0x87,0x8B,0x8D,0x8A, + 0x7C,0x76,0x89,0x86,0x88,0x8F,0x6D,0x80,0x8B,0x6D,0x5E,0x6A,0x7E,0x84,0x8C,0x96, + 0x95,0x94,0x92,0x92,0x92,0x8D,0x95,0x93,0x91,0x94,0x91,0x89,0x71,0x62,0x60,0x61, + 0x60,0x5D,0x62,0x63,0x6A,0x65,0x5C,0x64,0x68,0x76,0x81,0x7F,0x88,0x8D,0x8B,0x80, + 0x7D,0x86,0x91,0x9A,0xA8,0xB5,0xBB,0xBE,0xB1,0xA7,0xA1,0x9C,0xA1,0x9D,0x9B,0x9A, + 0x98,0x8A,0x76,0x71,0x71,0x7C,0x78,0x73,0x7B,0x7A,0x77,0x63,0x58,0x56,0x54,0x57, + 0x4B,0x4C,0x54,0x57,0x54,0x4D,0x50,0x5C,0x6C,0x6F,0x78,0x80,0x80,0x84,0x7B,0x79, + 0x73,0x6F,0x7A,0x82,0x8E,0x92,0x98,0x9B,0x9C,0xA8,0xAB,0xAF,0xAC,0xAC,0xB5,0xB2, + 0xB0,0xA4,0x98,0x93,0x91,0x96,0x95,0x93,0x91,0x8F,0x8E,0x87,0x7D,0x77,0x70,0x6A, + 0x63,0x5B,0x56,0x51,0x49,0x46,0x47,0x4D,0x54,0x58,0x60,0x63,0x66,0x61,0x5E,0x63, + 0x6A,0x7A,0x7D,0x84,0x8F,0x97,0x9F,0x9C,0xA0,0xA8,0xB2,0xBD,0xC3,0xC6,0xC6,0xC6, + 0xBD,0xB1,0xAA,0xA6,0xA2,0x9E,0x9A,0x94,0x90,0x85,0x7C,0x74,0x69,0x68,0x66,0x64, + 0x64,0x5F,0x59,0x4A,0x3E,0x39,0x3A,0x3E,0x3A,0x40,0x42,0x45,0x48,0x45,0x4C,0x52, + 0x5F,0x69,0x6E,0x78,0x7C,0x7C,0x7A,0x79,0x7D,0x83,0x8B,0x92,0x9C,0xA5,0xAB,0xA7, + 0xA5,0xA7,0xA7,0xAF,0xB5,0xB9,0xC2,0xC4,0xC0,0xB9,0xB2,0xB1,0xAE,0xA9,0xA4,0xA2, + 0xA1,0x9E,0x97,0x8F,0x88,0x80,0x7D,0x7A,0x71,0x6E,0x6C,0x66,0x5B,0x52,0x50,0x51, + 0x4F,0x50,0x52,0x51,0x55,0x4B,0x46,0x44,0x45,0x50,0x55,0x60,0x69,0x70,0x76,0x6F, + 0x6E,0x75,0x80,0x85,0x88,0x92,0x96,0x9D,0x9D,0x97,0x9B,0x9F,0xA7,0xAB,0xAC,0xB2, + 0xB2,0xB0,0xA5,0x9D,0xA0,0xA2,0xA2,0xA1,0xA3,0xA2,0xA2,0x98,0x8B,0x85,0x7F,0x80, + 0x7E,0x7D,0x7D,0x7F,0x7B,0x6C,0x65,0x63,0x6B,0x6B,0x6A,0x70,0x6E,0x71,0x69,0x5B, + 0x56,0x53,0x5E,0x62,0x65,0x6D,0x6F,0x70,0x67,0x62,0x63,0x6B,0x73,0x74,0x7C,0x81, + 0x85,0x83,0x7C,0x7B,0x7C,0x85,0x8D,0x90,0x97,0x9C,0x9A,0x90,0x8A,0x8B,0x92,0x96, + 0x97,0x9E,0x9F,0xA2,0x9C,0x91,0x8D,0x88,0x90,0x94,0x94,0x99,0x99,0x98,0x8D,0x84, + 0x81,0x81,0x87,0x85,0x88,0x8A,0x89,0x87,0x76,0x6F,0x69,0x6A,0x73,0x71,0x73,0x75, + 0x73,0x68,0x59,0x55,0x5A,0x61,0x65,0x6B,0x6F,0x74,0x73,0x67,0x63,0x61,0x6A,0x76, + 0x7B,0x82,0x89,0x8D,0x86,0x7A,0x76,0x7A,0x86,0x88,0x8E,0x95,0x95,0x9B,0x8F,0x87, + 0x84,0x83,0x8D,0x8F,0x95,0x98,0x9B,0x9A,0x8C,0x86,0x88,0x91,0x95,0x99,0xA0,0xA3, + 0xA8,0xA0,0x95,0x8E,0x8C,0x95,0x98,0x9A,0x9D,0x9E,0x9A,0x8B,0x81,0x79,0x7B,0x7E, + 0x7B,0x81,0x80,0x80,0x7A,0x6B,0x63,0x5C,0x60,0x62,0x63,0x66,0x67,0x6A,0x60,0x56, + 0x51,0x53,0x5A,0x5A,0x63,0x69,0x6F,0x71,0x65,0x5E,0x58,0x5A,0x61,0x65,0x6D,0x73, + 0x7C,0x79,0x6F,0x6B,0x6C,0x76,0x7A,0x80,0x8A,0x8F,0x96,0x8E,0x86,0x81,0x7F,0x88, + 0x8C,0x94,0x9A,0xA1,0xA5,0x9A,0x90,0x8B,0x91,0x96,0x98,0xA1,0xA4,0xAA,0xA6,0x9A, + 0x94,0x8E,0x91,0x95,0x99,0xA0,0xA3,0xA8,0x9F,0x93,0x8C,0x8A,0x8F,0x8F,0x96,0x9B, + 0x9C,0x9D,0x91,0x8A,0x80,0x7B,0x7E,0x7D,0x83,0x83,0x87,0x86,0x78,0x6F,0x67,0x6A, + 0x6A,0x6D,0x77,0x77,0x7C,0x75,0x6C,0x64,0x5A,0x5E,0x5E,0x64,0x69,0x6B,0x71,0x69, + 0x5F,0x56,0x56,0x5C,0x5C,0x66,0x6B,0x70,0x72,0x69,0x66,0x5E,0x5E,0x65,0x69,0x72, + 0x74,0x7D,0x7F,0x76,0x70,0x6B,0x73,0x76,0x7D,0x88,0x8B,0x94,0x8D,0x87,0x83,0x7D, + 0x85,0x87,0x91,0x97,0x9B,0xA6,0xA1,0x9A,0x90,0x90,0x97,0x97,0xA3,0xA7,0xAC,0xAF, + 0xA4,0x9E,0x91,0x90,0x94,0x95,0x9E,0x9D,0xA4,0xA6,0x9B,0x92,0x86,0x8A,0x8B,0x8E, + 0x98,0x96,0x9C,0x96,0x8C,0x86,0x79,0x7D,0x7A,0x7D,0x82,0x81,0x89,0x81,0x77,0x6D, + 0x64,0x68,0x64,0x6D,0x72,0x71,0x76,0x69,0x64,0x5A,0x54,0x5A,0x57,0x61,0x62,0x68, + 0x6E,0x66,0x61,0x55,0x56,0x5B,0x5B,0x69,0x6A,0x6F,0x70,0x67,0x67,0x5B,0x5D,0x60, + 0x62,0x6F,0x6F,0x7A,0x7A,0x74,0x6F,0x66,0x6D,0x6D,0x73,0x82,0x83,0x8E,0x89,0x86, + 0x84,0x7A,0x82,0x80,0x89,0x8F,0x91,0x9D,0x99,0x95,0x89,0x82,0x89,0x87,0x94,0x9B, + 0x9E,0xA5,0x9B,0x9D,0x94,0x8E,0x91,0x8E,0x9B,0x9B,0xA3,0xAA,0xA4,0x9F,0x91,0x90, + 0x92,0x92,0xA0,0xA1,0xA7,0xA8,0x9D,0x9D,0x8F,0x8F,0x8E,0x8D,0x97,0x94,0x9D,0x9D, + 0x96,0x8C,0x7B,0x7C,0x78,0x7B,0x86,0x83,0x8A,0x82,0x79,0x73,0x65,0x67,0x60,0x65, + 0x6C,0x6C,0x76,0x74,0x71,0x64,0x58,0x5C,0x59,0x64,0x6E,0x6F,0x78,0x6E,0x6D,0x65, + 0x5C,0x5F,0x59,0x64,0x67,0x6C,0x76,0x72,0x6F,0x60,0x59,0x5C,0x5A,0x6A,0x70,0x76, + 0x7C,0x73,0x75,0x6A,0x67,0x68,0x65,0x72,0x74,0x7E,0x85,0x85,0x83,0x74,0x73,0x74, + 0x78,0x88,0x8D,0x97,0x98,0x92,0x93,0x87,0x88,0x84,0x87,0x91,0x94,0x9F,0xA2,0xA3, + 0x9B,0x8D,0x8C,0x89,0x91,0x9F,0xA3,0xAE,0xA9,0xA5,0xA2,0x96,0x97,0x90,0x94,0x9A, + 0x9D,0xA8,0xA9,0xA8,0x9D,0x8F,0x8E,0x8B,0x94,0x9F,0xA2,0xA9,0xA2,0x9F,0x98,0x8E, + 0x8D,0x84,0x89,0x8C,0x90,0x98,0x98,0x97,0x89,0x7E,0x7C,0x77,0x80,0x86,0x8A,0x8F, + 0x86,0x83,0x7B,0x75,0x73,0x6A,0x6D,0x6D,0x73,0x7A,0x7B,0x79,0x6B,0x62,0x5E,0x5A, + 0x64,0x6B,0x70,0x73,0x6B,0x69,0x61,0x5E,0x59,0x51,0x56,0x57,0x60,0x68,0x6C,0x6B, + 0x5F,0x58,0x54,0x53,0x5F,0x66,0x6F,0x71,0x6D,0x6E,0x67,0x66,0x60,0x5B,0x61,0x64, + 0x6F,0x77,0x7E,0x7E,0x71,0x69,0x64,0x66,0x73,0x7C,0x86,0x89,0x86,0x87,0x80,0x7F, + 0x7B,0x77,0x7D,0x7F,0x8A,0x93,0x9A,0x99,0x8C,0x83,0x7E,0x7F,0x8C,0x94,0x9F,0xA0, + 0x9D,0x9D,0x96,0x96,0x91,0x8F,0x92,0x95,0xA0,0xA9,0xAF,0xAD,0xA0,0x98,0x92,0x95, + 0xA1,0xA8,0xB2,0xB0,0xAC,0xA9,0xA2,0xA0,0x98,0x96,0x95,0x96,0x9F,0xA4,0xA9,0xA3, + 0x95,0x8B,0x83,0x85,0x8F,0x96,0x9D,0x98,0x92,0x8E,0x88,0x87,0x7F,0x7C,0x7A,0x7B, + 0x84,0x89,0x8F,0x8A,0x7E,0x74,0x6B,0x6D,0x77,0x7E,0x84,0x81,0x7C,0x77,0x73,0x72, + 0x6B,0x67,0x64,0x65,0x6D,0x72,0x79,0x76,0x6B,0x60,0x56,0x56,0x60,0x68,0x6F,0x6D, + 0x69,0x66,0x62,0x63,0x5E,0x5B,0x58,0x59,0x61,0x68,0x70,0x70,0x67,0x5D,0x54,0x54, + 0x5F,0x6A,0x72,0x73,0x6F,0x6D,0x6B,0x6C,0x6A,0x67,0x65,0x65,0x6C,0x75,0x7E,0x82, + 0x7D,0x73,0x6B,0x68,0x72,0x7E,0x88,0x8B,0x85,0x83,0x80,0x83,0x82,0x7E,0x7D,0x7C, + 0x83,0x8C,0x95,0x9B,0x97,0x8E,0x84,0x80,0x89,0x95,0x9F,0xA3,0x9E,0x9C,0x97,0x9A, + 0x99,0x95,0x92,0x8E,0x92,0x98,0xA0,0xA6,0xA3,0x99,0x8E,0x86,0x8B,0x94,0x9C,0xA1, + 0x9B,0x97,0x92,0x92,0x92,0x8D,0x8A,0x83,0x84,0x89,0x90,0x98,0x97,0x90,0x85,0x7A, + 0x7C,0x85,0x8F,0x96,0x91,0x8E,0x89,0x89,0x8B,0x88,0x86,0x7F,0x7D,0x81,0x87,0x90, + 0x91,0x8B,0x81,0x74,0x72,0x7A,0x83,0x8C,0x87,0x83,0x7D,0x79,0x7D,0x7B,0x7B,0x74, + 0x6F,0x72,0x76,0x7F,0x82,0x7E,0x78,0x6B,0x67,0x6D,0x74,0x7F,0x7E,0x79,0x75,0x6F, + 0x74,0x76,0x76,0x73,0x6B,0x6B,0x6C,0x73,0x7A,0x7A,0x77,0x6D,0x64,0x6A,0x70,0x7A, + 0x7D,0x77,0x76,0x6F,0x73,0x78,0x78,0x79,0x71,0x6E,0x70,0x74,0x7E,0x82,0x80,0x7C, + 0x70,0x71,0x77,0x7C,0x86,0x81,0x80,0x7D,0x7A,0x82,0x82,0x81,0x7D,0x75,0x77,0x7B, + 0x82,0x8A,0x87,0x84,0x7A,0x73,0x7A,0x7D,0x86,0x88,0x83,0x82,0x7D,0x7F,0x83,0x80, + 0x7E,0x7A,0x76,0x7C,0x80,0x85,0x88,0x83,0x7D,0x77,0x79,0x80,0x86,0x8B,0x89,0x85, + 0x82,0x82,0x83,0x85,0x84,0x82,0x81,0x81,0x84,0x88,0x8A,0x87,0x83,0x7F,0x7F,0x85, + 0x88,0x8C,0x8B,0x89,0x87,0x85,0x84,0x85,0x85,0x84,0x83,0x81,0x82,0x84,0x84,0x83, + 0x81,0x80,0x80,0x82,0x83,0x85,0x86,0x85,0x83,0x81,0x80,0x82,0x84,0x84,0x84,0x84, + 0x83,0x84,0x84,0x84,0x83,0x83,0x83,0x83,0x83,0x85,0x86,0x87,0x86,0x85,0x85,0x85, + 0x86,0x87,0x87,0x87,0x86,0x85,0x84,0x83,0x84,0x84,0x84,0x84,0x83,0x83,0x82,0x82, + 0x81,0x80,0x80,0x7F,0x7F,0x7F,0x80,0x81,0x80,0x7F,0x7E,0x7D,0x7E,0x7F,0x7F,0x7E, + 0x7E,0x7E,0x7E,0x7D,0x7D,0x7D,0x7D,0x7E,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7E,0x7E,0x7F,0x7F,0x7F,0x7E, + 0x7D,0x7D,0x7D,0x7F,0x81,0x81,0x81,0x80,0x7F,0x7F,0x7F,0x7F,0x80,0x80,0x80,0x7F, + 0x7F,0x7F,0x7F,0x7F,0x7E,0x7E,0x7E,0x7E,0x7F,0x80,0x80,0x80,0x7F,0x7E,0x7D,0x7D, + 0x7F,0x7F,0x7E,0x7D,0x7C,0x7C,0x7B,0x7B,0x7B,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7D, + 0x7E,0x7E,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x80,0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x7E, + 0x7E,0x7E,0x7E,0x7E,0x7D,0x7E,0x80,0x81,0x81,0x80,0x80,0x7F,0x7F,0x80,0x80,0x81, + 0x81,0x80,0x80,0x7F,0x7F,0x7F,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, + 0x81,0x81,0x81,0x82,0x82,0x81,0x80,0x7F,0x7F,0x80,0x80,0x80,0x81,0x81,0x82,0x81, + 0x81,0x80,0x81,0x82,0x83,0x83,0x84,0x84,0x83,0x81,0x81,0x81,0x81,0x81,0x81,0x81, + 0x80,0x80,0x7F,0x7E,0x7E,0x7F,0x7F,0x7E,0x7F,0x7F,0x80,0x80,0x80,0x80,0x80,0x81, + 0x81,0x81,0x81,0x82,0x81,0x80,0x7F,0x7F,0x80,0x80,0x81,0x81,0x81,0x81,0x80,0x7F, + 0x7F,0x80,0x81,0x82,0x83,0x83,0x83,0x82,0x82,0x82,0x82,0x82,0x83,0x83,0x83,0x82, + 0x82,0x81,0x80,0x80,0x81,0x81,0x81,0x81,0x82,0x82,0x82,0x82,0x81,0x81,0x81,0x81, + 0x82,0x82,0x82,0x81,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x7F,0x7E,0x7E,0x7E, + 0x7F,0x7F,0x80,0x80,0x80,0x80,0x80,0x80,0x81,0x80,0x80,0x80,0x80,0x81,0x80,0x80, + 0x80,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x82,0x82,0x82,0x81,0x81,0x82,0x82, + 0x82,0x82,0x81,0x81,0x80,0x80,0x7F,0x7F,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7F,0x80, + 0x7F,0x7F,0x7F,0x7F,0x80,0x80,0x81,0x81,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x80, + 0x81,0x81,0x81,0x81,0x81,0x80,0x80,0x80,0x81,0x82,0x82,0x82,0x81,0x82,0x81,0x81, + 0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x7F,0x7F,0x7E,0x7E,0x7F,0x7F,0x80,0x80, + 0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7F,0x80,0x80,0x80,0x7F,0x7F,0x7E,0x7E,0x7E,0x7E, + 0x7F,0x7F,0x80,0x80,0x80,0x7F,0x7F,0x7F,0x80,0x81,0x81,0x82,0x82,0x81,0x81,0x80, + 0x80,0x80,0x80,0x80,0x80,0x81,0x81,0x81,0x80,0x80,0x7F,0x7F,0x80,0x81,0x81,0x82, + 0x82,0x81,0x80,0x80,0x80,0x80,0x81,0x81,0x80,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7F, + 0x80,0x80,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x80,0x81,0x81,0x81,0x80,0x80,0x7F,0x7E, + 0x7E,0x7E,0x7F,0x7E,0x7F,0x7E,0x7E,0x80,0x88,0x88,0x68,0x6C,0x85,0x8E,0x7D,0x7A, + 0x95,0x75,0x6D,0x83,0x7F,0x80,0x84,0x94,0x84,0x79,0x86,0x88,0x81,0x77,0x87,0x85, + 0x76,0x73,0x77,0x7F,0x80,0x81,0x87,0x86,0x78,0x7F,0x86,0x8C,0x86,0x86,0x87,0x74, + 0x7C,0x75,0x7C,0x87,0x8B,0x8B,0x75,0x7E,0x73,0x6C,0x90,0x81,0x68,0x82,0x7A,0x6A, + 0x6A,0x72,0x82,0x76,0x77,0x79,0x77,0x7A,0x75,0x7B,0x7A,0x7A,0x82,0x8B,0x8C,0x87, + 0x8B,0x8F,0x85,0x7F,0x88,0x83,0x77,0x84,0x92,0x8F,0x90,0x99,0xA5,0x9C,0x94,0x91, + 0x81,0x7D,0x89,0x8F,0x91,0x98,0x96,0x90,0x8F,0x8F,0x8E,0x7E,0x79,0x81,0x83,0x85, + 0x86,0x84,0x80,0x76,0x6F,0x73,0x6D,0x65,0x67,0x71,0x75,0x78,0x7C,0x71,0x6B,0x6C, + 0x6E,0x77,0x6F,0x64,0x67,0x6E,0x6A,0x66,0x6E,0x6F,0x6D,0x72,0x77,0x70,0x72,0x76, + 0x67,0x5C,0x6D,0x7C,0x7A,0x77,0x7D,0x81,0x76,0x74,0x73,0x74,0x7D,0x7D,0x75,0x77, + 0x85,0x86,0x8A,0x93,0xA2,0xAE,0x9F,0x9C,0xA8,0x98,0x90,0x9A,0x97,0x9C,0x97,0x8D, + 0x8A,0x91,0x88,0x78,0x7E,0x7D,0x86,0x87,0x7E,0x86,0x86,0x80,0x79,0x83,0x91,0x86, + 0x8B,0x88,0x8A,0x97,0x86,0x89,0x93,0x99,0x95,0x90,0x8F,0x89,0x95,0x8E,0x8B,0x8C, + 0x84,0x85,0x7D,0x8F,0x90,0x87,0x91,0x87,0x9A,0x94,0x8A,0x92,0x85,0x8D,0x80,0x79, + 0x7D,0x83,0x8E,0x89,0x90,0x8F,0x8B,0x7A,0x7D,0x8C,0x83,0x86,0x7A,0x7C,0x87,0x79, + 0x78,0x70,0x6D,0x70,0x63,0x5D,0x5F,0x65,0x6A,0x65,0x69,0x66,0x5E,0x55,0x56,0x67, + 0x60,0x5F,0x62,0x66,0x73,0x61,0x5F,0x64,0x63,0x6B,0x60,0x63,0x70,0x72,0x79,0x79, + 0x7C,0x74,0x66,0x5D,0x5E,0x6E,0x6B,0x70,0x79,0x7A,0x83,0x79,0x75,0x7A,0x7C,0x7F, + 0x7D,0x89,0x9F,0xA2,0xA6,0xA6,0xA1,0x9D,0x8E,0x87,0x88,0x96,0x9C,0x97,0x9C,0x99, + 0x9B,0x94,0x80,0x7F,0x84,0x84,0x87,0x86,0x93,0x9A,0x94,0x93,0x88,0x85,0x81,0x7F, + 0x85,0x8D,0xA1,0xA7,0x9F,0x9B,0x97,0x95,0x88,0x82,0x8D,0x8C,0x94,0x94,0x91,0x9C, + 0x95,0x8B,0x84,0x88,0x8C,0x89,0x85,0x88,0x9E,0xA2,0x9B,0x8C,0x87,0x90,0x84,0x7C, + 0x88,0x8E,0x95,0x90,0x8B,0x8F,0x82,0x7A,0x73,0x76,0x7B,0x70,0x67,0x6F,0x84,0x7B, + 0x6B,0x69,0x6C,0x6A,0x59,0x59,0x6A,0x6C,0x67,0x62,0x60,0x63,0x59,0x54,0x5B,0x65, + 0x63,0x5A,0x52,0x65,0x74,0x67,0x64,0x66,0x72,0x70,0x5F,0x6A,0x79,0x78,0x6D,0x63, + 0x6D,0x6D,0x66,0x6C,0x70,0x76,0x73,0x6E,0x6B,0x7A,0x8C,0x84,0x84,0x8A,0x93,0x92, + 0x88,0x94,0xA1,0xA5,0xA3,0xA0,0xA0,0x9C,0x96,0x97,0x96,0x93,0x8E,0x8A,0x83,0x89, + 0x9A,0x8F,0x88,0x88,0x89,0x89,0x79,0x80,0x8F,0x94,0x8E,0x87,0x8C,0x89,0x82,0x8E, + 0x97,0x9B,0x98,0x91,0x90,0x83,0x94,0x9E,0x92,0x98,0x8E,0x8E,0x8D,0x82,0x8B,0x91, + 0x94,0x91,0x86,0x8E,0x88,0x82,0x8F,0x96,0x95,0x87,0x85,0x85,0x8B,0x9C,0x95,0x90, + 0x8A,0x85,0x82,0x76,0x7C,0x87,0x86,0x82,0x77,0x74,0x6D,0x62,0x6B,0x71,0x73,0x6B, + 0x66,0x5F,0x54,0x67,0x70,0x68,0x65,0x5E,0x5C,0x5B,0x54,0x5E,0x64,0x66,0x67,0x60, + 0x63,0x5D,0x5B,0x64,0x68,0x6A,0x68,0x63,0x61,0x6B,0x7E,0x79,0x6A,0x6F,0x69,0x66, + 0x60,0x68,0x78,0x78,0x75,0x72,0x75,0x73,0x76,0x7B,0x89,0x92,0x8B,0x8A,0x8B,0x8A, + 0x9E,0xB2,0xAB,0xA9,0xA2,0x9A,0x94,0x89,0x8F,0x9A,0x9A,0x97,0x91,0x8A,0x89,0x81, + 0x82,0x8C,0x8E,0x86,0x7C,0x78,0x80,0x99,0x97,0x91,0x93,0x8C,0x8C,0x85,0x84,0x98, + 0x9F,0x96,0x95,0x8E,0x92,0x89,0x86,0x98,0x99,0x96,0x8C,0x89,0x82,0x90,0xA3,0x9C, + 0x9A,0x8F,0x8B,0x8D,0x7D,0x8A,0x98,0x93,0x96,0x8C,0x88,0x88,0x7B,0x7F,0x8C,0x8C, + 0x82,0x7A,0x71,0x77,0x8D,0x86,0x7D,0x7B,0x70,0x6D,0x63,0x5D,0x6F,0x75,0x6F,0x6B, + 0x65,0x62,0x58,0x55,0x65,0x69,0x5E,0x5C,0x5A,0x4D,0x5D,0x72,0x69,0x69,0x64,0x5A, + 0x5F,0x5A,0x5C,0x6E,0x73,0x75,0x70,0x6B,0x69,0x61,0x60,0x71,0x6E,0x67,0x6A,0x60, + 0x67,0x80,0x82,0x79,0x80,0x7D,0x7A,0x73,0x77,0x90,0x9C,0x9D,0x9E,0x9E,0x9C,0x9C, + 0x99,0xA8,0xAD,0xA4,0xA0,0x9A,0x8D,0x91,0xA8,0xA3,0x9B,0x94,0x8D,0x89,0x7A,0x7B, + 0x8E,0x8F,0x88,0x8A,0x83,0x84,0x83,0x81,0x8E,0x94,0x8F,0x8B,0x85,0x83,0x98,0xA2, + 0x99,0x96,0x94,0x8E,0x8A,0x82,0x91,0xA3,0x98,0x98,0x97,0x92,0x8E,0x86,0x8E,0x9A, + 0x98,0x90,0x8D,0x86,0x84,0x9A,0x9F,0x91,0x93,0x8A,0x82,0x7E,0x75,0x85,0x8D,0x83, + 0x82,0x7B,0x78,0x77,0x6D,0x74,0x7C,0x75,0x6D,0x67,0x5C,0x65,0x7D,0x71,0x67,0x6C, + 0x64,0x5F,0x53,0x59,0x6E,0x65,0x5D,0x66,0x62,0x5F,0x5A,0x5B,0x69,0x66,0x5F,0x60, + 0x5F,0x58,0x69,0x7B,0x70,0x70,0x6C,0x68,0x67,0x61,0x67,0x77,0x71,0x6D,0x74,0x73, + 0x74,0x70,0x78,0x81,0x82,0x7D,0x82,0x82,0x83,0xA3,0xAB,0xA4,0xAA,0xA4,0x9C,0x9A, + 0x95,0xA1,0xAA,0xA1,0x9F,0x9F,0x97,0x8F,0x8A,0x8B,0x92,0x8B,0x87,0x8A,0x7D,0x7E, + 0x97,0x91,0x8B,0x92,0x88,0x86,0x83,0x81,0x8F,0x91,0x8B,0x8F,0x92,0x8F,0x8B,0x8A, + 0x95,0x98,0x92,0x95,0x93,0x85,0x8F,0xA6,0xA0,0x99,0x9F,0x94,0x8D,0x88,0x84,0x91, + 0x92,0x8F,0x94,0x92,0x8C,0x85,0x83,0x85,0x86,0x7F,0x7D,0x84,0x72,0x74,0x8C,0x82, + 0x77,0x80,0x77,0x6D,0x68,0x63,0x6E,0x70,0x66,0x68,0x71,0x68,0x5D,0x61,0x61,0x63, + 0x5F,0x5A,0x60,0x59,0x59,0x6E,0x71,0x64,0x6C,0x6E,0x5B,0x5A,0x5D,0x5C,0x65,0x63, + 0x64,0x70,0x6D,0x66,0x68,0x6B,0x6A,0x68,0x66,0x6D,0x69,0x5F,0x77,0x8A,0x74,0x78, + 0x8C,0x7F,0x79,0x7F,0x82,0x8C,0x91,0x8E,0xA0,0xAB,0x9F,0xA1,0xAD,0xA7,0x9B,0x9C, + 0x9D,0x9C,0x91,0x8E,0xA4,0xA0,0x8C,0x93,0x9A,0x86,0x7C,0x84,0x84,0x83,0x7E,0x7E, + 0x8B,0x8D,0x80,0x8A,0x95,0x8C,0x85,0x85,0x86,0x89,0x82,0x84,0x9A,0x9A,0x8A,0x97, + 0xA4,0x91,0x8C,0x98,0x95,0x92,0x8E,0x90,0x95,0x94,0x90,0x93,0x9A,0x95,0x91,0x8C, + 0x89,0x89,0x8A,0x86,0x87,0x8A,0x83,0x85,0x87,0x83,0x7E,0x80,0x81,0x77,0x76,0x7A, + 0x73,0x72,0x75,0x72,0x6F,0x6C,0x6D,0x6B,0x69,0x69,0x67,0x68,0x67,0x66,0x64,0x61, + 0x61,0x63,0x63,0x63,0x61,0x64,0x64,0x62,0x64,0x65,0x63,0x61,0x65,0x66,0x67,0x68, + 0x6A,0x6C,0x69,0x6C,0x6D,0x6E,0x70,0x72,0x74,0x77,0x7C,0x7B,0x7C,0x81,0x83,0x84, + 0x87,0x8B,0x8C,0x8E,0x91,0x92,0x93,0x93,0x95,0x96,0x95,0x95,0x95,0x98,0x96,0x94, + 0x96,0x94,0x92,0x90,0x90,0x91,0x91,0x8E,0x91,0x8D,0x8A,0x8B,0x8A,0x8B,0x89,0x89, + 0x88,0x8A,0x88,0x86,0x87,0x86,0x88,0x88,0x86,0x8A,0x89,0x86,0x8B,0x8B,0x89,0x8A, + 0x8B,0x8A,0x8A,0x8B,0x8A,0x8B,0x8A,0x8A,0x8A,0x88,0x86,0x85,0x86,0x84,0x83,0x81, + 0x7F,0x80,0x7F,0x7D,0x7F,0x80,0x7D,0x7D,0x7C,0x7A,0x7A,0x7A,0x7A,0x7A,0x79,0x79, + 0x79,0x77,0x78,0x77,0x77,0x75,0x73,0x72,0x71,0x72,0x71,0x70,0x70,0x72,0x71,0x6F, + 0x71,0x72,0x70,0x71,0x72,0x71,0x72,0x73,0x74,0x75,0x76,0x75,0x77,0x75,0x75,0x77, + 0x76,0x78,0x78,0x77,0x77,0x79,0x79,0x79,0x7B,0x7D,0x7E,0x80,0x80,0x81,0x83,0x82, + 0x86,0x87,0x88,0x8B,0x89,0x8A,0x8B,0x8C,0x8D,0x8C,0x8B,0x8B,0x89,0x88,0x88,0x86, + 0x85,0x84,0x82,0x80,0x81,0x7F,0x81,0x81,0x7E,0x7F,0x7E,0x7D,0x7D,0x7F,0x7E,0x80, + 0x80,0x80,0x80,0x7F,0x80,0x80,0x82,0x82,0x82,0x81,0x82,0x80,0x80,0x80,0x80,0x82, + 0x81,0x80,0x81,0x81,0x82,0x84,0x83,0x83,0x84,0x84,0x84,0x86,0x86,0x86,0x87,0x85, + 0x85,0x85,0x85,0x85,0x85,0x86,0x83,0x81,0x81,0x7F,0x7E,0x80,0x7E,0x7F,0x7F,0x7F, + 0x80,0x7E,0x7D,0x7F,0x7F,0x7C,0x7D,0x7C,0x7E,0x7F,0x7D,0x7F,0x80,0x7F,0x7C,0x7C, + 0x7C,0x7D,0x7D,0x7D,0x7D,0x7B,0x7A,0x7C,0x78,0x78,0x7C,0x79,0x7A,0x7A,0x7B,0x7C, + 0x7D,0x7E,0x80,0x80,0x80,0x81,0x80,0x83,0x83,0x83,0x87,0x87,0x85,0x87,0x87,0x86, + 0x86,0x87,0x87,0x86,0x84,0x84,0x84,0x82,0x84,0x85,0x84,0x84,0x83,0x83,0x84,0x83, + 0x82,0x83,0x82,0x82,0x81,0x82,0x83,0x81,0x81,0x82,0x81,0x7E,0x7F,0x7F,0x7E,0x80, + 0x7F,0x7E,0x7D,0x7D,0x7D,0x7C,0x7D,0x7E,0x7E,0x7F,0x80,0x7F,0x82,0x81,0x81,0x81, + 0x81,0x82,0x82,0x83,0x84,0x85,0x85,0x84,0x83,0x81,0x81,0x81,0x81,0x81,0x80,0x80, + 0x80,0x7E,0x7F,0x7D,0x7D,0x80,0x7F,0x7E,0x80,0x80,0x7F,0x80,0x80,0x7F,0x80,0x81, + 0x81,0x82,0x82,0x83,0x80,0x7F,0x81,0x7D,0x7E,0x80,0x7F,0x7E,0x7E,0x7C,0x7B,0x7C, + 0x7A,0x7A,0x7C,0x7D,0x7E,0x7F,0x7E,0x7E,0x7E,0x7E,0x7F,0x7F,0x81,0x83,0x83,0x84, + 0x84,0x83,0x84,0x83,0x82,0x83,0x83,0x83,0x84,0x84,0x82,0x82,0x81,0x81,0x81,0x81, + 0x81,0x82,0x82,0x82,0x82,0x82,0x82,0x81,0x82,0x83,0x82,0x83,0x84,0x84,0x83,0x82, + 0x82,0x81,0x81,0x81,0x81,0x81,0x7F,0x80,0x7E,0x7E,0x7B,0x7B,0x7D,0x7B,0x7C,0x7C, + 0x7D,0x7D,0x7E,0x7D,0x7D,0x7E,0x7F,0x80,0x80,0x82,0x83,0x83,0x84,0x83,0x83,0x84, + 0x83,0x82,0x83,0x83,0x82,0x83,0x82,0x81,0x81,0x80,0x7F,0x7F,0x7D,0x7E,0x7F,0x7F, + 0x7F,0x7E,0x7F,0x7F,0x7F,0x80,0x80,0x80,0x82,0x82,0x82,0x81,0x83,0x82,0x83,0x83, + 0x81,0x81,0x80,0x80,0x80,0x80,0x7F,0x7E,0x7E,0x7D,0x7C,0x7C,0x7C,0x7B,0x7C,0x7D, + 0x7C,0x7C,0x7D,0x7C,0x7C,0x7E,0x7E,0x7F,0x80,0x80,0x80,0x81,0x81,0x81,0x82,0x81, + 0x82,0x82,0x82,0x81,0x82,0x82,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x7F,0x7F, + 0x7E,0x7F,0x7F,0x7F,0x81,0x80,0x7F,0x80,0x81,0x7F,0x80,0x81,0x80,0x81,0x81,0x80, + 0x80,0x82,0x80,0x80,0x7F,0x7E,0x7E,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7B,0x7B,0x7B, + 0x7B,0x7C,0x7C,0x7C,0x7E,0x7F,0x7E,0x7F,0x80,0x80,0x80,0x81,0x81,0x81,0x82,0x82, + 0x83,0x83,0x83,0x82,0x82,0x82,0x81,0x81,0x81,0x81,0x81,0x7F,0x7E,0x7E,0x7E,0x7E, + 0x7D,0x7E,0x7E,0x7D,0x7E,0x7D,0x7D,0x7E,0x7E,0x7D,0x7F,0x80,0x7F,0x80,0x82,0x80, + 0x81,0x82,0x80,0x81,0x81,0x81,0x81,0x82,0x81,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7D, + 0x7D,0x7E,0x7D,0x7C,0x7D,0x7D,0x7D,0x7E,0x7E,0x7E,0x7F,0x7F,0x7F,0x81,0x81,0x81, + 0x82,0x81,0x82,0x82,0x82,0x82,0x83,0x83,0x83,0x82,0x82,0x82,0x81,0x82,0x81,0x81, + 0x80,0x80,0x7F,0x7F,0x7F,0x7E,0x7E,0x7D,0x7D,0x7D,0x7E,0x7E,0x7D,0x7D,0x7E,0x7E, + 0x7E,0x80,0x80,0x80,0x81,0x81,0x80,0x80,0x7F,0x80,0x81,0x80,0x80,0x81,0x81,0x80, + 0x80,0x80,0x7F,0x7F,0x7F,0x7E,0x7E,0x7F,0x7E,0x7E,0x7E,0x7E,0x7E,0x7F,0x7E,0x7F, + 0x81,0x81,0x81,0x82,0x83,0x82,0x83,0x83,0x82,0x83,0x83,0x83,0x82,0x83,0x82,0x81, + 0x82,0x82,0x81,0x82,0x82,0x81,0x81,0x80,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F, + 0x7F,0x80,0x7F,0x81,0x80,0x81,0x82,0x82,0x93,0x85,0x86,0x85,0x64,0x7E,0x82,0x6B, + 0x69,0x76,0x7F,0x85,0x8A,0x8B,0x8C,0x88,0x95,0xA1,0xA0,0xA8,0x9F,0x91,0x88,0x75, + 0x88,0x91,0x6D,0x6B,0x75,0x68,0x59,0x59,0x54,0x51,0x5F,0x5E,0x5D,0x54,0x64,0x6F, + 0x6D,0x79,0x6F,0x97,0xAB,0x8C,0x95,0xA2,0x93,0xA7,0xA2,0x91,0xC3,0xA0,0xA1,0xB7, + 0x99,0xB5,0xAC,0x90,0x8E,0x8B,0x93,0x8F,0x7A,0x80,0x73,0x6C,0x7A,0x6B,0x86,0x91, + 0x6A,0x7C,0x87,0x77,0x87,0x67,0x44,0x68,0x6D,0x66,0x6C,0x59,0x50,0x59,0x60,0x62, + 0x64,0x7D,0x87,0x92,0x9D,0x92,0x89,0x8A,0x89,0x80,0x8F,0xA3,0xB3,0xB7,0x9D,0x99, + 0xB2,0xA4,0xA7,0xA4,0x8F,0x97,0x8D,0x88,0x7E,0x7E,0x81,0x6A,0x65,0x64,0x6C,0x6D, + 0x59,0x55,0x4B,0x4B,0x51,0x44,0x3D,0x40,0x47,0x3B,0x37,0x49,0x58,0x5A,0x5D,0x74, + 0x81,0x85,0xA2,0xB2,0xA0,0x9C,0x8C,0x8E,0x9F,0x9A,0x9E,0xA0,0xA2,0xBD,0xCC,0xD2, + 0xD2,0xC1,0xC5,0xC7,0xB1,0xB2,0xAA,0x89,0x81,0x7C,0x7A,0x8A,0x7F,0x6F,0x69,0x5E, + 0x5D,0x68,0x66,0x60,0x56,0x4B,0x67,0x69,0x5D,0x63,0x62,0x6E,0x6B,0x66,0x64,0x60, + 0x73,0x78,0x81,0x86,0x82,0x96,0xA0,0x9A,0xA4,0x96,0x8A,0x94,0x8B,0x9C,0x9D,0x8F, + 0x8F,0x8B,0x92,0x8E,0x91,0x94,0x87,0x97,0x94,0x91,0xA7,0x9C,0x91,0x96,0x97,0x95, + 0x91,0x8D,0x75,0x68,0x71,0x72,0x7C,0x6F,0x6B,0x81,0x82,0x7C,0x64,0x4C,0x51,0x57, + 0x63,0x6C,0x59,0x49,0x47,0x44,0x46,0x54,0x5A,0x4C,0x49,0x47,0x4A,0x4A,0x4E,0x5B, + 0x63,0x7F,0x92,0x94,0x88,0x72,0x7E,0x93,0x8E,0x9B,0xA2,0xA0,0xA9,0x8F,0x7E,0x84, + 0x80,0x7F,0xA2,0xBB,0xA8,0xA6,0xB1,0xB7,0xBC,0xB1,0xB7,0xBC,0xB9,0xB9,0xAD,0xA2, + 0x99,0x8D,0x94,0xAC,0xAF,0x9F,0x8C,0x80,0x80,0x82,0x8A,0x83,0x7D,0x83,0x92,0x7D, + 0x6E,0x6C,0x5C,0x6B,0x65,0x61,0x64,0x5E,0x5F,0x61,0x65,0x5E,0x60,0x6B,0x66,0x67, + 0x79,0x60,0x52,0x60,0x51,0x59,0x5E,0x59,0x66,0x70,0x72,0x70,0x72,0x70,0x78,0x73, + 0x79,0x81,0x83,0x87,0x8D,0x98,0x9A,0xA1,0x99,0x91,0x9D,0x9E,0x8F,0x8B,0x90,0x8D, + 0x8B,0x7C,0x80,0x95,0x8D,0x87,0x84,0x7F,0x76,0x73,0x71,0x65,0x73,0x78,0x78,0x8C, + 0x90,0x8F,0x97,0x95,0x88,0x83,0x78,0x6A,0x6C,0x69,0x6C,0x79,0x81,0x70,0x69,0x70, + 0x6A,0x73,0x79,0x6B,0x6B,0x74,0x78,0x78,0x7B,0x7C,0x76,0x7E,0x7A,0x77,0x8C,0x8B, + 0x8C,0x84,0x80,0x92,0x8F,0x90,0x93,0x8F,0x8B,0x87,0x91,0x91,0x91,0xAB,0xAD,0x9B, + 0x9F,0xAC,0xA7,0xA0,0x99,0x93,0xAF,0xBC,0xB2,0xB7,0xAA,0xA4,0xA9,0xAC,0xAA,0x97, + 0x8E,0x96,0x99,0x91,0x84,0x90,0x95,0x84,0x7D,0x74,0x6D,0x53,0x43,0x45,0x41,0x49, + 0x49,0x51,0x60,0x67,0x60,0x59,0x58,0x49,0x4F,0x55,0x53,0x51,0x50,0x57,0x51,0x46, + 0x43,0x4F,0x54,0x52,0x5E,0x5C,0x5A,0x63,0x5A,0x64,0x71,0x6B,0x7B,0x90,0x9E,0xA7, + 0xA2,0xA6,0x9F,0x9D,0xA9,0xAE,0xB2,0xAC,0xAB,0xAD,0xA4,0x9B,0x99,0xA0,0xA4,0x8E, + 0x8E,0x93,0x7F,0x88,0x8E,0x83,0x87,0x84,0x89,0xA2,0x9E,0x86,0x8B,0x8E,0x8C,0xA1, + 0x9F,0x96,0x99,0x90,0x9F,0xAC,0x9E,0x94,0x8E,0x95,0x95,0x87,0x88,0x89,0x81,0x80, + 0x81,0x86,0x85,0x83,0x81,0x88,0x89,0x82,0x86,0x85,0x82,0x76,0x6F,0x76,0x6D,0x77, + 0x91,0x87,0x7A,0x64,0x70,0x8A,0x75,0x6B,0x5E,0x4D,0x49,0x54,0x5F,0x5C,0x5F,0x58, + 0x59,0x69,0x67,0x5B,0x5B,0x58,0x5E,0x5F,0x5C,0x6C,0x6D,0x69,0x6C,0x72,0x74,0x70, + 0x81,0x8C,0x7A,0x75,0x7E,0x7A,0x7B,0x82,0x84,0x84,0x89,0x90,0x99,0xA9,0xA5,0xAB, + 0xB8,0xB6,0xB6,0xAF,0xA8,0xAB,0xA7,0xA5,0xA5,0x99,0x8B,0x87,0x9D,0xAC,0x99,0x93, + 0x98,0x89,0x80,0x83,0x82,0x7B,0x79,0x7C,0x88,0x86,0x75,0x75,0x7B,0x80,0x7C,0x73, + 0x7B,0x8D,0x89,0x87,0x81,0x6E,0x72,0x70,0x78,0x7D,0x63,0x6A,0x77,0x72,0x6F,0x68, + 0x63,0x6C,0x72,0x6D,0x7E,0x7C,0x64,0x69,0x73,0x78,0x7C,0x74,0x7B,0x86,0x7C,0x83, + 0x84,0x72,0x6A,0x6D,0x7C,0x78,0x6D,0x73,0x70,0x6A,0x69,0x69,0x6C,0x74,0x72,0x71, + 0x75,0x6C,0x65,0x6D,0x7B,0x7D,0x6E,0x6C,0x77,0x79,0x7E,0x83,0x7D,0x76,0x73,0x78, + 0x89,0x80,0x6F,0x78,0x80,0x83,0x84,0x84,0x89,0x8D,0x94,0x9D,0xAC,0xAD,0xA6,0xAE, + 0xB3,0xB8,0xAB,0xA3,0xB5,0xB5,0xA9,0xAB,0xAA,0xA5,0x9A,0x95,0xA0,0x90,0x7F,0x88, + 0x85,0x7A,0x74,0x72,0x7C,0x7E,0x77,0x80,0x87,0x80,0x79,0x73,0x75,0x77,0x6F,0x67, + 0x76,0x7B,0x6F,0x74,0x74,0x79,0x7B,0x7C,0x89,0x7E,0x74,0x7D,0x82,0x6E,0x65,0x6A, + 0x6E,0x74,0x70,0x73,0x7F,0x7B,0x7B,0x85,0x81,0x7A,0x6D,0x67,0x72,0x72,0x6C,0x67, + 0x61,0x63,0x67,0x70,0x7C,0x71,0x6B,0x7C,0x79,0x66,0x59,0x5F,0x67,0x64,0x69,0x75, + 0x7D,0x76,0x7A,0x7C,0x6E,0x69,0x60,0x66,0x71,0x68,0x6C,0x69,0x61,0x6B,0x6F,0x82, + 0x8C,0x76,0x7B,0x8D,0x85,0x77,0x76,0x7D,0x87,0x8F,0x90,0x9E,0xA5,0xA8,0xB6,0xBB, + 0xB7,0xAF,0xAE,0xB6,0xBE,0xB4,0xAA,0xAE,0xAB,0xA2,0xA5,0xBA,0xAC,0x9D,0xA6,0xA1, + 0x9A,0x8C,0x8B,0x91,0x84,0x82,0x90,0x90,0x8B,0x8B,0x89,0x87,0x83,0x7C,0x7C,0x88, + 0x86,0x81,0x87,0x8A,0x87,0x7B,0x89,0x96,0x81,0x88,0x92,0x86,0x79,0x73,0x83,0x80, + 0x77,0x83,0x88,0x85,0x7B,0x7B,0x78,0x70,0x6C,0x5F,0x6B,0x70,0x66,0x68,0x68,0x68, + 0x5C,0x6D,0x7E,0x70,0x5F,0x5B,0x66,0x67,0x4C,0x43,0x6E,0x51,0x3A,0x5C,0x57,0x55, + 0x5A,0x6B,0x63,0x45,0x49,0x59,0x58,0x49,0x54,0x53,0x44,0x42,0x57,0x71,0x68,0x6A, + 0x7B,0x7A,0x62,0x5D,0x68,0x6E,0x6E,0x77,0x8A,0x8B,0x8F,0x94,0x9C,0xA9,0xAB,0xAC, + 0xAC,0xB2,0xBC,0xB9,0xB7,0xB4,0xA9,0xB2,0xC8,0xBC,0xB0,0xBA,0xAF,0xA6,0xA1,0x94, + 0x9D,0x98,0x86,0x94,0xA1,0x97,0x8D,0x8C,0x90,0x97,0x95,0x8A,0x8A,0x90,0x96,0x99, + 0x9C,0x9C,0x98,0xB1,0xB4,0xAD,0xB4,0xAE,0xA8,0x9B,0x95,0x9A,0x95,0x8B,0x98,0xA1, + 0x95,0x96,0x93,0x90,0x93,0x84,0x81,0x85,0x7D,0x7D,0x75,0x77,0x75,0x68,0x80,0x84, + 0x77,0x7E,0x7F,0x79,0x6E,0x65,0x62,0x61,0x55,0x56,0x64,0x60,0x56,0x51,0x54,0x60, + 0x58,0x4C,0x4C,0x49,0x46,0x40,0x40,0x42,0x3A,0x51,0x60,0x4D,0x54,0x54,0x4F,0x57, + 0x4B,0x4C,0x57,0x48,0x48,0x59,0x5C,0x64,0x68,0x66,0x72,0x84,0x89,0x83,0x82,0x8A, + 0x90,0x8E,0x96,0x93,0x90,0xA1,0x9C,0x94,0x99,0x97,0x92,0x96,0x92,0x90,0x96,0x8A, + 0x83,0x8D,0x8D,0x8D,0x8C,0x83,0x87,0x88,0x89,0x8A,0x85,0x8B,0x8D,0x8F,0x99,0x92, + 0x98,0xA9,0xA0,0xA2,0xAB,0xA7,0xA7,0xA8,0xA2,0xAA,0xA8,0x96,0x9D,0xA1,0xA2,0xB0, + 0xA6,0xA3,0xAA,0xA0,0xA4,0xA3,0x99,0x9A,0x8E,0x92,0x98,0x87,0x95,0x9A,0x8D,0x96, + 0x94,0x93,0x92,0x83,0x82,0x83,0x72,0x70,0x76,0x74,0x78,0x74,0x71,0x76,0x6D,0x66, + 0x67,0x60,0x5E,0x56,0x51,0x58,0x4A,0x53,0x6E,0x64,0x65,0x6F,0x6B,0x70,0x64,0x60, + 0x70,0x67,0x5D,0x6C,0x72,0x73,0x75,0x76,0x86,0x8B,0x83,0x8B,0x8D,0x87,0x88,0x8B, + 0x90,0x86,0x86,0x9B,0x95,0x94,0x9D,0x8F,0x87,0x79,0x72,0x7F,0x6F,0x60,0x6A,0x70, + 0x72,0x72,0x70,0x7D,0x7B,0x6F,0x79,0x74,0x6C,0x6D,0x70,0x7A,0x71,0x76,0x8C,0x81, + 0x84,0x96,0x92,0x8D,0x83,0x81,0x8D,0x82,0x7A,0x87,0x84,0x87,0x91,0x92,0x95,0x8D, + 0x88,0x8F,0x88,0x81,0x7E,0x80,0x84,0x77,0x82,0x94,0x84,0x87,0x95,0x90,0x8A,0x7E, + 0x79,0x7B,0x6E,0x6D,0x7B,0x78,0x71,0x73,0x7B,0x7E,0x74,0x71,0x73,0x68,0x62,0x61, + 0x60,0x60,0x55,0x61,0x78,0x66,0x68,0x78,0x6F,0x66,0x5F,0x67,0x6A,0x5B,0x65,0x76, + 0x6F,0x71,0x80,0x88,0x8C,0x84,0x8B,0x93,0x8A,0x8E,0x94,0x93,0x98,0x93,0xA2,0xBB, + 0xA6,0xA2,0xB7,0xAB,0xA1,0x9D,0x9A,0x96,0x82,0x83,0x90,0x81,0x7B,0x84,0x89,0x88, + 0x7F,0x80,0x7E,0x70,0x73,0x79,0x74,0x74,0x6E,0x76,0x93,0x83,0x7F,0x9C,0x90,0x86, + 0x8D,0x8C,0x85,0x79,0x7F,0x8D,0x87,0x82,0x91,0x96,0x91,0x97,0x9B,0x96,0x86,0x85, + 0x8B,0x82,0x82,0x82,0x77,0x8E,0x92,0x7F,0x95,0x92,0x83,0x85,0x7D,0x7A,0x70,0x6C, + 0x7A,0x76,0x6B,0x78,0x80,0x7B,0x7D,0x7F,0x7A,0x71,0x6B,0x6F,0x68,0x64,0x6D,0x62, + 0x67,0x7E,0x6C,0x72,0x85,0x74,0x72,0x75,0x6F,0x6D,0x62,0x66,0x76,0x70,0x71,0x82, + 0x88,0x85,0x8C,0x92,0x8C,0x8A,0x8B,0x89,0x84,0x89,0x90,0x84,0x92,0xA0,0x8B,0x99, + 0xA5,0x90,0x8C,0x91,0x89,0x7E,0x79,0x80,0x80,0x76,0x7A,0x82,0x7D,0x80,0x89,0x82, + 0x79,0x79,0x79,0x72,0x6C,0x75,0x76,0x6A,0x7E,0x8B,0x76,0x83,0x95,0x82,0x7D,0x88, + 0x82,0x75,0x74,0x7E,0x7D,0x73,0x7E,0x8C,0x84,0x89,0x94,0x8C,0x85,0x86,0x85,0x7F, + 0x7D,0x7D,0x80,0x77,0x7F,0x97,0x7D,0x7C,0x99,0x88,0x7A,0x8A,0x85,0x72,0x74,0x7C, + 0x79,0x72,0x7B,0x82,0x7B,0x7D,0x89,0x83,0x7C,0x84,0x82,0x77,0x78,0x79,0x7A,0x75, + 0x73,0x8B,0x81,0x71,0x8F,0x88,0x70,0x7F,0x81,0x6F,0x73,0x7A,0x75,0x71,0x78,0x7F, + 0x7B,0x7E,0x8A,0x87,0x80,0x8C,0x8C,0x83,0x85,0x88,0x86,0x8A,0x84,0x85,0x9A,0x89, + 0x87,0x9E,0x8A,0x82,0x96,0x88,0x7A,0x82,0x7D,0x78,0x7B,0x7C,0x7E,0x7C,0x7F,0x83, + 0x7E,0x7F,0x83,0x7A,0x77,0x7C,0x7C,0x79,0x7B,0x76,0x6F,0x87,0x83,0x74,0x8A,0x86, + 0x76,0x86,0x85,0x74,0x7C,0x7E,0x78,0x79,0x7D,0x81,0x7D,0x7D,0x88,0x86,0x81,0x8A, + 0x8A,0x82,0x85,0x84,0x80,0x83,0x84,0x7D,0x77,0x89,0x84,0x77,0x8D,0x88,0x75,0x80, + 0x84,0x72,0x76,0x7E,0x71,0x6F,0x7A,0x79,0x75,0x7A,0x7E,0x7D,0x7C,0x82,0x81,0x7E, + 0x80,0x7F,0x7D,0x7F,0x7E,0x7C,0x77,0x80,0x86,0x7A,0x86,0x8D,0x7E,0x7F,0x88,0x7A, + 0x78,0x81,0x7B,0x78,0x80,0x7F,0x7C,0x82,0x86,0x86,0x88,0x8B,0x89,0x8A,0x8D,0x8A, + 0x87,0x87,0x84,0x83,0x86,0x80,0x80,0x8A,0x84,0x83,0x8E,0x85,0x81,0x86,0x7E,0x79, + 0x7B,0x79,0x76,0x7A,0x7C,0x78,0x7C,0x80,0x7E,0x7E,0x84,0x82,0x80,0x83,0x81,0x7D, + 0x7E,0x7F,0x79,0x7B,0x85,0x7E,0x7F,0x8B,0x84,0x7F,0x87,0x81,0x76,0x7B,0x7C,0x79, + 0x7C,0x7F,0x7D,0x81,0x84,0x83,0x86,0x87,0x86,0x88,0x8A,0x87,0x85,0x85,0x83,0x82, + 0x82,0x83,0x82,0x7F,0x81,0x82,0x7F,0x7F,0x7C,0x79,0x7A,0x7B,0x79,0x79,0x7A,0x7B, + 0x7E,0x7F,0x7F,0x80,0x82,0x84,0x84,0x84,0x84,0x83,0x83,0x83,0x83,0x85,0x83,0x81, + 0x85,0x86,0x83,0x84,0x85,0x82,0x82,0x83,0x7F,0x7D,0x7E,0x7F,0x7F,0x81,0x80,0x7F, + 0x82,0x82,0x82,0x82,0x82,0x81,0x83,0x83,0x82,0x81,0x81,0x80,0x81,0x81,0x7F,0x7E, + 0x7E,0x7D,0x7D,0x7E,0x7E,0x7D,0x7B,0x7B,0x7A,0x77,0x77,0x7A,0x79,0x7A,0x7B,0x7B, + 0x7B,0x7C,0x7F,0x80,0x7F,0x80,0x82,0x81,0x81,0x82,0x81,0x81,0x80,0x82,0x80,0x80, + 0x82,0x81,0x81,0x81,0x81,0x81,0x80,0x7F,0x80,0x80,0x7F,0x7E,0x7F,0x80,0x80,0x80, + 0x80,0x80,0x81,0x81,0x80,0x80,0x82,0x82,0x82,0x82,0x7F,0x7F,0x7F,0x81,0x80,0x7E, + 0x7F,0x7F,0x7D,0x7C,0x7D,0x7E,0x7E,0x7E,0x80,0x7F,0x7F,0x7E,0x7D,0x7E,0x7F,0x7F, + 0x80,0x7F,0x7D,0x80,0x82,0x81,0x7F,0x7F,0x7F,0x80,0x84,0x83,0x7F,0x80,0x85,0x84, + 0x82,0x81,0x7F,0x81,0x83,0x80,0x7C,0x7A,0x7B,0x7F,0x7F,0x7D,0x7E,0x7F,0x80,0x7C, + 0x7B,0x7D,0x7E,0x7F,0x7F,0x82,0x82,0x7D,0x80,0x83,0x82,0x83,0x7F,0x80,0x83,0x80, + 0x7D,0x7F,0x80,0x7D,0x7F,0x7D,0x7F,0x7F,0x80,0x82,0x83,0x80,0x7D,0x7B,0x77,0x79, + 0x7A,0x7D,0x7D,0x7E,0x7F,0x7C,0x7F,0x82,0x7F,0x82,0x86,0x84,0x82,0x84,0x8B,0x85, + 0x83,0x86,0x89,0x81,0x7F,0x85,0x81,0x80,0x82,0x82,0x82,0x83,0x81,0x80,0x83,0x7F, + 0x7C,0x7C,0x7C,0x7B,0x74,0x7B,0x81,0x7B,0x7F,0x80,0x7D,0x7E,0x7E,0x7F,0x81,0x80, + 0x7B,0x82,0x82,0x83,0x85,0x84,0x87,0x84,0x84,0x84,0x83,0x7F,0x84,0x88,0x83,0x86, + 0x85,0x81,0x85,0x86,0x82,0x80,0x83,0x82,0x7D,0x81,0x85,0x7F,0x83,0x86,0x7E,0x7F, + 0x81,0x7D,0x7E,0x82,0x7D,0x7F,0x81,0x7B,0x7A,0x7F,0x80,0x7E,0x80,0x7F,0x7F,0x7E, + 0x7C,0x81,0x80,0x82,0x84,0x83,0x80,0x80,0x81,0x80,0x82,0x81,0x7D,0x7E,0x80,0x81, + 0x82,0x87,0x83,0x7D,0x81,0x7C,0x7D,0x7F,0x81,0x7F,0x80,0x80,0x81,0x86,0x81,0x83, + 0x82,0x7F,0x7E,0x7D,0x82,0x82,0x82,0x82,0x81,0x81,0x82,0x84,0x80,0x82,0x81,0x7E, + 0x81,0x7D,0x7E,0x7F,0x7F,0x82,0x7E,0x7F,0x80,0x7E,0x7C,0x7E,0x7E,0x7E,0x7E,0x80, + 0x83,0x82,0x81,0x81,0x80,0x7F,0x83,0x81,0x84,0x85,0x81,0x83,0x86,0x82,0x83,0x85, + 0x83,0x83,0x83,0x83,0x81,0x85,0x85,0x81,0x83,0x83,0x7D,0x7D,0x80,0x7D,0x7E,0x80, + 0x7C,0x7D,0x7F,0x80,0x7F,0x7B,0x7C,0x7F,0x7C,0x7D,0x7D,0x7E,0x7E,0x80,0x7E,0x80, + 0x7F,0x7E,0x81,0x82,0x83,0x80,0x80,0x80,0x7E,0x7C,0x7F,0x7F,0x7D,0x82,0x81,0x7D, + 0x82,0x81,0x80,0x83,0x7F,0x81,0x80,0x82,0x80,0x7F,0x81,0x7F,0x83,0x80,0x82,0x86, + 0x80,0x83,0x83,0x81,0x84,0x85,0x84,0x82,0x81,0x81,0x7F,0x82,0x80,0x82,0x83,0x83, + 0x84,0x80,0x84,0x83,0x7D,0x80,0x7D,0x7C,0x7E,0x80,0x81,0x7D,0x7D,0x82,0x7F,0x7C, + 0x80,0x80,0x7E,0x80,0x7E,0x7C,0x7E,0x7E,0x7E,0x7E,0x80,0x81,0x81,0x81,0x81,0x83, + 0x84,0x86,0x83,0x81,0x85,0x83,0x81,0x80,0x82,0x84,0x7F,0x82,0x81,0x7E,0x82,0x80, + 0x7E,0x7C,0x7C,0x80,0x7E,0x7E,0x7F,0x7E,0x80,0x81,0x7C,0x7D,0x80,0x7C,0x7F,0x7F, + 0x7F,0x82,0x83,0x85,0x82,0x82,0x84,0x84,0x82,0x80,0x84,0x80,0x80,0x83,0x80,0x80, + 0x80,0x81,0x80,0x7F,0x81,0x7E,0x7E,0x80,0x7E,0x80,0x7F,0x7E,0x7F,0x80,0x7C,0x7A, + 0x7F,0x80,0x80,0x7F,0x81,0x81,0x80,0x80,0x7D,0x80,0x81,0x82,0x82,0x81,0x81,0x83, + 0x81,0x81,0x82,0x80,0x80,0x80,0x81,0x82,0x81,0x81,0x82,0x80,0x80,0x80,0x7E,0x81, + 0x7F,0x7C,0x7D,0x7B,0x7D,0x7C,0x7F,0x7F,0x7D,0x81,0x81,0x80,0x82,0x7F,0x7E,0x7F, + 0x7F,0x7F,0x80,0x82,0x7F,0x82,0x82,0x82,0x83,0x81,0x81,0x80,0x80,0x81,0x7F,0x7E, + 0x80,0x80,0x83,0x82,0x81,0x82,0x81,0x7D,0x7E,0x7E,0x7D,0x7E,0x7E,0x7F,0x7E,0x7F, + 0x80,0x7F,0x7E,0x7B,0x7F,0x80,0x7E,0x7F,0x80,0x81,0x7E,0x7F,0x7F,0x7F,0x81,0x82, + 0x81,0x7F,0x81,0x84,0x82,0x82,0x81,0x81,0x83,0x80,0x7F,0x7D,0x7F,0x80,0x7C,0x7E, + 0x7E,0x7F,0x82,0x80,0x7F,0x80,0x7E,0x80,0x7F,0x7D,0x7D,0x80,0x80,0x7E,0x80,0x82, + 0x81,0x80,0x83,0x82,0x7F,0x81,0x83,0x7E,0x80,0x83,0x7D,0x81,0x83,0x7F,0x81,0x82, + 0x81,0x82,0x82,0x81,0x7F,0x82,0x83,0x80,0x7E,0x80,0x80,0x7D,0x80,0x7F,0x7E,0x7F, + 0x80,0x81,0x81,0x81,0x81,0x80,0x7E,0x7E,0x7E,0x7E,0x80,0x80,0x7F,0x80,0x80,0x7F, + 0x81,0x81,0x81,0x81,0x80,0x81,0x81,0x7E,0x81,0x81,0x7D,0x7E,0x7F,0x7C,0x7C,0x7F, + 0x7E,0x7D,0x7E,0x7D,0x7D,0x80,0x7E,0x7F,0x81,0x7F,0x81,0x81,0x81,0x7E,0x81,0x82, + 0x7F,0x83,0x80,0x81,0x83,0x80,0x81,0x84,0x83,0x83,0x81,0x82,0x82,0x80,0x81,0x80, + 0x80,0x82,0x80,0x80,0x83,0x81,0x7D,0x7F,0x7F,0x7D,0x80,0x82,0x7C,0x7F,0x80,0x7B, + 0x7E,0x81,0x7F,0x7E,0x7F,0x7F,0x7D,0x7E,0x7E,0x7F,0x80,0x81,0x81,0x82,0x82,0x81, + 0x7F,0x81,0x80,0x7D,0x7F,0x81,0x80,0x7F,0x82,0x7F,0x7F,0x82,0x81,0x7E,0x80,0x81, + 0x7C,0x81,0x7E,0x7F,0x80,0x80,0x7F,0x7E,0x80,0x80,0x7F,0x80,0x80,0x7D,0x80,0x7F, + 0x7F,0x7F,0x80,0x82,0x81,0x80,0x7F,0x81,0x7F,0x7F,0x81,0x7F,0x7E,0x80,0x7F,0x7E, + 0x7F,0x7F,0x81,0x80,0x7E,0x81,0x81,0x7F,0x81,0x80,0x7F,0x81,0x81,0x7F,0x82,0x81, + 0x81,0x83,0x80,0x81,0x82,0x81,0x81,0x81,0x80,0x80,0x81,0x81,0x80,0x7F,0x82,0x81, + 0x81,0x83,0x81,0x82,0x82,0x81,0x7F,0x81,0x81,0x81,0x81,0x80,0x81,0x7F,0x80,0x7F, + 0x7F,0x7F,0x7F,0x7E,0x80,0x80,0x7F,0x81,0x81,0x82,0x82,0x7E,0x7E,0x80,0x7E,0x80, + 0x81,0x81,0x81,0x80,0x83,0x81,0x80,0x81,0x82,0x7F,0x82,0x82,0x7E,0x81,0x7F,0x7F, + 0x80,0x81,0x7E,0x7E,0x81,0x7F,0x83,0x81,0x81,0x81,0x80,0x82,0x80,0x80,0x81,0x7E, + 0x80,0x85,0x7F,0x80,0x84,0x81,0x82,0x83,0x82,0x81,0x82,0x81,0x81,0x83,0x82,0x81, + 0x83,0x87,0x8F,0x80,0x68,0x7A,0x8B,0x8B,0x76,0x87,0x8C,0x6C,0x7C,0x82,0x7D,0x81, + 0x8B,0x90,0x7E,0x81,0x89,0x86,0x79,0x7B,0x8B,0x7C,0x71,0x75,0x7D,0x83,0x81,0x82, + 0x89,0x7C,0x72,0x7C,0x76,0x79,0x7C,0x7F,0x81,0x84,0x85,0x81,0x88,0x89,0x8C,0x89, + 0x81,0x85,0x86,0x85,0x87,0x81,0x81,0x85,0x7E,0x7F,0x85,0x81,0x7C,0x81,0x7A,0x7A, + 0x83,0x7B,0x7A,0x7B,0x7A,0x78,0x77,0x7B,0x81,0x88,0x86,0x7B,0x7B,0x85,0x84,0x82, + 0x8D,0x89,0x81,0x84,0x86,0x83,0x80,0x85,0x85,0x81,0x80,0x7F,0x7F,0x83,0x86,0x7E, + 0x78,0x7B,0x7E,0x7A,0x7A,0x80,0x7A,0x79,0x7C,0x7F,0x80,0x7C,0x78,0x7C,0x80,0x79, + 0x7D,0x7E,0x84,0x89,0x84,0x82,0x7E,0x7F,0x83,0x86,0x88,0x86,0x7F,0x80,0x86,0x85, + 0x85,0x84,0x81,0x7E,0x79,0x7C,0x7D,0x7C,0x80,0x7F,0x7A,0x7A,0x7D,0x7E,0x81,0x80, + 0x7F,0x7F,0x7A,0x7E,0x83,0x81,0x81,0x7F,0x80,0x81,0x82,0x83,0x7F,0x7F,0x82,0x81, + 0x80,0x84,0x82,0x84,0x83,0x81,0x80,0x7E,0x80,0x80,0x80,0x7C,0x7C,0x7F,0x81,0x80, + 0x7F,0x82,0x83,0x82,0x7F,0x7C,0x7B,0x7A,0x7C,0x7F,0x7F,0x7D,0x7C,0x7F,0x80,0x80, + 0x7E,0x82,0x84,0x7E,0x7C,0x7E,0x81,0x7F,0x7C,0x7F,0x81,0x81,0x81,0x80,0x84,0x86, + 0x82,0x80,0x7C,0x7C,0x7D,0x7C,0x7D,0x7B,0x7B,0x7B,0x7E,0x7F,0x7F,0x82,0x83,0x81, + 0x82,0x83,0x81,0x81,0x81,0x7F,0x80,0x81,0x83,0x81,0x84,0x86,0x82,0x81,0x7F,0x80, + 0x81,0x7F,0x7E,0x7E,0x7E,0x7C,0x7C,0x80,0x81,0x82,0x81,0x81,0x83,0x7E,0x7E,0x80, + 0x81,0x80,0x80,0x82,0x82,0x80,0x81,0x80,0x81,0x80,0x80,0x7E,0x7F,0x7F,0x7D,0x7E, + 0x7E,0x7E,0x7F,0x7F,0x80,0x82,0x80,0x7D,0x7D,0x7E,0x7F,0x7F,0x7E,0x7E,0x80,0x80, + 0x7F,0x7F,0x81,0x83,0x7F,0x7F,0x7F,0x7D,0x7E,0x7F,0x82,0x82,0x83,0x82,0x80,0x80, + 0x82,0x82,0x80,0x81,0x82,0x7F,0x7E,0x80,0x80,0x80,0x81,0x82,0x80,0x80,0x81,0x7F, + 0x7F,0x7F,0x7F,0x7F,0x80,0x81,0x81,0x82,0x80,0x7E,0x81,0x81,0x80,0x80,0x81,0x7F, + 0x7E,0x80,0x7E,0x80,0x82,0x82,0x82,0x80,0x7E,0x7F,0x82,0x80,0x7C,0x7F,0x7E,0x7F, + 0x80,0x7E,0x7E,0x7F,0x81,0x81,0x7F,0x7F,0x7F,0x80,0x81,0x81,0x7F,0x80,0x81,0x81, + 0x81,0x83,0x80,0x7F,0x80,0x7E,0x81,0x80,0x81,0x7F,0x7D,0x80,0x7F,0x81,0x82,0x81, + 0x82,0x81,0x7F,0x80,0x82,0x81,0x83,0x82,0x80,0x82,0x82,0x81,0x83,0x82,0x82,0x83, + 0x81,0x83,0x81,0x7F,0x82,0x83,0x81,0x81,0x81,0x82,0x81,0x80,0x83,0x81,0x7F,0x80, + 0x7F,0x80,0x7F,0x7F,0x7F,0x7F,0x7E,0x7F,0x81,0x7F,0x81,0x83,0x80,0x80,0x80,0x82, + 0x81,0x81,0x82,0x80,0x7F,0x82,0x82,0x82,0x84,0x82,0x7F,0x80,0x80,0x7F,0x80,0x81, + 0x81,0x81,0x7F,0x80,0x81,0x81,0x81,0x81,0x81,0x7F,0x7F,0x80,0x7F,0x7E,0x82,0x80, + 0x7E,0x7F,0x7F,0x81,0x82,0x83,0x80,0x82,0x83,0x80,0x81,0x82,0x82,0x81,0x81,0x82, + 0x81,0x80,0x82,0x82,0x83,0x84,0x81,0x81,0x82,0x7F,0x80,0x81,0x7D,0x7D,0x7F,0x81, + 0x81,0x80,0x81,0x80,0x7E,0x80,0x82,0x81,0x80,0x80,0x80,0x80,0x80,0x7F,0x82,0x81, + 0x81,0x81,0x80,0x80,0x80,0x81,0x80,0x7F,0x7F,0x80,0x7E,0x7D,0x7F,0x80,0x7F,0x7D, + 0x7F,0x7F,0x7E,0x7E,0x80,0x80,0x7C,0x7F,0x80,0x7F,0x80,0x81,0x82,0x81,0x81,0x80, + 0x7F,0x7F,0x7F,0x7F,0x80,0x7E,0x7C,0x7E,0x7E,0x7F,0x7F,0x7F,0x7F,0x81,0x80,0x7F, + 0x82,0x81,0x81,0x80,0x80,0x7F,0x80,0x80,0x81,0x80,0x81,0x80,0x7D,0x7E,0x7F,0x7E, + 0x7F,0x80,0x7D,0x7D,0x7F,0x7E,0x7E,0x7F,0x80,0x81,0x80,0x80,0x81,0x7F,0x7F,0x80, + 0x80,0x7F,0x7F,0x7F,0x7F,0x80,0x7F,0x7F,0x7E,0x7F,0x80,0x7E,0x7F,0x80,0x7F,0x7F, + 0x7E,0x7D,0x7D,0x7D,0x7F,0x7E,0x7E,0x7F,0x7F,0x7F,0x7F,0x80,0x7F,0x7F,0x81,0x80, + 0x7F,0x7F,0x7E,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7F,0x81,0x7F,0x80,0x80,0x7E,0x7E, + 0x7F,0x7F,0x7E,0x7E,0x7F,0x7F,0x7F,0x7F,0x7E,0x80,0x7F,0x7E,0x7F,0x80,0x7F,0x7E, + 0x80,0x7F,0x7E,0x80,0x80,0x7F,0x80,0x81,0x80,0x80,0x81,0x7F,0x80,0x81,0x80,0x80, + 0x7F,0x7F,0x80,0x7F,0x80,0x80,0x80,0x81,0x80,0x7F,0x80,0x80,0x7F,0x7F,0x7F,0x7F, + 0x80,0x7F,0x7F,0x80,0x7F,0x7F,0x80,0x7F,0x80,0x80,0x81,0x80,0x80,0x82,0x81,0x80, + 0x82,0x82,0x80,0x7F,0x81,0x81,0x7F,0x80,0x81,0x80,0x7E,0x7F,0x80,0x7F,0x80,0x80, + 0x80,0x80,0x80,0x81,0x81,0x81,0x82,0x81,0x80,0x81,0x7F,0x80,0x82,0x81,0x81,0x81, + 0x80,0x81,0x81,0x80,0x80,0x81,0x81,0x81,0x81,0x82,0x81,0x80,0x82,0x81,0x80,0x80, + 0x7F,0x7F,0x7F,0x80,0x7F,0x80,0x81,0x80,0x81,0x81,0x81,0x81,0x81,0x81,0x82,0x82, + 0x81,0x82,0x83,0x82,0x82,0x82,0x83,0x82,0x81,0x82,0x81,0x80,0x80,0x80,0x80,0x80, + 0x7F,0x80,0x81,0x80,0x7F,0x80,0x81,0x7F,0x7F,0x80,0x80,0x80,0x81,0x81,0x81,0x82, + 0x82,0x81,0x81,0x81,0x82,0x83,0x82,0x82,0x83,0x83,0x82,0x81,0x82,0x81,0x81,0x82, + 0x81,0x81,0x82,0x82,0x81,0x82,0x81,0x81,0x81,0x82,0x81,0x81,0x80,0x80,0x80,0x80, + 0x80,0x80,0x81,0x81,0x80,0x82,0x81,0x81,0x81,0x82,0x81,0x81,0x82,0x81,0x82,0x82, + 0x82,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x80,0x80,0x81,0x81,0x7F,0x7F,0x81, + 0x80,0x80,0x81,0x80,0x7F,0x80,0x80,0x7F,0x80,0x80,0x80,0x81,0x81,0x80,0x80,0x80, + 0x81,0x81,0x81,0x81,0x81,0x80,0x82,0x7F,0x91,0x88,0x83,0x89,0x66,0x78,0x84,0x6D, + 0x67,0x75,0x7F,0x83,0x8A,0x8A,0x8C,0x87,0x92,0xA2,0x9F,0x9A,0x95,0x91,0x8D,0x89, + 0x87,0x82,0x76,0x6A,0x61,0x5D,0x5F,0x63,0x6A,0x60,0x5F,0x6B,0x69,0x6A,0x70,0x6E, + 0x74,0x81,0x7E,0x8C,0x86,0x7C,0x92,0x83,0x7C,0x9A,0xB1,0xA3,0xA1,0xBA,0xB3,0xA7, + 0xA1,0x91,0x95,0x9D,0x8F,0x84,0x84,0x7D,0x77,0x7B,0x78,0x77,0x76,0x6C,0x6A,0x6D, + 0x70,0x73,0x73,0x67,0x5D,0x57,0x59,0x52,0x51,0x57,0x4E,0x56,0x60,0x6A,0x6F,0x69, + 0x6E,0x7E,0x8E,0x92,0x98,0x9B,0x9B,0x98,0x9C,0xA7,0xAC,0xAB,0xB0,0xBF,0xC5,0xB8, + 0xA8,0xAC,0xB2,0xB3,0xAC,0xAD,0xB0,0xA3,0x9E,0x9B,0x91,0x85,0x78,0x79,0x77,0x6E, + 0x6D,0x66,0x58,0x4E,0x4C,0x4A,0x45,0x3F,0x40,0x40,0x40,0x4A,0x4D,0x54,0x5F,0x5D, + 0x5F,0x60,0x62,0x61,0x5E,0x62,0x65,0x6E,0x71,0x70,0x78,0x78,0x7A,0x86,0x8F,0x93, + 0x91,0x97,0x9B,0xA0,0xA4,0xA0,0x9D,0x97,0x9D,0x9B,0x91,0x8D,0x8B,0x93,0x95,0x94, + 0x95,0x90,0x8E,0x8D,0x8E,0x91,0x90,0x8D,0x92,0x93,0x89,0x7B,0x73,0x6D,0x69,0x67, + 0x67,0x6D,0x6F,0x71,0x70,0x6E,0x6E,0x73,0x78,0x7D,0x7F,0x7D,0x7D,0x7C,0x79,0x7A, + 0x7E,0x80,0x86,0x8C,0x8E,0x95,0x9A,0x9C,0x9E,0xA2,0xA7,0xA9,0xAB,0xA9,0xA7,0xA4, + 0xA3,0xA1,0x9C,0x9C,0x9B,0x99,0x97,0x91,0x8E,0x8B,0x87,0x85,0x82,0x7F,0x7A,0x74, + 0x6E,0x69,0x6C,0x66,0x60,0x5D,0x5D,0x5D,0x5A,0x57,0x53,0x55,0x58,0x5C,0x62,0x67, + 0x6D,0x72,0x74,0x76,0x7B,0x7F,0x83,0x88,0x88,0x85,0x83,0x8B,0x90,0x8D,0x8E,0x8E, + 0x8B,0x90,0x92,0x85,0x81,0x87,0x80,0x7C,0x7E,0x77,0x78,0x7D,0x74,0x71,0x77,0x75, + 0x70,0x6C,0x66,0x66,0x64,0x5A,0x56,0x55,0x56,0x63,0x69,0x64,0x62,0x5E,0x56,0x54, + 0x4C,0x44,0x4C,0x56,0x57,0x5A,0x60,0x65,0x6A,0x6A,0x67,0x6E,0x76,0x78,0x7F,0x89, + 0x90,0x94,0x94,0x93,0x98,0xA8,0xB2,0xB2,0xB3,0xBA,0xC0,0xC2,0xC2,0xC1,0xCB,0xD1, + 0xCB,0xC6,0xC7,0xCB,0xC7,0xBE,0xB7,0xB6,0xB6,0xAC,0xA7,0xA8,0xA6,0x9F,0x94,0x8B, + 0x84,0x87,0x90,0x88,0x7E,0x81,0x7E,0x78,0x75,0x70,0x76,0x7F,0x7B,0x77,0x7E,0x80, + 0x77,0x70,0x6D,0x6F,0x73,0x6F,0x6E,0x79,0x7C,0x71,0x68,0x6A,0x6A,0x6A,0x79,0x7D, + 0x76,0x79,0x74,0x6A,0x6A,0x66,0x68,0x76,0x7B,0x7A,0x83,0x88,0x83,0x7F,0x7F,0x85, + 0x8F,0x90,0x8F,0x9B,0x9E,0x95,0x8C,0x8F,0x91,0x8F,0xA0,0xAD,0xA5,0xA2,0xA0,0x97, + 0x91,0x8B,0x87,0x91,0x96,0x8E,0x90,0x92,0x86,0x79,0x72,0x72,0x78,0x78,0x73,0x78, + 0x7B,0x70,0x62,0x5E,0x62,0x58,0x5D,0x6C,0x67,0x5F,0x5C,0x54,0x4C,0x4A,0x47,0x4D, + 0x54,0x50,0x50,0x52,0x4C,0x47,0x45,0x47,0x4F,0x56,0x55,0x5A,0x5D,0x56,0x4E,0x4E, + 0x54,0x53,0x5C,0x6E,0x70,0x6F,0x72,0x71,0x73,0x78,0x7C,0x8B,0x9A,0x9E,0xA7,0xB2, + 0xB1,0xB1,0xB5,0xBC,0xCA,0xD1,0xD1,0xD7,0xD9,0xD1,0xC9,0xC9,0xCA,0xC2,0xC7,0xD3, + 0xCB,0xBE,0xB8,0xAE,0xA5,0x9F,0x9B,0xA1,0xA6,0x9E,0x98,0x99,0x91,0x88,0x85,0x87, + 0x8F,0x90,0x8B,0x8E,0x8B,0x7F,0x7C,0x80,0x83,0x7D,0x89,0x9A,0x92,0x87,0x87,0x80, + 0x7A,0x78,0x77,0x7F,0x82,0x77,0x73,0x71,0x68,0x5F,0x5E,0x62,0x67,0x67,0x65,0x69, + 0x64,0x5A,0x5B,0x61,0x65,0x5E,0x66,0x7B,0x75,0x68,0x6B,0x6C,0x67,0x67,0x6B,0x76, + 0x7B,0x74,0x71,0x73,0x6E,0x68,0x6A,0x6F,0x74,0x74,0x71,0x71,0x6E,0x66,0x65,0x6A, + 0x6B,0x64,0x6E,0x81,0x77,0x6C,0x71,0x70,0x6B,0x6C,0x71,0x7E,0x82,0x79,0x7B,0x82, + 0x7B,0x77,0x7C,0x83,0x89,0x88,0x84,0x88,0x85,0x7D,0x7F,0x86,0x88,0x80,0x87,0x9A, + 0x90,0x80,0x85,0x86,0x7F,0x7E,0x85,0x8F,0x93,0x8B,0x89,0x8E,0x87,0x82,0x87,0x8E, + 0x93,0x94,0x92,0x95,0x93,0x8D,0x91,0x98,0x9A,0x93,0x9B,0xAD,0xA3,0x92,0x96,0x95, + 0x8A,0x84,0x86,0x8C,0x8A,0x7C,0x76,0x77,0x6C,0x62,0x65,0x68,0x68,0x66,0x62,0x63, + 0x61,0x58,0x5C,0x62,0x62,0x5D,0x61,0x75,0x72,0x63,0x6A,0x70,0x6B,0x6B,0x73,0x7F, + 0x86,0x7F,0x7F,0x87,0x84,0x7F,0x86,0x8D,0x91,0x92,0x90,0x94,0x93,0x8C,0x8F,0x95, + 0x95,0x8E,0x92,0xA6,0xA1,0x91,0x97,0x99,0x91,0x90,0x95,0x9E,0xA3,0x98,0x95,0x9C, + 0x94,0x8C,0x90,0x95,0x96,0x94,0x90,0x90,0x8D,0x83,0x84,0x88,0x86,0x7E,0x7E,0x8E, + 0x89,0x74,0x75,0x76,0x6A,0x64,0x67,0x6E,0x70,0x66,0x5F,0x64,0x5C,0x51,0x55,0x5A, + 0x5B,0x5A,0x57,0x59,0x56,0x4D,0x4C,0x50,0x50,0x49,0x4D,0x61,0x5D,0x4D,0x52,0x56, + 0x4E,0x4D,0x54,0x5F,0x64,0x5D,0x5C,0x64,0x5F,0x59,0x61,0x6B,0x70,0x71,0x72,0x77, + 0x78,0x73,0x78,0x81,0x84,0x81,0x8C,0xA3,0xA0,0x95,0x9F,0xA4,0x9F,0xA1,0xA9,0xB6, + 0xBB,0xB0,0xB1,0xB7,0xAC,0xA3,0xA8,0xAC,0xAB,0xA6,0xA2,0xA3,0x9A,0x91,0x93,0x95, + 0x90,0x89,0x93,0xA3,0x95,0x8A,0x93,0x90,0x88,0x88,0x8F,0x99,0x97,0x8F,0x93,0x96, + 0x8D,0x8C,0x92,0x98,0x9B,0x9A,0x9B,0x9E,0x96,0x91,0x97,0x99,0x95,0x91,0x9F,0xAC, + 0x9B,0x93,0x9B,0x95,0x8C,0x8E,0x95,0x9B,0x98,0x8F,0x93,0x92,0x88,0x86,0x8B,0x8E, + 0x8D,0x89,0x89,0x88,0x7E,0x7A,0x7D,0x7C,0x74,0x74,0x84,0x82,0x6F,0x6D,0x6E,0x63, + 0x5E,0x5F,0x66,0x69,0x5F,0x59,0x5B,0x53,0x4A,0x4B,0x50,0x54,0x53,0x4F,0x50,0x4D, + 0x44,0x45,0x49,0x48,0x43,0x4D,0x5E,0x56,0x4A,0x51,0x50,0x49,0x4B,0x52,0x5E,0x61, + 0x59,0x5D,0x63,0x5C,0x5A,0x60,0x67,0x6E,0x6D,0x6F,0x74,0x72,0x6F,0x74,0x79,0x79, + 0x7A,0x8E,0x98,0x8B,0x8D,0x93,0x8F,0x8E,0x95,0xA1,0xAC,0xAA,0xA9,0xB4,0xB4,0xB0, + 0xB7,0xBF,0xC8,0xCD,0xCC,0xCF,0xCE,0xC5,0xC2,0xC3,0xC1,0xB9,0xBD,0xCD,0xC3,0xB1, + 0xB2,0xAC,0xA0,0x9B,0x9C,0xA3,0xA4,0x99,0x96,0x98,0x8E,0x88,0x8C,0x8E,0x91,0x91, + 0x8F,0x91,0x8D,0x87,0x87,0x8A,0x86,0x83,0x94,0x9D,0x8C,0x88,0x8C,0x84,0x81,0x81, + 0x88,0x8F,0x8A,0x83,0x87,0x85,0x7C,0x7D,0x80,0x83,0x84,0x81,0x82,0x82,0x7B,0x78, + 0x79,0x7A,0x74,0x79,0x8B,0x84,0x76,0x78,0x74,0x6D,0x6A,0x6C,0x73,0x75,0x6C,0x6A, + 0x6B,0x63,0x5D,0x5E,0x61,0x63,0x60,0x5D,0x5E,0x59,0x52,0x50,0x51,0x4C,0x48,0x5A, + 0x62,0x51,0x4F,0x52,0x4A,0x47,0x48,0x4F,0x59,0x56,0x51,0x55,0x54,0x4F,0x50,0x55, + 0x5C,0x5F,0x5E,0x62,0x65,0x61,0x5F,0x62,0x66,0x62,0x6A,0x81,0x7E,0x72,0x79,0x78, + 0x73,0x75,0x7B,0x86,0x8B,0x86,0x8A,0x90,0x8D,0x8B,0x90,0x98,0xA0,0xA3,0xA5,0xAC, + 0xAE,0xAD,0xAE,0xB5,0xB8,0xB8,0xCD,0xDA,0xCC,0xCB,0xCD,0xC4,0xBE,0xBD,0xC2,0xC7, + 0xBE,0xB6,0xB5,0xAE,0xA4,0x9D,0x9B,0x9B,0x98,0x91,0x8D,0x8B,0x83,0x7A,0x77,0x75, + 0x6E,0x77,0x88,0x7E,0x73,0x76,0x70,0x6A,0x6A,0x6E,0x7A,0x7B,0x75,0x78,0x7A,0x77, + 0x74,0x77,0x7E,0x83,0x82,0x83,0x86,0x84,0x80,0x7D,0x7F,0x7C,0x7F,0x95,0x95,0x86, + 0x87,0x82,0x7B,0x7A,0x7A,0x84,0x89,0x82,0x7F,0x81,0x7E,0x79,0x76,0x7A,0x7F,0x7F, + 0x7B,0x7B,0x7A,0x75,0x6F,0x6E,0x6D,0x68,0x7A,0x85,0x74,0x70,0x70,0x67,0x61,0x5F, + 0x66,0x6E,0x68,0x61,0x62,0x60,0x5B,0x58,0x59,0x5F,0x61,0x5E,0x5E,0x5F,0x5C,0x57, + 0x55,0x58,0x52,0x5B,0x73,0x6A,0x5E,0x63,0x60,0x5B,0x5A,0x5D,0x6B,0x6E,0x68,0x69, + 0x6C,0x6B,0x69,0x69,0x71,0x78,0x78,0x79,0x7C,0x7E,0x7C,0x79,0x7E,0x7F,0x7F,0x97, + 0xA0,0x91,0x93,0x96,0x92,0x92,0x93,0xA0,0xAC,0xA9,0xA8,0xAC,0xAE,0xAC,0xA8,0xAA, + 0xB0,0xB1,0xAD,0xAB,0xA9,0xA3,0x9A,0x96,0x94,0x8C,0x97,0xA3,0x92,0x87,0x85,0x7B, + 0x74,0x6E,0x71,0x7B,0x76,0x6E,0x6F,0x70,0x6F,0x68,0x68,0x6F,0x73,0x71,0x71,0x73, + 0x74,0x6F,0x6D,0x72,0x70,0x7B,0x92,0x8D,0x83,0x86,0x83,0x81,0x7E,0x81,0x8F,0x94, + 0x8E,0x8C,0x8F,0x91,0x8D,0x89,0x8D,0x94,0x95,0x92,0x91,0x93,0x90,0x88,0x89,0x85, + 0x8A,0xA0,0x9D,0x90,0x91,0x8C,0x87,0x81,0x7F,0x89,0x8D,0x87,0x83,0x83,0x84,0x80, + 0x79,0x7B,0x7F,0x7F,0x7B,0x77,0x79,0x76,0x6D,0x6B,0x68,0x6C,0x80,0x80,0x71,0x70, + 0x6C,0x68,0x62,0x5E,0x67,0x6F,0x6B,0x65,0x65,0x68,0x66,0x61,0x62,0x68,0x6D,0x6B, + 0x68,0x6B,0x6D,0x67,0x65,0x65,0x69,0x82,0x87,0x7A,0x7B,0x7B,0x7A,0x77,0x74,0x7F, + 0x8B,0x8B,0x87,0x88,0x90,0x93,0x8E,0x8F,0x98,0xA1,0xA2,0x9F,0xA1,0xA7,0xA4,0xA2, + 0xA1,0xA3,0xBA,0xC4,0xB5,0xAE,0xAC,0xA8,0xA1,0x96,0x98,0xA0,0x9F,0x96,0x8C,0x8C, + 0x8B,0x81,0x78,0x77,0x7C,0x7B,0x72,0x6C,0x6C,0x69,0x62,0x5D,0x5A,0x6D,0x7E,0x73, + 0x68,0x68,0x68,0x66,0x5F,0x60,0x6C,0x76,0x78,0x73,0x75,0x7C,0x7C,0x78,0x79,0x82, + 0x8A,0x8A,0x86,0x87,0x89,0x87,0x84,0x81,0x8F,0xA5,0xA2,0x96,0x91,0x90,0x91,0x8A, + 0x84,0x8A,0x94,0x97,0x92,0x8C,0x8C,0x8E,0x8B,0x84,0x85,0x8B,0x8D,0x89,0x83,0x80, + 0x7F,0x7C,0x74,0x76,0x8B,0x92,0x89,0x7F,0x77,0x77,0x74,0x6C,0x6A,0x72,0x78,0x79, + 0x73,0x6F,0x70,0x71,0x6E,0x6A,0x6B,0x6F,0x70,0x6E,0x6B,0x68,0x66,0x63,0x60,0x6F, + 0x7D,0x79,0x73,0x6D,0x68,0x69,0x65,0x61,0x65,0x6C,0x72,0x75,0x74,0x74,0x76,0x78, + 0x79,0x7A,0x7C,0x81,0x86,0x89,0x88,0x87,0x88,0x85,0x8E,0xA3,0xA9,0xA5,0xA1,0x9B, + 0x9B,0x9D,0x98,0x96,0x99,0x9C,0xA2,0xA3,0x9E,0x9B,0x9A,0x99,0x96,0x94,0x91,0x90, + 0x90,0x8D,0x88,0x85,0x80,0x7A,0x83,0x8C,0x89,0x85,0x7F,0x76,0x77,0x77,0x70,0x6F, + 0x6E,0x6D,0x72,0x73,0x71,0x72,0x72,0x71,0x74,0x76,0x75,0x74,0x74,0x75,0x76,0x76, + 0x76,0x74,0x7D,0x86,0x82,0x80,0x81,0x7D,0x81,0x84,0x80,0x81,0x82,0x81,0x85,0x84, + 0x83,0x85,0x83,0x83,0x85,0x86,0x87,0x87,0x87,0x88,0x88,0x87,0x86,0x85,0x88,0x8C, + 0x88,0x88,0x88,0x84,0x87,0x88,0x83,0x84,0x84,0x82,0x82,0x7F,0x7C,0x7C,0x78,0x77, + 0x78,0x79,0x79,0x78,0x77,0x78,0x79,0x79,0x79,0x78,0x7B,0x80,0x7D,0x7C,0x7D,0x7A, + 0x7D,0x80,0x7C,0x7D,0x7E,0x7B,0x7B,0x79,0x77,0x78,0x75,0x75,0x77,0x78,0x79,0x79, + 0x79,0x7A,0x7C,0x7D,0x7E,0x7D,0x7F,0x86,0x84,0x81,0x84,0x81,0x84,0x8A,0x86,0x87, + 0x89,0x84,0x84,0x85,0x82,0x83,0x82,0x80,0x83,0x84,0x84,0x84,0x84,0x85,0x85,0x86, + 0x87,0x85,0x83,0x87,0x88,0x82,0x82,0x82,0x7E,0x83,0x83,0x7D,0x7E,0x7A,0x76,0x77, + 0x74,0x72,0x72,0x6F,0x70,0x71,0x72,0x73,0x73,0x73,0x75,0x77,0x79,0x79,0x78,0x79, + 0x80,0x7F,0x7B,0x7F,0x7E,0x80,0x86,0x82,0x81,0x82,0x7E,0x7F,0x81,0x7E,0x7E,0x7D, + 0x7C,0x7E,0x80,0x81,0x81,0x82,0x83,0x85,0x88,0x88,0x87,0x86,0x89,0x8E,0x8B,0x89, + 0x8C,0x89,0x8C,0x8F,0x8A,0x8A,0x89,0x84,0x86,0x85,0x81,0x81,0x7E,0x7D,0x7F,0x7F, + 0x80,0x80,0x81,0x81,0x84,0x85,0x83,0x82,0x81,0x85,0x89,0x84,0x84,0x85,0x81,0x86, + 0x87,0x83,0x86,0x8E,0x78,0x61,0x75,0x85,0x82,0x68,0x80,0x83,0x5F,0x72,0x7C,0x7B, + 0x7C,0x8B,0x91,0x7A,0x80,0x88,0x8B,0x82,0x80,0x8E,0x7D,0x71,0x78,0x81,0x81,0x80, + 0x81,0x85,0x7C,0x73,0x78,0x71,0x73,0x73,0x7A,0x7B,0x76,0x7D,0x7B,0x83,0x87,0x91, + 0x92,0x88,0x8C,0x90,0x8F,0x8D,0x89,0x89,0x88,0x8B,0x85,0x84,0x8A,0x80,0x7F,0x7F, + 0x7A,0x7C,0x73,0x6C,0x69,0x6A,0x6A,0x68,0x6D,0x71,0x7E,0x84,0x77,0x75,0x7C,0x7B, + 0x7B,0x87,0x85,0x7A,0x7F,0x7E,0x81,0x83,0x7F,0x87,0x7E,0x78,0x80,0x79,0x76,0x80, + 0x78,0x6F,0x77,0x7C,0x7A,0x79,0x79,0x7E,0x80,0x83,0x85,0x83,0x83,0x85,0x85,0x87, + 0x86,0x81,0x81,0x88,0x92,0x91,0x8A,0x88,0x85,0x88,0x83,0x80,0x83,0x7A,0x7B,0x82, + 0x82,0x81,0x81,0x86,0x84,0x80,0x86,0x89,0x88,0x87,0x85,0x88,0x82,0x84,0x85,0x82, + 0x84,0x87,0x87,0x84,0x84,0x85,0x82,0x80,0x7A,0x76,0x7A,0x76,0x7A,0x7F,0x7B,0x7B, + 0x7D,0x7E,0x81,0x87,0x80,0x82,0x87,0x7F,0x7C,0x84,0x85,0x80,0x83,0x7A,0x7D,0x88, + 0x89,0x84,0x82,0x85,0x7F,0x7C,0x79,0x77,0x72,0x70,0x7C,0x7D,0x79,0x7F,0x7C,0x7D, + 0x84,0x85,0x88,0x87,0x8B,0x82,0x85,0x89,0x83,0x87,0x80,0x85,0x8C,0x8C,0x89,0x88, + 0x8F,0x84,0x80,0x80,0x7C,0x7C,0x78,0x77,0x7A,0x7D,0x7A,0x77,0x7C,0x80,0x82,0x84, + 0x84,0x82,0x7E,0x80,0x84,0x83,0x7F,0x7E,0x7D,0x7D,0x85,0x81,0x7A,0x7C,0x7C,0x78, + 0x75,0x7D,0x78,0x77,0x76,0x75,0x7B,0x74,0x7A,0x7D,0x7A,0x83,0x82,0x85,0x88,0x7F, + 0x7D,0x83,0x94,0x93,0x8C,0x8E,0x89,0x85,0x89,0x88,0x7C,0x76,0x7D,0x7F,0x7B,0x7F, + 0x7D,0x78,0x81,0x84,0x82,0x84,0x83,0x86,0x83,0x7F,0x80,0x79,0x7E,0x83,0x7C,0x7C, + 0x91,0x9B,0x8E,0x8D,0x87,0x85,0x8A,0x82,0x7B,0x74,0x76,0x81,0x7E,0x80,0x81,0x7A, + 0x80,0x8A,0x84,0x80,0x81,0x88,0x8A,0x7D,0x7B,0x7E,0x7E,0x7D,0x76,0x7D,0x90,0x8F, + 0x89,0x87,0x81,0x81,0x83,0x7B,0x75,0x72,0x78,0x81,0x79,0x7B,0x7C,0x7E,0x86,0x87, + 0x82,0x80,0x7F,0x84,0x83,0x7A,0x82,0x85,0x82,0x7E,0x76,0x84,0x95,0x91,0x87,0x84, + 0x87,0x8A,0x83,0x77,0x73,0x71,0x79,0x7F,0x74,0x78,0x7E,0x80,0x8C,0x80,0x80,0x85, + 0x84,0x84,0x7A,0x7D,0x83,0x7F,0x7C,0x77,0x74,0x89,0x98,0x8B,0x87,0x85,0x83,0x88, + 0x7C,0x6F,0x74,0x74,0x7B,0x77,0x73,0x7F,0x80,0x84,0x89,0x7B,0x7E,0x83,0x79,0x7B, + 0x7D,0x7E,0x83,0x80,0x7A,0x75,0x7B,0x8E,0x91,0x84,0x8A,0x89,0x84,0x8A,0x7A,0x74, + 0x7B,0x7D,0x7E,0x78,0x77,0x82,0x87,0x84,0x7F,0x81,0x88,0x83,0x78,0x80,0x82,0x7E, + 0x80,0x7C,0x7A,0x76,0x7A,0x8F,0x8C,0x82,0x8C,0x86,0x85,0x8B,0x7B,0x75,0x7C,0x7B, + 0x7D,0x78,0x7A,0x82,0x8A,0x86,0x7E,0x81,0x87,0x82,0x7E,0x82,0x7C,0x7E,0x80,0x7A, + 0x7B,0x7A,0x7C,0x8D,0x89,0x7F,0x8B,0x85,0x87,0x89,0x76,0x79,0x7F,0x78,0x78,0x76, + 0x77,0x81,0x81,0x83,0x81,0x7E,0x8A,0x89,0x7B,0x82,0x82,0x7A,0x7A,0x77,0x7F,0x7B, + 0x75,0x8C,0x8E,0x80,0x8A,0x85,0x83,0x89,0x74,0x76,0x84,0x72,0x79,0x7A,0x72,0x82, + 0x82,0x7D,0x7F,0x85,0x86,0x87,0x7E,0x7C,0x80,0x7C,0x79,0x79,0x7C,0x78,0x74,0x86, + 0x8E,0x7F,0x8B,0x89,0x7F,0x89,0x7A,0x72,0x80,0x75,0x76,0x7A,0x70,0x81,0x85,0x7E, + 0x88,0x85,0x82,0x87,0x80,0x7D,0x80,0x82,0x7D,0x76,0x7E,0x7B,0x73,0x82,0x90,0x86, + 0x87,0x8C,0x82,0x8B,0x83,0x73,0x81,0x7A,0x71,0x7C,0x76,0x7B,0x85,0x7F,0x86,0x86, + 0x82,0x86,0x83,0x80,0x84,0x81,0x7D,0x7C,0x7C,0x80,0x75,0x76,0x8B,0x87,0x83,0x8B, + 0x83,0x84,0x8A,0x7B,0x7C,0x7F,0x71,0x7C,0x78,0x72,0x83,0x7F,0x7D,0x84,0x83,0x85, + 0x86,0x82,0x83,0x83,0x7F,0x78,0x7A,0x80,0x7B,0x75,0x7E,0x8D,0x83,0x86,0x8A,0x7E, + 0x8C,0x88,0x76,0x80,0x77,0x74,0x7E,0x71,0x75,0x81,0x79,0x7E,0x84,0x81,0x8A,0x85, + 0x81,0x87,0x81,0x7C,0x79,0x7A,0x82,0x7B,0x72,0x87,0x8B,0x82,0x8C,0x86,0x7F,0x8D, + 0x82,0x74,0x7D,0x76,0x78,0x7B,0x71,0x7D,0x7D,0x7E,0x87,0x7E,0x84,0x89,0x7F,0x82, + 0x84,0x7C,0x7A,0x7C,0x76,0x79,0x77,0x72,0x81,0x85,0x83,0x86,0x80,0x85,0x8B,0x7B, + 0x77,0x7B,0x76,0x78,0x77,0x70,0x7B,0x80,0x7D,0x84,0x81,0x84,0x8A,0x85,0x83,0x86, + 0x80,0x7D,0x7C,0x7D,0x7F,0x7A,0x7B,0x88,0x87,0x82,0x88,0x84,0x83,0x8C,0x81,0x76, + 0x81,0x7C,0x78,0x7D,0x76,0x7B,0x7F,0x7E,0x7E,0x7C,0x84,0x8C,0x82,0x82,0x87,0x7F, + 0x81,0x81,0x7F,0x81,0x7C,0x78,0x83,0x87,0x80,0x85,0x88,0x86,0x88,0x83,0x7E,0x82, + 0x7E,0x7B,0x7C,0x75,0x79,0x7F,0x7C,0x7E,0x7F,0x80,0x87,0x82,0x82,0x86,0x82,0x85, + 0x80,0x7C,0x80,0x7D,0x7B,0x81,0x87,0x7F,0x84,0x85,0x83,0x89,0x86,0x81,0x83,0x80, + 0x7D,0x7D,0x79,0x7B,0x81,0x7B,0x7D,0x80,0x7F,0x87,0x84,0x81,0x89,0x84,0x82,0x82, + 0x7E,0x84,0x82,0x7D,0x83,0x86,0x82,0x86,0x84,0x81,0x89,0x85,0x81,0x85,0x82,0x80, + 0x81,0x7A,0x7A,0x7F,0x7A,0x7D,0x80,0x80,0x84,0x83,0x81,0x86,0x84,0x82,0x83,0x81, + 0x81,0x81,0x79,0x7F,0x85,0x80,0x82,0x81,0x81,0x84,0x82,0x80,0x82,0x80,0x7F,0x81, + 0x7A,0x7B,0x81,0x7E,0x7D,0x81,0x7E,0x83,0x82,0x82,0x87,0x84,0x84,0x83,0x80,0x81, + 0x82,0x7D,0x83,0x88,0x81,0x83,0x83,0x82,0x87,0x82,0x80,0x85,0x82,0x82,0x83,0x7D, + 0x7F,0x81,0x7C,0x80,0x81,0x7B,0x84,0x88,0x82,0x86,0x83,0x82,0x87,0x82,0x85,0x84, + 0x7B,0x86,0x86,0x7D,0x85,0x82,0x82,0x8A,0x82,0x7E,0x84,0x7F,0x80,0x7F,0x79,0x80, + 0x7D,0x7B,0x80,0x7D,0x7B,0x84,0x86,0x81,0x83,0x82,0x84,0x84,0x7D,0x83,0x85,0x88, + 0x94,0x87,0x85,0x81,0x75,0x79,0x76,0x7B,0x7B,0x7E,0x71,0x75,0x7C,0x5F,0x76,0x92, + 0x75,0x79,0x89,0x7F,0x84,0x76,0x82,0x93,0x82,0x85,0x83,0x7D,0x82,0x82,0x88,0x89, + 0x82,0x87,0x8A,0x87,0x88,0x87,0x8C,0x8E,0x88,0x86,0x7F,0x79,0x7F,0x86,0x7C,0x77, + 0x82,0x88,0x86,0x89,0x86,0x7B,0x7E,0x88,0x8A,0x88,0x90,0x8D,0x87,0x89,0x86,0x7F, + 0x79,0x7C,0x85,0x8A,0x91,0x91,0x83,0x79,0x76,0x74,0x75,0x75,0x71,0x74,0x76,0x70, + 0x6D,0x6A,0x69,0x6D,0x72,0x70,0x6A,0x6A,0x68,0x64,0x6D,0x6E,0x63,0x6D,0x75,0x79, + 0x7C,0x75,0x74,0x79,0x72,0x6C,0x68,0x69,0x76,0x7C,0x72,0x70,0x77,0x79,0x7A,0x74, + 0x74,0x7F,0x80,0x7C,0x7B,0x7E,0x7C,0x89,0xA7,0xAF,0xB5,0xB6,0xA4,0xA4,0x9C,0x88, + 0x8B,0x90,0x8A,0x86,0x7E,0x82,0x92,0x89,0x7E,0x86,0x88,0x89,0x88,0x82,0x89,0x89, + 0x84,0x86,0x84,0x79,0x8C,0xA6,0x9A,0x98,0x9A,0x93,0x97,0x85,0x75,0x86,0x8C,0x89, + 0x8E,0x8B,0x94,0x97,0x82,0x82,0x88,0x82,0x80,0x79,0x7F,0x87,0x7F,0x77,0x7B,0x78, + 0x76,0x8F,0x92,0x85,0x8A,0x87,0x83,0x7D,0x69,0x6C,0x7A,0x77,0x7C,0x80,0x81,0x8B, + 0x80,0x73,0x7A,0x75,0x71,0x73,0x72,0x79,0x7A,0x6A,0x64,0x61,0x56,0x66,0x76,0x69, + 0x6A,0x6D,0x5E,0x5A,0x4D,0x48,0x5A,0x5D,0x5B,0x65,0x67,0x6C,0x68,0x5B,0x5F,0x67, + 0x69,0x6A,0x70,0x77,0x76,0x69,0x64,0x66,0x5E,0x6E,0x81,0x7A,0x7B,0x7B,0x6D,0x6E, + 0x67,0x65,0x7B,0x86,0x8C,0x99,0x9D,0xA2,0xA0,0x91,0x94,0x9E,0x9F,0xA2,0xA3,0xA0, + 0x99,0x86,0x83,0x86,0x7B,0x90,0xA6,0x99,0x97,0x93,0x86,0x81,0x7B,0x7B,0x8F,0x96, + 0x94,0x9B,0x99,0x93,0x8C,0x82,0x8B,0x99,0x97,0x9A,0x9E,0x9B,0x93,0x87,0x8A,0x8C, + 0x8B,0xA4,0xAB,0x9B,0x9B,0x90,0x82,0x7C,0x72,0x7C,0x8F,0x8F,0x8D,0x93,0x8D,0x84, + 0x78,0x74,0x85,0x8D,0x89,0x8B,0x8D,0x83,0x78,0x77,0x7D,0x7C,0x89,0x9F,0x97,0x8C, + 0x88,0x7B,0x73,0x6D,0x6A,0x78,0x7D,0x74,0x76,0x70,0x67,0x5D,0x52,0x59,0x66,0x63, + 0x61,0x63,0x5F,0x55,0x4D,0x56,0x56,0x5B,0x75,0x76,0x69,0x69,0x63,0x5D,0x5C,0x5B, + 0x67,0x73,0x6E,0x6C,0x6C,0x67,0x64,0x5D,0x60,0x70,0x73,0x72,0x77,0x78,0x76,0x71, + 0x77,0x81,0x7F,0x9B,0xB4,0xA8,0xA7,0xAA,0xA1,0x9E,0x98,0x98,0xA8,0xA4,0x97,0x9A, + 0x93,0x8B,0x86,0x83,0x90,0x96,0x8D,0x8E,0x90,0x89,0x83,0x83,0x8D,0x89,0x93,0xAE, + 0xA6,0x97,0x94,0x90,0x8D,0x8B,0x89,0x9B,0xA6,0x98,0x97,0x97,0x91,0x8C,0x88,0x8F, + 0x9A,0x96,0x92,0x90,0x85,0x83,0x81,0x87,0x8B,0x82,0x95,0xA8,0x91,0x85,0x8A,0x82, + 0x80,0x7C,0x80,0x94,0x92,0x81,0x83,0x84,0x7F,0x7C,0x7B,0x88,0x8E,0x87,0x85,0x82, + 0x7A,0x74,0x74,0x74,0x68,0x6E,0x87,0x7B,0x67,0x65,0x5F,0x5B,0x56,0x54,0x65,0x6F, + 0x60,0x5B,0x5E,0x59,0x55,0x54,0x5C,0x69,0x67,0x62,0x68,0x63,0x5B,0x5E,0x64,0x69, + 0x60,0x66,0x7E,0x72,0x5F,0x65,0x62,0x62,0x66,0x67,0x77,0x84,0x76,0x73,0x7F,0x7F, + 0x82,0x8A,0x95,0xA5,0xA7,0xA1,0xA2,0x9F,0x97,0x94,0x97,0x92,0x8C,0xA4,0xA9,0x8F, + 0x8D,0x8C,0x83,0x80,0x7F,0x89,0x94,0x90,0x87,0x8C,0x89,0x86,0x84,0x88,0x97,0x9A, + 0x92,0x93,0x93,0x89,0x8A,0x90,0x90,0x95,0x8F,0x91,0xA6,0x99,0x85,0x8D,0x89,0x83, + 0x86,0x87,0x91,0x95,0x86,0x86,0x89,0x86,0x83,0x81,0x8B,0x91,0x8A,0x84,0x85,0x83, + 0x80,0x7F,0x83,0x7F,0x7B,0x94,0x97,0x82,0x84,0x82,0x7C,0x79,0x76,0x81,0x8B,0x80, + 0x78,0x78,0x72,0x6A,0x65,0x68,0x70,0x73,0x69,0x68,0x68,0x5E,0x58,0x5D,0x62,0x64, + 0x63,0x5C,0x6D,0x74,0x5B,0x59,0x63,0x5F,0x60,0x5E,0x64,0x72,0x67,0x5C,0x63,0x63, + 0x60,0x62,0x64,0x6F,0x72,0x6A,0x6D,0x6F,0x6E,0x70,0x76,0x7E,0x7B,0x7F,0x9B,0x9E, + 0x91,0x97,0x97,0x97,0x98,0x93,0xA0,0xA9,0x98,0x94,0x97,0x8F,0x8C,0x8A,0x8E,0x97, + 0x93,0x89,0x8C,0x8C,0x85,0x82,0x89,0x90,0x91,0x8C,0x87,0x9B,0xA3,0x8A,0x89,0x90, + 0x8B,0x8A,0x88,0x8F,0x9B,0x92,0x86,0x8E,0x90,0x89,0x88,0x8C,0x91,0x92,0x89,0x88, + 0x8D,0x89,0x87,0x87,0x8C,0x85,0x7C,0x98,0x9E,0x88,0x87,0x88,0x83,0x81,0x7A,0x86, + 0x93,0x88,0x82,0x84,0x81,0x7F,0x7B,0x7F,0x8A,0x8A,0x80,0x80,0x82,0x7C,0x75,0x75, + 0x78,0x73,0x6F,0x6A,0x72,0x81,0x6C,0x60,0x69,0x65,0x60,0x5D,0x63,0x71,0x6A,0x5B, + 0x61,0x65,0x5F,0x5E,0x63,0x69,0x6C,0x66,0x64,0x6A,0x68,0x64,0x64,0x68,0x68,0x5E, + 0x6E,0x84,0x75,0x6A,0x71,0x70,0x6E,0x6F,0x76,0x87,0x8A,0x80,0x85,0x8E,0x8E,0x8C, + 0x90,0x9D,0xA2,0x9C,0x97,0x9B,0x9B,0x92,0x8F,0x95,0x98,0x91,0x8A,0x8E,0xA0,0x9A, + 0x84,0x88,0x8D,0x86,0x83,0x84,0x8F,0x95,0x87,0x82,0x8A,0x88,0x84,0x86,0x8C,0x91, + 0x8C,0x87,0x8B,0x8C,0x88,0x87,0x89,0x8D,0x87,0x81,0x98,0xA0,0x89,0x86,0x8B,0x86, + 0x85,0x7E,0x86,0x97,0x8F,0x83,0x86,0x88,0x85,0x81,0x85,0x8D,0x8D,0x86,0x83,0x87, + 0x89,0x81,0x80,0x89,0x8A,0x81,0x7A,0x8B,0x9A,0x85,0x79,0x81,0x80,0x77,0x6E,0x73, + 0x7F,0x78,0x6C,0x6C,0x71,0x6C,0x65,0x64,0x6C,0x70,0x67,0x66,0x67,0x66,0x64,0x63, + 0x67,0x69,0x5F,0x61,0x7B,0x76,0x62,0x68,0x69,0x69,0x60,0x67,0x76,0x6F,0x75,0x54, + 0x58,0x72,0x61,0x53,0x60,0x79,0x7F,0x83,0x87,0x90,0x8F,0x92,0xAA,0xB4,0xB5,0xB6, + 0xB2,0xBB,0xB0,0x8C,0xA0,0xA4,0x7E,0x79,0x7D,0x78,0x6E,0x66,0x50,0x5C,0x74,0x72, + 0x69,0x5D,0x74,0x7D,0x72,0x7D,0x8B,0x98,0xA0,0x9F,0xA2,0xB1,0xAD,0xC9,0xD0,0xB0, + 0xD6,0xBF,0xB4,0xC5,0xA8,0xB1,0xAC,0x98,0x8E,0x8D,0x94,0x93,0x71,0x68,0x71,0x62, + 0x71,0x68,0x6A,0x88,0x6C,0x6A,0x7B,0x76,0x7C,0x67,0x56,0x69,0x68,0x60,0x67,0x67, + 0x5C,0x5D,0x5F,0x74,0x7F,0x80,0x8B,0x82,0x8E,0x8D,0x7C,0x7D,0x81,0x7B,0x78,0x82, + 0x93,0x96,0x8B,0x80,0x91,0x8C,0x84,0x9A,0x8C,0x82,0x81,0x81,0x7D,0x72,0x77,0x74, + 0x72,0x6F,0x74,0x80,0x74,0x67,0x5B,0x50,0x5B,0x5F,0x4D,0x42,0x50,0x4C,0x43,0x49, + 0x55,0x66,0x5A,0x69,0x7D,0x71,0x76,0x86,0x83,0x85,0x83,0x7E,0x97,0x9B,0x98,0x9E, + 0x94,0xA5,0xB6,0xB3,0xC1,0xBE,0xB2,0xB4,0xAB,0x99,0x9E,0x89,0x78,0x8B,0x7A,0x87, + 0x9E,0x88,0x7B,0x71,0x6A,0x75,0x80,0x74,0x73,0x6B,0x6F,0x81,0x70,0x6F,0x73,0x76, + 0x81,0x78,0x7B,0x71,0x71,0x83,0x82,0x84,0x7B,0x82,0x96,0x8D,0x8D,0xA1,0x8C,0x8D, + 0x91,0x8A,0x9B,0x91,0x90,0x98,0x99,0x99,0x9B,0xA4,0xA4,0x9F,0xAB,0xAB,0xB1,0xB8, + 0xA5,0xA0,0xA1,0xA1,0x9E,0x93,0x89,0x6E,0x68,0x74,0x74,0x71,0x5C,0x5C,0x6D,0x67, + 0x58,0x45,0x34,0x36,0x3E,0x49,0x4C,0x3E,0x3B,0x44,0x42,0x44,0x4B,0x45,0x46,0x43, + 0x3D,0x47,0x4A,0x55,0x56,0x61,0x85,0x87,0x84,0x79,0x6B,0x7D,0x88,0x93,0xA8,0xA6, + 0xAF,0xBD,0xAD,0xA2,0xA8,0xAD,0xB0,0xCA,0xD7,0xBF,0xC2,0xCD,0xCF,0xCE,0xC7,0xC9, + 0xC3,0xC5,0xC8,0xB4,0xA0,0x8E,0x7A,0x79,0x8D,0x8E,0x7E,0x6C,0x5B,0x59,0x5D,0x5C, + 0x54,0x51,0x4E,0x5F,0x5A,0x43,0x3B,0x2F,0x46,0x49,0x47,0x55,0x4C,0x59,0x6C,0x69, + 0x5E,0x5C,0x68,0x6B,0x6C,0x85,0x7B,0x73,0x86,0x73,0x7B,0x91,0x8D,0x98,0x9E,0xAB, + 0xB3,0xAD,0xA9,0xB2,0xB4,0xB6,0xBB,0xB5,0xB8,0xBF,0xC7,0xBD,0xBD,0xBC,0xAE,0xB1, + 0xAB,0xA3,0xA1,0x9F,0x99,0x91,0x86,0x83,0x8E,0x81,0x7E,0x7F,0x74,0x6A,0x61,0x68, + 0x60,0x57,0x55,0x53,0x5F,0x68,0x62,0x58,0x56,0x52,0x51,0x50,0x44,0x43,0x45,0x4C, + 0x58,0x5F,0x5E,0x50,0x49,0x4D,0x56,0x61,0x58,0x51,0x5B,0x64,0x68,0x63,0x6B,0x6B, + 0x64,0x7E,0x80,0x84,0x90,0x89,0x8F,0x89,0x89,0x97,0x9F,0xAD,0xAB,0x9F,0x9E,0x97, + 0x98,0x98,0x9B,0xAF,0xA9,0x9C,0xA2,0xA5,0x95,0x8C,0x85,0x79,0x9A,0xB3,0xA9,0xA1, + 0x8C,0x8F,0x9B,0x9D,0x94,0x86,0x91,0xA1,0x9E,0x95,0x94,0x9B,0x9B,0x93,0x8F,0x89, + 0x8D,0x7B,0x6B,0x6D,0x66,0x6D,0x6E,0x69,0x7D,0x95,0x86,0x77,0x77,0x6E,0x76,0x74, + 0x6C,0x6D,0x71,0x79,0x6B,0x64,0x65,0x60,0x66,0x6B,0x73,0x7D,0x7E,0x84,0x7A,0x7E, + 0x88,0x81,0x80,0x7D,0x98,0xA9,0x92,0x83,0x73,0x76,0x84,0x7D,0x7E,0x84,0x87,0x87, + 0x7D,0x74,0x74,0x6E,0x76,0x70,0x6A,0x79,0x72,0x76,0x81,0x73,0x70,0x75,0x6D,0x7B, + 0x98,0x8E,0x80,0x80,0x74,0x89,0x96,0x7D,0x7B,0x7F,0x8D,0xA0,0x8F,0x86,0x83,0x79, + 0x81,0x80,0x7B,0x83,0x88,0x86,0x85,0x87,0x82,0x84,0x7C,0x75,0x8D,0x8C,0x81,0x7A, + 0x71,0x6F,0x66,0x62,0x5D,0x60,0x82,0x8B,0x7C,0x6D,0x5E,0x79,0x7D,0x74,0x6F,0x5C, + 0x64,0x6C,0x75,0x79,0x75,0x7C,0x78,0x7C,0x98,0x98,0x8A,0x86,0x82,0x92,0x90,0x8A, + 0x8E,0x95,0x9A,0x96,0x9B,0x95,0x92,0x99,0x97,0x92,0x8E,0x8F,0x92,0x94,0x96,0x94, + 0x88,0x94,0x95,0x97,0xAF,0xAF,0xAD,0xAE,0xA5,0xA2,0x9F,0x94,0x90,0x98,0x9F,0x9B, + 0x8E,0x7C,0x7C,0x8A,0x95,0x91,0x87,0x88,0x82,0x7A,0x7C,0x72,0x63,0x69,0x65,0x6C, + 0x79,0x71,0x6A,0x6A,0x6C,0x68,0x63,0x66,0x70,0x77,0x79,0x70,0x5F,0x5F,0x5B,0x57, + 0x56,0x4D,0x53,0x58,0x63,0x65,0x5E,0x5A,0x58,0x63,0x5D,0x67,0x77,0x68,0x66,0x69, + 0x69,0x6F,0x6F,0x6E,0x70,0x77,0x83,0x80,0x73,0x6E,0x6F,0x6F,0x6D,0x6F,0x70,0x6C, + 0x73,0x79,0x7C,0x7A,0x7D,0x85,0x7B,0x79,0x86,0x89,0x8A,0x93,0x94,0x8D,0x8E,0x91, + 0x8D,0x9B,0xA6,0xA1,0x9E,0x97,0x97,0x9B,0x8C,0x87,0x8C,0x8B,0x97,0xA0,0x9B,0x9B, + 0x93,0x9A,0xA0,0x9D,0xAE,0xB0,0xAA,0xA4,0x9E,0x96,0x90,0x98,0x9B,0x96,0x9D,0xA1, + 0xA3,0xA4,0x97,0x8E,0x87,0x7F,0x83,0x84,0x80,0x84,0x83,0x83,0x88,0x86,0x81,0x85, + 0x8F,0x97,0x8E,0x82,0x79,0x74,0x70,0x6B,0x71,0x6C,0x66,0x66,0x69,0x75,0x73,0x69, + 0x5A,0x57,0x5B,0x5F,0x63,0x55,0x53,0x59,0x58,0x5F,0x5D,0x56,0x67,0x74,0x7C,0x80, + 0x6F,0x66,0x62,0x60,0x65,0x6A,0x64,0x5A,0x5B,0x69,0x72,0x6F,0x71,0x6E,0x6F,0x7D, + 0x80,0x77,0x6E,0x75,0x77,0x7C,0x83,0x7F,0x8D,0x97,0x9A,0x98,0x88,0x83,0x82,0x88, + 0x8C,0x89,0x8B,0x7F,0x7B,0x8A,0x91,0x96,0x96,0x8C,0x8E,0x99,0x99,0x91,0x91,0x93, + 0x94,0xA0,0x9C,0x92,0x93,0xA0,0xA8,0xA4,0x9F,0x96,0x9C,0x9F,0xA0,0xA1,0x95,0x95, + 0x95,0x91,0x92,0x95,0x93,0x8F,0x8F,0x90,0x99,0x94,0x93,0x94,0x8B,0x8F,0x96,0x8D, + 0x89,0x92,0x92,0x8E,0x8C,0x89,0x88,0x8F,0x90,0x8C,0x8A,0x8A,0x8A,0x80,0x74,0x74, + 0x6F,0x6C,0x6D,0x6C,0x6A,0x64,0x6E,0x6C,0x62,0x6F,0x6A,0x64,0x62,0x5E,0x66,0x59, + 0x5C,0x59,0x4E,0x5E,0x5E,0x5D,0x5E,0x5E,0x5F,0x5B,0x5E,0x58,0x5C,0x64,0x5F,0x5F, + 0x5D,0x59,0x63,0x69,0x66,0x6A,0x64,0x63,0x6C,0x6F,0x7B,0x78,0x6E,0x75,0x76,0x77, + 0x7C,0x76,0x74,0x7A,0x7F,0x81,0x82,0x86,0x87,0x8D,0x8F,0x8A,0x8A,0x8F,0x8D,0x90, + 0x95,0x90,0x8C,0x8A,0x8B,0x8D,0x90,0x93,0x92,0x8E,0x8D,0x94,0x99,0x93,0x93,0x99, + 0x97,0x9A,0x9C,0x93,0x93,0x98,0x9D,0x9E,0x9C,0x9A,0x9B,0x9E,0xA0,0xA4,0x9F,0x9A, + 0x9A,0x95,0x9A,0xA5,0x9D,0x9D,0x9D,0x9A,0x9E,0x9D,0x9F,0x9B,0x9D,0xA0,0x97,0x95, + 0x91,0x8D,0x8E,0x8B,0x85,0x84,0x82,0x82,0x86,0x84,0x7F,0x7F,0x7D,0x7D,0x7A,0x7C, + 0x82,0x7A,0x7A,0x76,0x6D,0x77,0x75,0x74,0x79,0x79,0x78,0x76,0x75,0x6F,0x70,0x71, + 0x6A,0x69,0x68,0x67,0x68,0x61,0x5E,0x5F,0x66,0x69,0x61,0x5E,0x66,0x68,0x63,0x5F, + 0x58,0x57,0x63,0x69,0x68,0x6C,0x63,0x5C,0x61,0x63,0x63,0x6B,0x66,0x5E,0x65,0x69, + 0x6E,0x70,0x6B,0x6D,0x73,0x7A,0x7D,0x72,0x73,0x7A,0x79,0x7C,0x79,0x75,0x7C,0x81, + 0x84,0x85,0x80,0x7E,0x7D,0x87,0x8A,0x85,0x88,0x82,0x7E,0x87,0x86,0x85,0x85,0x83, + 0x87,0x8D,0x8E,0x87,0x86,0x8F,0x96,0x99,0x98,0x94,0x96,0x9A,0x9E,0xA0,0xA0,0x9F, + 0x99,0x9F,0xA0,0x9D,0x9D,0x93,0x91,0x94,0x96,0x9C,0x99,0x97,0x99,0x96,0x9A,0x97, + 0x8F,0x93,0x98,0x97,0x97,0x90,0x8B,0x8C,0x90,0x8F,0x8F,0x8F,0x8B,0x8B,0x89,0x87, + 0x86,0x83,0x82,0x84,0x82,0x82,0x83,0x7F,0x80,0x81,0x7D,0x7C,0x7B,0x79,0x80,0x80, + 0x79,0x7A,0x78,0x78,0x7A,0x79,0x7B,0x7E,0x7B,0x77,0x77,0x77,0x73,0x73,0x75,0x6E, + 0x6C,0x6E,0x6E,0x71,0x74,0x73,0x74,0x72,0x74,0x75,0x76,0x7D,0x76,0x77,0x7B,0x7A, + 0x80,0x7B,0x77,0x79,0x7A,0x7B,0x77,0x72,0x73,0x74,0x79,0x76,0x71,0x72,0x70,0x74, + 0x77,0x73,0x73,0x74,0x74,0x74,0x72,0x78,0x77,0x71,0x75,0x77,0x79,0x7C,0x78,0x7B, + 0x7E,0x80,0x7D,0x78,0x77,0x77,0x7E,0x7F,0x78,0x77,0x78,0x7D,0x80,0x7E,0x7C,0x7C, + 0x7E,0x7E,0x7D,0x82,0x86,0x82,0x85,0x84,0x82,0x88,0x84,0x80,0x85,0x85,0x80,0x7F, + 0x7D,0x7B,0x7E,0x82,0x7E,0x7D,0x7C,0x7E,0x81,0x80,0x7F,0x80,0x81,0x83,0x83,0x85, + 0x8D,0x8C,0x89,0x8A,0x82,0x87,0x8B,0x89,0x8F,0x8D,0x87,0x87,0x87,0x8A,0x89,0x87, + 0x83,0x80,0x82,0x85,0x85,0x84,0x81,0x83,0x87,0x86,0x84,0x81,0x87,0x8B,0x88,0x8A, + 0x85,0x84,0x8C,0x89,0x8A,0x88,0x82,0x83,0x81,0x86,0x86,0x81,0x80,0x7D,0x7F,0x82, + 0x80,0x82,0x7E,0x7E,0x83,0x81,0x7F,0x7C,0x80,0x85,0x83,0x83,0x7F,0x7B,0x83,0x82, + 0x82,0x86,0x7D,0x7C,0x7F,0x7E,0x85,0x84,0x80,0x7F,0x7E,0x82,0x83,0x80,0x81,0x80, + 0x82,0x85,0x82,0x7F,0x83,0x8A,0x86,0x81,0x82,0x82,0x85,0x89,0x85,0x85,0x83,0x7E, + 0x80,0x80,0x7F,0x7F,0x7B,0x78,0x7A,0x7B,0x7B,0x7D,0x7D,0x7D,0x80,0x83,0x84,0x7E, + 0x81,0x89,0x85,0x84,0x82,0x7F,0x83,0x86,0x86,0x82,0x80,0x7F,0x7E,0x81,0x7E,0x7B, + 0x7C,0x7B,0x7C,0x7A,0x79,0x7C,0x7B,0x7B,0x7C,0x7D,0x7D,0x7B,0x7D,0x81,0x7F,0x7F, + 0x7E,0x7E,0x82,0x85,0x85,0x7F,0x7D,0x7F,0x80,0x81,0x7F,0x7D,0x7D,0x7C,0x7D,0x7C, + 0x7D,0x7E,0x7E,0x81,0x80,0x82,0x82,0x7E,0x84,0x84,0x82,0x85,0x80,0x81,0x84,0x82, + 0x83,0x7F,0x7D,0x7F,0x7E,0x7F,0x7D,0x7A,0x7B,0x7B,0x7D,0x7C,0x7B,0x7D,0x7D,0x80, + 0x82,0x81,0x80,0x80,0x86,0x85,0x82,0x85,0x80,0x82,0x87,0x85,0x87,0x83,0x80,0x81, + 0x7E,0x7D,0x7C,0x79,0x7B,0x7A,0x7A,0x79,0x79,0x7B,0x7A,0x7C,0x7E,0x7E,0x7E,0x7E, + 0x83,0x82,0x80,0x81,0x7E,0x83,0x86,0x83,0x85,0x81,0x80,0x81,0x7F,0x80,0x7D,0x7B, + 0x7C,0x7B,0x7D,0x7D,0x7C,0x7D,0x7E,0x80,0x80,0x81,0x80,0x81,0x85,0x82,0x83,0x83, + 0x80,0x84,0x85,0x84,0x86,0x84,0x83,0x83,0x7F,0x81,0x7F,0x7D,0x80,0x7D,0x7C,0x7E, + 0x7E,0x80,0x81,0x81,0x81,0x81,0x81,0x84,0x86,0x84,0x84,0x82,0x80,0x84,0x83,0x82, + 0x85,0x81,0x81,0x80,0x7D,0x7F,0x7B,0x78,0x7B,0x78,0x7A,0x7D,0x7D,0x7E,0x7C,0x7D, + 0x7F,0x80,0x81,0x82,0x84,0x83,0x83,0x84,0x83,0x84,0x84,0x83,0x86,0x85,0x84,0x84, + 0x7F,0x7E,0x7E,0x7C,0x7D,0x7C,0x7B,0x7C,0x7B,0x7C,0x7C,0x7C,0x7C,0x7D,0x7F,0x80, + 0x82,0x82,0x80,0x82,0x80,0x81,0x83,0x82,0x86,0x85,0x83,0x84,0x80,0x7F,0x81,0x80, + 0x80,0x7F,0x7E,0x80,0x80,0x81,0x81,0x80,0x80,0x80,0x82,0x83,0x82,0x84,0x82,0x83, + 0x84,0x81,0x82,0x83,0x83,0x84,0x82,0x81,0x80,0x7D,0x7E,0x7D,0x7B,0x7C,0x7B,0x7B, + 0x7B,0x7B,0x7C,0x7B,0x7B,0x7E,0x7E,0x7E,0x80,0x81,0x81,0x80,0x82,0x82,0x82,0x83, + 0x84,0x84,0x84,0x83,0x83,0x82,0x82,0x80,0x7F,0x7E,0x7E,0x7D,0x7C,0x7B,0x7C,0x7D, + 0x7D,0x7E,0x7E,0x7E,0x7F,0x80,0x82,0x82,0x82,0x83,0x83,0x84,0x85,0x85,0x86,0x86, + 0x85,0x85,0x85,0x82,0x81,0x80,0x80,0x80,0x7F,0x7C,0x7C,0x7C,0x7D,0x7C,0x7C,0x7C, + 0x7D,0x7E,0x7D,0x7E,0x7E,0x7E,0x7F,0x81,0x82,0x82,0x82,0x81,0x82,0x84,0x84,0x83, + 0x81,0x81,0x80,0x80,0x7F,0x7C,0x7B,0x7C,0x7D,0x7D,0x7D,0x7B,0x7D,0x7E,0x7E,0x7F, + 0x7F,0x7E,0x7F,0x81,0x82,0x81,0x80,0x81,0x82,0x84,0x85,0x84,0x83,0x82,0x81,0x80, + 0x7F,0x7D,0x7D,0x7B,0x7B,0x7B,0x79,0x7B,0x7D,0x7D,0x7E,0x7F,0x80,0x80,0x80,0x82, + 0x82,0x83,0x84,0x83,0x84,0x86,0x86,0x87,0x85,0x85,0x86,0x83, +}; +#define sound2_len 0x0000DC8C +const unsigned char sound2_data[] = { + 0x80,0x84,0x8C,0x88,0x7F,0x85,0x8E,0x8B,0x87,0x8B,0x88,0x7C,0x7C,0x81,0x7D,0x75, + 0x77,0x80,0x81,0x86,0x95,0x86,0x78,0x75,0x6A,0x71,0x78,0x75,0x76,0x95,0x7C,0x7C, + 0xA1,0x7D,0x82,0x8D,0x77,0x66,0x6A,0x79,0x70,0x72,0x75,0x76,0x7C,0x8B,0x90,0x86, + 0x87,0x89,0x81,0x6B,0x6D,0x6E,0x62,0x80,0x94,0x81,0x8C,0x95,0x82,0x8D,0x94,0x7C, + 0x80,0x7F,0x73,0x86,0x8B,0x8D,0x9D,0x9E,0x9D,0xA2,0xA0,0x96,0x83,0x8A,0x96,0x91, + 0x97,0x88,0x86,0x96,0x92,0x8B,0x7B,0x7C,0x87,0x72,0x67,0x69,0x6B,0x7C,0x7E,0x72, + 0x72,0x6C,0x69,0x68,0x5B,0x5B,0x60,0x5E,0x67,0x63,0x62,0x63,0x63,0x77,0x7B,0x7A, + 0x70,0x5A,0x59,0x64,0x5F,0x5D,0x5F,0x70,0x7B,0x6E,0x73,0x7A,0x7C,0x83,0x99,0xB1, + 0xB1,0xA1,0x99,0x98,0x89,0x89,0x8B,0x91,0xA7,0xAE,0xAA,0xA3,0x95,0x87,0x85,0x85, + 0x86,0x88,0x94,0x9F,0x94,0x88,0x81,0x7E,0x80,0x81,0x8A,0x92,0x8D,0x8B,0x85,0x7F, + 0x84,0x7F,0x79,0x88,0x93,0x8E,0x8B,0x7F,0x7B,0x7D,0x7D,0x88,0x87,0x8D,0x9D,0x8F, + 0x87,0x84,0x7B,0x8C,0x93,0x97,0xA0,0x95,0x8B,0x8D,0x89,0x88,0x8C,0x88,0x9B,0xA6, + 0x96,0x8A,0x76,0x6E,0x77,0x74,0x73,0x72,0x74,0x7B,0x6C,0x5D,0x62,0x64,0x66,0x6C, + 0x67,0x6A,0x65,0x52,0x48,0x4A,0x58,0x58,0x5B,0x6D,0x77,0x70,0x61,0x54,0x52,0x60, + 0x5F,0x5C,0x64,0x6B,0x6C,0x60,0x58,0x5C,0x66,0x6F,0x75,0x7A,0x84,0x88,0x8E,0x93, + 0x98,0x9E,0x9B,0x99,0x9B,0xAD,0xAA,0x98,0x90,0x8C,0x99,0xA3,0x99,0x94,0x97,0x94, + 0x8B,0x82,0x85,0x90,0x97,0x93,0x8F,0x90,0x8F,0x87,0x86,0x8F,0x93,0x91,0x84,0x85, + 0x99,0x9B,0x89,0x7A,0x78,0x86,0x87,0x81,0x87,0x8F,0x90,0x81,0x78,0x80,0x8F,0x99, + 0x9A,0x98,0x99,0x9A,0x8C,0x91,0x94,0x91,0x97,0x94,0x97,0x9B,0xA3,0xA1,0x90,0x8B, + 0x84,0x86,0x8B,0x83,0x7E,0x7C,0x78,0x6C,0x65,0x68,0x6D,0x71,0x6D,0x66,0x64,0x62, + 0x59,0x57,0x5F,0x5B,0x57,0x52,0x4F,0x64,0x6E,0x63,0x5B,0x57,0x5D,0x5F,0x58,0x5F, + 0x66,0x67,0x61,0x57,0x54,0x5F,0x67,0x66,0x71,0x78,0x77,0x75,0x78,0x87,0x95,0x9A, + 0x99,0x9C,0x9A,0xA3,0xAD,0xA4,0x9A,0x96,0x94,0x97,0x97,0x95,0x98,0x8F,0x89,0x8E, + 0x88,0x8B,0x93,0x8F,0x93,0x95,0x8E,0x87,0x86,0x8C,0x92,0x8F,0x88,0x89,0x85,0x8F, + 0x97,0x8B,0x81,0x7B,0x82,0x88,0x84,0x87,0x90,0x91,0x88,0x7E,0x7C,0x85,0x8E,0x8D, + 0x94,0x9E,0x9D,0x94,0x8A,0x92,0x9B,0x96,0x90,0x90,0x93,0x98,0xA3,0x99,0x8B,0x8B, + 0x86,0x86,0x89,0x7D,0x81,0x81,0x73,0x6D,0x64,0x67,0x70,0x6B,0x6B,0x6D,0x63,0x59, + 0x55,0x52,0x5A,0x59,0x51,0x59,0x55,0x58,0x71,0x6A,0x58,0x5A,0x56,0x5D,0x5D,0x59, + 0x64,0x67,0x60,0x59,0x56,0x5E,0x68,0x66,0x72,0x7C,0x7D,0x78,0x76,0x86,0x94,0x99, + 0x99,0x9B,0x99,0x95,0xA5,0xAD,0x9D,0x94,0x94,0x8E,0x92,0x8C,0x8E,0x96,0x8F,0x84, + 0x83,0x82,0x89,0x92,0x8F,0x97,0x97,0x8B,0x86,0x86,0x8B,0x92,0x88,0x87,0x82,0x7C, + 0x95,0x9D,0x8A,0x85,0x84,0x81,0x81,0x7F,0x87,0x92,0x8F,0x86,0x86,0x8B,0x8B,0x8E, + 0x92,0x9E,0x9E,0x96,0x8F,0x8B,0x97,0x9B,0x96,0x96,0x95,0x89,0x9A,0xA9,0x96,0x8D, + 0x85,0x82,0x7D,0x78,0x7B,0x7F,0x7C,0x6F,0x68,0x65,0x67,0x62,0x5D,0x67,0x68,0x5F, + 0x55,0x4E,0x52,0x57,0x52,0x51,0x55,0x4E,0x57,0x6F,0x62,0x5A,0x59,0x56,0x5A,0x54, + 0x5A,0x67,0x6C,0x62,0x5E,0x63,0x66,0x6F,0x6C,0x7B,0x89,0x89,0x88,0x88,0x92,0x9C, + 0x99,0x9C,0xA2,0x96,0x9E,0xB4,0xAC,0x99,0x96,0x90,0x8E,0x89,0x85,0x93,0x93,0x88, + 0x7F,0x83,0x87,0x85,0x87,0x8E,0x95,0x94,0x8E,0x84,0x83,0x84,0x86,0x86,0x88,0x83, + 0x81,0x9A,0x9A,0x88,0x83,0x85,0x82,0x7E,0x82,0x8E,0x96,0x8F,0x87,0x8F,0x8E,0x85, + 0x8F,0x92,0x98,0x9E,0x97,0x90,0x8F,0x8E,0x8A,0x8E,0x95,0x8F,0x86,0x9A,0xA8,0x8F, + 0x85,0x85,0x7B,0x77,0x76,0x78,0x83,0x7F,0x6C,0x6B,0x6B,0x61,0x5D,0x5F,0x62,0x68, + 0x60,0x56,0x58,0x53,0x4D,0x4F,0x58,0x59,0x4F,0x60,0x75,0x64,0x56,0x5C,0x59,0x55, + 0x56,0x5F,0x6A,0x71,0x67,0x66,0x6D,0x68,0x69,0x74,0x7F,0x8A,0x93,0x90,0x98,0x9A, + 0x95,0x9D,0xA5,0xA6,0x9C,0xA6,0xBA,0xA9,0x91,0x97,0x93,0x86,0x81,0x89,0x92,0x95, + 0x8E,0x85,0x8D,0x88,0x80,0x83,0x8A,0x8E,0x8C,0x88,0x89,0x85,0x7A,0x7D,0x84,0x87, + 0x7B,0x84,0x9D,0x93,0x82,0x88,0x8C,0x7F,0x81,0x87,0x92,0x9B,0x93,0x90,0x9A,0x95, + 0x8A,0x8E,0x94,0x95,0x95,0x95,0x96,0x97,0x8C,0x8D,0x97,0x94,0x89,0x8B,0x9F,0x99, + 0x81,0x85,0x86,0x74,0x6C,0x73,0x78,0x7B,0x76,0x6F,0x73,0x6D,0x5D,0x5B,0x60,0x5D, + 0x5D,0x5C,0x5C,0x5F,0x57,0x51,0x5A,0x5C,0x53,0x5D,0x6B,0x60,0x5B,0x65,0x5B,0x51, + 0x58,0x5A,0x5C,0x67,0x65,0x68,0x76,0x70,0x71,0x7C,0x7F,0x85,0x90,0x97,0x9E,0xA4, + 0xA0,0xA3,0xA6,0xA3,0xA8,0xB0,0xA5,0x9F,0xA5,0x99,0x8B,0x90,0x8F,0x86,0x8C,0x8D, + 0x88,0x8E,0x8D,0x83,0x89,0x89,0x7F,0x81,0x84,0x82,0x81,0x80,0x80,0x83,0x7C,0x80, + 0x90,0x8D,0x84,0x8C,0x93,0x85,0x80,0x89,0x88,0x86,0x8C,0x8D,0x91,0x99,0x93,0x93, + 0x9D,0x98,0x90,0x96,0x98,0x94,0x92,0x90,0x94,0x94,0x8E,0x94,0x9E,0x95,0x8C,0x8F, + 0x8E,0x80,0x79,0x7E,0x77,0x70,0x72,0x6E,0x6E,0x71,0x69,0x64,0x69,0x65,0x60,0x5F, + 0x5D,0x5A,0x59,0x57,0x5A,0x5E,0x5B,0x5D,0x65,0x65,0x5D,0x5C,0x65,0x64,0x5C,0x60, + 0x66,0x63,0x66,0x68,0x69,0x6F,0x72,0x74,0x79,0x80,0x86,0x8B,0x92,0x9E,0x9F,0xA1, + 0xA6,0xA8,0xA6,0xA5,0xA6,0xA4,0xA2,0x9D,0x99,0x94,0x95,0x92,0x8F,0x8D,0x8A,0x88, + 0x86,0x86,0x86,0x84,0x82,0x83,0x82,0x80,0x7E,0x7E,0x7D,0x7E,0x7E,0x7D,0x81,0x82, + 0x82,0x84,0x82,0x84,0x85,0x85,0x86,0x88,0x89,0x8C,0x8E,0x91,0x94,0x93,0x93,0x93, + 0x93,0x93,0x94,0x96,0x95,0x95,0x95,0x92,0x92,0x92,0x91,0x91,0x92,0x92,0x8D,0x88, + 0x85,0x81,0x7F,0x7C,0x7B,0x77,0x74,0x73,0x71,0x6C,0x69,0x68,0x63,0x62,0x62,0x61, + 0x5F,0x5E,0x5C,0x5B,0x59,0x5B,0x5C,0x5E,0x5F,0x60,0x61,0x60,0x61,0x60,0x63,0x63, + 0x64,0x67,0x69,0x6D,0x6F,0x72,0x76,0x7B,0x7E,0x86,0x8E,0x93,0x9A,0x9F,0xA2,0xA5, + 0xA4,0xA3,0xA5,0xA1,0xA0,0x9E,0x9A,0x97,0x94,0x92,0x8E,0x8C,0x88,0x87,0x84,0x84, + 0x83,0x81,0x80,0x7C,0x7B,0x7B,0x7B,0x7A,0x7B,0x7B,0x7A,0x7B,0x7C,0x7C,0x7C,0x7E, + 0x7F,0x7F,0x7F,0x81,0x81,0x82,0x85,0x86,0x87,0x8A,0x8C,0x8D,0x8E,0x92,0x91,0x90, + 0x93,0x92,0x93,0x96,0x96,0x95,0x98,0x96,0x93,0x91,0x91,0x8F,0x8E,0x8D,0x8B,0x88, + 0x85,0x81,0x7E,0x7A,0x78,0x75,0x72,0x72,0x6E,0x6B,0x69,0x67,0x65,0x64,0x63,0x62, + 0x5F,0x5E,0x60,0x5D,0x5D,0x5D,0x5C,0x5D,0x5E,0x5C,0x5E,0x60,0x60,0x60,0x62,0x63, + 0x66,0x69,0x6B,0x6F,0x72,0x76,0x7A,0x7F,0x83,0x8B,0x91,0x96,0x9B,0x9E,0xA2,0xA2, + 0xA3,0xA3,0xA2,0xA0,0x9E,0x9B,0x97,0x94,0x90,0x8D,0x8B,0x87,0x84,0x82,0x81,0x7F, + 0x7D,0x7C,0x7D,0x7B,0x79,0x7A,0x79,0x78,0x78,0x78,0x78,0x79,0x7A,0x7D,0x7C,0x7E, + 0x80,0x81,0x83,0x83,0x84,0x86,0x89,0x8A,0x8C,0x8C,0x8F,0x8E,0x8D,0x8F,0x8F,0x8E, + 0x90,0x91,0x90,0x90,0x8F,0x8E,0x8E,0x8D,0x8B,0x8B,0x89,0x88,0x86,0x85,0x82,0x7F, + 0x7F,0x7D,0x7A,0x79,0x7B,0x77,0x77,0x74,0x72,0x73,0x6E,0x6D,0x6C,0x6B,0x6A,0x69, + 0x68,0x6A,0x6A,0x69,0x6B,0x6C,0x6C,0x6B,0x6D,0x6E,0x6E,0x6E,0x71,0x73,0x72,0x76, + 0x79,0x79,0x7D,0x7E,0x7F,0x84,0x84,0x86,0x8A,0x8B,0x8E,0x8E,0x8F,0x91,0x8F,0x8F, + 0x91,0x8F,0x8D,0x8C,0x8B,0x8A,0x89,0x86,0x85,0x85,0x82,0x80,0x80,0x81,0x7F,0x7E, + 0x7F,0x7D,0x7A,0x79,0x7B,0x79,0x79,0x7A,0x78,0x79,0x79,0x79,0x7A,0x7B,0x7B,0x7C, + 0x7C,0x80,0x7E,0x7E,0x82,0x81,0x82,0x83,0x85,0x86,0x87,0x86,0x88,0x88,0x88,0x88, + 0x87,0x88,0x88,0x8A,0x88,0x89,0x87,0x88,0x89,0x88,0x88,0x88,0x87,0x88,0x86,0x83, + 0x86,0x83,0x83,0x83,0x83,0x84,0x82,0x82,0x81,0x81,0x7F,0x80,0x7E,0x7F,0x7F,0x7D, + 0x7E,0x7D,0x7B,0x7B,0x7C,0x7A,0x7C,0x7B,0x7A,0x7B,0x7A,0x7C,0x7C,0x7D,0x7D,0x80, + 0x80,0x82,0x83,0x83,0x86,0x85,0x87,0x89,0x88,0x89,0x8B,0x89,0x8A,0x88,0x88,0x88, + 0x88,0x88,0x87,0x85,0x84,0x84,0x81,0x7F,0x7F,0x7F,0x7E,0x7D,0x7B,0x7B,0x79,0x78, + 0x7A,0x78,0x78,0x78,0x79,0x78,0x79,0x78,0x79,0x7A,0x7A,0x7B,0x7A,0x7B,0x7C,0x7B, + 0x7D,0x7E,0x7D,0x7F,0x80,0x80,0x81,0x80,0x81,0x80,0x81,0x82,0x82,0x82,0x82,0x84, + 0x82,0x83,0x82,0x83,0x84,0x83,0x84,0x83,0x82,0x83,0x84,0x81,0x83,0x83,0x82,0x81, + 0x82,0x82,0x81,0x81,0x80,0x81,0x80,0x81,0x7F,0x80,0x80,0x7E,0x7E,0x7E,0x7D,0x7D, + 0x7F,0x7E,0x7C,0x7C,0x7E,0x7D,0x7E,0x7C,0x7E,0x7F,0x7E,0x7E,0x7E,0x80,0x80,0x81, + 0x81,0x82,0x82,0x83,0x84,0x84,0x85,0x84,0x85,0x86,0x85,0x85,0x86,0x85,0x84,0x84, + 0x83,0x83,0x83,0x83,0x82,0x82,0x82,0x80,0x7F,0x81,0x80,0x7F,0x7F,0x7E,0x7E,0x7D, + 0x7D,0x7D,0x7E,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7E,0x7D,0x7C,0x7D,0x7E,0x7E,0x7F, + 0x7E,0x7E,0x80,0x7E,0x7E,0x80,0x80,0x80,0x81,0x81,0x81,0x81,0x82,0x82,0x82,0x83, + 0x83,0x84,0x83,0x83,0x83,0x83,0x83,0x81,0x83,0x83,0x82,0x82,0x82,0x81,0x81,0x7F, + 0x80,0x80,0x80,0x7F,0x7E,0x7F,0x7F,0x7F,0x7F,0x80,0x7E,0x7E,0x7F,0x7E,0x7E,0x7F, + 0x7F,0x7F,0x7F,0x7E,0x7F,0x80,0x80,0x80,0x80,0x80,0x80,0x7E,0x7F,0x80,0x80,0x80, + 0x7F,0x7F,0x7F,0x80,0x81,0x82,0x81,0x82,0x82,0x81,0x81,0x82,0x82,0x82,0x83,0x81, + 0x81,0x81,0x81,0x80,0x81,0x82,0x80,0x80,0x80,0x80,0x7F,0x7F,0x7E,0x7C,0x7D,0x7C, + 0x7C,0x7C,0x7C,0x7C,0x7D,0x7C,0x7C,0x7D,0x7C,0x7C,0x7C,0x7D,0x7D,0x7D,0x7E,0x7E, + 0x7E,0x7F,0x7E,0x7F,0x80,0x80,0x81,0x81,0x81,0x80,0x7F,0x80,0x80,0x80,0x80,0x80, + 0x80,0x80,0x7F,0x7F,0x80,0x81,0x80,0x81,0x81,0x80,0x81,0x81,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0x7F,0x81,0x81,0x7F,0x80,0x80,0x7F,0x7E,0x7E,0x7D, + 0x7D,0x7E,0x7D,0x7E,0x7F,0x7E,0x7E,0x80,0x80,0x7F,0x80,0x80,0x80,0x81,0x81,0x81, + 0x80,0x82,0x82,0x82,0x84,0x83,0x83,0x83,0x82,0x80,0x80,0x81,0x80,0x80,0x81,0x80, + 0x80,0x81,0x80,0x7F,0x80,0x7F,0x7F,0x80,0x7F,0x7F,0x80,0x80,0x80,0x81,0x80,0x7F, + 0x80,0x7F,0x7F,0x80,0x80,0x7F,0x7F,0x80,0x7F,0x7E,0x80,0x7F,0x7F,0x7F,0x7D,0x7C, + 0x7D,0x7D,0x7D,0x7E,0x7F,0x7E,0x7F,0x80,0x80,0x7F,0x81,0x82,0x80,0x81,0x81,0x82, + 0x81,0x83,0x82,0x84,0x97,0x82,0x86,0x84,0x64,0x7F,0x80,0x68,0x67,0x77,0x7E,0x86, + 0x8C,0x8B,0x8A,0x86,0x95,0xA0,0x9C,0x98,0x95,0x91,0x8D,0x89,0x87,0x82,0x75,0x6B, + 0x63,0x5D,0x5C,0x5B,0x58,0x5A,0x61,0x65,0x6A,0x6F,0x72,0x78,0x7A,0x7D,0x83,0x85, + 0x86,0x8B,0x8E,0x90,0x95,0xA0,0xA9,0xB1,0xB7,0xB5,0xB5,0xB2,0xA9,0xA2,0x9D,0x98, + 0x92,0x8C,0x89,0x84,0x7F,0x7D,0x7A,0x77,0x74,0x71,0x6E,0x6B,0x69,0x68,0x66,0x60, + 0x58,0x51,0x49,0x46,0x49,0x4B,0x4C,0x54,0x5B,0x61,0x6A,0x6F,0x73,0x76,0x7C,0x81, + 0x85,0x8A,0x8C,0x8F,0x91,0x94,0x96,0x98,0xA2,0xAB,0xB1,0xB6,0xB4,0xB4,0xB1,0xAF, + 0xAD,0xAB,0xA4,0x9C,0x9A,0x91,0x8B,0x8A,0x86,0x83,0x7F,0x7C,0x78,0x72,0x68,0x60, + 0x5A,0x58,0x52,0x4F,0x51,0x4C,0x4F,0x54,0x57,0x61,0x64,0x69,0x6E,0x76,0x7F,0x84, + 0x8A,0x8B,0x92,0x94,0x94,0x9A,0x99,0x9F,0x9F,0xA1,0x9E,0x93,0x9D,0xA3,0xAB,0xB0, + 0xAA,0xA2,0x97,0x94,0x8D,0x85,0x7E,0x77,0x7C,0x77,0x77,0x7B,0x71,0x70,0x73,0x73, + 0x70,0x70,0x6E,0x6C,0x69,0x66,0x65,0x61,0x61,0x60,0x5A,0x5A,0x58,0x5B,0x5C,0x5B, + 0x63,0x63,0x65,0x6A,0x6D,0x73,0x75,0x78,0x7B,0x7D,0x82,0x88,0x8D,0x92,0x96,0x9D, + 0xA5,0xAD,0xB4,0xB8,0xBB,0xBD,0xC0,0xC3,0xC1,0xBF,0xBB,0xB8,0xB4,0xAB,0xA5,0x9C, + 0x96,0x92,0x89,0x83,0x7D,0x78,0x74,0x6C,0x65,0x5F,0x60,0x5F,0x57,0x51,0x4F,0x52, + 0x4F,0x4B,0x4A,0x4B,0x4A,0x48,0x4B,0x52,0x53,0x57,0x5B,0x62,0x6B,0x6B,0x6D,0x73, + 0x76,0x78,0x7A,0x7E,0x86,0x8C,0x8A,0x8A,0x92,0x99,0x9E,0xA2,0xA2,0xAC,0xB8,0xB8, + 0xB7,0xB5,0xB4,0xBB,0xBD,0xB8,0xB8,0xB8,0xB9,0xBB,0xB8,0xB1,0xB0,0xB0,0xA9,0xA1, + 0x97,0x92,0x8B,0x7E,0x76,0x6E,0x67,0x5F,0x59,0x60,0x61,0x59,0x55,0x4D,0x4B,0x49, + 0x38,0x35,0x3C,0x3A,0x3C,0x3E,0x3F,0x46,0x49,0x45,0x49,0x4B,0x4C,0x52,0x58,0x5F, + 0x67,0x6D,0x72,0x82,0x8C,0x8E,0x94,0x98,0x9B,0x9D,0x98,0x9B,0xA6,0xAA,0xA9,0xAD, + 0xB2,0xB8,0xB6,0xB1,0xB2,0xB1,0xAE,0xAD,0xAE,0xB2,0xAE,0xA8,0x9F,0xA7,0xB2,0xA4, + 0x9F,0x9F,0x96,0x90,0x7F,0x7A,0x85,0x7B,0x6F,0x75,0x77,0x76,0x70,0x62,0x66,0x63, + 0x51,0x52,0x58,0x5A,0x5B,0x56,0x58,0x5D,0x6A,0x6B,0x66,0x6E,0x6E,0x67,0x63,0x61, + 0x67,0x6A,0x69,0x70,0x7A,0x79,0x78,0x7A,0x7A,0x79,0x76,0x76,0x7B,0x7D,0x7F,0x81, + 0x84,0x80,0x86,0x99,0x92,0x91,0x9C,0x97,0x92,0x8C,0x8B,0x95,0x92,0x8C,0x96,0x9A, + 0x98,0x9B,0x99,0x99,0x97,0x91,0x98,0x99,0x94,0x95,0x90,0x8D,0x8A,0x96,0x9E,0x93, + 0x96,0x9B,0x8F,0x85,0x80,0x81,0x82,0x77,0x79,0x82,0x7B,0x75,0x74,0x6D,0x69,0x64, + 0x61,0x65,0x60,0x60,0x5F,0x5A,0x55,0x5A,0x6E,0x67,0x63,0x73,0x6D,0x65,0x62,0x63, + 0x6A,0x65,0x65,0x77,0x7A,0x75,0x7C,0x7E,0x7D,0x7B,0x7C,0x86,0x86,0x84,0x8B,0x86, + 0x83,0x81,0x92,0x9B,0x8A,0x93,0x9C,0x8E,0x89,0x8A,0x8C,0x8A,0x86,0x92,0x9E,0x99, + 0x99,0xA0,0x9D,0x97,0x94,0x96,0x97,0x91,0x93,0x93,0x8B,0x83,0x89,0x9B,0x8E,0x8A, + 0x9B,0x91,0x85,0x83,0x82,0x84,0x7A,0x7A,0x89,0x88,0x82,0x87,0x86,0x7F,0x78,0x76, + 0x7B,0x74,0x72,0x77,0x6D,0x66,0x63,0x72,0x76,0x63,0x6E,0x74,0x63,0x5E,0x60,0x60, + 0x5E,0x59,0x61,0x69,0x62,0x66,0x6C,0x68,0x66,0x66,0x6C,0x6E,0x6D,0x77,0x7A,0x76, + 0x76,0x83,0x99,0x8E,0x8E,0xA2,0x98,0x8E,0x91,0x93,0x91,0x8B,0x8F,0x9C,0x96,0x92, + 0x9B,0x99,0x92,0x8F,0x91,0x92,0x89,0x8A,0x8E,0x86,0x82,0x81,0x91,0x97,0x85,0x92, + 0x9A,0x88,0x86,0x8A,0x8A,0x87,0x82,0x8D,0x94,0x89,0x8F,0x97,0x8F,0x8B,0x8C,0x8D, + 0x88,0x82,0x88,0x84,0x7B,0x78,0x7C,0x8D,0x83,0x7A,0x8C,0x7F,0x6E,0x6F,0x6C,0x69, + 0x63,0x62,0x6F,0x6A,0x63,0x6F,0x6C,0x65,0x66,0x68,0x69,0x63,0x66,0x6E,0x63,0x5E, + 0x5E,0x68,0x75,0x66,0x70,0x7E,0x69,0x65,0x6A,0x68,0x67,0x63,0x6E,0x78,0x70,0x77, + 0x81,0x7A,0x79,0x7B,0x7D,0x7C,0x78,0x82,0x83,0x7A,0x7B,0x7C,0x8D,0x92,0x85,0x9A, + 0x9B,0x89,0x8C,0x8C,0x8B,0x89,0x87,0x96,0x98,0x93,0x9F,0xA1,0x99,0x99,0x99,0x9A, + 0x95,0x95,0x9D,0x96,0x90,0x90,0x92,0xA5,0x9D,0x97,0xAC,0x9F,0x92,0x94,0x90,0x8F, + 0x85,0x88,0x96,0x8E,0x8C,0x97,0x92,0x8B,0x8A,0x89,0x87,0x80,0x83,0x86,0x7C,0x7A, + 0x76,0x80,0x90,0x7D,0x84,0x8F,0x7B,0x77,0x76,0x74,0x71,0x65,0x72,0x78,0x6B,0x72, + 0x76,0x6E,0x69,0x66,0x67,0x61,0x5B,0x63,0x61,0x5A,0x5A,0x57,0x6B,0x6F,0x5E,0x73, + 0x75,0x63,0x64,0x64,0x67,0x5F,0x5C,0x70,0x6E,0x68,0x76,0x77,0x72,0x6F,0x70,0x75, + 0x6D,0x6F,0x78,0x73,0x71,0x6E,0x75,0x8C,0x7D,0x7C,0x92,0x85,0x7C,0x7B,0x7E,0x82, + 0x75,0x7D,0x8F,0x86,0x88,0x93,0x93,0x91,0x8C,0x92,0x94,0x8B,0x91,0x97,0x91,0x90, + 0x8B,0x9E,0xAB,0x95,0xA4,0xB0,0x9E,0x97,0x95,0x9B,0x98,0x8C,0x9C,0xA4,0x98,0x9E, + 0xA5,0xA5,0x9D,0x96,0x9F,0x99,0x8F,0x96,0x95,0x91,0x8B,0x88,0xA5,0x9E,0x8D,0xA5, + 0xA0,0x90,0x8B,0x89,0x92,0x82,0x7B,0x90,0x8D,0x84,0x88,0x8C,0x8E,0x81,0x7C,0x83, + 0x78,0x71,0x74,0x71,0x6E,0x62,0x68,0x81,0x6D,0x6A,0x7B,0x71,0x68,0x5D,0x63,0x6A, + 0x54,0x56,0x67,0x62,0x5F,0x61,0x69,0x6B,0x5E,0x60,0x64,0x5C,0x58,0x59,0x5D,0x5C, + 0x4E,0x5F,0x73,0x60,0x65,0x71,0x6D,0x68,0x5A,0x66,0x6B,0x58,0x5F,0x68,0x69,0x6D, + 0x6A,0x75,0x7E,0x74,0x77,0x7B,0x7A,0x76,0x74,0x7C,0x80,0x76,0x7F,0x94,0x8B,0x8C, + 0x95,0x93,0x99,0x89,0x8C,0x97,0x8A,0x8C,0x8F,0x90,0x98,0x93,0x97,0xA0,0x9D,0x9E, + 0x9C,0x9C,0x9D,0x98,0x9C,0x9E,0x9D,0x9D,0xA4,0xA4,0x9F,0xA4,0xA3,0xA4,0xA3,0x9D, + 0xA1,0x9F,0x9B,0x9D,0x9A,0x9B,0x9C,0x99,0x9C,0x9B,0x9A,0x9B,0x97,0x96,0x95,0x93, + 0x92,0x90,0x8E,0x8F,0x93,0x8D,0x8A,0x8D,0x8A,0x8A,0x85,0x82,0x85,0x80,0x7D,0x7D, + 0x7A,0x7B,0x79,0x77,0x79,0x76,0x75,0x74,0x72,0x73,0x6F,0x6E,0x6D,0x6C,0x6C,0x6B, + 0x74,0x6D,0x6A,0x70,0x6D,0x70,0x6A,0x67,0x6E,0x67,0x64,0x67,0x65,0x6A,0x65,0x62, + 0x69,0x64,0x62,0x63,0x64,0x64,0x5E,0x5E,0x5E,0x5C,0x58,0x60,0x6C,0x5F,0x63,0x6C, + 0x69,0x6B,0x62,0x68,0x6D,0x61,0x65,0x6B,0x6D,0x70,0x6C,0x76,0x7B,0x75,0x7B,0x7F, + 0x7F,0x7C,0x7B,0x7E,0x7D,0x77,0x78,0x90,0x8B,0x82,0x96,0x94,0x94,0x8B,0x8A,0x97, + 0x86,0x83,0x8E,0x8D,0x8F,0x8C,0x94,0x9F,0x94,0x99,0xA0,0x9A,0x96,0x92,0x95,0x92, + 0x8A,0x85,0x9D,0xA3,0x90,0xA4,0xA8,0xA0,0x98,0x91,0x9F,0x8F,0x82,0x92,0x8F,0x8D, + 0x8E,0x93,0x9F,0x94,0x94,0x9E,0x93,0x8D,0x8B,0x8C,0x86,0x7F,0x79,0x89,0x96,0x80, + 0x90,0x9A,0x8E,0x8A,0x81,0x8C,0x81,0x6F,0x81,0x7E,0x78,0x7E,0x81,0x8D,0x84,0x83, + 0x90,0x83,0x7D,0x7E,0x7C,0x78,0x73,0x6E,0x75,0x8B,0x76,0x7E,0x90,0x80,0x7E,0x74, + 0x7A,0x74,0x60,0x70,0x6F,0x65,0x6E,0x70,0x79,0x75,0x72,0x82,0x74,0x6E,0x73,0x6D, + 0x6C,0x6B,0x67,0x69,0x83,0x78,0x76,0x8D,0x81,0x80,0x7A,0x7C,0x7D,0x66,0x74,0x79, + 0x6B,0x76,0x7A,0x80,0x80,0x7B,0x89,0x7F,0x76,0x7C,0x74,0x72,0x72,0x71,0x6A,0x83, + 0x84,0x74,0x90,0x88,0x81,0x7F,0x7B,0x82,0x6B,0x6F,0x7E,0x6F,0x75,0x7E,0x81,0x84, + 0x7F,0x8B,0x87,0x7A,0x81,0x7B,0x78,0x79,0x7A,0x70,0x84,0x91,0x7A,0x90,0x94,0x85, + 0x86,0x81,0x86,0x75,0x71,0x83,0x77,0x76,0x84,0x85,0x87,0x84,0x8D,0x8B,0x7B,0x84, + 0x7F,0x79,0x7C,0x7E,0x74,0x7E,0x97,0x7F,0x8B,0x9C,0x8A,0x89,0x85,0x89,0x7E,0x72, + 0x85,0x80,0x78,0x88,0x8A,0x8B,0x8A,0x8E,0x92,0x81,0x86,0x85,0x7B,0x7E,0x80,0x79, + 0x75,0x94,0x89,0x80,0x9C,0x8F,0x85,0x85,0x84,0x80,0x70,0x7D,0x82,0x73,0x81,0x8A, + 0x85,0x85,0x88,0x8D,0x7D,0x7E,0x85,0x78,0x7A,0x7E,0x7C,0x70,0x87,0x93,0x78,0x91, + 0x96,0x82,0x83,0x83,0x82,0x73,0x75,0x84,0x76,0x78,0x8B,0x86,0x83,0x88,0x8C,0x81, + 0x79,0x84,0x7B,0x76,0x7C,0x7F,0x74,0x76,0x96,0x81,0x7F,0x9C,0x88,0x80,0x84,0x82, + 0x7B,0x70,0x7F,0x80,0x73,0x84,0x8B,0x82,0x86,0x8C,0x88,0x7B,0x80,0x81,0x75,0x7B, + 0x7E,0x7C,0x71,0x84,0x94,0x76,0x8C,0x98,0x7D,0x82,0x84,0x7D,0x73,0x73,0x82,0x77, + 0x75,0x8A,0x86,0x7E,0x88,0x89,0x7E,0x7B,0x80,0x79,0x74,0x7B,0x7C,0x77,0x72,0x8D, + 0x88,0x74,0x92,0x8B,0x76,0x80,0x7F,0x76,0x6F,0x77,0x7F,0x73,0x7C,0x8B,0x7F,0x80, + 0x89,0x82,0x7B,0x7C,0x80,0x76,0x77,0x7F,0x7D,0x79,0x7A,0x95,0x84,0x7B,0x9A,0x84, + 0x77,0x85,0x7C,0x76,0x73,0x7C,0x80,0x77,0x84,0x8A,0x81,0x85,0x86,0x81,0x7A,0x7B, + 0x7E,0x75,0x7B,0x7E,0x7F,0x7D,0x7B,0x96,0x82,0x7C,0x98,0x7F,0x77,0x81,0x7A,0x78, + 0x73,0x7C,0x84,0x79,0x81,0x8B,0x7F,0x7F,0x84,0x7D,0x78,0x7B,0x7E,0x77,0x7A,0x80, + 0x7E,0x81,0x79,0x88,0x90,0x77,0x88,0x8D,0x76,0x7C,0x7D,0x7A,0x79,0x7A,0x85,0x7F, + 0x7F,0x8B,0x82,0x80,0x84,0x80,0x7F,0x7E,0x81,0x7F,0x7D,0x82,0x80,0x81,0x88,0x7F, + 0x7F,0x91,0x83,0x7F,0x8B,0x7F,0x7B,0x7D,0x7D,0x7A,0x7A,0x82,0x81,0x80,0x84,0x83, + 0x7F,0x7F,0x81,0x7D,0x7E,0x82,0x82,0x80,0x81,0x85,0x80,0x81,0x87,0x7C,0x85,0x8B, + 0x7C,0x89,0x86,0x7C,0x81,0x7C,0x7C,0x7B,0x7C,0x80,0x7D,0x7F,0x81,0x7F,0x81,0x7F, + 0x7F,0x80,0x80,0x80,0x80,0x7F,0x7F,0x80,0x7E,0x83,0x81,0x77,0x84,0x87,0x80,0x89, + 0x88,0x81,0x7D,0x7E,0x7A,0x76,0x7E,0x7F,0x7D,0x82,0x83,0x81,0x80,0x84,0x85,0x81, + 0x85,0x84,0x80,0x81,0x82,0x81,0x80,0x83,0x81,0x7E,0x82,0x82,0x82,0x83,0x83,0x80, + 0x7C,0x7B,0x77,0x79,0x7D,0x7E,0x83,0x82,0x80,0x81,0x80,0x82,0x85,0x86,0x85,0x84, + 0x88,0x86,0x83,0x83,0x82,0x7F,0x7C,0x81,0x80,0x7E,0x80,0x7D,0x78,0x75,0x83,0x85, + 0x7D,0x8B,0x8A,0x7E,0x7B,0x7C,0x78,0x74,0x7C,0x81,0x7B,0x7D,0x81,0x7D,0x7E,0x85, + 0x85,0x84,0x86,0x85,0x82,0x7F,0x83,0x7F,0x7B,0x85,0x84,0x81,0x88,0x8C,0x87,0x7E, + 0x7E,0x79,0x70,0x74,0x7A,0x7B,0x7E,0x81,0x82,0x7E,0x7E,0x81,0x82,0x82,0x84,0x84, + 0x7F,0x7E,0x80,0x82,0x82,0x86,0x89,0x83,0x81,0x81,0x7B,0x7B,0x7D,0x7D,0x7D,0x7C, + 0x82,0x82,0x7D,0x7F,0x87,0x8A,0x85,0x89,0x8C,0x83,0x7E,0x7A,0x78,0x77,0x79,0x7F, + 0x7F,0x7F,0x82,0x81,0x80,0x80,0x81,0x82,0x81,0x78,0x78,0x80,0x77,0x7D,0x87,0x86, + 0x85,0x82,0x80,0x79,0x74,0x75,0x78,0x7B,0x7D,0x81,0x82,0x7F,0x7F,0x80,0x81,0x83, + 0x85,0x82,0x81,0x7F,0x80,0x80,0x7F,0x89,0x86,0x83,0x87,0x7E,0x7A,0x78,0x77,0x78, + 0x7B,0x7D,0x7D,0x7C,0x7E,0x80,0x83,0x96,0x85,0x6F,0x84,0x95,0x82,0x66,0x87,0x7D, + 0x64,0x80,0x85,0x82,0x7F,0x92,0x8A,0x77,0x89,0x85,0x7F,0x7D,0x90,0x92,0x7D,0x7B, + 0x7B,0x7F,0x7B,0x75,0x76,0x79,0x6D,0x71,0x7E,0x7C,0x85,0x93,0x8F,0x8B,0x8D,0x83, + 0x87,0x85,0x87,0x8D,0x8A,0x85,0x84,0x8D,0x79,0x76,0x8F,0x77,0x61,0x73,0x73,0x74, + 0x69,0x67,0x82,0x71,0x6D,0x7C,0x75,0x78,0x76,0x7D,0x7C,0x6B,0x71,0x82,0x80,0x73, + 0x6C,0x7B,0x84,0x7D,0x80,0x75,0x7D,0x92,0x8B,0x93,0x8E,0x8C,0x96,0x8A,0x8E,0x8D, + 0x82,0x8E,0xA0,0xA1,0x96,0x9D,0xA0,0x97,0x97,0x96,0x90,0x83,0x88,0x93,0x8A,0x9B, + 0xAE,0x92,0x85,0x8A,0x7D,0x6A,0x65,0x72,0x77,0x74,0x77,0x71,0x70,0x73,0x78,0x79, + 0x6F,0x6D,0x6B,0x6F,0x6B,0x73,0x74,0x71,0x7C,0x7D,0x7E,0x6F,0x72,0x8C,0x7F,0x70, + 0x75,0x6F,0x64,0x65,0x71,0x6C,0x63,0x6D,0x7B,0x77,0x69,0x6E,0x71,0x6D,0x6B,0x70, + 0x79,0x79,0x83,0x91,0x9C,0xA7,0x9C,0x8E,0xA2,0xAE,0x98,0x96,0xA1,0x8C,0x81,0x7F, + 0x79,0x7F,0x7F,0x85,0x88,0x8A,0x8D,0x84,0x80,0x7D,0x75,0x74,0x7F,0x82,0x80,0x82, + 0x81,0x81,0x7D,0x76,0x84,0x9A,0x8C,0x86,0x90,0x7C,0x71,0x76,0x70,0x6F,0x73,0x7B, + 0x89,0x89,0x84,0x83,0x82,0x78,0x75,0x76,0x80,0x89,0x86,0x88,0x8B,0x8B,0x7E,0x8D, + 0xA1,0x97,0x95,0x9A,0x90,0x85,0x85,0x88,0x8E,0x86,0x8A,0x96,0x94,0x88,0x82,0x7D, + 0x73,0x6F,0x6E,0x79,0x7B,0x6F,0x74,0x6B,0x61,0x61,0x5B,0x71,0x72,0x65,0x74,0x76, + 0x6B,0x67,0x6A,0x6A,0x6E,0x6A,0x76,0x81,0x74,0x73,0x78,0x76,0x6E,0x70,0x77,0x7F, + 0x7C,0x76,0x70,0x68,0x67,0x6B,0x7C,0x7F,0x78,0x85,0x81,0x6C,0x72,0x74,0x7B,0x8B, + 0x8D,0xA3,0xB1,0xAA,0xAA,0xAA,0x9D,0x94,0x9A,0x98,0x99,0x9C,0x94,0x91,0x8D,0x85, + 0x8C,0x9A,0x92,0x8A,0x97,0x8D,0x7B,0x77,0x7A,0x88,0x85,0x85,0x8D,0x91,0x89,0x84, + 0x88,0x7F,0x80,0x82,0x83,0x86,0x83,0x7F,0x7A,0x7F,0x7C,0x89,0x96,0x80,0x81,0x8C, + 0x7C,0x72,0x71,0x78,0x84,0x80,0x8C,0x9B,0x9C,0x99,0x94,0x90,0x90,0x8A,0x8B,0x98, + 0x97,0x95,0x8F,0x8F,0x8D,0x87,0x9A,0x9D,0x8B,0x91,0x94,0x81,0x6F,0x6E,0x73,0x70, + 0x6A,0x70,0x79,0x71,0x6E,0x6A,0x63,0x64,0x5C,0x63,0x69,0x6C,0x6E,0x5F,0x63,0x5D, + 0x61,0x78,0x74,0x70,0x7A,0x74,0x65,0x5D,0x5F,0x6E,0x72,0x6D,0x79,0x7F,0x70,0x6A, + 0x62,0x61,0x65,0x64,0x6F,0x77,0x75,0x6F,0x6C,0x6D,0x77,0x8E,0x9F,0x99,0xA6,0xAC, + 0x9C,0x94,0x8E,0x96,0x98,0x98,0xA2,0xA8,0xA0,0x99,0x8E,0x8B,0x89,0x84,0x88,0x91, + 0x90,0x84,0x7E,0x7B,0x7B,0x7F,0x9A,0x9C,0x8A,0x92,0x8F,0x7F,0x76,0x76,0x81,0x86, + 0x80,0x8A,0x8F,0x8A,0x84,0x7E,0x7E,0x7C,0x7B,0x7F,0x8B,0x8B,0x7B,0x73,0x78,0x79, + 0x88,0x9A,0x95,0x97,0x9E,0x8C,0x80,0x7F,0x8C,0x98,0x8C,0x94,0xA1,0x9A,0x93,0x8B, + 0x8D,0x8E,0x89,0x86,0x90,0x92,0x8A,0x7F,0x74,0x72,0x71,0x83,0x86,0x78,0x7A,0x77, + 0x62,0x56,0x59,0x65,0x65,0x5D,0x6B,0x74,0x6C,0x65,0x62,0x65,0x68,0x63,0x64,0x73, + 0x76,0x6F,0x66,0x5E,0x62,0x76,0x8C,0x81,0x77,0x84,0x7A,0x66,0x5C,0x5F,0x70,0x70, + 0x6A,0x79,0x7F,0x76,0x72,0x6F,0x72,0x7D,0x7E,0x8C,0x9A,0x9C,0x9E,0x94,0x91,0x95, + 0xA7,0xB5,0xAD,0xA9,0xAD,0x9B,0x8C,0x85,0x86,0x92,0x8D,0x88,0x93,0x93,0x87,0x82, + 0x7E,0x80,0x85,0x7E,0x86,0x8F,0x89,0x82,0x75,0x72,0x76,0x8A,0x94,0x88,0x8D,0x91, + 0x83,0x72,0x6D,0x77,0x80,0x7C,0x7E,0x89,0x87,0x85,0x82,0x76,0x81,0x86,0x82,0x8B, + 0x90,0x93,0x8A,0x83,0x88,0x85,0x9B,0xA7,0x99,0x9D,0x9D,0x90,0x86,0x7F,0x82,0x8E, + 0x83,0x83,0x94,0x8D,0x88,0x7A,0x6D,0x79,0x74,0x69,0x71,0x79,0x75,0x6A,0x61,0x60, + 0x63,0x70,0x7D,0x72,0x71,0x79,0x6C,0x5D,0x5A,0x5C,0x67,0x63,0x60,0x6F,0x72,0x71, + 0x6F,0x6A,0x6F,0x70,0x64,0x65,0x70,0x72,0x6C,0x60,0x60,0x62,0x6D,0x7C,0x72,0x73, + 0x7C,0x77,0x70,0x69,0x6F,0x83,0x82,0x81,0x92,0x9F,0xAB,0xA8,0x9E,0xA6,0xA3,0x98, + 0x96,0x9E,0xA0,0x9B,0x95,0x8C,0x85,0x8A,0x9C,0x95,0x89,0x93,0x8E,0x81,0x7A,0x73, + 0x80,0x7F,0x73,0x7A,0x83,0x86,0x84,0x81,0x7E,0x82,0x7B,0x73,0x78,0x7B,0x7F,0x7F, + 0x7B,0x7C,0x76,0x88,0x96,0x86,0x88,0x8C,0x85,0x85,0x7D,0x79,0x88,0x85,0x84,0x8B, + 0x8D,0x96,0x93,0x8F,0x96,0x92,0x8B,0x89,0x89,0x8A,0x8C,0x8D,0x89,0x8C,0x84,0x85, + 0x8E,0x80,0x83,0x82,0x78,0x7F,0x78,0x71,0x75,0x6E,0x6F,0x73,0x6D,0x6E,0x73,0x6D, + 0x6C,0x6C,0x67,0x6A,0x6A,0x69,0x6E,0x6F,0x6C,0x6C,0x6A,0x69,0x6D,0x6E,0x6F,0x70, + 0x6E,0x70,0x71,0x6D,0x6D,0x6E,0x6F,0x6F,0x6E,0x6B,0x6C,0x6D,0x6C,0x6E,0x71,0x75, + 0x7B,0x7E,0x85,0x8B,0x8E,0x95,0x9A,0x9E,0x9E,0xA2,0xAA,0xA9,0xA2,0xA4,0xA4,0xA0, + 0xA1,0x9A,0x97,0x9A,0x94,0x8D,0x89,0x85,0x86,0x82,0x7F,0x7F,0x7C,0x7F,0x7F,0x7A, + 0x7B,0x7E,0x7C,0x7C,0x7A,0x7B,0x7E,0x7B,0x7F,0x81,0x7B,0x7A,0x81,0x85,0x87,0x84, + 0x83,0x8B,0x87,0x83,0x86,0x85,0x89,0x8A,0x81,0x88,0x8D,0x8D,0x94,0x92,0x94,0x97, + 0x93,0x94,0x93,0x91,0x91,0x8E,0x91,0x99,0x94,0x90,0x8D,0x8C,0x8D,0x84,0x7E,0x83, + 0x80,0x7B,0x79,0x78,0x7C,0x7A,0x70,0x77,0x7C,0x74,0x76,0x72,0x74,0x77,0x6D,0x6E, + 0x74,0x71,0x6F,0x68,0x76,0x80,0x70,0x72,0x75,0x77,0x76,0x67,0x6B,0x76,0x69,0x65, + 0x6A,0x69,0x71,0x6A,0x66,0x73,0x73,0x6D,0x6B,0x6C,0x74,0x72,0x71,0x7D,0x80,0x80, + 0x79,0x8B,0xA7,0x9D,0x98,0xAA,0xB2,0xAA,0x97,0x98,0xA9,0x9B,0x8D,0x94,0x9C,0x9C, + 0x93,0x8A,0x98,0x96,0x82,0x7F,0x84,0x82,0x7B,0x79,0x7F,0x7D,0x77,0x6E,0x77,0x93, + 0x84,0x75,0x85,0x88,0x80,0x6F,0x6C,0x80,0x7A,0x6A,0x77,0x84,0x87,0x81,0x7D,0x8C, + 0x8E,0x7D,0x7D,0x88,0x8A,0x84,0x80,0x8F,0x96,0x89,0x81,0x8A,0xA6,0x9F,0x8B,0x9D, + 0xA2,0x9A,0x8A,0x80,0x92,0x91,0x77,0x7E,0x90,0x8D,0x83,0x7E,0x8B,0x8F,0x7B,0x74, + 0x82,0x7D,0x74,0x72,0x78,0x7F,0x73,0x6A,0x6A,0x80,0x84,0x6D,0x76,0x80,0x77,0x6D, + 0x62,0x6F,0x74,0x5F,0x5E,0x6F,0x74,0x6B,0x67,0x70,0x7A,0x6A,0x5E,0x6D,0x6D,0x5F, + 0x5F,0x67,0x6C,0x66,0x61,0x5F,0x68,0x82,0x72,0x6E,0x89,0x87,0x7F,0x7F,0x82,0x90, + 0x8E,0x85,0x97,0xA5,0xA2,0x9F,0x9F,0xAC,0xAB,0x95,0x9B,0xA4,0x91,0x8B,0x8F,0x8E, + 0x8A,0x7F,0x80,0x76,0x7E,0x92,0x7B,0x79,0x88,0x7C,0x74,0x6C,0x6B,0x73,0x66,0x61, + 0x71,0x76,0x6E,0x71,0x77,0x80,0x7E,0x73,0x7F,0x82,0x77,0x77,0x80,0x81,0x7E,0x7F, + 0x83,0x80,0x87,0xA0,0x8F,0x8C,0x9E,0x96,0x91,0x8B,0x88,0x8F,0x85,0x7B,0x88,0x8A, + 0x84,0x86,0x88,0x8C,0x8C,0x82,0x85,0x89,0x81,0x7C,0x7C,0x7C,0x7C,0x79,0x7B,0x79, + 0x6F,0x88,0x87,0x71,0x83,0x83,0x7C,0x78,0x6D,0x77,0x77,0x65,0x69,0x76,0x72,0x6D, + 0x6F,0x76,0x79,0x75,0x72,0x7B,0x7B,0x6E,0x70,0x72,0x6E,0x6C,0x6D,0x72,0x6C,0x69, + 0x81,0x7A,0x72,0x81,0x7E,0x80,0x7A,0x76,0x81,0x7B,0x71,0x79,0x80,0x80,0x81,0x84, + 0x8E,0x90,0x8A,0x8F,0x95,0x8D,0x87,0x88,0x8A,0x83,0x7F,0x84,0x86,0x7F,0x79,0x88, + 0x86,0x78,0x83,0x80,0x7C,0x7D,0x71,0x7A,0x7A,0x6C,0x71,0x74,0x73,0x74,0x73,0x78, + 0x79,0x77,0x79,0x7D,0x7D,0x7B,0x7C,0x7D,0x7D,0x7E,0x7F,0x80,0x82,0x82,0x83,0x87, + 0x86,0x7E,0x86,0x87,0x83,0x86,0x84,0x89,0x88,0x85,0x89,0x89,0x87,0x86,0x85,0x88, + 0x85,0x83,0x87,0x85,0x87,0x86,0x85,0x8A,0x87,0x86,0x89,0x87,0x85,0x87,0x84,0x83, + 0x85,0x82,0x80,0x81,0x83,0x80,0x80,0x81,0x80,0x80,0x7E,0x7E,0x7E,0x7C,0x7C,0x7C, + 0x7E,0x7E,0x7C,0x7F,0x7F,0x7E,0x7E,0x7B,0x7F,0x7E,0x7C,0x81,0x81,0x7E,0x81,0x80, + 0x82,0x83,0x82,0x83,0x86,0x84,0x83,0x84,0x84,0x85,0x84,0x86,0x86,0x87,0x86,0x86, + 0x84,0x84,0x84,0x82,0x82,0x81,0x82,0x82,0x82,0x80,0x80,0x80,0x7C,0x7E,0x7B,0x7A, + 0x7B,0x7B,0x7C,0x7B,0x7A,0x79,0x7A,0x7B,0x7A,0x78,0x7B,0x79,0x79,0x7A,0x7A,0x7B, + 0x7B,0x7D,0x7D,0x7E,0x7D,0x80,0x7F,0x7E,0x7F,0x80,0x81,0x81,0x82,0x80,0x82,0x82, + 0x84,0x83,0x83,0x85,0x84,0x84,0x85,0x84,0x84,0x85,0x84,0x84,0x85,0x84,0x84,0x86, + 0x87,0x87,0x85,0x85,0x87,0x85,0x84,0x84,0x84,0x85,0x84,0x82,0x84,0x84,0x83,0x85, + 0x85,0x83,0x82,0x84,0x82,0x81,0x82,0x80,0x82,0x82,0x81,0x81,0x80,0x81,0x82,0x82, + 0x81,0x80,0x81,0x81,0x7F,0x81,0x80,0x81,0x81,0x82,0x83,0x82,0x82,0x84,0x85,0x82, + 0x83,0x85,0x86,0x85,0x85,0x87,0x86,0x86,0x87,0x88,0x86,0x86,0x87,0x87,0x86,0x87, + 0x85,0x86,0x86,0x83,0x83,0x83,0x83,0x81,0x80,0x80,0x7E,0x7E,0x7F,0x7F,0x7E,0x7F, + 0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7E,0x7E,0x7E,0x7D,0x7D,0x80,0x7F,0x80,0x81,0x80, + 0x80,0x80,0x80,0x80,0x7F,0x80,0x81,0x80,0x81,0x84,0x82,0x83,0x84,0x82,0x82,0x83, + 0x81,0x81,0x82,0x81,0x81,0x81,0x80,0x82,0x81,0x81,0x83,0x82,0x82,0x82,0x81,0x83, + 0x82,0x80,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x80,0x81,0x80,0x7F,0x80,0x80,0x81, + 0x7F,0x7F,0x80,0x7F,0x7E,0x80,0x80,0x7E,0x80,0x7F,0x7D,0x7E,0x7E,0x7C,0x7D,0x7E, + 0x7E,0x7F,0x7F,0x7F,0x80,0x7F,0x7F,0x80,0x7F,0x80,0x7F,0x7F,0x7F,0x7F,0x80,0x7F, + 0x81,0x81,0x80,0x81,0x81,0x80,0x80,0x7F,0x80,0x80,0x7F,0x80,0x7F,0x80,0x80,0x7F, + 0x7E,0x7F,0x7F,0x7C,0x7E,0x7E,0x7D,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7E,0x7D,0x7C, + 0x7B,0x7C,0x7C,0x7C,0x7C,0x7D,0x7D,0x7C,0x7C,0x7D,0x7C,0x7B,0x7C,0x7C,0x7E,0x7D, + 0x7E,0x7D,0x7D,0x7E,0x7D,0x80,0x7E,0x7F,0x80,0x80,0x7F,0x7F,0x7F,0x7D,0x7E,0x7F, + 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x7F,0x7F,0x7E,0x80,0x7F,0x7F,0x7F,0x7F,0x7F, + 0x7E,0x80,0x7E,0x7F,0x7F,0x7E,0x7D,0x7F,0x80,0x7E,0x80,0x80,0x81,0x7F,0x7F,0x7F, + 0x7E,0x7F,0x7D,0x7F,0x7F,0x7E,0x7F,0x7F,0x7E,0x7E,0x7E,0x7F,0x7E,0x7F,0x7F,0x7D, + 0x7F,0x7E,0x7D,0x7F,0x7F,0x7F,0x81,0x80,0x80,0x81,0x80,0x7F,0x80,0x7F,0x7F,0x7F, + 0x82,0x80,0x7E,0x81,0x80,0x81,0x81,0x80,0x81,0x81,0x81,0x81,0x7F,0x81,0x80,0x7F, + 0x81,0x7E,0x7F,0x7E,0x7D,0x80,0x7E,0x7E,0x7F,0x7E,0x7E,0x7F,0x7E,0x7F,0x7E,0x7D, + 0x7F,0x7E,0x7C,0x80,0x7D,0x7E,0x7F,0x7E,0x81,0x7E,0x81,0x7F,0x7E,0x82,0x80,0x7F, + 0x80,0x80,0x7F,0x81,0x81,0x82,0x7F,0x7F,0x80,0x80,0x80,0x80,0x81,0x83,0x81,0x7F, + 0x82,0x81,0x81,0x81,0x7D,0x81,0x80,0x81,0x82,0x80,0x83,0x82,0x80,0x82,0x80,0x81, + 0x80,0x7F,0x83,0x80,0x80,0x81,0x81,0x82,0x81,0x82,0x81,0x81,0x81,0x81,0x81,0x7D, + 0x80,0x81,0x80,0x81,0x7F,0x82,0x81,0x8C,0x84,0x81,0x85,0x67,0x78,0x80,0x6D,0x69, + 0x77,0x7E,0x85,0x8C,0x87,0x8C,0x86,0x91,0xA1,0x9D,0xA4,0xA3,0x93,0x8E,0x79,0x82, + 0x92,0x76,0x70,0x76,0x6F,0x58,0x5A,0x52,0x51,0x71,0x6A,0x65,0x55,0x5E,0x70,0x6B, + 0x73,0x77,0x81,0x83,0x94,0x95,0x93,0x9B,0xB0,0xAC,0x85,0xBE,0xAF,0x98,0xB6,0x9B, + 0xB0,0xB5,0xA0,0x94,0x8B,0x94,0x9A,0x7B,0x6E,0x79,0x66,0x75,0x6F,0x6B,0x7F,0x68, + 0x63,0x68,0x6F,0x7C,0x6C,0x50,0x4E,0x55,0x5A,0x60,0x64,0x5E,0x56,0x5A,0x6E,0x6F, + 0x78,0x88,0x89,0xA1,0xA9,0x9D,0x91,0x95,0x90,0x8D,0x9A,0xA3,0xB4,0xB1,0x9F,0xA8, + 0xA9,0xA4,0xAB,0x9E,0x9B,0x95,0x8B,0x80,0x77,0x7C,0x70,0x76,0x76,0x75,0x84,0x77, + 0x6E,0x65,0x55,0x5E,0x61,0x50,0x44,0x4F,0x4F,0x3B,0x3A,0x46,0x5D,0x5A,0x62,0x74, + 0x6F,0x7F,0x92,0x90,0x98,0x8A,0x81,0xA0,0x98,0x9A,0xA5,0x93,0xA1,0xB1,0xB6,0xC5, + 0xBA,0xB1,0xC4,0xBB,0xB4,0xC1,0xA7,0x9A,0xAB,0x9C,0x9A,0x99,0x85,0x7B,0x71,0x6B, + 0x70,0x75,0x69,0x63,0x57,0x55,0x5D,0x57,0x56,0x50,0x5A,0x5F,0x4A,0x4B,0x44,0x4E, + 0x5C,0x5B,0x67,0x69,0x71,0x85,0x83,0x8D,0x9A,0x8A,0x9A,0x9F,0x9E,0xB0,0xAE,0xB7, + 0xB5,0xB5,0xB6,0xAF,0xB4,0xA6,0x9E,0xAC,0xA4,0xA5,0xA3,0x99,0x9A,0x98,0x92,0x8F, + 0x83,0x76,0x68,0x63,0x59,0x5F,0x60,0x49,0x50,0x5B,0x5D,0x4F,0x2D,0x22,0x2C,0x39, + 0x43,0x44,0x3D,0x3F,0x47,0x47,0x44,0x4B,0x4F,0x5A,0x5F,0x5A,0x66,0x6F,0x82,0x82, + 0x85,0xAD,0xBE,0xBB,0xAC,0xA5,0xB7,0xBD,0xC1,0xCE,0xC7,0xC9,0xC6,0xAA,0x93,0x92, + 0xA1,0xA1,0xAD,0xB1,0xA0,0xA4,0xA4,0xA3,0xA4,0x9A,0x9E,0xA2,0xA0,0xA4,0x9C,0x91, + 0x82,0x75,0x7A,0x8B,0x86,0x70,0x62,0x60,0x5E,0x60,0x65,0x5F,0x56,0x52,0x63,0x58, + 0x4E,0x45,0x48,0x63,0x5C,0x67,0x6F,0x6B,0x6C,0x70,0x76,0x6C,0x65,0x78,0x88,0x8C, + 0x93,0x84,0x87,0x83,0x65,0x76,0x7D,0x7A,0x7D,0x83,0x97,0x91,0x85,0x8C,0x91,0x84, + 0x8A,0x90,0x8F,0x8B,0x84,0x8E,0xA3,0xA2,0x94,0xA4,0xA9,0x9A,0x8F,0x91,0x99,0x91, + 0x91,0x95,0x9C,0x98,0x8D,0x94,0x86,0x78,0x77,0x78,0x76,0x62,0x66,0x7B,0x78,0x71, + 0x78,0x79,0x73,0x6F,0x6C,0x75,0x6E,0x59,0x57,0x5B,0x5A,0x5B,0x66,0x5E,0x50,0x57, + 0x60,0x67,0x5B,0x51,0x6B,0x77,0x6E,0x71,0x79,0x7A,0x6C,0x74,0x82,0x86,0x91,0x8F, + 0x9C,0x9B,0x89,0x95,0x9E,0xA1,0xA6,0xA2,0xA0,0x94,0x8A,0x9D,0xA7,0xA7,0xAA,0xAD, + 0xAA,0xA7,0xA5,0xA4,0xAB,0x9D,0xA4,0xBF,0xB9,0xAD,0x9F,0xA2,0xAD,0xB2,0xAF,0x99, + 0x90,0x8D,0x9A,0xAA,0x92,0x8A,0x97,0x88,0x77,0x66,0x6A,0x6C,0x5A,0x52,0x51,0x54, + 0x49,0x3F,0x4C,0x5E,0x58,0x4B,0x51,0x48,0x44,0x4B,0x58,0x5F,0x52,0x59,0x58,0x4A, + 0x41,0x3E,0x4B,0x53,0x50,0x50,0x54,0x53,0x48,0x4E,0x62,0x68,0x6B,0x6E,0x78,0x8A, + 0x81,0x8F,0xA5,0x9E,0xA7,0xB2,0xAE,0xAB,0xA5,0xAE,0xB7,0xAE,0xA6,0xA0,0xA6,0x99, + 0x88,0x95,0x92,0x94,0xA3,0x91,0x8A,0x92,0x86,0x9D,0xBE,0xA2,0x90,0x98,0x8B,0x93, + 0xA3,0x95,0x97,0x96,0x8C,0x9D,0x99,0x8A,0x85,0x7A,0x88,0x8A,0x78,0x79,0x7D,0x77, + 0x7D,0x95,0x97,0x8E,0x8C,0x81,0x85,0x83,0x7E,0x8B,0x96,0x89,0x78,0x75,0x6D,0x68, + 0x83,0x9A,0x92,0x7F,0x69,0x70,0x78,0x6F,0x5F,0x59,0x62,0x5A,0x5B,0x5D,0x55,0x55, + 0x4E,0x51,0x63,0x5E,0x4C,0x4D,0x50,0x59,0x5C,0x61,0x6B,0x6E,0x68,0x69,0x71,0x6F, + 0x84,0x8E,0x7F,0x78,0x71,0x6C,0x6E,0x74,0x83,0x8F,0x7F,0x80,0x89,0x83,0x89,0x8F, + 0xA2,0xB9,0xB7,0xAE,0xAD,0xA9,0xAE,0xAB,0xB0,0xC5,0xB6,0x98,0x94,0xA1,0xAD,0xA5, + 0x9A,0xA1,0x9D,0x88,0x83,0x83,0x79,0x7D,0x83,0x88,0x87,0x77,0x6E,0x76,0x75,0x80, + 0x8B,0x81,0x83,0x88,0x80,0x76,0x6A,0x75,0x81,0x79,0x6A,0x5E,0x61,0x69,0x72,0x7C, + 0x80,0x7C,0x6F,0x72,0x76,0x80,0x80,0x6C,0x80,0x91,0x83,0x81,0x7F,0x80,0x85,0x85, + 0x92,0x99,0x80,0x6B,0x70,0x76,0x73,0x73,0x73,0x6C,0x69,0x65,0x68,0x61,0x65,0x80, + 0x7A,0x62,0x5B,0x59,0x59,0x6A,0x77,0x7B,0x81,0x76,0x6B,0x76,0x7F,0x7D,0x7E,0x81, + 0x8A,0x82,0x6A,0x67,0x6C,0x6B,0x74,0x89,0x8F,0x84,0x75,0x7D,0x8D,0x8F,0x94,0x9A, + 0xA6,0xA6,0x9E,0x9F,0xA1,0xAF,0xBB,0xBC,0xBE,0xB9,0xB1,0xB0,0xA4,0xA2,0xAE,0xA1, + 0x8F,0x8B,0x85,0x81,0x7F,0x83,0x91,0x94,0x87,0x7D,0x79,0x78,0x74,0x74,0x7D,0x81, + 0x6F,0x5B,0x63,0x6A,0x62,0x67,0x7A,0x82,0x74,0x69,0x60,0x65,0x6A,0x6E,0x7C,0x76, + 0x6C,0x66,0x67,0x76,0x7F,0x7F,0x86,0x87,0x87,0x89,0x80,0x76,0x81,0x90,0x86,0x7C, + 0x76,0x67,0x64,0x6C,0x79,0x7F,0x7C,0x6C,0x63,0x6D,0x6F,0x68,0x63,0x6D,0x6D,0x63, + 0x61,0x67,0x6A,0x6C,0x86,0x88,0x70,0x68,0x61,0x69,0x72,0x72,0x81,0x7D,0x70,0x73, + 0x77,0x7F,0x82,0x81,0x88,0x8B,0x82,0x77,0x78,0x74,0x7C,0x9E,0x9D,0x8C,0x8C,0x90, + 0x99,0x9C,0xA0,0xAB,0xB7,0xAF,0xAB,0xAA,0xA5,0xAD,0xAF,0xB3,0xB7,0xAE,0x9C,0x9A, + 0x9A,0x99,0xB1,0xAF,0xA1,0x9A,0x87,0x88,0x91,0x8C,0x94,0x9C,0x8F,0x7E,0x78,0x7B, + 0x7F,0x83,0x89,0x86,0x7E,0x77,0x79,0x6F,0x67,0x81,0x84,0x76,0x73,0x6D,0x6A,0x69, + 0x75,0x7E,0x80,0x86,0x76,0x6E,0x71,0x76,0x78,0x75,0x7D,0x74,0x62,0x69,0x68,0x69, + 0x7B,0x86,0x78,0x6E,0x69,0x5E,0x67,0x6F,0x75,0x79,0x6A,0x58,0x63,0x5E,0x44,0x56, + 0x69,0x6D,0x56,0x59,0x6C,0x45,0x43,0x64,0x72,0x68,0x63,0x62,0x4A,0x53,0x67,0x72, + 0x71,0x6F,0x73,0x66,0x5F,0x63,0x6D,0x79,0x7D,0x7D,0x7B,0x71,0x6B,0x74,0x84,0x97, + 0x94,0x92,0x93,0x90,0xA1,0xAC,0xB5,0xC1,0xC3,0xBC,0xAE,0xB5,0xBC,0xB4,0xBA,0xBE, + 0xBB,0xB1,0xA4,0xA1,0x9E,0xA5,0xB4,0xB3,0x9E,0x8A,0x8A,0x88,0x88,0x90,0x95,0x94, + 0x87,0x7F,0x7F,0x8A,0x98,0x8D,0x94,0xA2,0x96,0x89,0x8D,0x91,0x95,0xA4,0xA3,0x99, + 0x8F,0x8A,0x92,0x90,0x93,0xA0,0xA2,0x9A,0x91,0x87,0x84,0x89,0x8D,0x8E,0x8B,0x86, + 0x75,0x71,0x77,0x75,0x86,0x93,0x85,0x6D,0x67,0x66,0x64,0x63,0x65,0x72,0x6E,0x56, + 0x45,0x43,0x57,0x5D,0x59,0x5E,0x53,0x45,0x41,0x44,0x42,0x4B,0x63,0x62,0x4F,0x46, + 0x3E,0x41,0x4C,0x52,0x5D,0x5A,0x45,0x3B,0x44,0x56,0x5E,0x61,0x68,0x67,0x63,0x69, + 0x72,0x72,0x71,0x87,0x9C,0x97,0x88,0x81,0x8C,0x98,0x9D,0xA3,0xA8,0x9D,0x8D,0x91, + 0x95,0x99,0x99,0x95,0x9A,0x99,0x84,0x80,0x88,0x84,0x91,0xA3,0x9A,0x85,0x7C,0x7C, + 0x86,0x8B,0x8F,0x9D,0x9D,0x8B,0x87,0x8B,0x97,0x9E,0x9E,0xAA,0xA9,0x9B,0x8F,0x8E, + 0x92,0x9B,0xB4,0xBB,0xA6,0x9C,0x9A,0x9F,0xA9,0xA7,0xAD,0xB3,0xA2,0x92,0x8D,0x95, + 0x99,0x96,0x9C,0x99,0x90,0x85,0x83,0x89,0x87,0x98,0x9E,0x8A,0x81,0x78,0x75,0x7C, + 0x7A,0x7C,0x83,0x79,0x66,0x5E,0x64,0x6C,0x6C,0x6A,0x6A,0x61,0x55,0x54,0x56,0x51, + 0x5A,0x6F,0x6E,0x5F,0x58,0x57,0x5D,0x64,0x6A,0x72,0x71,0x68,0x5E,0x64,0x76,0x7D, + 0x81,0x89,0x8E,0x8B,0x85,0x8A,0x8A,0x94,0xAA,0xA8,0x9A,0x8A,0x7E,0x83,0x89,0x8D, + 0x95,0x8D,0x7B,0x71,0x70,0x77,0x7B,0x78,0x7A,0x78,0x6B,0x5E,0x62,0x61,0x68,0x7E, + 0x80,0x72,0x64,0x5A,0x62,0x70,0x79,0x82,0x85,0x7D,0x73,0x75,0x7D,0x84,0x85,0x8D, + 0x96,0x8C,0x7F,0x7D,0x80,0x8C,0xA2,0xA3,0x91,0x86,0x81,0x83,0x87,0x8A,0x93,0x96, + 0x8D,0x82,0x7E,0x81,0x82,0x81,0x8A,0x8E,0x7F,0x72,0x71,0x6B,0x74,0x8D,0x8A,0x7C, + 0x72,0x6B,0x6C,0x6D,0x70,0x7A,0x80,0x73,0x66,0x62,0x67,0x6F,0x71,0x75,0x73,0x66, + 0x5F,0x5C,0x5D,0x6F,0x81,0x7C,0x73,0x70,0x69,0x68,0x6E,0x7B,0x89,0x8D,0x84,0x7C, + 0x7C,0x85,0x93,0x9E,0xA9,0xA6,0x95,0x92,0x90,0x92,0xA7,0xB1,0xA8,0x9C,0x93,0x88, + 0x87,0x8C,0x96,0xA2,0x97,0x84,0x7C,0x77,0x7D,0x85,0x89,0x8F,0x80,0x71,0x6E,0x69, + 0x76,0x8D,0x8B,0x7E,0x7A,0x73,0x6E,0x6D,0x7A,0x8B,0x8C,0x84,0x79,0x77,0x78,0x7E, + 0x8C,0x95,0x95,0x88,0x7F,0x7E,0x81,0x96,0xA1,0x95,0x8E,0x8A,0x80,0x7D,0x83,0x92, + 0x9B,0x8F,0x85,0x7F,0x7B,0x80,0x84,0x89,0x8F,0x86,0x78,0x72,0x6D,0x7A,0x90,0x8C, + 0x81,0x7E,0x74,0x6B,0x6B,0x75,0x84,0x89,0x7D,0x70,0x6B,0x6C,0x72,0x77,0x7F,0x7F, + 0x73,0x6B,0x64,0x67,0x7F,0x8D,0x81,0x7C,0x7D,0x72,0x70,0x77,0x89,0x97,0x8C,0x83, + 0x83,0x7F,0x81,0x88,0x92,0x99,0x91,0x85,0x7D,0x75,0x84,0x9B,0x99,0x8D,0x89,0x7E, + 0x73,0x72,0x7C,0x8F,0x8F,0x81,0x7A,0x74,0x72,0x74,0x7B,0x87,0x87,0x7A,0x6E,0x66, + 0x69,0x82,0x90,0x83,0x7D,0x7B,0x70,0x6C,0x6E,0x7E,0x8C,0x84,0x7A,0x78,0x74,0x76, + 0x7D,0x84,0x8E,0x8A,0x7F,0x77,0x6F,0x7F,0x98,0x94,0x8B,0x88,0x7C,0x75,0x76,0x7D, + 0x8E,0x91,0x85,0x7C,0x79,0x77,0x79,0x7E,0x87,0x8A,0x7E,0x71,0x6A,0x6F,0x86,0x90, + 0x85,0x81,0x7B,0x74,0x73,0x71,0x80,0x8E,0x88,0x7D,0x78,0x75,0x76,0x7A,0x81,0x89, + 0x85,0x7A,0x71,0x6C,0x7C,0x93,0x90,0x86,0x84,0x7F,0x78,0x76,0x82,0x94,0x97,0x8A, + 0x83,0x82,0x80,0x84,0x8B,0x91,0x92,0x88,0x7E,0x74,0x7A,0x91,0x97,0x89,0x84,0x83, + 0x7C,0x77,0x78,0x88,0x92,0x89,0x80,0x7E,0x79,0x79,0x7D,0x84,0x8C,0x85,0x79,0x6F, + 0x6C,0x80,0x92,0x8A,0x80,0x7E,0x76,0x72,0x71,0x79,0x8B,0x8B,0x80,0x7A,0x77,0x79, + 0x7B,0x7E,0x89,0x8D,0x82,0x77,0x70,0x7B,0x92,0x93,0x88,0x86,0x83,0x7D,0x77,0x78, + 0x87,0x90,0x8B,0x81,0x7B,0x78,0x79,0x7E,0x86,0x8C,0x86,0x79,0x6E,0x6E,0x81,0x90, + 0x89,0x7F,0x7E,0x7A,0x76,0x71,0x7A,0x89,0x8A,0x81,0x78,0x77,0x78,0x7A,0x7D,0x84, + 0x87,0x7E,0x73,0x6D,0x7C,0x92,0x90,0x83,0x80,0x7F,0x7D,0x77,0x78,0x88,0x91,0x8D, + 0x80,0x7A,0x7D,0x81,0x81,0x87,0x8D,0x86,0x7B,0x6F,0x74,0x8B,0x93,0x87,0x80,0x7E, + 0x7C,0x78,0x73,0x7F,0x8B,0x89,0x7F,0x74,0x74,0x7B,0x7E,0x81,0x86,0x84,0x7D,0x72, + 0x6E,0x81,0x91,0x8F,0x84,0x7C,0x7C,0x7C,0x75,0x78,0x86,0x8B,0x84,0x77,0x72,0x76, + 0x7B,0x7E,0x81,0x82,0x7D,0x75,0x6E,0x7A,0x8F,0x91,0x88,0x7E,0x7C,0x81,0x7D,0x7B, + 0x88,0x8F,0x8D,0x84,0x7B,0x7B,0x81,0x86,0x8D,0x8F,0x88,0x7F,0x71,0x71,0x81,0x88, + 0x84,0x7D,0x7A,0x7C,0x78,0x72,0x78,0x80,0x85,0x81,0x77,0x76,0x7D,0x83,0x88,0x88, + 0x84,0x7F,0x75,0x72,0x83,0x8E,0x88,0x7A,0x73,0x76,0x78,0x77,0x7D,0x85,0x89,0x89, + 0x81,0x7B,0x7F,0x85,0x88,0x8B,0x87,0x84,0x7A,0x71,0x80,0x90,0x91,0x87,0x79,0x72, + 0x72,0x71,0x78,0x83,0x8B,0x89,0x7B,0x72,0x72,0x78,0x7E,0x81,0x7F,0x80,0x7E,0x75, + 0x7D,0x89,0x8F,0x90,0x8A,0x8A,0x8B,0x83,0x81,0x8A,0x92,0x95,0x8C,0x7F,0x7A,0x78, + 0x79,0x79,0x76,0x77,0x72,0x6B,0x73,0x82,0x8C,0x87,0x79,0x74,0x75,0x75,0x79,0x7C, + 0x84,0x89,0x7E,0x77,0x74,0x77,0x84,0x86,0x89,0x8C,0x82,0x74,0x75,0x84,0x92,0x94, + 0x87,0x7F,0x78,0x6D,0x74,0x82,0x8B,0x98,0x9A,0x8C,0x81,0x7C,0x7D,0x84,0x83,0x7F, + 0x7D,0x6F,0x6A,0x7C,0x88,0x94,0x90,0x71,0x70,0x75,0x69,0x61,0x65,0x7E,0x80,0x7F, + 0x79,0x86,0x95,0x95,0xAF,0xB6,0xB5,0xAD,0x99,0x99,0x9E,0x8F,0x8E,0x7B,0x5D,0x5A, + 0x58,0x56,0x50,0x5F,0x69,0x79,0x78,0x74,0x84,0x89,0x9B,0xAA,0x9B,0x78,0x7E,0x87, + 0x7C,0x7D,0x74,0x74,0x7F,0x89,0x8A,0x84,0x7B,0x88,0x96,0x94,0x83,0x62,0x57,0x6A, + 0x75,0x8E,0x8F,0x77,0x64,0x62,0x86,0x8A,0x77,0x73,0x77,0x7C,0x79,0x77,0x80,0x8E, + 0x9B,0x94,0x90,0x92,0x7B,0x78,0x6E,0x60,0x71,0x7A,0x6F,0x7C,0x93,0x80,0x79,0x6F, + 0x7C,0x91,0x96,0xB2,0xA5,0x94,0x8C,0x84,0x84,0x82,0x86,0x81,0x91,0x98,0xA5,0xAF, + 0x87,0x7A,0x87,0x90,0x90,0x83,0x81,0x72,0x62,0x59,0x47,0x4F,0x54,0x51,0x5F,0x74, + 0x72,0x5F,0x68,0x81,0x7B,0x6B,0x74,0x7D,0x7B,0x94,0xA7,0x9C,0x8A,0x8F,0xA3,0x9F, + 0x94,0x8E,0x87,0x7C,0x8B,0x96,0xA0,0xA3,0x8E,0x89,0x81,0x75,0x68,0x56,0x64,0x5E, + 0x55,0x70,0x7A,0x6C,0x5E,0x60,0x75,0x87,0x88,0x96,0x93,0x85,0x8E,0x88,0x8B,0x8F, + 0x77,0x7C,0x94,0x9C,0xA6,0x98,0x93,0x98,0x90,0x8E,0x7E,0x73,0x64,0x5D,0x67,0x6F, + 0x76,0x6B,0x77,0x8A,0x89,0x86,0x67,0x68,0x76,0x7D,0x89,0x73,0x6D,0x7C,0x7F,0x94, + 0xA8,0x9B,0x86,0x72,0x83,0x91,0x80,0x7D,0x75,0x73,0x81,0x94,0x80,0x65,0x74,0x78, + 0x80,0x8A,0x7C,0x72,0x75,0x74,0x6C,0x6E,0x67,0x63,0x64,0x6E,0x87,0x84,0x7F,0x94, + 0xA1,0x9A,0xA1,0xA1,0xA1,0x97,0x87,0x98,0xA1,0x96,0x82,0x7C,0x8A,0x99,0x9B,0x96, + 0xA1,0x8C,0x6E,0x73,0x7F,0x71,0x58,0x5B,0x65,0x6E,0x6A,0x5C,0x5F,0x6B,0x6B,0x73, + 0x7B,0x73,0x6E,0x7A,0x96,0x9E,0x9F,0x99,0x90,0x7D,0x71,0x8F,0x9F,0x7F,0x76,0x83, + 0x89,0x8A,0x70,0x76,0x80,0x7A,0x82,0x77,0x76,0x6E,0x65,0x6D,0x7C,0x8C,0x84,0x8C, + 0x85,0x70,0x89,0x97,0x86,0x7E,0x8E,0x90,0x8C,0x94,0x8B,0x80,0x8F,0x98,0x9F,0xA7, + 0x90,0x75,0x6C,0x73,0x68,0x68,0x89,0x8D,0x85,0x76,0x73,0x75,0x6C,0x77,0x7E,0x88, + 0x86,0x7C,0x85,0x7F,0x7A,0x80,0x78,0x6B,0x5B,0x5E,0x66,0x6B,0x80,0x88,0xA3,0xB3, + 0x99,0xA3,0xAF,0x93,0x8B,0x9E,0xA1,0x94,0x84,0x7A,0x7E,0x8D,0x8A,0x89,0x8F,0x83, + 0x7A,0x83,0x7F,0x6D,0x73,0x71,0x64,0x5A,0x5E,0x68,0x66,0x65,0x73,0x82,0x89,0x87, + 0x88,0x90,0x88,0x8D,0x96,0x94,0x9D,0x8F,0x7A,0x78,0x89,0x85,0x6E,0x71,0x6F,0x72, + 0x7C,0x74,0x6A,0x7A,0x86,0x7A,0x7B,0x77,0x78,0x79,0x75,0x8C,0x99,0x90,0x80,0x78, + 0x89,0x8D,0x84,0x90,0x94,0x83,0x7D,0x81,0x84,0x93,0x91,0x90,0x9B,0x89,0x7F,0x7E, + 0x6F,0x65,0x74,0x86,0x8B,0x82,0x78,0x73,0x72,0x79,0x7A,0x85,0x80,0x7C,0x81,0x88, + 0x86,0x70,0x75,0x7C,0x74,0x66,0x5D,0x5B,0x62,0x70,0x87,0x95,0x91,0x9C,0xAC,0xAF, + 0xAC,0xA1,0x99,0x8E,0x79,0x77,0x84,0x89,0x77,0x72,0x87,0x92,0x90,0x8B,0x92,0x7F, + 0x68,0x71,0x76,0x70,0x6D,0x68,0x5D,0x6C,0x80,0x76,0x7A,0x7B,0x78,0x91,0x97,0x8C, + 0x8F,0x94,0x8D,0x85,0x8F,0x85,0x79,0x72,0x73,0x8A,0x8F,0x7B,0x64,0x77,0x7A,0x64, + 0x67,0x6F,0x75,0x6F,0x74,0x77,0x7B,0x84,0x79,0x79,0x83,0x7E,0x87,0x97,0x8C,0x89, + 0x9B,0x98,0x92,0x7B,0x71,0x89,0x7F,0x79,0x8B,0x9A,0x93,0x7D,0x77,0x79,0x67,0x5B, + 0x6C,0x75,0x84,0x89,0x7D,0x76,0x76,0x84,0x8D,0x7F,0x7E,0x84,0x82,0x8D,0x89,0x81, + 0x89,0x79,0x61,0x5E,0x6D,0x69,0x58,0x5D,0x6C,0x85,0x8F,0x87,0x9A,0xA0,0x89,0x96, + 0x9B,0x95,0xA5,0x8F,0x7D,0x86,0x8F,0x7E,0x74,0x88,0x87,0x95,0x9C,0x87,0x85,0x8D, + 0x73,0x75,0x79,0x6A,0x76,0x68,0x67,0x75,0x7D,0x72,0x67,0x7E,0x81,0x77,0x78,0x80, + 0x85,0x85,0x7D,0x81,0x8E,0x77,0x68,0x65,0x6D,0x75,0x7B,0x88,0x77,0x6E,0x78,0x89, + 0x7D,0x67,0x72,0x73,0x7D,0x81,0x80,0x97,0x96,0x7B,0x82,0x9E,0x8A,0x82,0x88,0x85, + 0x89,0x81,0x7E,0x73,0x79,0x7E,0x7C,0x86,0x79,0x7B,0x87,0x84,0x84,0x87,0x88,0x78, + 0x6F,0x6E,0x7D,0x88,0x7B,0x7B,0x8F,0x92,0x88,0x93,0x98,0x8B,0x80,0x83,0x83,0x7D, + 0x79,0x60,0x5A,0x67,0x60,0x52,0x60,0x6B,0x6D,0x8A,0x9E,0xA4,0xAB,0xAF,0xA2,0x94, + 0x96,0x8C,0x81,0x7B,0x77,0x8A,0x97,0x80,0x87,0x94,0x83,0x7D,0x76,0x7E,0x88,0x77, + 0x66,0x78,0x7E,0x6E,0x61,0x68,0x74,0x6F,0x8B,0x92,0x7F,0x7A,0x82,0x8F,0x85,0x7A, + 0x76,0x73,0x75,0x70,0x7D,0x8D,0x7E,0x70,0x7F,0x8B,0x7D,0x6F,0x73,0x81,0x7E,0x79, + 0x8E,0x8A,0x89,0x87,0x7C,0x84,0x83,0x82,0x84,0x8E,0x8B,0x8F,0x95,0x7E,0x7F,0x70, + 0x6D,0x82,0x7A,0x7F,0x8E,0x90,0x8F,0x92,0x93,0x81,0x70,0x7B,0x81,0x7F,0x83,0x6F, + 0x7C,0x95,0x88,0x7C,0x7A,0x79,0x78,0x83,0x92,0x8F,0x93,0x95,0x7E,0x80,0x7C,0x72, + 0x6C,0x52,0x5C,0x6E,0x6C,0x67,0x73,0x73,0x77,0x8C,0x91,0xA6,0xAC,0xA3,0x95,0x92, + 0xA0,0x86,0x7D,0x84,0x7A,0x8E,0x99,0x94,0x91,0x8C,0x97,0x92,0x83,0x80,0x71,0x68, + 0x6D,0x69,0x78,0x79,0x6B,0x71,0x72,0x7A,0x73,0x73,0x7C,0x7C,0x7D,0x8B,0x90,0x83, + 0x83,0x77,0x71,0x73,0x77,0x81,0x8B,0x8F,0x94,0x99,0x82,0x79,0x76,0x6E,0x79,0x7F, + 0x77,0x80,0x85,0x83,0x8D,0x92,0x8C,0x74,0x74,0x80,0x7F,0x90,0x88,0x69,0x72,0x8E, + 0x87,0x78,0x7F,0x8E,0x94,0x7D,0x79,0x98,0xA8,0x83,0x6A,0x91,0x7B,0x6A,0x75,0x6E, + 0x7D,0x7E,0x8F,0x83,0x7C,0x88,0x83,0x83,0x7F,0x90,0x9A,0x8A,0x72,0x79,0x86,0x77, + 0x6D,0x5D,0x5A,0x64,0x6D,0x69,0x6E,0x85,0x92,0xA0,0x97,0x94,0x92,0x7C,0x80,0x93, + 0x95,0x93,0x93,0x8F,0x92,0x9B,0x91,0x87,0x8A,0x8F,0x85,0x88,0x90,0x7D,0x71,0x6A, + 0x60,0x68,0x7B,0x7D,0x74,0x7C,0x85,0x73,0x6B,0x77,0x6D,0x70,0x79,0x66,0x74,0x81, + 0x7B,0x86,0x95,0x9E,0x8C,0x79,0x80,0x83,0x80,0x88,0x77,0x69,0x83,0x86,0x78,0x73, + 0x73,0x7D,0x7E,0x89,0x96,0x8F,0x8C,0x78,0x66,0x70,0x7C,0x78,0x6C,0x77,0x75,0x7B, + 0x8B,0x8D,0x85,0x84,0x96,0x8C,0x8A,0x94,0x91,0x84,0x74,0x87,0x92,0x88,0x79,0x6F, + 0x6F,0x85,0x88,0x79,0x87,0x81,0x7E,0x7F,0x7A,0x81,0x7C,0x77,0x7C,0x76,0x6D,0x73, + 0x6F,0x60,0x65,0x6B,0x6C,0x72,0x87,0x90,0x95,0xAA,0x9F,0x8F,0x88,0x7A,0x77,0x7F, + 0x91,0x8D,0x92,0xA1,0xA3,0xA0,0x8E,0x8F,0x88,0x77,0x7C,0x7A,0x78,0x73,0x6F,0x73, + 0x85,0x86,0x72,0x69,0x68,0x6C,0x6E,0x7B,0x74,0x64,0x77,0x7E,0x75,0x6D,0x6E,0x78, + 0x79,0x7F,0x91,0x9A,0x95,0x7D,0x71,0x83,0x86,0x76,0x7A,0x7A,0x76,0x83,0x84,0x83, + 0x80,0x80,0x82,0x7C,0x7D,0x75,0x83,0x79,0x77,0x8F,0x81,0x76,0x6C,0x65,0x7F,0x95, + 0x8E,0x9D,0x97,0x91,0x95,0x7B,0x81,0x84,0x6A,0x77,0x84,0x7F,0x85,0x80,0x7C,0x7A, + 0x79,0x78,0x76,0x7A,0x7A,0x79,0x87,0x92,0x93,0x86,0x87,0x85,0x6A,0x79,0x7E,0x65, + 0x6A,0x77,0x83,0x80,0x7E,0x86,0x83,0x87,0x8A,0x92,0x90,0x83,0x84,0x86,0x8F,0x8F, + 0x85,0x82,0x86,0x86,0x95,0x97,0x82,0x84,0x91,0x8E,0x7F,0x6B,0x76,0x81,0x6F,0x7C, + 0x7C,0x81,0x7A,0x5F,0x70,0x7E,0x73,0x6E,0x6C,0x6F,0x78,0x80,0x84,0x86,0x7E,0x7D, + 0x81,0x82,0x83,0x86,0x8F,0x7C,0x83,0x8C,0x80,0x7A,0x66,0x63,0x75,0x88,0x8F,0x89, + 0x89,0x8E,0x81,0x82,0x84,0x6B,0x6F,0x86,0x7B,0x86,0x90,0x8A,0x83,0x7D,0x95,0x90, + 0x8D,0x8A,0x7F,0x87,0x94,0x91,0x7F,0x7E,0x79,0x6F,0x74,0x7C,0x78,0x78,0x80,0x91, + 0x92,0x79,0x82,0x7F,0x6D,0x7C,0x89,0x90,0x8D,0x8A,0x88,0x7E,0x7B,0x74,0x67,0x63, + 0x5D,0x5A,0x73,0x87,0x76,0x82,0xA6,0x99,0x83,0x8A,0x90,0x89,0x8D,0x8E,0xA1,0xAC, + 0x8A,0x85,0x8B,0x8C,0x8D,0x82,0x89,0x7F,0x80,0x8B,0x84,0x88,0x7A,0x6E,0x76,0x6F, + 0x62,0x76,0x77,0x68,0x72,0x74,0x76,0x6A,0x6A,0x6C,0x7B,0x85,0x7E,0xA4,0xA8,0x81, + 0x81,0x98,0x8F,0x76,0x81,0x8D,0x81,0x7D,0x77,0x80,0x81,0x75,0x72,0x7C,0x84,0x72, + 0x6E,0x80,0x94,0x88,0x82,0x90,0x7C,0x6C,0x71,0x87,0x87,0x78,0x94,0xA2,0x93,0x90, + 0x8D,0x7B,0x74,0x7C,0x82,0x89,0x84,0x86,0x7A,0x7F,0x8B,0x78,0x7F,0x82,0x71,0x62, + 0x7B,0x8C,0x79,0x88,0x94,0x87,0x8A,0x88,0x8A,0x8E,0x7A,0x71,0x84,0x7E,0x62,0x66, + 0x67,0x60,0x6D,0x76,0x86,0x97,0x8D,0x80,0x87,0x8E,0x7E,0x80,0x8D,0x86,0x8F,0x8D, + 0x8C,0x94,0x93,0x92,0x89,0x87,0x8F,0x88,0x83,0x83,0x80,0x84,0x8A,0x87,0x6C,0x63, + 0x71,0x62,0x68,0x75,0x6A,0x7B,0x7E,0x71,0x78,0x89,0x88,0x81,0x83,0x7B,0x85,0x84, + 0x7F,0x94,0x95,0x87,0x87,0x7E,0x69,0x6D,0x6D,0x68,0x76,0x82,0x8B,0x8D,0x85,0x70, + 0x74,0x7F,0x78,0x7A,0x7E,0x8C,0x80,0x6D,0x86,0x8D,0x87,0x8F,0x8B,0x84,0x79,0x7C, + 0x8D,0x8E,0x86,0x79,0x7D,0x8C,0x7A,0x76,0x82,0x7F,0x84,0x8B,0x80,0x7F,0x78,0x64, + 0x76,0x84,0x86,0x90,0x93,0x8A,0x80,0x84,0x88,0x7F,0x7F,0x74,0x6C,0x6D,0x5A,0x64, + 0x6F,0x71,0x7C,0x81,0x84,0x82,0x7B,0x7B,0x88,0x87,0x8C,0x96,0x8E,0x87,0x78,0x89, + 0x93,0x8A,0x92,0x9D,0xAB,0x92,0x85,0x92,0x8A,0x8B,0x80,0x6D,0x6C,0x6A,0x68,0x6E, + 0x79,0x7B,0x75,0x7A,0x71,0x65,0x72,0x77,0x78,0x82,0x82,0x88,0x8B,0x77,0x79,0x85, + 0x7F,0x85,0x86,0x88,0x82,0x6D,0x6C,0x70,0x7B,0x78,0x72,0x82,0x7D,0x7B,0x82,0x81, + 0x80,0x79,0x82,0x83,0x80,0x82,0x79,0x7E,0x8E,0x8D,0x85,0x8C,0x81,0x87,0x86,0x7A, + 0x91,0x86,0x82,0x81,0x75,0x78,0x79,0x7C,0x84,0x88,0x7E,0x82,0x82,0x7D,0x78,0x79, + 0x8B,0x89,0x7C,0x7B,0x7E,0x89,0x83,0x7B,0x8A,0x83,0x75,0x70,0x73,0x73,0x69,0x72, + 0x78,0x88,0x89,0x80,0x89,0x87,0x88,0x87,0x81,0x85,0x85,0x7D,0x85,0x87,0x7F,0x83, + 0x8E,0x8D,0x8A,0x94,0x97,0x98,0x92,0x92,0x88,0x7C,0x7E,0x75,0x6D,0x67,0x6B,0x75, + 0x7C,0x7B,0x75,0x77,0x7B,0x77,0x78,0x7B,0x79,0x79,0x77,0x7D,0x7B,0x79,0x7F,0x7F, + 0x83,0x85,0x7F,0x80,0x7D,0x77,0x77,0x77,0x78,0x79,0x7E,0x80,0x7F,0x88,0x8A,0x89, + 0x88,0x86,0x89,0x7F,0x7D,0x80,0x7E,0x81,0x7D,0x82,0x87,0x85,0x86,0x8C,0x8E,0x8F, + 0x8B,0x86,0x85,0x7F,0x7E,0x7D,0x7B,0x7E,0x80,0x7D,0x80,0x82,0x80,0x83,0x81,0x7E, + 0x80,0x84,0x82,0x7D,0x7E,0x80,0x80,0x7E,0x7D,0x78,0x74,0x75,0x77,0x77,0x78,0x7B, + 0x7E,0x84,0x88,0x89,0x89,0x88,0x89,0x8C,0x8D,0x8B,0x89,0x81,0x7E,0x7D,0x7C,0x80, + 0x83,0x85,0x87,0x8D,0x90,0x91,0x91,0x8C,0x88,0x83,0x7E,0x7B,0x79,0x7B,0x78,0x78, + 0x7B,0x7C,0x79,0x79,0x7B,0x7A,0x7C,0x7D,0x7D,0x7E,0x80,0x82,0x7F,0x7F,0x80,0x7E, + 0x81,0x82,0x7C,0x79,0x7C,0x7A,0x77,0x79,0x77,0x77,0x79,0x7E,0x81,0x81,0x85,0x85, + 0x83,0x86,0x84,0x82,0x82,0x82,0x84,0x83,0x88,0x83,0x8B,0x98,0x83,0x92,0x7C,0x6B, + 0x89,0x7C,0x6A,0x6D,0x7D,0x86,0x8A,0x8C,0x8E,0x8A,0x8B,0x9C,0xA1,0x9B,0x96,0x92, + 0x90,0x90,0x89,0x83,0x7F,0x72,0x6A,0x69,0x65,0x6D,0x67,0x55,0x62,0x64,0x5F,0x69, + 0x6B,0x6D,0x78,0x79,0x7B,0x79,0x6F,0x8A,0x88,0x73,0x88,0xA4,0xA2,0x96,0xB7,0xC1, + 0xAF,0xAA,0x9A,0x99,0xA7,0xA4,0x94,0x93,0x93,0x89,0x88,0x85,0x7A,0x76,0x72,0x6D, + 0x6B,0x74,0x7E,0x79,0x6C,0x68,0x68,0x5B,0x53,0x4C,0x47,0x4C,0x4C,0x50,0x5B,0x63, + 0x63,0x68,0x7A,0x88,0x8A,0x8A,0x90,0x94,0x8F,0x85,0x8F,0x9D,0x9D,0x98,0x98,0xA5, + 0xB0,0xBA,0xC1,0xC4,0xBD,0xAD,0xAA,0xAD,0xAA,0xA2,0x9A,0x9A,0x95,0x8B,0x8D,0x86, + 0x7E,0x7D,0x75,0x6C,0x64,0x64,0x62,0x59,0x54,0x53,0x52,0x4D,0x4F,0x51,0x54,0x58, + 0x56,0x56,0x57,0x5C,0x5B,0x58,0x67,0x6C,0x68,0x6D,0x70,0x70,0x75,0x79,0x74,0x7D, + 0x8B,0x87,0x8C,0x98,0x9F,0xAA,0xB7,0xB0,0x9E,0x9F,0x9D,0x94,0x8E,0x83,0x86,0x89, + 0x88,0x85,0x81,0x84,0x85,0x85,0x82,0x83,0x85,0x86,0x84,0x7B,0x73,0x6C,0x6B,0x6A, + 0x66,0x63,0x61,0x62,0x5D,0x59,0x5B,0x5D,0x61,0x6F,0x77,0x79,0x77,0x77,0x73,0x7B, + 0x8F,0x91,0x84,0x85,0x8C,0x8C,0x8D,0x8C,0x92,0xA1,0xA8,0xAC,0xB3,0xB8,0xB9,0xB9, + 0xB8,0xB5,0xBA,0xB8,0xB6,0xB9,0xB9,0xAF,0xA3,0x9D,0x93,0x92,0xA0,0x9D,0x90,0x8C, + 0x86,0x77,0x6A,0x62,0x62,0x69,0x62,0x59,0x60,0x63,0x5E,0x53,0x4A,0x4D,0x54,0x58, + 0x5C,0x62,0x6D,0x6C,0x67,0x6E,0x70,0x76,0x85,0x85,0x7F,0x82,0x7F,0x74,0x70,0x73, + 0x7C,0x86,0x85,0x87,0x90,0x8D,0x86,0x84,0x84,0x88,0x8D,0x90,0x90,0x94,0x95,0x86, + 0x81,0x81,0x81,0x84,0x89,0x84,0x78,0x7B,0x73,0x5F,0x59,0x57,0x62,0x67,0x60,0x62, + 0x64,0x5E,0x52,0x4E,0x4D,0x50,0x58,0x56,0x5D,0x61,0x5B,0x51,0x50,0x55,0x55,0x69, + 0x78,0x6E,0x6B,0x6E,0x66,0x68,0x6D,0x6F,0x80,0x8A,0x8B,0x93,0x99,0x9A,0x99,0xA1, + 0xAF,0xB9,0xBA,0xB9,0xC1,0xC3,0xC0,0xBC,0xBF,0xBE,0xBE,0xCF,0xCD,0xC2,0xBE,0xB7, + 0xAE,0xA5,0xA1,0xA5,0xA6,0x9E,0x93,0x8D,0x86,0x80,0x7B,0x79,0x7D,0x7E,0x7E,0x7E, + 0x77,0x6D,0x6C,0x71,0x70,0x70,0x7D,0x84,0x7A,0x71,0x70,0x6A,0x66,0x68,0x6E,0x78, + 0x79,0x71,0x74,0x75,0x6E,0x6E,0x76,0x7D,0x83,0x82,0x83,0x88,0x84,0x7E,0x85,0x8A, + 0x85,0x8C,0x9C,0x9A,0x8F,0x8F,0x93,0x90,0x8D,0x8F,0x9A,0xA0,0x99,0x92,0x92,0x8F, + 0x8A,0x8B,0x8E,0x95,0x96,0x8F,0x90,0x90,0x89,0x85,0x89,0x80,0x7A,0x8D,0x8E,0x7C, + 0x77,0x78,0x6F,0x64,0x64,0x6B,0x71,0x69,0x5A,0x5B,0x58,0x4F,0x4B,0x4F,0x53,0x55, + 0x53,0x52,0x53,0x4E,0x4C,0x53,0x57,0x51,0x58,0x6B,0x62,0x56,0x59,0x54,0x49,0x45, + 0x4A,0x55,0x5C,0x54,0x51,0x56,0x50,0x4C,0x52,0x5B,0x62,0x67,0x6B,0x72,0x74,0x76, + 0x7E,0x8D,0x94,0x96,0xAE,0xC1,0xB7,0xB3,0xBA,0xBA,0xB7,0xB9,0xC0,0xC9,0xCA,0xC2, + 0xC2,0xC3,0xB8,0xB4,0xB8,0xB9,0xB9,0xB6,0xB2,0xAF,0xA5,0x9D,0x9F,0xA3,0x9C,0x9C, + 0xB2,0xB3,0xA0,0xA1,0xA5,0x9B,0x98,0x9E,0xA7,0xAC,0xA3,0x9B,0x9D,0x97,0x8D,0x8B, + 0x8E,0x90,0x8D,0x86,0x82,0x7D,0x73,0x6E,0x71,0x71,0x64,0x6B,0x78,0x6A,0x5E,0x62, + 0x5F,0x54,0x54,0x5C,0x67,0x6B,0x61,0x63,0x6A,0x62,0x61,0x68,0x6C,0x70,0x70,0x6F, + 0x72,0x6C,0x68,0x6D,0x71,0x70,0x6B,0x76,0x83,0x74,0x6C,0x76,0x75,0x6B,0x6D,0x76, + 0x81,0x7F,0x74,0x7B,0x7E,0x74,0x74,0x7C,0x7F,0x81,0x7F,0x7C,0x80,0x7B,0x77,0x7D, + 0x80,0x7F,0x76,0x83,0x91,0x7E,0x75,0x83,0x7F,0x76,0x79,0x81,0x89,0x86,0x7C,0x81, + 0x83,0x77,0x76,0x7E,0x81,0x81,0x7D,0x7C,0x7C,0x74,0x72,0x78,0x79,0x79,0x74,0x80, + 0x94,0x84,0x79,0x89,0x8A,0x81,0x85,0x92,0x9C,0x9D,0x94,0x98,0x9F,0x94,0x8F,0x97, + 0x99,0x95,0x94,0x90,0x8C,0x81,0x7B,0x7D,0x79,0x76,0x6C,0x73,0x83,0x71,0x61,0x6E, + 0x6A,0x5B,0x5F,0x6A,0x71,0x70,0x66,0x6C,0x74,0x6A,0x69,0x75,0x7A,0x7B,0x7F,0x81, + 0x84,0x7F,0x7D,0x85,0x89,0x8B,0x88,0x8E,0xA4,0x9E,0x8D,0x99,0x9D,0x8F,0x8F,0x99, + 0xA2,0xA2,0x96,0x96,0x9E,0x93,0x8C,0x96,0x9B,0x98,0x96,0x98,0x9B,0x94,0x8D,0x90, + 0x92,0x91,0x8C,0x8D,0xA3,0xA0,0x87,0x90,0x96,0x83,0x7E,0x8A,0x94,0x94,0x8A,0x88, + 0x8E,0x82,0x7A,0x84,0x8A,0x85,0x82,0x81,0x7E,0x78,0x6E,0x70,0x6E,0x68,0x63,0x5E, + 0x6F,0x71,0x55,0x58,0x5E,0x4A,0x41,0x49,0x52,0x54,0x4A,0x48,0x51,0x49,0x3C,0x46, + 0x50,0x4E,0x4D,0x4E,0x50,0x4D,0x46,0x4B,0x4F,0x4E,0x4D,0x4D,0x61,0x68,0x54,0x56, + 0x64,0x59,0x54,0x61,0x6D,0x73,0x71,0x71,0x7F,0x7F,0x78,0x85,0x93,0x96,0x9B,0xA4, + 0xA7,0xA7,0xA2,0xA4,0xA9,0xA6,0xA4,0xA0,0xB0,0xBF,0xA9,0x9F,0xAE,0xA2,0x94,0x99, + 0xA2,0xA6,0xA0,0x98,0x9D,0x9D,0x90,0x91,0x9B,0x9D,0x9D,0x9E,0x9F,0x9E,0x99,0x99, + 0x9F,0x9F,0x9F,0x99,0xA4,0xB8,0xA9,0x9B,0xA9,0xA6,0x96,0x9B,0xA5,0xAB,0xA7,0x9D, + 0xA1,0xA4,0x94,0x8F,0x9A,0x99,0x96,0x94,0x95,0x95,0x8E,0x88,0x8A,0x8B,0x88,0x81, + 0x83,0x97,0x90,0x79,0x82,0x85,0x73,0x72,0x7C,0x81,0x7F,0x74,0x72,0x78,0x6C,0x63, + 0x6C,0x6E,0x6B,0x6B,0x69,0x69,0x62,0x5D,0x5E,0x5F,0x60,0x59,0x54,0x67,0x69,0x51, + 0x54,0x5C,0x4E,0x47,0x4D,0x55,0x59,0x50,0x4D,0x55,0x4F,0x45,0x4A,0x53,0x52,0x53, + 0x53,0x54,0x53,0x4D,0x4F,0x53,0x57,0x57,0x53,0x64,0x72,0x5E,0x5A,0x6A,0x62,0x5A, + 0x63,0x6D,0x74,0x71,0x6B,0x76,0x7B,0x73,0x79,0x86,0x8A,0x8E,0x92,0x97,0x9D,0x9A, + 0x9D,0xA7,0xAC,0xAE,0xAB,0xB8,0xD2,0xC8,0xB8,0xC7,0xC6,0xB5,0xB6,0xC0,0xC5,0xC0, + 0xB4,0xB6,0xBA,0xAD,0xA6,0xAE,0xB0,0xAC,0xAA,0xA7,0xA6,0xA0,0x9A,0x9C,0x9E,0x9C, + 0x94,0x99,0xB2,0xA9,0x95,0xA0,0xA2,0x93,0x92,0x9B,0xA3,0xA1,0x95,0x97,0x9E,0x92, + 0x8C,0x94,0x95,0x92,0x91,0x8E,0x8E,0x8A,0x83,0x83,0x84,0x81,0x79,0x79,0x91,0x8C, + 0x75,0x7B,0x7E,0x70,0x6E,0x75,0x7E,0x7F,0x72,0x70,0x78,0x6F,0x67,0x6F,0x70,0x6F, + 0x6E,0x68,0x67,0x66,0x61,0x60,0x61,0x61,0x5A,0x56,0x6B,0x6F,0x57,0x57,0x5E,0x53, + 0x4B,0x4D,0x56,0x5D,0x53,0x4D,0x56,0x55,0x4E,0x51,0x55,0x59,0x59,0x54,0x56,0x59, + 0x55,0x53,0x55,0x5B,0x58,0x52,0x6B,0x74,0x5E,0x5D,0x67,0x5F,0x5B,0x5E,0x67,0x72, + 0x69,0x61,0x6B,0x6E,0x68,0x6C,0x73,0x7A,0x7D,0x7B,0x7E,0x84,0x83,0x86,0x8C,0x93, + 0x91,0x8F,0xA9,0xBA,0xA8,0xAA,0xB8,0xB4,0xB2,0xB7,0xC2,0xCE,0xC7,0xBE,0xC4,0xC5, + 0xBD,0xBB,0xBB,0xBE,0xBE,0xB6,0xB1,0xB0,0xA8,0xA0,0x9D,0x9E,0x96,0x8D,0xA0,0xA3, + 0x8A,0x89,0x8D,0x84,0x81,0x81,0x88,0x93,0x8C,0x83,0x88,0x89,0x85,0x85,0x87,0x8B, + 0x8D,0x8A,0x8C,0x8E,0x8D,0x8D,0x89,0x8C,0x87,0x84,0x9B,0x9C,0x86,0x87,0x87,0x80, + 0x7E,0x7A,0x80,0x89,0x80,0x78,0x7B,0x7A,0x74,0x71,0x76,0x7C,0x7D,0x77,0x72,0x72, + 0x73,0x6F,0x6E,0x72,0x6C,0x72,0x88,0x7F,0x6E,0x72,0x6F,0x6A,0x68,0x69,0x73,0x78, + 0x6E,0x68,0x6C,0x6A,0x64,0x62,0x64,0x6A,0x68,0x61,0x5F,0x60,0x60,0x5A,0x58,0x57, + 0x52,0x63,0x74,0x63,0x5A,0x5C,0x55,0x54,0x53,0x57,0x64,0x63,0x59,0x57,0x5E,0x5F, + 0x59,0x58,0x60,0x68,0x68,0x64,0x64,0x68,0x67,0x63,0x66,0x66,0x69,0x80,0x84,0x74, + 0x77,0x79,0x78,0x7B,0x7C,0x87,0x95,0x94,0x8F,0x91,0x99,0x9D,0x9B,0x9D,0xA9,0xB0, + 0xAE,0xAB,0xAD,0xAF,0xA9,0xA4,0xA5,0xA0,0xA9,0xBB,0xAD,0x9C,0x9B,0x92,0x8F,0x8A, + 0x86,0x91,0x97,0x8C,0x83,0x82,0x83,0x80,0x79,0x7B,0x84,0x85,0x7F,0x7C,0x80,0x80, + 0x7C,0x7D,0x7D,0x7F,0x95,0x9D,0x8B,0x87,0x88,0x84,0x85,0x80,0x86,0x92,0x91,0x89, + 0x87,0x8B,0x8E,0x88,0x84,0x8B,0x92,0x91,0x8A,0x87,0x8B,0x88,0x84,0x81,0x87,0x8F, + 0x99,0x94,0x85,0x87,0x85,0x83,0x7E,0x7C,0x87,0x8E,0x88,0x7D,0x7B,0x81,0x7F,0x7A, + 0x7A,0x80,0x85,0x81,0x7B,0x79,0x79,0x74,0x6E,0x69,0x6E,0x85,0x87,0x74,0x6E,0x6E, + 0x6F,0x6A,0x60,0x64,0x70,0x71,0x68,0x5F,0x63,0x68,0x62,0x5E,0x61,0x67,0x69,0x65, + 0x60,0x62,0x64,0x60,0x5B,0x57,0x6A,0x7D,0x72,0x64,0x61,0x64,0x69,0x65,0x64,0x6E, + 0x7A,0x7B,0x75,0x72,0x78,0x7E,0x7C,0x7C,0x82,0x8C,0x91,0x8F,0x8F,0x93,0x98,0x9B, + 0x98,0x9F,0xB8,0xBD,0xB1,0xA9,0xA4,0xA8,0xA7,0xA2,0xA3,0xAB,0xAE,0xA8,0x9B,0x96, + 0x98,0x98,0x8F,0x89,0x8A,0x8C,0x8C,0x85,0x7E,0x7A,0x79,0x72,0x70,0x81,0x8D,0x87, + 0x7E,0x77,0x76,0x79,0x75,0x75,0x7C,0x84,0x87,0x83,0x7C,0x7D,0x80,0x81,0x81,0x80, + 0x82,0x86,0x86,0x84,0x81,0x80,0x7F,0x7B,0x87,0x9A,0x97,0x8B,0x84,0x81,0x84,0x84, + 0x81,0x82,0x87,0x8B,0x8E,0x8A,0x86,0x84,0x83,0x84,0x83,0x82,0x84,0x86,0x84,0x82, + 0x7E,0x7C,0x76,0x78,0x89,0x90,0x88,0x80,0x77,0x73,0x74,0x70,0x6E,0x72,0x73,0x78, + 0x7A,0x74,0x71,0x72,0x71,0x6E,0x6C,0x6D,0x72,0x72,0x6E,0x6C,0x6A,0x67,0x62,0x6A, + 0x79,0x78,0x70,0x6A,0x62,0x63,0x65,0x61,0x61,0x60,0x61,0x69,0x6B,0x6B,0x6E,0x6F, + 0x70,0x70,0x70,0x75,0x79,0x79,0x7B,0x7F,0x81,0x81,0x81,0x8B,0x98,0x99,0x97,0x98, + 0x94,0x95,0x9B,0x9A,0x9A,0x9A,0x97,0x9A,0x9B,0x9A,0x9C,0x9B,0x99,0x99,0x99,0x98, + 0x96,0x92,0x92,0x93,0x92,0x8F,0x8D,0x8D,0x90,0x90,0x8A,0x8A,0x8A,0x88,0x8C,0x8A, + 0x86,0x88,0x87,0x85,0x85,0x85,0x83,0x81,0x80,0x80,0x81,0x82,0x82,0x82,0x83,0x84, + 0x84,0x82,0x7F,0x7F,0x84,0x87,0x84,0x82,0x84,0x84,0x88,0x87,0x84,0x85,0x82,0x7F, + 0x80,0x7F,0x7D,0x7D,0x7C,0x7D,0x7E,0x7E,0x7E,0x7E,0x7F,0x80,0x83,0x83,0x7F,0x7D, + 0x7E,0x83,0x82,0x7E,0x81,0x80,0x7E,0x81,0x82,0x7F,0x7E,0x7B,0x79,0x7B,0x78,0x75, + 0x76,0x74,0x73,0x74,0x76,0x75,0x75,0x76,0x76,0x78,0x77,0x76,0x75,0x75,0x7A,0x7C, + 0x7A,0x7B,0x7A,0x7A,0x81,0x7E,0x7C,0x7C,0x77,0x77,0x78,0x75,0x76,0x74,0x70,0x72, + 0x74,0x74,0x77,0x77,0x77,0x78,0x7A,0x7A,0x7A,0x7A,0x7B,0x82,0x83,0x7F,0x81,0x81, + 0x82,0x88,0x89,0x87,0x88,0x84,0x84,0x86,0x83,0x84,0x84,0x82,0x83,0x84,0x86,0x86, + 0x86,0x86,0x86,0x88,0x89,0x88,0x86,0x83,0x85,0x8C,0x88,0x84,0x83,0x7F,0x83,0x86, + 0x80,0x81,0x7F,0x79,0x7A,0x79,0x77,0x78,0x75,0x74,0x76,0x77,0x79,0x7A,0x7A,0x7C, + 0x7E,0x82,0x83,0x81,0x81,0x7F,0x84,0x86,0x82,0x84,0x83,0x80,0x87,0x88,0x84,0x84, + 0x80,0x7F,0x81,0x81,0x80,0x7E,0x7C,0x7B,0x7C,0x7E,0x7F,0x7E,0x81,0x82,0x83,0x85, + 0x85,0x86,0x84,0x83,0x8A,0x8B,0x86,0x85,0x84,0x84,0x85,0x83,0x86,0x90,0x7C,0x62, + 0x77,0x87,0x86,0x6E,0x80,0x88,0x62,0x72,0x7F,0x7B,0x7C,0x88,0x8E,0x7B,0x7F,0x85, + 0x84,0x7A,0x7F,0x8C,0x7B,0x71,0x74,0x78,0x81,0x80,0x7F,0x88,0x79,0x6E,0x7B,0x77, + 0x71,0x72,0x79,0x76,0x78,0x7E,0x79,0x7F,0x84,0x87,0x87,0x82,0x87,0x86,0x86,0x89, + 0x80,0x82,0x83,0x7D,0x7C,0x81,0x83,0x80,0x80,0x7C,0x7F,0x81,0x77,0x78,0x79,0x77, + 0x75,0x75,0x7C,0x7E,0x88,0x8C,0x80,0x82,0x8A,0x8A,0x8B,0x8E,0x8E,0x85,0x86,0x8C, + 0x8D,0x8A,0x8B,0x88,0x81,0x87,0x7E,0x74,0x7D,0x77,0x68,0x6C,0x73,0x76,0x77,0x71, + 0x70,0x72,0x70,0x77,0x7B,0x7F,0x7D,0x76,0x7B,0x7C,0x7A,0x78,0x79,0x85,0x8B,0x89, + 0x89,0x80,0x80,0x86,0x88,0x88,0x80,0x7C,0x7B,0x7D,0x81,0x85,0x83,0x7C,0x79,0x72, + 0x78,0x7F,0x7F,0x81,0x7B,0x7D,0x7D,0x80,0x86,0x89,0x88,0x85,0x87,0x84,0x7D,0x83, + 0x87,0x83,0x83,0x85,0x84,0x84,0x8C,0x86,0x84,0x85,0x7E,0x82,0x82,0x7C,0x7D,0x80, + 0x7B,0x7C,0x7C,0x7D,0x87,0x89,0x7F,0x7E,0x7F,0x7E,0x7E,0x7D,0x89,0x82,0x7E,0x85, + 0x78,0x77,0x7C,0x7D,0x7E,0x82,0x81,0x7D,0x82,0x83,0x81,0x84,0x81,0x7A,0x78,0x78, + 0x7A,0x80,0x84,0x84,0x84,0x85,0x84,0x83,0x83,0x7C,0x89,0x8F,0x88,0x88,0x83,0x82, + 0x85,0x88,0x81,0x81,0x7D,0x74,0x7D,0x81,0x85,0x8A,0x81,0x80,0x82,0x83,0x89,0x86, + 0x81,0x85,0x88,0x86,0x86,0x83,0x83,0x7F,0x76,0x80,0x90,0x91,0x8F,0x8A,0x7D,0x7D, + 0x7F,0x77,0x77,0x75,0x6F,0x77,0x82,0x83,0x82,0x81,0x80,0x88,0x84,0x81,0x83,0x7D, + 0x7E,0x80,0x7F,0x7F,0x80,0x7F,0x7B,0x78,0x7F,0x8F,0x94,0x91,0x89,0x80,0x79,0x7E, + 0x7C,0x72,0x76,0x77,0x7E,0x87,0x86,0x83,0x7E,0x80,0x87,0x83,0x7A,0x7D,0x81,0x87, + 0x8B,0x87,0x84,0x81,0x7B,0x80,0x7C,0x82,0x96,0x94,0x92,0x8F,0x83,0x86,0x84,0x79, + 0x79,0x7A,0x78,0x86,0x8E,0x82,0x82,0x83,0x84,0x88,0x7E,0x7C,0x7E,0x81,0x80,0x83, + 0x85,0x86,0x82,0x7C,0x75,0x76,0x8B,0x95,0x8B,0x89,0x84,0x76,0x82,0x7C,0x6C,0x72, + 0x75,0x7C,0x85,0x80,0x79,0x82,0x8A,0x88,0x80,0x79,0x79,0x7C,0x82,0x82,0x80,0x84, + 0x84,0x7F,0x7A,0x77,0x7C,0x8E,0x95,0x8B,0x88,0x84,0x80,0x8B,0x81,0x72,0x78,0x76, + 0x79,0x80,0x7B,0x79,0x80,0x87,0x84,0x7F,0x7F,0x80,0x84,0x84,0x7C,0x7A,0x81,0x86, + 0x80,0x7B,0x76,0x80,0x92,0x88,0x82,0x88,0x82,0x87,0x8A,0x76,0x74,0x76,0x75,0x7C, + 0x77,0x71,0x79,0x80,0x87,0x7F,0x79,0x84,0x80,0x7C,0x76,0x75,0x7F,0x82,0x7C,0x76, + 0x73,0x75,0x88,0x91,0x82,0x84,0x84,0x7F,0x88,0x80,0x79,0x79,0x7B,0x7E,0x7C,0x77, + 0x7B,0x84,0x88,0x86,0x80,0x84,0x88,0x84,0x84,0x7C,0x7C,0x7E,0x7B,0x75,0x75,0x79, + 0x81,0x94,0x8C,0x84,0x88,0x81,0x87,0x87,0x71,0x74,0x7B,0x78,0x7F,0x79,0x79,0x86, + 0x85,0x85,0x82,0x80,0x87,0x84,0x84,0x82,0x81,0x82,0x7C,0x7E,0x7F,0x79,0x7B,0x8F, + 0x8B,0x7C,0x87,0x85,0x83,0x87,0x77,0x73,0x7B,0x75,0x7B,0x77,0x70,0x7D,0x82,0x7C, + 0x7F,0x81,0x81,0x85,0x80,0x7D,0x7D,0x7F,0x7F,0x7E,0x83,0x7C,0x73,0x85,0x8C,0x82, + 0x8B,0x8D,0x84,0x8A,0x82,0x78,0x7D,0x78,0x78,0x7E,0x72,0x76,0x81,0x7E,0x82,0x81, + 0x7F,0x83,0x81,0x7B,0x7F,0x7D,0x7A,0x7A,0x75,0x7A,0x72,0x75,0x8C,0x8A,0x86,0x89, + 0x7F,0x8A,0x88,0x74,0x7E,0x7B,0x73,0x7B,0x77,0x73,0x82,0x81,0x7E,0x87,0x7F,0x86, + 0x84,0x80,0x84,0x7F,0x7F,0x7D,0x73,0x7C,0x79,0x72,0x86,0x8A,0x84,0x87,0x83,0x81, + 0x8A,0x7F,0x7C,0x84,0x78,0x7C,0x78,0x75,0x7B,0x7D,0x80,0x83,0x81,0x84,0x8B,0x81, + 0x80,0x80,0x81,0x7F,0x7A,0x7A,0x7D,0x7B,0x7E,0x8A,0x82,0x86,0x88,0x82,0x8A,0x88, + 0x7D,0x7E,0x7C,0x75,0x78,0x73,0x73,0x7E,0x79,0x7F,0x83,0x7C,0x87,0x86,0x80,0x88, + 0x85,0x81,0x80,0x7C,0x7E,0x7B,0x7A,0x8A,0x86,0x80,0x8B,0x82,0x85,0x8C,0x7C,0x7F, + 0x86,0x7A,0x7D,0x7A,0x73,0x7D,0x78,0x7C,0x7D,0x78,0x82,0x83,0x80,0x86,0x86,0x84, + 0x87,0x80,0x81,0x80,0x79,0x84,0x84,0x7E,0x86,0x83,0x83,0x85,0x7D,0x82,0x86,0x7C, + 0x7E,0x80,0x74,0x7C,0x7C,0x72,0x7F,0x7C,0x7C,0x86,0x7E,0x81,0x85,0x7F,0x82,0x7C, + 0x7A,0x81,0x7C,0x80,0x87,0x81,0x85,0x85,0x7D,0x86,0x81,0x7A,0x85,0x80,0x7A,0x80, + 0x7C,0x7E,0x7F,0x78,0x7F,0x7F,0x7B,0x86,0x84,0x83,0x89,0x85,0x85,0x84,0x7F,0x7D, + 0x7B,0x80,0x86,0x7E,0x80,0x84,0x7F,0x89,0x84,0x81,0x87,0x7F,0x80,0x82,0x79,0x7D, + 0x83,0x7B,0x7C,0x82,0x81,0x81,0x83,0x87,0x86,0x85,0x86,0x84,0x7F,0x81,0x7F,0x80, + 0x89,0x7F,0x7F,0x86,0x85,0x85,0x81,0x81,0x82,0x7F,0x7F,0x7E,0x7A,0x7F,0x81,0x7A, + 0x7D,0x7E,0x7C,0x81,0x80,0x81,0x88,0x84,0x83,0x83,0x82,0x81,0x7E,0x84,0x87,0x7E, + 0x83,0x85,0x83,0x86,0x80,0x7F,0x84,0x83,0x80,0x80,0x7C,0x80,0x7F,0x7A,0x7E,0x7C, + 0x7F,0x80,0x82,0x86,0x85,0x83,0x84,0x81,0x7F,0x81,0x7D,0x84,0x84,0x7E,0x84,0x84, + 0x83,0x84,0x80,0x81,0x82,0x7F,0x80,0x7C,0x7B,0x80,0x7D,0x7C,0x7E,0x7D,0x7E,0x7F, + 0x7F,0x86,0x85,0x80,0x83,0x84,0x81,0x7F,0x7F,0x85,0x7F,0x7F,0x83,0x81,0x83,0x81, + 0x7F,0x7F,0x80,0x80,0x7C,0x7C,0x7F,0x7E,0x7B,0x7B,0x7C,0x80,0x7F,0x7D,0x83,0x85, + 0x83,0x82,0x83,0x83,0x82,0x80,0x85,0x84,0x7D,0x80,0x83,0x82,0x85,0x7F,0x83,0x84, + 0x7B,0x80,0x7D,0x7A,0x7C,0x7B,0x7C,0x7D,0x7F,0x7F,0x82,0x81,0x84,0x84,0x84,0x84, + 0x7F,0x81,0x82,0x82,0x82,0x81,0x83,0x81,0x82,0x83,0x83,0x88,0x8B,0x92,0x8B,0x8A, + 0x88,0x7C,0x7F,0x73,0x70,0x77,0x75,0x79,0x74,0x83,0x7D,0x6D,0x89,0x81,0x6A,0x7C, + 0x81,0x80,0x72,0x70,0x89,0x81,0x80,0x7F,0x74,0x83,0x83,0x81,0x81,0x76,0x7F,0x88, + 0x7F,0x78,0x78,0x82,0x89,0x83,0x83,0x87,0x87,0x90,0x91,0x86,0x80,0x8A,0x9C,0x92, + 0x8A,0x93,0x88,0x85,0x97,0x96,0x94,0x9C,0xA0,0x98,0x91,0x94,0x94,0x84,0x78,0x80, + 0x88,0x8D,0x8C,0x85,0x82,0x81,0x7E,0x77,0x6E,0x69,0x6F,0x79,0x74,0x6A,0x68,0x62, + 0x64,0x63,0x5D,0x5F,0x60,0x62,0x65,0x5F,0x5A,0x60,0x5E,0x63,0x64,0x5C,0x60,0x66, + 0x6D,0x73,0x6A,0x68,0x6F,0x77,0x78,0x75,0x7E,0x7B,0x76,0x77,0x78,0x7D,0x80,0x7D, + 0x82,0x88,0x87,0x8A,0x8D,0x99,0xAD,0xAA,0x9F,0xA0,0x9E,0x9D,0x9D,0x9C,0x9E,0x97, + 0x8C,0x8A,0x86,0x7E,0x7F,0x99,0x95,0x89,0x93,0x90,0x8F,0x82,0x75,0x84,0x85,0x79, + 0x82,0x89,0x8F,0x95,0x86,0x8E,0x96,0x8C,0x85,0x85,0x8D,0x8B,0x83,0x82,0x88,0x7E, + 0x7C,0x9D,0xA1,0x94,0x9C,0x95,0x90,0x85,0x71,0x81,0x89,0x83,0x8F,0x96,0x98,0x96, + 0x86,0x86,0x92,0x88,0x86,0x89,0x93,0x98,0x8A,0x86,0x83,0x7B,0x72,0x82,0x90,0x81, + 0x7E,0x7D,0x71,0x67,0x53,0x57,0x64,0x5B,0x5A,0x5D,0x5F,0x5D,0x4B,0x42,0x4E,0x48, + 0x44,0x4E,0x59,0x59,0x51,0x4C,0x45,0x4F,0x49,0x55,0x6F,0x67,0x66,0x67,0x61,0x5E, + 0x55,0x58,0x6F,0x71,0x6F,0x79,0x7D,0x7B,0x71,0x6E,0x77,0x79,0x78,0x82,0x8F,0x90, + 0x8B,0x8C,0x95,0xA0,0x9A,0xAA,0xC7,0xB3,0xAB,0xAE,0x9D,0x91,0x83,0x86,0x9A,0x96, + 0x91,0x9C,0x96,0x89,0x7A,0x7C,0x88,0x89,0x88,0x94,0x9C,0x94,0x89,0x87,0x8A,0x8E, + 0x8A,0x8E,0xAE,0xA7,0x95,0x9C,0x95,0x89,0x81,0x84,0x95,0x98,0x8F,0x9B,0x9F,0x93, + 0x8D,0x8A,0x92,0x96,0x90,0x98,0xA3,0x99,0x92,0x8F,0x93,0x91,0x86,0xA2,0xB2,0x9C, + 0x9E,0xA0,0x90,0x88,0x81,0x8C,0x9B,0x8C,0x89,0x95,0x88,0x78,0x75,0x74,0x77,0x72, + 0x70,0x7A,0x72,0x5F,0x5A,0x5A,0x55,0x59,0x51,0x5C,0x73,0x58,0x4E,0x59,0x4F,0x44, + 0x44,0x4D,0x5D,0x58,0x4F,0x5D,0x5A,0x4F,0x54,0x58,0x60,0x63,0x61,0x6F,0x6F,0x65, + 0x68,0x6B,0x6D,0x66,0x74,0x8D,0x7C,0x6F,0x7D,0x77,0x6E,0x71,0x7F,0x94,0x96,0x92, + 0xA3,0xAA,0x9B,0x9A,0x9F,0xA2,0x9F,0x9C,0xA3,0x9E,0x8E,0x8C,0x8F,0x88,0x8C,0x8C, + 0x8C,0xA3,0x98,0x81,0x93,0x8D,0x7F,0x84,0x8A,0x96,0x96,0x8C,0x94,0x98,0x87,0x89, + 0x8F,0x91,0x95,0x95,0x9B,0x99,0x8E,0x91,0x8F,0x8D,0x8E,0x8F,0xAB,0xA8,0x90,0xA0, + 0x9C,0x87,0x88,0x92,0x9D,0x9E,0x94,0x9E,0xA2,0x90,0x8E,0x97,0x95,0x92,0x93,0x95, + 0x96,0x89,0x82,0x89,0x84,0x7D,0x82,0x7D,0x88,0x8F,0x71,0x75,0x7A,0x61,0x5E,0x60, + 0x63,0x68,0x5E,0x5E,0x66,0x51,0x49,0x50,0x4C,0x4F,0x52,0x55,0x57,0x50,0x4D,0x4D, + 0x49,0x4C,0x4B,0x62,0x70,0x58,0x62,0x6C,0x59,0x52,0x5D,0x6A,0x6E,0x6B,0x73,0x7E, + 0x71,0x67,0x70,0x73,0x71,0x77,0x7F,0x86,0x80,0x80,0x8A,0x89,0x8E,0x99,0x93,0xA6, + 0xBB,0xA1,0xA0,0xAD,0x94,0x8A,0x91,0x93,0x98,0x94,0x93,0x9E,0x8C,0x80,0x8A,0x85, + 0x82,0x8A,0x8D,0x90,0x8C,0x86,0x89,0x82,0x86,0x85,0x86,0xA3,0x96,0x87,0x9F,0x95, + 0x80,0x85,0x8B,0x91,0x91,0x8D,0x9D,0x9E,0x8A,0x90,0x98,0x8D,0x90,0x96,0x9A,0x9E, + 0x99,0x96,0x97,0x8E,0x8F,0x94,0x89,0xA2,0xAA,0x8F,0x9B,0x9E,0x83,0x80,0x85,0x88, + 0x8C,0x84,0x89,0x8E,0x7A,0x74,0x7B,0x72,0x70,0x75,0x74,0x75,0x6D,0x67,0x66,0x5A, + 0x59,0x58,0x55,0x6E,0x65,0x54,0x69,0x60,0x4B,0x50,0x53,0x56,0x5A,0x56,0x64,0x67, + 0x56,0x5C,0x61,0x58,0x5B,0x66,0x6A,0x6D,0x70,0x71,0x6E,0x6B,0x6D,0x6E,0x66,0x79, + 0x8A,0x73,0x7B,0x88,0x77,0x74,0x7C,0x85,0x8C,0x8C,0x96,0xA5,0x99,0x92,0x9C,0x96, + 0x8F,0x95,0x98,0x98,0x94,0x93,0x94,0x89,0x86,0x89,0x7E,0x8B,0x9D,0x86,0x89,0x97, + 0x82,0x7A,0x81,0x84,0x87,0x88,0x89,0x95,0x8D,0x84,0x8C,0x89,0x85,0x89,0x90,0x93, + 0x8E,0x91,0x92,0x8C,0x8A,0x90,0x8B,0x88,0xA4,0xA2,0x8E,0xA2,0x9D,0x89,0x8D,0x92, + 0x94,0x93,0x91,0x99,0x9A,0x8A,0x8B,0x91,0x87,0x85,0x8C,0x8D,0x88,0x85,0x86,0x81, + 0x79,0x7B,0x79,0x6F,0x82,0x86,0x6F,0x79,0x7A,0x62,0x60,0x66,0x63,0x64,0x63,0x66, + 0x6B,0x5D,0x5A,0x63,0x5A,0x58,0x5F,0x61,0x61,0x61,0x60,0x5E,0x5C,0x5A,0x61,0x5A, + 0x60,0x7B,0x6C,0x67,0x7D,0x6D,0x62,0x6B,0x6C,0x6F,0x70,0x71,0x7B,0x7A,0x70,0x79, + 0x7C,0x77,0x7F,0x86,0x8A,0x8D,0x8E,0x92,0x93,0x8F,0x95,0x93,0x8C,0xA5,0xA5,0x8F, + 0x9D,0x9E,0x86,0x86,0x8A,0x87,0x8A,0x88,0x8C,0x8F,0x81,0x81,0x89,0x81,0x7F,0x87, + 0x89,0x8B,0x8B,0x8A,0x8A,0x86,0x84,0x8A,0x80,0x8A,0xA3,0x90,0x8C,0xA0,0x90,0x82, + 0x8B,0x8D,0x90,0x91,0x90,0x9B,0x96,0x89,0x93,0x96,0x8B,0x92,0x99,0x97,0x96,0x94, + 0x94,0x93,0x8A,0x8E,0x8C,0x84,0x9C,0x9B,0x84,0x92,0x94,0x7B,0x7B,0x80,0x7D,0x80, + 0x7A,0x7D,0x83,0x70,0x6C,0x76,0x6B,0x65,0x6C,0x6B,0x6B,0x6A,0x66,0x65,0x5F,0x5C, + 0x60,0x57,0x64,0x7A,0x60,0x66,0x81,0x5C,0x5B,0x55,0x46,0x65,0x5E,0x4C,0x5E,0x6A, + 0x62,0x72,0x79,0x73,0x74,0x79,0x8E,0x93,0x8B,0x8C,0x99,0x8D,0x7F,0x7A,0x6C,0x90, + 0x91,0x64,0x77,0x83,0x68,0x5E,0x64,0x64,0x6E,0x76,0x85,0x8A,0x6C,0x78,0x89,0x7E, + 0x84,0x92,0xA1,0xB0,0xA3,0x97,0xAB,0xA9,0xBC,0xAF,0x93,0xD5,0xBF,0xA4,0xBA,0xAC, + 0xAA,0x9E,0x95,0x92,0x8D,0x93,0x93,0x83,0x7F,0x6E,0x6D,0x82,0x74,0x85,0x90,0x7D, + 0x84,0x7A,0x78,0x84,0x60,0x52,0x60,0x6D,0x83,0x76,0x70,0x78,0x66,0x64,0x72,0x75, + 0x90,0x91,0x92,0xAC,0xA3,0x91,0x96,0x98,0x94,0xA1,0xB2,0xBE,0xBE,0xA5,0x9D,0xAA, + 0x9B,0x98,0x8D,0x8C,0xA0,0x8C,0x86,0x87,0x7C,0x6C,0x61,0x66,0x69,0x70,0x65,0x56, + 0x4C,0x2B,0x25,0x33,0x33,0x30,0x34,0x3E,0x34,0x35,0x40,0x53,0x56,0x4D,0x57,0x65, + 0x74,0x7E,0x7A,0x79,0x7B,0x6F,0x7D,0x8A,0x8D,0x99,0x97,0x9E,0xBA,0xC4,0xCB,0xD5, + 0xC7,0xC6,0xC6,0xB4,0xB9,0xA5,0x8A,0x99,0x8C,0x8A,0x8A,0x7F,0x8C,0x74,0x5C,0x6F, + 0x77,0x65,0x5D,0x53,0x5A,0x68,0x53,0x57,0x65,0x65,0x68,0x62,0x6A,0x69,0x6C,0x7D, + 0x81,0x7F,0x7C,0x87,0x98,0x95,0x97,0x9B,0x92,0x9F,0x9E,0x9D,0xAA,0xA3,0xA4,0xA2, + 0xAA,0xAF,0xAA,0xB4,0xB0,0xAB,0xB3,0xAB,0xB3,0xB7,0xA6,0xA5,0xA8,0xA3,0x9C,0x91, + 0x87,0x79,0x65,0x66,0x82,0x7B,0x63,0x73,0x75,0x6D,0x62,0x48,0x43,0x4D,0x52,0x60, + 0x61,0x50,0x4E,0x53,0x53,0x55,0x5C,0x5D,0x5E,0x5C,0x5A,0x5B,0x64,0x75,0x68,0x78, + 0x9D,0x98,0x8D,0x7B,0x6D,0x7F,0x84,0x88,0x9A,0x96,0x9D,0x9C,0x82,0x7B,0x7F,0x7E, + 0x8A,0xA1,0x96,0x89,0x91,0x90,0x98,0x95,0x8F,0x9A,0x95,0x9E,0xA1,0x86,0x77,0x6A, + 0x64,0x75,0x84,0x85,0x7C,0x69,0x63,0x69,0x72,0x6C,0x65,0x65,0x74,0x7A,0x62,0x5D, + 0x49,0x52,0x5C,0x54,0x5F,0x57,0x5E,0x6A,0x6C,0x65,0x5F,0x67,0x6C,0x6D,0x7C,0x7E, + 0x74,0x84,0x80,0x84,0x96,0x94,0xA1,0xA5,0xB3,0xBC,0xBA,0xB6,0xBD,0xC4,0xC3,0xCB, + 0xC2,0xC3,0xD3,0xD7,0xCA,0xCE,0xC6,0xB7,0xBA,0xB2,0xAE,0xAB,0xA2,0x9D,0x95,0x8E, + 0x8A,0x8D,0x85,0x85,0x86,0x78,0x6E,0x68,0x6C,0x61,0x57,0x51,0x4C,0x5F,0x65,0x55, + 0x4D,0x4E,0x48,0x46,0x46,0x3A,0x39,0x42,0x48,0x48,0x52,0x51,0x45,0x45,0x46,0x54, + 0x5F,0x52,0x4D,0x56,0x60,0x62,0x5F,0x63,0x63,0x72,0x82,0x75,0x7D,0x82,0x81,0x85, + 0x7A,0x7E,0x8A,0x93,0x9A,0x93,0x8F,0x91,0x91,0x98,0x94,0xA6,0xBB,0xAF,0xA8,0xB2, + 0xB7,0xAB,0xA0,0x8F,0x9D,0xC3,0xBB,0xB0,0xA3,0x98,0xA6,0xAA,0xA7,0x98,0x93,0x9F, + 0xA0,0x9A,0x91,0x92,0x98,0x8F,0x8E,0x85,0x81,0x78,0x61,0x63,0x5E,0x5D,0x61,0x5C, + 0x70,0x85,0x7C,0x69,0x64,0x5F,0x66,0x69,0x62,0x63,0x66,0x6F,0x68,0x62,0x62,0x61, + 0x6A,0x6D,0x73,0x7A,0x78,0x7D,0x7A,0x7A,0x86,0x84,0x7F,0x8C,0xA1,0xAB,0x9D,0x8E, + 0x82,0x83,0x92,0x92,0x95,0x9F,0x9B,0x9F,0x9A,0x90,0x94,0x8C,0x92,0x91,0x85,0x8D, + 0x84,0x84,0x91,0x82,0x7D,0x7E,0x77,0x91,0xA4,0x8A,0x77,0x74,0x6D,0x82,0x8D,0x74, + 0x72,0x78,0x7D,0x89,0x7B,0x72,0x6D,0x63,0x6E,0x6E,0x67,0x6E,0x6A,0x68,0x68,0x6A, + 0x68,0x67,0x70,0x7C,0x86,0x7E,0x73,0x74,0x7C,0x7E,0x78,0x73,0x73,0x7F,0x98,0x94, + 0x81,0x72,0x6C,0x7D,0x7C,0x76,0x65,0x56,0x5B,0x62,0x6D,0x68,0x61,0x67,0x71,0x7F, + 0x87,0x79,0x6D,0x6B,0x75,0x84,0x7E,0x7F,0x89,0x90,0x92,0x95,0x96,0x93,0x99,0x9F, + 0xA0,0x97,0x95,0x98,0x98,0x9D,0xA0,0x97,0x8E,0xA1,0xAE,0xB7,0xB7,0xA8,0xA7,0xA8, + 0xAB,0xAE,0xA2,0x9B,0xA3,0xA8,0xAB,0xA2,0x8E,0x87,0x92,0xA2,0xA8,0x9D,0x9A,0x93, + 0x8B,0x8E,0x8E,0x7A,0x70,0x7D,0x8B,0x90,0x83,0x6E,0x62,0x65,0x6C,0x69,0x62,0x68, + 0x70,0x70,0x6E,0x5C,0x50,0x51,0x4B,0x4D,0x48,0x47,0x4A,0x4C,0x51,0x4C,0x46,0x41, + 0x46,0x53,0x62,0x6C,0x58,0x48,0x49,0x4E,0x5F,0x67,0x67,0x6D,0x6E,0x77,0x81,0x78, + 0x70,0x70,0x70,0x75,0x7C,0x81,0x7A,0x7A,0x82,0x84,0x87,0x88,0x89,0x8E,0x90,0x8D, + 0x8D,0x86,0x87,0x8F,0x8A,0x8E,0x96,0x93,0x97,0x9D,0x99,0x98,0x93,0x94,0x95,0x89, + 0x85,0x8A,0x8B,0x94,0x9A,0x95,0x97,0x93,0x97,0xA8,0xB1,0xB7,0xB1,0xAB,0xA2,0xA1, + 0x9F,0x98,0xA4,0xAA,0xA3,0xA5,0xA4,0xA5,0xA6,0x9D,0x93,0x88,0x82,0x85,0x84,0x85, + 0x86,0x81,0x83,0x84,0x80,0x85,0x8D,0x8D,0x8B,0x81,0x76,0x76,0x76,0x6C,0x6B,0x72, + 0x6A,0x65,0x61,0x65,0x6F,0x6D,0x66,0x5B,0x5A,0x58,0x5D,0x5C,0x4E,0x53,0x56,0x56, + 0x5D,0x5A,0x5A,0x61,0x60,0x6B,0x6C,0x63,0x64,0x5F,0x5E,0x62,0x62,0x59,0x52,0x55, + 0x60,0x65,0x61,0x65,0x62,0x6A,0x76,0x74,0x6D,0x6D,0x75,0x78,0x82,0x84,0x8A,0x92, + 0x92,0x9B,0x91,0x88,0x8D,0x90,0x95,0x94,0x95,0x90,0x86,0x8C,0x96,0x9C,0x9C,0x93, + 0x8E,0x96,0x9D,0x98,0x92,0x94,0x93,0x9D,0xA1,0x97,0x95,0x9A,0xA2,0xA3,0x9E,0x96, + 0x96,0x9A,0x9C,0x9F,0x94,0x92,0x94,0x93,0x93,0x94,0x95,0x8D,0x8E,0x8F,0x98,0x99, + 0x93,0x98,0x92,0x93,0x9B,0x95,0x91,0x94,0x95,0x92,0x8D,0x8D,0x8A,0x8A,0x8D,0x89, + 0x87,0x85,0x84,0x7E,0x71,0x74,0x72,0x6D,0x6F,0x6E,0x6F,0x67,0x6D,0x70,0x66,0x70, + 0x6F,0x69,0x69,0x63,0x63,0x5D,0x61,0x5E,0x59,0x60,0x60,0x63,0x61,0x62,0x63,0x5F, + 0x62,0x5C,0x61,0x68,0x66,0x66,0x63,0x5F,0x68,0x6E,0x6C,0x6E,0x69,0x6B,0x72,0x76, + 0x77,0x6E,0x6B,0x76,0x78,0x77,0x77,0x71,0x72,0x79,0x7F,0x85,0x85,0x84,0x8A,0x8E, + 0x8F,0x8C,0x8D,0x8F,0x8C,0x92,0x96,0x93,0x91,0x8F,0x94,0x96,0x94,0x96,0x94,0x8E, + 0x97,0x9F,0x99,0x95,0x95,0x97,0x99,0xA1,0x9E,0x95,0x94,0x9A,0x9E,0x9C,0x99,0x97, + 0x96,0x95,0x9B,0x9B,0x95,0x95,0x91,0x93,0x99,0x96,0x95,0x97,0x94,0x99,0x98,0x98, + 0x97,0x97,0x9E,0x9D,0x9D,0x99,0x94,0x95,0x94,0x90,0x8C,0x88,0x84,0x86,0x87,0x84, + 0x84,0x80,0x80,0x85,0x81,0x81,0x7F,0x7B,0x7B,0x72,0x72,0x72,0x70,0x72,0x75,0x77, + 0x74,0x75,0x70,0x6D,0x73,0x6D,0x69,0x68,0x64,0x64,0x60,0x59,0x59,0x5F,0x64,0x60, + 0x5E,0x61,0x64,0x65,0x61,0x5F,0x5C,0x60,0x69,0x68,0x6E,0x6B,0x60,0x67,0x67,0x68, + 0x70,0x69,0x63,0x68,0x6A,0x6D,0x6B,0x65,0x66,0x69,0x70,0x75,0x6D,0x6A,0x6C,0x70, + 0x76,0x76,0x74,0x79,0x7E,0x83,0x83,0x7F,0x82,0x85,0x8D,0x95,0x91,0x91,0x92,0x8C, + 0x94,0x95,0x8D,0x8D,0x8B,0x88,0x8E,0x8E,0x86,0x86,0x88,0x8D,0x95,0x92,0x91,0x94, + 0x94,0x9A,0x9C,0x9B,0x99,0x94,0x9A,0x9E,0x9B,0x9A,0x93,0x90,0x92,0x97,0x9A,0x96, + 0x94,0x92,0x91,0x96,0x91,0x8B,0x8A,0x8A,0x92,0x8E,0x8A,0x88,0x87,0x90,0x8E,0x8C, + 0x91,0x90,0x94,0x8E,0x89,0x8E,0x8E,0x8B,0x8B,0x89,0x8A,0x89,0x80,0x7F,0x83,0x7E, + 0x7A,0x7A,0x77,0x76,0x74,0x6E,0x71,0x74,0x70,0x73,0x75,0x75,0x7B,0x7A,0x7A,0x7F, + 0x7D,0x7C,0x7E,0x7B,0x78,0x79,0x77,0x76,0x78,0x78,0x7A,0x78,0x74,0x7A,0x79,0x75, + 0x77,0x6F,0x70,0x75,0x75,0x76,0x71,0x6E,0x73,0x75,0x75,0x76,0x72,0x75,0x7C,0x7E, + 0x7B,0x79,0x74,0x76,0x7A,0x77,0x75,0x76,0x76,0x78,0x76,0x74,0x73,0x6F,0x6F,0x74, + 0x74,0x74,0x72,0x6F,0x74,0x79,0x79,0x77,0x75,0x74,0x7B,0x81,0x7E,0x7D,0x79,0x7A, + 0x80,0x78,0x7B,0x83,0x7A,0x7B,0x7F,0x76,0x81,0x81,0x74,0x81,0x82,0x80,0x89,0x75, + 0x74,0x85,0x7B,0x80,0x80,0x76,0x86,0x89,0x87,0x89,0x81,0x89,0x87,0x82,0x86,0x82, + 0x7D,0x80,0x93,0x8E,0x84,0x91,0x86,0x8A,0x8D,0x73,0x7D,0x80,0x7C,0x86,0x7B,0x7B, + 0x86,0x89,0x89,0x86,0x87,0x86,0x87,0x83,0x80,0x85,0x80,0x7F,0x83,0x83,0x84,0x75, + 0x7F,0x99,0x8C,0x8C,0x8C,0x83,0x90,0x84,0x75,0x7C,0x7C,0x7D,0x7D,0x7E,0x84,0x8D, + 0x8C,0x81,0x85,0x89,0x87,0x85,0x78,0x7C,0x88,0x84,0x82,0x81,0x7E,0x77,0x7C,0x93, + 0x8C,0x81,0x88,0x83,0x86,0x83,0x6F,0x74,0x7B,0x79,0x80,0x83,0x84,0x8E,0x90,0x86, + 0x88,0x88,0x84,0x81,0x7B,0x80,0x88,0x82,0x80,0x84,0x80,0x73,0x78,0x93,0x8F,0x87, + 0x8B,0x84,0x88,0x81,0x6C,0x74,0x7D,0x79,0x79,0x78,0x7D,0x8A,0x87,0x7A,0x7E,0x82, + 0x81,0x7E,0x78,0x7A,0x81,0x7E,0x7D,0x7C,0x7B,0x74,0x71,0x8D,0x93,0x83,0x87,0x83, + 0x85,0x86,0x71,0x71,0x7D,0x7C,0x79,0x78,0x7B,0x89,0x8A,0x7D,0x83,0x89,0x83,0x7B, + 0x75,0x7C,0x82,0x79,0x78,0x7F,0x7F,0x74,0x78,0x94,0x8D,0x82,0x8C,0x86,0x8C,0x80, + 0x6A,0x79,0x7F,0x75,0x75,0x76,0x7D,0x8C,0x85,0x7D,0x89,0x8B,0x83,0x7B,0x76,0x80, + 0x80,0x76,0x7B,0x80,0x7C,0x6E,0x7C,0x99,0x8B,0x85,0x89,0x84,0x8D,0x7B,0x6E,0x7F, + 0x7B,0x77,0x75,0x77,0x86,0x8A,0x7D,0x7D,0x8A,0x86,0x80,0x7A,0x77,0x81,0x7A,0x74, + 0x7D,0x7D,0x79,0x70,0x83,0x94,0x83,0x86,0x87,0x89,0x91,0x72,0x71,0x85,0x79,0x78, + 0x77,0x79,0x89,0x87,0x7B,0x82,0x89,0x84,0x7F,0x7C,0x82,0x86,0x77,0x77,0x82,0x80, + 0x7C,0x77,0x8B,0x92,0x80,0x8A,0x88,0x8A,0x8C,0x74,0x7E,0x88,0x7D,0x7D,0x79,0x7D, + 0x88,0x80,0x7B,0x84,0x88,0x87,0x85,0x7F,0x86,0x84,0x76,0x80,0x84,0x81,0x80,0x7C, + 0x91,0x8B,0x7D,0x89,0x85,0x8A,0x8A,0x79,0x83,0x87,0x7F,0x80,0x7C,0x7D,0x84,0x7B, + 0x7A,0x83,0x82,0x83,0x82,0x7E,0x82,0x7F,0x7D,0x82,0x7F,0x80,0x80,0x82,0x89,0x81, + 0x81,0x84,0x80,0x86,0x84,0x80,0x87,0x83,0x7E,0x80,0x7E,0x81,0x81,0x7D,0x7E,0x7F, + 0x80,0x80,0x7E,0x7F,0x7F,0x7E,0x80,0x81,0x82,0x82,0x81,0x80,0x82,0x81,0x80,0x81, + 0x81,0x84,0x83,0x80,0x82,0x80,0x7F,0x7F,0x7D,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7E, + 0x7D,0x7C,0x7F,0x81,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x80,0x81,0x81,0x83,0x81, + 0x81,0x81,0x7F,0x81,0x82,0x80,0x81,0x81,0x80,0x81,0x7F,0x7E,0x7F,0x7F,0x7F,0x80, + 0x7E,0x7F,0x80,0x7F,0x7E,0x7E,0x7F,0x80,0x80,0x81,0x81,0x80,0x80,0x7F,0x7E,0x7F, + 0x7F,0x7E,0x7F,0x80,0x80,0x7E,0x7E,0x7E,0x7E,0x7E,0x7D,0x7D,0x7D,0x7C,0x7D,0x7C, + 0x7C,0x7D,0x7C,0x7F,0x81,0x82,0x82,0x82,0x81,0x84,0x84,0x84,0x82,0x80,0x82,0x82, + 0x83,0x82,0x81,0x81,0x81,0x81,0x80,0x7E,0x7E,0x7E,0x7E,0x7E,0x7D,0x7A,0x7A,0x7B, + 0x7C,0x7C,0x7B,0x7D,0x7F,0x7D,0x7F,0x7D,0x7E,0x7E,0x7D,0x80,0x7F,0x80,0x80,0x7F, + 0x7F,0x80,0x80,0x81,0x81,0x7F,0x80,0x80,0x7E,0x7D,0x7D,0x7E,0x7E,0x7E,0x7D,0x7E, + 0x7E,0x7E,0x7E,0x7F,0x7E,0x7D,0x7F,0x7F,0x7F,0x7F,0x7F,0x80,0x81,0x80,0x81,0x81, + 0x81,0x81,0x81,0x82,0x82,0x82,0x81,0x80,0x81,0x7F,0x7F,0x7F,0x7F,0x80,0x7F,0x7E, + 0x7D,0x7E,0x7F,0x7E,0x7F,0x80,0x7F,0x80,0x81,0x80,0x81,0x81,0x7F,0x80,0x80,0x80, + 0x80,0x80,0x7F,0x81,0x81,0x80,0x80,0x80,0x80,0x80,0x7F,0x7E,0x7D,0x7E,0x7F,0x7F, + 0x7E,0x7E,0x7F,0x7F,0x7F,0x7F,0x80,0x81,0x81,0x81,0x80,0x7F,0x7F,0x80,0x80,0x7F, + 0x7F,0x80,0x81,0x83,0x84,0x8C,0x8C,0x92,0x92,0x84,0x7E,0x7A,0x7D,0x7B,0x7A,0x75, + 0x7B,0x66,0x73,0x8F,0x73,0x79,0x7E,0x7C,0x6F,0x72,0x80,0x74,0x7E,0x7D,0x79,0x7B, + 0x7A,0x82,0x77,0x78,0x7B,0x75,0x72,0x77,0x81,0x79,0x85,0x80,0x74,0x82,0x81,0x7A, + 0x82,0x92,0x89,0x8A,0x8E,0x81,0x99,0xA5,0x9A,0xA6,0xA4,0x96,0x9D,0xA8,0x95,0x84, + 0x90,0x97,0x9B,0x98,0x87,0x85,0x80,0x7E,0x7C,0x73,0x78,0x81,0x7C,0x76,0x77,0x76, + 0x78,0x73,0x71,0x74,0x67,0x65,0x66,0x63,0x6D,0x7A,0x79,0x76,0x7A,0x73,0x6D,0x70, + 0x69,0x6C,0x70,0x66,0x66,0x65,0x65,0x72,0x6C,0x68,0x6E,0x64,0x6E,0x77,0x76,0x85, + 0x93,0xA8,0xB3,0xA3,0x9D,0x99,0x87,0x92,0x8D,0x8B,0x9E,0x86,0x89,0x98,0x8B,0x89, + 0x71,0x74,0x8A,0x6A,0x6D,0x80,0x78,0x82,0x7F,0x86,0x97,0x88,0x83,0x90,0x8B,0x83, + 0x7D,0x7B,0x7F,0x7A,0x71,0x7B,0x98,0x8C,0x89,0xA0,0x99,0x89,0x7C,0x7E,0x85,0x79, + 0x79,0x88,0x92,0x8C,0x84,0x95,0xA2,0x95,0x90,0x96,0x91,0x8B,0x8F,0x95,0x8F,0x8D, + 0x8D,0x91,0xA5,0x8E,0x87,0x95,0x87,0x7A,0x70,0x76,0x7D,0x70,0x6F,0x7C,0x7B,0x75, + 0x72,0x7D,0x79,0x62,0x67,0x6C,0x5E,0x5E,0x68,0x6D,0x67,0x63,0x62,0x69,0x76,0x63, + 0x63,0x72,0x5E,0x56,0x56,0x5E,0x66,0x54,0x62,0x6F,0x61,0x69,0x71,0x7B,0x80,0x78, + 0x8D,0x9C,0x9A,0x9E,0x9B,0x9A,0x90,0x8D,0x8F,0x88,0x95,0x91,0x89,0x92,0x84,0x77, + 0x7B,0x77,0x81,0x82,0x7B,0x91,0x89,0x83,0x91,0x8B,0x86,0x83,0x84,0x84,0x83,0x8D, + 0x8C,0x88,0x85,0x86,0x7B,0x87,0xA2,0x8B,0x92,0xA4,0x8F,0x88,0x80,0x82,0x8F,0x80, + 0x89,0xA0,0x99,0x9A,0xA6,0xA4,0x9E,0x92,0x93,0x94,0x90,0x98,0x98,0x97,0x91,0x8E, + 0x96,0x86,0x96,0xA4,0x85,0x8D,0x8C,0x79,0x7A,0x72,0x7A,0x83,0x78,0x80,0x85,0x77, + 0x77,0x73,0x66,0x68,0x61,0x62,0x68,0x66,0x6E,0x68,0x58,0x5A,0x58,0x4A,0x6A,0x6F, + 0x53,0x69,0x64,0x4E,0x50,0x4D,0x5B,0x57,0x52,0x67,0x67,0x64,0x73,0x7A,0x78,0x7C, + 0x87,0x95,0x99,0x9C,0xA3,0x98,0x8B,0x87,0x87,0x7F,0x85,0xA2,0x8A,0x85,0x99,0x81, + 0x76,0x77,0x78,0x82,0x7B,0x80,0x90,0x86,0x84,0x8A,0x81,0x80,0x80,0x7E,0x84,0x85, + 0x87,0x8F,0x86,0x82,0x89,0x7F,0x93,0xA2,0x8B,0x9A,0x9F,0x86,0x8C,0x88,0x8A,0x93, + 0x8B,0x9E,0xA8,0x9D,0xA3,0xA6,0x99,0x93,0x90,0x8F,0x92,0x95,0x9D,0x9E,0x92,0x90, + 0x95,0x84,0x8D,0x9D,0x88,0x8C,0x92,0x80,0x77,0x75,0x78,0x75,0x6D,0x78,0x82,0x6F, + 0x6E,0x78,0x64,0x63,0x63,0x62,0x60,0x59,0x63,0x63,0x59,0x58,0x58,0x4E,0x67,0x67, + 0x53,0x6F,0x64,0x4E,0x57,0x4E,0x4D,0x55,0x51,0x65,0x66,0x5F,0x72,0x76,0x75,0x81, + 0x8B,0x8E,0x94,0x9C,0xA0,0x95,0x8C,0x90,0x88,0x7B,0x98,0x9A,0x81,0x9E,0x94,0x79, + 0x81,0x7B,0x7B,0x78,0x78,0x88,0x86,0x80,0x8A,0x85,0x7D,0x7F,0x84,0x83,0x80,0x8A, + 0x8B,0x87,0x7F,0x89,0x83,0x81,0xA6,0x92,0x90,0xA7,0x90,0x89,0x90,0x8C,0x90,0x90, + 0x98,0xA7,0x9D,0xA0,0xAB,0x9C,0x96,0x9F,0x99,0x97,0x9A,0x9E,0x9E,0x98,0x93,0x95, + 0x87,0x8E,0xA5,0x86,0x92,0xA0,0x7F,0x80,0x81,0x76,0x74,0x70,0x78,0x7B,0x68,0x6F, + 0x73,0x60,0x61,0x65,0x5C,0x58,0x60,0x5F,0x5E,0x56,0x57,0x58,0x4C,0x69,0x69,0x53, + 0x71,0x6C,0x4F,0x59,0x58,0x4D,0x50,0x55,0x61,0x62,0x60,0x70,0x75,0x67,0x7A,0x84, + 0x80,0x8F,0x96,0x99,0x95,0x90,0x93,0x8A,0x85,0xA3,0x95,0x89,0xA2,0x90,0x7A,0x86, + 0x84,0x76,0x77,0x7E,0x88,0x81,0x80,0x90,0x85,0x7B,0x8A,0x84,0x7A,0x84,0x8A,0x8A, + 0x87,0x89,0x8E,0x80,0x8A,0xA5,0x8E,0x94,0xAD,0x90,0x89,0x98,0x90,0x8B,0x8F,0x9A, + 0x9F,0x98,0x9E,0xA9,0x98,0x96,0xA8,0x9D,0x95,0x9F,0xA1,0x9A,0x94,0x98,0x93,0x83, + 0x9F,0xA8,0x88,0x9E,0xA7,0x83,0x84,0x8B,0x77,0x75,0x79,0x7A,0x77,0x6F,0x74,0x75, + 0x62,0x66,0x6A,0x5B,0x5A,0x5F,0x62,0x5B,0x57,0x5E,0x58,0x50,0x6D,0x67,0x54,0x6C, + 0x62,0x4A,0x57,0x56,0x4C,0x4F,0x58,0x61,0x5F,0x5F,0x6D,0x6D,0x66,0x79,0x82,0x7C, + 0x89,0x93,0x97,0x98,0x92,0x98,0x8E,0x8D,0xA9,0x94,0x8F,0xA7,0x8F,0x7F,0x8B,0x81, + 0x76,0x79,0x7F,0x84,0x80,0x80,0x8C,0x83,0x77,0x87,0x86,0x7B,0x81,0x89,0x87,0x83, + 0x85,0x89,0x7E,0x8D,0xA7,0x8D,0x97,0xAA,0x8D,0x87,0x94,0x8D,0x8A,0x8F,0x99,0x9F, + 0x98,0x9C,0xA6,0x98,0x93,0xA0,0x9B,0x97,0x9B,0x9D,0x9D,0x97,0x93,0x97,0x88,0x94, + 0xAB,0x91,0x96,0xA5,0x88,0x80,0x8A,0x7D,0x76,0x79,0x7B,0x7E,0x74,0x6F,0x78,0x6B, + 0x63,0x6A,0x67,0x62,0x63,0x65,0x60,0x57,0x55,0x5B,0x4D,0x5B,0x6F,0x57,0x61,0x70, + 0x54,0x4D,0x58,0x50,0x4E,0x52,0x59,0x62,0x5C,0x60,0x6E,0x69,0x68,0x77,0x7D,0x82, + 0x88,0x93,0x99,0x93,0x91,0x96,0x88,0x95,0xAB,0x8D,0x96,0xA3,0x83,0x7B,0x84,0x7C, + 0x7B,0x7C,0x7E,0x8B,0x80,0x7B,0x88,0x80,0x77,0x7F,0x83,0x80,0x81,0x85,0x89,0x7E, + 0x7E,0x87,0x7B,0x90,0xA7,0x8C,0x99,0xAA,0x8C,0x89,0x95,0x91,0x94,0x91,0x96,0xA5, + 0x98,0x91,0xA1,0x9D,0x94,0x98,0x9F,0x9E,0x99,0x9C,0x9F,0x95,0x90,0x95,0x8A,0x9C, + 0xAF,0x94,0x9B,0xAA,0x8B,0x7E,0x84,0x7F,0x80,0x7B,0x79,0x83,0x77,0x69,0x73,0x70, + 0x64,0x62,0x68,0x6B,0x62,0x61,0x66,0x5E,0x56,0x56,0x51,0x62,0x75,0x5A,0x5F,0x6F, + 0x56,0x4A,0x4F,0x53,0x59,0x54,0x58,0x6A,0x64,0x5F,0x6A,0x72,0x74,0x74,0x82,0x90, + 0x92,0x93,0x96,0x96,0x95,0x92,0x8B,0xA0,0xB3,0x95,0x95,0x9D,0x8B,0x7D,0x76,0x7F, + 0x87,0x7C,0x77,0x85,0x82,0x78,0x79,0x7C,0x7F,0x7C,0x7B,0x80,0x82,0x7E,0x7D,0x7F, + 0x82,0x83,0x7A,0x90,0xA5,0x8F,0x8E,0x99,0x92,0x8A,0x87,0x92,0x9D,0x99,0x96,0x9C, + 0x9E,0x9B,0x94,0x93,0x9D,0x9B,0x97,0x98,0x9C,0x9C,0x95,0x94,0x94,0x93,0x8F,0xA2, + 0xAE,0x98,0x98,0x98,0x8B,0x84,0x7A,0x7E,0x86,0x80,0x78,0x76,0x78,0x77,0x6E,0x69, + 0x6B,0x70,0x6D,0x64,0x65,0x64,0x5F,0x5A,0x57,0x57,0x57,0x70,0x75,0x60,0x64,0x60, + 0x53,0x4F,0x4D,0x59,0x61,0x5F,0x5D,0x5D,0x65,0x67,0x65,0x69,0x74,0x83,0x81,0x83, + 0x8E,0x90,0x91,0x91,0x90,0x8C,0x97,0xB0,0xA4,0x92,0x92,0x8E,0x87,0x7D,0x78,0x80, + 0x8A,0x85,0x78,0x77,0x7D,0x7C,0x76,0x72,0x79,0x83,0x7C,0x76,0x78,0x7C,0x7B,0x78, + 0x77,0x76,0x8C,0xA1,0x97,0x8B,0x89,0x8C,0x8E,0x87,0x85,0x91,0x9F,0x9F,0x96,0x93, + 0x98,0x9D,0x97,0x90,0x98,0xA3,0x9E,0x9A,0x95,0x96,0x96,0x94,0x90,0x8F,0xA6,0xB1, + 0xA1,0x94,0x8B,0x8A,0x8D,0x81,0x7A,0x82,0x8A,0x85,0x79,0x74,0x74,0x76,0x6E,0x65, + 0x6A,0x6E,0x6D,0x68,0x5F,0x5D,0x5C,0x59,0x52,0x58,0x6F,0x75,0x6A,0x5D,0x53,0x57, + 0x58,0x53,0x52,0x59,0x66,0x67,0x62,0x5F,0x63,0x6B,0x6D,0x70,0x79,0x80,0x88,0x8C, + 0x8D,0x8E,0x8D,0x8F,0x8D,0x9D,0xAF,0xAA,0xA2,0x93,0x88,0x8A,0x85,0x80,0x7E,0x7F, + 0x85,0x84,0x7C,0x76,0x76,0x77,0x74,0x76,0x79,0x7A,0x7E,0x7A,0x78,0x76,0x74,0x73, + 0x75,0x8D,0x9D,0x98,0x90,0x83,0x7F,0x88,0x88,0x88,0x8B,0x90,0x97,0x9C,0x99,0x94, + 0x90,0x92,0x96,0x97,0x99,0x9B,0x9A,0x9A,0x9A,0x93,0x91,0x8C,0x91,0xA7,0xAF,0xA8, + 0x9C,0x8B,0x83,0x88,0x85,0x83,0x84,0x80,0x81,0x83,0x80,0x79,0x72,0x6E,0x6F,0x70, + 0x6F,0x6D,0x66,0x66,0x64,0x5E,0x5C,0x56,0x5A,0x6E,0x73,0x6B,0x65,0x57,0x50,0x56, + 0x54,0x56,0x59,0x56,0x5D,0x62,0x65,0x69,0x68,0x6A,0x6F,0x77,0x7D,0x81,0x87,0x8B, + 0x8E,0x91,0x94,0x93,0x92,0x9B,0x9E,0x95,0x97,0x92,0x88,0x8C,0x87,0x82,0x83,0x7B, + 0x79,0x7A,0x77,0x77,0x73,0x70,0x70,0x70,0x73,0x74,0x74,0x75,0x76,0x79,0x7B,0x79, + 0x7A,0x81,0x87,0x86,0x87,0x8B,0x88,0x8D,0x8F,0x8C,0x92,0x8F,0x8E,0x93,0x91,0x91, + 0x93,0x90,0x90,0x91,0x94,0x97,0x97,0x99,0x96,0x9A,0x9C,0x97,0x96,0x97,0x9C,0x9B, + 0x95,0x96,0x90,0x8E,0x90,0x88,0x89,0x85,0x7E,0x7F,0x7B,0x75,0x75,0x70,0x6E,0x6E, + 0x6D,0x6C,0x6A,0x68,0x66,0x66,0x68,0x65,0x63,0x60,0x63,0x69,0x63,0x63,0x63,0x5F, + 0x66,0x65,0x63,0x6A,0x66,0x64,0x6A,0x69,0x6D,0x70,0x70,0x77,0x7E,0x83,0x89,0x8C, + 0x8F,0x92,0x96,0x98,0x97,0x94,0x92,0x98,0x96,0x8F,0x91,0x8B,0x85,0x8A,0x83,0x7E, + 0x80,0x76,0x72,0x74,0x6E,0x70,0x70,0x6C,0x70,0x71,0x73,0x77,0x77,0x79,0x7D,0x7F, + 0x82,0x82,0x84,0x84,0x88,0x8C,0x8C,0x8F,0x8F,0x8D,0x94,0x95,0x93,0x95,0x90,0x90, + 0x94,0x8F,0x91,0x92,0x8E,0x92,0x95,0x93,0x97,0x95,0x95,0x99,0x98,0x98,0x9A,0x99, + 0x96,0x93,0x94,0x93,0x8D,0x8C,0x8B,0x87,0x89,0x84,0x80,0x80,0x7B,0x79,0x77,0x72, + 0x73,0x6F,0x6A,0x6C,0x67,0x66,0x6A,0x65,0x66,0x69,0x68,0x69,0x68,0x68,0x69,0x67, + 0x6A,0x6D,0x6B,0x6F,0x70,0x6D,0x73,0x75,0x76,0x7B,0x7C,0x7E,0x84,0x85,0x87,0x8A, + 0x89,0x8B,0x8B,0x8A,0x8A,0x88,0x8C,0x8D,0x87,0x89,0x8B,0x86,0x86,0x86,0x83,0x84, + 0x84,0x82,0x80,0x80,0x7D,0x7C,0x7D,0x7C,0x7C,0x7D,0x7B,0x7A,0x7B,0x79,0x79,0x7B, + 0x7B,0x7D,0x7F,0x80,0x80,0x82,0x85,0x86,0x89,0x89,0x8A,0x8D,0x8E,0x8D,0x8E,0x8E, + 0x8E,0x8F,0x8E,0x8F,0x8F,0x8F,0x8F,0x8D,0x8E,0x8E,0x8B,0x8C,0x8C,0x8B,0x8B,0x8B, + 0x88,0x86,0x86,0x84,0x85,0x87,0x84,0x85,0x86,0x84,0x83,0x82,0x81,0x82,0x81,0x80, + 0x7E,0x7D,0x7D,0x7B,0x7A,0x7A,0x79,0x79,0x79,0x78,0x77,0x76,0x76,0x75,0x74,0x74, + 0x75,0x76,0x78,0x78,0x79,0x79,0x7B,0x7B,0x7C,0x7F,0x80,0x81,0x83,0x84,0x84,0x85, + 0x84,0x85,0x85,0x85,0x84,0x84,0x84,0x82,0x80,0x80,0x7F,0x7D,0x7D,0x7C,0x7B,0x7B, + 0x7A,0x79,0x79,0x77,0x78,0x79,0x77,0x77,0x78,0x78,0x79,0x77,0x77,0x78,0x79,0x7B, + 0x7B,0x7C,0x7E,0x7E,0x7E,0x80,0x80,0x80,0x82,0x83,0x83,0x85,0x85,0x85,0x85,0x84, + 0x84,0x86,0x87,0x85,0x86,0x86,0x86,0x85,0x84,0x84,0x84,0x85,0x85,0x86,0x88,0x87, + 0x85,0x86,0x84,0x85,0x85,0x84,0x85,0x83,0x84,0x84,0x82,0x82,0x82,0x81,0x82,0x83, + 0x82,0x81,0x81,0x80,0x7E,0x7F,0x7E,0x7D,0x7E,0x7E,0x7D,0x7D,0x7D,0x7C,0x7D,0x7C, + 0x7C,0x7D,0x7E,0x7E,0x7E,0x7E,0x7D,0x7F,0x7F,0x7E,0x80,0x82,0x83,0x84,0x83,0x83, + 0x82,0x82,0x84,0x83,0x82,0x83,0x83,0x82,0x81,0x80,0x7F,0x80,0x7F,0x7F,0x7F,0x7F, + 0x7D,0x7C,0x7C,0x7B,0x7B,0x7B,0x7A,0x7A,0x7A,0x7A,0x7A,0x7B,0x7A,0x78,0x7B,0x7C, + 0x7A,0x7C,0x7D,0x7C,0x7C,0x7D,0x7C,0x7C,0x7E,0x7E,0x7E,0x7F,0x80,0x7F,0x80,0x81, + 0x81,0x81,0x83,0x83,0x82,0x80,0x84,0x84,0x83,0x83,0x82,0x83,0x83,0x94,0x85,0x87, + 0x85,0x61,0x7D,0x7F,0x68,0x66,0x76,0x7E,0x85,0x8B,0x8A,0x8B,0x85,0x93,0xA1,0x9C, + 0x98,0x91,0x8D,0x8A,0x83,0x81,0x7C,0x70,0x66,0x5B,0x55,0x54,0x51,0x50,0x53,0x59, + 0x60,0x67,0x6B,0x71,0x75,0x77,0x7C,0x81,0x83,0x85,0x89,0x8C,0x8C,0x91,0x9E,0xA7, + 0xB0,0xB8,0xB8,0xB9,0xB6,0xAE,0xAA,0xA2,0x9A,0x96,0x8F,0x8A,0x86,0x81,0x7F,0x79, + 0x76,0x73,0x6F,0x6D,0x69,0x68,0x65,0x63,0x60,0x57,0x51,0x49,0x46,0x46,0x45,0x47, + 0x4D,0x54,0x5B,0x62,0x67,0x6C,0x72,0x75,0x7A,0x81,0x83,0x85,0x89,0x8D,0x8D,0x91, + 0x94,0x9B,0xA8,0xAE,0xB2,0xB7,0xB9,0xB7,0xB5,0xB3,0xAF,0xAC,0xA4,0x9F,0x9B,0x91, + 0x8E,0x89,0x86,0x83,0x7E,0x7D,0x78,0x6F,0x69,0x61,0x59,0x58,0x52,0x4E,0x51,0x50, + 0x52,0x55,0x5B,0x63,0x68,0x6D,0x70,0x76,0x7E,0x86,0x8A,0x8F,0x93,0x94,0x96,0x97, + 0x9D,0x9F,0x9C,0xA0,0xA3,0x9A,0x98,0xA1,0xA7,0xAA,0xA7,0xA0,0x98,0x92,0x8E,0x88, + 0x83,0x7A,0x7B,0x7A,0x77,0x7C,0x78,0x74,0x75,0x76,0x73,0x72,0x6F,0x6E,0x6B,0x65, + 0x65,0x62,0x5F,0x61,0x5F,0x5D,0x5B,0x5A,0x5F,0x5C,0x60,0x65,0x62,0x67,0x69,0x6E, + 0x75,0x76,0x79,0x7F,0x7F,0x85,0x8B,0x8D,0x93,0x9A,0x9E,0xA6,0xB0,0xB0,0xB5,0xBA, + 0xBB,0xC0,0xC0,0xBE,0xBC,0xBB,0xB6,0xB1,0xAC,0xA2,0x9D,0x96,0x8F,0x8B,0x84,0x7F, + 0x7B,0x74,0x70,0x6B,0x64,0x61,0x61,0x5E,0x58,0x54,0x52,0x4E,0x4C,0x4D,0x4A,0x4E, + 0x4E,0x49,0x4B,0x50,0x55,0x5A,0x61,0x65,0x6A,0x70,0x70,0x76,0x7C,0x7B,0x81,0x8A, + 0x91,0x94,0x96,0x9C,0xA3,0xAA,0xAC,0xB4,0xBC,0xBB,0xBE,0xC0,0xC0,0xC3,0xC2,0xBF, + 0xC1,0xBE,0xBD,0xBB,0xB5,0xB3,0xAE,0xA5,0xA0,0x9C,0x95,0x8B,0x83,0x7A,0x77,0x72, + 0x6A,0x67,0x5D,0x5F,0x64,0x57,0x56,0x54,0x4F,0x54,0x46,0x3C,0x44,0x44,0x42,0x43, + 0x45,0x4F,0x55,0x55,0x57,0x5C,0x60,0x60,0x5B,0x5D,0x68,0x68,0x67,0x6E,0x6F,0x82, + 0x92,0x8A,0x8F,0x96,0x95,0x9B,0x91,0x91,0x9F,0xA0,0xA2,0xA8,0xAA,0xB2,0xB5,0xAC, + 0xAD,0xB2,0xAD,0xAA,0xA4,0xA6,0xAE,0xA6,0xA3,0xA1,0x9E,0xAF,0xAD,0x9D,0xA4,0xA4, + 0x9A,0x92,0x83,0x88,0x8E,0x7C,0x7B,0x80,0x7D,0x80,0x75,0x67,0x6D,0x67,0x5A,0x5A, + 0x58,0x5A,0x58,0x52,0x54,0x54,0x58,0x62,0x5D,0x5B,0x62,0x60,0x5C,0x59,0x56,0x5E, + 0x5F,0x5A,0x62,0x67,0x6C,0x72,0x6A,0x70,0x7A,0x74,0x76,0x7E,0x81,0x87,0x88,0x8A, + 0x93,0x8F,0x9B,0xAC,0xA2,0xA8,0xAF,0xA9,0xAB,0x9F,0x9D,0xAF,0xA8,0xA2,0xAC,0xAC, + 0xB3,0xB0,0xA2,0xA7,0xA6,0x97,0x95,0x94,0x93,0x90,0x85,0x84,0x84,0x73,0x7D,0x8A, + 0x75,0x77,0x78,0x6E,0x6A,0x55,0x56,0x62,0x54,0x4F,0x59,0x59,0x5D,0x56,0x51,0x5F, + 0x5A,0x50,0x58,0x5E,0x60,0x61,0x61,0x68,0x69,0x60,0x77,0x86,0x77,0x80,0x85,0x85, + 0x85,0x72,0x7D,0x89,0x7C,0x80,0x8C,0x90,0x94,0x8C,0x8C,0x96,0x8C,0x85,0x8B,0x8C, + 0x8B,0x89,0x89,0x8D,0x89,0x80,0x96,0x9F,0x8F,0x98,0x9B,0x98,0x91,0x81,0x8E,0x94, + 0x84,0x89,0x95,0x96,0x93,0x8A,0x8B,0x8F,0x83,0x7C,0x82,0x82,0x81,0x81,0x82,0x84, + 0x7E,0x77,0x8B,0x93,0x80,0x89,0x8C,0x84,0x7B,0x6C,0x7B,0x7E,0x6C,0x73,0x7E,0x7F, + 0x7A,0x76,0x7A,0x7A,0x6B,0x69,0x6D,0x68,0x67,0x68,0x6B,0x69,0x64,0x62,0x77,0x76, + 0x64,0x71,0x74,0x69,0x5E,0x5A,0x6C,0x67,0x5B,0x6D,0x7A,0x77,0x78,0x7E,0x87,0x84, + 0x7B,0x83,0x87,0x84,0x84,0x8D,0x8F,0x8C,0x89,0x8B,0xA6,0x9A,0x8C,0xA2,0x9D,0x8F, + 0x84,0x88,0x93,0x84,0x82,0x95,0x9A,0x93,0x93,0x9B,0x9D,0x90,0x8E,0x95,0x8F,0x89, + 0x90,0x95,0x90,0x8F,0x89,0x98,0xA8,0x8C,0x93,0xA3,0x91,0x85,0x7E,0x86,0x81,0x6D, + 0x79,0x84,0x78,0x75,0x7C,0x7F,0x75,0x6C,0x71,0x6E,0x62,0x62,0x69,0x64,0x5E,0x5E, + 0x59,0x71,0x6F,0x5A,0x72,0x72,0x62,0x5F,0x60,0x6A,0x5B,0x54,0x6C,0x6B,0x63,0x6E, + 0x79,0x78,0x6F,0x70,0x79,0x6E,0x69,0x73,0x74,0x70,0x74,0x71,0x77,0x92,0x7F,0x7D, + 0x95,0x85,0x7D,0x7B,0x7F,0x82,0x70,0x78,0x88,0x7D,0x7D,0x8B,0x91,0x8D,0x89,0x91, + 0x91,0x85,0x8A,0x92,0x8D,0x8D,0x94,0x8B,0x9D,0xAD,0x94,0xA5,0xB1,0x9D,0x9B,0x98, + 0x9D,0x94,0x86,0x98,0x9C,0x90,0x97,0xA1,0xA0,0x95,0x96,0x9D,0x90,0x88,0x90,0x8E, + 0x88,0x8B,0x8B,0x84,0x9A,0x97,0x87,0x9D,0x99,0x89,0x86,0x85,0x85,0x76,0x73,0x82, + 0x7D,0x74,0x7E,0x84,0x7A,0x73,0x7A,0x77,0x6A,0x6B,0x6F,0x68,0x62,0x67,0x5F,0x62, + 0x76,0x63,0x69,0x78,0x66,0x63,0x63,0x62,0x5D,0x55,0x60,0x65,0x5F,0x63,0x6F,0x6F, + 0x65,0x6B,0x73,0x67,0x65,0x6E,0x6D,0x69,0x69,0x6F,0x68,0x78,0x81,0x73,0x87,0x86, + 0x78,0x7C,0x7A,0x78,0x72,0x71,0x7D,0x7C,0x78,0x82,0x89,0x83,0x81,0x88,0x87,0x7F, + 0x83,0x88,0x87,0x83,0x87,0x8A,0x84,0x9C,0x9B,0x90,0xA9,0xA0,0x94,0x99,0x96,0x94, + 0x8B,0x8F,0x9B,0x95,0x95,0xA3,0xA4,0x9B,0x9E,0xA4,0x9E,0x99,0x9F,0x9F,0x9C,0x99, + 0x9A,0x98,0x92,0xAC,0xA5,0x99,0xB3,0xA5,0x9A,0x9B,0x98,0x95,0x89,0x8E,0x97,0x8C, + 0x8B,0x96,0x94,0x89,0x8C,0x90,0x87,0x80,0x86,0x84,0x7D,0x7A,0x7B,0x77,0x6D,0x86, + 0x80,0x71,0x89,0x7D,0x6F,0x71,0x6E,0x6A,0x5F,0x63,0x6B,0x62,0x61,0x6C,0x6B,0x61, + 0x65,0x68,0x60,0x5A,0x60,0x61,0x59,0x5A,0x5C,0x58,0x51,0x69,0x69,0x58,0x73,0x6C, + 0x5C,0x62,0x65,0x60,0x57,0x5E,0x68,0x60,0x60,0x6E,0x6F,0x67,0x6E,0x73,0x6F,0x6B, + 0x72,0x76,0x6F,0x71,0x76,0x74,0x6C,0x85,0x8D,0x78,0x93,0x94,0x80,0x86,0x8B,0x86, + 0x7E,0x84,0x8E,0x89,0x85,0x95,0x97,0x8D,0x95,0x9B,0x94,0x90,0x99,0x9B,0x91,0x95, + 0x99,0x96,0x8E,0xA5,0xB0,0x9A,0xB2,0xB6,0xA0,0xA4,0xA9,0xA2,0x99,0x9D,0xA6,0x9F, + 0x98,0xA6,0xA6,0x9A,0xA1,0xA5,0x9C,0x98,0x9D,0x9C,0x91,0x93,0x94,0x8D,0x83,0x98, + 0xA1,0x87,0x9C,0xA0,0x86,0x88,0x8D,0x84,0x78,0x7C,0x84,0x7C,0x75,0x82,0x81,0x75, + 0x7C,0x7F,0x76,0x73,0x78,0x76,0x6D,0x70,0x70,0x6A,0x61,0x74,0x81,0x66,0x7A,0x85, + 0x6A,0x6B,0x74,0x6B,0x5F,0x63,0x6D,0x66,0x61,0x6E,0x6F,0x64,0x6A,0x70,0x64,0x62, + 0x67,0x65,0x5E,0x60,0x61,0x5C,0x52,0x61,0x71,0x57,0x6B,0x78,0x5D,0x60,0x6A,0x62, + 0x58,0x5E,0x67,0x62,0x5F,0x6D,0x6F,0x66,0x6F,0x75,0x6D,0x70,0x77,0x77,0x73,0x79, + 0x7A,0x77,0x71,0x81,0x91,0x79,0x8F,0x9C,0x81,0x89,0x92,0x88,0x80,0x87,0x8E,0x87, + 0x85,0x93,0x92,0x88,0x93,0x96,0x8D,0x90,0x94,0x93,0x8F,0x94,0x93,0x8F,0x88,0x95, + 0xA5,0x8D,0xA2,0xAD,0x90,0x98,0xA2,0x93,0x8D,0x96,0x97,0x91,0x8F,0x99,0x98,0x8D, + 0x98,0x9A,0x8F,0x93,0x96,0x90,0x8C,0x8F,0x8B,0x87,0x7F,0x8E,0x98,0x7F,0x97,0x9A, + 0x7C,0x89,0x8F,0x7B,0x79,0x83,0x7F,0x79,0x7C,0x84,0x7F,0x7A,0x87,0x84,0x7A,0x82, + 0x83,0x7B,0x7B,0x7E,0x78,0x75,0x71,0x82,0x86,0x72,0x8D,0x88,0x6E,0x7F,0x81,0x6C, + 0x6F,0x77,0x6F,0x6C,0x72,0x75,0x6D,0x6F,0x79,0x71,0x6C,0x75,0x72,0x6C,0x6F,0x6F, + 0x6B,0x69,0x68,0x7E,0x76,0x70,0x8F,0x7A,0x6D,0x85,0x78,0x69,0x76,0x77,0x70,0x73, + 0x7B,0x7B,0x74,0x7C,0x81,0x77,0x7C,0x81,0x7B,0x79,0x7C,0x78,0x76,0x72,0x76,0x8B, + 0x79,0x81,0x97,0x7A,0x7C,0x8E,0x79,0x73,0x82,0x79,0x74,0x7E,0x7F,0x7A,0x7C,0x83, + 0x80,0x7B,0x82,0x81,0x7B,0x7E,0x7E,0x79,0x7A,0x75,0x7F,0x8B,0x7A,0x8E,0x95,0x7A, + 0x86,0x8E,0x75,0x7B,0x86,0x76,0x79,0x84,0x7D,0x7C,0x83,0x84,0x81,0x83,0x87,0x82, + 0x81,0x83,0x7F,0x7E,0x7E,0x78,0x88,0x8B,0x80,0x98,0x93,0x80,0x92,0x8F,0x7A,0x88, + 0x89,0x79,0x84,0x89,0x7F,0x85,0x8A,0x87,0x87,0x8A,0x89,0x87,0x87,0x86,0x81,0x81, + 0x7E,0x7C,0x8A,0x86,0x83,0x95,0x8C,0x80,0x90,0x88,0x79,0x87,0x83,0x76,0x84,0x83, + 0x79,0x82,0x85,0x7F,0x85,0x86,0x84,0x86,0x85,0x83,0x80,0x7F,0x7E,0x7F,0x87,0x85, + 0x86,0x90,0x89,0x82,0x8D,0x85,0x7B,0x87,0x80,0x76,0x83,0x80,0x78,0x81,0x80,0x7B, + 0x81,0x81,0x7F,0x83,0x80,0x7E,0x7E,0x7C,0x7A,0x7B,0x80,0x81,0x83,0x8A,0x83,0x80, + 0x89,0x82,0x7B,0x86,0x80,0x78,0x84,0x80,0x7A,0x83,0x81,0x7F,0x85,0x83,0x84,0x86, + 0x83,0x85,0x84,0x7E,0x7F,0x80,0x83,0x84,0x84,0x8A,0x87,0x82,0x88,0x83,0x7D,0x84, + 0x7E,0x79,0x80,0x7B,0x79,0x80,0x7B,0x7B,0x81,0x7D,0x80,0x82,0x7E,0x7F,0x7E,0x7A, + 0x79,0x79,0x7D,0x7F,0x7E,0x84,0x81,0x7D,0x83,0x7D,0x79,0x80,0x79,0x76,0x7D,0x76, + 0x77,0x7E,0x78,0x7B,0x81,0x7D,0x81,0x83,0x81,0x83,0x80,0x7D,0x7E,0x7C,0x82,0x83, + 0x81,0x88,0x85,0x81,0x87,0x80,0x7D,0x83,0x7A,0x79,0x80,0x77,0x79,0x7F,0x78,0x7B, + 0x80,0x7C,0x80,0x82,0x7F,0x81,0x7F,0x7C,0x7E,0x7B,0x80,0x83,0x81,0x87,0x85,0x81, + 0x87,0x81,0x7E,0x84,0x7B,0x7A,0x80,0x78,0x79,0x7F,0x78,0x7C,0x80,0x7D,0x81,0x82, + 0x7F,0x82,0x7F,0x7C,0x7D,0x7B,0x7F,0x82,0x80,0x86,0x85,0x81,0x85,0x80,0x7D,0x82, + 0x7A,0x79,0x7F,0x77,0x79,0x7F,0x79,0x7C,0x81,0x7E,0x83,0x84,0x81,0x84,0x81,0x7D, + 0x80,0x7D,0x81,0x85,0x82,0x88,0x88,0x83,0x87,0x83,0x7F,0x84,0x7D,0x7B,0x80,0x79, + 0x79,0x7F,0x7A,0x7B,0x80,0x7E,0x81,0x83,0x81,0x84,0x82,0x7F,0x80,0x7E,0x82,0x87, + 0x83,0x88,0x89,0x85,0x88,0x85,0x82,0x86,0x80,0x7D,0x82,0x7A,0x7A,0x80,0x7A,0x7B, + 0x81,0x7E,0x80,0x82,0x7F,0x82,0x80,0x7C,0x7E,0x7B,0x7F,0x83,0x80,0x84,0x86,0x81, + 0x85,0x82,0x7E,0x83,0x7E,0x7A,0x7E,0x79,0x78,0x7E,0x79,0x7A,0x81,0x7E,0x80,0x83, + 0x81,0x83,0x82,0x7E,0x80,0x7E,0x80,0x84,0x80,0x84,0x87,0x82,0x85,0x84,0x7F,0x83, + 0x80,0x7B,0x7E,0x7A,0x78,0x7F,0x7B,0x7B,0x82,0x80,0x81,0x85,0x83,0x84,0x84,0x81, + 0x82,0x80,0x82,0x86,0x83,0x85,0x89,0x84,0x85,0x86,0x81,0x83,0x82,0x7C,0x7D,0x7B, + 0x77,0x7B,0x78,0x77,0x7D,0x7B,0x7B,0x81,0x7F,0x80,0x82,0x7E,0x7F,0x7F,0x80,0x84, + 0x82,0x83,0x88,0x84,0x84,0x87,0x82,0x83,0x85,0x7F,0x7E,0x7F,0x7A,0x7C,0x7C,0x79, + 0x7E,0x7E,0x7C,0x81,0x81,0x7F,0x81,0x7F,0x7E,0x7E,0x7E,0x82,0x80,0x80,0x83,0x81, + 0x80,0x84,0x80,0x7F,0x83,0x7E,0x7C,0x7F,0x7B,0x7B,0x7E,0x7C,0x7F,0x81,0x80,0x83, + 0x85,0x83,0x85,0x85,0x83,0x83,0x83,0x86,0x86,0x83,0x85,0x84,0x82,0x84,0x83,0x81, + 0x83,0x81,0x7D,0x7E,0x7C,0x79,0x7B,0x7B,0x79,0x7C,0x7C,0x7C,0x7F,0x7F,0x7F,0x80, + 0x7F,0x80,0x81,0x81,0x83,0x83,0x82,0x83,0x82,0x81,0x82,0x82,0x81,0x82,0x80,0x7D, + 0x7D,0x7A,0x79,0x7C,0x7A,0x79,0x7D,0x7C,0x7C,0x7F,0x7F,0x7E,0x82,0x80,0x81,0x85, + 0x8F,0x87,0x69,0x77,0x8D,0x8E,0x78,0x88,0x97,0x6F,0x79,0x87,0x7F,0x81,0x87,0x90, + 0x7C,0x7A,0x88,0x88,0x7A,0x79,0x8B,0x82,0x76,0x77,0x7D,0x82,0x86,0x85,0x8A,0x82, + 0x73,0x81,0x80,0x83,0x8B,0x8C,0x8E,0x7E,0x7D,0x76,0x72,0x7F,0x7E,0x84,0x78,0x74, + 0x80,0x6D,0x79,0x93,0x7A,0x76,0x88,0x7B,0x7D,0x75,0x78,0x89,0x7B,0x7B,0x81,0x7B, + 0x7A,0x7B,0x80,0x7E,0x76,0x7C,0x85,0x81,0x7A,0x76,0x7A,0x83,0x84,0x86,0x82,0x7F, + 0x7F,0x7F,0x7E,0x76,0x80,0x91,0x90,0x8F,0x95,0x88,0x87,0x99,0x9F,0x9E,0x9D,0x9E, + 0x9F,0xA0,0xA0,0x9A,0x89,0x83,0x8E,0x92,0x92,0x95,0x87,0x79,0x78,0x72,0x6E,0x66, + 0x64,0x73,0x79,0x78,0x73,0x69,0x6B,0x71,0x72,0x72,0x66,0x63,0x6B,0x69,0x6A,0x68, + 0x63,0x66,0x68,0x69,0x69,0x65,0x67,0x70,0x6F,0x67,0x63,0x6A,0x79,0x7B,0x6E,0x70, + 0x70,0x6C,0x72,0x73,0x74,0x77,0x74,0x75,0x78,0x80,0x88,0x8E,0x97,0xA7,0xB6,0xB4, + 0xA8,0xA3,0xA2,0x9E,0x9C,0x9C,0x96,0x8F,0x93,0x90,0x8B,0x8D,0x8D,0x8C,0x8A,0x8E, + 0x90,0x8B,0x8D,0x8F,0x90,0x8C,0x86,0x85,0x89,0x8A,0x87,0x84,0x81,0x81,0x84,0x8C, + 0x8A,0x85,0x83,0x7F,0x81,0x82,0x81,0x7C,0x7D,0x84,0x82,0x7D,0x7C,0x7B,0x79,0x7A, + 0x7F,0x80,0x87,0x91,0x8F,0x8A,0x86,0x82,0x8B,0x8F,0x8F,0x97,0x97,0x94,0x90,0x90, + 0x96,0x92,0x8E,0x8D,0x86,0x83,0x83,0x7E,0x74,0x73,0x6E,0x6A,0x6C,0x68,0x68,0x6D, + 0x6A,0x66,0x63,0x61,0x65,0x5C,0x5D,0x64,0x62,0x61,0x5D,0x5D,0x59,0x58,0x5E,0x5E, + 0x5F,0x63,0x67,0x65,0x64,0x6A,0x6D,0x6D,0x6B,0x69,0x6C,0x6A,0x69,0x6B,0x6E,0x71, + 0x6F,0x6D,0x70,0x73,0x74,0x75,0x7E,0x92,0x95,0x95,0xA5,0xB0,0xB2,0xAE,0xAB,0x9F, + 0x9D,0x9F,0x96,0x95,0x9A,0x9C,0x98,0x9C,0x9A,0x9A,0xA0,0x9D,0x96,0x8D,0x88,0x88, + 0x8A,0x86,0x81,0x88,0x9C,0x9C,0x8F,0x8D,0x8B,0x89,0x8C,0x7C,0x6B,0x74,0x7C,0x7B, + 0x81,0x82,0x84,0x93,0x90,0x88,0x87,0x7F,0x7D,0x7F,0x7D,0x78,0x7E,0x81,0x7F,0x8A, + 0x9A,0x9E,0x99,0x9B,0x99,0x94,0x94,0x8E,0x83,0x89,0x8B,0x8E,0x96,0x95,0x96,0x94, + 0x90,0x88,0x82,0x79,0x73,0x7A,0x76,0x75,0x73,0x6D,0x68,0x6F,0x82,0x7B,0x71,0x6F, + 0x64,0x60,0x5F,0x53,0x4F,0x56,0x59,0x59,0x5F,0x55,0x52,0x5C,0x55,0x59,0x5A,0x59, + 0x61,0x6B,0x6B,0x62,0x5F,0x5C,0x64,0x72,0x7B,0x75,0x70,0x6E,0x69,0x67,0x67,0x62, + 0x65,0x72,0x78,0x85,0x8A,0x8B,0x8E,0x93,0x99,0xA0,0xA3,0xA1,0xAC,0xAF,0xAC,0xA1, + 0x97,0x99,0x9F,0xAE,0xB8,0xAA,0x9D,0x97,0x89,0x87,0x85,0x7F,0x83,0x8E,0x8D,0x8F, + 0x91,0x88,0x86,0x7E,0x7F,0x87,0x87,0x89,0x90,0x8F,0x8B,0x84,0x7D,0x7E,0x83,0x98, + 0xA0,0x9A,0x92,0x82,0x7A,0x7E,0x7C,0x78,0x84,0x86,0x88,0x94,0x94,0x89,0x85,0x85, + 0x88,0x91,0x91,0x95,0x97,0x9A,0x98,0x8C,0x8C,0x8A,0x8C,0x9C,0xA8,0x9C,0x90,0x82, + 0x75,0x7A,0x77,0x7A,0x7F,0x7B,0x7A,0x7F,0x77,0x69,0x64,0x5D,0x5D,0x64,0x63,0x60, + 0x63,0x60,0x5B,0x56,0x51,0x4C,0x58,0x6A,0x69,0x60,0x56,0x4E,0x4C,0x56,0x5A,0x63, + 0x68,0x67,0x6E,0x6D,0x65,0x5F,0x61,0x60,0x6C,0x74,0x75,0x75,0x77,0x77,0x77,0x7B, + 0x76,0x7C,0x90,0xA0,0xA6,0xA4,0x9A,0x95,0x9E,0xA2,0xA8,0xAE,0xAA,0xA7,0xAA,0xA6, + 0x9D,0x97,0x94,0x94,0x9C,0x9C,0x95,0x90,0x88,0x83,0x82,0x84,0x7E,0x82,0x94,0x97, + 0x96,0x8B,0x7D,0x72,0x76,0x7D,0x86,0x8A,0x87,0x88,0x87,0x89,0x84,0x7E,0x7C,0x83, + 0x8A,0x8C,0x8C,0x84,0x80,0x81,0x83,0x85,0x82,0x8D,0x9A,0x9D,0x9B,0x8F,0x80,0x81, + 0x89,0x94,0x9D,0x9A,0x94,0x93,0x95,0x91,0x8B,0x82,0x85,0x8C,0x8E,0x8F,0x8B,0x82, + 0x7A,0x78,0x7C,0x75,0x74,0x82,0x88,0x84,0x7B,0x68,0x56,0x5C,0x64,0x6A,0x6D,0x63, + 0x60,0x5C,0x5C,0x5D,0x55,0x52,0x55,0x5F,0x63,0x67,0x64,0x5C,0x5A,0x5F,0x62,0x5D, + 0x65,0x75,0x7B,0x7A,0x75,0x61,0x56,0x5E,0x6B,0x76,0x79,0x76,0x79,0x7A,0x7F,0x80, + 0x7E,0x84,0x8D,0x9B,0xA3,0xA7,0xA4,0x9E,0x9D,0xA2,0xA2,0x9D,0xA7,0xB0,0xAF,0xAA, + 0x9C,0x86,0x7F,0x83,0x8D,0x95,0x92,0x8C,0x87,0x84,0x82,0x83,0x7C,0x7C,0x84,0x85, + 0x8B,0x8A,0x82,0x7D,0x7D,0x80,0x7D,0x82,0x91,0x98,0x96,0x91,0x81,0x71,0x71,0x7E, + 0x88,0x91,0x93,0x89,0x86,0x88,0x88,0x87,0x8A,0x89,0x8F,0x95,0x99,0x93,0x8D,0x8D, + 0x88,0x8D,0x8B,0x93,0xA0,0xA2,0x9F,0x94,0x81,0x75,0x7A,0x85,0x8D,0x8B,0x8A,0x7F, + 0x7B,0x76,0x6F,0x6F,0x6A,0x6A,0x6C,0x70,0x6E,0x67,0x5D,0x5B,0x59,0x55,0x58,0x63, + 0x6C,0x6D,0x66,0x57,0x4A,0x46,0x4E,0x5C,0x63,0x65,0x66,0x60,0x60,0x62,0x62,0x62, + 0x60,0x67,0x6B,0x71,0x71,0x6C,0x6C,0x6B,0x72,0x6F,0x79,0x8C,0x92,0x98,0x91,0x88, + 0x81,0x85,0x95,0xA2,0xA9,0xAB,0xA5,0xA4,0xA6,0xA0,0xA0,0x9C,0x9A,0x9A,0x9E,0x9D, + 0x96,0x90,0x86,0x80,0x7F,0x80,0x88,0x95,0x9A,0x95,0x87,0x77,0x6F,0x71,0x7D,0x86, + 0x86,0x82,0x7D,0x79,0x7F,0x7F,0x7F,0x7D,0x7E,0x84,0x85,0x8A,0x86,0x80,0x80,0x83, + 0x83,0x85,0x93,0x9B,0x9D,0x98,0x8A,0x7E,0x7C,0x83,0x91,0x98,0x9A,0x94,0x8D,0x90, + 0x92,0x90,0x8F,0x8D,0x8A,0x8B,0x8D,0x8A,0x88,0x82,0x7A,0x7C,0x79,0x79,0x88,0x8C, + 0x88,0x7F,0x6C,0x5E,0x5B,0x64,0x6B,0x6C,0x69,0x61,0x59,0x5A,0x5D,0x5B,0x57,0x57, + 0x59,0x5B,0x60,0x5F,0x5D,0x57,0x56,0x58,0x55,0x65,0x77,0x7D,0x79,0x6F,0x5E,0x55, + 0x5A,0x66,0x70,0x77,0x78,0x71,0x71,0x76,0x7B,0x7F,0x83,0x82,0x89,0x95,0x96,0x98, + 0x9A,0x97,0x9D,0xA0,0x9F,0xAB,0xB6,0xB9,0xB5,0xA4,0x91,0x88,0x8C,0x94,0x9D,0x9A, + 0x94,0x8B,0x85,0x86,0x86,0x84,0x82,0x7F,0x81,0x86,0x82,0x80,0x7C,0x77,0x79,0x75, + 0x78,0x89,0x91,0x91,0x8E,0x80,0x75,0x71,0x78,0x85,0x8C,0x8C,0x87,0x85,0x85,0x86, + 0x8A,0x8B,0x8C,0x8D,0x91,0x98,0x98,0x97,0x91,0x8B,0x8E,0x8C,0x95,0xA6,0xA8,0xA6, + 0x9E,0x8D,0x7D,0x7A,0x82,0x8C,0x91,0x8E,0x88,0x80,0x7C,0x7C,0x78,0x74,0x72,0x6D, + 0x71,0x73,0x6F,0x69,0x61,0x5C,0x56,0x59,0x63,0x70,0x73,0x6F,0x65,0x51,0x47,0x4B, + 0x54,0x5F,0x67,0x66,0x61,0x5C,0x60,0x65,0x66,0x66,0x65,0x67,0x6E,0x74,0x74,0x72, + 0x6F,0x6F,0x6E,0x76,0x88,0x96,0x9B,0x98,0x8D,0x7D,0x78,0x80,0x8E,0x9A,0xA3,0xA1, + 0x9B,0x99,0x9B,0x9E,0x9C,0x9B,0x9B,0x9B,0xA1,0xA4,0x9E,0x98,0x90,0x8C,0x89,0x8D, + 0x9B,0xA3,0xA1,0x99,0x88,0x76,0x71,0x77,0x80,0x8B,0x8D,0x85,0x7D,0x7A,0x7C,0x7E, + 0x7D,0x7E,0x7E,0x7E,0x84,0x82,0x81,0x7E,0x79,0x79,0x77,0x80,0x91,0x9D,0x9E,0x97, + 0x86,0x78,0x75,0x7B,0x8A,0x95,0x95,0x8F,0x88,0x88,0x89,0x89,0x8A,0x87,0x84,0x86, + 0x89,0x88,0x86,0x81,0x7B,0x7A,0x75,0x7D,0x8E,0x95,0x92,0x88,0x76,0x69,0x65,0x6E, + 0x7C,0x82,0x81,0x76,0x70,0x70,0x72,0x75,0x73,0x71,0x6F,0x70,0x76,0x77,0x75,0x6F, + 0x6A,0x69,0x67,0x70,0x83,0x8B,0x8B,0x82,0x71,0x64,0x64,0x6E,0x79,0x82,0x80,0x7A, + 0x77,0x79,0x7F,0x82,0x81,0x7E,0x7C,0x80,0x88,0x8C,0x8D,0x88,0x84,0x82,0x7E,0x86, + 0x98,0x9F,0xA1,0x99,0x89,0x7B,0x77,0x7D,0x86,0x8D,0x89,0x84,0x82,0x7D,0x80,0x81, + 0x7E,0x7C,0x79,0x7A,0x7F,0x80,0x7F,0x79,0x74,0x72,0x6D,0x76,0x88,0x92,0x92,0x8A, + 0x7A,0x6C,0x6B,0x71,0x7D,0x85,0x85,0x82,0x7F,0x7C,0x80,0x83,0x80,0x80,0x7F,0x80, + 0x87,0x8B,0x89,0x85,0x7E,0x7C,0x79,0x7F,0x92,0x9A,0x9B,0x95,0x84,0x75,0x72,0x76, + 0x82,0x88,0x8A,0x85,0x7E,0x80,0x82,0x82,0x80,0x7D,0x78,0x7A,0x7F,0x82,0x82,0x7D, + 0x78,0x74,0x71,0x75,0x85,0x8F,0x91,0x8B,0x7A,0x6D,0x69,0x6A,0x74,0x7D,0x7E,0x7C, + 0x75,0x75,0x7A,0x7C,0x7F,0x7A,0x74,0x79,0x7C,0x81,0x86,0x81,0x7C,0x78,0x75,0x77, + 0x86,0x94,0x99,0x98,0x8B,0x7D,0x75,0x75,0x7F,0x89,0x8C,0x8C,0x86,0x82,0x87,0x8A, + 0x8B,0x86,0x7E,0x7D,0x81,0x86,0x8A,0x86,0x7F,0x7A,0x74,0x74,0x7F,0x8C,0x94,0x94, + 0x88,0x79,0x6E,0x6D,0x73,0x7C,0x83,0x7E,0x7B,0x79,0x7C,0x82,0x82,0x7F,0x77,0x75, + 0x78,0x7D,0x83,0x82,0x80,0x78,0x74,0x72,0x79,0x89,0x95,0x97,0x8F,0x80,0x71,0x6E, + 0x73,0x7C,0x84,0x83,0x7F,0x7C,0x7C,0x84,0x88,0x85,0x7F,0x7A,0x79,0x7E,0x84,0x86, + 0x84,0x7F,0x79,0x75,0x76,0x84,0x92,0x95,0x93,0x88,0x78,0x70,0x72,0x78,0x82,0x83, + 0x7F,0x7B,0x78,0x7C,0x82,0x83,0x81,0x7B,0x76,0x77,0x7E,0x82,0x82,0x7F,0x79,0x74, + 0x70,0x7B,0x8A,0x90,0x94,0x8C,0x7E,0x73,0x70,0x76,0x7D,0x84,0x85,0x7E,0x7C,0x7B, + 0x81,0x88,0x88,0x86,0x7E,0x7E,0x7E,0x82,0x86,0x87,0x83,0x7E,0x78,0x76,0x85,0x90, + 0x93,0x96,0x88,0x7A,0x75,0x70,0x7B,0x7F,0x82,0x82,0x76,0x76,0x79,0x7E,0x86,0x85, + 0x7F,0x7A,0x75,0x78,0x7F,0x82,0x84,0x7E,0x79,0x74,0x78,0x88,0x90,0x93,0x91,0x83, + 0x78,0x73,0x76,0x7F,0x84,0x85,0x7F,0x7A,0x7C,0x7E,0x85,0x88,0x88,0x85,0x7C,0x7A, + 0x7C,0x7F,0x83,0x85,0x81,0x7D,0x78,0x7E,0x89,0x8C,0x92,0x8D,0x82,0x7B,0x75,0x79, + 0x7E,0x80,0x81,0x7D,0x7C,0x79,0x7B,0x83,0x84,0x87,0x84,0x7E,0x7D,0x7A,0x7B,0x7E, + 0x80,0x7F,0x79,0x77,0x80,0x85,0x8D,0x8F,0x86,0x81,0x78,0x73,0x77,0x7C,0x7F,0x7F, + 0x7D,0x7C,0x7A,0x7F,0x84,0x86,0x89,0x85,0x80,0x7F,0x7E,0x80,0x81,0x82,0x80,0x7C, + 0x7F,0x86,0x8A,0x93,0x8E,0x87,0x84,0x7A,0x79,0x7C,0x7F,0x82,0x80,0x7E,0x7C,0x7E, + 0x81,0x81,0x86,0x88,0x83,0x80,0x7C,0x7C,0x7D,0x7F,0x80,0x7B,0x79,0x7F,0x84,0x8B, + 0x8F,0x88,0x85,0x7E,0x76,0x76,0x7A,0x7D,0x7F,0x7D,0x7B,0x7C,0x7D,0x7F,0x82,0x86, + 0x85,0x84,0x82,0x7F,0x7F,0x7F,0x80,0x7F,0x7A,0x7C,0x84,0x87,0x8E,0x8F,0x88,0x87, + 0x7F,0x7B,0x7D,0x7C,0x7E,0x7F,0x7E,0x7D,0x7F,0x80,0x81,0x83,0x85,0x85,0x85,0x80, + 0x7F,0x7F,0x7E,0x7F,0x7B,0x7A,0x7F,0x84,0x87,0x8D,0x88,0x85,0x85,0x7D,0x7B,0x7C, + 0x7A,0x7D,0x7D,0x7B,0x7C,0x80,0x80,0x80,0x83,0x85,0x85,0x84,0x80,0x7E,0x7D,0x7E, + 0x7F,0x7C,0x7C,0x83,0x86,0x8A,0x8D,0x86,0x86,0x85,0x7D,0x7D,0x7D,0x7B,0x7F,0x7C, + 0x7B,0x7F,0x7E,0x80,0x82,0x83,0x85,0x85,0x84,0x82,0x7F,0x7D,0x7C,0x7D,0x7B,0x7C, + 0x83,0x83,0x88,0x88,0x81,0x85,0x80,0x7C,0x7E,0x7B,0x7B,0x7E,0x7D,0x7B,0x7D,0x7D, + 0x7D,0x7E,0x81,0x82,0x83,0x83,0x82,0x7E,0x7C,0x7F,0x7D,0x7A,0x7E,0x82,0x81,0x86, + 0x86,0x81,0x85,0x80,0x7C,0x7F,0x7B,0x7C,0x7F,0x7C,0x7D,0x7E,0x7D,0x7F,0x80,0x81, + 0x84,0x84,0x84,0x83,0x81,0x81,0x82,0x81,0x7F,0x82,0x81,0x83,0x8B,0x84,0x80,0x83, + 0x7D,0x7D,0x7D,0x7C,0x7F,0x7D,0x7B,0x7F,0x7D,0x7A,0x7C,0x7C,0x7E,0x7C,0x8E,0x8A, + 0x7C,0x87,0x68,0x71,0x82,0x6E,0x6A,0x74,0x82,0x8A,0x8A,0x8B,0x8E,0x85,0x8C,0x9D, + 0x9A,0xA1,0xA5,0x91,0x8C,0x76,0x77,0x91,0x76,0x65,0x72,0x71,0x5B,0x5B,0x57,0x52, + 0x6B,0x63,0x62,0x59,0x5D,0x73,0x70,0x6D,0x79,0x79,0x82,0xA5,0x8B,0x8D,0x98,0x9B, + 0xAC,0x81,0xB8,0xBC,0x95,0xB4,0x96,0x9E,0xB1,0xA4,0x95,0x8D,0x95,0x9C,0x7D,0x70, + 0x76,0x5F,0x78,0x78,0x6F,0x8B,0x79,0x6B,0x77,0x77,0x7D,0x6E,0x4C,0x4B,0x56,0x62, + 0x64,0x62,0x5D,0x54,0x5A,0x6F,0x6E,0x6D,0x7E,0x80,0x95,0xA6,0x9C,0x8F,0x9B,0x9D, + 0x92,0x97,0xA4,0xB2,0xAD,0x9A,0xA3,0xA9,0xA2,0xA4,0x96,0x92,0x8E,0x8C,0x82,0x76, + 0x7F,0x76,0x76,0x74,0x72,0x7B,0x73,0x67,0x50,0x43,0x52,0x5E,0x43,0x30,0x41,0x3D, + 0x32,0x38,0x4B,0x5D,0x54,0x59,0x68,0x69,0x75,0x96,0xA7,0xA0,0x92,0x8E,0x9F,0x9B, + 0x92,0x96,0x94,0x9F,0x9E,0xA2,0xB9,0xB2,0xA9,0xB6,0xAD,0xA5,0xA6,0x88,0x8E,0x96, + 0x83,0x94,0x92,0x81,0x7E,0x71,0x6B,0x7F,0x87,0x7F,0x7F,0x6F,0x7E,0x82,0x6E,0x70, + 0x71,0x7F,0x81,0x74,0x6D,0x63,0x6A,0x6C,0x65,0x63,0x5F,0x72,0x80,0x76,0x82,0x81, + 0x7B,0x89,0x78,0x83,0x93,0x91,0x99,0x95,0x9E,0xA3,0xAF,0xBB,0xAD,0xB7,0xC1,0xB6, + 0xBD,0xBA,0xB2,0xB2,0xAE,0xAD,0xA5,0x99,0x89,0x78,0x74,0x6E,0x78,0x69,0x5D,0x75, + 0x75,0x6C,0x5C,0x49,0x44,0x46,0x4B,0x51,0x45,0x39,0x36,0x37,0x31,0x2C,0x39,0x39, + 0x3A,0x3C,0x3A,0x3D,0x46,0x50,0x4E,0x67,0x86,0x90,0x89,0x73,0x78,0x88,0x8A,0x99, + 0x9B,0x9A,0xA6,0x95,0x87,0x8B,0x90,0x96,0xA6,0xBC,0xB8,0xBC,0xC6,0xD0,0xD7,0xD1, + 0xD6,0xD8,0xD6,0xD7,0xCB,0xBC,0xAE,0xA0,0xA5,0xB3,0xB3,0xA4,0x8A,0x77,0x73,0x75, + 0x78,0x6E,0x69,0x64,0x72,0x6D,0x5C,0x57,0x47,0x58,0x54,0x55,0x5E,0x4E,0x55,0x5D, + 0x5E,0x54,0x52,0x5E,0x64,0x6F,0x7E,0x6E,0x6B,0x7B,0x6B,0x72,0x7B,0x78,0x7F,0x83, + 0x8F,0x94,0x97,0x95,0x98,0x93,0x94,0x96,0x91,0x95,0x9B,0x9F,0x9C,0xA4,0x9E,0x98, + 0xA5,0xA4,0x9B,0x8D,0x82,0x80,0x81,0x7D,0x80,0x7E,0x71,0x7B,0x7B,0x79,0x77,0x6F, + 0x66,0x51,0x50,0x56,0x61,0x74,0x6F,0x6F,0x7A,0x81,0x84,0x86,0x7F,0x6E,0x63,0x5B, + 0x66,0x77,0x81,0x74,0x5D,0x60,0x6E,0x80,0x82,0x70,0x71,0x79,0x79,0x79,0x82,0x8D, + 0x81,0x7D,0x78,0x78,0x91,0x90,0x8E,0x82,0x73,0x7F,0x87,0x91,0x99,0x91,0x89,0x7D, + 0x7E,0x93,0xA2,0xB5,0xB3,0xA0,0xA3,0xB1,0xB0,0xAD,0xAD,0x9F,0xB3,0xC5,0xBF,0xC5, + 0xB1,0xA5,0xAA,0xAF,0xB3,0xA5,0x9F,0xA4,0xA2,0x9A,0x8D,0x8E,0x95,0x92,0x92,0x84, + 0x77,0x65,0x55,0x55,0x53,0x5C,0x60,0x61,0x6D,0x75,0x69,0x5D,0x59,0x4D,0x57,0x5D, + 0x59,0x58,0x53,0x4C,0x42,0x41,0x38,0x35,0x46,0x49,0x4F,0x4D,0x41,0x42,0x3B,0x44, + 0x58,0x5F,0x65,0x6D,0x7D,0x83,0x7F,0x7D,0x7B,0x8D,0xA0,0xA6,0xA8,0x9E,0x94,0x92, + 0x8F,0x95,0x89,0x89,0xA1,0x95,0x92,0x89,0x76,0x8A,0x92,0x91,0x9F,0x9B,0x9A,0xAB, + 0xA5,0x93,0x95,0x93,0x9C,0xB9,0xB9,0xA6,0x9F,0x97,0xA2,0xAD,0xAB,0xA8,0x8F,0x91, + 0xA4,0x9B,0x90,0x81,0x7A,0x85,0x91,0x9A,0x99,0x91,0x85,0x86,0x86,0x7F,0x7C,0x81, + 0x8B,0x87,0x7C,0x71,0x66,0x74,0x8F,0x8A,0x80,0x65,0x65,0x7E,0x79,0x6E,0x47,0x30, + 0x41,0x5A,0x68,0x62,0x5C,0x5A,0x5A,0x5D,0x5F,0x59,0x5C,0x68,0x79,0x75,0x67,0x6A, + 0x70,0x72,0x71,0x78,0x79,0x73,0x74,0x7A,0x70,0x5F,0x5A,0x58,0x60,0x6C,0x6E,0x63, + 0x6B,0x77,0x75,0x7B,0x80,0x91,0xA2,0xAB,0xAE,0xA9,0x9D,0x9A,0xA1,0xA6,0xA6,0xA0, + 0x93,0x8A,0x99,0xB2,0xAE,0x9F,0x92,0x84,0x8B,0x93,0x8E,0x86,0x88,0x8D,0x8C,0x7E, + 0x76,0x79,0x86,0x93,0x8A,0x7D,0x80,0x8A,0x8F,0x8F,0x86,0x78,0x7C,0x7D,0x70,0x72, + 0x70,0x6D,0x6E,0x6E,0x6F,0x75,0x71,0x75,0x81,0x79,0x7E,0x77,0x61,0x6F,0x7D,0x86, + 0x8D,0x82,0x82,0x86,0x87,0x8F,0x8B,0x7C,0x7B,0x79,0x72,0x7F,0x85,0x74,0x65,0x5F, + 0x68,0x77,0x77,0x7D,0x7F,0x76,0x6A,0x5B,0x59,0x6A,0x81,0x88,0x7C,0x75,0x74,0x70, + 0x79,0x80,0x7C,0x77,0x72,0x79,0x72,0x61,0x6C,0x6A,0x62,0x6E,0x6B,0x75,0x7C,0x78, + 0x8A,0x8D,0x8D,0x90,0x8A,0x93,0xA3,0xAC,0xA7,0xA0,0xA6,0xA4,0xA1,0xA5,0xA4,0xA5, + 0x9E,0x94,0x87,0x83,0x93,0x91,0x80,0x79,0x74,0x80,0x8B,0x8C,0x94,0x95,0x90,0x89, + 0x7B,0x7A,0x88,0x91,0x8F,0x80,0x7D,0x7E,0x74,0x75,0x7C,0x86,0x85,0x7A,0x72,0x6B, + 0x74,0x7F,0x7A,0x6D,0x65,0x67,0x73,0x77,0x7E,0x80,0x7A,0x7A,0x79,0x7D,0x84,0x86, + 0x83,0x80,0x7C,0x7C,0x78,0x6C,0x70,0x7B,0x80,0x77,0x72,0x6D,0x7A,0x91,0x87,0x73, + 0x61,0x65,0x72,0x72,0x7B,0x7E,0x7F,0x78,0x6F,0x69,0x68,0x70,0x6E,0x6D,0x6A,0x64, + 0x64,0x5B,0x5F,0x71,0x76,0x6F,0x69,0x66,0x6B,0x83,0x86,0x73,0x6F,0x6E,0x7A,0x8F, + 0x8B,0x90,0x97,0x98,0x9E,0x9B,0xA0,0xAA,0xB1,0xB2,0xB3,0xAE,0xA2,0xA2,0xA2,0xA8, + 0xAA,0xA2,0x9A,0x95,0x99,0xAF,0xB4,0x9C,0x94,0x90,0x91,0x99,0x97,0x9B,0xA0,0x9A, + 0x8C,0x7E,0x85,0x94,0x96,0x97,0x94,0x8D,0x88,0x85,0x88,0x8B,0x89,0x82,0x75,0x79, + 0x7B,0x86,0x90,0x80,0x80,0x74,0x74,0x88,0x81,0x83,0x86,0x81,0x75,0x66,0x69,0x6D, + 0x76,0x7A,0x77,0x72,0x69,0x69,0x64,0x6D,0x74,0x68,0x69,0x67,0x5E,0x6A,0x76,0x68, + 0x64,0x5D,0x60,0x6B,0x45,0x49,0x6F,0x77,0x5F,0x45,0x58,0x4E,0x4C,0x61,0x5B,0x52, + 0x52,0x5F,0x53,0x53,0x69,0x6C,0x5F,0x59,0x68,0x62,0x6B,0x72,0x6A,0x74,0x71,0x70, + 0x81,0x81,0x82,0x8F,0x8D,0x8C,0x88,0x90,0xAC,0xB0,0xB0,0xAC,0xAB,0xAB,0xAB,0xB5, + 0xAF,0xB1,0xB1,0xA9,0xAD,0xA1,0xA8,0xBE,0xAC,0x9D,0xA2,0x9E,0x9A,0x98,0x97,0xA1, + 0xA9,0x98,0x8A,0x8B,0x97,0xA1,0x9B,0xA1,0x9F,0xA2,0xA5,0x94,0x9A,0xA9,0xA8,0xA0, + 0x9B,0x9A,0x93,0xA1,0xAF,0xA4,0x99,0x90,0x90,0x8F,0x92,0x96,0x98,0x97,0x89,0x7F, + 0x73,0x7C,0x8A,0x7F,0x7D,0x7F,0x79,0x71,0x73,0x7C,0x7B,0x7A,0x6E,0x64,0x60,0x62, + 0x78,0x73,0x61,0x5D,0x54,0x5E,0x5C,0x50,0x5C,0x60,0x58,0x49,0x35,0x36,0x42,0x49, + 0x4C,0x4C,0x4A,0x36,0x25,0x31,0x3F,0x43,0x42,0x36,0x34,0x38,0x41,0x60,0x63,0x55, + 0x55,0x58,0x68,0x6F,0x72,0x80,0x87,0x85,0x7F,0x79,0x82,0x93,0x97,0x97,0x97,0x93, + 0x8B,0x8C,0x97,0xA1,0xA2,0x97,0x8A,0x8C,0x8D,0x8E,0xA6,0xA0,0x8E,0x8C,0x8B,0x90, + 0x8F,0x90,0x9F,0xAA,0xA1,0x91,0x8A,0x8E,0x9C,0xA6,0xA7,0xAA,0xA2,0x9D,0x9F,0xA0, + 0xAE,0xAD,0xA3,0x9F,0x9C,0xA5,0xA4,0xB4,0xBF,0xA8,0xA4,0xA0,0x9B,0xA5,0xA4,0xAC, + 0xB4,0xA3,0x92,0x87,0x89,0x96,0x98,0x98,0x92,0x90,0x89,0x7E,0x7E,0x86,0x8B,0x86, + 0x7D,0x77,0x77,0x6D,0x74,0x84,0x75,0x66,0x5E,0x57,0x60,0x63,0x61,0x68,0x62,0x54, + 0x49,0x44,0x4F,0x5C,0x5A,0x58,0x59,0x56,0x4F,0x4E,0x5B,0x65,0x64,0x62,0x5D,0x5F, + 0x6A,0x68,0x80,0x8D,0x80,0x7E,0x76,0x7B,0x86,0x83,0x8D,0x98,0x90,0x80,0x74,0x75, + 0x84,0x8B,0x86,0x84,0x82,0x7D,0x79,0x78,0x82,0x8B,0x84,0x80,0x7A,0x79,0x76,0x7F, + 0x97,0x91,0x81,0x79,0x70,0x78,0x80,0x82,0x8D,0x8D,0x80,0x7B,0x79,0x84,0x8E,0x8D, + 0x8A,0x8E,0x91,0x86,0x7E,0x82,0x91,0x94,0x8F,0x8A,0x81,0x86,0x83,0x8F,0xA6,0x99, + 0x8A,0x81,0x80,0x8B,0x8E,0x8E,0x94,0x8E,0x85,0x7A,0x73,0x7F,0x85,0x82,0x84,0x83, + 0x7A,0x6E,0x66,0x6F,0x7B,0x77,0x6E,0x64,0x5F,0x5F,0x5D,0x6F,0x7D,0x6E,0x5E,0x54, + 0x50,0x5A,0x5C,0x60,0x6F,0x6D,0x60,0x5B,0x5D,0x6D,0x7A,0x79,0x7D,0x81,0x80,0x7C, + 0x7A,0x89,0x99,0x9A,0x99,0x95,0x92,0x93,0x8F,0xA3,0xB3,0xA3,0x92,0x89,0x88,0x91, + 0x8F,0x8C,0x95,0x8F,0x88,0x80,0x77,0x84,0x8A,0x88,0x8F,0x8F,0x89,0x7D,0x76,0x84, + 0x91,0x8E,0x88,0x82,0x80,0x85,0x83,0x91,0x9F,0x92,0x88,0x81,0x85,0x8C,0x8B,0x91, + 0x9B,0xA0,0x97,0x8B,0x86,0x8E,0x9A,0x9B,0x98,0x99,0x92,0x89,0x86,0x8B,0x96,0x95, + 0x93,0x8F,0x84,0x84,0x7C,0x87,0xA1,0x95,0x83,0x7A,0x73,0x7A,0x7D,0x7D,0x85,0x84, + 0x78,0x6C,0x63,0x68,0x74,0x75,0x72,0x73,0x71,0x66,0x5B,0x5D,0x6E,0x75,0x70,0x69, + 0x5F,0x5E,0x5E,0x67,0x81,0x82,0x74,0x6A,0x66,0x70,0x74,0x79,0x87,0x8C,0x86,0x7B, + 0x75,0x79,0x83,0x8A,0x8D,0x8E,0x8A,0x82,0x7A,0x78,0x83,0x8C,0x8A,0x84,0x7E,0x7B, + 0x78,0x72,0x87,0x9B,0x8C,0x7D,0x75,0x72,0x7E,0x82,0x83,0x8D,0x8D,0x85,0x7B,0x72, + 0x7C,0x87,0x8A,0x8A,0x89,0x8A,0x81,0x77,0x7A,0x87,0x8D,0x88,0x82,0x7F,0x7E,0x7A, + 0x82,0x98,0x99,0x8C,0x82,0x78,0x7C,0x84,0x87,0x8F,0x95,0x92,0x87,0x78,0x77,0x83, + 0x89,0x8C,0x8E,0x8C,0x87,0x7D,0x78,0x81,0x8A,0x8C,0x88,0x7F,0x7A,0x79,0x73,0x85, + 0x97,0x8C,0x7E,0x70,0x6A,0x73,0x78,0x7A,0x81,0x83,0x7F,0x72,0x63,0x68,0x75,0x7C, + 0x7F,0x7E,0x7B,0x76,0x6E,0x6D,0x78,0x84,0x89,0x84,0x7A,0x7A,0x7D,0x7C,0x8F,0x9D, + 0x94,0x8C,0x7D,0x7A,0x84,0x84,0x8B,0x91,0x8D,0x88,0x7D,0x72,0x78,0x82,0x87,0x88, + 0x83,0x80,0x7B,0x72,0x73,0x7A,0x84,0x87,0x7D,0x74,0x71,0x70,0x72,0x89,0x94,0x86, + 0x7A,0x6D,0x6E,0x76,0x77,0x7E,0x83,0x85,0x82,0x74,0x6F,0x76,0x80,0x86,0x86,0x85, + 0x84,0x80,0x77,0x75,0x7E,0x89,0x8E,0x86,0x7C,0x7B,0x79,0x78,0x8B,0x96,0x8B,0x80, + 0x71,0x6F,0x79,0x7B,0x81,0x85,0x85,0x87,0x7C,0x71,0x74,0x7A,0x84,0x88,0x85,0x86, + 0x81,0x76,0x71,0x77,0x82,0x88,0x83,0x7D,0x7A,0x76,0x72,0x82,0x90,0x8C,0x81,0x70, + 0x6C,0x75,0x78,0x7D,0x83,0x86,0x87,0x7C,0x72,0x75,0x7D,0x84,0x8A,0x8B,0x8C,0x8C, + 0x86,0x81,0x80,0x88,0x95,0x93,0x8B,0x85,0x7D,0x77,0x81,0x97,0x96,0x8C,0x7D,0x76, + 0x7B,0x79,0x7A,0x7C,0x82,0x86,0x81,0x74,0x6D,0x6E,0x75,0x7F,0x82,0x82,0x81,0x80, + 0x7A,0x73,0x76,0x81,0x86,0x85,0x81,0x7A,0x73,0x75,0x8A,0x96,0x90,0x86,0x76,0x77, + 0x7F,0x7C,0x80,0x82,0x86,0x8C,0x82,0x78,0x75,0x77,0x82,0x8A,0x88,0x87,0x84,0x83, + 0x7F,0x77,0x7C,0x85,0x89,0x8A,0x82,0x79,0x71,0x77,0x8C,0x93,0x8C,0x7F,0x73,0x75, + 0x7A,0x7D,0x7F,0x7F,0x85,0x8E,0x87,0x79,0x74,0x76,0x82,0x88,0x86,0x86,0x84,0x82, + 0x7C,0x79,0x7C,0x85,0x8A,0x84,0x7F,0x78,0x6F,0x7A,0x92,0x94,0x8F,0x7F,0x70,0x7B, + 0x7D,0x83,0x82,0x80,0x8B,0x88,0x86,0x80,0x79,0x76,0x7C,0x87,0x89,0x8B,0x80,0x75, + 0x76,0x80,0x85,0x7A,0x7C,0x89,0x83,0x72,0x65,0x6E,0x8E,0x9A,0x8D,0x79,0x6B,0x76, + 0x77,0x74,0x8C,0x84,0x6D,0x7C,0x8E,0x81,0x79,0x7D,0x6C,0x78,0x85,0x80,0x82,0x7D, + 0x83,0x8A,0x83,0x75,0x7A,0x8D,0x89,0x7A,0x7B,0x79,0x85,0x8F,0x95,0x97,0x77,0x68, + 0x76,0x8A,0x95,0x89,0x71,0x73,0x89,0x83,0x7D,0x79,0x71,0x81,0x83,0x79,0x89,0x8F, + 0x79,0x81,0x8B,0x75,0x72,0x73,0x85,0x90,0x7E,0x70,0x75,0x84,0x84,0xA0,0x9D,0x79, + 0x72,0x65,0x66,0x7F,0x89,0x86,0x90,0x7F,0x7A,0x91,0x80,0x6E,0x77,0x80,0x80,0x83, + 0x80,0x78,0x85,0x8D,0x8B,0x94,0x80,0x6D,0x7F,0x85,0x74,0x73,0x83,0x83,0x8E,0x8E, + 0x7C,0x7B,0x72,0x73,0x8E,0x95,0x7F,0x72,0x73,0x83,0x8B,0x8B,0x85,0x71,0x6C,0x72, + 0x79,0x87,0x93,0x91,0x96,0x90,0x79,0x8C,0x89,0x70,0x7C,0x81,0x69,0x64,0x77,0x7A, + 0x8E,0x95,0x86,0x8A,0x7F,0x69,0x75,0x84,0x7A,0x80,0x86,0x79,0x77,0x79,0x76,0x7A, + 0x87,0x86,0x94,0x9C,0x81,0x7A,0x7F,0x87,0x8F,0x91,0x8F,0x7E,0x6A,0x5E,0x5C,0x6D, + 0x86,0x8D,0x96,0x99,0x7D,0x7A,0x8B,0x89,0x87,0x90,0x93,0x84,0x81,0x79,0x80,0x90, + 0x85,0x88,0x89,0x72,0x5A,0x68,0x74,0x6F,0x74,0x6E,0x6C,0x6E,0x76,0x88,0x9B,0x98, + 0x99,0xA0,0x91,0x8C,0x88,0x8F,0x8D,0x85,0x84,0x74,0x7C,0x76,0x68,0x76,0x76,0x7D, + 0x89,0x84,0x7A,0x6D,0x96,0x93,0x82,0x9E,0xA2,0xA2,0x7D,0x6F,0x7D,0x85,0x7B,0x5A, + 0x74,0x77,0x53,0x58,0x65,0x64,0x6B,0x65,0x6A,0x99,0xA2,0x86,0x8B,0x95,0x8B,0x98, + 0x9E,0x9B,0x98,0x96,0xA1,0x99,0x88,0x79,0x6D,0x70,0x61,0x67,0x7C,0x85,0x86,0x76, + 0x64,0x54,0x6E,0x8E,0x8F,0x8F,0x8F,0x86,0x7B,0x7B,0x75,0x7A,0x8D,0x8E,0x93,0xA7, + 0x93,0x7C,0x8C,0x91,0x98,0x96,0x8E,0x83,0x5F,0x5F,0x61,0x5C,0x66,0x6C,0x72,0x67, + 0x57,0x4F,0x55,0x6B,0x80,0x81,0x7C,0x78,0x7E,0x83,0x88,0xA3,0xAA,0xAF,0xC3,0xAE, + 0xA4,0xB6,0x93,0x82,0x8D,0x81,0x7D,0x7C,0x74,0x73,0x85,0x87,0x84,0x81,0x73,0x61, + 0x5D,0x6A,0x77,0x7F,0x7D,0x75,0x73,0x7B,0x6C,0x72,0x75,0x66,0x7C,0x85,0x77,0x7A, + 0x80,0x84,0x82,0x8F,0xA4,0x9C,0x8B,0x84,0x7C,0x8F,0x9F,0x95,0x8F,0x81,0x69,0x6E, + 0x7F,0x68,0x6E,0x8C,0x73,0x6B,0x79,0x70,0x82,0x78,0x72,0x86,0x76,0x66,0x6A,0x6C, + 0x6B,0x8F,0x9C,0x98,0x8F,0x86,0x8F,0x83,0x84,0x8E,0x8D,0x96,0x8A,0x78,0x8C,0x94, + 0x8D,0x8B,0x92,0x87,0x6A,0x63,0x66,0x6E,0x75,0x73,0x79,0x7C,0x63,0x63,0x77,0x6F, + 0x63,0x80,0x8C,0x7F,0x8A,0x84,0x88,0x98,0x98,0xA3,0xBA,0xB2,0xA5,0xA7,0xA2,0x97, + 0x7B,0x7C,0x77,0x6A,0x68,0x56,0x53,0x63,0x71,0x7B,0x82,0x81,0x76,0x67,0x64,0x71, + 0x83,0x7F,0x73,0x70,0x77,0x84,0x84,0x8E,0x99,0xA5,0xA1,0x86,0x89,0x8C,0x80,0x82, + 0x8C,0x7E,0x72,0x6E,0x66,0x6D,0x79,0x82,0x8E,0x95,0x73,0x71,0x87,0x73,0x7D,0x83, + 0x83,0x79,0x66,0x79,0x8E,0x89,0x7A,0x8F,0x95,0x8E,0x85,0x6E,0x80,0x85,0x7A,0x8D, + 0x87,0x77,0x79,0x79,0x8F,0x93,0x87,0x90,0x8B,0x75,0x73,0x82,0x7E,0x80,0x88,0x76, + 0x79,0x7C,0x5F,0x6C,0x77,0x63,0x7D,0x8C,0x74,0x76,0x7A,0x76,0x7E,0x86,0x94,0x8E, + 0x87,0x95,0x93,0x96,0x8B,0x90,0xA5,0xAA,0x9C,0x8C,0x8A,0x7B,0x80,0x7D,0x82,0x78, + 0x62,0x78,0x74,0x6C,0x72,0x78,0x7F,0x7B,0x75,0x80,0x77,0x58,0x6D,0x8F,0x80,0x7A, + 0x7D,0x71,0x7B,0x80,0x7E,0x9A,0xA3,0x86,0x89,0x94,0x82,0x86,0x8E,0x93,0x87,0x7C, + 0x7D,0x70,0x6F,0x66,0x6B,0x7C,0x70,0x63,0x74,0x6E,0x6F,0x7A,0x7B,0x88,0x7A,0x7E, + 0x8C,0x93,0x94,0x8C,0x99,0x9A,0x91,0x82,0x7F,0x6E,0x70,0x86,0x77,0x6C,0x82,0x85, + 0x7D,0x8B,0x84,0x8E,0x93,0x7B,0x68,0x78,0x85,0x79,0x8F,0x99,0x8A,0x88,0x80,0x7D, + 0x77,0x6B,0x68,0x6F,0x88,0x87,0x7A,0x86,0x83,0x87,0x92,0x8E,0x84,0x7B,0x7A,0x76, + 0x7C,0x88,0x92,0xA0,0x95,0x90,0xA3,0x90,0x78,0x87,0x8D,0x80,0x7A,0x76,0x6E,0x65, + 0x5E,0x68,0x87,0x78,0x6C,0x94,0x84,0x70,0x7F,0x86,0x89,0x8A,0x86,0x7D,0x78,0x74, + 0x74,0x7C,0x8F,0x80,0x7B,0x87,0x77,0x6D,0x78,0x8D,0x79,0x6B,0x80,0x7C,0x6B,0x70, + 0x7B,0x7E,0x89,0x89,0x97,0x90,0x71,0x74,0x7E,0x7F,0x76,0x79,0x81,0x7B,0x83,0x87, + 0x9D,0xA8,0x87,0x8F,0x9A,0x77,0x77,0x85,0x8A,0x7F,0x6E,0x73,0x7A,0x77,0x71,0x79, + 0x8B,0x82,0x7C,0x89,0x83,0x6E,0x69,0x83,0x84,0x73,0x84,0x90,0x83,0x81,0x7C,0x89, + 0x9A,0x88,0x8F,0x93,0x86,0x71,0x79,0x9A,0x83,0x7A,0x7C,0x6F,0x6D,0x66,0x71,0x94, + 0x8E,0x7B,0x9C,0x96,0x82,0x94,0x90,0x8E,0x8C,0x77,0x70,0x78,0x70,0x6B,0x6F,0x7C, + 0x7A,0x7C,0x81,0x76,0x72,0x8B,0xA4,0x90,0x7F,0x8B,0x8E,0x79,0x74,0x72,0x80,0x8F, + 0x85,0x89,0x7C,0x64,0x5A,0x68,0x70,0x69,0x74,0x6A,0x73,0x85,0x78,0x90,0x92,0x6E, + 0x81,0x99,0x7C,0x68,0x7B,0x97,0x8A,0x7B,0x81,0x80,0x7D,0x75,0x79,0x88,0x9B,0x99, + 0x97,0x99,0x82,0x84,0x93,0x8C,0x7C,0x7A,0x7E,0x7F,0x7C,0x7E,0x84,0x82,0x84,0x89, + 0x79,0x68,0x59,0x50,0x6E,0x76,0x7C,0x81,0x7C,0x8F,0x7F,0x7E,0x9B,0x8D,0x86,0x97, + 0x94,0x8F,0x8A,0x95,0x98,0x8D,0x89,0x7A,0x79,0x70,0x65,0x6A,0x66,0x74,0x7F,0x76, + 0x81,0x72,0x7C,0xA3,0x9C,0x95,0x95,0x9E,0x9E,0x82,0x79,0x80,0x82,0x80,0x81,0x7C, + 0x6C,0x64,0x5B,0x6F,0x89,0x7E,0x73,0x7D,0x7A,0x73,0x7C,0x77,0x76,0x85,0x8A,0x89, + 0x79,0x6D,0x87,0x86,0x89,0x97,0x8A,0x87,0x72,0x6C,0x73,0x7B,0x8B,0x81,0x7F,0x89, + 0x76,0x76,0x90,0x8B,0x78,0x7A,0x8F,0x87,0x76,0x7C,0x78,0x82,0x9A,0x8D,0x86,0x78, + 0x70,0x7F,0x81,0x82,0x75,0x74,0x7D,0x74,0x73,0x7B,0x7F,0x8D,0x98,0xA1,0xA6,0x85, + 0x7A,0x86,0x7F,0x80,0x7C,0x7E,0x75,0x76,0x79,0x76,0x80,0x73,0x6F,0x8C,0x94,0x6E, + 0x97,0xA6,0x6A,0x7F,0x84,0x87,0x88,0x75,0x86,0x6F,0x7D,0x91,0x79,0x7E,0x7A,0x6B, + 0x74,0x8C,0x91,0x8E,0x8B,0x8D,0x94,0x8C,0x73,0x74,0x8C,0x87,0x83,0x78,0x70,0x70, + 0x75,0x85,0x86,0x8A,0x83,0x78,0x7A,0x66,0x6B,0x95,0x8B,0x80,0x97,0x82,0x77,0x8A, + 0x7C,0x7D,0x7C,0x72,0x8E,0x8D,0x75,0x77,0x72,0x84,0x84,0x71,0x71,0x58,0x5E,0x72, + 0x80,0x83,0x67,0x6B,0x7B,0x74,0x6B,0x7E,0x94,0x96,0xA3,0xB8,0xA6,0x81,0x87,0x9A, + 0x98,0x87,0x82,0x80,0x7D,0x7E,0x5F,0x6C,0x95,0x80,0x7C,0x8C,0x6D,0x74,0x88,0x72, + 0x77,0x73,0x76,0x83,0x7D,0x79,0x78,0x93,0x8B,0x83,0x90,0x7D,0x6B,0x63,0x70,0x8E, + 0x93,0x80,0x8B,0x95,0x86,0x6C,0x76,0x8F,0x7F,0x82,0x84,0x76,0x76,0x79,0x8A,0xA0, + 0xA8,0x98,0x8D,0x8A,0x78,0x76,0x8F,0x96,0x82,0x88,0x86,0x70,0x71,0x7B,0x77,0x69, + 0x64,0x7E,0x8A,0x76,0x67,0x6D,0x88,0x80,0x7F,0x87,0x72,0x71,0x62,0x73,0x8D,0x78, + 0x7F,0x88,0x81,0x70,0x73,0x95,0x90,0x87,0x9C,0x9E,0x7C,0x6E,0x77,0x83,0x87,0x7F, + 0x7A,0x78,0x6A,0x55,0x61,0x83,0x80,0x7D,0xA1,0x9A,0x7F,0x92,0x8F,0x8D,0x7C,0x7C, + 0x95,0x85,0x7B,0x6F,0x80,0x85,0x82,0x9B,0x90,0x77,0x68,0x6E,0x87,0x7F,0x66,0x78, + 0x93,0x81,0x67,0x7D,0x9A,0x84,0x83,0x95,0x8E,0x7E,0x75,0x83,0x95,0x8C,0x83,0x88, + 0x7E,0x70,0x63,0x7D,0x84,0x6D,0x87,0x8A,0x72,0x71,0x79,0x7F,0x72,0x6B,0x89,0xA8, + 0xA0,0x7E,0x85,0xA4,0x8D,0x8B,0x9E,0x91,0x78,0x5D,0x7B,0x96,0x77,0x6F,0x82,0x7D, + 0x64,0x68,0x7C,0x7D,0x73,0x86,0x9A,0x80,0x62,0x6A,0x8A,0x8B,0x7C,0x82,0x8A,0x79, + 0x5A,0x66,0x8E,0x88,0x6D,0x84,0x94,0x78,0x7A,0x84,0x7B,0x71,0x71,0x8C,0x91,0x79, + 0x65,0x79,0x82,0x77,0x9A,0xA3,0x90,0x7D,0x72,0x92,0x96,0x76,0x7F,0x93,0x84,0x6C, + 0x6D,0x87,0x7E,0x6F,0x81,0x8A,0x88,0x74,0x6E,0x89,0x88,0x76,0x7A,0x78,0x65,0x61, + 0x77,0x8A,0x8C,0x90,0x9C,0x9A,0x7E,0x7F,0x8D,0x74,0x6C,0x75,0x90,0x9B,0x78,0x71, + 0x8A,0x85,0x7C,0x93,0x96,0x80,0x67,0x67,0x83,0x8B,0x74,0x80,0x97,0x7E,0x7C,0x90, + 0x90,0x87,0x90,0x9C,0x92,0x8D,0x72,0x74,0x82,0x70,0x7B,0x88,0x7D,0x61,0x61,0x76, + 0x78,0x6C,0x75,0x91,0x82,0x72,0x86,0x88,0x71,0x65,0x78,0x8A,0x84,0x70,0x7E,0x8A, + 0x78,0x91,0x9D,0x98,0x88,0x64,0x6D,0x85,0x7E,0x70,0x81,0x90,0x74,0x6B,0x81,0x75, + 0x67,0x74,0x84,0x93,0x8B,0x78,0x89,0x98,0x8F,0x9D,0x98,0x82,0x73,0x68,0x75,0x75, + 0x74,0x8C,0x97,0x8C,0x84,0x92,0x83,0x6E,0x72,0x72,0x81,0x76,0x65,0x7C,0x83,0x6F, + 0x80,0xA2,0x9B,0x84,0x77,0x7E,0x8A,0x8C,0x87,0x8A,0x89,0x79,0x7E,0x86,0x80,0x7F, + 0x8F,0x88,0x89,0x8A,0x71,0x74,0x70,0x72,0x87,0x88,0x7C,0x71,0x7E,0x89,0x7A,0x7E, + 0x99,0x9A,0x96,0x97,0x9A,0x8B,0x7A,0x7E,0x7C,0x70,0x68,0x6D,0x71,0x6F,0x6F,0x82, + 0x93,0x92,0x7E,0x6D,0x6F,0x6A,0x74,0x88,0x8D,0x83,0x73,0x7F,0x91,0x7C,0x7C,0x8E, + 0x90,0x8E,0x82,0x84,0x7A,0x75,0x81,0x88,0x82,0x71,0x70,0x70,0x69,0x72,0x74,0x75, + 0x8C,0x87,0x86,0x9B,0x89,0x7C,0x91,0x92,0x7D,0x6B,0x81,0x8F,0x6F,0x6C,0x7E,0x8F, + 0x96,0x8D,0x95,0x8E,0x74,0x76,0x87,0x7B,0x73,0x6B,0x6E,0x81,0x74,0x7D,0x91,0x85, + 0x99,0xA1,0x90,0x87,0x6F,0x75,0x8B,0x84,0x79,0x80,0x8A,0x7A,0x6C,0x7D,0x84,0x7B, + 0x85,0x8E,0x93,0x85,0x6C,0x78,0x74,0x61,0x71,0x7E,0x82,0x84,0x82,0x85,0x87,0x92, + 0x99,0x9E,0x93,0x82,0x88,0x8B,0x88,0x7A,0x75,0x88,0x81,0x6E,0x75,0x7D,0x71,0x70, + 0x84,0x7F,0x76,0x73,0x75,0x7F,0x76,0x75,0x7D,0x7C,0x7A,0x83,0x82,0x82,0x8A,0x8A, + 0x96,0x92,0x82,0x80,0x8B,0x87,0x6B,0x78,0x88,0x78,0x69,0x68,0x71,0x68,0x6C,0x84, + 0x92,0x8D,0x81,0x88,0x86,0x7E,0x7F,0x7E,0x82,0x84,0x7F,0x82,0x85,0x84,0x87,0x94, + 0x9A,0x8B,0x89,0x8E,0x8B,0x7C,0x79,0x88,0x7B,0x68,0x6C,0x77,0x6D,0x71,0x83,0x8D, + 0x94,0x8C,0x84,0x82,0x80,0x75,0x75,0x81,0x84,0x7D,0x75,0x7D,0x83,0x83,0x8B,0x94, + 0x8D,0x85,0x87,0x85,0x75,0x74,0x7C,0x79,0x75,0x77,0x80,0x79,0x7F,0x84,0x8D,0x97, + 0x8D,0x88,0x87,0x86,0x7B,0x7F,0x83,0x86,0x8D,0x7B,0x7B,0x83,0x7C,0x84,0x7F,0x78, + 0x83,0x76,0x71,0x79,0x70,0x7C,0x80,0x71,0x78,0x7F,0x77,0x75,0x82,0x8A,0x89,0x8A, + 0x82,0x84,0x88,0x7F,0x7D,0x7F,0x86,0x8C,0x7C,0x7B,0x7E,0x72,0x78,0x78,0x79,0x79, + 0x7A,0x85,0x76,0x79,0x84,0x7B,0x78,0x79,0x7D,0x7B,0x7A,0x80,0x91,0x8F,0x90,0x8F, + 0x85,0x8C,0x88,0x86,0x7C,0x81,0x81,0x73,0x79,0x71,0x72,0x7E,0x81,0x7E,0x80,0x8C, + 0x82,0x7B,0x80,0x88,0x84,0x7B,0x85,0x8A,0x88,0x79,0x7B,0x8F,0x88,0x81,0x81,0x89, + 0x87,0x7A,0x78,0x79,0x7D,0x7B,0x7A,0x84,0x84,0x7B,0x84,0x85,0x84,0x87,0x82,0x7E, + 0x82,0x77,0x7E,0x86,0x75,0x7D,0x84,0x80,0x79,0x80,0x8A,0x85,0x86,0x7B,0x7D,0x78, + 0x76,0x75,0x71,0x7F,0x7B,0x77,0x7E,0x81,0x7E,0x7B,0x81,0x80,0x7A,0x82,0x82,0x76, + 0x78,0x7E,0x78,0x79,0x7A,0x81,0x82,0x75,0x82,0x87,0x80,0x84,0x82,0x7B,0x7E,0x82, + 0x76,0x7A,0x8A,0x85,0x80,0x84,0x85,0x7F,0x7E,0x7F,0x83,0x81,0x82,0x81,0x7E,0x8B, + 0x89,0x83,0x86,0x7F,0x84,0x83,0x72,0x82,0x7F,0x72,0x86,0x7C,0x7E,0x82,0x83,0x9D, + 0x83,0x8A,0x81,0x65,0x86,0x7D,0x69,0x71,0x7E,0x84,0x8C,0x8E,0x91,0x8E,0x90,0x9B, + 0x9E,0x9E,0x8F,0x8D,0x87,0x7E,0x89,0x86,0x7E,0x78,0x73,0x6B,0x67,0x65,0x58,0x56, + 0x62,0x61,0x62,0x67,0x69,0x7B,0x7C,0x77,0x8A,0x7B,0x7B,0x88,0x70,0x78,0x92,0x96, + 0x7C,0x85,0xA3,0x99,0x9D,0xAC,0xA0,0xA5,0xAA,0x9B,0x9A,0x95,0x8C,0x8A,0x8B,0x89, + 0x87,0x81,0x7E,0x7F,0x7A,0x7C,0x7B,0x72,0x68,0x67,0x69,0x60,0x52,0x4F,0x49,0x42, + 0x47,0x52,0x59,0x5E,0x5F,0x6A,0x82,0x90,0x8F,0x8B,0x8B,0x88,0x87,0x94,0x9E,0xA1, + 0xA4,0xAD,0xBB,0xC3,0xC6,0xCD,0xD1,0xCC,0xC6,0xB9,0xAF,0xAD,0xA9,0xA8,0xA6,0x9A, + 0x81,0x75,0x76,0x76,0x74,0x6D,0x60,0x55,0x54,0x4D,0x3E,0x35,0x2E,0x30,0x34,0x36, + 0x3C,0x41,0x42,0x49,0x53,0x59,0x60,0x68,0x70,0x71,0x78,0x84,0x89,0x8A,0x8D,0x8D, + 0x8E,0x92,0x96,0x97,0x93,0x93,0x95,0x9B,0xA3,0xA1,0x9B,0x95,0x90,0x8D,0x85,0x7E, + 0x7C,0x78,0x74,0x76,0x75,0x75,0x75,0x78,0x83,0x90,0x91,0x92,0x9F,0xA7,0xA3,0x9A, + 0x92,0x8B,0x86,0x83,0x7C,0x79,0x78,0x74,0x75,0x77,0x72,0x72,0x78,0x7C,0x7C,0x79, + 0x7E,0x82,0x80,0x7A,0x77,0x77,0x75,0x88,0x9B,0x91,0x92,0x9D,0x9A,0x9A,0x9A,0x92, + 0x91,0x9B,0x9A,0x97,0x9F,0xA2,0xA2,0xA0,0x91,0x89,0x8A,0x81,0x79,0x7A,0x7B,0x7A, + 0x7A,0x79,0x74,0x6F,0x7A,0x89,0x82,0x78,0x79,0x7D,0x7C,0x7B,0x77,0x78,0x80,0x7E, + 0x78,0x7C,0x82,0x84,0x84,0x7E,0x7E,0x88,0x88,0x84,0x88,0x90,0x8F,0x82,0x7F,0x7F, + 0x87,0x95,0x93,0x88,0x88,0x89,0x82,0x7D,0x75,0x71,0x7A,0x7A,0x72,0x73,0x79,0x7A, + 0x74,0x6D,0x6F,0x72,0x70,0x6C,0x6E,0x75,0x73,0x67,0x5B,0x59,0x5B,0x66,0x6E,0x65, + 0x64,0x69,0x5F,0x57,0x50,0x48,0x52,0x57,0x55,0x5B,0x5F,0x5E,0x57,0x51,0x4D,0x52, + 0x59,0x5A,0x63,0x6C,0x6B,0x66,0x6A,0x6E,0x72,0x81,0x92,0x9A,0x9F,0xA6,0xA7,0xA8, + 0xB2,0xBD,0xCC,0xD8,0xD9,0xDB,0xDD,0xDA,0xD8,0xD0,0xC8,0xCB,0xCC,0xC6,0xC6,0xC8, + 0xC1,0xB4,0xA9,0xA8,0x9C,0x95,0xA3,0x9F,0x8F,0x85,0x78,0x6E,0x69,0x61,0x62,0x67, + 0x64,0x61,0x61,0x5E,0x59,0x56,0x55,0x58,0x5E,0x5C,0x5F,0x66,0x61,0x56,0x57,0x5F, + 0x60,0x60,0x6C,0x74,0x6C,0x69,0x6B,0x67,0x65,0x66,0x6D,0x7C,0x83,0x81,0x86,0x87, + 0x82,0x82,0x89,0x91,0x98,0x9E,0xA7,0xAC,0xA6,0xA1,0xA4,0xAB,0xA9,0xA1,0xAF,0xB7, + 0xA4,0x9B,0x9B,0x94,0x90,0x8D,0x90,0x98,0x95,0x87,0x83,0x81,0x73,0x6D,0x74,0x78, + 0x75,0x71,0x71,0x6E,0x67,0x62,0x65,0x66,0x66,0x63,0x65,0x74,0x6D,0x5C,0x63,0x69, + 0x5E,0x5B,0x5F,0x65,0x69,0x5D,0x55,0x5C,0x56,0x4B,0x4E,0x55,0x58,0x57,0x54,0x59, + 0x56,0x4C,0x4B,0x52,0x55,0x4E,0x58,0x6D,0x65,0x5A,0x62,0x64,0x61,0x67,0x75,0x82, + 0x86,0x80,0x86,0x95,0x92,0x93,0xA5,0xB3,0xB7,0xB7,0xBB,0xBF,0xBD,0xB5,0xBC,0xC2, + 0xBC,0xBC,0xB3,0xC1,0xCC,0xB1,0xA9,0xB3,0xA4,0x98,0x9F,0xA2,0xA5,0x9F,0x92,0x9A, + 0x9D,0x8F,0x93,0x9D,0x9E,0xA0,0xA2,0x9F,0x9A,0x91,0x90,0x92,0x92,0x8C,0x89,0x9C, + 0x96,0x7D,0x84,0x87,0x79,0x79,0x81,0x86,0x86,0x79,0x75,0x7D,0x74,0x6C,0x76,0x79, + 0x76,0x7A,0x79,0x79,0x75,0x6C,0x6E,0x6F,0x69,0x72,0x6D,0x70,0x83,0x6D,0x63,0x6F, + 0x62,0x58,0x64,0x69,0x6E,0x6D,0x62,0x67,0x6A,0x5E,0x67,0x74,0x71,0x76,0x76,0x73, + 0x74,0x6E,0x6F,0x75,0x75,0x70,0x6C,0x81,0x84,0x6B,0x70,0x79,0x6C,0x65,0x6C,0x76, + 0x7B,0x71,0x70,0x7C,0x73,0x67,0x72,0x78,0x79,0x7B,0x7C,0x7E,0x7A,0x73,0x7A,0x7F, + 0x7E,0x84,0x7E,0x8B,0x9F,0x83,0x78,0x8C,0x7F,0x6F,0x7B,0x84,0x89,0x84,0x7B,0x85, + 0x85,0x77,0x82,0x8E,0x8C,0x91,0x98,0x9A,0x9B,0x9A,0x9F,0xA3,0xA0,0xA0,0x9B,0xAE, + 0xBA,0x9F,0x9E,0xA7,0x91,0x83,0x8A,0x8F,0x8C,0x7F,0x79,0x81,0x71,0x5E,0x68,0x6C, + 0x63,0x64,0x67,0x67,0x5F,0x56,0x5E,0x63,0x61,0x66,0x5F,0x6E,0x84,0x6E,0x69,0x7D, + 0x72,0x69,0x75,0x7E,0x83,0x82,0x7D,0x88,0x87,0x7A,0x81,0x89,0x86,0x88,0x8F,0x91, + 0x91,0x8E,0x91,0x93,0x91,0x94,0x91,0x9E,0xB4,0xA1,0x9C,0xAE,0xA0,0x94,0x9F,0xA5, + 0xA7,0xA7,0xA1,0xA4,0x9F,0x8E,0x94,0x9A,0x93,0x93,0x94,0x92,0x90,0x87,0x86,0x8B, + 0x84,0x87,0x80,0x80,0x96,0x86,0x72,0x81,0x78,0x61,0x67,0x6C,0x6C,0x6B,0x62,0x68, + 0x69,0x55,0x55,0x5F,0x59,0x59,0x5E,0x5F,0x5F,0x57,0x54,0x5A,0x56,0x56,0x53,0x57, + 0x70,0x63,0x4F,0x61,0x5F,0x4C,0x52,0x5C,0x5F,0x5D,0x55,0x5B,0x60,0x50,0x53,0x5F, + 0x5D,0x5F,0x63,0x67,0x6B,0x68,0x6A,0x70,0x6F,0x75,0x79,0x7C,0x9A,0x9F,0x8E,0xA0, + 0xA7,0x96,0x99,0xA5,0xAB,0xB0,0xAA,0xAA,0xB1,0xA2,0x9B,0xA4,0xA0,0x9C,0x9E,0x9F, + 0x9B,0x92,0x8D,0x91,0x8D,0x8B,0x8D,0x84,0x97,0xA0,0x87,0x8F,0x9D,0x8D,0x88,0x94, + 0x9A,0x9D,0x99,0x98,0xA3,0x9A,0x91,0x9B,0x9C,0x99,0x9D,0xA1,0xA5,0xA0,0x9D,0x9F, + 0x9C,0x9B,0xA0,0x97,0xA3,0xB9,0xA2,0x9A,0xAC,0x9D,0x8F,0x97,0x9B,0xA0,0x9D,0x94, + 0x9B,0x97,0x88,0x8F,0x94,0x8E,0x8C,0x8C,0x8A,0x85,0x7E,0x7F,0x81,0x7B,0x7E,0x77, + 0x6F,0x87,0x80,0x68,0x79,0x75,0x5D,0x5E,0x63,0x63,0x61,0x59,0x5D,0x5E,0x4C,0x48, + 0x4D,0x48,0x45,0x48,0x48,0x46,0x44,0x41,0x41,0x40,0x43,0x43,0x3B,0x53,0x5B,0x3F, + 0x48,0x55,0x43,0x40,0x4C,0x52,0x54,0x4F,0x51,0x5C,0x57,0x52,0x5F,0x65,0x64,0x67, + 0x6B,0x70,0x6D,0x6E,0x73,0x75,0x76,0x7B,0x76,0x83,0xA0,0x90,0x89,0xA1,0x9A,0x90, + 0x9B,0xA6,0xB0,0xAF,0xAC,0xB9,0xBC,0xB0,0xB6,0xC1,0xBF,0xBF,0xC1,0xC0,0xBD,0xB7, + 0xB5,0xB8,0xB2,0xB2,0xA8,0xA5,0xBF,0xB1,0x98,0xA8,0xA5,0x90,0x92,0x9A,0x9B,0x97, + 0x91,0x96,0x99,0x8B,0x89,0x94,0x92,0x8E,0x92,0x97,0x98,0x94,0x93,0x95,0x92,0x93, + 0x91,0x8B,0xA3,0xAA,0x8F,0x96,0xA0,0x8C,0x86,0x8E,0x95,0x96,0x8C,0x8A,0x91,0x86, + 0x7D,0x85,0x85,0x80,0x7F,0x80,0x80,0x7D,0x78,0x7A,0x7C,0x7A,0x76,0x6D,0x7E,0x8B, + 0x72,0x70,0x7D,0x6B,0x61,0x68,0x6C,0x70,0x6A,0x66,0x6E,0x69,0x5A,0x5B,0x5F,0x5C, + 0x59,0x56,0x57,0x54,0x4B,0x47,0x48,0x47,0x47,0x3F,0x4A,0x62,0x50,0x41,0x53,0x4E, + 0x41,0x45,0x4E,0x58,0x54,0x4B,0x55,0x58,0x50,0x53,0x5C,0x5F,0x5D,0x5D,0x66,0x6A, + 0x66,0x65,0x6A,0x6E,0x70,0x67,0x73,0x94,0x86,0x75,0x89,0x8A,0x7E,0x81,0x8A,0x97, + 0x99,0x91,0x9A,0xA3,0x9C,0x9C,0xA4,0xAB,0xAF,0xB1,0xB8,0xBC,0xBA,0xB6,0xBA,0xBC, + 0xBD,0xB6,0xB4,0xCF,0xCB,0xAF,0xB5,0xB9,0xAA,0xA4,0xA3,0xA9,0xA8,0x98,0x96,0x9A, + 0x8E,0x84,0x84,0x88,0x89,0x83,0x83,0x89,0x86,0x80,0x80,0x81,0x84,0x7C,0x76,0x94, + 0x96,0x7A,0x81,0x88,0x7E,0x7A,0x7B,0x87,0x8E,0x83,0x80,0x8A,0x86,0x80,0x80,0x85, + 0x8C,0x87,0x84,0x8A,0x8B,0x84,0x81,0x87,0x8B,0x82,0x7E,0x9A,0x9E,0x83,0x84,0x88, + 0x7F,0x7B,0x79,0x84,0x8D,0x80,0x79,0x82,0x81,0x79,0x75,0x7A,0x7D,0x74,0x70,0x74, + 0x74,0x6C,0x67,0x67,0x6B,0x5F,0x5C,0x79,0x74,0x5B,0x5F,0x5F,0x58,0x54,0x51,0x5E, + 0x65,0x55,0x51,0x5B,0x59,0x50,0x50,0x58,0x5D,0x59,0x56,0x5C,0x5E,0x58,0x52,0x56, + 0x5D,0x53,0x5A,0x78,0x6E,0x5F,0x67,0x68,0x67,0x65,0x67,0x74,0x78,0x6D,0x6D,0x76, + 0x75,0x72,0x73,0x7C,0x84,0x83,0x85,0x8C,0x8E,0x8C,0x8A,0x93,0x98,0x92,0xA7,0xBC, + 0xAA,0xA4,0xAA,0xA5,0xA3,0xA1,0xA2,0xAF,0xB0,0xA2,0x9F,0xA2,0x9B,0x91,0x8D,0x91, + 0x92,0x8F,0x8A,0x87,0x86,0x81,0x7A,0x7F,0x7A,0x74,0x8E,0x90,0x79,0x7C,0x7B,0x75, + 0x76,0x73,0x7B,0x87,0x83,0x7E,0x82,0x87,0x84,0x7E,0x81,0x8A,0x8C,0x8B,0x8A,0x8D, + 0x8E,0x8C,0x89,0x8B,0x87,0x94,0xAB,0x9D,0x90,0x96,0x90,0x8D,0x8C,0x8B,0x96,0x9A, + 0x93,0x8E,0x8F,0x92,0x8F,0x8B,0x8F,0x95,0x96,0x92,0x8B,0x8C,0x8B,0x83,0x82,0x7E, + 0x81,0x9B,0x9A,0x84,0x87,0x85,0x7C,0x7A,0x74,0x79,0x82,0x7C,0x74,0x71,0x71,0x71, + 0x6C,0x66,0x67,0x6E,0x6D,0x66,0x65,0x66,0x61,0x5C,0x59,0x53,0x68,0x7B,0x68,0x5D, + 0x60,0x5B,0x5C,0x57,0x59,0x69,0x6F,0x6A,0x65,0x64,0x69,0x6B,0x65,0x65,0x6D,0x75, + 0x74,0x70,0x73,0x77,0x76,0x75,0x72,0x7B,0x97,0x96,0x84,0x86,0x88,0x8A,0x8C,0x89, + 0x91,0x9D,0xA1,0x9C,0x98,0x9E,0xA6,0xA4,0x9E,0x9E,0xA5,0xAA,0xA4,0x9E,0x9D,0x99, + 0x96,0x8E,0x88,0x9E,0xAA,0x97,0x8B,0x83,0x7E,0x80,0x77,0x70,0x77,0x7F,0x7C,0x73, + 0x6A,0x6D,0x74,0x72,0x6E,0x72,0x79,0x7B,0x79,0x76,0x76,0x78,0x78,0x72,0x7F,0x95, + 0x91,0x86,0x82,0x7E,0x84,0x88,0x83,0x86,0x8F,0x96,0x97,0x8F,0x8A,0x8E,0x90,0x8F, + 0x90,0x92,0x96,0x98,0x96,0x93,0x90,0x8E,0x89,0x8D,0xA2,0xA3,0x98,0x92,0x88,0x85, + 0x87,0x83,0x82,0x88,0x8B,0x8F,0x8B,0x81,0x7E,0x81,0x7F,0x7B,0x7A,0x7C,0x7C,0x77, + 0x73,0x6E,0x6B,0x66,0x64,0x76,0x7F,0x73,0x6B,0x63,0x5C,0x61,0x5E,0x56,0x5A,0x5E, + 0x61,0x67,0x61,0x5D,0x61,0x60,0x61,0x62,0x62,0x66,0x68,0x69,0x6A,0x69,0x67,0x64, + 0x72,0x86,0x82,0x7F,0x7D,0x74,0x7A,0x7F,0x79,0x7C,0x7E,0x7E,0x87,0x8A,0x86,0x88, + 0x89,0x88,0x8D,0x8F,0x8C,0x8E,0x8F,0x90,0x91,0x93,0x93,0x91,0x9B,0xA2,0x98,0x97, + 0x95,0x8E,0x96,0x95,0x8B,0x8D,0x89,0x84,0x88,0x85,0x83,0x85,0x80,0x7D,0x7F,0x7D, + 0x7B,0x7C,0x7E,0x7C,0x7B,0x7C,0x7A,0x7A,0x82,0x81,0x7D,0x83,0x82,0x80,0x86,0x82, + 0x7E,0x85,0x84,0x84,0x86,0x84,0x84,0x84,0x81,0x84,0x87,0x87,0x88,0x8A,0x8A,0x8A, + 0x89,0x8C,0x8B,0x8A,0x8F,0x8C,0x8A,0x8E,0x8B,0x8D,0x92,0x8D,0x89,0x8C,0x88,0x87, + 0x8A,0x88,0x85,0x84,0x81,0x83,0x86,0x84,0x84,0x85,0x85,0x85,0x85,0x85,0x80,0x7F, + 0x86,0x86,0x80,0x81,0x7F,0x7D,0x81,0x7C,0x7B,0x7C,0x77,0x77,0x79,0x73,0x70,0x6F, + 0x6E,0x6F,0x6F,0x6E,0x6F,0x6F,0x70,0x72,0x76,0x75,0x73,0x73,0x7B,0x7C,0x75,0x79, + 0x7A,0x78,0x7D,0x7C,0x7A,0x7C,0x78,0x78,0x7D,0x79,0x76,0x78,0x75,0x73,0x78,0x7A, + 0x7A,0x7A,0x7B,0x80,0x82,0x80,0x82,0x83,0x86,0x8B,0x88,0x87,0x8A,0x85,0x89,0x91, + 0x8B,0x88,0x87,0x83,0x84,0x83,0x80,0x82,0x7E,0x79,0x7D,0x7F,0x7C,0x7C,0x7D,0x7F, + 0x7F,0x7E,0x7E,0x7E,0x7A,0x7F,0x83,0x7D,0x7E,0x7D,0x7B,0x81,0x7F,0x78,0x7E,0x7C, + 0x77,0x7B,0x7A,0x78,0x78,0x75,0x77,0x7B,0x7B,0x7B,0x7E,0x7F,0x81,0x84,0x85,0x86, + 0x84,0x82,0x89,0x8D,0x86,0x88,0x89,0x85,0x8A,0x8C,0x89,0x8B,0x88,0x86,0x8B,0x87, + 0x83,0x83,0x80,0x7F,0x83,0x84,0x84,0x84,0x85,0x86,0x86,0x86,0x86,0x86,0x84,0x86, + 0x8B,0x85,0x80,0x85,0x87,0x94,0x7D,0x65,0x7F,0x8D,0x83,0x72,0x8C,0x81,0x64,0x74, + 0x76,0x78,0x78,0x87,0x89,0x73,0x7C,0x84,0x84,0x77,0x7C,0x84,0x77,0x78,0x76,0x77, + 0x7E,0x7C,0x7B,0x85,0x78,0x6F,0x78,0x70,0x70,0x73,0x74,0x6F,0x74,0x78,0x71,0x7B, + 0x82,0x81,0x80,0x7E,0x87,0x87,0x88,0x8A,0x82,0x81,0x83,0x85,0x85,0x87,0x88,0x7D, + 0x7E,0x83,0x7F,0x84,0x7F,0x78,0x77,0x78,0x72,0x6F,0x76,0x75,0x7F,0x84,0x76,0x75, + 0x7F,0x81,0x81,0x8D,0x8F,0x85,0x84,0x82,0x84,0x87,0x89,0x86,0x82,0x81,0x80,0x83, + 0x83,0x83,0x7A,0x71,0x75,0x76,0x70,0x71,0x72,0x70,0x70,0x72,0x76,0x77,0x74,0x76, + 0x77,0x77,0x78,0x7A,0x7A,0x7D,0x82,0x8D,0x8A,0x80,0x8A,0x83,0x7D,0x89,0x8A,0x84, + 0x84,0x85,0x82,0x89,0x87,0x81,0x82,0x74,0x77,0x80,0x81,0x80,0x80,0x82,0x81,0x83, + 0x80,0x7C,0x82,0x86,0x7E,0x87,0x8A,0x89,0x89,0x7F,0x7E,0x7F,0x86,0x85,0x86,0x84, + 0x79,0x7E,0x85,0x81,0x7F,0x7D,0x77,0x7C,0x7C,0x7E,0x7F,0x7C,0x7F,0x82,0x82,0x7A, + 0x80,0x85,0x85,0x83,0x84,0x87,0x81,0x82,0x80,0x7C,0x7C,0x7F,0x7C,0x7D,0x7B,0x74, + 0x7A,0x76,0x76,0x7B,0x78,0x7A,0x7E,0x7C,0x76,0x7C,0x82,0x7F,0x83,0x82,0x85,0x83, + 0x85,0x8B,0x8A,0x90,0x8A,0x82,0x85,0x83,0x85,0x85,0x85,0x81,0x81,0x78,0x76,0x82, + 0x80,0x83,0x87,0x7D,0x7B,0x83,0x83,0x82,0x7E,0x81,0x8A,0x89,0x85,0x85,0x85,0x7D, + 0x7A,0x86,0x92,0x93,0x8F,0x86,0x79,0x7D,0x82,0x72,0x71,0x73,0x6F,0x79,0x80,0x7F, + 0x86,0x81,0x7A,0x85,0x89,0x7F,0x7E,0x7D,0x7F,0x89,0x83,0x7F,0x82,0x7F,0x7B,0x79, + 0x84,0x95,0x97,0x96,0x8C,0x76,0x76,0x80,0x7F,0x7F,0x7D,0x79,0x81,0x8A,0x89,0x86, + 0x80,0x81,0x87,0x86,0x83,0x82,0x80,0x88,0x8E,0x87,0x85,0x81,0x7D,0x7A,0x78,0x85, + 0x98,0x9C,0x95,0x8D,0x7F,0x7E,0x80,0x7A,0x75,0x75,0x78,0x83,0x8A,0x85,0x87,0x86, + 0x87,0x86,0x7F,0x79,0x79,0x7C,0x7F,0x84,0x87,0x89,0x89,0x87,0x7E,0x76,0x7F,0x9A, + 0x99,0x94,0x8D,0x7D,0x80,0x81,0x7E,0x77,0x7A,0x7E,0x88,0x88,0x79,0x81,0x88,0x86, + 0x83,0x7F,0x79,0x81,0x83,0x7C,0x80,0x80,0x80,0x7C,0x79,0x79,0x73,0x80,0x9D,0x91, + 0x84,0x8F,0x7F,0x83,0x8E,0x7A,0x79,0x7F,0x77,0x7F,0x82,0x79,0x83,0x88,0x89,0x86, + 0x82,0x83,0x80,0x83,0x7E,0x7D,0x81,0x7E,0x7F,0x80,0x7D,0x7A,0x7D,0x94,0x95,0x80, + 0x88,0x81,0x7B,0x8B,0x7C,0x6F,0x79,0x73,0x7A,0x83,0x75,0x7C,0x85,0x87,0x89,0x81, + 0x81,0x87,0x82,0x7C,0x7B,0x7C,0x85,0x80,0x7C,0x80,0x73,0x75,0x93,0x8E,0x7C,0x8C, + 0x85,0x80,0x8C,0x7A,0x71,0x7D,0x7C,0x7D,0x7E,0x70,0x7C,0x87,0x8B,0x8C,0x82,0x85, + 0x8B,0x81,0x7A,0x7E,0x7D,0x85,0x83,0x7B,0x7E,0x79,0x7C,0x99,0x93,0x7E,0x8A,0x80, + 0x82,0x89,0x73,0x71,0x7F,0x74,0x74,0x7A,0x71,0x7D,0x84,0x82,0x81,0x7D,0x84,0x8A, + 0x80,0x7B,0x7F,0x80,0x81,0x79,0x7A,0x7E,0x71,0x80,0x98,0x85,0x80,0x8D,0x7E,0x87, + 0x87,0x6D,0x75,0x7B,0x6F,0x75,0x77,0x6D,0x7F,0x7F,0x7B,0x86,0x7F,0x84,0x88,0x81, + 0x7D,0x79,0x7B,0x82,0x7A,0x7C,0x81,0x76,0x83,0x91,0x82,0x83,0x8A,0x7E,0x88,0x83, + 0x6E,0x7D,0x7D,0x71,0x7C,0x73,0x70,0x83,0x76,0x7C,0x86,0x76,0x82,0x88,0x7E,0x7D, + 0x7D,0x7D,0x7B,0x76,0x78,0x79,0x73,0x82,0x8A,0x7A,0x83,0x8B,0x7E,0x8A,0x80,0x70, + 0x7F,0x75,0x74,0x79,0x6D,0x77,0x84,0x74,0x79,0x7E,0x79,0x86,0x82,0x80,0x80,0x7C, + 0x7B,0x7C,0x7B,0x7D,0x7D,0x77,0x8B,0x8A,0x7C,0x89,0x86,0x7C,0x8A,0x7A,0x73,0x84, + 0x73,0x76,0x7E,0x72,0x7C,0x7E,0x75,0x80,0x80,0x83,0x8E,0x82,0x7D,0x85,0x81,0x7D, + 0x7E,0x79,0x7E,0x7A,0x7A,0x8C,0x7F,0x7A,0x89,0x7D,0x81,0x8B,0x7A,0x7B,0x84,0x76, + 0x7A,0x75,0x6E,0x80,0x78,0x77,0x82,0x7A,0x84,0x89,0x7B,0x83,0x87,0x7E,0x7C,0x77, + 0x78,0x7D,0x75,0x7E,0x88,0x79,0x84,0x8C,0x81,0x8A,0x88,0x79,0x84,0x7F,0x76,0x80, + 0x73,0x77,0x81,0x7C,0x7C,0x7F,0x7E,0x85,0x84,0x7C,0x89,0x86,0x84,0x82,0x7B,0x81, + 0x7A,0x79,0x85,0x83,0x7B,0x88,0x88,0x81,0x86,0x80,0x81,0x86,0x7C,0x7C,0x7C,0x72, + 0x7D,0x7C,0x75,0x7D,0x7A,0x7D,0x86,0x81,0x83,0x89,0x86,0x83,0x7D,0x7E,0x7E,0x78, + 0x81,0x88,0x80,0x82,0x86,0x7E,0x86,0x83,0x7E,0x87,0x7F,0x7C,0x7F,0x79,0x79,0x80, + 0x79,0x79,0x7D,0x7B,0x85,0x83,0x82,0x87,0x84,0x86,0x85,0x7E,0x85,0x81,0x7F,0x8A, + 0x82,0x81,0x86,0x83,0x89,0x89,0x7F,0x85,0x88,0x7E,0x84,0x7D,0x7D,0x86,0x7B,0x7A, + 0x81,0x7F,0x84,0x86,0x81,0x87,0x83,0x85,0x89,0x80,0x81,0x82,0x7F,0x89,0x88,0x7E, + 0x89,0x85,0x85,0x89,0x81,0x83,0x88,0x82,0x85,0x82,0x7A,0x82,0x7B,0x78,0x7D,0x7B, + 0x7E,0x83,0x7E,0x84,0x89,0x85,0x8A,0x84,0x84,0x84,0x7E,0x85,0x86,0x81,0x86,0x8A, + 0x84,0x8A,0x83,0x7F,0x87,0x81,0x82,0x84,0x80,0x83,0x82,0x79,0x81,0x7E,0x7C,0x83, + 0x7F,0x81,0x86,0x84,0x84,0x84,0x83,0x87,0x81,0x85,0x8A,0x80,0x83,0x84,0x80,0x84, + 0x83,0x7F,0x85,0x85,0x83,0x83,0x7F,0x81,0x7F,0x7D,0x7D,0x7F,0x7E,0x81,0x82,0x83, + 0x86,0x83,0x83,0x81,0x82,0x80,0x81,0x86,0x86,0x81,0x85,0x86,0x7F,0x86,0x82,0x80, + 0x83,0x81,0x81,0x82,0x7C,0x7E,0x82,0x7B,0x7D,0x7F,0x7E,0x81,0x7F,0x7D,0x81,0x80, + 0x82,0x85,0x80,0x85,0x83,0x88,0x8B,0x83,0x84,0x83,0x83,0x84,0x7E,0x7D,0x85,0x80, + 0x7D,0x7E,0x7D,0x7E,0x7D,0x7B,0x7C,0x81,0x7F,0x82,0x80,0x7F,0x82,0x81,0x80,0x84, + 0x83,0x82,0x89,0x84,0x85,0x86,0x84,0x83,0x87,0x84,0x7D,0x82,0x82,0x7E,0x7C,0x7F, + 0x7D,0x7D,0x7D,0x7B,0x7B,0x7D,0x82,0x80,0x82,0x8F,0x90,0x86,0x8C,0x7E,0x77,0x78, + 0x76,0x84,0x7C,0x82,0x7E,0x7C,0x87,0x6B,0x78,0x99,0x79,0x74,0x81,0x75,0x73,0x63, + 0x76,0x86,0x7C,0x82,0x79,0x72,0x72,0x75,0x78,0x76,0x75,0x7F,0x81,0x7C,0x78,0x75, + 0x79,0x78,0x7B,0x82,0x86,0x7F,0x86,0x8D,0x7F,0x77,0x86,0x91,0x87,0x84,0x83,0x7C, + 0x82,0x92,0x95,0x97,0xA9,0xA6,0x9B,0x9B,0x9C,0x94,0x86,0x8A,0x97,0x93,0x99,0x98, + 0x89,0x84,0x7D,0x7B,0x7B,0x74,0x6F,0x74,0x75,0x72,0x6B,0x64,0x64,0x64,0x6B,0x73, + 0x6C,0x6B,0x70,0x6A,0x67,0x64,0x62,0x67,0x70,0x73,0x6E,0x6D,0x6E,0x77,0x7C,0x6D, + 0x63,0x6A,0x76,0x79,0x71,0x6B,0x75,0x76,0x67,0x67,0x69,0x6D,0x70,0x68,0x73,0x80, + 0x7D,0x7F,0x82,0x8D,0x94,0xA0,0xA9,0x97,0x99,0x9A,0x96,0x9B,0x87,0x7D,0x85,0x7F, + 0x7B,0x7D,0x7F,0x8A,0x86,0x7D,0x87,0x8A,0x87,0x80,0x79,0x87,0x89,0x7F,0x83,0x88, + 0x80,0x81,0x9F,0x9B,0x91,0x9B,0x91,0x94,0x82,0x66,0x78,0x7C,0x70,0x78,0x7C,0x8E, + 0x9D,0x86,0x84,0x8B,0x82,0x7F,0x79,0x85,0x8F,0x82,0x7F,0x87,0x80,0x8F,0xAB,0x97, + 0xA2,0xAD,0x97,0x95,0x81,0x7D,0x99,0x8C,0x86,0x91,0x8C,0x98,0x8A,0x70,0x81,0x7F, + 0x68,0x6C,0x70,0x7C,0x76,0x62,0x64,0x62,0x54,0x5C,0x78,0x73,0x72,0x6E,0x60,0x61, + 0x50,0x45,0x5B,0x5E,0x5D,0x68,0x69,0x72,0x6A,0x5B,0x63,0x67,0x63,0x66,0x6E,0x7C, + 0x76,0x66,0x63,0x64,0x5D,0x6A,0x84,0x77,0x72,0x77,0x6A,0x72,0x68,0x66,0x81,0x83, + 0x8B,0x9E,0xA5,0xA8,0x9F,0x90,0x97,0x99,0x90,0x95,0x9E,0x9D,0x8F,0x87,0x86,0x88, + 0x7D,0x87,0xA2,0x9B,0x93,0x92,0x87,0x88,0x80,0x7C,0x93,0x99,0x94,0x9A,0x96,0x8D, + 0x84,0x7C,0x82,0x8B,0x8E,0x8F,0x8F,0x8D,0x82,0x77,0x7C,0x86,0x7F,0x95,0xAF,0x9C, + 0x96,0x91,0x85,0x86,0x7A,0x83,0x9B,0x96,0x94,0x97,0x92,0x92,0x87,0x86,0x98,0x99, + 0x94,0x9C,0xA2,0x96,0x89,0x87,0x8A,0x8E,0x83,0x8F,0xA8,0x93,0x81,0x7D,0x75,0x74, + 0x67,0x6E,0x7E,0x7C,0x73,0x6F,0x68,0x61,0x5B,0x57,0x66,0x6B,0x64,0x66,0x63,0x5C, + 0x57,0x56,0x61,0x5B,0x60,0x82,0x77,0x63,0x67,0x5D,0x5C,0x5A,0x5E,0x74,0x78,0x69, + 0x68,0x68,0x5F,0x5D,0x5A,0x66,0x75,0x71,0x73,0x7C,0x75,0x6F,0x79,0x82,0x90,0x99, + 0x97,0xB6,0xB8,0x95,0x99,0x97,0x8E,0x92,0x8E,0xA0,0xAC,0x96,0x8A,0x8E,0x88,0x85, + 0x85,0x8C,0x9B,0x94,0x89,0x8D,0x8B,0x87,0x87,0x89,0x8F,0x84,0x95,0xA9,0x8C,0x89, + 0x8D,0x80,0x7F,0x7C,0x86,0x9B,0x8E,0x82,0x8E,0x89,0x85,0x87,0x89,0x97,0x97,0x88, + 0x8F,0x98,0x8C,0x88,0x90,0x8F,0x96,0x95,0x8C,0xA8,0xA6,0x85,0x91,0x97,0x8F,0x92, + 0x91,0x9C,0xA4,0x8D,0x88,0x90,0x88,0x88,0x85,0x88,0x8F,0x82,0x76,0x7B,0x73,0x6C, + 0x6F,0x6C,0x6E,0x63,0x72,0x82,0x61,0x5C,0x65,0x57,0x55,0x55,0x5D,0x70,0x65,0x59, + 0x67,0x63,0x59,0x5B,0x60,0x6C,0x6C,0x61,0x67,0x6C,0x62,0x5E,0x63,0x65,0x65,0x61, + 0x61,0x7D,0x77,0x5D,0x6C,0x6F,0x66,0x6A,0x71,0x84,0x8E,0x7E,0x89,0x99,0x90,0x90, + 0x95,0x9C,0xA1,0x99,0x94,0x9B,0x93,0x8E,0x90,0x8F,0x90,0x81,0x91,0xA7,0x8A,0x82, + 0x94,0x85,0x7E,0x81,0x88,0x9A,0x8E,0x81,0x8E,0x8C,0x7D,0x80,0x86,0x8F,0x8F,0x7F, + 0x86,0x8E,0x7F,0x7B,0x87,0x89,0x8A,0x87,0x87,0xA2,0x9A,0x7F,0x8D,0x91,0x83,0x85, + 0x89,0x98,0x9A,0x86,0x8C,0x96,0x89,0x86,0x8D,0x95,0x98,0x8E,0x8E,0x97,0x8C,0x88, + 0x8D,0x8E,0x8D,0x82,0x86,0xA1,0x90,0x7B,0x8A,0x81,0x73,0x6F,0x70,0x80,0x7B,0x68, + 0x72,0x76,0x64,0x5F,0x66,0x6D,0x6C,0x63,0x66,0x6F,0x62,0x5B,0x65,0x65,0x60,0x61, + 0x5D,0x72,0x79,0x5B,0x65,0x72,0x5F,0x5A,0x62,0x6C,0x6F,0x5F,0x62,0x71,0x63,0x5C, + 0x68,0x6F,0x71,0x6D,0x73,0x7B,0x76,0x74,0x80,0x84,0x88,0x86,0x86,0xA8,0xA8,0x8B, + 0x9B,0xA1,0x8A,0x89,0x8F,0x99,0x9B,0x8A,0x8E,0x99,0x87,0x7E,0x89,0x8C,0x8A,0x88, + 0x89,0x8E,0x83,0x7E,0x86,0x85,0x80,0x84,0x7C,0x87,0x9C,0x80,0x7D,0x92,0x81,0x77, + 0x81,0x88,0x90,0x88,0x83,0x93,0x8B,0x7D,0x88,0x8D,0x8A,0x8C,0x90,0x94,0x8F,0x87, + 0x8B,0x8C,0x8B,0x8C,0x83,0x98,0xA7,0x89,0x8E,0x9C,0x88,0x81,0x84,0x8F,0x94,0x85, + 0x84,0x92,0x86,0x78,0x7F,0x84,0x81,0x7C,0x7C,0x80,0x7A,0x70,0x73,0x75,0x6E,0x6E, + 0x67,0x69,0x83,0x72,0x5D,0x73,0x6A,0x58,0x5E,0x65,0x6A,0x67,0x60,0x6A,0x6B,0x5A, + 0x5E,0x66,0x66,0x67,0x66,0x6A,0x6A,0x62,0x62,0x66,0x64,0x66,0x5F,0x66,0x82,0x72, + 0x67,0x7D,0x76,0x69,0x72,0x7C,0x87,0x87,0x84,0x92,0x97,0x8A,0x8E,0x98,0x96,0x97, + 0x97,0x9B,0x9B,0x93,0x92,0x94,0x8F,0x8C,0x8C,0x83,0x98,0xA0,0x84,0x8C,0x92,0x7E, + 0x7C,0x82,0x88,0x8C,0x81,0x82,0x8C,0x7F,0x78,0x81,0x85,0x85,0x86,0x88,0x8D,0x89, + 0x85,0x89,0x88,0x86,0x87,0x82,0x96,0xA7,0x8A,0x8E,0x9F,0x8A,0x83,0x8B,0x8F,0x94, + 0x8D,0x8C,0x9B,0x91,0x82,0x89,0x92,0x90,0x8D,0x8F,0x92,0x90,0x8B,0x8A,0x88,0x85, + 0x88,0x80,0x7D,0x98,0x8B,0x75,0x89,0x82,0x6C,0x70,0x75,0x7C,0x74,0x6D,0x84,0x74, + 0x70,0x60,0x51,0x6D,0x60,0x50,0x56,0x63,0x64,0x6A,0x74,0x72,0x6D,0x6B,0x74,0x99, + 0x9A,0x77,0x8E,0x95,0x6E,0x65,0x59,0x63,0x70,0x46,0x41,0x5F,0x4E,0x34,0x3C,0x3E, + 0x3F,0x54,0x64,0x6A,0x5D,0x64,0x7B,0x7F,0x87,0x95,0x9B,0xB9,0xD6,0xB2,0xB7,0xDA, + 0xD8,0xCC,0xA9,0xCC,0xD7,0xAF,0xC1,0xB9,0xBA,0xB9,0xA4,0x9A,0x8E,0x8C,0x96,0x82, + 0x70,0x70,0x5B,0x6E,0x6C,0x62,0x7C,0x6E,0x7F,0x7C,0x54,0x77,0x7A,0x3D,0x3E,0x55, + 0x5D,0x60,0x59,0x5C,0x63,0x5A,0x62,0x73,0x7C,0x8D,0x89,0x9C,0xB2,0xA5,0x97,0x9F, + 0xA3,0xA1,0xAE,0xBA,0xD5,0xDB,0xB3,0xBD,0xD4,0xB7,0xB1,0xAE,0xB1,0xAB,0x9B,0x9A, + 0x95,0x90,0x7A,0x70,0x7A,0x79,0x7C,0x73,0x64,0x57,0x40,0x41,0x4A,0x44,0x35,0x31, + 0x4A,0x55,0x3C,0x3D,0x65,0x57,0x4C,0x62,0x5F,0x65,0x6D,0x6A,0x74,0x70,0x5A,0x69, + 0x78,0x78,0x7E,0x79,0x80,0x99,0x9A,0xA2,0xA9,0x98,0x9D,0x96,0x8A,0xB1,0x99,0x6C, + 0x93,0x8B,0x76,0x8A,0x84,0x82,0x7B,0x6F,0x83,0x9B,0x8B,0x7F,0x78,0x72,0x82,0x76, + 0x6A,0x6B,0x67,0x6B,0x61,0x52,0x45,0x46,0x5E,0x6E,0x70,0x66,0x69,0x7D,0x7A,0x70, + 0x7F,0x7A,0x75,0x81,0x86,0x9E,0x9B,0x93,0x9C,0xA1,0xA9,0xA7,0xAF,0xB7,0xAE,0xC2, + 0xCD,0xC4,0xD0,0xBF,0xBA,0xC8,0xBD,0xB3,0xAF,0xA3,0x8B,0x7B,0x74,0x72,0x80,0x6C, + 0x69,0x87,0x7F,0x73,0x63,0x4C,0x47,0x53,0x68,0x73,0x67,0x5A,0x66,0x6E,0x66,0x61, + 0x70,0x7B,0x75,0x69,0x6E,0x78,0x7B,0x82,0x77,0x87,0x9A,0x95,0x8A,0x70,0x6D,0x7E, + 0x81,0x87,0x89,0x86,0x95,0x93,0x78,0x6C,0x75,0x74,0x79,0x84,0x7E,0x7F,0x7A,0x79, + 0x8C,0x87,0x7B,0x7C,0x7A,0x81,0x78,0x67,0x61,0x50,0x45,0x5C,0x75,0x70,0x5B,0x4F, + 0x5B,0x64,0x6C,0x70,0x70,0x72,0x78,0x84,0x7F,0x86,0x6D,0x72,0x8F,0x82,0x87,0x7F, + 0x80,0x8F,0x8E,0x89,0x86,0x89,0x85,0x7F,0x93,0x96,0x7A,0x7F,0x7B,0x7A,0x83,0x75, + 0x7F,0x84,0x88,0x8E,0xA3,0xA0,0x90,0x9F,0x9F,0xA3,0x9A,0x9D,0xA7,0xB0,0xAF,0xAF, + 0xB5,0xA5,0x9F,0xA4,0xA6,0x9B,0x93,0x90,0x90,0x91,0x83,0x8A,0x8C,0x82,0x86,0x7E, + 0x7D,0x7A,0x7A,0x7B,0x6F,0x6E,0x6A,0x74,0x7D,0x73,0x71,0x73,0x73,0x71,0x6F,0x68, + 0x65,0x64,0x60,0x6A,0x7E,0x86,0x6F,0x5E,0x65,0x6C,0x6B,0x73,0x76,0x6E,0x72,0x77, + 0x69,0x61,0x61,0x5C,0x6B,0x65,0x62,0x78,0x74,0x73,0x69,0x62,0x71,0x71,0x70,0x7B, + 0x7C,0x79,0x6D,0x6D,0x79,0x77,0x8C,0xAB,0xA3,0x99,0xA5,0xA2,0x98,0x91,0x86,0xA3, + 0xB9,0xAE,0xB2,0xAE,0xA7,0xA8,0xA8,0xA8,0x9A,0x93,0x96,0x98,0x95,0x85,0x82,0x82, + 0x7D,0x76,0x72,0x80,0x6C,0x54,0x59,0x4E,0x4D,0x54,0x50,0x5D,0x6D,0x61,0x5B,0x66, + 0x5E,0x5E,0x67,0x67,0x69,0x67,0x6B,0x6B,0x6B,0x65,0x60,0x6C,0x6F,0x75,0x8D,0x8C, + 0x86,0x8A,0x8D,0x9A,0x97,0x94,0xA1,0xB2,0xBE,0xAF,0xAE,0xAF,0xA3,0xA9,0xB1,0xB8, + 0xC1,0xB8,0xB9,0xBD,0xB0,0xAA,0x9C,0xA2,0x9C,0x94,0xA9,0x93,0x8D,0xA2,0x8A,0x79, + 0x77,0x70,0x84,0x92,0x78,0x68,0x73,0x6D,0x70,0x7B,0x6B,0x68,0x6A,0x62,0x75,0x76, + 0x65,0x5E,0x54,0x58,0x5A,0x68,0x6D,0x5F,0x64,0x67,0x65,0x60,0x5D,0x65,0x67,0x6E, + 0x66,0x62,0x6E,0x70,0x65,0x5B,0x5E,0x65,0x61,0x73,0x89,0x7D,0x6E,0x60,0x72,0x7B, + 0x82,0x8E,0x6B,0x63,0x72,0x82,0x83,0x73,0x7E,0x86,0x86,0x8B,0x86,0x84,0x89,0x82, + 0x8A,0x8D,0x8B,0x97,0x93,0x8C,0x8E,0x97,0x92,0x8E,0x8D,0x90,0xA1,0x9B,0x8D,0x91, + 0x97,0x9A,0x94,0x82,0x91,0xA3,0x9A,0x97,0x97,0xA1,0xAD,0xA5,0xA2,0xA7,0xA6,0xA5, + 0xA5,0xA9,0xB1,0xA8,0x96,0x95,0x9B,0xB6,0xC6,0xAC,0x9E,0x9A,0x94,0x96,0x85,0x70, + 0x7D,0x83,0x7A,0x74,0x6C,0x6B,0x6D,0x6B,0x65,0x63,0x68,0x6F,0x6F,0x70,0x6C,0x56, + 0x58,0x56,0x4F,0x65,0x61,0x53,0x56,0x5F,0x63,0x5A,0x4C,0x4A,0x61,0x66,0x60,0x5F, + 0x4E,0x4E,0x5B,0x5B,0x62,0x6A,0x6B,0x6B,0x69,0x70,0x76,0x67,0x62,0x61,0x67,0x7D, + 0x79,0x6C,0x65,0x6B,0x76,0x76,0x71,0x77,0x8C,0x91,0x82,0x78,0x7E,0x86,0x92,0x99, + 0x95,0x98,0x9D,0x98,0x9C,0xA7,0xA3,0x9A,0x95,0x94,0xA5,0xAC,0x9A,0x8F,0x8B,0x92, + 0xA0,0x9A,0x91,0x8D,0x9C,0xAB,0xA0,0x98,0x94,0x97,0x9A,0x97,0x94,0x8E,0x94,0x9C, + 0x97,0x98,0x9B,0x9B,0x9B,0x8E,0x98,0x9F,0x8D,0x83,0x7E,0x79,0x80,0x7D,0x74,0x79, + 0x80,0x84,0x83,0x79,0x76,0x73,0x6E,0x6E,0x70,0x6C,0x66,0x6C,0x6B,0x64,0x62,0x62, + 0x69,0x68,0x75,0x75,0x68,0x68,0x63,0x65,0x61,0x60,0x5E,0x5D,0x69,0x6E,0x6C,0x6C, + 0x6C,0x75,0x7C,0x75,0x71,0x68,0x64,0x66,0x66,0x65,0x5A,0x59,0x5F,0x62,0x68,0x6F, + 0x6C,0x69,0x74,0x76,0x6D,0x6A,0x6E,0x6E,0x74,0x7D,0x7D,0x86,0x87,0x8C,0x90,0x83, + 0x87,0x87,0x89,0x8F,0x8E,0x97,0x8F,0x87,0x98,0x9F,0xA1,0xA7,0xA2,0x9F,0xAA,0xAF, + 0xA4,0xA2,0xA6,0xA4,0xAC,0xAC,0xA0,0x9C,0xA0,0xA6,0xA2,0x98,0x93,0x98,0x97,0x97, + 0x9A,0x8E,0x90,0x92,0x90,0x8F,0x8E,0x8F,0x8F,0x91,0x8D,0x94,0x91,0x8D,0x92,0x89, + 0x88,0x8E,0x87,0x85,0x87,0x83,0x7E,0x7B,0x7C,0x7F,0x7F,0x80,0x7E,0x7F,0x82,0x82, + 0x7E,0x74,0x73,0x6F,0x6E,0x75,0x72,0x70,0x69,0x70,0x73,0x66,0x72,0x71,0x67,0x66, + 0x62,0x61,0x55,0x56,0x56,0x50,0x59,0x5B,0x5C,0x5C,0x61,0x64,0x61,0x67,0x63,0x67, + 0x6F,0x6D,0x6F,0x6B,0x63,0x6A,0x71,0x6F,0x71,0x6A,0x69,0x70,0x72,0x76,0x72,0x6C, + 0x6F,0x72,0x71,0x70,0x6B,0x68,0x6E,0x77,0x7C,0x7F,0x83,0x85,0x8B,0x91,0x8F,0x8E, + 0x90,0x8D,0x92,0x98,0x93,0x8F,0x8F,0x90,0x93,0x91,0x91,0x92,0x8D,0x8F,0x9A,0x9A, + 0x91,0x91,0x98,0x97,0x9F,0xA5,0x9D,0x9D,0xA0,0xA5,0xAB,0xA6,0xA3,0xA6,0xA2,0xA3, + 0xA7,0xA1,0x9D,0x9A,0x92,0x94,0x96,0x93,0x95,0x94,0x96,0x95,0x92,0x94,0x8E,0x92, + 0x94,0x93,0x93,0x91,0x90,0x8F,0x91,0x8D,0x8A,0x89,0x8A,0x8E,0x8B,0x89,0x87,0x80, + 0x7C,0x7B,0x7D,0x7E,0x75,0x74,0x74,0x71,0x72,0x6B,0x69,0x6C,0x6F,0x6E,0x71,0x70, + 0x6A,0x70,0x6F,0x6D,0x6F,0x6F,0x6F,0x6D,0x6D,0x6A,0x66,0x72,0x71,0x63,0x65,0x68, + 0x64,0x62,0x63,0x5E,0x59,0x64,0x66,0x63,0x6C,0x64,0x5D,0x67,0x64,0x65,0x69,0x61, + 0x64,0x67,0x6C,0x72,0x72,0x72,0x71,0x78,0x7D,0x7D,0x78,0x76,0x77,0x7A,0x7D,0x79, + 0x77,0x78,0x79,0x84,0x82,0x7E,0x82,0x83,0x8D,0x90,0x8A,0x8E,0x8C,0x88,0x91,0x8D, + 0x8A,0x8F,0x8A,0x8E,0x95,0x92,0x8F,0x8D,0x91,0x99,0x9E,0x98,0x96,0x96,0x94,0x9A, + 0x97,0x9A,0x99,0x95,0x9B,0x98,0x99,0x95,0x8B,0x8E,0x92,0x97,0x98,0x8F,0x8F,0x90, + 0x8B,0x8F,0x8C,0x88,0x8C,0x88,0x8E,0x8C,0x84,0x85,0x85,0x8B,0x87,0x8C,0x8E,0x8B, + 0x8E,0x8A,0x8E,0x8B,0x88,0x8D,0x8C,0x88,0x89,0x86,0x80,0x81,0x80,0x7D,0x7C,0x7B, + 0x7C,0x7D,0x7C,0x75,0x77,0x78,0x75,0x77,0x74,0x78,0x7D,0x7A,0x76,0x79,0x78,0x73, + 0x79,0x78,0x75,0x73,0x73,0x73,0x72,0x74,0x75,0x75,0x74,0x78,0x7B,0x78,0x77,0x74, + 0x72,0x75,0x7A,0x7C,0x74,0x72,0x73,0x77,0x78,0x74,0x72,0x73,0x77,0x7A,0x78,0x76, + 0x76,0x74,0x76,0x77,0x74,0x73,0x77,0x76,0x77,0x78,0x74,0x74,0x6F,0x74,0x7A,0x7B, + 0x7C,0x78,0x7B,0x7E,0x82,0x82,0x7D,0x7B,0x7F,0x86,0x85,0x80,0x7D,0x7D,0x80,0x82, + 0x81,0x7E,0x7F,0x80,0x7F,0x7F,0x7E,0x7E,0x7D,0x7F,0x82,0x82,0x81,0x7C,0x7C,0x7F, + 0x80,0x7F,0x81,0x7D,0x7A,0x82,0x82,0x83,0x82,0x7E,0x81,0x81,0x7F,0x80,0x81,0x82, + 0x84,0x83,0x84,0x86,0x84,0x83,0x82,0x7F,0x80,0x81,0x82,0x86,0x84,0x84,0x85,0x86, + 0x87,0x86,0x85,0x83,0x84,0x83,0x84,0x84,0x80,0x80,0x82,0x84,0x84,0x82,0x7F,0x7F, + 0x83,0x83,0x82,0x81,0x82,0x83,0x81,0x83,0x82,0x83,0x83,0x84,0x88,0x86,0x86,0x86, + 0x85,0x87,0x88,0x86,0x86,0x84,0x83,0x84,0x85,0x83,0x7F,0x80,0x81,0x82,0x82,0x7E, + 0x7D,0x7E,0x7C,0x80,0x81,0x7F,0x7E,0x7D,0x82,0x87,0x84,0x83,0x82,0x81,0x85,0x85, + 0x81,0x81,0x81,0x82,0x84,0x82,0x7F,0x81,0x83,0x7F,0x7F,0x7E,0x80,0x7F,0x7F,0x7F, + 0x7F,0x7F,0x7D,0x7E,0x80,0x80,0x7F,0x7E,0x7E,0x7C,0x7D,0x7D,0x7B,0x7C,0x7D,0x7E, + 0x81,0x80,0x7C,0x7C,0x81,0x81,0x7F,0x81,0x7E,0x7D,0x81,0x80,0x7E,0x81,0x80,0x80, + 0x84,0x81,0x80,0x84,0x83,0x84,0x81,0x7E,0x81,0x81,0x7F,0x7E,0x7F,0x7E,0x7E,0x7E, + 0x7D,0x7F,0x7D,0x7A,0x7F,0x7E,0x80,0x7F,0x79,0x7D,0x7E,0x7F,0x82,0x7F,0x81,0x83, + 0x82,0x84,0x80,0x80,0x81,0x82,0x83,0x82,0x84,0x83,0x83,0x81,0x7E,0x7F,0x80,0x7E, + 0x7D,0x7D,0x7B,0x7A,0x79,0x7B,0x7B,0x7D,0x7F,0x7B,0x7D,0x7E,0x81,0x80,0x7E,0x7E, + 0x81,0x80,0x81,0x83,0x80,0x80,0x80,0x83,0x80,0x81,0x82,0x7F,0x81,0x81,0x80,0x81, + 0x80,0x7F,0x80,0x80,0x7F,0x80,0x7E,0x81,0x83,0x7F,0x7E,0x7E,0x81,0x80,0x7F,0x83, + 0x81,0x81,0x81,0x82,0x80,0x7D,0x7F,0x80,0x81,0x81,0x80,0x80,0x7F,0x7F,0x80,0x82, + 0x81,0x80,0x81,0x82,0x81,0x80,0x80,0x7F,0x81,0x80,0x81,0x80,0x80,0x80,0x7E,0x80, + 0x7E,0x7D,0x7F,0x7E,0x7E,0x7E,0x7C,0x7D,0x7E,0x7E,0x7F,0x80,0x81,0x81,0x83,0x84, + 0x80,0x82,0x82,0x81,0x84,0x84,0x84,0x83,0x82,0x82,0x87,0x85,0x81,0x82,0x81,0x83, + 0x80,0x81,0x80,0x7E,0x81,0x7E,0x80,0x7F,0x7F,0x81,0x7F,0x80,0x80,0x80,0x80,0x81, + 0x82,0x82,0x80,0x83,0x84,0x82,0x82,0x82,0x80,0x81,0x84,0x81,0x83,0x82,0x7F,0x84, + 0x81,0x82,0x84,0x80,0x81,0x84,0x83,0x81,0x83,0x81,0x7F,0x80,0x80,0x7F,0x80,0x7C, + 0x80,0x7E,0x7E,0x81,0x7B,0x7D,0x7F,0x7D,0x7F,0x7F,0x7E,0x80,0x80,0x80,0x81,0x7F, + 0x7E,0x82,0x83,0x81,0x81,0x80,0x81,0x82,0x80,0x82,0x81,0x80,0x82,0x81,0x7E,0x80, + 0x7E,0x7D,0x80,0x7F,0x7B,0x7D,0x7F,0x7D,0x7E,0x7F,0x7D,0x7F,0x80,0x80,0x81,0x80, + 0x81,0x81,0x82,0x82,0x81,0x82,0x82,0x81,0x83,0x83,0x82,0x82,0x84,0x81,0x80,0x84, + 0x82,0x83,0x83,0x81,0x7F,0x80,0x80,0x7F,0x81,0x81,0x7F,0x7F,0x7F,0x7E,0x80,0x7D, + 0x7E,0x7C,0x7E,0x7F,0x7F,0x81,0x7D,0x7E,0x82,0x82,0x81,0x82,0x81,0x81,0x83,0x83, + 0x82,0x81,0x82,0x80,0x81,0x83,0x80,0x7F,0x81,0x81,0x81,0x81,0x7F,0x80,0x7E,0x7F, + 0x7E,0x7D,0x7F,0x7C,0x7E,0x7E,0x7D,0x7D,0x7D,0x7F,0x7D,0x7D,0x7E,0x7E,0x7D,0x7E, + 0x7E,0x7F,0x7E,0x7E,0x80,0x80,0x7F,0x80,0x82,0x80,0x82,0x83,0x83,0x82,0x80,0x84, + 0x82,0x81,0x82,0x80,0x7F,0x81,0x7F,0x7E,0x80,0x7E,0x7C,0x7F,0x80,0x7C,0x7E,0x7E, + 0x7D,0x7F,0x7D,0x7D,0x7E,0x7F,0x7E,0x80,0x80,0x7C,0x7F,0x81,0x81,0x7E,0x7F,0x81, + 0x7F,0x80,0x80,0x7F,0x80,0x80,0x81,0x80,0x81,0x7E,0x7D,0x81,0x7E,0x81,0x80,0x7F, + 0x80,0x7C,0x7B,0x7F,0x7D,0x7C,0x7F,0x7D,0x7F,0x82,0x7C,0x7E,0x7C,0x80,0x83,0x7F, + 0x80,0x7F,0x80,0x7F,0x7D,0x81,0x81,0x81,0x80,0x82,0x81,0x88,0x8B,0x90,0x93,0x81, + 0x7A,0x76,0x77,0x78,0x77,0x78,0x7E,0x6F,0x70,0x8F,0x78,0x72,0x83,0x7B,0x6F,0x6E, + 0x81,0x77,0x73,0x7A,0x77,0x79,0x84,0x87,0x83,0x8B,0x8D,0x88,0x82,0x83,0x8F,0x89, + 0x87,0x86,0x79,0x7D,0x86,0x86,0x88,0x9B,0x9C,0x92,0x92,0x80,0x82,0x93,0x8D,0x96, + 0x97,0x88,0x8D,0x93,0x8B,0x80,0x84,0x89,0x8C,0x90,0x84,0x7B,0x77,0x76,0x6F,0x63, + 0x6D,0x6E,0x70,0x70,0x6A,0x6D,0x6C,0x6F,0x72,0x75,0x6B,0x66,0x6A,0x69,0x6B,0x73, + 0x74,0x6C,0x67,0x6A,0x6F,0x6C,0x67,0x69,0x70,0x72,0x66,0x65,0x6D,0x71,0x6F,0x6D, + 0x74,0x77,0x73,0x74,0x82,0x87,0x8B,0xA4,0xB7,0xB2,0x9C,0x97,0x99,0x92,0x8F,0x8E, + 0x8E,0x8D,0x89,0x89,0x90,0x8B,0x80,0x81,0x89,0x85,0x7D,0x85,0x83,0x82,0x86,0x81, + 0x85,0x85,0x83,0x86,0x8B,0x89,0x87,0x93,0x92,0x8E,0x96,0x92,0x91,0x97,0x95,0x95, + 0x99,0x91,0x8C,0x91,0x95,0x95,0x98,0xA0,0x9B,0x9C,0x9C,0x8D,0x8C,0x91,0x93,0x92, + 0x92,0x93,0x92,0x8D,0x8B,0x8B,0x89,0x87,0x83,0x7D,0x7C,0x74,0x6E,0x70,0x6E,0x6A, + 0x69,0x68,0x65,0x60,0x61,0x64,0x62,0x5D,0x64,0x63,0x60,0x64,0x5F,0x62,0x66,0x64, + 0x66,0x66,0x63,0x62,0x62,0x65,0x62,0x5E,0x65,0x67,0x66,0x66,0x68,0x66,0x6D,0x6A, + 0x61,0x6F,0x75,0x75,0x7C,0x83,0x8E,0x9C,0xA3,0xA2,0x98,0x95,0x91,0x86,0x8A,0x87, + 0x88,0x93,0x94,0x8C,0x8C,0x88,0x80,0x82,0x7F,0x7A,0x80,0x80,0x80,0x81,0x81,0x89, + 0x8B,0x87,0x8C,0x90,0x91,0x97,0x9A,0x9F,0x9F,0x96,0x95,0x9D,0xA6,0xA4,0x9E,0xA2, + 0xA4,0xA3,0x95,0x8F,0x97,0x95,0x91,0x90,0x8F,0x98,0x99,0x92,0x96,0x9B,0x9E,0x95, + 0x92,0x96,0x98,0x95,0x8C,0x84,0x8C,0x99,0x8E,0x89,0x84,0x83,0x84,0x6E,0x5B,0x62, + 0x65,0x54,0x58,0x5F,0x67,0x67,0x5F,0x66,0x6C,0x6F,0x69,0x67,0x68,0x68,0x62,0x5C, + 0x5C,0x6D,0x79,0x6C,0x6D,0x6F,0x71,0x74,0x62,0x56,0x60,0x60,0x57,0x55,0x62,0x6E, + 0x72,0x73,0x7B,0x89,0x8A,0x8C,0x95,0x9D,0x9A,0x98,0x95,0x8E,0x9E,0xAA,0x9D,0x99, + 0x9D,0x97,0x90,0x7E,0x76,0x7F,0x78,0x71,0x75,0x7C,0x87,0x88,0x80,0x87,0x96,0x8F, + 0x86,0x8C,0x89,0x8A,0x8C,0x8C,0x87,0x8E,0xA9,0xA4,0x99,0xA3,0xAB,0xA2,0x94,0x8C, + 0x8E,0x92,0x86,0x85,0x91,0x97,0x99,0x98,0x9C,0xA0,0x96,0x8A,0x8D,0x8B,0x86,0x8A, + 0x8A,0x86,0x81,0x9D,0xA7,0x8D,0x8F,0x94,0x8A,0x79,0x6A,0x6D,0x73,0x67,0x5C,0x66, + 0x72,0x6D,0x65,0x6A,0x70,0x68,0x58,0x5F,0x64,0x59,0x58,0x60,0x5C,0x4B,0x67,0x7A, + 0x63,0x69,0x72,0x6A,0x5D,0x4F,0x55,0x60,0x58,0x52,0x65,0x74,0x72,0x68,0x71,0x7C, + 0x6F,0x68,0x71,0x80,0x80,0x82,0x94,0x9B,0x8F,0xA2,0xB9,0xA0,0x9A,0xA5,0x98,0x87, + 0x75,0x77,0x81,0x7B,0x73,0x7D,0x89,0x88,0x7D,0x7D,0x8A,0x7F,0x71,0x7C,0x83,0x80, + 0x80,0x84,0x87,0x7F,0x91,0xAA,0x99,0x94,0xA4,0x9C,0x8F,0x83,0x89,0x95,0x8B,0x84, + 0x90,0x9E,0x98,0x8E,0x90,0x96,0x8B,0x81,0x8B,0x93,0x8E,0x8A,0x8A,0x89,0x83,0x90, + 0xA5,0x95,0x92,0x9C,0x92,0x86,0x76,0x7A,0x85,0x75,0x69,0x77,0x7F,0x7D,0x6D,0x6C, + 0x76,0x6A,0x5A,0x63,0x6B,0x64,0x61,0x5E,0x60,0x5B,0x66,0x76,0x69,0x67,0x6F,0x65, + 0x58,0x51,0x50,0x5D,0x5B,0x53,0x67,0x70,0x6A,0x63,0x62,0x6C,0x67,0x58,0x66,0x73, + 0x6E,0x70,0x79,0x82,0x81,0x93,0xA9,0xA0,0xA4,0xAB,0xA0,0x92,0x8A,0x89,0x8E,0x86, + 0x7F,0x88,0x8F,0x89,0x7F,0x7C,0x82,0x7D,0x6A,0x77,0x82,0x7A,0x78,0x79,0x7E,0x77, + 0x81,0x9B,0x90,0x89,0x9C,0x94,0x88,0x80,0x85,0x91,0x89,0x85,0x94,0xA0,0x9C,0x99, + 0x94,0x95,0x96,0x82,0x84,0x93,0x8C,0x88,0x8A,0x90,0x88,0x85,0xA7,0x9F,0x89,0x9E, + 0x98,0x85,0x7F,0x7C,0x88,0x84,0x7B,0x83,0x8A,0x87,0x7C,0x73,0x76,0x77,0x62,0x61, + 0x74,0x6D,0x6A,0x6B,0x69,0x65,0x5C,0x74,0x7F,0x65,0x6D,0x74,0x64,0x58,0x51,0x61, + 0x63,0x56,0x61,0x70,0x6E,0x69,0x67,0x68,0x6D,0x61,0x59,0x6B,0x6E,0x68,0x6E,0x74, + 0x73,0x6E,0x89,0xA3,0x91,0x99,0xAF,0xA5,0x96,0x8D,0x94,0x99,0x8C,0x89,0x9E,0x9F, + 0x8F,0x8C,0x90,0x8C,0x7B,0x73,0x7F,0x81,0x79,0x7C,0x7E,0x7D,0x75,0x81,0x9C,0x8A, + 0x83,0x97,0x93,0x7F,0x74,0x7F,0x8A,0x7F,0x7C,0x96,0x9E,0x92,0x92,0x98,0x9D,0x8F, + 0x82,0x8E,0x94,0x8E,0x8B,0x90,0x8E,0x86,0x8C,0xA9,0xA1,0x90,0xA5,0xA2,0x8F,0x7F, + 0x7F,0x8C,0x83,0x77,0x8A,0x99,0x8A,0x84,0x82,0x87,0x7A,0x66,0x6E,0x75,0x71,0x6F, + 0x72,0x6D,0x65,0x63,0x7C,0x82,0x69,0x74,0x79,0x68,0x5C,0x53,0x62,0x66,0x54,0x61, + 0x75,0x73,0x6D,0x68,0x6E,0x6A,0x5C,0x5C,0x69,0x6A,0x6C,0x71,0x6E,0x6E,0x6A,0x7E, + 0x99,0x8B,0x8E,0xA2,0x9B,0x93,0x89,0x93,0xA0,0x93,0x92,0xA4,0xA7,0x9D,0x97,0x95, + 0x93,0x84,0x7C,0x83,0x82,0x80,0x80,0x7E,0x78,0x72,0x7A,0x96,0x90,0x83,0x93,0x93, + 0x81,0x74,0x73,0x83,0x80,0x77,0x89,0x96,0x96,0x90,0x93,0x9A,0x8F,0x84,0x87,0x8F, + 0x8A,0x8B,0x8F,0x8C,0x85,0x82,0x9C,0xA9,0x94,0x99,0xA4,0x96,0x88,0x7D,0x88,0x8E, + 0x7E,0x82,0x94,0x96,0x8E,0x87,0x89,0x89,0x79,0x75,0x79,0x7A,0x78,0x78,0x79,0x72, + 0x67,0x6E,0x89,0x7F,0x6F,0x7B,0x7A,0x6A,0x5B,0x58,0x69,0x64,0x58,0x69,0x72,0x73, + 0x6B,0x69,0x72,0x68,0x5D,0x5E,0x67,0x6D,0x6C,0x6C,0x6C,0x69,0x64,0x7C,0x92,0x85, + 0x8B,0x94,0x8E,0x8B,0x7E,0x8A,0x9A,0x8D,0x8D,0x9F,0xA2,0x9F,0x97,0x93,0x98,0x8A, + 0x7E,0x7D,0x85,0x86,0x7F,0x7B,0x7C,0x75,0x71,0x8D,0x91,0x85,0x8E,0x8B,0x82,0x78, + 0x68,0x7A,0x80,0x72,0x80,0x8C,0x93,0x90,0x86,0x8D,0x8F,0x84,0x7E,0x83,0x8A,0x8D, + 0x89,0x85,0x88,0x82,0x87,0xA5,0x9B,0x94,0xA4,0x9A,0x93,0x7E,0x7A,0x8D,0x83,0x7A, + 0x88,0x8F,0x98,0x91,0x81,0x88,0x85,0x7A,0x72,0x73,0x79,0x7A,0x73,0x6B,0x6A,0x62, + 0x75,0x8A,0x74,0x79,0x80,0x71,0x6E,0x55,0x59,0x6A,0x5A,0x5E,0x68,0x6A,0x76,0x71, + 0x63,0x70,0x6D,0x65,0x5E,0x5F,0x6C,0x6B,0x66,0x65,0x69,0x67,0x83,0x8F,0x7E,0x8F, + 0x92,0x8E,0x8E,0x7A,0x86,0x96,0x88,0x8F,0x91,0x95,0xA4,0x97,0x8C,0x95,0x93,0x89, + 0x7E,0x7A,0x84,0x7C,0x75,0x71,0x71,0x70,0x87,0x90,0x7C,0x8A,0x84,0x85,0x84,0x66, + 0x72,0x7F,0x71,0x77,0x77,0x7D,0x95,0x89,0x85,0x91,0x90,0x8E,0x85,0x80,0x86,0x85, + 0x80,0x86,0x89,0x82,0x90,0xA0,0x91,0x95,0x92,0x8A,0x9A,0x8C,0x7E,0x89,0x87,0x84, + 0x86,0x7B,0x86,0x8C,0x7D,0x84,0x7F,0x7B,0x84,0x7C,0x74,0x7B,0x79,0x76,0x78,0x72, + 0x72,0x75,0x77,0x71,0x6E,0x6E,0x6E,0x6F,0x6B,0x6C,0x6D,0x6C,0x6E,0x70,0x69,0x6A, + 0x69,0x67,0x68,0x68,0x68,0x6A,0x6D,0x6E,0x71,0x71,0x77,0x79,0x7C,0x7F,0x81,0x89, + 0x8B,0x8B,0x8C,0x90,0x9A,0x9A,0x95,0x9A,0x95,0x97,0x98,0x90,0x8F,0x8E,0x8A,0x86, + 0x85,0x7C,0x80,0x7D,0x7A,0x7A,0x75,0x7C,0x78,0x77,0x79,0x79,0x79,0x7C,0x77,0x79, + 0x7F,0x79,0x81,0x88,0x84,0x85,0x86,0x87,0x8B,0x84,0x81,0x88,0x86,0x85,0x83,0x82, + 0x8C,0x8C,0x88,0x8C,0x8E,0x8B,0x8C,0x8C,0x88,0x88,0x84,0x91,0x8D,0x82,0x89,0x81, + 0x8A,0x8E,0x7F,0x82,0x85,0x81,0x82,0x79,0x75,0x7C,0x79,0x79,0x77,0x72,0x7C,0x7E, + 0x78,0x7D,0x7B,0x79,0x7B,0x74,0x79,0x78,0x76,0x86,0x7B,0x76,0x7A,0x73,0x83,0x81, + 0x72,0x79,0x7A,0x7B,0x7C,0x73,0x79,0x82,0x7C,0x7F,0x82,0x7B,0x87,0x8B,0x84,0x88, + 0x88,0x88,0x88,0x85,0x82,0x86,0x95,0x8F,0x84,0x8B,0x82,0x8B,0x91,0x7A,0x7E,0x7D, + 0x7B,0x82,0x72,0x73,0x80,0x79,0x7C,0x79,0x72,0x80,0x80,0x75,0x78,0x7A,0x79,0x79, + 0x78,0x72,0x76,0x92,0x89,0x7C,0x86,0x7E,0x90,0x90,0x71,0x7C,0x80,0x7D,0x87,0x75, + 0x7A,0x8E,0x89,0x8B,0x85,0x86,0x8F,0x91,0x85,0x7C,0x87,0x88,0x7F,0x79,0x76,0x94, + 0xA3,0x8A,0x92,0x8F,0x8D,0x9B,0x7A,0x70,0x7E,0x7B,0x82,0x7C,0x78,0x89,0x94,0x8F, + 0x81,0x80,0x82,0x86,0x7E,0x71,0x7C,0x81,0x78,0x75,0x76,0x92,0x9A,0x8A,0x8E,0x81, + 0x85,0x8E,0x72,0x6D,0x75,0x7A,0x84,0x80,0x7E,0x86,0x92,0x8F,0x84,0x84,0x7F,0x84, + 0x87,0x7F,0x82,0x80,0x7A,0x79,0x8D,0x9F,0x8F,0x93,0x8F,0x7D,0x8B,0x7D,0x6D,0x73, + 0x73,0x78,0x7D,0x7E,0x79,0x82,0x86,0x79,0x7D,0x75,0x6D,0x79,0x75,0x74,0x76,0x6F, + 0x6A,0x77,0x93,0x8C,0x87,0x8A,0x78,0x7F,0x7F,0x73,0x72,0x72,0x79,0x80,0x88,0x83, + 0x81,0x87,0x81,0x82,0x83,0x7A,0x7E,0x81,0x80,0x81,0x7B,0x76,0x77,0x8C,0x98,0x91, + 0x8E,0x7F,0x7A,0x82,0x80,0x7D,0x78,0x75,0x78,0x82,0x88,0x85,0x83,0x7D,0x7C,0x83, + 0x80,0x7B,0x7C,0x79,0x7B,0x7C,0x79,0x75,0x78,0x8A,0x8F,0x93,0x8F,0x7B,0x78,0x79, + 0x77,0x7E,0x7F,0x7A,0x79,0x80,0x83,0x88,0x8C,0x84,0x81,0x83,0x7F,0x83,0x86,0x7F, + 0x81,0x7E,0x7A,0x7C,0x87,0x90,0x91,0x93,0x89,0x7E,0x7C,0x7A,0x7A,0x7B,0x7B,0x77, + 0x78,0x7C,0x7D,0x83,0x84,0x80,0x7E,0x7B,0x79,0x7C,0x7A,0x79,0x79,0x76,0x74,0x73, + 0x7E,0x88,0x8C,0x8D,0x85,0x7D,0x79,0x76,0x76,0x7A,0x7C,0x78,0x7B,0x7D,0x7B,0x83, + 0x85,0x84,0x85,0x82,0x80,0x7F,0x7D,0x7F,0x80,0x7F,0x7D,0x7A,0x80,0x8B,0x90,0x92, + 0x8E,0x85,0x7F,0x7A,0x76,0x7C,0x80,0x7D,0x81,0x7D,0x7A,0x81,0x80,0x80,0x85,0x83, + 0x80,0x7F,0x7A,0x7A,0x7E,0x7C,0x7B,0x7B,0x7F,0x85,0x89,0x8C,0x89,0x82,0x7F,0x7A, + 0x75,0x7B,0x7B,0x7C,0x82,0x7E,0x7F,0x82,0x7E,0x80,0x84,0x83,0x83,0x82,0x7D,0x7E, + 0x7E,0x7C,0x7D,0x7E,0x83,0x89,0x8A,0x8C,0x86,0x82,0x80,0x79,0x77,0x7C,0x7A,0x7B, + 0x7F,0x79,0x7C,0x7E,0x79,0x7D,0x80,0x7E,0x80,0x7F,0x79,0x79,0x79,0x78,0x78,0x7A, + 0x81,0x84,0x85,0x89,0x84,0x7E,0x80,0x7A,0x78,0x7E,0x7A,0x7B,0x7E,0x7A,0x7D,0x7D, + 0x7C,0x81,0x82,0x81,0x82,0x80,0x7E,0x7F,0x7D,0x7E,0x7D,0x7F,0x87,0x87,0x89,0x8A, + 0x83,0x82,0x82,0x7D,0x7F,0x83,0x7E,0x81,0x7F,0x7B,0x7F,0x7C,0x7C,0x81,0x7F,0x81, + 0x83,0x7D,0x7D,0x7F,0x7D,0x7E,0x7C,0x7F,0x84,0x85,0x87,0x86,0x80,0x81,0x7F,0x7C, + 0x81,0x80,0x7F,0x83,0x7D,0x7C,0x80,0x7C,0x7E,0x82,0x7F,0x82,0x83,0x7D,0x80,0x81, + 0x7F,0x80,0x7F,0x84,0x86,0x87,0x8B,0x84,0x80,0x85,0x7F,0x7D,0x84,0x7F,0x80,0x84, + 0x7B,0x7C,0x7F,0x79,0x7C,0x7E,0x7D,0x81,0x7E,0x7C,0x7F,0x7E,0x7E,0x7C,0x7E,0x85, + 0x84,0x87,0x89,0x80,0x82,0x84,0x7D,0x81,0x82,0x7E,0x84,0x82,0x7D,0x80,0x7D,0x7B, + 0x7F,0x7C,0x81,0x7E,0x8A,0x8F,0x7B,0x8A,0x6D,0x67,0x86,0x78,0x6A,0x79,0x84,0x84, + 0x90,0x8C,0x8C,0x8E,0x8F,0xA0,0xA7,0x9A,0x95,0x96,0x8C,0x88,0x89,0x85,0x7D,0x6F, + 0x63,0x5D,0x56,0x55,0x55,0x53,0x5F,0x68,0x6F,0x74,0x75,0x7A,0x7D,0x7D,0x82,0x8A, + 0x86,0x8D,0x93,0x8B,0x91,0x9B,0xA0,0xAC,0xB9,0xB6,0xBB,0xBB,0xAF,0xAB,0xA3,0x9B, + 0x96,0x93,0x92,0x8F,0x8D,0x86,0x7D,0x7E,0x76,0x6F,0x74,0x6E,0x6B,0x6F,0x67,0x60, + 0x58,0x49,0x45,0x43,0x40,0x40,0x44,0x4A,0x4F,0x56,0x5D,0x64,0x6B,0x76,0x80,0x84, + 0x89,0x8C,0x8D,0x90,0x8F,0x95,0x98,0x9A,0xA6,0xAF,0xB3,0xB9,0xB9,0xB4,0xB7,0xB6, + 0xB5,0xAE,0xA7,0xA4,0x99,0x95,0x8F,0x85,0x8A,0x88,0x86,0x87,0x7F,0x73,0x6D,0x61, + 0x54,0x54,0x4F,0x4D,0x4B,0x46,0x49,0x4F,0x55,0x5A,0x5E,0x67,0x71,0x73,0x74,0x78, + 0x7D,0x81,0x7F,0x86,0x92,0x96,0x9F,0xA4,0xA1,0xA8,0xAA,0xA6,0xAF,0xB2,0xB0,0xB4, + 0xAD,0xA5,0xA2,0x9A,0x92,0x8D,0x86,0x83,0x81,0x7A,0x77,0x72,0x6E,0x6A,0x6D,0x75, + 0x7A,0x7C,0x73,0x6C,0x68,0x5D,0x52,0x4E,0x49,0x45,0x4B,0x3C,0x32,0x44,0x4E,0x59, + 0x66,0x69,0x6B,0x72,0x77,0x77,0x7B,0x79,0x7A,0x87,0x94,0x9F,0xA8,0xAC,0xA6,0xAC, + 0xB1,0xAD,0xB1,0xB4,0xBA,0xBC,0xBE,0xC0,0xBF,0xBF,0xBC,0xB6,0xAC,0xA3,0x9A,0x8D, + 0x81,0x77,0x6C,0x62,0x5B,0x63,0x66,0x63,0x63,0x52,0x49,0x4B,0x3D,0x3F,0x45,0x4C, + 0x57,0x56,0x57,0x5A,0x5F,0x62,0x66,0x6A,0x71,0x77,0x78,0x7F,0x88,0x8D,0x8E,0x94, + 0x9D,0xA3,0xA5,0xA6,0xA1,0x9C,0x98,0x91,0x94,0x94,0x98,0x9F,0x9B,0x9A,0x9E,0x9A, + 0x9C,0x9D,0x95,0x93,0x8F,0x8A,0x86,0x81,0x7B,0x7B,0x85,0x87,0x88,0x8A,0x84,0x76, + 0x6E,0x66,0x62,0x65,0x62,0x68,0x6D,0x65,0x65,0x63,0x5F,0x63,0x63,0x5F,0x60,0x61, + 0x62,0x61,0x60,0x63,0x68,0x70,0x76,0x79,0x7C,0x79,0x79,0x76,0x74,0x7D,0x83,0x85, + 0x87,0x82,0x85,0x88,0x86,0x8F,0x96,0x92,0x92,0x93,0x90,0x94,0x96,0x97,0x9F,0xA8, + 0xAB,0xB0,0xB1,0xA8,0x9D,0x98,0x96,0x98,0x9A,0x99,0x98,0x8F,0x88,0x89,0x8A,0x88, + 0x89,0x83,0x7B,0x76,0x72,0x71,0x6A,0x62,0x69,0x6F,0x72,0x74,0x6D,0x61,0x57,0x53, + 0x55,0x5B,0x60,0x5F,0x5B,0x56,0x55,0x58,0x5A,0x5E,0x60,0x60,0x63,0x67,0x6C,0x71, + 0x71,0x74,0x82,0x90,0x9C,0xA3,0x9F,0x95,0x91,0x94,0x9E,0xAE,0xB1,0xAD,0xA9,0xA3, + 0xA5,0xA8,0xA8,0xA4,0x9F,0x9C,0x9D,0x9E,0x9B,0x95,0x8A,0x8A,0x93,0x99,0x9C,0x96, + 0x88,0x7F,0x7D,0x7D,0x85,0x89,0x83,0x7F,0x7A,0x77,0x7C,0x7D,0x78,0x72,0x6F,0x72, + 0x79,0x79,0x74,0x6D,0x68,0x71,0x7D,0x81,0x7D,0x70,0x62,0x61,0x6A,0x6D,0x70,0x69, + 0x60,0x63,0x68,0x6D,0x6E,0x67,0x60,0x63,0x69,0x70,0x73,0x6A,0x62,0x5F,0x6B,0x80, + 0x86,0x84,0x7B,0x6E,0x6F,0x7D,0x85,0x8B,0x8A,0x83,0x88,0x91,0x94,0x94,0x8E,0x89, + 0x8E,0x95,0x99,0x9A,0x93,0x8C,0x87,0x91,0xA4,0xAC,0xA8,0x9C,0x8F,0x90,0x99,0x9C, + 0x9E,0x9E,0x97,0x9A,0xA1,0x9D,0x99,0x92,0x8D,0x94,0x9B,0x9A,0x99,0x93,0x8B,0x84, + 0x89,0x98,0x9E,0x9B,0x90,0x80,0x77,0x7C,0x7C,0x7A,0x79,0x72,0x71,0x75,0x71,0x6B, + 0x65,0x5F,0x60,0x65,0x65,0x63,0x5C,0x52,0x49,0x4C,0x5D,0x67,0x66,0x5F,0x54,0x50, + 0x59,0x5E,0x61,0x65,0x64,0x67,0x71,0x73,0x70,0x6E,0x70,0x78,0x80,0x82,0x83,0x81, + 0x7B,0x78,0x7F,0x92,0x9D,0x9E,0x98,0x8C,0x87,0x90,0x95,0x96,0x98,0x97,0x99,0x9F, + 0x9C,0x97,0x94,0x94,0x99,0xA0,0x9E,0x9B,0x99,0x93,0x8B,0x8F,0xA3,0xAD,0xAA,0x9F, + 0x92,0x8C,0x95,0x9A,0x98,0x99,0x98,0x98,0x9D,0x9A,0x90,0x8A,0x89,0x8C,0x8E,0x89, + 0x86,0x81,0x77,0x6E,0x70,0x81,0x88,0x83,0x78,0x6B,0x66,0x6D,0x6D,0x6A,0x6B,0x6C, + 0x6C,0x71,0x6D,0x65,0x63,0x65,0x68,0x6B,0x67,0x66,0x65,0x5D,0x55,0x5C,0x6E,0x73, + 0x6D,0x62,0x55,0x55,0x5D,0x5D,0x5C,0x5F,0x61,0x65,0x69,0x63,0x5E,0x62,0x68,0x6F, + 0x73,0x70,0x71,0x72,0x6D,0x6A,0x79,0x8D,0x92,0x8E,0x85,0x7C,0x7F,0x88,0x87,0x89, + 0x8D,0x8F,0x94,0x96,0x8E,0x8D,0x91,0x95,0x9B,0x9B,0x96,0x98,0x96,0x8F,0x90,0xA3, + 0xB2,0xB2,0xAB,0x9F,0x98,0x9F,0xA3,0x9E,0x9F,0xA2,0xA3,0xA6,0xA4,0x98,0x95,0x98, + 0x9B,0x9C,0x9A,0x98,0x97,0x92,0x85,0x85,0x9B,0xA4,0x9D,0x92,0x84,0x7F,0x85,0x82, + 0x79,0x7B,0x7D,0x7B,0x7B,0x74,0x69,0x69,0x6D,0x6F,0x6D,0x6A,0x6A,0x69,0x60,0x56, + 0x61,0x75,0x77,0x6F,0x66,0x5E,0x60,0x67,0x61,0x60,0x66,0x67,0x68,0x69,0x60,0x5B, + 0x61,0x65,0x66,0x66,0x65,0x65,0x62,0x58,0x56,0x6C,0x7B,0x77,0x6F,0x66,0x61,0x6A, + 0x6C,0x66,0x6B,0x72,0x76,0x78,0x75,0x6C,0x6F,0x78,0x7B,0x7C,0x7B,0x7D,0x7F,0x7A, + 0x72,0x7F,0x98,0x9E,0x98,0x91,0x89,0x8B,0x94,0x8F,0x8F,0x99,0x9F,0xA2,0xA2,0x9B, + 0x98,0x9F,0xA3,0xA3,0xA1,0xA1,0xA2,0xA0,0x94,0x92,0xA6,0xB4,0xAF,0xA5,0x9B,0x96, + 0x9C,0x9B,0x94,0x97,0x9D,0x9E,0x9B,0x95,0x8E,0x91,0x96,0x96,0x93,0x92,0x91,0x8E, + 0x87,0x7C,0x87,0x9C,0x9D,0x93,0x89,0x80,0x82,0x87,0x80,0x7D,0x84,0x89,0x86,0x81, + 0x77,0x72,0x78,0x7A,0x77,0x74,0x73,0x70,0x6A,0x5D,0x5B,0x70,0x7C,0x74,0x68,0x60, + 0x5C,0x62,0x61,0x59,0x5E,0x67,0x69,0x65,0x60,0x59,0x5D,0x63,0x64,0x62,0x63,0x65, + 0x63,0x5B,0x52,0x63,0x78,0x77,0x6C,0x66,0x62,0x67,0x6C,0x63,0x64,0x6F,0x76,0x75, + 0x72,0x6C,0x70,0x79,0x7B,0x79,0x7A,0x7D,0x7D,0x79,0x6E,0x77,0x90,0x98,0x90,0x89, + 0x85,0x85,0x8D,0x87,0x83,0x8B,0x95,0x97,0x93,0x8C,0x89,0x94,0x98,0x97,0x95,0x99, + 0x9A,0x97,0x8D,0x88,0x9E,0xB0,0xAB,0xA1,0x9B,0x98,0x9E,0x9E,0x93,0x98,0xA4,0xA9, + 0xA5,0x9D,0x95,0x9B,0xA1,0x9E,0x9B,0x9C,0x9E,0x9A,0x92,0x86,0x92,0xA8,0xA8,0x9C, + 0x94,0x8F,0x91,0x94,0x86,0x85,0x90,0x96,0x94,0x8C,0x82,0x81,0x88,0x86,0x82,0x7F, + 0x82,0x80,0x79,0x6B,0x6D,0x84,0x8C,0x82,0x78,0x71,0x6F,0x74,0x6C,0x64,0x6C,0x73, + 0x73,0x6D,0x65,0x5F,0x66,0x67,0x63,0x62,0x65,0x66,0x60,0x57,0x53,0x68,0x76,0x70, + 0x65,0x5E,0x5D,0x64,0x64,0x59,0x5C,0x66,0x6D,0x69,0x63,0x5C,0x62,0x6A,0x67,0x67, + 0x6A,0x6D,0x6A,0x63,0x5B,0x6C,0x81,0x7F,0x76,0x6E,0x6D,0x75,0x7A,0x70,0x71,0x7C, + 0x82,0x81,0x7C,0x76,0x79,0x83,0x83,0x81,0x82,0x87,0x86,0x80,0x77,0x84,0x9C,0x9C, + 0x93,0x8C,0x89,0x8E,0x94,0x8C,0x8B,0x96,0x9C,0x9C,0x97,0x91,0x92,0x9C,0x9A,0x96, + 0x96,0x9B,0x99,0x92,0x86,0x91,0xA9,0xA8,0x9C,0x94,0x90,0x93,0x97,0x8E,0x8A,0x94, + 0x98,0x97,0x92,0x8B,0x89,0x93,0x92,0x8D,0x8B,0x8E,0x8E,0x86,0x7B,0x82,0x9A,0x9B, + 0x92,0x88,0x82,0x83,0x89,0x82,0x7C,0x84,0x8A,0x8B,0x85,0x7C,0x79,0x82,0x84,0x7F, + 0x7D,0x7E,0x7C,0x73,0x69,0x73,0x8A,0x89,0x7F,0x77,0x72,0x73,0x78,0x6F,0x6B,0x76, + 0x7C,0x7D,0x77,0x6F,0x6D,0x76,0x78,0x73,0x73,0x76,0x74,0x6A,0x64,0x75,0x88,0x85, + 0x7C,0x73,0x70,0x75,0x76,0x6D,0x70,0x7A,0x7E,0x7D,0x77,0x71,0x75,0x7D,0x7A,0x75, + 0x77,0x79,0x73,0x67,0x69,0x81,0x8A,0x82,0x79,0x72,0x72,0x78,0x73,0x6B,0x74,0x7D, + 0x7F,0x7B,0x73,0x72,0x79,0x7F,0x7B,0x7B,0x7F,0x7E,0x76,0x6D,0x7B,0x90,0x8E,0x86, + 0x7F,0x7C,0x80,0x82,0x78,0x78,0x86,0x8C,0x8A,0x82,0x7D,0x7E,0x84,0x83,0x7F,0x82, + 0x83,0x7D,0x73,0x76,0x8F,0x97,0x8B,0x84,0x80,0x80,0x83,0x7E,0x76,0x81,0x8C,0x8B, + 0x89,0x82,0x7E,0x84,0x87,0x80,0x81,0x86,0x83,0x79,0x70,0x84,0x98,0x91,0x89,0x85, + 0x82,0x84,0x82,0x78,0x79,0x85,0x89,0x87,0x83,0x7F,0x81,0x87,0x83,0x7E,0x84,0x87, + 0x7F,0x72,0x79,0x92,0x95,0x8A,0x85,0x82,0x84,0x86,0x7F,0x7A,0x85,0x8D,0x89,0x84, + 0x7F,0x80,0x88,0x88,0x81,0x82,0x88,0x85,0x77,0x71,0x88,0x97,0x8C,0x83,0x7F,0x80, + 0x83,0x7E,0x75,0x79,0x86,0x89,0x82,0x7E,0x7C,0x80,0x85,0x7F,0x7A,0x81,0x85,0x7B, + 0x70,0x7B,0x93,0x93,0x86,0x83,0x82,0x84,0x84,0x7B,0x77,0x80,0x89,0x87,0x82,0x81, + 0x81,0x85,0x84,0x7D,0x7E,0x84,0x7E,0x6F,0x6E,0x86,0x92,0x87,0x80,0x7F,0x80,0x81, + 0x7C,0x73,0x75,0x82,0x85,0x7C,0x7B,0x7E,0x80,0x82,0x7D,0x7B,0x81,0x84,0x77,0x6C, + 0x7B,0x91,0x8C,0x81,0x81,0x83,0x85,0x83,0x7B,0x77,0x81,0x8A,0x84,0x7E,0x81,0x84, + 0x86,0x84,0x7D,0x7F,0x85,0x81,0x72,0x74,0x8D,0x93,0x84,0x81,0x83,0x83,0x81,0x7C, + 0x76,0x78,0x85,0x87,0x7D,0x7C,0x81,0x83,0x81,0x7C,0x7A,0x7E,0x7F,0x74,0x6A,0x7B, + 0x91,0x88,0x7B,0x7F,0x84,0x81,0x7A,0x76,0x75,0x7A,0x84,0x7E,0x78,0x7E,0x85,0x85, + 0x7F,0x7D,0x7F,0x80,0x7B,0x71,0x72,0x89,0x92,0x83,0x7C,0x83,0x8A,0x83,0x77,0x78, + 0x7C,0x81,0x83,0x7D,0x7C,0x82,0x88,0x85,0x7D,0x7D,0x84,0x81,0x77,0x71,0x7C,0x8F, + 0x8C,0x7E,0x7D,0x85,0x8B,0x80,0x74,0x79,0x80,0x82,0x7C,0x78,0x7F,0x84,0x85,0x82, + 0x7D,0x80,0x83,0x7E,0x75,0x72,0x81,0x8F,0x85,0x7A,0x7E,0x89,0x89,0x7B,0x75,0x7E, + 0x83,0x80,0x79,0x79,0x80,0x81,0x81,0x7E,0x7F,0x83,0x82,0x7D,0x77,0x79,0x87,0x88, + 0x7D,0x7C,0x83,0x8B,0x85,0x7B,0x7D,0x82,0x83,0x7F,0x7A,0x7E,0x82,0x7F,0x7F,0x7E, + 0x81,0x82,0x7F,0x7C,0x7A,0x7F,0x86,0x81,0x7D,0x80,0x85,0x88,0x82,0x7D,0x82,0x84, + 0x83,0x7E,0x7C,0x80,0x81,0x7F,0x7F,0x7F,0x83,0x83,0x7E,0x7B,0x7C,0x83,0x83,0x7E, + 0x80,0x83,0x86,0x86,0x81,0x82,0x85,0x83,0x83,0x80,0x7F,0x81,0x80,0x81,0x81,0x81, + 0x84,0x82,0x7E,0x7C,0x7E,0x83,0x80,0x7E,0x7F,0x81,0x86,0x84,0x7F,0x82,0x83,0x83, + 0x81,0x7C,0x7E,0x7F,0x7E,0x7F,0x7E,0x81,0x82,0x7F,0x7D,0x7C,0x7F,0x83,0x7F,0x7F, + 0x80,0x81,0x86,0x83,0x80,0x83,0x83,0x83,0x80,0x7D,0x80,0x80,0x7F,0x7F,0x7F,0x83, + 0x83,0x7F,0x7F,0x7E,0x82,0x84,0x80,0x81,0x82,0x83,0x85,0x82,0x83,0x85,0x83,0x83, + 0x80,0x7E,0x80,0x7F,0x7F,0x7E,0x7E,0x81,0x80,0x7E,0x7C,0x7C,0x81,0x81,0x7E,0x80, + 0x80,0x82,0x83,0x7F,0x81,0x83,0x81,0x81,0x7D,0x7D,0x80,0x7E,0x7E,0x7F,0x80,0x83, + 0x80,0x7E,0x7D,0x7D,0x82,0x81,0x80,0x84,0x83,0x85,0x85,0x81,0x84,0x85,0x82,0x82, + 0x7D,0x7E,0x80,0x7E,0x7D,0x7D,0x7E,0x7F,0x7D,0x7C,0x7B,0x7B,0x7F,0x7D,0x7D,0x80, + 0x80,0x82,0x82,0x7E,0x82,0x84,0x81,0x81,0x7D,0x7F,0x80,0x7D,0x7E,0x7E,0x80,0x81, + 0x7E,0x7F,0x7E,0x7C,0x81,0x80,0x7F,0x83,0x82,0x84,0x84,0x7F,0x82,0x84,0x82,0x81, + 0x7D,0x7E,0x80,0x7D,0x7C,0x7C,0x7D,0x7F,0x7D,0x7C,0x7B,0x7A,0x7F,0x7F,0x7C,0x7F, + 0x81,0x83,0x84,0x81,0x80,0x83,0x83,0x8D,0x86,0x64,0x72,0x88,0x87,0x73,0x7E,0x90, + 0x6C,0x73,0x7F,0x78,0x7A,0x86,0x90,0x7C,0x7C,0x88,0x8B,0x7C,0x7A,0x8E,0x81,0x75, + 0x76,0x7B,0x81,0x7D,0x80,0x84,0x78,0x74,0x7E,0x7C,0x7F,0x85,0x88,0x8B,0x87,0x83, + 0x81,0x7C,0x85,0x87,0x81,0x87,0x7F,0x87,0x7D,0x6C,0x88,0x85,0x6B,0x7C,0x7A,0x78, + 0x6F,0x62,0x7F,0x76,0x6B,0x7B,0x73,0x77,0x80,0x7C,0x77,0x6D,0x73,0x81,0x8C,0x89, + 0x79,0x7B,0x8F,0x8E,0x88,0x89,0x82,0x86,0x91,0x92,0x8C,0x91,0xA4,0x99,0x90,0x9B, + 0x8D,0x8C,0x9E,0xA8,0xA2,0x9B,0x9D,0x97,0x92,0x94,0x92,0x81,0x7E,0x8C,0x8F,0x90, + 0x92,0x84,0x77,0x79,0x73,0x6F,0x69,0x6C,0x7A,0x78,0x73,0x6C,0x65,0x68,0x6A,0x6E, + 0x6D,0x62,0x63,0x61,0x59,0x5D,0x58,0x58,0x5E,0x62,0x6B,0x6D,0x62,0x61,0x6B,0x67, + 0x5F,0x61,0x69,0x77,0x78,0x6D,0x6F,0x70,0x74,0x7F,0x78,0x77,0x7A,0x79,0x80,0x7F, + 0x81,0x88,0x8F,0x9A,0xA9,0xB1,0xAF,0xA6,0x9F,0x9F,0x9F,0x98,0x91,0x94,0x91,0x8F, + 0x8C,0x89,0x92,0x93,0x8C,0x87,0x84,0x82,0x7F,0x7D,0x7C,0x7C,0x7D,0x82,0x85,0x89, + 0x8A,0x85,0x89,0x8D,0x88,0x86,0x8A,0x8E,0x8D,0x8D,0x8C,0x91,0x95,0x90,0x8D,0x8D, + 0x8E,0x91,0x8B,0x8C,0x91,0x91,0x91,0x8C,0x8E,0x95,0x91,0x8C,0x94,0x98,0x8F,0x95, + 0x98,0x93,0x9C,0x98,0x90,0x98,0x9A,0x98,0x93,0x90,0x90,0x88,0x87,0x81,0x78,0x7E, + 0x77,0x6E,0x6F,0x6A,0x6C,0x69,0x6E,0x71,0x5B,0x5D,0x5D,0x5B,0x64,0x53,0x52,0x57, + 0x50,0x53,0x45,0x4A,0x5C,0x59,0x5B,0x5A,0x62,0x6C,0x5F,0x5C,0x5F,0x5D,0x59,0x51, + 0x6C,0x7B,0x69,0x72,0x74,0x72,0x76,0x61,0x65,0x73,0x75,0x7F,0x79,0x7F,0x90,0x90, + 0x8F,0x99,0xA2,0xA9,0xA7,0xA2,0xA6,0x9D,0x8E,0x8E,0xA0,0xAD,0xA0,0x94,0x96,0x9A, + 0x90,0x7C,0x7E,0x88,0x8C,0x8D,0x86,0x89,0x8C,0x88,0x81,0x7C,0x86,0x8C,0x85,0x85, + 0x86,0x7D,0x7D,0x76,0x87,0xA2,0x97,0x90,0x96,0x92,0x92,0x8A,0x84,0x96,0x9C,0x97, + 0x92,0x95,0x9F,0x97,0x8B,0x8E,0x95,0x9B,0x9E,0x9A,0x9C,0x9C,0x91,0x88,0x8C,0xA6, + 0xA8,0x9A,0x9B,0x97,0x95,0x91,0x83,0x89,0x90,0x8E,0x88,0x7F,0x82,0x7F,0x75,0x72, + 0x73,0x74,0x71,0x69,0x66,0x62,0x5C,0x55,0x4A,0x5B,0x6F,0x63,0x56,0x54,0x55,0x56, + 0x4C,0x46,0x54,0x60,0x63,0x5A,0x56,0x5C,0x5D,0x5C,0x5C,0x63,0x6B,0x69,0x62,0x62, + 0x64,0x68,0x68,0x64,0x79,0x91,0x83,0x75,0x74,0x7D,0x87,0x82,0x85,0x97,0xA7,0xA8, + 0x9C,0x98,0xA3,0xA3,0x9A,0x94,0x98,0xA0,0x98,0x8F,0x8A,0x88,0x87,0x80,0x78,0x8B, + 0x9E,0x8D,0x80,0x7C,0x81,0x86,0x7F,0x7F,0x89,0x8F,0x87,0x7D,0x7B,0x89,0x8D,0x86, + 0x86,0x8C,0x90,0x89,0x87,0x8B,0x90,0x8F,0x89,0x87,0x9C,0xAF,0x9F,0x8F,0x8A,0x8F, + 0x96,0x8F,0x8B,0x9B,0xA5,0x9B,0x8A,0x86,0x92,0x9B,0x98,0x94,0x98,0x9A,0x92,0x87, + 0x88,0x8E,0x8D,0x85,0x7C,0x8A,0x9E,0x96,0x82,0x79,0x7B,0x7F,0x78,0x6F,0x71,0x75, + 0x73,0x5D,0x53,0x5E,0x63,0x5F,0x59,0x5E,0x5E,0x55,0x50,0x51,0x55,0x58,0x54,0x47, + 0x50,0x6F,0x70,0x5E,0x57,0x57,0x5D,0x65,0x60,0x5D,0x69,0x71,0x62,0x55,0x5F,0x6B, + 0x6F,0x72,0x73,0x7A,0x79,0x73,0x6F,0x77,0x83,0x85,0x88,0x89,0xA3,0xB9,0xAA,0x9B, + 0x96,0x9A,0xA1,0x9D,0x96,0x9A,0x9F,0x97,0x87,0x82,0x8D,0x8E,0x87,0x83,0x83,0x86, + 0x81,0x78,0x7A,0x83,0x81,0x7C,0x76,0x7D,0x96,0x96,0x83,0x7A,0x7A,0x87,0x8A,0x85, + 0x8D,0x95,0x96,0x8E,0x87,0x8E,0x99,0x98,0x94,0x94,0x98,0x97,0x8E,0x8D,0x90,0x95, + 0x93,0x8D,0x8A,0x9B,0xAE,0xA1,0x95,0x8F,0x8E,0x99,0x96,0x8D,0x94,0x9B,0x95,0x87, + 0x84,0x89,0x8C,0x8D,0x86,0x83,0x87,0x80,0x75,0x72,0x78,0x77,0x6E,0x66,0x60,0x71, + 0x80,0x6E,0x5C,0x56,0x59,0x5F,0x56,0x55,0x5D,0x62,0x60,0x51,0x4D,0x55,0x5C,0x59, + 0x57,0x5F,0x64,0x61,0x5A,0x58,0x60,0x65,0x61,0x5D,0x5B,0x73,0x83,0x78,0x6A,0x67, + 0x6F,0x76,0x75,0x76,0x83,0x8E,0x8E,0x88,0x8C,0x9B,0xA4,0xA2,0x9F,0xA3,0xA3,0x9F, + 0x96,0x93,0x97,0x98,0x93,0x89,0x89,0x98,0xA2,0x92,0x82,0x7A,0x7E,0x83,0x79,0x76, + 0x84,0x89,0x7F,0x77,0x75,0x7B,0x84,0x85,0x82,0x87,0x8F,0x86,0x7E,0x84,0x8F,0x90, + 0x90,0x8A,0x87,0x9F,0xAF,0x9E,0x8E,0x8D,0x90,0x97,0x91,0x8F,0x9C,0xA1,0x9B,0x8F, + 0x8D,0x94,0x99,0x99,0x93,0x9A,0xA0,0x95,0x8A,0x89,0x94,0x95,0x90,0x89,0x81,0x94, + 0xA6,0x93,0x85,0x81,0x80,0x83,0x7C,0x75,0x7B,0x82,0x75,0x65,0x61,0x69,0x6E,0x68, + 0x61,0x64,0x67,0x62,0x56,0x54,0x5B,0x60,0x59,0x51,0x4C,0x5A,0x75,0x6B,0x5B,0x57, + 0x5B,0x64,0x60,0x5B,0x68,0x70,0x6B,0x60,0x5B,0x6A,0x75,0x6F,0x6D,0x74,0x7A,0x7B, + 0x75,0x78,0x83,0x8D,0x8C,0x89,0x8C,0x97,0xB2,0xB1,0x9F,0x98,0x99,0x9F,0x99,0x8F, + 0x98,0xA0,0x9B,0x8F,0x7F,0x88,0x91,0x88,0x82,0x80,0x83,0x82,0x79,0x73,0x77,0x82, + 0x80,0x79,0x74,0x74,0x8F,0x9C,0x8A,0x82,0x82,0x86,0x8A,0x84,0x8A,0x95,0x98,0x92, + 0x88,0x89,0x92,0x96,0x8F,0x8D,0x97,0x9C,0x91,0x8A,0x90,0x99,0x9C,0x95,0x8E,0x89, + 0x98,0xB0,0xA8,0x94,0x91,0x8F,0x94,0x91,0x89,0x92,0x9C,0x95,0x89,0x86,0x88,0x8A, + 0x85,0x81,0x83,0x84,0x7E,0x71,0x6F,0x72,0x6F,0x6C,0x66,0x5C,0x58,0x6A,0x7D,0x69, + 0x59,0x57,0x57,0x59,0x4F,0x50,0x5E,0x63,0x5B,0x52,0x4F,0x57,0x5F,0x5D,0x5E,0x66, + 0x69,0x65,0x5E,0x61,0x6A,0x6E,0x6C,0x66,0x64,0x6A,0x86,0x8D,0x7A,0x7A,0x7B,0x7F, + 0x84,0x80,0x87,0x9C,0xA2,0x98,0x90,0x94,0xA0,0x9E,0x97,0x9A,0x9E,0x9C,0x93,0x8A, + 0x8C,0x91,0x8D,0x86,0x82,0x78,0x7E,0x99,0x91,0x7A,0x71,0x71,0x79,0x76,0x6C,0x78, + 0x8A,0x85,0x7D,0x76,0x7C,0x87,0x7F,0x7E,0x89,0x8D,0x8D,0x88,0x82,0x85,0x8E,0x8F, + 0x89,0x8D,0x85,0x91,0xAD,0xA1,0x93,0x91,0x8F,0x95,0x92,0x83,0x92,0xA0,0x9C,0x96, + 0x8B,0x91,0x99,0x8E,0x8B,0x95,0x99,0x97,0x8E,0x89,0x8C,0x8B,0x88,0x84,0x86,0x79, + 0x7F,0x98,0x8D,0x79,0x73,0x6D,0x72,0x68,0x59,0x66,0x6D,0x6A,0x62,0x5A,0x58,0x5C, + 0x57,0x52,0x5A,0x5F,0x62,0x5E,0x5A,0x5D,0x60,0x60,0x5E,0x62,0x59,0x61,0x7E,0x76, + 0x68,0x6C,0x61,0x6D,0x6D,0x5E,0x6A,0x76,0x77,0x7A,0x7A,0x7A,0x84,0x86,0x88,0x8A, + 0x8D,0x95,0x99,0x97,0x97,0xA0,0x9D,0x99,0x9A,0x94,0x91,0xA5,0xA0,0x8F,0x97,0x89, + 0x87,0x86,0x7A,0x7B,0x7B,0x74,0x75,0x79,0x71,0x75,0x76,0x77,0x79,0x78,0x7A,0x7F, + 0x7E,0x7B,0x7E,0x80,0x80,0x80,0x81,0x80,0x8C,0x92,0x8D,0x91,0x91,0x90,0x94,0x96, + 0x90,0x93,0x93,0x90,0x94,0x96,0x90,0x93,0x97,0x96,0x9C,0x98,0x94,0x95,0x93,0x91, + 0x91,0x91,0x91,0x8F,0x88,0x87,0x90,0x8D,0x86,0x88,0x85,0x84,0x88,0x80,0x7A,0x79, + 0x75,0x73,0x71,0x6C,0x6C,0x6B,0x6A,0x70,0x6D,0x6B,0x6C,0x69,0x65,0x68,0x68,0x6A, + 0x6A,0x6B,0x64,0x65,0x76,0x72,0x6C,0x70,0x6E,0x6F,0x74,0x70,0x6C,0x6F,0x6E,0x74, + 0x77,0x72,0x73,0x76,0x7A,0x7E,0x7D,0x7C,0x7C,0x82,0x82,0x84,0x88,0x89,0x8C,0x87, + 0x7F,0x84,0x9B,0x90,0x86,0x91,0x82,0x8D,0x8F,0x82,0x84,0x7E,0x83,0x87,0x7F,0x7C, + 0x7D,0x7D,0x81,0x80,0x76,0x78,0x7D,0x7A,0x78,0x7A,0x7D,0x80,0x7C,0x7A,0x72,0x78, + 0x98,0x93,0x81,0x86,0x7B,0x87,0x8C,0x73,0x7A,0x84,0x8D,0x8F,0x81,0x80,0x8A,0x8D, + 0x89,0x86,0x86,0x8F,0x90,0x8F,0x89,0x8E,0x94,0x8D,0x89,0x88,0x84,0x81,0x9E,0xA7, + 0x97,0x95,0x8A,0x87,0x8F,0x7B,0x79,0x89,0x90,0x93,0x85,0x7B,0x85,0x8B,0x81,0x7D, + 0x7D,0x84,0x87,0x81,0x7D,0x7D,0x7B,0x7B,0x7D,0x79,0x7B,0x70,0x7D,0x9C,0x8A,0x7E, + 0x77,0x6D,0x78,0x74,0x69,0x73,0x7F,0x84,0x7F,0x73,0x70,0x7A,0x7B,0x74,0x75,0x7D, + 0x84,0x87,0x7D,0x7A,0x7E,0x7E,0x83,0x81,0x81,0x79,0x7B,0x9C,0x9F,0x8A,0x82,0x7A, + 0x7F,0x83,0x74,0x75,0x83,0x8D,0x8A,0x7D,0x74,0x77,0x7E,0x79,0x73,0x76,0x7D,0x81, + 0x7B,0x72,0x76,0x77,0x7A,0x79,0x7A,0x75,0x68,0x81,0x92,0x86,0x78,0x71,0x6F,0x7C, + 0x79,0x6D,0x76,0x83,0x87,0x83,0x75,0x70,0x7F,0x81,0x7E,0x7D,0x82,0x86,0x8A,0x83, + 0x7C,0x7E,0x80,0x86,0x85,0x83,0x77,0x7D,0x9B,0xA1,0x8E,0x80,0x78,0x78,0x85,0x80, + 0x78,0x7F,0x8A,0x8D,0x8A,0x7B,0x75,0x82,0x82,0x81,0x80,0x7F,0x84,0x87,0x82,0x7E, + 0x7F,0x7F,0x80,0x81,0x7C,0x72,0x7C,0x94,0x99,0x87,0x7A,0x71,0x74,0x80,0x7C,0x7A, + 0x7D,0x82,0x87,0x84,0x78,0x74,0x7A,0x81,0x83,0x80,0x7F,0x81,0x84,0x81,0x7F,0x7E, + 0x81,0x84,0x82,0x7E,0x77,0x82,0x97,0x9B,0x92,0x84,0x74,0x77,0x82,0x84,0x84,0x7F, + 0x7F,0x88,0x8B,0x84,0x7F,0x7C,0x7C,0x82,0x84,0x7F,0x7B,0x7D,0x80,0x7E,0x7C,0x7C, + 0x7D,0x7F,0x79,0x71,0x7E,0x8D,0x8A,0x87,0x7D,0x71,0x73,0x79,0x7B,0x7E,0x7B,0x79, + 0x7F,0x81,0x80,0x80,0x7E,0x7D,0x7F,0x81,0x81,0x7F,0x7E,0x80,0x7F,0x82,0x85,0x83, + 0x82,0x82,0x7E,0x87,0x8E,0x86,0x84,0x85,0x7D,0x7F,0x84,0x80,0x82,0x81,0x7B,0x7D, + 0x81,0x7F,0x7E,0x7F,0x7E,0x80,0x82,0x82,0x81,0x81,0x81,0x80,0x80,0x81,0x7C,0x7F, + 0x80,0x7C,0x81,0x81,0x7E,0x80,0x80,0x7E,0x82,0x83,0x80,0x83,0x7F,0x7B,0x7D,0x7C, + 0x7A,0x7C,0x7A,0x79,0x7C,0x7D,0x7E,0x7D,0x7E,0x7C,0x7F,0x83,0x80,0x81,0x82,0x82, + 0x84,0x87,0x82,0x81,0x84,0x7F,0x82,0x85,0x82,0x81,0x81,0x7E,0x7D,0x7E,0x7E,0x7E, + 0x7D,0x7C,0x7C,0x7D,0x7E,0x7E,0x7D,0x7F,0x7F,0x7E,0x80,0x7E,0x7E,0x7E,0x7F,0x82, + 0x81,0x7F,0x7F,0x7E,0x7C,0x80,0x80,0x7D,0x7F,0x7D,0x7B,0x7D,0x7C,0x7A,0x7A,0x79, + 0x7A,0x7C,0x7D,0x7E,0x7F,0x7F,0x81,0x83,0x84,0x83,0x83,0x84,0x81,0x83,0x87,0x83, + 0x80,0x84,0x80,0x82,0x86,0x82,0x81,0x81,0x7E,0x7D,0x80,0x7D,0x7D,0x7D,0x7A,0x7D, + 0x7F,0x7E,0x80,0x80,0x80,0x82,0x84,0x83,0x81,0x82,0x82,0x80,0x85,0x87,0x81,0x82, + 0x83,0x7E,0x82,0x85,0x80,0x81,0x7F,0x7C,0x7E,0x7E,0x7B,0x7B,0x7B,0x7A,0x7D,0x7E, + 0x7E,0x7F,0x80,0x81,0x82,0x83,0x84,0x82,0x81,0x82,0x83,0x88,0x86,0x82,0x85,0x83, + 0x81,0x86,0x85,0x84,0x85,0x7F,0x7F,0x81,0x7F,0x7D,0x7E,0x7B,0x7C,0x7F,0x7F,0x80, + 0x80,0x81,0x81,0x84,0x83,0x82,0x82,0x82,0x80,0x83,0x86,0x82,0x83,0x82,0x7E,0x81, + 0x84,0x7E,0x7F,0x7F,0x7A,0x7D,0x7D,0x7A,0x7A,0x79,0x77,0x7A,0x7C,0x7E,0x7F,0x7F, + 0x81,0x83,0x83,0x84,0x84,0x83,0x82,0x84,0x88,0x85,0x82,0x85,0x82,0x81,0x86,0x84, + 0x81,0x82,0x7E,0x7D,0x80,0x7E,0x7D,0x7D,0x7A,0x7D,0x7F,0x7E,0x82,0x81,0x7F,0x82, + 0x85,0x85,0x84,0x84,0x83,0x82,0x87,0x89,0x83,0x84,0x85,0x80,0x85,0x86,0x80,0x83, + 0x81,0x7C,0x7F,0x7F,0x7C,0x7D,0x7A,0x7A,0x7E,0x7A,0x8D,0x84,0x80,0x88,0x66,0x79, + 0x86,0x6D,0x67,0x75,0x82,0x8B,0x8E,0x8D,0x8F,0x89,0x93,0xA8,0xA1,0x9D,0xAB,0x9B, + 0x8D,0x83,0x71,0x85,0x81,0x5C,0x62,0x70,0x63,0x5B,0x59,0x52,0x5B,0x63,0x63,0x5A, + 0x53,0x65,0x6C,0x6E,0x7C,0x72,0x88,0xAB,0x8D,0x93,0xA9,0x9C,0xAF,0x92,0x99,0xC7, + 0xA1,0xA5,0xA5,0x90,0xAB,0xA5,0x8E,0x8B,0x8A,0x93,0x8A,0x71,0x7E,0x70,0x6D,0x7A, + 0x68,0x87,0x8E,0x6A,0x7B,0x89,0x77,0x81,0x6B,0x44,0x5A,0x62,0x5F,0x6C,0x63,0x56, + 0x5A,0x64,0x69,0x5E,0x7B,0x81,0x84,0x9F,0x9A,0x8A,0x86,0x8C,0x85,0x88,0x92,0xA9, + 0xB3,0x9D,0x96,0xA0,0x99,0xA3,0x9B,0x8E,0x95,0x83,0x85,0x7E,0x74,0x7B,0x70,0x69, + 0x67,0x74,0x7C,0x66,0x52,0x4D,0x4E,0x58,0x4C,0x3B,0x40,0x52,0x49,0x43,0x51,0x5C, + 0x69,0x66,0x75,0x83,0x82,0x95,0xAB,0x9C,0x90,0x87,0x8B,0x98,0x8F,0x90,0x93,0x91, + 0xA2,0xB1,0xBB,0xC3,0xB3,0xAE,0xBC,0xAD,0xA5,0xA4,0x8B,0x95,0x99,0x8C,0x9C,0x96, + 0x88,0x80,0x74,0x76,0x81,0x7A,0x78,0x73,0x5F,0x67,0x68,0x5C,0x5B,0x5D,0x6A,0x65, + 0x5F,0x63,0x5E,0x69,0x70,0x79,0x77,0x71,0x8E,0x94,0x86,0x96,0x91,0x87,0x9B,0x94, + 0xA1,0xA7,0x96,0x98,0x96,0x96,0x98,0x9D,0x98,0x8B,0x96,0x9D,0x94,0x99,0x96,0x90, + 0x96,0x8D,0x8C,0x8A,0x7C,0x6E,0x62,0x5A,0x4E,0x60,0x58,0x4D,0x6B,0x6B,0x65,0x56, + 0x3F,0x3A,0x42,0x4A,0x4F,0x4B,0x42,0x45,0x4B,0x4B,0x4D,0x54,0x55,0x54,0x53,0x5B, + 0x69,0x6F,0x7D,0x80,0x93,0xB1,0xBD,0xB4,0x99,0x93,0x9F,0x9E,0x99,0x9F,0xA2,0xA8, + 0x9C,0x85,0x84,0x86,0x81,0x8F,0x9D,0x8F,0x8B,0x97,0xA2,0xA9,0xA7,0xAE,0xBC,0xB7, + 0xB5,0xB8,0xAB,0xA2,0x95,0x92,0xA7,0xB2,0xA9,0x9A,0x8A,0x8D,0x90,0x91,0x8B,0x80, + 0x7E,0x85,0x86,0x6E,0x66,0x56,0x5D,0x6F,0x6B,0x6E,0x67,0x64,0x6D,0x72,0x64,0x5D, + 0x5E,0x64,0x6A,0x74,0x72,0x55,0x5C,0x5D,0x58,0x64,0x5C,0x61,0x66,0x69,0x74,0x75, + 0x70,0x78,0x7F,0x7D,0x8A,0x87,0x88,0x92,0x9D,0x9E,0xA1,0xA7,0x9B,0x9D,0xA4,0xA3, + 0x9A,0x94,0x95,0x94,0x93,0x8B,0x91,0x8A,0x82,0x8B,0x83,0x7C,0x77,0x7B,0x75,0x6A, + 0x6C,0x6B,0x71,0x76,0x7D,0x8A,0x8F,0x85,0x73,0x70,0x6D,0x6A,0x67,0x62,0x6A,0x74, + 0x7A,0x6A,0x55,0x53,0x5A,0x65,0x61,0x5C,0x68,0x6E,0x72,0x70,0x72,0x7A,0x6E,0x7D, + 0x8D,0x93,0x9B,0x8D,0x89,0x8B,0x92,0x9A,0x9A,0x9E,0xA5,0xA2,0x9E,0x96,0x95,0x9F, + 0xA7,0xB7,0xB1,0xA4,0xAB,0xB5,0xAF,0xA5,0xA1,0x99,0xAD,0xC4,0xC4,0xC3,0xAC,0xA2, + 0xB1,0xBC,0xBB,0xAB,0xA5,0xAC,0xAA,0x9F,0x91,0x8E,0x8C,0x89,0x88,0x78,0x6E,0x60, + 0x52,0x4D,0x41,0x46,0x46,0x3F,0x53,0x62,0x53,0x44,0x3C,0x33,0x42,0x46,0x40,0x3D, + 0x3D,0x41,0x37,0x32,0x2E,0x32,0x3E,0x40,0x45,0x44,0x47,0x55,0x51,0x55,0x65,0x62, + 0x6A,0x80,0x94,0x9D,0x93,0x8D,0x92,0xA1,0xB1,0xB1,0xB1,0xB5,0xB1,0xAC,0xA4,0xA0, + 0xA7,0xA3,0xA5,0x98,0x8E,0x97,0x91,0x9A,0xA6,0x9A,0x93,0x9A,0xA9,0xBA,0xBA,0x9C, + 0x8E,0x9E,0xA4,0xB4,0xBB,0xA4,0xA0,0x9D,0x9C,0xAC,0xA8,0xA6,0xA1,0x8F,0x90,0x8B, + 0x7F,0x85,0x85,0x85,0x89,0x7F,0x83,0x98,0x91,0x7E,0x75,0x70,0x78,0x7D,0x7F,0x76, + 0x6E,0x6F,0x60,0x5B,0x77,0x80,0x78,0x67,0x55,0x67,0x67,0x5F,0x54,0x3C,0x43,0x46, + 0x52,0x68,0x66,0x62,0x51,0x47,0x5E,0x63,0x5B,0x5C,0x5B,0x69,0x62,0x57,0x62,0x6B, + 0x73,0x75,0x73,0x71,0x70,0x6D,0x6C,0x63,0x5C,0x61,0x5C,0x6B,0x84,0x7C,0x68,0x6E, + 0x77,0x86,0x95,0x99,0xA9,0xB7,0xB9,0xB2,0xAE,0xB1,0xB7,0xBF,0xB9,0xB0,0xA8,0x99, + 0x97,0xA0,0xA4,0xA2,0x97,0x99,0xA7,0xA1,0x99,0x86,0x77,0x8C,0x92,0x8F,0x8E,0x81, + 0x7F,0x7F,0x7A,0x80,0x81,0x8A,0x93,0x8A,0x8B,0x87,0x77,0x7D,0x79,0x75,0x71,0x65, + 0x7F,0x88,0x7E,0x76,0x6C,0x75,0x81,0x87,0x84,0x86,0x87,0x6E,0x63,0x73,0x80,0x89, + 0x83,0x74,0x75,0x78,0x7B,0x78,0x65,0x60,0x60,0x5B,0x6A,0x6D,0x5A,0x49,0x46,0x58, + 0x64,0x5F,0x65,0x6C,0x67,0x5A,0x4D,0x56,0x62,0x74,0x7C,0x6B,0x69,0x71,0x6F,0x79, + 0x7F,0x79,0x71,0x6E,0x88,0x90,0x71,0x5E,0x5C,0x67,0x7A,0x7F,0x7E,0x81,0x7D,0x81, + 0x88,0x93,0xA0,0xA1,0xA4,0xA5,0xB0,0xB1,0xA6,0xB3,0xB8,0xB1,0xAC,0xAE,0xC1,0xC0, + 0xA5,0x90,0x85,0x89,0x8D,0x86,0x8A,0x90,0x8A,0x81,0x80,0x8D,0x98,0x9A,0x91,0x89, + 0x85,0x84,0x86,0x88,0x7D,0x76,0x7D,0x7F,0x8E,0x8F,0x7F,0x7F,0x7F,0x86,0x7F,0x77, + 0x7A,0x7C,0x7E,0x6C,0x6A,0x79,0x7D,0x83,0x84,0x79,0x7C,0x7E,0x81,0x87,0x80,0x76, + 0x65,0x72,0x86,0x7C,0x68,0x56,0x59,0x69,0x6B,0x63,0x68,0x64,0x58,0x59,0x5E,0x61, + 0x5C,0x5E,0x5A,0x5F,0x6A,0x67,0x6B,0x6A,0x70,0x71,0x60,0x6B,0x77,0x70,0x67,0x60, + 0x6D,0x73,0x6E,0x77,0x83,0x83,0x7A,0x6F,0x74,0x87,0x8A,0x81,0x7D,0x7F,0x87,0x93, + 0x94,0x92,0x95,0x95,0xA7,0xC1,0xBF,0xAB,0xA6,0xA9,0xB5,0xB3,0xA3,0xA9,0xAC,0xA3, + 0x96,0x96,0xA0,0xA2,0xA0,0x9A,0xA0,0xA1,0x9E,0x9E,0x97,0x96,0x9F,0x98,0x9D,0xB2, + 0xA7,0x95,0x8A,0x8B,0x9A,0x9E,0x9D,0x9C,0x9B,0x99,0x93,0x8F,0x92,0x94,0x8A,0x86, + 0x88,0x89,0x83,0x7C,0x88,0x82,0x74,0x80,0x92,0x92,0x7F,0x6E,0x6C,0x6F,0x73,0x69, + 0x69,0x73,0x6A,0x5F,0x58,0x64,0x6D,0x6A,0x65,0x58,0x5F,0x65,0x5A,0x59,0x55,0x52, + 0x55,0x5E,0x6D,0x68,0x51,0x47,0x51,0x60,0x63,0x5A,0x5B,0x62,0x46,0x3C,0x50,0x61, + 0x57,0x53,0x72,0x5A,0x52,0x67,0x65,0x6B,0x74,0x79,0x6F,0x7E,0x90,0x86,0x7D,0x73, + 0x8D,0x93,0x84,0x8B,0x95,0xA0,0x9C,0x97,0xAB,0xBE,0xA9,0x9F,0xA2,0xA5,0xA5,0xA8, + 0xAE,0x9D,0xA0,0xA3,0xAB,0xC6,0xBF,0xAB,0x9E,0x9F,0xB2,0xB2,0xAA,0xA9,0xA1,0x9A, + 0x97,0x96,0x9F,0xAA,0x9F,0x9F,0xA4,0xA0,0xA3,0x9E,0xA0,0xA3,0x98,0x99,0xAC,0xAD, + 0x9E,0x92,0x97,0xA3,0x97,0x94,0xA5,0xA2,0x98,0x8F,0x88,0x91,0x94,0x8C,0x87,0x7F, + 0x87,0x81,0x74,0x78,0x6F,0x6E,0x6F,0x7A,0x80,0x70,0x61,0x55,0x5A,0x62,0x5C,0x5A, + 0x5B,0x5A,0x50,0x46,0x4A,0x50,0x52,0x51,0x45,0x44,0x49,0x49,0x4C,0x47,0x3F,0x33, + 0x47,0x64,0x5B,0x51,0x42,0x3E,0x52,0x4E,0x4D,0x5A,0x55,0x4B,0x46,0x4D,0x5D,0x63, + 0x5E,0x62,0x6B,0x74,0x74,0x74,0x79,0x7F,0x81,0x85,0x99,0x97,0x85,0x81,0x88,0x91, + 0x8F,0x87,0x8D,0x99,0x98,0x8A,0x89,0x94,0x9B,0x9E,0x9B,0x96,0x97,0x96,0x93,0x96, + 0x96,0x8C,0x8C,0xA4,0xAD,0x9F,0x94,0x98,0xA7,0xA8,0xA5,0xAE,0xB3,0xAE,0xA0,0xA0, + 0xAA,0xB1,0xAF,0xA2,0x9D,0xA3,0xA7,0xA7,0xA2,0x9D,0x9E,0x99,0xA4,0xAF,0x9F,0x8D, + 0x87,0x8E,0x95,0x8F,0x89,0x8B,0x8C,0x81,0x7A,0x83,0x87,0x86,0x7C,0x77,0x78,0x75, + 0x70,0x6D,0x6C,0x6D,0x61,0x67,0x7D,0x77,0x61,0x53,0x5E,0x69,0x62,0x5E,0x62,0x5E, + 0x57,0x4F,0x54,0x61,0x63,0x62,0x5E,0x5C,0x62,0x60,0x5D,0x5F,0x63,0x5F,0x5F,0x74, + 0x78,0x6B,0x69,0x73,0x81,0x87,0x85,0x8E,0x92,0x8C,0x81,0x7F,0x8F,0x96,0x91,0x87, + 0x81,0x83,0x85,0x82,0x7F,0x7D,0x72,0x76,0x91,0x90,0x79,0x6E,0x71,0x7E,0x7E,0x78, + 0x7D,0x7C,0x75,0x6D,0x76,0x84,0x83,0x79,0x78,0x80,0x89,0x84,0x82,0x88,0x8C,0x8F, + 0x8E,0x9E,0x9E,0x8C,0x8C,0x91,0x95,0x96,0x91,0x96,0x97,0x90,0x81,0x80,0x90,0x8F, + 0x88,0x84,0x81,0x82,0x80,0x7E,0x7F,0x7C,0x6D,0x73,0x8A,0x85,0x6D,0x65,0x6C,0x73, + 0x72,0x6F,0x77,0x72,0x65,0x5D,0x64,0x73,0x70,0x67,0x65,0x69,0x6D,0x67,0x69,0x6D, + 0x6B,0x63,0x65,0x7A,0x7A,0x65,0x60,0x6A,0x73,0x75,0x75,0x7F,0x80,0x75,0x6F,0x77, + 0x86,0x8E,0x8D,0x8E,0x91,0x92,0x96,0x98,0x9C,0x97,0x8A,0xA2,0xB4,0xA3,0x8D,0x88, + 0x95,0x99,0x91,0x90,0x96,0x8F,0x81,0x7E,0x88,0x90,0x8E,0x85,0x85,0x8C,0x8A,0x84, + 0x80,0x83,0x87,0x83,0x92,0x9E,0x92,0x83,0x85,0x91,0x95,0x91,0x91,0x97,0x95,0x8E, + 0x88,0x8F,0x99,0x97,0x97,0x96,0x94,0x92,0x8C,0x8D,0x90,0x82,0x82,0x99,0x9B,0x86, + 0x78,0x7C,0x86,0x87,0x7E,0x81,0x87,0x7B,0x6E,0x6E,0x7C,0x82,0x7D,0x78,0x75,0x77, + 0x74,0x71,0x70,0x72,0x6E,0x6E,0x80,0x7D,0x6B,0x62,0x69,0x74,0x75,0x6E,0x70,0x77, + 0x72,0x66,0x66,0x74,0x76,0x75,0x77,0x76,0x76,0x79,0x79,0x7D,0x80,0x73,0x86,0xA1, + 0x94,0x80,0x7C,0x8A,0x93,0x89,0x88,0x95,0x90,0x81,0x79,0x83,0x90,0x8C,0x85,0x86, + 0x87,0x85,0x7E,0x7A,0x7B,0x7D,0x7B,0x84,0x91,0x87,0x78,0x73,0x7C,0x83,0x81,0x7F, + 0x86,0x85,0x7B,0x78,0x83,0x8C,0x8A,0x85,0x87,0x8A,0x85,0x83,0x83,0x85,0x7E,0x7C, + 0x97,0x9C,0x85,0x7B,0x81,0x89,0x89,0x83,0x8E,0x93,0x84,0x7B,0x7B,0x86,0x8D,0x86, + 0x80,0x83,0x86,0x80,0x78,0x79,0x7E,0x79,0x78,0x8D,0x90,0x7D,0x6E,0x71,0x7E,0x7F, + 0x79,0x7E,0x83,0x7A,0x6F,0x6F,0x7C,0x80,0x7B,0x7A,0x7C,0x79,0x76,0x77,0x77,0x77, + 0x6E,0x7C,0x8F,0x81,0x71,0x72,0x7B,0x7F,0x7A,0x7C,0x8B,0x86,0x77,0x71,0x7D,0x8B, + 0x8A,0x86,0x86,0x89,0x89,0x83,0x7F,0x86,0x8A,0x81,0x8B,0x9B,0x90,0x7B,0x75,0x7F, + 0x86,0x84,0x80,0x88,0x85,0x76,0x70,0x79,0x85,0x81,0x80,0x81,0x7C,0x79,0x76,0x77, + 0x7D,0x76,0x76,0x8F,0x8F,0x7B,0x75,0x79,0x7F,0x7E,0x78,0x83,0x8B,0x7C,0x71,0x71, + 0x80,0x87,0x81,0x81,0x83,0x81,0x7D,0x79,0x7C,0x81,0x7B,0x7C,0x90,0x91,0x7E,0x73, + 0x7B,0x82,0x82,0x7C,0x82,0x89,0x7D,0x71,0x73,0x7F,0x80,0x7E,0x80,0x80,0x7D,0x79, + 0x78,0x7C,0x77,0x70,0x85,0x91,0x7F,0x70,0x74,0x7C,0x80,0x7C,0x7E,0x8B,0x82,0x72, + 0x6F,0x7A,0x81,0x7B,0x7A,0x7F,0x80,0x7A,0x76,0x77,0x7B,0x74,0x76,0x91,0x92,0x7F, + 0x75,0x7E,0x89,0x8B,0x87,0x8D,0x94,0x89,0x7D,0x81,0x8C,0x8B,0x87,0x85,0x87,0x86, + 0x81,0x7D,0x7D,0x78,0x73,0x89,0x92,0x7E,0x6E,0x72,0x7B,0x7C,0x77,0x7B,0x87,0x7D, + 0x71,0x70,0x7C,0x82,0x7D,0x7E,0x81,0x84,0x7F,0x78,0x7A,0x81,0x79,0x7F,0x95,0x8F, + 0x7C,0x76,0x7D,0x82,0x81,0x80,0x8A,0x89,0x79,0x73,0x79,0x81,0x83,0x80,0x81,0x84, + 0x81,0x7E,0x7B,0x7D,0x76,0x7C,0x95,0x92,0x7D,0x75,0x7C,0x80,0x7E,0x7C,0x85,0x88, + 0x79,0x71,0x76,0x80,0x81,0x7E,0x83,0x89,0x83,0x7E,0x7D,0x80,0x7C,0x75,0x8D,0x98, + 0x85,0x76,0x79,0x7E,0x7F,0x7C,0x80,0x8B,0x81,0x74,0x72,0x79,0x80,0x7F,0x7D,0x81, + 0x80,0x7D,0x7E,0x80,0x7D,0x76,0x90,0x9D,0x89,0x7C,0x80,0x85,0x84,0x81,0x87,0x92, + 0x87,0x7A,0x79,0x80,0x83,0x7F,0x7F,0x82,0x80,0x7A,0x77,0x77,0x77,0x6F,0x7D,0x95, + 0x89,0x76,0x76,0x7B,0x7F,0x7B,0x7D,0x8B,0x86,0x78,0x75,0x7C,0x83,0x80,0x80,0x83, + 0x81,0x7C,0x79,0x79,0x7D,0x73,0x7E,0x97,0x8E,0x7D,0x7C,0x82,0x84,0x83,0x84,0x8F, + 0x8C,0x7D,0x78,0x7F,0x87,0x85,0x84,0x88,0x86,0x81,0x7F,0x7C,0x7D,0x76,0x7A,0x94, + 0x90,0x7B,0x76,0x7C,0x7D,0x7D,0x7C,0x89,0x8C,0x7D,0x75,0x7A,0x84,0x82,0x80,0x87, + 0x88,0x81,0x7F,0x7E,0x82,0x7B,0x78,0x90,0x92,0x7D,0x76,0x7B,0x7C,0x7B,0x7B,0x84, + 0x8C,0x82,0x77,0x7A,0x83,0x84,0x82,0x85,0x89,0x80,0x79,0x7A,0x7E,0x7E,0x7C,0x93, + 0x9D,0x89,0x7D,0x80,0x7C,0x78,0x79,0x83,0x92,0x89,0x7D,0x7F,0x85,0x84,0x82,0x85, + 0x88,0x81,0x7A,0x76,0x74,0x71,0x69,0x7C,0x92,0x85,0x78,0x80,0x83,0x82,0x80,0x82, + 0x8E,0x86,0x76,0x75,0x7C,0x7D,0x7C,0x83,0x8B,0x89,0x83,0x81,0x7F,0x7F,0x77,0x84, + 0x9D,0x93,0x7E,0x80,0x86,0x81,0x7A,0x7D,0x8D,0x87,0x76,0x75,0x78,0x7B,0x7B,0x7E, + 0x87,0x86,0x7E,0x7D,0x7B,0x7B,0x73,0x78,0x91,0x8F,0x7B,0x7A,0x7E,0x7C,0x7D,0x81, + 0x90,0x8D,0x7C,0x7D,0x87,0x84,0x7F,0x7F,0x82,0x83,0x81,0x80,0x7A,0x78,0x71,0x79, + 0x95,0x8F,0x75,0x75,0x82,0x7F,0x76,0x79,0x8B,0x8D,0x83,0x7F,0x82,0x83,0x7D,0x7E, + 0x84,0x81,0x7B,0x7D,0x7F,0x92,0x85,0x68,0x71,0x7B,0x7E,0x8C,0x91,0x84,0x7A,0x75, + 0x82,0x84,0x7A,0x81,0x8B,0x92,0x94,0x8F,0x92,0x96,0x8E,0x84,0x81,0x81,0x6F,0x6D, + 0x7F,0x72,0x5E,0x63,0x60,0x5D,0x64,0x6B,0x7D,0x88,0x86,0x83,0x84,0x83,0x87,0x8E, + 0x92,0x8D,0x83,0x7B,0x7C,0x83,0x76,0x81,0x99,0xA5,0x9A,0x8D,0x97,0x8A,0x73,0x71, + 0x7D,0x70,0x7B,0x95,0x8F,0x89,0x80,0x71,0x7C,0x88,0x6D,0x5A,0x57,0x5E,0x63,0x6B, + 0x7F,0x7C,0x75,0x77,0x72,0x7D,0x87,0x92,0xAD,0xA4,0x94,0xB3,0xAA,0x7B,0x81,0x7E, + 0x67,0x66,0x76,0x7F,0x8D,0x9E,0x9E,0x9F,0xA7,0x9C,0x88,0x7A,0x58,0x3D,0x53,0x79, + 0x79,0x7C,0x8E,0x7F,0x6C,0x75,0x71,0x73,0x8E,0x92,0x9A,0x9A,0x8F,0x82,0x7E,0x92, + 0x86,0x75,0x79,0x71,0x73,0x5E,0x4E,0x66,0x72,0x73,0x80,0x88,0x75,0x5E,0x64,0x75, + 0x7D,0x8B,0x88,0x81,0x83,0x7A,0x98,0xB5,0xA2,0x99,0x96,0xA9,0xA8,0x88,0x8E,0x9A, + 0x91,0x88,0x80,0x77,0x76,0x61,0x58,0x61,0x52,0x61,0x76,0x78,0x79,0x86,0xA1,0x98, + 0x7D,0x90,0x95,0x7A,0x75,0x79,0x73,0x71,0x63,0x68,0x82,0x88,0x94,0x94,0x91,0x8D, + 0x85,0x7E,0x81,0x82,0x70,0x81,0xA4,0x97,0x86,0x8C,0x85,0x74,0x67,0x70,0x7F,0x77, + 0x64,0x69,0x7B,0x78,0x6F,0x80,0x97,0x8E,0x72,0x66,0x60,0x58,0x5E,0x73,0x8D,0x8E, + 0x90,0xA1,0x9A,0x8F,0x9C,0x9E,0xAB,0xA6,0x8E,0x95,0x78,0x6B,0x6B,0x59,0x5D,0x65, + 0x73,0x76,0x61,0x5D,0x7C,0x94,0x7C,0x7C,0x89,0x83,0x7D,0x7A,0x97,0xA0,0x94,0x8D, + 0x8B,0x8C,0x84,0x81,0x93,0xAD,0x99,0x85,0x8F,0x8A,0x73,0x6D,0x7B,0x82,0x89,0x79, + 0x6E,0x6A,0x5C,0x58,0x70,0x7B,0x6C,0x76,0x80,0x82,0x8E,0x8A,0x7F,0x8C,0x84,0x6F, + 0x7D,0x75,0x70,0x8A,0x7E,0x75,0x89,0x8D,0x83,0x83,0x7C,0x82,0x9B,0x9D,0x81,0x87, + 0x89,0x6E,0x80,0x85,0x76,0x78,0x73,0x73,0x7B,0x6C,0x71,0x89,0x76,0x6E,0x75,0x77, + 0x73,0x67,0x89,0xAD,0x92,0x8A,0x9A,0x97,0x91,0x84,0x7E,0x84,0x92,0x98,0x83,0x8A, + 0x8B,0x82,0x98,0x88,0x7B,0x7D,0x6B,0x68,0x71,0x77,0x77,0x6E,0x64,0x6D,0x6D,0x65, + 0x69,0x78,0x7B,0x78,0x90,0x86,0x7B,0x8D,0x98,0xAB,0xA5,0x97,0xA3,0x90,0x7D,0x8D, + 0x91,0x9E,0x97,0x89,0x96,0x92,0x81,0x82,0x84,0x84,0x73,0x63,0x6E,0x64,0x55,0x67, + 0x8B,0x84,0x67,0x6A,0x6C,0x66,0x6C,0x77,0x81,0x87,0x7C,0x7A,0x7A,0x84,0x88,0x8B, + 0x8A,0x83,0x88,0x7E,0x8A,0x83,0x7C,0x9F,0x96,0x80,0x90,0x95,0x85,0x7A,0x73,0x75, + 0x75,0x6B,0x6E,0x78,0x81,0x75,0x6D,0x84,0x8B,0x85,0x7A,0x71,0x73,0x7A,0x95,0xA4, + 0x9D,0xA6,0xAA,0x91,0x84,0x7D,0x7F,0x80,0x72,0x7C,0x7C,0x78,0x69,0x66,0x81,0x76, + 0x6E,0x86,0x85,0x77,0x7B,0x8A,0x8C,0x80,0x88,0x8E,0x7C,0x62,0x63,0x77,0x6D,0x63, + 0x81,0x8A,0x88,0x8F,0x86,0x9A,0x9A,0x89,0x82,0x7B,0x7E,0x6E,0x7E,0x87,0x8F,0x97, + 0x93,0xA9,0xA2,0x97,0x9C,0x91,0x82,0x80,0x7A,0x73,0x6A,0x64,0x64,0x5D,0x63,0x5A, + 0x5F,0x66,0x59,0x75,0x80,0x76,0x80,0x86,0x89,0x8C,0x8F,0x99,0x9B,0x8B,0x87,0x95, + 0x93,0x83,0x85,0x88,0x7B,0x71,0x68,0x6A,0x68,0x5C,0x79,0x82,0x7F,0x88,0x84,0x87, + 0x82,0x77,0x84,0x85,0x7F,0x89,0x82,0x8D,0x81,0x78,0x83,0x83,0x88,0x88,0x92,0x88, + 0x81,0x95,0x90,0x7E,0x85,0x87,0x84,0x6C,0x5E,0x72,0x77,0x75,0x74,0x8C,0x85,0x71, + 0x76,0x76,0x85,0x79,0x7C,0x90,0x8A,0x8D,0x8C,0x82,0x81,0x81,0x76,0x73,0x78,0x73, + 0x7A,0x8D,0x8D,0x87,0xA0,0x92,0x81,0x88,0x7E,0x80,0x79,0x71,0x79,0x8F,0x95,0x8F, + 0x9F,0x98,0x8C,0x89,0x7D,0x87,0x87,0x6F,0x61,0x5E,0x61,0x5D,0x64,0x70,0x6E,0x75, + 0x76,0x7A,0x7C,0x72,0x87,0x8E,0x87,0x8E,0x94,0xA0,0x99,0x90,0x92,0x93,0x86,0x7A, + 0x80,0x79,0x71,0x6D,0x61,0x63,0x6C,0x67,0x68,0x73,0x7A,0x75,0x7B,0x85,0x95,0x9F, + 0x88,0x8E,0x93,0x8F,0x86,0x73,0x7D,0x7F,0x7E,0x7E,0x8E,0x96,0x8A,0x8A,0x85,0x89, + 0x7F,0x7C,0x86,0x81,0x75,0x71,0x74,0x72,0x7A,0x72,0x74,0x77,0x6C,0x85,0x86,0x88, + 0x8F,0x9E,0x95,0x78,0x83,0x7C,0x83,0x7E,0x74,0x7E,0x6B,0x63,0x6D,0x7B,0x83,0x7E, + 0x86,0x91,0x83,0x88,0x8E,0x7D,0x77,0x74,0x72,0x79,0x7F,0x80,0x91,0xA4,0xA3,0x9A, + 0xA7,0xB0,0x95,0x84,0x8C,0x88,0x78,0x69,0x6B,0x73,0x67,0x69,0x68,0x68,0x69,0x65, + 0x6F,0x77,0x74,0x71,0x72,0x7C,0x7A,0x7D,0x92,0x8D,0x86,0x8E,0x8A,0x8D,0x8F,0x86, + 0x80,0x74,0x6B,0x6A,0x7F,0x79,0x74,0x87,0x84,0x86,0x7E,0x89,0x87,0x7A,0x83,0x86, + 0x84,0x80,0x8D,0x8F,0x96,0x8F,0x86,0x90,0x83,0x63,0x67,0x8D,0x94,0x82,0x74,0x8D, + 0x79,0x53,0x69,0x79,0x81,0x7A,0x94,0x98,0x79,0x85,0x87,0x89,0x82,0x85,0x95,0x8F, + 0x80,0x7B,0x8E,0x8D,0x88,0x90,0x8D,0x6D,0x5D,0x5C,0x5C,0x64,0x5F,0x77,0x8A,0x80, + 0x83,0x81,0x8D,0x93,0x85,0x8D,0x94,0x92,0x8C,0x97,0xA6,0x94,0x91,0x98,0x8C,0x93, + 0x9C,0x8C,0x89,0x82,0x72,0x6F,0x71,0x61,0x67,0x70,0x68,0x6F,0x6F,0x6C,0x76,0x7B, + 0x71,0x79,0x77,0x6F,0x7E,0x7F,0x81,0x89,0x87,0x82,0x85,0x8A,0x86,0x88,0x8B,0x7C, + 0x7C,0x80,0x7E,0x82,0x87,0x82,0x73,0x78,0x88,0x8D,0x82,0x8A,0x91,0x81,0x80,0x71, + 0x72,0x8D,0x78,0x77,0x8A,0x79,0x7D,0x7E,0x85,0x92,0x8C,0x90,0x82,0x79,0x7C,0x7D, + 0x8C,0x84,0x7E,0x84,0x7B,0x7D,0x7E,0x83,0x8A,0x77,0x6E,0x7F,0x84,0x81,0x84,0x8D, + 0x97,0x8F,0x88,0x95,0x8C,0x7A,0x6D,0x72,0x66,0x50,0x6B,0x73,0x78,0x83,0x7B,0x87, + 0x8F,0x84,0x84,0x7C,0x7D,0x81,0x78,0x92,0x99,0x89,0xA4,0xA5,0x9B,0x9C,0x8E,0x9A, + 0x98,0x88,0x82,0x79,0x71,0x66,0x65,0x66,0x64,0x67,0x70,0x70,0x6D,0x6E,0x6D,0x73, + 0x72,0x72,0x7C,0x88,0x83,0x83,0x99,0x92,0x86,0x87,0x83,0x7F,0x7D,0x74,0x74,0x76, + 0x6E,0x78,0x7E,0x7F,0x85,0x88,0x94,0x94,0x8E,0x97,0x96,0x89,0x82,0x78,0x71,0x6D, + 0x72,0x7B,0x74,0x76,0x85,0x8A,0x7F,0x83,0x91,0x92,0x89,0x7D,0x78,0x77,0x7F,0x83, + 0x82,0x89,0x84,0x73,0x7D,0x88,0x77,0x7B,0x7F,0x7D,0x7F,0x74,0x75,0x7D,0x89,0x8E, + 0x98,0x99,0x86,0x84,0x80,0x7B,0x68,0x60,0x73,0x6F,0x71,0x75,0x7D,0x8D,0x86,0x8C, + 0x99,0x8E,0x7E,0x7F,0x7B,0x75,0x75,0x7B,0x9A,0x96,0x95,0x9F,0x99,0x99,0x90,0x94, + 0x92,0x88,0x77,0x72,0x76,0x64,0x60,0x6A,0x6B,0x61,0x68,0x6F,0x73,0x75,0x74,0x7B, + 0x7E,0x7F,0x83,0x91,0x90,0x84,0x85,0x8D,0x8F,0x7F,0x7C,0x89,0x80,0x6D,0x73,0x78, + 0x6D,0x6C,0x7A,0x84,0x7B,0x7C,0x8F,0x91,0x86,0x86,0x87,0x8F,0x87,0x79,0x8C,0x8D, + 0x74,0x6C,0x82,0x8A,0x78,0x78,0x8C,0x8A,0x7C,0x79,0x7E,0x80,0x77,0x7C,0x8A,0x78, + 0x6B,0x82,0x8C,0x84,0x84,0x8B,0x87,0x79,0x71,0x75,0x7B,0x7A,0x7F,0x8E,0x93,0x92, + 0x93,0x91,0x91,0x7E,0x68,0x70,0x6C,0x5F,0x6C,0x7E,0x7D,0x7B,0x89,0x95,0x88,0x7B, + 0x80,0x87,0x79,0x6E,0x85,0x92,0x81,0x81,0x90,0x95,0x8D,0x8C,0x9A,0xA3,0x9B,0x8D, + 0x84,0x86,0x76,0x61,0x76,0x7B,0x6D,0x67,0x80,0x85,0x65,0x75,0x7C,0x6A,0x6E,0x71, + 0x79,0x83,0x6F,0x7C,0x8D,0x78,0x7A,0x79,0x84,0x87,0x78,0x87,0x81,0x7A,0x77,0x70, + 0x86,0x7B,0x77,0x90,0x8C,0x86,0x8B,0x90,0x8D,0x86,0x7A,0x78,0x76,0x6E,0x7E,0x8C, + 0x85,0x7E,0x89,0x92,0x89,0x7E,0x88,0x8E,0x85,0x7B,0x80,0x8C,0x81,0x7B,0x80,0x89, + 0x80,0x71,0x83,0x7F,0x6F,0x69,0x6B,0x73,0x6D,0x6E,0x80,0x8F,0x95,0x92,0x9B,0x9D, + 0x8B,0x86,0x85,0x79,0x70,0x65,0x67,0x72,0x77,0x83,0x87,0x91,0x93,0x8F,0x92,0x82, + 0x79,0x76,0x70,0x74,0x7B,0x7C,0x8D,0x89,0x8D,0xA3,0x98,0x92,0x9B,0x9F,0x95,0x7C, + 0x7E,0x8B,0x6E,0x5D,0x65,0x70,0x6D,0x60,0x72,0x7B,0x7F,0x72,0x6D,0x87,0x7C,0x6C, + 0x75,0x85,0x83,0x76,0x82,0x8F,0x89,0x84,0x89,0x85,0x7D,0x76,0x7D,0x82,0x70,0x83, + 0x92,0x7D,0x82,0x87,0x83,0x92,0x84,0x7A,0x8C,0x7E,0x73,0x78,0x7A,0x7A,0x6D,0x72, + 0x83,0x80,0x7C,0x89,0x90,0x8C,0x88,0x86,0x8D,0x84,0x7C,0x8B,0x8B,0x82,0x83,0x8E, + 0x93,0x7F,0x74,0x73,0x6C,0x68,0x6B,0x78,0x81,0x86,0x86,0x90,0x96,0x8E,0x94,0x95, + 0x8B,0x7E,0x78,0x73,0x69,0x6A,0x74,0x78,0x77,0x7D,0x88,0x8A,0x7F,0x7F,0x88,0x80, + 0x78,0x73,0x76,0x7F,0x7C,0x85,0x8F,0x98,0xA4,0x97,0x9E,0xAA,0x9A,0x8E,0x85,0x80, + 0x74,0x70,0x6D,0x6C,0x71,0x71,0x6C,0x6A,0x6A,0x70,0x73,0x69,0x77,0x85,0x82,0x7D, + 0x81,0x8A,0x83,0x82,0x8C,0x8A,0x8C,0x8A,0x82,0x88,0x84,0x6F,0x6F,0x78,0x77,0x73, + 0x7A,0x88,0x83,0x85,0x8F,0x88,0x85,0x7C,0x74,0x7C,0x7B,0x7A,0x7D,0x84,0x7E,0x78, + 0x7E,0x7D,0x89,0x8D,0x89,0x90,0x92,0x88,0x80,0x85,0x86,0x83,0x84,0x85,0x84,0x81, + 0x78,0x6D,0x6B,0x70,0x6C,0x6A,0x79,0x7C,0x85,0x89,0x8A,0x9B,0xA0,0x99,0x91,0x91, + 0x82,0x6E,0x71,0x73,0x73,0x78,0x76,0x82,0x7E,0x7B,0x85,0x82,0x82,0x78,0x74,0x78, + 0x77,0x6F,0x78,0x86,0x84,0x8B,0x8F,0x9C,0x9D,0x96,0x99,0x9C,0x94,0x87,0x86,0x7F, + 0x77,0x77,0x78,0x75,0x77,0x77,0x76,0x7A,0x76,0x6A,0x6D,0x70,0x6B,0x6B,0x72,0x79, + 0x76,0x77,0x87,0x86,0x81,0x8D,0x90,0x87,0x7A,0x82,0x88,0x7C,0x71,0x76,0x7E,0x75, + 0x7D,0x88,0x8F,0x93,0x82,0x89,0x8B,0x7D,0x73,0x7A,0x8F,0x82,0x82,0x92,0x84,0x81, + 0x7F,0x84,0x89,0x7B,0x7E,0x82,0x83,0x83,0x7C,0x7F,0x8C,0x7F,0x7C,0x88,0x76,0x75, + 0x77,0x73,0x77,0x73,0x72,0x73,0x79,0x7D,0x7F,0x8A,0x94,0x90,0x90,0x93,0x83,0x80, + 0x82,0x71,0x6E,0x73,0x7B,0x81,0x7C,0x82,0x87,0x8D,0x87,0x80,0x8B,0x7F,0x72,0x7C, + 0x81,0x7E,0x85,0x82,0x80,0x87,0x86,0x84,0x88,0x8E,0x8B,0x87,0x86,0x81,0x7A,0x80, + 0x83,0x79,0x7B,0x8A,0x83,0x79,0x81,0x81,0x7B,0x76,0x74,0x76,0x76,0x73,0x79,0x80, + 0x80,0x83,0x84,0x86,0x88,0x80,0x7C,0x7E,0x70,0x72,0x7E,0x73,0x72,0x71,0x7B,0x8B, + 0x7B,0x7B,0x91,0x8A,0x7D,0x7E,0x89,0x8C,0x81,0x7D,0x84,0x84,0x7B,0x77,0x88,0x8D, + 0x87,0x8B,0x88,0x8C,0x82,0x76,0x83,0x85,0x82,0x83,0x82,0x81,0x81,0x81,0x7B,0x77, + 0x76,0x72,0x78,0x79,0x77,0x82,0x89,0x72,0x70,0x8A,0x83,0x6F,0x76,0x87,0x8D,0x91, + 0x8F,0x8C,0x88,0x80,0x89,0x97,0x93,0x91,0x91,0x91,0x8B,0x85,0x7E,0x77,0x70,0x64, + 0x65,0x69,0x67,0x61,0x68,0x79,0x7C,0x7B,0x75,0x77,0x77,0x6D,0x6E,0x76,0x7A,0x7E, + 0x82,0x8B,0x93,0x87,0x8D,0x9A,0x8E,0xA0,0xB4,0xAE,0x9D,0x9F,0xAC,0x90,0x8D,0x93, + 0x85,0x89,0x89,0x8B,0x86,0x7F,0x79,0x78,0x79,0x69,0x5E,0x62,0x5F,0x5D,0x6A,0x68, + 0x69,0x5A,0x49,0x50,0x51,0x4D,0x4C,0x59,0x5D,0x61,0x67,0x76,0x81,0x73,0x7A,0x8A, + 0x8E,0x92,0x94,0x94,0x99,0x95,0x8F,0xA2,0xAE,0xB5,0xBC,0xC2,0xC9,0xC7,0xC9,0xC5, + 0xC0,0xBA,0xA7,0x95,0x8D,0x92,0x93,0x90,0x98,0x93,0x88,0x80,0x74,0x70,0x69,0x60, + 0x57,0x57,0x5B,0x4A,0x43,0x4B,0x47,0x43,0x42,0x4A,0x52,0x4F,0x51,0x55,0x5F,0x64, + 0x69,0x78,0x80,0x7F,0x80,0x8D,0x8F,0x8E,0x90,0x8A,0x92,0x90,0x8E,0x96,0x86,0x7F, + 0x86,0x8C,0x8E,0x8A,0x84,0x76,0x75,0x79,0x75,0x70,0x69,0x69,0x6A,0x73,0x75,0x71, + 0x72,0x71,0x74,0x73,0x78,0x7B,0x83,0x8C,0x8C,0x89,0x7F,0x7D,0x87,0x89,0x8A,0x8B, + 0x8C,0x8C,0x86,0x83,0x86,0x85,0x82,0x82,0x8A,0x8E,0x86,0x89,0x8F,0x91,0x96,0x95, + 0xA0,0xA2,0x9F,0xAA,0xA9,0xAB,0xB3,0xB3,0xB6,0xBA,0xB5,0xAF,0xAF,0xAA,0xA2,0x9D, + 0x9D,0x9A,0x92,0x90,0x8A,0x82,0x7D,0x77,0x73,0x6E,0x65,0x61,0x64,0x5E,0x5A,0x5B, + 0x58,0x54,0x52,0x51,0x4F,0x49,0x46,0x4D,0x51,0x4F,0x55,0x5B,0x62,0x69,0x6C,0x79, + 0x7E,0x7E,0x84,0x89,0x8C,0x8C,0x8C,0x8D,0x91,0x94,0x95,0x9A,0x9D,0x9E,0xA2,0xA1, + 0x9C,0x9D,0x9C,0x9B,0x98,0x93,0x93,0x92,0x92,0x91,0x90,0x8E,0x8B,0x87,0x83,0x81, + 0x7C,0x75,0x74,0x70,0x64,0x61,0x5E,0x5A,0x57,0x50,0x4E,0x4B,0x46,0x46,0x47,0x44, + 0x40,0x40,0x41,0x3E,0x3E,0x42,0x42,0x43,0x46,0x48,0x4A,0x4F,0x56,0x59,0x5E,0x64, + 0x69,0x72,0x78,0x7E,0x85,0x8E,0x95,0x97,0xA1,0xB1,0xB5,0xB7,0xC0,0xCC,0xD1,0xCF, + 0xCF,0xD1,0xD6,0xD2,0xD0,0xD2,0xC7,0xC0,0xC2,0xC3,0xBE,0xB7,0xB3,0xB5,0xB6,0xB1, + 0xAA,0xA9,0xA4,0x9C,0x97,0x92,0x8A,0x86,0x8C,0x8B,0x82,0x7E,0x7F,0x7E,0x7A,0x6D, + 0x64,0x66,0x64,0x64,0x66,0x68,0x6F,0x79,0x7B,0x74,0x75,0x7A,0x75,0x6E,0x69,0x6D, + 0x71,0x6E,0x6C,0x6B,0x6B,0x74,0x79,0x71,0x70,0x73,0x70,0x6F,0x6E,0x6A,0x6F,0x75, + 0x76,0x7B,0x82,0x88,0x90,0x8A,0x85,0x92,0x93,0x8B,0x90,0x98,0x9A,0x98,0x95,0x97, + 0xA2,0xA9,0xA1,0x9D,0x9E,0x99,0x93,0x88,0x7D,0x83,0x8A,0x83,0x7E,0x80,0x81,0x7F, + 0x6D,0x5F,0x67,0x66,0x5D,0x5D,0x60,0x5E,0x53,0x49,0x4D,0x5C,0x59,0x48,0x46,0x4B, + 0x46,0x3E,0x36,0x39,0x46,0x48,0x44,0x4D,0x56,0x58,0x57,0x4E,0x53,0x61,0x5E,0x5D, + 0x66,0x6C,0x69,0x64,0x67,0x75,0x85,0x82,0x7E,0x8C,0x95,0x92,0x8F,0x94,0xA2,0xB1, + 0xB2,0xBA,0xC9,0xD0,0xD0,0xC7,0xC2,0xCB,0xCB,0xC1,0xC5,0xCA,0xC3,0xB8,0xAE,0xAC, + 0xBB,0xBB,0xA6,0xA5,0xAB,0x9D,0x8B,0x80,0x83,0x8D,0x83,0x7A,0x84,0x87,0x7F,0x74, + 0x6E,0x77,0x7C,0x74,0x77,0x82,0x81,0x78,0x76,0x76,0x82,0x91,0x85,0x80,0x8C,0x88, + 0x7C,0x75,0x76,0x82,0x86,0x7C,0x7F,0x87,0x84,0x7C,0x75,0x76,0x7C,0x74,0x71,0x7E, + 0x80,0x77,0x75,0x73,0x7A,0x8B,0x85,0x7C,0x86,0x85,0x75,0x6E,0x6B,0x71,0x79,0x71, + 0x72,0x7F,0x7D,0x77,0x74,0x72,0x79,0x79,0x75,0x7F,0x84,0x7C,0x74,0x70,0x6E,0x7B, + 0x83,0x76,0x7A,0x7F,0x70,0x66,0x63,0x64,0x6E,0x6D,0x6A,0x73,0x77,0x6D,0x69,0x67, + 0x67,0x6C,0x6D,0x71,0x7A,0x75,0x6B,0x6B,0x6B,0x75,0x86,0x7F,0x7A,0x85,0x7E,0x73, + 0x72,0x73,0x7C,0x7F,0x7A,0x81,0x89,0x81,0x79,0x78,0x78,0x7C,0x7D,0x81,0x8C,0x8B, + 0x81,0x80,0x80,0x82,0x94,0x9F,0x96,0x9D,0xA2,0x95,0x8B,0x87,0x8A,0x92,0x90,0x8E, + 0x97,0x94,0x86,0x7F,0x7C,0x7B,0x7B,0x7B,0x81,0x85,0x79,0x6E,0x6D,0x6B,0x76,0x88, + 0x82,0x81,0x8B,0x81,0x77,0x76,0x78,0x80,0x84,0x82,0x8A,0x91,0x86,0x80,0x82,0x80, + 0x83,0x88,0x8D,0x93,0x90,0x87,0x85,0x83,0x83,0x98,0x9E,0x93,0x9B,0x9B,0x8E,0x89, + 0x87,0x8D,0x96,0x95,0x99,0xA4,0xA0,0x96,0x96,0x95,0x94,0x99,0x9D,0xA4,0xA5,0x9B, + 0x94,0x91,0x8D,0x93,0xA3,0x9F,0x97,0x9B,0x93,0x83,0x7C,0x7B,0x7D,0x7D,0x7A,0x7B, + 0x7B,0x71,0x66,0x63,0x5F,0x5F,0x62,0x64,0x66,0x62,0x57,0x52,0x4E,0x4D,0x5E,0x63, + 0x58,0x5F,0x60,0x4F,0x45,0x43,0x47,0x4A,0x49,0x4C,0x55,0x50,0x45,0x48,0x49,0x47, + 0x4B,0x50,0x59,0x5D,0x59,0x56,0x56,0x54,0x5D,0x72,0x6F,0x6D,0x7B,0x77,0x6C,0x6B, + 0x72,0x7E,0x82,0x85,0x93,0x9B,0x92,0x8F,0x95,0x95,0x99,0xA2,0xAB,0xB3,0xB2,0xAC, + 0xA8,0xA3,0xA1,0xAD,0xBB,0xAF,0xAD,0xB5,0xA6,0x97,0x92,0x94,0x98,0x96,0x94,0x9D, + 0x9D,0x8F,0x8C,0x8E,0x8B,0x8B,0x8F,0x94,0x98,0x98,0x92,0x8E,0x8C,0x8D,0x9F,0xA9, + 0x9C,0xA3,0xAB,0x9C,0x91,0x93,0x99,0x9E,0x9B,0x9D,0xA9,0xA5,0x97,0x96,0x96,0x8E, + 0x8F,0x94,0x98,0x9A,0x97,0x90,0x8A,0x84,0x84,0x98,0x9E,0x90,0x97,0x9B,0x89,0x7F, + 0x7F,0x84,0x86,0x81,0x84,0x8E,0x85,0x77,0x78,0x74,0x6B,0x6B,0x70,0x72,0x71,0x6D, + 0x66,0x5C,0x56,0x56,0x64,0x66,0x59,0x60,0x62,0x4E,0x42,0x44,0x47,0x48,0x45,0x4C, + 0x54,0x4B,0x40,0x44,0x42,0x3B,0x40,0x47,0x4D,0x4C,0x49,0x47,0x43,0x3E,0x42,0x58, + 0x5E,0x53,0x5C,0x64,0x56,0x4F,0x55,0x5F,0x63,0x62,0x6B,0x78,0x71,0x6B,0x74,0x77, + 0x77,0x7D,0x87,0x91,0x95,0x95,0x98,0x98,0x98,0x97,0xAE,0xC1,0xB2,0xB8,0xC6,0xBB, + 0xB0,0xB5,0xBE,0xC4,0xC3,0xC4,0xD0,0xC9,0xB8,0xBD,0xBF,0xB6,0xB6,0xBB,0xBC,0xBA, + 0xB1,0xAC,0xA5,0x9E,0x97,0xA0,0xB4,0xA5,0x99,0xA5,0x9B,0x87,0x87,0x8D,0x92,0x91, + 0x90,0x99,0x9A,0x88,0x86,0x8C,0x84,0x84,0x8C,0x90,0x92,0x8D,0x8A,0x87,0x81,0x7B, + 0x7E,0x96,0x96,0x83,0x8E,0x8F,0x79,0x70,0x78,0x7E,0x7E,0x7B,0x82,0x8A,0x7B,0x71, + 0x7B,0x77,0x6F,0x75,0x7D,0x7E,0x7A,0x78,0x76,0x6F,0x6D,0x69,0x78,0x8A,0x77,0x75, + 0x80,0x70,0x5E,0x60,0x66,0x67,0x62,0x61,0x6B,0x63,0x50,0x52,0x55,0x49,0x47,0x50, + 0x52,0x52,0x4E,0x4C,0x49,0x44,0x40,0x44,0x5D,0x5E,0x4C,0x58,0x5B,0x46,0x41,0x4A, + 0x52,0x57,0x56,0x60,0x6D,0x5F,0x58,0x65,0x63,0x5F,0x69,0x73,0x78,0x79,0x78,0x79, + 0x77,0x77,0x75,0x82,0x9E,0x95,0x8E,0xA0,0x98,0x88,0x8B,0x96,0x9F,0xA2,0xA3,0xB2, + 0xB7,0xA8,0xAA,0xB5,0xB0,0xB1,0xBD,0xC2,0xC7,0xC5,0xBF,0xBD,0xB6,0xB2,0xAA,0xB6, + 0xC9,0xB6,0xAB,0xB5,0xA5,0x90,0x8F,0x93,0x96,0x93,0x8F,0x98,0x93,0x7F,0x7E,0x82, + 0x7A,0x79,0x80,0x83,0x84,0x7E,0x7B,0x79,0x74,0x73,0x6F,0x82,0x95,0x82,0x7F,0x8D, + 0x7E,0x6E,0x73,0x7C,0x84,0x83,0x81,0x8D,0x8A,0x77,0x7C,0x82,0x7B,0x7B,0x82,0x87, + 0x87,0x81,0x7F,0x7F,0x7C,0x7A,0x77,0x8D,0x9B,0x85,0x83,0x8E,0x7B,0x6D,0x73,0x7A, + 0x80,0x7D,0x7B,0x83,0x7C,0x6C,0x6F,0x74,0x6E,0x6D,0x73,0x78,0x77,0x6E,0x6B,0x6A, + 0x65,0x61,0x5C,0x70,0x7D,0x65,0x63,0x6D,0x5A,0x4E,0x54,0x5A,0x61,0x5C,0x57,0x62, + 0x5C,0x4D,0x51,0x57,0x52,0x54,0x59,0x5F,0x61,0x5C,0x5D,0x61,0x5F,0x5D,0x5B,0x73, + 0x82,0x6B,0x6B,0x7B,0x6D,0x63,0x6A,0x75,0x81,0x7C,0x7A,0x8D,0x8C,0x7D,0x83,0x8C, + 0x8C,0x8D,0x93,0x9C,0xA0,0x9B,0x9D,0xA0,0x9E,0x9E,0x9C,0xB4,0xC3,0xAB,0xAA,0xB5, + 0xA5,0x9A,0x9C,0xA3,0xAB,0xA0,0x98,0xA2,0x9B,0x86,0x86,0x8C,0x87,0x83,0x83,0x87, + 0x86,0x7A,0x77,0x79,0x78,0x72,0x6F,0x8B,0x93,0x7A,0x7D,0x85,0x77,0x71,0x73,0x7D, + 0x8A,0x81,0x7C,0x89,0x84,0x78,0x7B,0x82,0x84,0x83,0x84,0x8B,0x8D,0x86,0x86,0x89, + 0x88,0x83,0x83,0x9F,0xA7,0x8E,0x92,0x9A,0x8D,0x88,0x89,0x94,0x9F,0x96,0x90,0x99, + 0x94,0x87,0x87,0x8B,0x8D,0x8B,0x89,0x8C,0x8D,0x84,0x81,0x7F,0x7F,0x79,0x75,0x8C, + 0x91,0x78,0x79,0x7B,0x6D,0x68,0x67,0x6F,0x78,0x6D,0x66,0x6C,0x69,0x5E,0x5D,0x5F, + 0x61,0x61,0x5F,0x62,0x64,0x60,0x5C,0x5B,0x5F,0x5A,0x57,0x71,0x77,0x64,0x67,0x69, + 0x62,0x60,0x5E,0x6B,0x77,0x6F,0x6B,0x74,0x73,0x6F,0x70,0x74,0x7E,0x83,0x81,0x87, + 0x8D,0x8B,0x88,0x89,0x90,0x8E,0x91,0xAF,0xB0,0x9E,0xA3,0xA3,0x9C,0x9D,0x9B,0xA6, + 0xB2,0xA7,0xA1,0xA5,0x9F,0x98,0x95,0x95,0x98,0x96,0x92,0x90,0x8F,0x86,0x7E,0x7B, + 0x7C,0x73,0x78,0x90,0x86,0x74,0x77,0x72,0x6E,0x6B,0x6B,0x79,0x80,0x75,0x72,0x74, + 0x72,0x70,0x6E,0x72,0x7B,0x7E,0x7C,0x7E,0x7F,0x7D,0x7A,0x7A,0x7D,0x79,0x88,0xA0, + 0x93,0x88,0x8D,0x84,0x83,0x83,0x85,0x95,0x9C,0x92,0x8D,0x8E,0x8F,0x8D,0x8B,0x8D, + 0x97,0x9A,0x93,0x93,0x95,0x93,0x8D,0x8A,0x8A,0x86,0x96,0xA5,0x93,0x89,0x87,0x7E, + 0x7D,0x78,0x78,0x86,0x88,0x7B,0x71,0x71,0x72,0x6F,0x6A,0x6A,0x73,0x74,0x6D,0x68, + 0x68,0x67,0x61,0x5E,0x5E,0x5C,0x70,0x7E,0x6C,0x62,0x60,0x5C,0x5F,0x5B,0x5D,0x6D, + 0x72,0x68,0x60,0x5F,0x64,0x67,0x63,0x63,0x6D,0x73,0x70,0x6D,0x6F,0x74,0x73,0x74, + 0x73,0x74,0x8D,0x9C,0x8D,0x85,0x87,0x8A,0x8E,0x8A,0x8E,0x9E,0xA6,0xA1,0x9A,0x99, + 0xA0,0xA3,0xA0,0x9E,0xA2,0xA7,0xA5,0x9E,0x9B,0x9A,0x96,0x94,0x8C,0x8A,0xA0,0xA9, + 0x98,0x8C,0x84,0x83,0x86,0x7E,0x79,0x80,0x85,0x80,0x75,0x6E,0x71,0x76,0x73,0x6E, + 0x70,0x78,0x7B,0x77,0x72,0x72,0x73,0x75,0x70,0x72,0x89,0x93,0x89,0x7E,0x74,0x76, + 0x7F,0x7E,0x7D,0x85,0x8B,0x8D,0x87,0x7C,0x7B,0x82,0x83,0x82,0x83,0x87,0x8A,0x8A, + 0x85,0x81,0x81,0x83,0x7F,0x86,0x99,0x9D,0x97,0x8B,0x7F,0x7F,0x85,0x84,0x87,0x8B, + 0x8C,0x8E,0x8A,0x81,0x80,0x81,0x84,0x85,0x84,0x84,0x84,0x84,0x80,0x78,0x74,0x72, + 0x6F,0x7A,0x8A,0x88,0x7F,0x75,0x69,0x6C,0x70,0x6B,0x6E,0x72,0x74,0x78,0x76,0x6F, + 0x6E,0x6F,0x71,0x75,0x76,0x77,0x79,0x7A,0x7A,0x77,0x73,0x72,0x72,0x81,0x8F,0x8B, + 0x86,0x7F,0x78,0x7C,0x7F,0x7B,0x7B,0x7D,0x7E,0x82,0x83,0x80,0x81,0x7F,0x7F,0x84, + 0x84,0x83,0x83,0x84,0x85,0x85,0x86,0x85,0x82,0x8A,0x93,0x91,0x8F,0x8B,0x84,0x86, + 0x89,0x83,0x83,0x81,0x7E,0x81,0x81,0x7F,0x7F,0x7D,0x7C,0x7E,0x7E,0x7C,0x7A,0x79, + 0x78,0x78,0x79,0x78,0x76,0x75,0x79,0x7D,0x79,0x7A,0x7A,0x77,0x7D,0x7E,0x7A,0x7E, + 0x7D,0x7A,0x7E,0x7E,0x7D,0x7E,0x7D,0x7E,0x82,0x82,0x81,0x82,0x83,0x83,0x83,0x83, + 0x83,0x82,0x87,0x8C,0x88,0x88,0x89,0x85,0x8A,0x8D,0x88,0x89,0x87,0x84,0x87,0x86, + 0x82,0x83,0x82,0x82,0x85,0x86,0x85,0x85,0x85,0x86,0x87,0x87,0x86,0x85,0x84,0x8A, + 0x8C,0x85,0x86,0x86,0x83,0x89,0x89,0x84,0x85,0x81,0x7C,0x7E,0x7A,0x77,0x79,0x77, + 0x76,0x79,0x79,0x77,0x78,0x78,0x7A,0x7C,0x7D,0x7D,0x7B,0x7B,0x82,0x82,0x7C,0x7F, + 0x7F,0x7E,0x85,0x83,0x7F,0x7E,0x7A,0x79,0x86,0x83,0x60,0x67,0x7E,0x86,0x75,0x77, + 0x92,0x70,0x70,0x86,0x82,0x81,0x88,0x95,0x80,0x80,0x90,0x8D,0x86,0x80,0x8C,0x8B, + 0x7E,0x76,0x7F,0x83,0x7F,0x82,0x84,0x7C,0x6E,0x72,0x71,0x72,0x74,0x7A,0x7B,0x77, + 0x82,0x80,0x81,0x86,0x89,0x87,0x82,0x89,0x86,0x82,0x86,0x7D,0x7F,0x81,0x7A,0x79, + 0x7A,0x78,0x74,0x74,0x72,0x6F,0x74,0x72,0x6D,0x70,0x71,0x6E,0x70,0x75,0x7A,0x87, + 0x8D,0x81,0x7F,0x85,0x8F,0x92,0x8C,0x91,0x8E,0x88,0x90,0x90,0x88,0x8B,0x89,0x81, + 0x85,0x84,0x81,0x82,0x81,0x7C,0x74,0x77,0x80,0x7B,0x77,0x80,0x81,0x7D,0x7F,0x82, + 0x83,0x7F,0x80,0x87,0x85,0x80,0x80,0x7E,0x89,0x90,0x87,0x87,0x85,0x7B,0x7F,0x87, + 0x83,0x80,0x7E,0x7B,0x80,0x85,0x83,0x81,0x83,0x82,0x7F,0x7D,0x7F,0x7E,0x7E,0x7F, + 0x7F,0x84,0x7D,0x80,0x87,0x7F,0x81,0x85,0x81,0x7D,0x81,0x7D,0x78,0x7F,0x79,0x78, + 0x7A,0x79,0x7C,0x79,0x7E,0x81,0x7C,0x84,0x84,0x88,0x8B,0x89,0x8A,0x87,0x84,0x88, + 0x8F,0x81,0x7E,0x8B,0x84,0x81,0x86,0x7F,0x81,0x83,0x7D,0x7C,0x79,0x76,0x78,0x7C, + 0x7A,0x77,0x76,0x77,0x7C,0x78,0x7B,0x82,0x88,0x88,0x83,0x85,0x86,0x84,0x82,0x86, + 0x86,0x84,0x7F,0x7E,0x8A,0x87,0x7B,0x7D,0x78,0x78,0x76,0x71,0x71,0x6E,0x73,0x75, + 0x7A,0x77,0x79,0x7F,0x7B,0x7E,0x81,0x85,0x85,0x85,0x87,0x86,0x86,0x8F,0x91,0x8C, + 0x8F,0x87,0x84,0x88,0x82,0x7D,0x81,0x83,0x7C,0x7E,0x7F,0x79,0x7B,0x79,0x7B,0x80, + 0x7E,0x7D,0x7D,0x83,0x81,0x83,0x88,0x84,0x8A,0x88,0x82,0x85,0x8A,0x8C,0x8B,0x87, + 0x83,0x80,0x82,0x85,0x7C,0x7C,0x7C,0x76,0x79,0x7C,0x80,0x7C,0x7C,0x79,0x75,0x7A, + 0x7B,0x7A,0x7E,0x7F,0x83,0x85,0x82,0x88,0x86,0x87,0x86,0x81,0x86,0x81,0x7E,0x80, + 0x83,0x89,0x8A,0x7F,0x7C,0x7B,0x75,0x78,0x7B,0x79,0x7C,0x7F,0x78,0x7C,0x81,0x80, + 0x81,0x82,0x81,0x86,0x87,0x88,0x88,0x83,0x83,0x80,0x7E,0x86,0x91,0x8B,0x89,0x85, + 0x7C,0x82,0x81,0x82,0x7F,0x73,0x71,0x76,0x7A,0x7F,0x82,0x79,0x77,0x7B,0x7B,0x7D, + 0x7F,0x7E,0x80,0x88,0x83,0x7F,0x82,0x80,0x7E,0x78,0x78,0x84,0x8D,0x90,0x8B,0x7E, + 0x7A,0x80,0x7D,0x76,0x75,0x6B,0x6D,0x7F,0x83,0x85,0x85,0x7E,0x7E,0x86,0x82,0x7F, + 0x7D,0x7B,0x7D,0x81,0x84,0x81,0x84,0x82,0x7F,0x7A,0x77,0x8A,0x9D,0x98,0x8E,0x80, + 0x75,0x7F,0x7D,0x7A,0x7B,0x76,0x78,0x86,0x8D,0x87,0x88,0x85,0x82,0x85,0x84,0x82, + 0x84,0x80,0x81,0x88,0x85,0x81,0x7E,0x7F,0x7E,0x78,0x75,0x82,0x8F,0x90,0x8D,0x7D, + 0x72,0x7E,0x7A,0x73,0x79,0x72,0x76,0x88,0x89,0x81,0x80,0x7F,0x82,0x8A,0x84,0x7D, + 0x79,0x7C,0x81,0x81,0x82,0x82,0x84,0x7D,0x7B,0x75,0x71,0x8B,0x8F,0x88,0x85,0x74, + 0x77,0x7C,0x76,0x73,0x71,0x75,0x7B,0x86,0x85,0x80,0x83,0x82,0x88,0x87,0x81,0x7E, + 0x81,0x86,0x82,0x84,0x83,0x83,0x88,0x82,0x7E,0x7C,0x7C,0x93,0x8E,0x80,0x87,0x78, + 0x7C,0x87,0x79,0x75,0x77,0x76,0x7B,0x7D,0x7C,0x73,0x75,0x82,0x84,0x81,0x7B,0x78, + 0x7D,0x7F,0x7A,0x7F,0x83,0x83,0x86,0x80,0x7D,0x74,0x78,0x94,0x90,0x81,0x85,0x7E, + 0x83,0x86,0x74,0x73,0x74,0x76,0x7E,0x7D,0x7A,0x78,0x80,0x8A,0x83,0x7C,0x7F,0x7E, + 0x82,0x83,0x7D,0x81,0x86,0x81,0x82,0x81,0x7A,0x78,0x8C,0x9A,0x88,0x87,0x88,0x84, + 0x8C,0x81,0x77,0x79,0x76,0x7C,0x7F,0x7C,0x7F,0x7E,0x89,0x8E,0x7F,0x82,0x81,0x7B, + 0x80,0x76,0x7A,0x87,0x82,0x84,0x82,0x7D,0x7B,0x82,0x97,0x8C,0x82,0x86,0x7D,0x84, + 0x81,0x70,0x78,0x7A,0x77,0x80,0x7A,0x7A,0x7F,0x82,0x87,0x85,0x81,0x83,0x82,0x81, + 0x7C,0x78,0x80,0x7F,0x7F,0x7D,0x79,0x77,0x7E,0x91,0x89,0x80,0x87,0x7D,0x85,0x88, + 0x70,0x76,0x78,0x78,0x83,0x79,0x78,0x81,0x82,0x86,0x87,0x80,0x83,0x86,0x84,0x7F, + 0x7C,0x84,0x82,0x81,0x7E,0x79,0x78,0x81,0x93,0x8D,0x84,0x86,0x7F,0x84,0x81,0x6F, + 0x7A,0x7C,0x73,0x7E,0x74,0x71,0x82,0x7F,0x80,0x84,0x7F,0x86,0x84,0x81,0x80,0x7B, + 0x80,0x80,0x7E,0x7D,0x7D,0x79,0x86,0x8D,0x81,0x87,0x88,0x7E,0x88,0x86,0x78,0x7F, + 0x78,0x77,0x7F,0x78,0x7A,0x7E,0x7C,0x83,0x81,0x7C,0x87,0x85,0x7E,0x84,0x84,0x81, + 0x7F,0x7D,0x80,0x7A,0x74,0x87,0x8B,0x84,0x89,0x84,0x80,0x8D,0x84,0x7A,0x85,0x79, + 0x7B,0x7E,0x71,0x7B,0x7D,0x7A,0x85,0x80,0x7D,0x8C,0x84,0x81,0x86,0x7F,0x7E,0x7E, + 0x7C,0x7F,0x7A,0x7B,0x8B,0x87,0x84,0x87,0x7F,0x85,0x8D,0x82,0x7F,0x83,0x78,0x7F, + 0x7A,0x71,0x7C,0x7D,0x7C,0x82,0x7D,0x80,0x89,0x83,0x87,0x85,0x83,0x86,0x7E,0x7D, + 0x7E,0x75,0x79,0x88,0x7F,0x81,0x89,0x83,0x8B,0x89,0x7F,0x80,0x7E,0x7A,0x7F,0x76, + 0x75,0x7D,0x77,0x7E,0x80,0x7D,0x86,0x85,0x82,0x85,0x81,0x83,0x81,0x79,0x7C,0x7B, + 0x78,0x82,0x87,0x82,0x87,0x86,0x85,0x8A,0x7F,0x7E,0x83,0x7B,0x7F,0x79,0x70,0x7B, + 0x76,0x75,0x7C,0x7C,0x80,0x85,0x84,0x86,0x89,0x85,0x86,0x80,0x7F,0x7C,0x78,0x83, + 0x84,0x80,0x88,0x85,0x82,0x8F,0x86,0x81,0x89,0x80,0x7F,0x80,0x76,0x7C,0x7E,0x7B, + 0x7F,0x7D,0x82,0x87,0x86,0x87,0x89,0x85,0x85,0x82,0x7B,0x7B,0x76,0x7F,0x86,0x7E, + 0x85,0x85,0x82,0x8A,0x81,0x7F,0x85,0x7B,0x7B,0x80,0x76,0x7D,0x7F,0x7A,0x7F,0x7E, + 0x7F,0x83,0x81,0x87,0x88,0x86,0x88,0x82,0x7D,0x80,0x7A,0x7D,0x83,0x7F,0x82,0x82, + 0x82,0x86,0x82,0x80,0x85,0x7F,0x7D,0x7F,0x77,0x7A,0x7E,0x7B,0x7E,0x7E,0x80,0x85, + 0x81,0x84,0x89,0x83,0x86,0x85,0x81,0x82,0x7E,0x84,0x85,0x80,0x86,0x83,0x7D,0x85, + 0x81,0x7F,0x82,0x7B,0x7E,0x7E,0x78,0x7D,0x7B,0x7A,0x7B,0x78,0x84,0x87,0x8E,0x90, + 0x90,0x91,0x81,0x80,0x78,0x77,0x78,0x7B,0x83,0x70,0x7E,0x72,0x63,0x8D,0x85,0x72, + 0x8C,0x83,0x7A,0x6C,0x62,0x7B,0x73,0x73,0x79,0x71,0x7F,0x7D,0x78,0x80,0x7E,0x84, + 0x8C,0x84,0x7B,0x73,0x7C,0x88,0x7E,0x7E,0x80,0x77,0x81,0x88,0x82,0x83,0x84,0x93, + 0x91,0x84,0x8F,0x84,0x7C,0x90,0x94,0x92,0xA0,0xA2,0x99,0x9B,0xA3,0xA2,0x8E,0x87, + 0x90,0x90,0x96,0x9D,0x91,0x8C,0x8C,0x86,0x84,0x75,0x72,0x7C,0x7B,0x78,0x6F,0x69, + 0x6D,0x68,0x64,0x69,0x69,0x68,0x68,0x65,0x66,0x65,0x63,0x68,0x6A,0x6C,0x6A,0x68, + 0x6F,0x6F,0x6F,0x6A,0x62,0x68,0x6C,0x6B,0x69,0x62,0x67,0x69,0x66,0x6C,0x6C,0x70, + 0x76,0x75,0x77,0x7B,0x80,0x8A,0x97,0xA8,0xB2,0xAA,0x9F,0x9C,0x9B,0x9C,0x9A,0x99, + 0x98,0x94,0x8F,0x8C,0x8D,0x8F,0x8C,0x87,0x85,0x87,0x8C,0x8A,0x83,0x84,0x85,0x83, + 0x82,0x82,0x87,0x8C,0x89,0x86,0x85,0x83,0x84,0x8A,0x8C,0x87,0x8A,0x88,0x86,0x87, + 0x82,0x7F,0x84,0x7F,0x7A,0x7F,0x79,0x79,0x7C,0x7B,0x7D,0x82,0x86,0x8B,0x8C,0x8C, + 0x8E,0x90,0x90,0x91,0x92,0x8E,0x95,0x92,0x94,0x96,0x90,0x90,0x8F,0x8D,0x8A,0x8B, + 0x88,0x83,0x7C,0x71,0x73,0x70,0x65,0x67,0x69,0x69,0x6C,0x65,0x67,0x6B,0x63,0x5F, + 0x60,0x55,0x56,0x6A,0x62,0x5D,0x63,0x61,0x68,0x61,0x55,0x62,0x66,0x5F,0x5B,0x55, + 0x62,0x67,0x5B,0x5F,0x67,0x67,0x65,0x62,0x6B,0x6F,0x65,0x6A,0x69,0x6F,0x6D,0x81, + 0x9C,0x91,0x9D,0xA7,0xAB,0xAA,0x8F,0x98,0xA9,0x98,0x9C,0xA1,0xA4,0xAD,0x96,0x8E, + 0x98,0x8F,0x89,0x88,0x92,0x9A,0x92,0x8D,0x88,0x7B,0x83,0xA0,0x98,0x8E,0xA0,0x98, + 0x92,0x7E,0x75,0x8F,0x88,0x84,0x91,0x95,0x9E,0x8F,0x7D,0x8E,0x8B,0x7E,0x82,0x86, + 0x92,0x86,0x7F,0x84,0x80,0x86,0x7B,0x8F,0xAD,0x94,0x91,0x9C,0x92,0x92,0x84,0x8B, + 0xA4,0x94,0x91,0x9B,0x99,0x98,0x86,0x83,0x94,0x8B,0x8A,0x93,0x90,0x8C,0x7E,0x74, + 0x76,0x6A,0x6F,0x8C,0x7E,0x7A,0x80,0x6F,0x6A,0x58,0x5A,0x6E,0x62,0x5E,0x69,0x66, + 0x60,0x50,0x50,0x5C,0x57,0x5B,0x65,0x6C,0x68,0x5C,0x59,0x5A,0x5C,0x62,0x59,0x73, + 0x7C,0x5D,0x67,0x66,0x5C,0x5F,0x5B,0x70,0x7C,0x6C,0x77,0x7E,0x75,0x7C,0x7D,0x90, + 0x9C,0x9B,0xAA,0xAF,0xA5,0xA0,0x97,0x9A,0x9C,0x8E,0xAA,0xB0,0x96,0xA1,0x99,0x8E, + 0x88,0x7C,0x93,0x97,0x84,0x93,0x93,0x89,0x82,0x7C,0x8C,0x8B,0x87,0x90,0x93,0x8E, + 0x84,0x80,0x84,0x80,0x8A,0x84,0x89,0xA1,0x84,0x80,0x8B,0x7A,0x7B,0x78,0x80,0x93, + 0x85,0x84,0x94,0x8A,0x84,0x87,0x8C,0x93,0x8F,0x97,0x9E,0x92,0x8F,0x8C,0x88,0x8F, + 0x83,0x93,0xA9,0x90,0x93,0x97,0x87,0x81,0x78,0x86,0x91,0x7B,0x83,0x8B,0x77,0x71, + 0x6D,0x71,0x75,0x6D,0x73,0x7A,0x6F,0x68,0x62,0x5E,0x58,0x5D,0x5B,0x5F,0x79,0x62, + 0x5D,0x69,0x58,0x55,0x54,0x5A,0x6B,0x62,0x61,0x71,0x63,0x5A,0x5C,0x5C,0x5E,0x5D, + 0x65,0x70,0x69,0x66,0x66,0x64,0x67,0x62,0x82,0x92,0x7E,0x94,0x9F,0x8E,0x8E,0x8E, + 0x9E,0xA6,0x9A,0xAC,0xAE,0x9B,0x99,0x97,0x94,0x90,0x8C,0x9B,0x9D,0x92,0x91,0x8C, + 0x85,0x7E,0x84,0x81,0x92,0x9F,0x89,0x95,0x92,0x7E,0x7E,0x7C,0x85,0x8B,0x85,0x92, + 0x93,0x85,0x88,0x84,0x82,0x83,0x83,0x8B,0x8A,0x84,0x8B,0x81,0x7D,0x7B,0x84,0xA3, + 0x89,0x8D,0xA8,0x90,0x84,0x87,0x89,0x8C,0x86,0x8D,0x9F,0x90,0x8B,0x93,0x8A,0x87, + 0x86,0x8C,0x96,0x8D,0x8D,0x91,0x84,0x7D,0x7E,0x7A,0x77,0x8D,0x87,0x79,0x89,0x78, + 0x6A,0x6C,0x66,0x6C,0x68,0x64,0x74,0x6B,0x5E,0x67,0x61,0x5C,0x5C,0x60,0x67,0x62, + 0x66,0x6B,0x5D,0x5C,0x59,0x5F,0x77,0x5F,0x64,0x7A,0x63,0x5C,0x65,0x63,0x62,0x62, + 0x6B,0x78,0x6D,0x71,0x7E,0x74,0x75,0x80,0x85,0x8A,0x90,0x98,0x9B,0x95,0x95,0x9A, + 0x93,0x96,0xB0,0xA1,0x9A,0xAE,0x97,0x8D,0x8C,0x86,0x8C,0x84,0x85,0x97,0x8B,0x81, + 0x8D,0x84,0x7F,0x81,0x84,0x88,0x84,0x86,0x89,0x7C,0x7C,0x7C,0x7A,0x97,0x88,0x82, + 0x9C,0x86,0x79,0x83,0x7D,0x7D,0x7D,0x80,0x90,0x89,0x82,0x90,0x89,0x80,0x89,0x8B, + 0x8B,0x8F,0x93,0x94,0x8D,0x88,0x8D,0x87,0x86,0xA3,0x96,0x8D,0xA4,0x8F,0x83,0x88, + 0x84,0x85,0x80,0x83,0x91,0x85,0x7D,0x88,0x7E,0x73,0x78,0x78,0x75,0x73,0x71,0x74, + 0x6B,0x61,0x66,0x5D,0x70,0x75,0x60,0x76,0x73,0x59,0x62,0x63,0x5D,0x5F,0x5D,0x6D, + 0x6D,0x5F,0x69,0x6A,0x5D,0x60,0x65,0x63,0x65,0x6A,0x6E,0x6A,0x67,0x6A,0x68,0x67, + 0x84,0x85,0x76,0x92,0x8E,0x7D,0x88,0x8B,0x8C,0x8D,0x91,0xA0,0x9E,0x96,0xA0,0x9C, + 0x93,0x95,0x95,0x92,0x92,0x94,0x93,0x8E,0x86,0x8A,0x7F,0x85,0x9B,0x86,0x89,0x98, + 0x82,0x7E,0x82,0x7D,0x80,0x7D,0x84,0x8D,0x82,0x82,0x88,0x7E,0x7B,0x80,0x7E,0x80, + 0x84,0x87,0x86,0x81,0x80,0x83,0x7C,0x8B,0x9B,0x87,0x92,0x9D,0x88,0x87,0x8C,0x88, + 0x8A,0x89,0x91,0x97,0x8D,0x92,0x94,0x8A,0x8A,0x8D,0x8C,0x8C,0x8E,0x8E,0x8C,0x85, + 0x83,0x7F,0x79,0x91,0x8F,0x7D,0x90,0x89,0x75,0x79,0x71,0x6E,0x70,0x6D,0x75,0x72, + 0x69,0x6F,0x6D,0x62,0x67,0x69,0x65,0x6A,0x6A,0x68,0x66,0x63,0x64,0x5D,0x5D,0x73, + 0x6A,0x63,0x78,0x69,0x5D,0x68,0x64,0x65,0x66,0x6A,0x78,0x72,0x6F,0x79,0x76,0x78, + 0x7B,0x89,0x91,0x8B,0x9D,0x88,0x82,0x95,0x8A,0x7A,0x8D,0xAA,0x9C,0xAB,0xB6,0x9E, + 0x94,0x9D,0xA4,0xA4,0x9F,0xA0,0xB1,0xA1,0x90,0x92,0x73,0x72,0x80,0x65,0x61,0x70, + 0x6B,0x5B,0x54,0x4D,0x51,0x5E,0x74,0x7C,0x5D,0x76,0x86,0x6C,0x74,0x82,0x8D,0x9B, + 0x95,0x94,0xB2,0xAE,0xC0,0xC1,0x97,0xC4,0xB8,0xA8,0xBD,0xA6,0xB9,0xB9,0x9A,0x94, + 0x8E,0x8E,0xA8,0x8A,0x7D,0x91,0x79,0x75,0x70,0x78,0x88,0x74,0x71,0x76,0x6F,0x74, + 0x67,0x4E,0x50,0x55,0x58,0x58,0x53,0x4D,0x4C,0x50,0x51,0x52,0x5D,0x6A,0x85,0x83, + 0x81,0x8A,0x73,0x6F,0x74,0x7D,0x91,0x99,0x9C,0x9C,0x8E,0x91,0x94,0x92,0x87,0x80, + 0x83,0x7E,0x80,0x70,0x73,0x6F,0x5C,0x64,0x60,0x7F,0x8B,0x65,0x68,0x65,0x4F,0x59, + 0x61,0x57,0x61,0x6B,0x6F,0x7E,0x79,0x8F,0x9C,0x8F,0x9B,0xA0,0x98,0xA1,0xA5,0x9B, + 0x95,0x84,0x80,0x82,0x84,0x98,0x9D,0x98,0xB1,0xB2,0xA9,0xB5,0xA1,0xA0,0xA2,0x89, + 0x9C,0x96,0x71,0x88,0x85,0x76,0x8A,0x80,0x74,0x71,0x6B,0x75,0x85,0x7E,0x7A,0x6B, + 0x6C,0x8B,0x73,0x66,0x6D,0x67,0x69,0x60,0x5C,0x5B,0x58,0x67,0x6F,0x71,0x6A,0x6F, + 0x82,0x85,0x81,0x8C,0x86,0x87,0x92,0x8E,0x9E,0x9D,0xA3,0xA5,0xAB,0xBA,0xAE,0xB7, + 0xBB,0xAC,0xB8,0xB4,0xB2,0xB5,0xA2,0x9F,0x9E,0x97,0x97,0x8D,0x81,0x6F,0x61,0x59, + 0x60,0x68,0x4F,0x57,0x64,0x5C,0x4D,0x32,0x31,0x36,0x38,0x4B,0x4C,0x36,0x2C,0x35, + 0x40,0x3D,0x3E,0x4B,0x4D,0x47,0x46,0x52,0x5C,0x66,0x6B,0x73,0x91,0x9A,0x96,0x8C, + 0x84,0x97,0x9F,0xAF,0xCD,0xC0,0xCB,0xDC,0xC2,0xB1,0xB2,0xB6,0xBE,0xCB,0xC7,0xBE, + 0xC0,0xBF,0xC3,0xC5,0xC1,0xC2,0xB5,0xB0,0xB0,0x9C,0x8B,0x76,0x65,0x6F,0x7D,0x84, + 0x78,0x5A,0x5D,0x65,0x5D,0x57,0x53,0x58,0x5C,0x63,0x52,0x51,0x44,0x3D,0x4D,0x49, + 0x58,0x57,0x53,0x60,0x6D,0x68,0x5A,0x5B,0x64,0x65,0x79,0x8D,0x78,0x83,0x8C,0x7F, + 0x8D,0x88,0x90,0x9F,0xA3,0xA8,0xAA,0xA6,0xA8,0xA9,0xA9,0xB6,0xB1,0xB2,0xB1,0xB6, + 0xB4,0xAB,0xA9,0x9C,0x9B,0x98,0x9B,0x9C,0x8C,0x87,0x87,0x7C,0x73,0x78,0x78,0x7B, + 0x7B,0x69,0x67,0x63,0x63,0x5D,0x53,0x5D,0x64,0x66,0x66,0x5C,0x59,0x5B,0x57,0x59, + 0x5B,0x55,0x60,0x5F,0x59,0x67,0x71,0x71,0x62,0x5C,0x68,0x72,0x76,0x6C,0x68,0x73, + 0x78,0x76,0x77,0x82,0x82,0x76,0x7B,0x79,0x81,0x86,0x82,0x88,0x7B,0x8B,0xA2,0x95, + 0x97,0x9D,0x95,0x91,0x89,0x91,0x9B,0xA3,0xAA,0xA1,0x9F,0xAB,0xAB,0x9B,0x9A,0x97, + 0x94,0xA4,0xA3,0xA1,0x9E,0x8F,0x94,0x97,0x98,0xA3,0x98,0x8B,0x97,0x9B,0x91,0x8E, + 0x92,0x94,0x9D,0x91,0x82,0x80,0x73,0x73,0x68,0x64,0x76,0x77,0x74,0x7C,0x7E,0x74, + 0x74,0x6A,0x66,0x6F,0x6F,0x78,0x6F,0x6A,0x6C,0x64,0x60,0x55,0x55,0x63,0x6A,0x6A, + 0x64,0x6B,0x71,0x69,0x70,0x73,0x78,0x80,0x7F,0x87,0x83,0x7A,0x72,0x67,0x6C,0x72, + 0x84,0x8E,0x7B,0x79,0x7B,0x71,0x70,0x60,0x6A,0x7B,0x6C,0x6D,0x67,0x6C,0x83,0x79, + 0x6F,0x7B,0x81,0x8A,0x97,0x8B,0x86,0x94,0x8C,0x98,0xA5,0x9F,0xAE,0xAD,0xA2,0xB3, + 0xB4,0xAD,0xA3,0x91,0x9C,0xA5,0x98,0x91,0x8D,0x8F,0x91,0x8F,0x88,0x88,0x89,0x7D, + 0x77,0x74,0x6F,0x70,0x70,0x63,0x58,0x67,0x6F,0x60,0x6D,0x76,0x6E,0x65,0x54,0x66, + 0x71,0x72,0x64,0x4B,0x4E,0x5B,0x6F,0x71,0x6C,0x78,0x7A,0x7B,0x84,0x83,0x85,0x8C, + 0x8D,0x92,0x97,0xAA,0xB3,0xAB,0x9D,0x9B,0xAB,0xA7,0x9D,0xA2,0xA8,0xA3,0x96,0x90, + 0x91,0x98,0xA0,0x97,0x89,0x98,0x9A,0x92,0x8F,0x8A,0x93,0x97,0x8F,0x8A,0x92,0x91, + 0x8B,0x87,0x7D,0x7B,0x76,0x6B,0x6E,0x7A,0x85,0x7E,0x72,0x6B,0x63,0x69,0x6F,0x61, + 0x58,0x5C,0x5E,0x5E,0x54,0x4B,0x4D,0x56,0x55,0x5A,0x67,0x71,0x76,0x6E,0x6B,0x63, + 0x62,0x6F,0x6E,0x74,0x73,0x70,0x76,0x7A,0x85,0x89,0x85,0x7F,0x86,0x8C,0x88,0x8B, + 0x7A,0x6B,0x76,0x79,0x80,0x93,0x94,0x8E,0x86,0x7D,0x81,0x7D,0x73,0x74,0x76,0x74, + 0x74,0x73,0x6A,0x64,0x6E,0x78,0x7B,0x7C,0x81,0x82,0x78,0x6F,0x6E,0x71,0x7A,0x84, + 0x8E,0x9A,0x9D,0x95,0x90,0x95,0x94,0x96,0x94,0x96,0xA0,0x9B,0x91,0x90,0x88,0x8E, + 0xA1,0xA2,0xA5,0xA3,0xA4,0xAE,0xA9,0xA7,0xA3,0x9F,0x9B,0x9C,0xAB,0xAB,0xA9,0xA9, + 0x98,0x92,0x98,0x99,0x98,0x91,0x89,0x84,0x7D,0x79,0x72,0x6E,0x70,0x72,0x78,0x7C, + 0x79,0x74,0x73,0x70,0x6D,0x65,0x5A,0x61,0x71,0x70,0x65,0x64,0x56,0x4C,0x51,0x56, + 0x60,0x63,0x5F,0x58,0x5B,0x5C,0x5C,0x60,0x55,0x58,0x63,0x66,0x6D,0x6E,0x67,0x6A, + 0x6E,0x74,0x7A,0x7A,0x7F,0x7B,0x78,0x78,0x72,0x6F,0x69,0x68,0x72,0x7A,0x73,0x77, + 0x76,0x74,0x83,0x83,0x78,0x71,0x75,0x77,0x7B,0x7E,0x7D,0x83,0x82,0x89,0x84,0x77, + 0x7D,0x7A,0x7D,0x82,0x7E,0x83,0x81,0x7F,0x8C,0x94,0x94,0x92,0x8F,0x92,0x9E,0x9D, + 0x93,0x97,0x96,0x9C,0xAA,0xA2,0x9E,0xA1,0xA6,0xAD,0xA9,0xA1,0xA2,0xA8,0xA5,0xAA, + 0xA2,0x99,0xA4,0xA1,0x9F,0xA0,0x9D,0x97,0x97,0x95,0x97,0x9D,0x94,0x94,0x94,0x8C, + 0x93,0x92,0x8A,0x8D,0x8E,0x8A,0x86,0x81,0x81,0x85,0x84,0x81,0x7F,0x7D,0x81,0x82, + 0x72,0x6F,0x71,0x68,0x6B,0x6C,0x6B,0x67,0x63,0x6B,0x62,0x65,0x6D,0x65,0x65,0x5F, + 0x60,0x5F,0x58,0x5A,0x52,0x5C,0x63,0x5C,0x5F,0x60,0x64,0x67,0x69,0x65,0x65,0x6B, + 0x6B,0x6E,0x6B,0x65,0x66,0x6E,0x6D,0x6F,0x6E,0x69,0x6F,0x75,0x79,0x7A,0x73,0x70, + 0x75,0x75,0x79,0x77,0x6E,0x72,0x79,0x7D,0x83,0x83,0x83,0x87,0x89,0x86,0x85,0x88, + 0x85,0x85,0x8A,0x87,0x87,0x86,0x85,0x8C,0x8D,0x8E,0x93,0x8E,0x8F,0x98,0x99,0x9A, + 0x9B,0x9C,0x9E,0xA2,0xA8,0xA3,0xA0,0xA0,0xA5,0xAB,0xA7,0xA3,0xA2,0x9E,0x9E,0xA3, + 0x9E,0x99,0x97,0x94,0x99,0x9C,0x97,0x9A,0x99,0x9B,0x9C,0x96,0x9C,0x98,0x98,0x9F, + 0x9B,0x98,0x97,0x93,0x92,0x91,0x89,0x88,0x85,0x80,0x82,0x7E,0x7B,0x79,0x74,0x77, + 0x74,0x72,0x76,0x72,0x74,0x70,0x6C,0x73,0x6B,0x6B,0x76,0x73,0x75,0x7A,0x73,0x74, + 0x79,0x73,0x74,0x72,0x6C,0x70,0x6A,0x62,0x63,0x60,0x67,0x68,0x60,0x5F,0x62,0x65, + 0x63,0x60,0x5D,0x5C,0x66,0x69,0x64,0x6D,0x65,0x5D,0x69,0x67,0x67,0x72,0x66,0x5F, + 0x6B,0x69,0x6B,0x6D,0x64,0x66,0x6C,0x70,0x6F,0x68,0x68,0x6C,0x72,0x77,0x77,0x76, + 0x7A,0x80,0x84,0x7E,0x7C,0x82,0x85,0x8F,0x94,0x8E,0x8F,0x8F,0x8A,0x92,0x92,0x8C, + 0x8E,0x8C,0x8A,0x90,0x8C,0x86,0x8A,0x8C,0x94,0x9A,0x97,0x98,0x9A,0x99,0x9F,0xA1, + 0xA0,0x9B,0x9D,0xA7,0xA3,0xA1,0x9D,0x94,0x99,0x9C,0x9C,0x9E,0x99,0x95,0x95,0x94, + 0x91,0x8B,0x89,0x89,0x8E,0x8F,0x89,0x89,0x87,0x87,0x8C,0x89,0x8D,0x8E,0x8C,0x8C, + 0x88,0x8D,0x8B,0x87,0x8D,0x8D,0x8C,0x8F,0x86,0x82,0x85,0x7F,0x7D,0x7D,0x79,0x7A, + 0x7A,0x75,0x75,0x76,0x77,0x77,0x77,0x78,0x7D,0x80,0x7E,0x80,0x7F,0x79,0x77,0x7C, + 0x7C,0x75,0x77,0x77,0x73,0x78,0x76,0x72,0x71,0x6E,0x74,0x74,0x6F,0x6C,0x6B,0x6E, + 0x73,0x77,0x73,0x6F,0x71,0x75,0x7A,0x7A,0x76,0x78,0x7A,0x7C,0x7C,0x79,0x7B,0x78, + 0x77,0x7D,0x79,0x78,0x7A,0x76,0x76,0x78,0x74,0x72,0x6E,0x6B,0x71,0x74,0x71,0x71, + 0x74,0x78,0x80,0x82,0x7D,0x7C,0x7C,0x82,0x87,0x83,0x7E,0x7C,0x81,0x84,0x82,0x7F, + 0x7F,0x7F,0x80,0x82,0x80,0x7F,0x7E,0x7E,0x80,0x7E,0x79,0x79,0x76,0x79,0x82,0x7D, + 0x7D,0x81,0x7D,0x80,0x85,0x86,0x88,0x85,0x83,0x80,0x82,0x85,0x80,0x85,0x85,0x85, + 0x8A,0x88,0x89,0x85,0x82,0x7F,0x7E,0x83,0x7D,0x81,0x85,0x7F,0x84,0x86,0x86,0x89, + 0x88,0x89,0x89,0x87,0x8A,0x8A,0x84,0x81,0x7B,0x81,0x91,0x89,0x82,0x85,0x81,0x89, + 0x8C,0x7D,0x7F,0x81,0x7E,0x85,0x7E,0x77,0x7D,0x7D,0x84,0x88,0x80,0x82,0x87,0x86, + 0x83,0x82,0x80,0x7F,0x81,0x80,0x7F,0x75,0x7E,0x92,0x89,0x88,0x86,0x7B,0x85,0x82, + 0x6F,0x76,0x77,0x76,0x81,0x77,0x75,0x86,0x87,0x87,0x83,0x7C,0x85,0x88,0x7D,0x7B, + 0x7E,0x81,0x85,0x81,0x7C,0x75,0x7A,0x91,0x92,0x88,0x88,0x83,0x85,0x89,0x76,0x70, + 0x79,0x7C,0x85,0x84,0x7B,0x82,0x8B,0x86,0x81,0x7C,0x7D,0x84,0x80,0x7C,0x88,0x8B, + 0x84,0x80,0x80,0x7E,0x74,0x83,0x95,0x8B,0x89,0x8A,0x82,0x87,0x7C,0x6B,0x78,0x7D, + 0x7B,0x81,0x7C,0x7D,0x88,0x82,0x78,0x77,0x76,0x79,0x7C,0x74,0x79,0x82,0x7C,0x79, + 0x76,0x72,0x6D,0x78,0x8F,0x8B,0x83,0x83,0x81,0x87,0x7D,0x6C,0x73,0x7D,0x7E,0x80, + 0x7C,0x7F,0x8C,0x8B,0x7E,0x7E,0x84,0x82,0x80,0x7B,0x7D,0x87,0x82,0x7C,0x7C,0x7B, + 0x75,0x70,0x86,0x8F,0x85,0x88,0x84,0x82,0x81,0x6F,0x6C,0x78,0x78,0x78,0x7B,0x79, + 0x85,0x8E,0x80,0x7C,0x80,0x7E,0x7B,0x79,0x79,0x82,0x82,0x7E,0x7F,0x7C,0x77,0x72, + 0x85,0x93,0x87,0x87,0x88,0x87,0x87,0x75,0x6B,0x78,0x7C,0x79,0x7C,0x7E,0x86,0x8E, + 0x82,0x7C,0x81,0x80,0x7D,0x79,0x78,0x85,0x86,0x7E,0x80,0x81,0x7E,0x76,0x80,0x97, + 0x8F,0x88,0x8B,0x87,0x8A,0x7E,0x6E,0x7A,0x81,0x7B,0x7C,0x7C,0x81,0x8C,0x84,0x7B, + 0x81,0x83,0x81,0x7B,0x77,0x80,0x85,0x7F,0x7F,0x83,0x83,0x78,0x7E,0x9A,0x92,0x88, + 0x8C,0x88,0x8F,0x86,0x71,0x7A,0x85,0x7E,0x7F,0x7E,0x80,0x8D,0x86,0x7D,0x84,0x88, + 0x85,0x7D,0x7A,0x82,0x85,0x7C,0x7C,0x81,0x80,0x78,0x75,0x8F,0x94,0x83,0x87,0x86, + 0x8B,0x89,0x74,0x76,0x81,0x7A,0x76,0x78,0x7B,0x88,0x86,0x79,0x80,0x89,0x88,0x82, + 0x7B,0x81,0x86,0x7A,0x7B,0x86,0x82,0x7D,0x74,0x83,0x94,0x81,0x82,0x87,0x87,0x8A, + 0x7A,0x74,0x81,0x7F,0x77,0x79,0x7B,0x81,0x85,0x7C,0x7F,0x87,0x85,0x84,0x80,0x84, + 0x89,0x7F,0x7E,0x83,0x84,0x85,0x7E,0x80,0x8E,0x87,0x81,0x87,0x84,0x85,0x82,0x7B, + 0x80,0x83,0x7D,0x7D,0x7E,0x7C,0x81,0x7E,0x79,0x7E,0x7F,0x7F,0x81,0x7D,0x81,0x83, + 0x7D,0x81,0x82,0x81,0x82,0x81,0x87,0x85,0x81,0x84,0x84,0x83,0x84,0x81,0x81,0x85, + 0x83,0x7F,0x80,0x7E,0x7F,0x81,0x7D,0x7E,0x7F,0x7C,0x7B,0x7E,0x7E,0x7E,0x7D,0x7D, + 0x80,0x80,0x7F,0x7D,0x7F,0x82,0x81,0x7E,0x80,0x81,0x7F,0x7F,0x7F,0x80,0x81,0x7F, + 0x80,0x80,0x7F,0x7F,0x7E,0x7C,0x7D,0x80,0x7F,0x7E,0x7F,0x81,0x82,0x81,0x80,0x81, + 0x82,0x81,0x80,0x82,0x82,0x81,0x80,0x82,0x82,0x81,0x82,0x80,0x80,0x82,0x81,0x80, + 0x7E,0x7C,0x7C,0x7D,0x7A,0x7B,0x7B,0x7B,0x7E,0x7D,0x7D,0x7D,0x7D,0x7F,0x7F,0x7E, + 0x80,0x7F,0x80,0x82,0x80,0x7E,0x80,0x80,0x81,0x82,0x81,0x81,0x81,0x7F,0x7E,0x7E, + 0x7D,0x7F,0x7E,0x7C,0x7D,0x7E,0x7B,0x7D,0x7D,0x7E,0x81,0x7F,0x80,0x80,0x80,0x83, + 0x82,0x81,0x84,0x84,0x82,0x85,0x83,0x82,0x83,0x80,0x81,0x83,0x80,0x81,0x81,0x7E, + 0x80,0x7F,0x7B,0x7C,0x7B,0x7C,0x7D,0x7A,0x7C,0x7F,0x7F,0x7E,0x7E,0x7D,0x81,0x83, + 0x80,0x81,0x80,0x80,0x81,0x80,0x80,0x81,0x81,0x83,0x8D,0x8C,0x8F,0x8F,0x7C,0x77, + 0x70,0x70,0x78,0x7F,0x75,0x76,0x64,0x61,0x8A,0x75,0x6F,0x7E,0x77,0x6E,0x6C,0x82, + 0x82,0x85,0x82,0x77,0x7B,0x80,0x85,0x83,0x89,0x93,0x94,0x90,0x8E,0x90,0x86,0x82, + 0x81,0x7B,0x84,0x8F,0x89,0x8C,0xA4,0x99,0x8D,0x93,0x7C,0x7D,0x96,0x8E,0x8F,0x8E, + 0x87,0x8F,0x90,0x88,0x7A,0x81,0x89,0x84,0x88,0x83,0x7F,0x7B,0x79,0x73,0x6C,0x72, + 0x74,0x75,0x74,0x6D,0x6D,0x6A,0x68,0x71,0x6B,0x65,0x67,0x62,0x64,0x6C,0x70,0x75, + 0x74,0x6B,0x6E,0x76,0x70,0x67,0x6B,0x72,0x7A,0x6C,0x61,0x6B,0x68,0x63,0x69,0x67, + 0x65,0x6E,0x6D,0x70,0x81,0x85,0x97,0xB7,0xAF,0x9B,0x96,0x8E,0x91,0x8B,0x8A,0x95, + 0x8B,0x85,0x8B,0x8F,0x8D,0x83,0x7B,0x90,0x92,0x7C,0x85,0x8B,0x87,0x86,0x84,0x8C, + 0x98,0x8F,0x89,0x8E,0x8F,0x98,0x98,0x92,0x9F,0x9C,0x94,0x93,0x8D,0xA0,0x9D,0x8A, + 0x98,0x97,0x92,0x95,0x86,0x97,0xA8,0x88,0x8A,0x95,0x86,0x89,0x84,0x8B,0x99,0x80, + 0x7E,0x97,0x92,0x8B,0x86,0x86,0x84,0x74,0x71,0x76,0x89,0x80,0x72,0x83,0x82,0x7A, + 0x6C,0x65,0x72,0x67,0x4E,0x57,0x61,0x5F,0x5E,0x59,0x6B,0x73,0x5D,0x64,0x6C,0x5F, + 0x5A,0x5A,0x61,0x67,0x5E,0x60,0x79,0x74,0x5A,0x66,0x6D,0x6A,0x61,0x57,0x6D,0x64, + 0x55,0x69,0x74,0x7B,0x7B,0x86,0xA3,0xA9,0x97,0x9C,0x9E,0x8D,0x89,0x89,0x8D,0x86, + 0x7A,0x87,0x9D,0x8E,0x83,0x91,0x8E,0x85,0x79,0x80,0x91,0x7B,0x7A,0x94,0x94,0x91, + 0x8E,0x97,0xA0,0x91,0x95,0xA5,0x9D,0x95,0x98,0xA0,0x98,0x8A,0x89,0x9D,0xA9,0x92, + 0x9B,0xA6,0x99,0x8D,0x88,0x98,0x8E,0x7B,0x91,0x9C,0x8D,0x8B,0x94,0x9A,0x8C,0x7E, + 0x8C,0x8D,0x81,0x83,0x8B,0x84,0x7D,0x79,0x7B,0x8F,0x7D,0x71,0x88,0x7F,0x70,0x69, + 0x6C,0x71,0x64,0x61,0x72,0x6D,0x64,0x6E,0x6F,0x6C,0x62,0x61,0x68,0x59,0x5D,0x66, + 0x67,0x65,0x68,0x62,0x68,0x77,0x61,0x6B,0x74,0x5B,0x5B,0x5C,0x5E,0x5C,0x54,0x64, + 0x73,0x6E,0x75,0x87,0x8C,0x8B,0x8D,0xA1,0x9E,0x8F,0x99,0x99,0x8F,0x8C,0x89,0x84, + 0x96,0x92,0x80,0x92,0x8A,0x75,0x7A,0x7B,0x7A,0x79,0x7C,0x8F,0x93,0x8A,0x94,0x96, + 0x91,0x8A,0x8C,0x9B,0x8F,0x96,0xA2,0x99,0x97,0x97,0x90,0x93,0xA9,0x9C,0x99,0xAA, + 0x96,0x8C,0x92,0x91,0x90,0x88,0x94,0xA0,0x94,0x95,0x9B,0x94,0x8E,0x8A,0x8A,0x8A, + 0x83,0x8C,0x90,0x85,0x82,0x80,0x76,0x87,0x90,0x7B,0x8B,0x8F,0x74,0x71,0x6F,0x67, + 0x68,0x61,0x6B,0x72,0x64,0x6E,0x6E,0x64,0x66,0x62,0x65,0x60,0x5A,0x63,0x63,0x5F, + 0x60,0x62,0x59,0x6D,0x70,0x5A,0x72,0x6A,0x53,0x5C,0x57,0x56,0x55,0x56,0x68,0x6A, + 0x66,0x75,0x7A,0x78,0x7F,0x89,0x90,0x93,0x9A,0xA2,0xA0,0x90,0x94,0x8C,0x83,0x9C, + 0x88,0x85,0x9A,0x82,0x79,0x7D,0x79,0x7F,0x78,0x7F,0x93,0x84,0x88,0x9D,0x8C,0x88, + 0x91,0x91,0x8F,0x93,0x9C,0x99,0x96,0x98,0x97,0x8D,0x9E,0xAC,0x93,0xA4,0xAB,0x94, + 0x98,0x92,0x8D,0x91,0x89,0x96,0xA0,0x8F,0x9C,0x9E,0x8E,0x91,0x8D,0x8B,0x87,0x86, + 0x8E,0x88,0x7D,0x85,0x7E,0x77,0x94,0x84,0x7B,0x97,0x7F,0x6F,0x7A,0x71,0x6C,0x66, + 0x68,0x78,0x68,0x65,0x79,0x67,0x5E,0x67,0x61,0x5F,0x5C,0x62,0x63,0x5C,0x5E,0x5F, + 0x53,0x65,0x72,0x57,0x6B,0x73,0x59,0x5A,0x5C,0x57,0x53,0x51,0x63,0x68,0x5E,0x6F, + 0x78,0x6E,0x78,0x7E,0x83,0x89,0x8E,0x9F,0x9B,0x91,0x99,0x8E,0x86,0xA5,0x90,0x84, + 0xA3,0x8B,0x78,0x85,0x7F,0x7B,0x78,0x79,0x87,0x80,0x7F,0x91,0x88,0x83,0x93,0x8B, + 0x8A,0x90,0x90,0x96,0x8E,0x8E,0x95,0x85,0x94,0xAA,0x90,0x9C,0xAF,0x95,0x96,0x9A, + 0x8E,0x91,0x8C,0x93,0x9B,0x8F,0x98,0x9B,0x8C,0x90,0x92,0x89,0x89,0x8C,0x8C,0x87, + 0x82,0x84,0x81,0x77,0x93,0x8E,0x79,0x97,0x89,0x70,0x7B,0x75,0x70,0x6C,0x66,0x71, + 0x72,0x6A,0x74,0x72,0x63,0x68,0x67,0x5E,0x5F,0x64,0x65,0x5E,0x5C,0x63,0x56,0x61, + 0x7E,0x61,0x64,0x7A,0x5B,0x55,0x5D,0x54,0x53,0x53,0x59,0x65,0x5D,0x64,0x71,0x69, + 0x6C,0x74,0x78,0x7B,0x82,0x8C,0x92,0x91,0x95,0x97,0x8A,0xA6,0xA8,0x8C,0xA4,0x9C, + 0x86,0x8B,0x82,0x7F,0x7F,0x79,0x8B,0x8B,0x7E,0x8E,0x90,0x86,0x8C,0x90,0x8E,0x8F, + 0x91,0x96,0x90,0x8A,0x93,0x86,0x8A,0xAF,0x9B,0x94,0xB5,0x9C,0x8F,0x99,0x8F,0x92, + 0x8C,0x8E,0xA2,0x94,0x90,0xA1,0x95,0x8F,0x92,0x90,0x90,0x8D,0x90,0x91,0x8A,0x86, + 0x88,0x7A,0x8C,0x9D,0x81,0x92,0x9B,0x7D,0x7F,0x7B,0x76,0x78,0x6A,0x77,0x7E,0x6E, + 0x75,0x78,0x6B,0x6B,0x69,0x68,0x67,0x64,0x66,0x65,0x61,0x5A,0x57,0x52,0x6D,0x6A, + 0x57,0x76,0x69,0x54,0x5B,0x52,0x53,0x50,0x4B,0x60,0x60,0x56,0x65,0x64,0x60,0x67, + 0x69,0x74,0x77,0x7D,0x8A,0x8D,0x92,0x92,0x8D,0x95,0xB0,0x9B,0x96,0xAD,0x9A,0x8A, + 0x87,0x86,0x86,0x7C,0x7E,0x93,0x89,0x83,0x8E,0x88,0x87,0x82,0x85,0x8F,0x8B,0x8B, + 0x93,0x90,0x8B,0x8B,0x80,0x92,0xAB,0x92,0x9B,0xB0,0x9C,0x91,0x8D,0x91,0x97,0x86, + 0x92,0xA3,0x96,0x96,0x93,0x92,0x94,0x8A,0x8E,0x94,0x91,0x91,0x8F,0x8E,0x86,0x80, + 0x7C,0x92,0xA1,0x84,0x92,0x9C,0x84,0x7D,0x74,0x80,0x85,0x6E,0x7B,0x84,0x79,0x74, + 0x6B,0x72,0x71,0x62,0x69,0x6F,0x6C,0x63,0x60,0x62,0x5B,0x51,0x4C,0x6A,0x75,0x59, + 0x67,0x6B,0x5B,0x52,0x46,0x5A,0x5C,0x4D,0x5B,0x63,0x60,0x5B,0x56,0x62,0x69,0x63, + 0x6D,0x79,0x80,0x7C,0x7F,0x86,0x87,0x85,0x8F,0xB2,0xAF,0x9D,0xA9,0xA1,0x94,0x84, + 0x7C,0x95,0x94,0x86,0x8D,0x91,0x90,0x84,0x7C,0x86,0x8A,0x88,0x88,0x8F,0x90,0x89, + 0x89,0x87,0x88,0x81,0x92,0xAD,0x9E,0x97,0x9E,0x95,0x91,0x84,0x89,0x9D,0x98,0x98, + 0x99,0x99,0x98,0x8A,0x86,0x90,0x94,0x92,0x90,0x96,0x91,0x8A,0x86,0x7E,0x80,0x82, + 0x98,0x9F,0x8E,0x92,0x8E,0x88,0x7B,0x6F,0x7E,0x89,0x80,0x7E,0x7D,0x7B,0x7A,0x6C, + 0x6C,0x71,0x72,0x71,0x6C,0x6D,0x69,0x62,0x5A,0x5B,0x56,0x5E,0x78,0x6D,0x66,0x67, + 0x5B,0x59,0x4D,0x4B,0x5D,0x60,0x5D,0x5A,0x5A,0x5F,0x5B,0x57,0x5C,0x67,0x6A,0x6A, + 0x70,0x74,0x7B,0x79,0x79,0x7F,0x83,0xA3,0xB1,0xA4,0xA2,0x96,0x97,0x92,0x83,0x8A, + 0x95,0x96,0x91,0x88,0x88,0x8E,0x86,0x80,0x82,0x8A,0x91,0x8A,0x84,0x87,0x8A,0x83, + 0x7F,0x7A,0x89,0xA5,0xA3,0x95,0x8F,0x8E,0x92,0x8B,0x83,0x8D,0x9A,0xA0,0x98,0x8B, + 0x91,0x95,0x91,0x89,0x88,0x96,0x99,0x90,0x8A,0x8A,0x89,0x86,0x7E,0x7C,0x97,0xA3, + 0x98,0x8E,0x81,0x85,0x89,0x7C,0x7A,0x80,0x8B,0x8D,0x81,0x78,0x79,0x7F,0x7C,0x73, + 0x71,0x79,0x7B,0x71,0x6B,0x6B,0x68,0x63,0x59,0x64,0x7C,0x7A,0x6E,0x5D,0x59,0x5D, + 0x5B,0x55,0x54,0x5D,0x64,0x64,0x5C,0x56,0x5A,0x64,0x62,0x5D,0x63,0x6A,0x6F,0x70, + 0x6E,0x70,0x75,0x72,0x7C,0x98,0xA5,0xA1,0x98,0x90,0x91,0x93,0x8D,0x8C,0x8E,0x94, + 0x96,0x90,0x8A,0x85,0x8A,0x8A,0x85,0x84,0x86,0x88,0x8B,0x86,0x80,0x7F,0x7B,0x7A, + 0x90,0xA1,0x9B,0x96,0x8B,0x89,0x8D,0x8A,0x87,0x89,0x8F,0x97,0x9B,0x95,0x90,0x90, + 0x91,0x92,0x91,0x8F,0x93,0x95,0x92,0x8F,0x88,0x85,0x7F,0x8E,0xA3,0xA3,0x9B,0x8E, + 0x86,0x89,0x88,0x85,0x83,0x83,0x89,0x8B,0x8B,0x88,0x81,0x7E,0x7E,0x7E,0x7C,0x7A, + 0x79,0x77,0x74,0x6D,0x6A,0x64,0x66,0x77,0x79,0x71,0x6A,0x60,0x60,0x62,0x5D,0x5D, + 0x5B,0x59,0x5B,0x5B,0x5C,0x5F,0x5E,0x5E,0x61,0x60,0x63,0x66,0x67,0x6B,0x70,0x73, + 0x76,0x77,0x7A,0x87,0x8E,0x8E,0x93,0x95,0x98,0x9F,0x9D,0x99,0x9C,0x93,0x95,0x96, + 0x8E,0x8F,0x8B,0x86,0x87,0x84,0x82,0x85,0x83,0x83,0x83,0x83,0x85,0x82,0x85,0x8B, + 0x89,0x89,0x8B,0x8A,0x91,0x8F,0x8E,0x92,0x8F,0x8E,0x91,0x90,0x8F,0x8E,0x8B,0x8B, + 0x8C,0x8D,0x8C,0x8F,0x8F,0x8E,0x8F,0x8D,0x8E,0x89,0x8F,0x94,0x8E,0x90,0x90,0x8D, + 0x92,0x91,0x8B,0x8D,0x88,0x87,0x89,0x86,0x84,0x81,0x7D,0x7C,0x7D,0x79,0x7A,0x7B, + 0x78,0x78,0x76,0x73,0x71,0x6C,0x6F,0x72,0x6B,0x6C,0x6B,0x66,0x6C,0x6A,0x65,0x66, + 0x62,0x5F,0x60,0x5C,0x5E,0x5C,0x5B,0x60,0x60,0x64,0x67,0x69,0x6C,0x71,0x75,0x77, + 0x7A,0x7C,0x82,0x8B,0x8C,0x8F,0x95,0x92,0x99,0x9C,0x96,0x9A,0x95,0x92,0x94,0x8C, + 0x8A,0x88,0x82,0x85,0x83,0x80,0x84,0x80,0x80,0x81,0x81,0x81,0x81,0x81,0x81,0x86, + 0x87,0x85,0x89,0x88,0x89,0x8E,0x8B,0x8B,0x8D,0x88,0x8B,0x8A,0x87,0x8A,0x85,0x86, + 0x8B,0x88,0x8B,0x8C,0x8B,0x8D,0x8D,0x8E,0x8B,0x8D,0x8D,0x8D,0x90,0x90,0x8E,0x8F, + 0x8F,0x8B,0x8E,0x8B,0x8C,0x8A,0x86,0x89,0x84,0x80,0x82,0x7F,0x7B,0x7D,0x7A,0x79, + 0x79,0x75,0x75,0x75,0x74,0x72,0x6F,0x6F,0x6D,0x6C,0x6E,0x6A,0x69,0x69,0x64,0x65, + 0x65,0x60,0x63,0x63,0x61,0x64,0x64,0x64,0x66,0x66,0x69,0x6C,0x6D,0x72,0x74,0x75, + 0x7C,0x7D,0x82,0x87,0x86,0x8B,0x8E,0x8D,0x8F,0x8F,0x8D,0x8D,0x8B,0x8B,0x8C,0x89, + 0x89,0x8A,0x88,0x87,0x87,0x85,0x84,0x85,0x82,0x83,0x83,0x82,0x83,0x85,0x84,0x84, + 0x86,0x86,0x87,0x89,0x89,0x89,0x89,0x88,0x89,0x8B,0x89,0x88,0x88,0x88,0x86,0x87, + 0x87,0x85,0x84,0x85,0x84,0x82,0x83,0x82,0x81,0x81,0x81,0x80,0x80,0x82,0x82,0x83, + 0x85,0x82,0x82,0x84,0x84,0x87,0x85,0x81,0x84,0x83,0x83,0x82,0x7F,0x7F,0x7F,0x7D, + 0x7E,0x7C,0x78,0x79,0x77,0x77,0x75,0x75,0x73,0x73,0x73,0x73,0x74,0x72,0x72,0x73, + 0x73,0x73,0x75,0x74,0x76,0x78,0x78,0x79,0x77,0x7A,0x7C,0x7C,0x7D,0x7E,0x7E,0x7F, + 0x7F,0x80,0x80,0x81,0x82,0x82,0x83,0x82,0x81,0x81,0x81,0x80,0x81,0x82,0x81,0x80, + 0x80,0x81,0x80,0x80,0x7F,0x7E,0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x7F,0x7E,0x80,0x80, + 0x80,0x7F,0x80,0x7F,0x7E,0x7F,0x7F,0x7E,0x7E,0x80,0x7F,0x7E,0x7F,0x80,0x80,0x81, + 0x80,0x80,0x82,0x81,0x82,0x82,0x83,0x83,0x83,0x84,0x83,0x85,0x86,0x86,0x87,0x86, + 0x85,0x85,0x86,0x85,0x85,0x83,0x85,0x85,0x83,0x84,0x84,0x82,0x82,0x82,0x80,0x81, + 0x80,0x80,0x7E,0x7E,0x7F,0x7E,0x7F,0x7E,0x7E,0x80,0x80,0x7E,0x7F,0x7F,0x7E,0x7F, + 0x7E,0x7E,0x80,0x80,0x7F,0x80,0x81,0x7F,0x7F,0x82,0x81,0x7F,0x80,0x80,0x81,0x80, + 0x81,0x81,0x83,0x84,0x82,0x84,0x84,0x82,0x82,0x84,0x84,0x83,0x82,0x83,0x82,0x84, + 0x84,0x82,0x83,0x83,0x83,0x80,0x80,0x80,0x7F,0x80,0x7F,0x7D,0x7F,0x7E,0x7F,0x80, + 0x7E,0x7D,0x7D,0x7D,0x7E,0x7D,0x7E,0x7E,0x7D,0x7E,0x7C,0x7D,0x7F,0x7F,0x81,0x81, + 0x7F,0x81,0x82,0x82,0x83,0x81,0x83,0x82,0x81,0x94,0x83,0x86,0x84,0x65,0x7F,0x81, + 0x6C,0x6A,0x78,0x80,0x87,0x8C,0x8F,0x8D,0x89,0x97,0xA0,0x9D,0x98,0x93,0x90,0x8B, + 0x89,0x86,0x81,0x78,0x6E,0x63,0x5E,0x5C,0x5A,0x56,0x54,0x5E,0x64,0x68,0x6E,0x70, + 0x76,0x7B,0x7E,0x82,0x85,0x87,0x8A,0x8A,0x8C,0x8F,0x9A,0xA2,0xAC,0xB6,0xB2,0xB3, + 0xB1,0xAB,0xA5,0xA0,0x9B,0x94,0x91,0x8C,0x87,0x82,0x7E,0x7B,0x76,0x77,0x76,0x72, + 0x71,0x72,0x6F,0x6C,0x68,0x5D,0x57,0x50,0x48,0x4C,0x49,0x4C,0x51,0x56,0x5D,0x5F, + 0x66,0x6D,0x70,0x76,0x7B,0x7D,0x85,0x85,0x86,0x8D,0x8E,0x8F,0x90,0x97,0xA0,0xA7, + 0xAC,0xAF,0xAF,0xB1,0xB2,0xAF,0xAC,0xA9,0xA1,0x9D,0x96,0x8F,0x8B,0x86,0x83,0x7F, + 0x7A,0x7A,0x76,0x71,0x6C,0x60,0x5B,0x53,0x4D,0x51,0x50,0x50,0x56,0x5A,0x61,0x6C, + 0x72,0x78,0x7D,0x80,0x85,0x88,0x8A,0x89,0x8A,0x8A,0x89,0x8B,0x83,0x87,0x90,0x9A, + 0xA6,0xA7,0xA6,0xA4,0xA4,0xA6,0x9F,0x97,0x92,0x90,0x8B,0x8A,0x8B,0x86,0x80,0x7F, + 0x7F,0x7B,0x79,0x78,0x78,0x7A,0x76,0x78,0x76,0x6D,0x6D,0x69,0x61,0x5C,0x56,0x52, + 0x4D,0x4D,0x4D,0x4E,0x54,0x57,0x5E,0x62,0x64,0x6E,0x70,0x72,0x77,0x7A,0x7F,0x85, + 0x87,0x8C,0x97,0x9C,0xA3,0xAB,0xAD,0xB1,0xB6,0xBB,0xBD,0xBE,0xBB,0xBE,0xBD,0xB4, + 0xB6,0xB4,0xAE,0xA8,0x9E,0x99,0x96,0x88,0x7F,0x7C,0x75,0x73,0x71,0x6B,0x68,0x63, + 0x5C,0x56,0x55,0x54,0x4F,0x4A,0x49,0x48,0x46,0x47,0x44,0x41,0x52,0x5F,0x57,0x57, + 0x5A,0x5F,0x67,0x60,0x62,0x6C,0x6E,0x77,0x7C,0x82,0x92,0x95,0x97,0x9F,0xA2,0xA5, + 0xA9,0xAE,0xB4,0xB8,0xB9,0xBC,0xBA,0xBC,0xCA,0xC8,0xC1,0xC5,0xC0,0xBC,0xB3,0xA8, + 0xAA,0xA5,0x9A,0x99,0x96,0x90,0x90,0x83,0x77,0x76,0x69,0x63,0x5F,0x55,0x59,0x56, + 0x53,0x50,0x48,0x55,0x58,0x4C,0x51,0x50,0x49,0x47,0x37,0x3D,0x4E,0x45,0x48,0x55, + 0x5D,0x69,0x65,0x64,0x6E,0x6B,0x67,0x68,0x6D,0x75,0x75,0x75,0x7B,0x7F,0x88,0x90, + 0x8F,0x95,0x9D,0x9E,0x9F,0x9B,0xA2,0xAD,0xA9,0xAB,0xB6,0xBA,0xBE,0xBB,0xB6,0xBF, + 0xBC,0xB3,0xB6,0xB5,0xB3,0xAB,0xA3,0xA6,0x9A,0x93,0xA2,0x98,0x8F,0x91,0x84,0x7F, + 0x71,0x63,0x68,0x62,0x56,0x5B,0x5D,0x61,0x62,0x52,0x56,0x58,0x4E,0x50,0x51,0x52, + 0x54,0x50,0x53,0x5A,0x55,0x65,0x70,0x62,0x6E,0x72,0x6F,0x70,0x62,0x6B,0x76,0x6B, + 0x72,0x7F,0x84,0x8D,0x88,0x88,0x96,0x8C,0x87,0x8E,0x8D,0x90,0x8E,0x8D,0x96,0x90, + 0x9B,0xB0,0xA4,0xA4,0xAB,0xA4,0xA2,0x98,0x97,0xA3,0x9A,0x92,0x9C,0x9B,0x9E,0x98, + 0x90,0x9A,0x91,0x85,0x88,0x87,0x84,0x7F,0x7C,0x7E,0x7D,0x75,0x7F,0x86,0x77,0x79, + 0x7A,0x77,0x74,0x60,0x6B,0x74,0x64,0x6A,0x75,0x78,0x78,0x71,0x75,0x7A,0x6D,0x6B, + 0x72,0x72,0x6F,0x6C,0x6C,0x70,0x65,0x67,0x80,0x71,0x69,0x76,0x70,0x6E,0x5F,0x60, + 0x75,0x66,0x5F,0x73,0x78,0x78,0x75,0x78,0x85,0x7B,0x76,0x7F,0x83,0x82,0x81,0x88, + 0x8B,0x8F,0x8D,0x97,0xAD,0x9D,0x9F,0xB1,0xA7,0xA1,0x98,0x9F,0xAA,0x97,0x97,0xA5, + 0xA2,0xA0,0x9E,0x9F,0xA0,0x93,0x8D,0x94,0x8E,0x88,0x8E,0x8C,0x89,0x83,0x7D,0x9A, + 0x8D,0x7A,0x91,0x89,0x7E,0x71,0x6C,0x80,0x6C,0x60,0x78,0x74,0x6D,0x6E,0x70,0x76, + 0x67,0x61,0x6A,0x61,0x5E,0x61,0x63,0x5F,0x5B,0x61,0x64,0x73,0x67,0x62,0x77,0x6C, + 0x64,0x65,0x67,0x6F,0x66,0x6B,0x80,0x7C,0x7A,0x8B,0x90,0x8D,0x89,0x8D,0x92,0x8D, + 0x8C,0x94,0x91,0x8F,0x91,0x85,0x9E,0xA4,0x87,0xA0,0xA5,0x91,0x8E,0x87,0x95,0x8A, + 0x79,0x95,0x95,0x87,0x94,0x98,0x9A,0x90,0x8D,0x99,0x8B,0x89,0x91,0x8D,0x8C,0x8B, + 0x8B,0x86,0x98,0x94,0x85,0x99,0x8F,0x81,0x82,0x7E,0x80,0x73,0x71,0x81,0x78,0x74, + 0x81,0x81,0x7B,0x76,0x78,0x76,0x6D,0x6F,0x71,0x6C,0x69,0x70,0x63,0x6F,0x87,0x67, + 0x76,0x85,0x6D,0x6E,0x67,0x6E,0x69,0x57,0x6F,0x71,0x60,0x6F,0x75,0x71,0x6C,0x6C, + 0x73,0x64,0x63,0x6B,0x65,0x62,0x66,0x6B,0x61,0x79,0x7D,0x68,0x83,0x7D,0x70,0x76, + 0x71,0x79,0x6E,0x6D,0x83,0x7B,0x7A,0x8D,0x90,0x8C,0x8D,0x94,0x92,0x8B,0x91,0x93, + 0x90,0x91,0x99,0x8D,0x94,0xB3,0x96,0x9D,0xB4,0x9D,0x9C,0x99,0x9B,0x98,0x84,0x96, + 0x9C,0x88,0x95,0xA1,0x9B,0x95,0x9A,0xA0,0x91,0x8F,0x97,0x8D,0x8A,0x8D,0x91,0x81, + 0x8E,0xA3,0x85,0x93,0xA2,0x8D,0x87,0x85,0x88,0x7D,0x70,0x81,0x7E,0x70,0x7D,0x82, + 0x77,0x71,0x79,0x77,0x66,0x6B,0x6D,0x65,0x62,0x66,0x64,0x58,0x73,0x6D,0x5B,0x77, + 0x6D,0x63,0x65,0x63,0x68,0x59,0x5E,0x6D,0x5D,0x5F,0x6F,0x6A,0x66,0x69,0x70,0x68, + 0x60,0x6D,0x66,0x61,0x66,0x68,0x62,0x64,0x81,0x6F,0x6E,0x87,0x76,0x74,0x74,0x77, + 0x76,0x6A,0x7A,0x80,0x72,0x80,0x8A,0x82,0x82,0x86,0x8D,0x81,0x83,0x91,0x86,0x87, + 0x8D,0x8D,0x84,0x8F,0xA6,0x8C,0x9C,0xAC,0x95,0x99,0x9A,0x9B,0x93,0x8D,0xA0,0x99, + 0x92,0xA4,0xA4,0x9C,0x9E,0xA4,0xA3,0x96,0x9D,0xA3,0x94,0x99,0x9A,0x95,0x8C,0x9D, + 0xAB,0x8D,0xA5,0xAC,0x94,0x98,0x98,0x96,0x88,0x86,0x96,0x8A,0x84,0x95,0x8F,0x86, + 0x88,0x8C,0x87,0x7A,0x84,0x84,0x76,0x7B,0x7A,0x72,0x69,0x82,0x82,0x6B,0x89,0x80, + 0x6D,0x74,0x71,0x6F,0x60,0x66,0x72,0x60,0x64,0x71,0x67,0x63,0x66,0x68,0x61,0x5A, + 0x64,0x5F,0x57,0x5D,0x5A,0x55,0x4F,0x6B,0x64,0x54,0x77,0x67,0x5A,0x64,0x62,0x5F, + 0x53,0x5F,0x68,0x5A,0x65,0x72,0x69,0x69,0x70,0x75,0x6E,0x6B,0x7A,0x72,0x6F,0x77, + 0x77,0x6F,0x6F,0x90,0x80,0x7A,0x9C,0x87,0x81,0x8A,0x89,0x85,0x7A,0x8A,0x8E,0x80, + 0x8F,0x97,0x8C,0x90,0x96,0x98,0x91,0x91,0xA0,0x96,0x95,0x9C,0x9B,0x93,0x95,0xB5, + 0x9E,0x9F,0xBD,0xA2,0xA0,0xA7,0xA4,0x9B,0x94,0xA4,0xA1,0x95,0xA3,0xA8,0x9D,0x9D, + 0xA4,0xA2,0x97,0x98,0xA1,0x95,0x92,0x97,0x94,0x87,0x8C,0xA9,0x8D,0x93,0xAB,0x8C, + 0x8E,0x92,0x8C,0x83,0x7D,0x8C,0x85,0x7C,0x8B,0x8A,0x7E,0x82,0x85,0x81,0x77,0x79, + 0x80,0x71,0x71,0x76,0x6F,0x63,0x6C,0x85,0x67,0x72,0x87,0x68,0x6C,0x70,0x6A,0x61, + 0x5E,0x6B,0x63,0x5D,0x6D,0x6B,0x61,0x68,0x6B,0x66,0x5F,0x64,0x69,0x5B,0x5E,0x61, + 0x5A,0x51,0x60,0x73,0x56,0x6B,0x78,0x5C,0x66,0x6A,0x63,0x5C,0x60,0x6B,0x63,0x62, + 0x73,0x71,0x6A,0x75,0x78,0x73,0x72,0x7A,0x7D,0x74,0x7A,0x7C,0x77,0x6F,0x85,0x92, + 0x76,0x94,0x9A,0x7F,0x8C,0x8D,0x84,0x7D,0x85,0x8C,0x83,0x86,0x94,0x8F,0x89,0x95, + 0x96,0x8F,0x8F,0x99,0x95,0x8D,0x95,0x93,0x8C,0x87,0xA2,0xA1,0x8D,0xB0,0xA9,0x93, + 0xA2,0x9F,0x93,0x8F,0x98,0x98,0x8E,0x95,0x9F,0x95,0x93,0x9B,0x97,0x91,0x93,0x97, + 0x8E,0x8C,0x8F,0x8A,0x81,0x80,0x99,0x8A,0x81,0xA4,0x8C,0x7E,0x91,0x86,0x78,0x7E, + 0x85,0x7E,0x7A,0x85,0x87,0x7D,0x83,0x8A,0x82,0x81,0x86,0x85,0x7D,0x7F,0x7F,0x7A, + 0x71,0x7A,0x8E,0x75,0x80,0x96,0x74,0x77,0x87,0x71,0x6A,0x75,0x71,0x6B,0x6E,0x75, + 0x72,0x6D,0x75,0x77,0x6E,0x72,0x75,0x70,0x6E,0x71,0x6F,0x6C,0x65,0x7A,0x80,0x6B, + 0x87,0x8A,0x6C,0x7F,0x85,0x6C,0x73,0x7C,0x72,0x74,0x7A,0x7C,0x79,0x79,0x80,0x7F, + 0x7A,0x7D,0x7E,0x78,0x78,0x78,0x76,0x71,0x6F,0x85,0x7C,0x74,0x91,0x81,0x71,0x88, + 0x7E,0x6B,0x7A,0x77,0x6F,0x77,0x79,0x79,0x7A,0x7E,0x81,0x80,0x7F,0x81,0x80,0x7D, + 0x7D,0x7C,0x7C,0x74,0x7C,0x8C,0x7B,0x86,0x95,0x7E,0x80,0x8F,0x78,0x77,0x85,0x76, + 0x76,0x81,0x7B,0x7B,0x82,0x81,0x84,0x86,0x83,0x85,0x85,0x82,0x7F,0x81,0x7E,0x79, + 0x88,0x8A,0x81,0x92,0x92,0x80,0x8D,0x8F,0x79,0x83,0x88,0x79,0x81,0x87,0x7F,0x83, + 0x87,0x84,0x87,0x89,0x85,0x87,0x87,0x81,0x81,0x82,0x7D,0x7D,0x87,0x85,0x83,0x8F, + 0x8B,0x80,0x8A,0x86,0x7A,0x84,0x82,0x79,0x81,0x82,0x7D,0x83,0x83,0x80,0x86,0x85, + 0x83,0x88,0x85,0x81,0x85,0x83,0x7D,0x81,0x87,0x86,0x85,0x8A,0x88,0x84,0x88,0x83, + 0x7F,0x85,0x7E,0x79,0x80,0x7C,0x79,0x7F,0x7C,0x7B,0x82,0x80,0x7D,0x82,0x81,0x7E, + 0x7F,0x7D,0x7B,0x7F,0x83,0x83,0x85,0x89,0x85,0x85,0x89,0x82,0x82,0x86,0x7E,0x7E, + 0x81,0x7B,0x7E,0x81,0x7C,0x80,0x84,0x81,0x82,0x84,0x80,0x80,0x7F,0x7C,0x7C,0x7E, + 0x83,0x82,0x83,0x87,0x82,0x82,0x85,0x7F,0x80,0x81,0x79,0x7B,0x7C,0x76,0x79,0x7C, + 0x77,0x7D,0x81,0x7D,0x81,0x81,0x7D,0x7E,0x7C,0x7A,0x7A,0x7C,0x81,0x80,0x82,0x86, + 0x81,0x82,0x84,0x7E,0x80,0x80,0x78,0x7B,0x7B,0x75,0x7B,0x7B,0x78,0x7F,0x80,0x7E, + 0x82,0x82,0x7F,0x80,0x7D,0x7C,0x7C,0x7E,0x84,0x81,0x83,0x88,0x81,0x83,0x85,0x7E, + 0x80,0x80,0x77,0x7B,0x7B,0x75,0x7B,0x7B,0x77,0x7F,0x80,0x7D,0x82,0x81,0x7F,0x80, + 0x7E,0x7D,0x7C,0x7F,0x85,0x82,0x84,0x8A,0x84,0x85,0x88,0x81,0x83,0x82,0x7A,0x7D, + 0x7D,0x77,0x7C,0x7C,0x78,0x7F,0x80,0x7D,0x83,0x81,0x7E,0x80,0x7D,0x7B,0x7B,0x7D, + 0x84,0x80,0x81,0x89,0x83,0x82,0x87,0x80,0x80,0x82,0x79,0x7B,0x7E,0x77,0x7C,0x7E, + 0x7A,0x81,0x84,0x80,0x86,0x86,0x82,0x85,0x82,0x7F,0x80,0x81,0x86,0x84,0x84,0x8C, + 0x87,0x84,0x8A,0x84,0x81,0x84,0x7D,0x7B,0x7F,0x78,0x79,0x7E,0x79,0x7E,0x82,0x7E, + 0x83,0x85,0x81,0x84,0x82,0x7F,0x80,0x80,0x85,0x85,0x85,0x8B,0x8A,0x85,0x8A,0x87, + 0x82,0x86,0x81,0x7C,0x81,0x7C,0x7A,0x80,0x7B,0x7C,0x82,0x7E,0x80,0x83,0x7E,0x80, + 0x80,0x7B,0x7C,0x7D,0x7F,0x82,0x81,0x85,0x86,0x82,0x86,0x86,0x7F,0x84,0x81,0x7A, + 0x80,0x7D,0x78,0x80,0x7D,0x7C,0x83,0x80,0x80,0x85,0x81,0x81,0x83,0x7F,0x7F,0x7F, + 0x7F,0x83,0x82,0x84,0x87,0x82,0x85,0x86,0x7E,0x82,0x82,0x7A,0x7E,0x7D,0x78,0x7E, + 0x7D,0x7A,0x81,0x81,0x80,0x84,0x83,0x82,0x84,0x81,0x80,0x82,0x81,0x85,0x84,0x84, + 0x88,0x85,0x85,0x87,0x81,0x82,0x83,0x7B,0x7B,0x7C,0x76,0x79,0x7B,0x77,0x7B,0x7E, + 0x7B,0x7F,0x80,0x7E,0x81,0x7F,0x7E,0x80,0x7F,0x83,0x84,0x82,0x87,0x85,0x84,0x87, + 0x82,0x81,0x84,0x7E,0x7C,0x7F,0x7A,0x7A,0x7C,0x79,0x7B,0x7F,0x7D,0x7E,0x81,0x7F, + 0x7F,0x7F,0x7D,0x7E,0x7E,0x80,0x81,0x7F,0x82,0x83,0x81,0x83,0x82,0x7F,0x81,0x7F, + 0x7B,0x7E,0x7C,0x79,0x7D,0x7D,0x7B,0x80,0x80,0x7F,0x84,0x84,0x82,0x84,0x83,0x83, + 0x83,0x83,0x85,0x83,0x83,0x85,0x82,0x81,0x83,0x81,0x80,0x80,0x7D,0x7C,0x7C,0x78, + 0x78,0x7B,0x78,0x79,0x7B,0x79,0x7C,0x7E,0x7D,0x7E,0x7F,0x7F,0x80,0x81,0x82,0x83, + 0x82,0x82,0x83,0x81,0x82,0x83,0x80,0x81,0x81,0x7E,0x7E,0x7D,0x7B,0x7B,0x7B,0x79, + 0x7C,0x7C,0x7C,0x7F,0x7F,0x7F,0x81,0x80,0x81,0x82,0x81,0x83,0x83,0x81,0x82,0x82, + 0x81,0x83,0x82,0x81,0x83,0x81,0x7F,0x7F,0x7F,0x7D,0x7C,0x7D,0x7C,0x7C,0x7D,0x7E, + 0x7E,0x80,0x7F,0x81,0x82,0x81,0x83,0x81,0x81,0x82,0x81,0x82,0x83,0x80,0x80,0x80, + 0x81,0x82,0x8C,0x88,0x66,0x6F,0x86,0x88,0x71,0x78,0x8E,0x6E,0x71,0x81,0x7E,0x7A, + 0x83,0x94,0x83,0x7C,0x87,0x8B,0x80,0x7A,0x8B,0x82,0x75,0x73,0x7B,0x83,0x7F,0x81, + 0x86,0x7F,0x70,0x7B,0x7D,0x7F,0x84,0x7E,0x82,0x79,0x75,0x71,0x6D,0x81,0x8A,0x93, + 0x8D,0x80,0x8B,0x71,0x71,0x93,0x7F,0x75,0x8C,0x80,0x81,0x7B,0x76,0x8A,0x80,0x79, + 0x80,0x7A,0x7C,0x7C,0x7C,0x76,0x6B,0x6F,0x7C,0x86,0x84,0x75,0x73,0x86,0x89,0x88, + 0x8C,0x89,0x8B,0x8F,0x90,0x87,0x86,0x97,0x98,0x8F,0x92,0x8A,0x82,0x92,0x9C,0x8E, + 0x8B,0x94,0x8F,0x8B,0x8C,0x86,0x7A,0x78,0x83,0x89,0x88,0x88,0x7F,0x71,0x6D,0x6C, + 0x61,0x5E,0x70,0x7B,0x75,0x77,0x71,0x69,0x73,0x71,0x66,0x6C,0x68,0x63,0x6C,0x6F, + 0x6D,0x73,0x75,0x77,0x7B,0x72,0x72,0x76,0x74,0x7A,0x81,0x77,0x69,0x72,0x8E,0x9B, + 0x92,0x8D,0x88,0x7C,0x7C,0x78,0x6A,0x6F,0x72,0x73,0x7F,0x84,0x89,0x8E,0x98,0xA2, + 0xB2,0xB1,0x9D,0x93,0x92,0x96,0x90,0x8B,0x85,0x8B,0x9D,0xA1,0x97,0x8E,0x85,0x7D, + 0x83,0x7E,0x7C,0x7C,0x76,0x7E,0x88,0x82,0x7C,0x80,0x84,0x86,0x89,0x85,0x7E,0x83, + 0x88,0x86,0x8C,0x88,0x77,0x79,0x88,0x91,0x8F,0x8D,0x84,0x82,0x8D,0x8B,0x85,0x83, + 0x80,0x80,0x86,0x86,0x86,0x88,0x83,0x8C,0x8D,0x85,0x85,0x82,0x86,0x8D,0x8B,0x87, + 0x80,0x7D,0x89,0x96,0x92,0x91,0x85,0x75,0x7A,0x76,0x71,0x6C,0x65,0x66,0x67,0x68, + 0x69,0x64,0x5B,0x5F,0x5F,0x5E,0x60,0x5E,0x5B,0x5C,0x5F,0x61,0x56,0x56,0x6C,0x75, + 0x77,0x7A,0x6F,0x66,0x6E,0x74,0x71,0x75,0x72,0x70,0x7C,0x80,0x7C,0x7C,0x72,0x69, + 0x70,0x76,0x78,0x7B,0x7A,0x78,0x7A,0x77,0x76,0x80,0x93,0xA8,0xAE,0xB3,0xA8,0x97, + 0x98,0x96,0x92,0x96,0x9D,0x9B,0x9E,0xA1,0x9B,0x97,0x89,0x7E,0x85,0x8C,0x88,0x88, + 0x8A,0x84,0x80,0x85,0x81,0x81,0x8F,0x9C,0x9E,0x9A,0x91,0x81,0x80,0x86,0x82,0x8B, + 0x8E,0x86,0x92,0x97,0x91,0x90,0x8B,0x86,0x8F,0x96,0x95,0x96,0x95,0x8D,0x86,0x88, + 0x80,0x84,0x99,0xA4,0xA4,0xA0,0x99,0x8B,0x86,0x86,0x87,0x8D,0x8E,0x88,0x8C,0x8C, + 0x87,0x8B,0x7F,0x76,0x7C,0x81,0x82,0x7F,0x74,0x64,0x5A,0x56,0x55,0x58,0x6B,0x75, + 0x76,0x74,0x65,0x53,0x4A,0x49,0x52,0x60,0x65,0x62,0x63,0x62,0x60,0x65,0x5D,0x5B, + 0x68,0x6F,0x76,0x76,0x75,0x6E,0x68,0x69,0x63,0x6C,0x79,0x85,0x85,0x83,0x7A,0x69, + 0x6B,0x6C,0x6F,0x79,0x7E,0x81,0x87,0x89,0x8B,0x92,0x92,0x93,0x9D,0xA4,0xA8,0xAB, + 0xA3,0x99,0x91,0x90,0x8F,0x91,0x98,0xA0,0xA2,0x97,0x8C,0x76,0x71,0x74,0x77,0x85, + 0x86,0x89,0x8B,0x89,0x88,0x87,0x80,0x81,0x86,0x8A,0x8E,0x96,0x96,0x8D,0x85,0x82, + 0x85,0x86,0x93,0xA3,0xA6,0xA1,0x99,0x86,0x7D,0x7F,0x84,0x90,0x95,0x98,0x94,0x8D, + 0x8F,0x90,0x8A,0x89,0x8E,0x8F,0x95,0x9A,0x95,0x8E,0x84,0x80,0x7E,0x7D,0x8D,0x9B, + 0x9A,0x92,0x85,0x73,0x66,0x64,0x66,0x6F,0x72,0x72,0x6A,0x62,0x61,0x60,0x5E,0x5B, + 0x5C,0x5D,0x60,0x64,0x63,0x60,0x57,0x51,0x51,0x59,0x68,0x76,0x81,0x7E,0x6E,0x60, + 0x5B,0x57,0x64,0x76,0x77,0x79,0x75,0x72,0x6F,0x6E,0x6E,0x6C,0x6D,0x6D,0x75,0x7A, + 0x7D,0x78,0x76,0x76,0x74,0x7B,0x90,0xA1,0xA6,0xAA,0xA0,0x94,0x8C,0x8F,0x9A,0xA0, + 0xA4,0xA2,0x9B,0x91,0x8F,0x8D,0x88,0x84,0x84,0x82,0x81,0x86,0x88,0x85,0x82,0x7D, + 0x78,0x80,0x91,0x9B,0xA1,0x9E,0x8B,0x7D,0x78,0x7D,0x87,0x91,0x9B,0x98,0x91,0x8C, + 0x8B,0x8E,0x90,0x90,0x8F,0x8F,0x90,0x95,0x95,0x94,0x8F,0x89,0x86,0x8B,0x9B,0xA8, + 0xAA,0x9F,0x91,0x82,0x7A,0x7E,0x86,0x91,0x95,0x90,0x89,0x82,0x82,0x86,0x83,0x80, + 0x79,0x74,0x74,0x71,0x72,0x6E,0x66,0x5C,0x58,0x60,0x6B,0x75,0x75,0x6B,0x5B,0x4E, + 0x4A,0x4E,0x57,0x64,0x6B,0x65,0x61,0x5F,0x62,0x66,0x67,0x67,0x67,0x68,0x6B,0x70, + 0x73,0x70,0x6C,0x68,0x69,0x6E,0x79,0x86,0x87,0x7D,0x71,0x64,0x62,0x6A,0x76,0x82, + 0x86,0x85,0x83,0x81,0x85,0x8B,0x90,0x99,0x9A,0x9A,0x9C,0xA0,0xA0,0x98,0x97,0x8D, + 0x87,0x91,0x9E,0xA1,0x9A,0x8F,0x82,0x74,0x70,0x7B,0x81,0x8C,0x90,0x87,0x84,0x7E, + 0x82,0x87,0x89,0x8A,0x83,0x88,0x8C,0x8B,0x8D,0x89,0x88,0x83,0x87,0x96,0x9E,0xA8, + 0xA4,0x98,0x8A,0x7C,0x7D,0x8A,0x94,0x9A,0x9D,0x94,0x8B,0x8C,0x90,0x91,0x93,0x95, + 0x90,0x8B,0x8E,0x8E,0x89,0x8B,0x89,0x80,0x86,0x8E,0x94,0x97,0x8B,0x7C,0x6D,0x63, + 0x67,0x70,0x78,0x78,0x73,0x6C,0x5E,0x5B,0x5D,0x62,0x67,0x62,0x61,0x5F,0x5F,0x5F, + 0x5D,0x60,0x5B,0x58,0x66,0x6D,0x74,0x7A,0x72,0x68,0x5C,0x59,0x62,0x6F,0x78,0x7B, + 0x77,0x6E,0x68,0x6A,0x72,0x76,0x7B,0x78,0x72,0x74,0x76,0x75,0x76,0x76,0x72,0x75, + 0x86,0x95,0x9F,0xA5,0x9B,0x8F,0x87,0x87,0x93,0xA1,0xA7,0xA5,0x9E,0x91,0x8A,0x89, + 0x8C,0x8F,0x8D,0x8A,0x84,0x82,0x83,0x80,0x82,0x81,0x7A,0x81,0x8B,0x94,0x98,0x97, + 0x8E,0x7C,0x75,0x74,0x83,0x91,0x97,0x99,0x90,0x89,0x85,0x89,0x92,0x96,0x96,0x94, + 0x90,0x8E,0x8E,0x8F,0x93,0x8C,0x88,0x91,0x9C,0xA2,0xA8,0xA4,0x91,0x83,0x7C,0x7E, + 0x8B,0x98,0x9D,0x96,0x8C,0x7F,0x7E,0x7F,0x83,0x85,0x80,0x7B,0x75,0x72,0x70,0x6E, + 0x69,0x62,0x60,0x69,0x72,0x77,0x7A,0x6E,0x5C,0x4E,0x48,0x53,0x64,0x6F,0x75,0x71, + 0x65,0x5E,0x62,0x64,0x67,0x6F,0x6C,0x68,0x69,0x6B,0x6B,0x6B,0x6B,0x66,0x6A,0x78, + 0x81,0x87,0x86,0x76,0x66,0x5E,0x5D,0x68,0x77,0x7F,0x83,0x7B,0x73,0x77,0x7E,0x87, + 0x8F,0x97,0x93,0x91,0x9A,0x98,0x97,0x9A,0x95,0x91,0x94,0x9F,0xA7,0xAA,0xA3,0x90, + 0x7F,0x75,0x74,0x82,0x8C,0x91,0x8F,0x85,0x7D,0x7D,0x81,0x87,0x8D,0x8B,0x88,0x84, + 0x85,0x85,0x85,0x85,0x80,0x80,0x8A,0x96,0xA0,0xA5,0x9B,0x8B,0x7E,0x78,0x82,0x8F, + 0x99,0x9E,0x98,0x8D,0x8A,0x8D,0x90,0x96,0x98,0x93,0x8D,0x8D,0x8E,0x8F,0x8F,0x8C, + 0x84,0x81,0x8C,0x92,0x9B,0x9C,0x8C,0x78,0x69,0x64,0x69,0x77,0x7D,0x7A,0x72,0x67, + 0x60,0x64,0x69,0x6A,0x69,0x65,0x62,0x63,0x68,0x68,0x66,0x63,0x5B,0x5A,0x6A,0x77, + 0x7F,0x81,0x73,0x62,0x58,0x5C,0x64,0x73,0x7B,0x78,0x72,0x6C,0x69,0x6E,0x73,0x74, + 0x74,0x6E,0x6F,0x74,0x74,0x78,0x78,0x76,0x6F,0x76,0x86,0x91,0x9A,0x9C,0x8E,0x7E, + 0x76,0x7A,0x8A,0x99,0x9D,0x98,0x91,0x89,0x8B,0x91,0x94,0x93,0x8D,0x87,0x88,0x8E, + 0x8C,0x8B,0x86,0x80,0x79,0x80,0x90,0x97,0x9C,0x97,0x86,0x75,0x71,0x75,0x83,0x8D, + 0x8C,0x86,0x80,0x7E,0x83,0x87,0x8A,0x88,0x83,0x84,0x88,0x8E,0x8C,0x8A,0x87,0x82, + 0x81,0x8A,0x97,0x9F,0xA1,0x96,0x87,0x79,0x76,0x7D,0x8A,0x90,0x8C,0x85,0x7E,0x7F, + 0x84,0x85,0x86,0x80,0x77,0x78,0x79,0x7C,0x7C,0x77,0x75,0x71,0x6D,0x77,0x82,0x88, + 0x89,0x7D,0x6E,0x64,0x66,0x6D,0x79,0x7E,0x78,0x74,0x70,0x71,0x78,0x7A,0x78,0x76, + 0x70,0x71,0x74,0x77,0x79,0x75,0x71,0x6E,0x68,0x77,0x84,0x88,0x8E,0x80,0x74,0x69, + 0x69,0x72,0x7C,0x82,0x7E,0x7D,0x7B,0x7C,0x83,0x86,0x84,0x81,0x7E,0x80,0x85,0x88, + 0x8A,0x88,0x81,0x7C,0x78,0x82,0x94,0x94,0x99,0x8D,0x7C,0x77,0x70,0x79,0x7F,0x84, + 0x81,0x7B,0x7B,0x7A,0x7E,0x82,0x7F,0x7A,0x78,0x78,0x7C,0x80,0x81,0x7E,0x7B,0x77, + 0x73,0x7E,0x8E,0x93,0x98,0x8E,0x7D,0x7A,0x76,0x7B,0x85,0x8A,0x89,0x84,0x83,0x84, + 0x8A,0x8F,0x8D,0x88,0x84,0x83,0x85,0x88,0x8B,0x89,0x84,0x83,0x7C,0x82,0x93,0x95, + 0x98,0x8F,0x84,0x7D,0x77,0x7F,0x86,0x82,0x83,0x82,0x7B,0x7B,0x82,0x87,0x85,0x85, + 0x81,0x7E,0x7D,0x7F,0x81,0x7E,0x7E,0x7B,0x73,0x78,0x87,0x8B,0x91,0x8C,0x7F,0x7A, + 0x70,0x73,0x7B,0x7C,0x7E,0x7A,0x76,0x78,0x7B,0x80,0x84,0x87,0x82,0x7D,0x7D,0x7D, + 0x80,0x7E,0x81,0x80,0x76,0x7C,0x88,0x90,0x98,0x95,0x87,0x81,0x79,0x79,0x7F,0x81, + 0x85,0x80,0x7B,0x7B,0x7E,0x82,0x85,0x86,0x83,0x7E,0x7C,0x7C,0x7C,0x7A,0x79,0x7A, + 0x72,0x78,0x82,0x86,0x8F,0x8C,0x80,0x7B,0x74,0x76,0x7A,0x7C,0x7E,0x7A,0x78,0x77, + 0x7A,0x80,0x83,0x84,0x83,0x81,0x80,0x81,0x81,0x7F,0x7F,0x7E,0x7A,0x7D,0x87,0x8B, + 0x92,0x91,0x88,0x83,0x7D,0x7C,0x82,0x81,0x81,0x7F,0x7D,0x7B,0x7A,0x81,0x81,0x84, + 0x86,0x82,0x82,0x83,0x80,0x7F,0x7F,0x7E,0x7C,0x7B,0x85,0x87,0x88,0x88,0x81,0x80, + 0x7C,0x7C,0x80,0x81,0x80,0x7D,0x79,0x78,0x78,0x79,0x79,0x7A,0x7C,0x7B,0x7B,0x7B, + 0x7B,0x7E,0x7E,0x7E,0x7D,0x7D,0x84,0x83,0x85,0x86,0x7F,0x80,0x81,0x80,0x85,0x86, + 0x86,0x85,0x81,0x80,0x7D,0x7E,0x7F,0x7F,0x81,0x80,0x7F,0x80,0x80,0x83,0x83,0x83, + 0x82,0x7F,0x86,0x85,0x85,0x87,0x7F,0x7E,0x7E,0x7D,0x83,0x81,0x80,0x7F,0x7A,0x79, + 0x77,0x77,0x76,0x7A,0x7A,0x79,0x7A,0x7B,0x7C,0x7F,0x80,0x80,0x81,0x7D,0x84,0x86, + 0x86,0x89,0x84,0x82,0x84,0x81,0x85,0x87,0x83,0x83,0x80,0x7E,0x7D,0x7C,0x7C,0x7E, + 0x7F,0x7F,0x7F,0x7E,0x7E,0x80,0x82,0x83,0x83,0x80,0x84,0x88,0x84,0x89,0x87,0x82, + 0x85,0x82,0x84,0x87,0x83,0x82,0x81,0x7C,0x7C,0x79,0x7A,0x7B,0x7B,0x7C,0x7B,0x7B, + 0x7C,0x7D,0x7F,0x81,0x80,0x7F,0x80,0x85,0x83,0x85,0x85,0x7F,0x82,0x82,0x80,0x85, + 0x82,0x80,0x80,0x7A,0x7C,0x7B,0x7A,0x7E,0x7C,0x7D,0x7D,0x7B,0x7E,0x7F,0x80,0x83, + 0x82,0x82,0x82,0x85,0x85,0x86,0x87,0x82,0x83,0x84,0x81,0x85,0x84,0x80,0x81,0x7C, + 0x7C,0x7C,0x79,0x7D,0x7B,0x7B,0x7B,0x78,0x7B,0x7D,0x7C,0x7E,0x7F,0x7E,0x7F,0x82, + 0x82,0x82,0x84,0x81,0x80,0x81,0x80,0x83,0x82,0x80,0x80,0x7C,0x7C,0x7D,0x7A,0x7D, + 0x7D,0x7A,0x7C,0x7B,0x7B,0x7E,0x7F,0x81,0x81,0x81,0x81,0x83,0x85,0x86,0x87,0x86, + 0x84,0x86,0x84,0x85,0x86,0x82,0x82,0x80,0x7E,0x80,0x7E,0x7E,0x7E,0x7B,0x7C,0x7C, + 0x7C,0x7E,0x7E,0x80,0x80,0x81,0x81,0x81,0x83,0x84,0x85,0x85,0x82,0x82,0x83,0x82, + 0x83,0x81,0x80,0x7F,0x7D,0x7E,0x7D,0x7C,0x7E,0x7C,0x7A,0x7C,0x7A,0x7C,0x7F,0x7E, + 0x7F,0x80,0x81,0x80,0x82,0x84,0x83,0x85,0x85,0x83,0x84,0x83,0x84,0x84,0x82,0x83, + 0x80,0x7F,0x81,0x7E,0x7D,0x7E,0x7B,0x7B,0x7C,0x7D,0x7E,0x7D,0x7E,0x7F,0x80,0x81, + 0x80,0x82,0x83,0x83,0x86,0x84,0x82,0x83,0x82,0x83,0x83,0x81,0x81,0x7F,0x7F,0x7F, + 0x7C,0x7C,0x7C,0x79,0x7B,0x7C,0x7B,0x7B,0x7C,0x7D,0x7D,0x7F,0x7F,0x7D,0x81,0x84, + 0x84,0x86,0x84,0x82,0x83,0x83,0x85,0x85,0x83,0x83,0x81,0x80,0x80,0x7E,0x7F,0x7D, + 0x7C,0x7F,0x7D,0x7E,0x80,0x7F,0x7E,0x80,0x81,0x80,0x80,0x83,0x83,0x84,0x85,0x82, + 0x81,0x82,0x82,0x85,0x85,0x83,0x82,0x80,0x7F,0x7F,0x7E,0x7E,0x7E,0x7C,0x7E,0x7D, + 0x7D,0x7F,0x7E,0x7C,0x7D,0x7F,0x80,0x82,0x81,0x82,0x82,0x82,0x84,0x82,0x84,0x84, + 0x84,0x86,0x83,0x81,0x80,0x80,0x80,0x80,0x7E,0x7E,0x7E,0x7E,0x7C,0x7D,0x7E,0x7C, + 0x8D,0x80,0x83,0x82,0x65,0x7F,0x7F,0x6B,0x6B,0x7B,0x83,0x89,0x8E,0x8E,0x8F,0x8A, + 0x97,0xA3,0x9E,0xA8,0xA3,0x91,0x88,0x76,0x82,0x8C,0x69,0x62,0x71,0x63,0x51,0x52, + 0x49,0x52,0x6D,0x6A,0x5D,0x50,0x63,0x73,0x6B,0x71,0x7B,0x99,0x8E,0x8A,0xA7,0x91, + 0x9C,0xA6,0x9B,0x9F,0xA7,0xAB,0x95,0xAA,0xAF,0x9C,0xA6,0xA3,0x85,0x88,0x8F,0x7E, + 0x7D,0x5B,0x6E,0x8E,0x77,0x76,0x6D,0x77,0x79,0x72,0x78,0x78,0x79,0x65,0x55,0x5D, + 0x51,0x59,0x6A,0x60,0x67,0x6F,0x65,0x64,0x7A,0x78,0x77,0x80,0x93,0x99,0x96,0xA5, + 0x9F,0xA4,0xA2,0x9B,0xA9,0xAC,0xA9,0x99,0x91,0xA2,0x9D,0x9D,0x9F,0x94,0x9A,0x95, + 0x92,0x91,0x7E,0x7C,0x74,0x76,0x73,0x6F,0x5F,0x45,0x47,0x4A,0x5A,0x5F,0x4C,0x37, + 0x40,0x45,0x34,0x38,0x3F,0x4B,0x58,0x61,0x6B,0x6C,0x7D,0x8E,0xA4,0xAE,0x99,0x8C, + 0x9A,0xA1,0x9A,0xA3,0xA0,0xA9,0xBF,0xCB,0xD1,0xC1,0xBA,0xAC,0xAE,0xA7,0x90,0x80, + 0x74,0x82,0x82,0x83,0x89,0x6F,0x69,0x6D,0x64,0x76,0x78,0x5B,0x57,0x5C,0x68,0x6D, + 0x5B,0x5C,0x65,0x6F,0x75,0x6E,0x69,0x68,0x7E,0x86,0x7C,0x7B,0x7C,0x93,0x9D,0x91, + 0x91,0x99,0x9A,0x9F,0x97,0x96,0xA7,0x9E,0x9D,0xA5,0x97,0xA4,0xA9,0x8D,0xA4,0xAF, + 0xA8,0xAE,0x98,0x94,0x93,0x89,0x8C,0x88,0x7E,0x79,0x69,0x57,0x5B,0x61,0x60,0x60, + 0x5B,0x66,0x6B,0x56,0x4A,0x38,0x3A,0x52,0x56,0x59,0x5B,0x59,0x62,0x57,0x47,0x57, + 0x55,0x50,0x4A,0x46,0x5A,0x61,0x75,0x79,0x7E,0xA2,0xB2,0xB5,0x9F,0x92,0xA3,0xA1, + 0xA4,0xA7,0xA6,0xB8,0xA3,0x91,0x99,0x9A,0xA1,0x96,0x97,0x98,0x88,0x97,0xA1,0xA2, + 0xA9,0xAC,0xB0,0xAD,0xA1,0x98,0x8D,0x74,0x66,0x63,0x71,0x85,0x72,0x63,0x5C,0x51, + 0x5B,0x64,0x62,0x67,0x69,0x6C,0x6F,0x63,0x5B,0x56,0x5F,0x71,0x74,0x83,0x8A,0x80, + 0x8B,0x91,0x83,0x79,0x83,0x8D,0x8E,0x9A,0x98,0x86,0x91,0x8E,0x7B,0x97,0xAB,0x9C, + 0xA4,0x9F,0x90,0x97,0x85,0x88,0x92,0x8E,0xA2,0x9E,0x97,0x9B,0x94,0x8C,0x8A,0x8D, + 0x85,0x8A,0x95,0x8E,0x83,0x79,0x7D,0x80,0x77,0x81,0x97,0x8C,0x83,0x73,0x5A,0x59, + 0x59,0x61,0x5D,0x55,0x65,0x66,0x60,0x5A,0x4D,0x59,0x66,0x64,0x68,0x6A,0x60,0x54, + 0x50,0x51,0x61,0x74,0x6B,0x62,0x6A,0x70,0x74,0x6B,0x5A,0x5C,0x6E,0x79,0x75,0x77, + 0x83,0x81,0x79,0x73,0x77,0x84,0x8E,0x96,0x95,0x95,0x97,0x99,0x99,0x9F,0xAC,0xAC, + 0xA1,0xA0,0xAD,0xBC,0xC3,0xC3,0xB6,0xBA,0xD2,0xD1,0xCA,0xC8,0xC1,0xCA,0xCD,0xC2, + 0xBC,0xBF,0xBA,0xB9,0xBF,0xB8,0xAB,0x96,0x97,0xA1,0x9F,0x9B,0x8D,0x86,0x85,0x81, + 0x77,0x5D,0x4C,0x40,0x43,0x3D,0x3D,0x47,0x43,0x4C,0x4E,0x41,0x40,0x49,0x4D,0x50, + 0x50,0x49,0x46,0x43,0x44,0x4F,0x4A,0x48,0x45,0x2D,0x4D,0x65,0x55,0x55,0x4A,0x51, + 0x5D,0x62,0x64,0x68,0x73,0x7E,0x84,0x79,0x7C,0x87,0x8B,0x9F,0xA6,0xA7,0xA9,0x9F, + 0x9F,0xA5,0xA8,0x9E,0x9C,0x9B,0x90,0xA4,0xA9,0x95,0x95,0x97,0x9A,0x9D,0x99,0x99, + 0xAC,0xB2,0xA3,0x8E,0x87,0x95,0xA5,0xAC,0x9B,0x8D,0x94,0x96,0x9C,0x9B,0x93,0x8E, + 0x85,0x80,0x80,0x83,0x90,0x92,0x82,0x7F,0x89,0x92,0x90,0x8C,0x8E,0x98,0x99,0x84, + 0x82,0x86,0x8B,0x8B,0x80,0x81,0x84,0x9B,0x94,0x84,0x87,0x7D,0x85,0x85,0x6B,0x5C, + 0x62,0x61,0x65,0x63,0x57,0x5B,0x5D,0x56,0x53,0x62,0x5F,0x4D,0x45,0x45,0x59,0x5B, + 0x58,0x61,0x62,0x5F,0x5E,0x62,0x63,0x6C,0x71,0x66,0x5A,0x53,0x60,0x7B,0x7B,0x71, + 0x66,0x65,0x7B,0x7A,0x77,0x8A,0x9A,0xA0,0xA2,0x98,0x9E,0xAF,0xA9,0xAB,0xAF,0xAD, + 0xA6,0x93,0x85,0x97,0xAB,0xA9,0x9B,0x8E,0x88,0x95,0xA7,0x97,0x7D,0x75,0x7F,0x88, + 0x81,0x7B,0x82,0x83,0x85,0x7D,0x6B,0x7B,0x92,0x98,0x99,0x94,0x85,0x7F,0x7A,0x79, + 0x82,0x7B,0x78,0x7B,0x79,0x85,0x92,0x8D,0x81,0x7C,0x80,0x89,0x86,0x78,0x7A,0x88, + 0x8F,0x88,0x78,0x7A,0x8B,0x8F,0x93,0x93,0x84,0x7E,0x74,0x6A,0x72,0x77,0x73,0x66, + 0x60,0x61,0x6F,0x7F,0x7B,0x71,0x65,0x5B,0x5C,0x5A,0x5C,0x75,0x81,0x71,0x62,0x5F, + 0x64,0x77,0x83,0x7A,0x74,0x75,0x75,0x6D,0x60,0x62,0x6E,0x6A,0x6C,0x71,0x6A,0x7E, + 0x8F,0x86,0x85,0x81,0x82,0x8F,0x8D,0x94,0xAB,0xA8,0x9E,0x9E,0x99,0xA0,0xAC,0xAC, + 0xA7,0xA7,0xA0,0x8C,0x7D,0x78,0x80,0x88,0x7C,0x76,0x77,0x71,0x8A,0x9A,0x89,0x83, + 0x7C,0x77,0x7E,0x78,0x7E,0x8F,0x87,0x7A,0x78,0x70,0x76,0x85,0x86,0x8F,0x91,0x85, + 0x7C,0x77,0x7B,0x8E,0x8B,0x7B,0x7C,0x76,0x77,0x99,0x9D,0x85,0x80,0x7C,0x87,0x8E, + 0x7F,0x82,0x8C,0x84,0x7C,0x71,0x63,0x6B,0x79,0x7D,0x7C,0x7B,0x76,0x68,0x6B,0x78, + 0x7A,0x71,0x67,0x67,0x64,0x6A,0x84,0x89,0x76,0x73,0x6D,0x69,0x6B,0x64,0x6D,0x7D, + 0x71,0x69,0x5D,0x53,0x69,0x7A,0x78,0x77,0x72,0x6C,0x6D,0x6B,0x6D,0x75,0x75,0x71, + 0x78,0x75,0x75,0x90,0x9A,0x91,0x8F,0x8F,0x93,0xA0,0xA5,0xAE,0xBA,0xAE,0x9F,0x9C, + 0x9C,0xA5,0xAC,0xA2,0x9F,0xA0,0x99,0x99,0x93,0x96,0x9C,0x95,0x91,0x93,0x8C,0x88, + 0xA3,0xA7,0x91,0x88,0x80,0x85,0x92,0x8E,0x8E,0x96,0x95,0x8D,0x7F,0x79,0x86,0x8D, + 0x88,0x8C,0x8E,0x86,0x7F,0x83,0x88,0x89,0x90,0x87,0x7E,0x7A,0x73,0x8C,0x8E,0x79, + 0x6D,0x65,0x72,0x76,0x6F,0x73,0x7D,0x78,0x71,0x64,0x47,0x5E,0x7E,0x78,0x63,0x63, + 0x6E,0x4E,0x4F,0x63,0x61,0x5B,0x5B,0x6A,0x5C,0x51,0x68,0x73,0x63,0x54,0x56,0x4E, + 0x48,0x46,0x54,0x68,0x68,0x5F,0x5B,0x55,0x55,0x6A,0x66,0x5B,0x63,0x66,0x66,0x65, + 0x6B,0x72,0x76,0x7B,0x84,0x87,0x83,0x96,0xAF,0xB3,0xAD,0x9F,0x9D,0xA9,0xAA,0xA8, + 0xBE,0xBF,0xA4,0xA0,0x9E,0xA7,0xB6,0xAA,0x9F,0xA0,0xA2,0x9D,0x93,0x95,0x9C,0xA2, + 0xA0,0x94,0x95,0x95,0x97,0xB0,0xBA,0xAC,0x9C,0x95,0x9F,0xAB,0xA9,0xAF,0xB4,0xAA, + 0xA2,0x9A,0x9C,0xA9,0xAD,0xA2,0x9B,0xA3,0x9F,0x94,0x91,0x96,0x9A,0x92,0x90,0x8E, + 0x89,0x81,0x83,0x96,0x8B,0x77,0x72,0x71,0x81,0x86,0x7E,0x7F,0x7B,0x70,0x65,0x60, + 0x6A,0x6F,0x64,0x5C,0x5B,0x5A,0x57,0x55,0x50,0x53,0x50,0x4A,0x47,0x42,0x3B,0x37, + 0x4D,0x59,0x48,0x40,0x36,0x38,0x44,0x40,0x3D,0x49,0x46,0x35,0x33,0x3A,0x48,0x50, + 0x4B,0x52,0x5B,0x5F,0x62,0x62,0x6C,0x7E,0x83,0x83,0x87,0x88,0x83,0x8A,0xA7,0xA8, + 0x91,0x88,0x89,0x98,0xA0,0x93,0x98,0xA1,0x93,0x8F,0x8B,0x8B,0x94,0x8E,0x90,0x99, + 0x97,0x8D,0x89,0x8D,0x9B,0xA0,0x9A,0x9E,0xA0,0x9F,0x96,0x9F,0xC0,0xBA,0xA3,0xA7, + 0xA8,0xB0,0xB0,0xA3,0xB0,0xBB,0xB2,0xAA,0xA3,0xA9,0xB4,0xAF,0xAA,0xA8,0xA2,0xA2, + 0x9E,0x9F,0xA4,0x9E,0x9C,0x98,0x95,0x96,0x8B,0x98,0xAD,0x9A,0x85,0x82,0x80,0x86, + 0x82,0x7C,0x83,0x7F,0x6E,0x65,0x60,0x67,0x69,0x60,0x5E,0x5D,0x5C,0x54,0x4D,0x55, + 0x5A,0x58,0x55,0x52,0x55,0x56,0x4E,0x5A,0x72,0x64,0x53,0x54,0x54,0x59,0x59,0x59, + 0x68,0x6E,0x68,0x63,0x65,0x75,0x81,0x80,0x82,0x87,0x89,0x86,0x83,0x89,0x8A,0x84, + 0x83,0x82,0x85,0x80,0x71,0x7C,0x94,0x8D,0x7C,0x76,0x75,0x7C,0x7B,0x77,0x80,0x80, + 0x7B,0x74,0x72,0x7C,0x80,0x7E,0x7D,0x82,0x89,0x86,0x82,0x85,0x8C,0x8D,0x8F,0x90, + 0x8C,0x8B,0x84,0x8D,0xA9,0xA6,0x8F,0x88,0x8B,0x94,0x91,0x89,0x92,0x9A,0x91,0x84, + 0x82,0x89,0x92,0x91,0x8E,0x8E,0x90,0x8C,0x7E,0x85,0x8F,0x8C,0x85,0x7E,0x7B,0x7F, + 0x7D,0x72,0x83,0x90,0x7B,0x6C,0x67,0x66,0x67,0x62,0x65,0x6D,0x69,0x5A,0x55,0x58, + 0x60,0x5D,0x59,0x5A,0x60,0x65,0x5A,0x5B,0x63,0x64,0x66,0x66,0x69,0x6B,0x6D,0x65, + 0x73,0x94,0x8D,0x79,0x7E,0x8A,0x91,0x90,0x8A,0x9A,0xA7,0x98,0x8E,0x91,0x96,0x98, + 0x93,0x91,0x93,0x92,0x8A,0x84,0x88,0x8A,0x86,0x82,0x82,0x89,0x89,0x7F,0x78,0x8F, + 0x9F,0x8A,0x7F,0x81,0x87,0x8B,0x86,0x8E,0x9A,0x95,0x89,0x85,0x8F,0x99,0x98,0x95, + 0x98,0x9F,0x9D,0x96,0x96,0x99,0x9A,0x9A,0x98,0x94,0x90,0x8E,0x86,0x8A,0xA8,0xA4, + 0x88,0x85,0x87,0x88,0x84,0x80,0x8C,0x93,0x86,0x78,0x7B,0x82,0x80,0x7E,0x7F,0x7E, + 0x80,0x78,0x6E,0x72,0x75,0x74,0x6E,0x6A,0x6F,0x70,0x6A,0x5B,0x62,0x81,0x78,0x5E, + 0x5D,0x60,0x63,0x60,0x5D,0x6C,0x74,0x66,0x60,0x65,0x6F,0x71,0x6E,0x74,0x7C,0x7E, + 0x79,0x77,0x7C,0x7F,0x82,0x83,0x83,0x88,0x86,0x81,0x78,0x83,0x9E,0x92,0x7C,0x80, + 0x82,0x7E,0x78,0x7B,0x8B,0x8F,0x7F,0x76,0x7A,0x82,0x83,0x7D,0x7D,0x85,0x85,0x80, + 0x7C,0x81,0x87,0x84,0x83,0x85,0x8A,0x86,0x82,0x7C,0x82,0x9F,0x98,0x7F,0x82,0x87, + 0x89,0x86,0x83,0x8F,0x97,0x8B,0x7F,0x82,0x8A,0x8A,0x85,0x87,0x8D,0x8C,0x84,0x82, + 0x85,0x86,0x83,0x83,0x83,0x86,0x88,0x83,0x7A,0x79,0x96,0x99,0x7F,0x7B,0x7F,0x7E, + 0x80,0x7D,0x82,0x8C,0x83,0x75,0x76,0x7D,0x7C,0x77,0x79,0x7F,0x7F,0x77,0x71,0x74, + 0x76,0x75,0x76,0x77,0x7B,0x7A,0x75,0x72,0x6F,0x84,0x93,0x7E,0x78,0x7F,0x7C,0x7C, + 0x7B,0x82,0x8E,0x8C,0x80,0x7E,0x86,0x87,0x82,0x83,0x88,0x8B,0x86,0x7F,0x80,0x85, + 0x83,0x81,0x82,0x85,0x83,0x7D,0x7B,0x76,0x7D,0x95,0x89,0x75,0x7C,0x7B,0x75,0x73, + 0x74,0x83,0x89,0x7A,0x72,0x79,0x7A,0x78,0x79,0x7F,0x84,0x84,0x7F,0x7D,0x84,0x83, + 0x7E,0x82,0x85,0x86,0x83,0x7E,0x7F,0x79,0x8A,0x9F,0x86,0x7C,0x88,0x81,0x7C,0x7A, + 0x7E,0x8A,0x87,0x78,0x7A,0x80,0x7B,0x7A,0x7E,0x83,0x85,0x82,0x7D,0x7E,0x81,0x7D, + 0x7E,0x83,0x83,0x83,0x7F,0x7E,0x7B,0x75,0x8E,0x96,0x7D,0x7D,0x82,0x77,0x76,0x78, + 0x7D,0x86,0x7D,0x75,0x7C,0x7F,0x7A,0x79,0x7C,0x81,0x83,0x7E,0x7B,0x7F,0x7E,0x7B, + 0x7F,0x85,0x86,0x83,0x80,0x83,0x7E,0x7A,0x95,0x96,0x7B,0x83,0x86,0x7A,0x7B,0x7C, + 0x84,0x8E,0x81,0x78,0x80,0x80,0x7B,0x7B,0x7E,0x84,0x82,0x7C,0x7C,0x7F,0x7D,0x7B, + 0x7C,0x7E,0x7E,0x7D,0x7C,0x7B,0x75,0x74,0x90,0x90,0x75,0x7E,0x84,0x7A,0x76,0x7C, + 0x86,0x8B,0x84,0x72,0x7D,0x87,0x7C,0x7F,0x87,0x8A,0x88,0x89,0x87,0x8A,0x86,0x7C, + 0x84,0x86,0x84,0x84,0x80,0x83,0x7D,0x73,0x8F,0x94,0x79,0x80,0x86,0x78,0x72,0x73, + 0x7F,0x89,0x81,0x7C,0x84,0x82,0x79,0x79,0x7F,0x84,0x80,0x7D,0x7F,0x84,0x80,0x79, + 0x7D,0x80,0x7F,0x80,0x7D,0x7E,0x7B,0x6F,0x89,0x96,0x77,0x7C,0x8B,0x79,0x76,0x7A, + 0x7E,0x8C,0x85,0x78,0x83,0x88,0x7A,0x78,0x84,0x89,0x83,0x82,0x85,0x86,0x82,0x7B, + 0x85,0x83,0x7C,0x7F,0x82,0x81,0x7C,0x73,0x7F,0x9B,0x81,0x73,0x8F,0x82,0x72,0x76, + 0x80,0x89,0x84,0x77,0x7D,0x88,0x74,0x6E,0x7C,0x78,0x73,0x77,0x79,0x7E,0x80,0x75, + 0x7F,0x8C,0x81,0x86,0x8E,0x88,0x8B,0x80,0x80,0x9C,0x88,0x6A,0x84,0x80,0x69,0x73, + 0x79,0x80,0x88,0x73,0x77,0x98,0x8B,0x72,0x80,0x91,0x84,0x77,0x71,0x7C,0x8F,0x7C, + 0x70,0x8A,0x95,0x83,0x74,0x79,0x89,0x7A,0x65,0x8C,0x9B,0x82,0x85,0x81,0x68,0x70, + 0x83,0x7A,0x7A,0x77,0x7B,0x7D,0x6F,0x77,0x8B,0x88,0x74,0x7D,0x94,0x9D,0x8D,0x74, + 0x77,0x90,0x8B,0x77,0x82,0x83,0x7D,0x82,0x6D,0x7A,0xA2,0x7B,0x64,0x96,0x91,0x6A, + 0x68,0x7B,0x93,0x83,0x68,0x84,0xA4,0x83,0x6B,0x8A,0x8C,0x6E,0x6B,0x87,0x8D,0x75, + 0x6E,0x7E,0x88,0x7F,0x83,0x87,0x77,0x72,0x6F,0x79,0x98,0x8D,0x77,0x8B,0x82,0x70, + 0x82,0x84,0x7E,0x79,0x76,0x81,0x78,0x6F,0x7D,0x90,0x8D,0x8F,0x8F,0x76,0x68,0x76, + 0x7C,0x87,0x9B,0x80,0x82,0x99,0x88,0x7C,0x97,0x84,0x62,0x8E,0x75,0x6A,0x91,0x74, + 0x69,0x76,0x72,0x6F,0x66,0x77,0x88,0x91,0xAC,0xA5,0xAA,0xAF,0x96,0x6C,0x6F,0x80, + 0x5E,0x5C,0x6F,0x73,0x6B,0x7E,0x93,0x99,0x9D,0x95,0x92,0x7F,0x5B,0x49,0x5A,0x81, + 0x91,0x80,0x76,0x77,0x81,0x7D,0x85,0x93,0x92,0x96,0x8F,0x84,0x93,0x98,0x8A,0x9F, + 0xA8,0x9C,0x8D,0x6D,0x68,0x70,0x7C,0x76,0x5A,0x5B,0x6F,0x69,0x6F,0x8C,0x7D,0x5C, + 0x77,0x87,0x73,0x7E,0x78,0x7A,0x99,0xA2,0x96,0x90,0x82,0x6E,0x8B,0xAE,0x9C,0x80, + 0x79,0x83,0x82,0x72,0x8B,0x95,0x71,0x6E,0x72,0x76,0x71,0x6A,0x7C,0x7E,0x89,0x93, + 0x77,0x6F,0x72,0x69,0x75,0x86,0x7D,0x70,0x6B,0x73,0x8B,0x9C,0xA3,0xA1,0x98,0x99, + 0x88,0x76,0x6E,0x80,0x92,0x89,0x95,0x95,0x7A,0x64,0x77,0x84,0x78,0x76,0x60,0x6C, + 0x88,0x70,0x6F,0x89,0x74,0x6E,0x7E,0x65,0x76,0x98,0x84,0x7F,0x8C,0x7D,0x7D,0x93, + 0x8E,0x9C,0xAF,0x9A,0x90,0x99,0x8A,0x7B,0x7C,0x7C,0x72,0x70,0x7C,0x73,0x67,0x69, + 0x7B,0x88,0x9F,0xA1,0x88,0x94,0x8E,0x67,0x6A,0x7C,0x7B,0x74,0x5F,0x68,0x78,0x66, + 0x6D,0x8F,0x82,0x76,0x8F,0x88,0x8E,0x92,0x7E,0x92,0x88,0x79,0x93,0x81,0x62,0x6F, + 0x95,0x9F,0x89,0x80,0x75,0x71,0x81,0x85,0xA2,0xA6,0x84,0x92,0x90,0x73,0x6A,0x6B, + 0x6B,0x68,0x71,0x72,0x76,0x6A,0x65,0x83,0x91,0x89,0x82,0x8D,0x88,0x86,0x90,0x94, + 0x89,0x7D,0x88,0x87,0x80,0x6E,0x6E,0x89,0x80,0x78,0x96,0x92,0x6F,0x72,0x7A,0x8D, + 0xA0,0x89,0x82,0x7D,0x71,0x75,0x8B,0x9D,0x84,0x91,0xAF,0x97,0x8E,0x82,0x7E,0x94, + 0x8B,0x81,0x81,0x66,0x54,0x64,0x6E,0x68,0x5E,0x65,0x67,0x69,0x71,0x71,0x87,0x87, + 0x85,0x93,0x85,0x7E,0x7D,0x7D,0x92,0x87,0x83,0x94,0x82,0x79,0x8A,0x99,0x99,0x8D, + 0x82,0x92,0x91,0x82,0x94,0x9D,0x87,0x6A,0x75,0x74,0x5A,0x6E,0x7A,0x7D,0x87,0x88, + 0x90,0x7A,0x63,0x74,0x87,0x80,0x71,0x7F,0x82,0x79,0x7D,0x7A,0x86,0x8F,0x8A,0x8C, + 0x94,0x85,0x78,0x96,0xA4,0x96,0x94,0x93,0x83,0x6E,0x6D,0x80,0x8D,0x8C,0x7F,0x74, + 0x6B,0x5D,0x69,0x81,0x77,0x6F,0x76,0x6E,0x75,0x76,0x86,0xA2,0x9D,0x99,0x9A,0x8B, + 0x61,0x59,0x78,0x84,0x74,0x75,0x86,0x7B,0x69,0x75,0x8F,0x88,0x7E,0x87,0x88,0x78, + 0x62,0x6B,0x7A,0x83,0x7B,0x84,0x90,0x77,0x74,0x73,0x7C,0x86,0x8F,0x98,0xA0,0x93, + 0x88,0x9B,0x91,0x7C,0x80,0x8E,0x82,0x7A,0x7C,0x88,0xA5,0xA4,0x92,0x94,0x83,0x6E, + 0x7E,0x7F,0x68,0x6F,0x6B,0x5E,0x6B,0x5D,0x67,0x7F,0x69,0x7A,0x82,0x6B,0x69,0x75, + 0x90,0x8F,0x8A,0x8E,0x88,0x7D,0x75,0x7C,0x87,0x96,0x8A,0x80,0x7E,0x74,0x89,0x90, + 0x88,0x7D,0x7F,0x92,0x86,0x75,0x79,0x75,0x7C,0x7D,0x76,0x7F,0x6D,0x56,0x67,0x88, + 0x8D,0x7A,0x80,0x81,0x7D,0x7D,0x76,0x84,0x99,0xA8,0xAF,0x9F,0x7F,0x67,0x6E,0x75, + 0x6F,0x7A,0x91,0x7F,0x75,0x86,0x80,0x86,0x7D,0x7F,0x8E,0x8A,0x79,0x74,0x77,0x62, + 0x64,0x75,0x77,0x6C,0x76,0x7C,0x80,0xA1,0x9C,0xA1,0x9A,0x73,0x87,0x94,0x8B,0x81, + 0x80,0x78,0x70,0x6F,0x6A,0x71,0x73,0x82,0x9A,0xA4,0x8D,0x7E,0x8B,0x97,0x9F,0x87, + 0x7E,0x7F,0x63,0x55,0x5A,0x73,0x7E,0x72,0x6A,0x69,0x6C,0x73,0x87,0x8E,0x82,0x89, + 0x98,0x8E,0x8C,0x85,0x7B,0x97,0x8C,0x7E,0x89,0x6E,0x60,0x77,0x8A,0x7C,0x75,0x75, + 0x70,0x7D,0x6F,0x6F,0x80,0x84,0x94,0x92,0x82,0x7C,0x78,0x76,0x87,0x97,0x96,0x85, + 0x77,0x69,0x6D,0x7B,0x88,0x99,0x90,0x94,0x9C,0x84,0x81,0x7D,0x62,0x6C,0x7E,0x7E, + 0x78,0x75,0x74,0x81,0x95,0xA6,0x9D,0x81,0x79,0x6F,0x75,0x76,0x71,0x74,0x74,0x82, + 0x6B,0x68,0x7D,0x75,0x84,0x9A,0x91,0x82,0x7C,0x7F,0x94,0xA3,0x93,0x88,0x7E,0x73, + 0x72,0x63,0x72,0x96,0x93,0x8B,0x95,0x99,0x9A,0x9A,0x7E,0x7D,0x9B,0x86,0x75,0x77, + 0x67,0x6F,0x78,0x82,0x80,0x6F,0x76,0x5D,0x65,0x7F,0x71,0x7F,0x7A,0x78,0x7E,0x72, + 0x83,0x85,0x85,0xA0,0x8B,0x6E,0x83,0x70,0x71,0x8C,0x87,0x8C,0x7F,0x76,0x78,0x79, + 0x86,0x97,0xA0,0x8C,0x82,0x7B,0x71,0x89,0x80,0x71,0x7F,0x84,0x88,0x83,0x72,0x76, + 0x88,0x94,0xA9,0x98,0x8A,0x86,0x6A,0x73,0x71,0x6D,0x74,0x6D,0x75,0x69,0x68,0x7C, + 0x7F,0x98,0xA8,0x92,0x81,0x79,0x80,0x92,0x9C,0x9E,0x94,0x78,0x70,0x67,0x57,0x73, + 0x8F,0x85,0x74,0x83,0x88,0x81,0x86,0x7A,0x83,0x9A,0x8B,0x85,0x86,0x73,0x70,0x7E, + 0x95,0x99,0x81,0x88,0x8D,0x94,0x98,0x8F,0x92,0x7F,0x86,0x7B,0x6D,0x76,0x6D,0x87, + 0x8C,0x78,0x7D,0x55,0x43,0x78,0x8E,0x7A,0x77,0x86,0x73,0x6F,0x7F,0x85,0x99,0xA4, + 0xA7,0x92,0x68,0x72,0x86,0x6E,0x60,0x74,0x77,0x72,0x6F,0x67,0x78,0x8E,0xA4,0xA9, + 0x88,0x7A,0x85,0x75,0x79,0x89,0x89,0x88,0x7F,0x82,0x75,0x79,0x78,0x7E,0xA1,0x9C, + 0x8A,0x87,0x79,0x81,0x9E,0x96,0x90,0x7E,0x5F,0x6D,0x70,0x62,0x87,0xA6,0x81,0x84, + 0x98,0x78,0x75,0x72,0x63,0x7C,0x88,0x76,0x7A,0x7C,0x65,0x5E,0x75,0x8E,0x89,0x77, + 0x79,0x82,0x82,0x8E,0x94,0x84,0x97,0x9E,0x83,0x74,0x70,0x7D,0x88,0x88,0x82,0x7E, + 0x75,0x71,0x8D,0xA3,0xA8,0x9D,0x81,0x7F,0x85,0x73,0x74,0x86,0x76,0x6C,0x76,0x6B, + 0x65,0x62,0x5E,0x5F,0x70,0x6C,0x64,0x76,0x7A,0x80,0x97,0xAA,0xA4,0x8D,0x8A,0x8B, + 0x7E,0x77,0x79,0x7C,0x7C,0x80,0x79,0x73,0x7A,0x7A,0x6F,0x87,0x96,0x76,0x71,0x6E, + 0x87,0xA4,0x8F,0x94,0x8A,0x6E,0x76,0x73,0x76,0x99,0x9F,0x82,0x89,0x99,0x82,0x6F, + 0x6F,0x75,0x79,0x7C,0x76,0x76,0x75,0x71,0x74,0x90,0x9F,0x8B,0x81,0x82,0x81,0x7A, + 0x87,0x86,0x83,0x94,0x87,0x78,0x62,0x62,0x78,0x7C,0x7E,0x79,0x76,0x62,0x59,0x76, + 0x8E,0x98,0x99,0x87,0x89,0x96,0x81,0x82,0x8F,0x83,0x81,0x87,0x86,0x81,0x85,0x83, + 0x7E,0x96,0x99,0x89,0x89,0x75,0x73,0x85,0x93,0x91,0x7F,0x79,0x77,0x6A,0x5D,0x6A, + 0x6A,0x6E,0x7A,0x77,0x79,0x73,0x72,0x7B,0x8B,0x90,0x8B,0x85,0x70,0x86,0x91,0x7B, + 0x85,0x72,0x6A,0x79,0x67,0x6E,0x92,0x8D,0x84,0xA0,0x9F,0x89,0x7C,0x74,0x7D,0x82, + 0x89,0x8A,0x8D,0x88,0x73,0x79,0x8D,0x99,0x8A,0x7F,0x79,0x7A,0x80,0x7E,0x87,0x7E, + 0x80,0x82,0x6B,0x5D,0x70,0x73,0x73,0x87,0x8F,0x8B,0x76,0x6C,0x7D,0x8D,0x94,0x99, + 0x88,0x8A,0x94,0x7C,0x80,0x82,0x74,0x7C,0x7A,0x71,0x6F,0x68,0x60,0x68,0x81,0x90, + 0xA0,0x8D,0x70,0x81,0x8A,0x8D,0x96,0x8F,0x83,0x82,0x79,0x73,0x83,0x84,0x8E,0xA3, + 0xA0,0x92,0x89,0x86,0x7E,0x8B,0x91,0x83,0x6C,0x5D,0x75,0x74,0x6E,0x73,0x69,0x70, + 0x74,0x65,0x71,0x93,0x7E,0x77,0x9D,0xA0,0x8B,0x7E,0x76,0x6E,0x69,0x6E,0x79,0x81, + 0x71,0x67,0x73,0x7A,0x81,0x95,0x8D,0x78,0x88,0x8A,0x8B,0x98,0x84,0x97,0xA1,0x79, + 0x71,0x7C,0x80,0x70,0x71,0x85,0x82,0x67,0x69,0x83,0x7D,0x8D,0x8F,0x83,0x8F,0x7B, + 0x72,0x8B,0x82,0x6F,0x91,0x9F,0x8A,0x93,0x80,0x6F,0x72,0x6A,0x7A,0x98,0x81,0x68, + 0x80,0x83,0x86,0x93,0x97,0x86,0x6F,0x62,0x64,0x74,0x69,0x70,0x91,0x97,0x94,0x90, + 0x95,0x96,0x84,0x8E,0x95,0x7B,0x69,0x6E,0x73,0x79,0x82,0x8A,0x8E,0x8D,0x8B,0x92, + 0xA7,0x90,0x81,0x9A,0x9B,0x8C,0x7A,0x6A,0x5E,0x52,0x58,0x73,0x85,0x71,0x63,0x6E, + 0x6A,0x70,0x88,0x93,0x89,0x7F,0x7F,0x91,0x95,0x74,0x7E,0x8C,0x70,0x69,0x76,0x81, + 0x6B,0x6C,0x93,0x97,0x81,0x74,0x8A,0x90,0x85,0x92,0x9A,0x9E,0x8D,0x77,0x7D,0x85, + 0x69,0x6F,0x97,0x8B,0x82,0x89,0x77,0x6B,0x69,0x7C,0x94,0x89,0x72,0x78,0x7C,0x71, + 0x85,0xA0,0x9E,0x7C,0x6F,0x82,0x86,0x80,0x70,0x7F,0x8A,0x7D,0x82,0x8B,0x8A,0x81, + 0x91,0x97,0x8B,0x77,0x60,0x67,0x6E,0x67,0x7E,0x8E,0x7A,0x80,0x83,0x88,0x8D,0x85, + 0x90,0x9D,0x91,0x7C,0x80,0x6F,0x54,0x5A,0x77,0x90,0x95,0x80,0x87,0x90,0x81,0x92, + 0xAA,0xA5,0x90,0x84,0x86,0x89,0x80,0x6E,0x75,0x6F,0x64,0x74,0x66,0x63,0x64,0x6D, + 0x8B,0x80,0x73,0x7B,0x85,0x80,0x86,0x97,0x90,0x7F,0x6D,0x70,0x6C,0x66,0x77,0x7E, + 0x8A,0x97,0x95,0x8D,0x7D,0x6C,0x75,0x83,0x87,0x92,0x8D,0x78,0x6B,0x71,0x90,0x9A, + 0x8A,0x78,0x72,0x84,0x88,0x7B,0x85,0x8E,0x78,0x80,0x88,0x7B,0x81,0x75,0x75,0x8D, + 0x8F,0x7F,0x75,0x7B,0x84,0x90,0x88,0x81,0x74,0x68,0x78,0x7A,0x80,0x8D,0x95,0x96, + 0x8C,0x7D,0x80,0x73,0x5C,0x65,0x77,0x85,0x87,0x7B,0x78,0x82,0x87,0x93,0xA0,0x99, + 0x85,0x6C,0x72,0x80,0x72,0x6C,0x78,0x84,0x8E,0x83,0x85,0x9B,0x90,0x8B,0x9F,0xA2, + 0x8A,0x7A,0x84,0x7F,0x7A,0x77,0x76,0x7B,0x69,0x5E,0x6F,0x74,0x68,0x76,0x8B,0x8C, + 0x7E,0x79,0x8A,0x8C,0x74,0x70,0x8B,0x89,0x6A,0x6B,0x7A,0x7E,0x87,0x93,0x92,0x7F, + 0x72,0x80,0x8A,0x7F,0x78,0x83,0x94,0x93,0x7C,0x7C,0x89,0x71,0x6C,0x88,0x8C,0x75, + 0x70,0x84,0x84,0x7F,0x7C,0x8C,0x97,0x7D,0x76,0x87,0x8D,0x87,0x86,0x8C,0x8A,0x7D, + 0x7A,0x84,0x80,0x6F,0x77,0x84,0x79,0x70,0x6F,0x77,0x84,0x92,0x9D,0xA2,0x89,0x73, + 0x7D,0x7A,0x65,0x60,0x71,0x82,0x7C,0x6F,0x7E,0x90,0x89,0x8F,0xA1,0x9B,0x78,0x6F, + 0x81,0x7A,0x72,0x76,0x85,0x88,0x77,0x75,0x88,0x93,0x8A,0x94,0xA1,0x95,0x8A,0x91, + 0x95,0x89,0x73,0x74,0x7D,0x70,0x62,0x60,0x69,0x6D,0x76,0x86,0x84,0x71,0x70,0x7F, + 0x84,0x7E,0x80,0x8B,0x8A,0x7C,0x73,0x75,0x76,0x77,0x88,0x98,0x89,0x75,0x7B,0x89, + 0x7F,0x72,0x7E,0x88,0x81,0x72,0x70,0x7F,0x81,0x79,0x8A,0x95,0x83,0x7E,0x8A,0x92, + 0x89,0x80,0x89,0x8E,0x7E,0x70,0x76,0x7F,0x7D,0x7E,0x94,0x93,0x77,0x73,0x80,0x7D, + 0x77,0x79,0x78,0x73,0x68,0x68,0x79,0x84,0x85,0x91,0xA2,0x9C,0x8C,0x87,0x82,0x75, + 0x73,0x80,0x7E,0x76,0x70,0x78,0x83,0x7E,0x7B,0x85,0x8B,0x81,0x7C,0x7A,0x79,0x89, + 0x8E,0x80,0x82,0x7D,0x75,0x7D,0x74,0x6A,0x82,0x99,0x95,0x91,0x8E,0x96,0xA3,0x9B, + 0x89,0x7C,0x83,0x78,0x6C,0x72,0x6D,0x7C,0x62,0x5D,0x73,0x70,0x7A,0x75,0x73,0x7B, + 0x8A,0x89,0x7F,0x6D,0x70,0x9C,0xA1,0x91,0x9B,0xA1,0x9E,0x9B,0x87,0x7B,0x7E,0x6E, + 0x59,0x5B,0x60,0x5F,0x66,0x5B,0x51,0x79,0x90,0x77,0x70,0x79,0x78,0x7F,0x76,0x6B, + 0x8B,0x8A,0x7C,0x8B,0x88,0x94,0xB5,0xBC,0x9E,0xA9,0xCA,0xB0,0x9B,0x97,0x88,0x8B, + 0x87,0x71,0x7F,0x8D,0x73,0x68,0x7E,0x83,0x74,0x6F,0x69,0x77,0x84,0x73,0x6D,0x72, + 0x72,0x59,0x41,0x42,0x42,0x4F,0x58,0x54,0x59,0x64,0x6B,0x6A,0x6B,0x78,0x8F,0x8D, + 0x80,0x92,0x9C,0x8F,0x86,0x90,0xAC,0xB6,0xAF,0xBB,0xD4,0xDC,0xDA,0xD5,0xD6,0xD9, + 0xCC,0xB6,0xB4,0xB5,0xA7,0x98,0x94,0x84,0x75,0x79,0x6D,0x62,0x65,0x57,0x41,0x38, + 0x2F,0x2F,0x3A,0x33,0x31,0x38,0x38,0x3C,0x40,0x42,0x4E,0x5C,0x60,0x69,0x75,0x7A, + 0x7D,0x81,0x86,0x89,0x91,0x93,0x91,0x9B,0x9F,0x9E,0xA6,0xAB,0xA8,0xA9,0xA5,0xAB, + 0xB6,0xB1,0x9F,0x90,0x8B,0x85,0x80,0x7A,0x7C,0x7C,0x6F,0x5F,0x5B,0x57,0x52,0x64, + 0x70,0x6E,0x6A,0x69,0x66,0x67,0x5C,0x53,0x59,0x5C,0x5E,0x5D,0x5E,0x5D,0x62,0x68, + 0x71,0x77,0x7A,0x88,0x8E,0x90,0x91,0x92,0x91,0x90,0xA0,0xAF,0xAA,0xA8,0xAF,0xAE, + 0xAF,0xB2,0xB4,0xBF,0xC3,0xBE,0xC0,0xC3,0xB9,0xAD,0xAB,0xAB,0xAD,0xAA,0xA3,0xA5, + 0x9B,0x85,0x7E,0x81,0x80,0x73,0x6F,0x7B,0x7B,0x66,0x5C,0x5A,0x4F,0x4D,0x54,0x59, + 0x5A,0x54,0x4D,0x53,0x54,0x49,0x4D,0x59,0x5D,0x62,0x69,0x71,0x71,0x70,0x78,0x80, + 0x82,0x86,0x8E,0x91,0x8B,0x8C,0x89,0x89,0x8F,0x8E,0x95,0xA1,0xA1,0x9D,0xA1,0xA0, + 0x9A,0x9A,0x9C,0xA0,0xA4,0xA7,0xA8,0xA6,0x9C,0x93,0x94,0x93,0x93,0x8A,0x86,0x8F, + 0x7E,0x6A,0x6B,0x69,0x5A,0x57,0x59,0x56,0x58,0x4C,0x46,0x4E,0x48,0x45,0x52,0x55, + 0x4F,0x56,0x52,0x4A,0x48,0x43,0x47,0x4F,0x52,0x56,0x68,0x6A,0x5D,0x65,0x67,0x60, + 0x64,0x6C,0x78,0x85,0x85,0x87,0x95,0x96,0x92,0xA8,0xB7,0xB9,0xC6,0xCE,0xCC,0xC9, + 0xBE,0xBF,0xC6,0xBE,0xC0,0xB9,0xB3,0xC2,0xB4,0xA1,0xA6,0x9F,0x8F,0x97,0x9C,0x96, + 0x95,0x8B,0x88,0x88,0x78,0x79,0x86,0x7E,0x7B,0x81,0x7C,0x78,0x74,0x70,0x75,0x70, + 0x73,0x78,0x76,0x81,0x74,0x65,0x72,0x72,0x6B,0x77,0x81,0x83,0x86,0x7F,0x80,0x87, + 0x7F,0x82,0x8E,0x8E,0x8E,0x94,0x94,0x8E,0x8D,0x8A,0x8A,0x8B,0x92,0x91,0x91,0xA4, + 0x97,0x87,0x95,0x8B,0x7A,0x84,0x8B,0x8C,0x8B,0x83,0x86,0x87,0x76,0x78,0x89,0x84, + 0x7E,0x85,0x84,0x7E,0x76,0x71,0x73,0x73,0x76,0x7D,0x7B,0x89,0x85,0x6A,0x6E,0x6F, + 0x60,0x62,0x68,0x67,0x6A,0x61,0x59,0x60,0x53,0x48,0x56,0x5A,0x56,0x5C,0x5C,0x5B, + 0x58,0x55,0x5A,0x5A,0x5B,0x5A,0x58,0x6F,0x6A,0x51,0x61,0x64,0x51,0x57,0x62,0x66, + 0x6C,0x68,0x6A,0x73,0x69,0x68,0x79,0x7C,0x7B,0x86,0x8D,0x8F,0x8C,0x8D,0x97,0x9A, + 0xA1,0xA8,0xAA,0xC0,0xC0,0xAB,0xB6,0xB6,0xA0,0xA3,0xB0,0xB0,0xB0,0xA9,0xA8,0xB0, + 0xA3,0x9B,0xA9,0xA4,0x9C,0xA2,0xA6,0xA5,0x9C,0x94,0x97,0x94,0x92,0x90,0x92,0xA4, + 0x9A,0x86,0x93,0x8E,0x79,0x7E,0x89,0x8D,0x90,0x8E,0x90,0x93,0x84,0x86,0x94,0x8A, + 0x82,0x85,0x83,0x81,0x78,0x6F,0x6D,0x67,0x67,0x67,0x6A,0x7C,0x70,0x60,0x73,0x6F, + 0x59,0x60,0x6A,0x6B,0x6F,0x70,0x73,0x73,0x66,0x68,0x76,0x72,0x73,0x7D,0x7F,0x80, + 0x7E,0x7C,0x7D,0x79,0x79,0x76,0x83,0x95,0x80,0x78,0x86,0x76,0x6A,0x76,0x79,0x7A, + 0x79,0x76,0x7E,0x7B,0x69,0x6D,0x75,0x6E,0x75,0x7A,0x77,0x78,0x71,0x73,0x74,0x71, + 0x73,0x71,0x83,0x91,0x7C,0x80,0x8F,0x7E,0x77,0x85,0x8B,0x8B,0x8A,0x89,0x90,0x88, + 0x7C,0x85,0x84,0x7A,0x81,0x87,0x83,0x80,0x7A,0x76,0x75,0x76,0x72,0x74,0x8C,0x86, + 0x74,0x85,0x86,0x72,0x76,0x82,0x87,0x8C,0x89,0x88,0x89,0x7D,0x7A,0x80,0x77,0x72, + 0x77,0x74,0x71,0x6E,0x67,0x64,0x65,0x64,0x60,0x72,0x7E,0x68,0x69,0x79,0x6C,0x64, + 0x70,0x75,0x79,0x7D,0x7E,0x85,0x81,0x76,0x7E,0x85,0x7E,0x85,0x8E,0x8D,0x91,0x95, + 0x95,0x92,0x92,0x8E,0x95,0xB0,0xA8,0x98,0xAA,0xA5,0x90,0x95,0x9C,0x9B,0x9D,0x9D, + 0xA2,0xA7,0x9A,0x96,0xA2,0x9D,0x9B,0xA7,0xA6,0xA3,0xA3,0x9F,0x9C,0x9C,0x98,0x92, + 0xA6,0xAE,0x96,0x99,0xA0,0x8A,0x7E,0x87,0x8A,0x87,0x85,0x83,0x86,0x79,0x6C,0x73, + 0x6F,0x62,0x66,0x6D,0x69,0x65,0x62,0x5C,0x56,0x55,0x4D,0x55,0x6B,0x59,0x4D,0x5F, + 0x53,0x3F,0x45,0x4E,0x52,0x51,0x51,0x59,0x59,0x4D,0x53,0x5D,0x55,0x57,0x60,0x5F, + 0x5F,0x5F,0x5C,0x5A,0x57,0x53,0x54,0x6F,0x73,0x5B,0x65,0x6D,0x58,0x55,0x60,0x65, + 0x68,0x69,0x71,0x7E,0x77,0x71,0x80,0x86,0x86,0x91,0x98,0x9B,0x9E,0x9D,0x9D,0x9C, + 0x9D,0x97,0xA9,0xC1,0xA9,0x9D,0xAF,0xA0,0x8D,0x95,0x9B,0x9D,0x9B,0x95,0x9B,0x9C, + 0x8D,0x8E,0x96,0x91,0x93,0x9C,0x9C,0x9D,0x9C,0x99,0x96,0x98,0x97,0x99,0xB4,0xB4, + 0xA0,0xB0,0xB3,0x9F,0x9D,0xA7,0xAE,0xAE,0xA8,0xAC,0xB2,0xA3,0x99,0xA2,0xA1,0x9B, + 0x9F,0xA2,0xA2,0x9D,0x94,0x91,0x90,0x90,0x89,0x98,0xAF,0x98,0x8C,0x9A,0x8B,0x78, + 0x7A,0x7F,0x80,0x7C,0x74,0x7A,0x7B,0x6A,0x69,0x70,0x6B,0x69,0x6C,0x6A,0x68,0x63, + 0x5E,0x5C,0x5B,0x53,0x50,0x69,0x6B,0x51,0x58,0x5D,0x48,0x41,0x47,0x4E,0x53,0x4D, + 0x4D,0x56,0x4D,0x3F,0x44,0x47,0x44,0x48,0x4C,0x50,0x52,0x4C,0x4D,0x51,0x53,0x50, + 0x5A,0x78,0x72,0x5F,0x6F,0x6F,0x61,0x64,0x6C,0x74,0x78,0x6F,0x71,0x7B,0x73,0x70, + 0x79,0x7B,0x7D,0x82,0x82,0x88,0x8C,0x87,0x8A,0x90,0x95,0x92,0xA6,0xC3,0xB6,0xB0, + 0xC0,0xB9,0xAE,0xB1,0xB5,0xC1,0xC2,0xB7,0xBC,0xC0,0xB4,0xAE,0xAD,0xAC,0xAE,0xAA, + 0xA6,0xAA,0xA3,0x9A,0x97,0x9A,0x9B,0x92,0xA6,0xB4,0x9A,0x97,0xA1,0x94,0x8F,0x91, + 0x95,0xA0,0x9D,0x94,0x9C,0xA1,0x99,0x96,0x99,0x9C,0x9F,0x9C,0x9C,0xA2,0x9D,0x94, + 0x90,0x93,0x8C,0x88,0xA2,0xA2,0x8B,0x8F,0x8C,0x7F,0x7C,0x76,0x7E,0x89,0x7E,0x75, + 0x7B,0x77,0x6D,0x6A,0x6C,0x71,0x70,0x68,0x69,0x6B,0x65,0x60,0x5F,0x68,0x5E,0x5D, + 0x7C,0x76,0x5E,0x62,0x61,0x58,0x54,0x4F,0x59,0x63,0x57,0x51,0x59,0x58,0x4F,0x4B, + 0x4B,0x4F,0x52,0x4E,0x4E,0x52,0x4F,0x4A,0x47,0x4F,0x48,0x4B,0x6C,0x66,0x54,0x5C, + 0x5D,0x59,0x5B,0x5C,0x6A,0x76,0x6C,0x68,0x70,0x73,0x73,0x72,0x73,0x7C,0x82,0x7E, + 0x7D,0x82,0x82,0x7F,0x7C,0x82,0x80,0x81,0x9D,0x9F,0x8F,0x95,0x95,0x94,0x97,0x94, + 0xA0,0xAF,0xAC,0xA6,0xAC,0xB1,0xB1,0xAC,0xA9,0xB2,0xB9,0xB5,0xAE,0xAE,0xAF,0xAB, + 0xA2,0xA5,0xA4,0x9D,0xB1,0xB5,0x9C,0x98,0x95,0x8E,0x91,0x8C,0x8C,0x99,0x96,0x89, + 0x87,0x88,0x87,0x85,0x7F,0x81,0x8D,0x8E,0x86,0x89,0x8E,0x8E,0x8A,0x88,0x8A,0x86, + 0x98,0xAA,0x97,0x8D,0x8E,0x8A,0x8A,0x81,0x7F,0x8F,0x93,0x87,0x7E,0x7F,0x82,0x80, + 0x7C,0x7C,0x85,0x87,0x7D,0x76,0x76,0x78,0x75,0x73,0x75,0x6C,0x78,0x92,0x83,0x70, + 0x72,0x72,0x72,0x6B,0x64,0x70,0x7A,0x74,0x6C,0x6B,0x6B,0x6D,0x69,0x62,0x64,0x6B, + 0x6B,0x66,0x60,0x61,0x63,0x5D,0x59,0x54,0x59,0x77,0x78,0x61,0x5C,0x5A,0x5B,0x61, + 0x5C,0x5B,0x65,0x6A,0x66,0x5F,0x5A,0x62,0x6C,0x69,0x62,0x67,0x72,0x71,0x69,0x64, + 0x6A,0x6D,0x68,0x65,0x5F,0x71,0x89,0x81,0x73,0x6D,0x6C,0x76,0x79,0x70,0x74,0x85, + 0x8E,0x8A,0x80,0x7E,0x88,0x90,0x8F,0x91,0x9C,0xA2,0xA3,0x9F,0x99,0x9A,0x9E,0xA0, + 0x9A,0x96,0xA8,0xB2,0xA6,0x96,0x88,0x8A,0x93,0x8E,0x85,0x86,0x89,0x8A,0x87,0x7D, + 0x74,0x75,0x7A,0x79,0x79,0x7A,0x80,0x85,0x81,0x7D,0x7C,0x80,0x81,0x7E,0x8E,0xA3, + 0xA1,0x99,0x8F,0x85,0x89,0x91,0x95,0x99,0x9A,0x9A,0x9D,0x9A,0x92,0x8E,0x8F,0x92, + 0x93,0x92,0x8F,0x8F,0x90,0x8D,0x8A,0x8A,0x8A,0x84,0x86,0x98,0x9D,0x97,0x93,0x85, + 0x7C,0x83,0x83,0x81,0x83,0x82,0x86,0x8B,0x87,0x7E,0x7A,0x78,0x78,0x7D,0x7D,0x7A, + 0x79,0x75,0x72,0x6F,0x6E,0x71,0x6E,0x74,0x7E,0x7A,0x74,0x70,0x67,0x68,0x6F,0x6B, + 0x67,0x65,0x62,0x64,0x66,0x68,0x6C,0x6A,0x69,0x6C,0x6E,0x6D,0x6C,0x6D,0x6F,0x6E, + 0x6E,0x6E,0x6E,0x70,0x76,0x7D,0x79,0x75,0x75,0x71,0x74,0x79,0x75,0x78,0x79,0x75, + 0x76,0x78,0x76,0x79,0x7F,0x81,0x84,0x86,0x86,0x89,0x8E,0x90,0x96,0x9B,0x99,0x98, + 0x99,0x9E,0xA1,0x9C,0x9D,0x9F,0x9B,0x9D,0x9C,0x94,0x93,0x90,0x8A,0x89,0x84,0x7E, + 0x7C,0x78,0x75,0x76,0x77,0x77,0x75,0x72,0x73,0x75,0x75,0x75,0x78,0x78,0x7B,0x7F, + 0x7B,0x7D,0x81,0x83,0x8D,0x90,0x89,0x8A,0x8B,0x89,0x8B,0x8E,0x8D,0x8D,0x8A,0x88, + 0x8A,0x8C,0x8B,0x8F,0x92,0x91,0x90,0x90,0x90,0x8F,0x8B,0x8D,0x95,0x8E,0x88,0x8D, + 0x88,0x88,0x8D,0x8B,0x8D,0x8C,0x84,0x86,0x87,0x82,0x82,0x81,0x7D,0x7C,0x7B,0x7C, + 0x7E,0x7E,0x80,0x82,0x85,0x82,0x7E,0x7E,0x7B,0x7F,0x82,0x7B,0x7B,0x77,0x6F,0x77, + 0x76,0x6D,0x70,0x71,0x6B,0x6C,0x69,0x66,0x67,0x63,0x62,0x66,0x67,0x67,0x68,0x69, + 0x69,0x6D,0x73,0x75,0x76,0x75,0x76,0x81,0x7F,0x78,0x7E,0x7C,0x7A,0x7F,0x7C,0x7C, + 0x7F,0x7A,0x7D,0x83,0x7D,0x7C,0x7E,0x7C,0x7D,0x7F,0x80,0x84,0x84,0x83,0x88,0x8D, + 0x8C,0x8D,0x90,0x8E,0x8E,0x95,0x91,0x90,0x92,0x8C,0x8F,0x95,0x8C,0x8A,0x8A,0x84, + 0x86,0x87,0x85,0x84,0x7F,0x7D,0x7F,0x7E,0x7D,0x7C,0x7D,0x7D,0x7D,0x7E,0x7E,0x7D, + 0x7C,0x7C,0x83,0x87,0x80,0x80,0x82,0x7E,0x84,0x88,0x83,0x84,0x83,0x83,0x89,0x87, + 0x85,0x88,0x85,0x83,0x82,0x84,0x88,0x88,0x87,0x89,0x8A,0x89,0x86,0x86,0x86,0x83, + 0x8A,0x91,0x89,0x87,0x89,0x83,0x87,0x88,0x82,0x85,0x83,0x7E,0x80,0x7E,0x7C,0x7C, + 0x7D,0x7F,0x80,0x81,0x81,0x83,0x84,0x83,0x83,0x85,0x84,0x83,0x85,0x83,0x86,0x8A, + 0x84,0x83,0x84,0x7C,0x81,0x85,0x7D,0x7D,0x7E,0x78,0x78,0x76,0x74,0x75,0x72,0x71, + 0x75,0x76,0x76,0x76,0x77,0x78,0x78,0x7B,0x7D,0x7D,0x7C,0x77,0x78,0x7F,0x7A,0x79, + 0x81,0x7C,0x7A,0x84,0x80,0x7D,0x7E,0x78,0x78,0x7B,0x77,0x79,0x7B,0x77,0x78,0x7B, + 0x7D,0x7E,0x7F,0x80,0x84,0x86,0x83,0x84,0x85,0x81,0x7D,0x84,0x88,0x83,0x84,0x85, + 0x83,0x87,0x86,0x81,0x82,0x7E,0x78,0x7D,0x7C,0x79,0x79,0x75,0x74,0x75,0x77,0x7B, + 0x7C,0x79,0x79,0x7D,0x7D,0x7B,0x79,0x79,0x78,0x78,0x81,0x81,0x7C,0x7E,0x7A,0x7C, + 0x82,0x7C,0x7B,0x80,0x7A,0x78,0x7D,0x7A,0x7A,0x7A,0x78,0x7B,0x7E,0x7E,0x7E,0x7F, + 0x7E,0x7F,0x83,0x84,0x84,0x85,0x87,0x86,0x8B,0x8F,0x88,0x88,0x88,0x83,0x8A,0x8C, + 0x85,0x86,0x84,0x80,0x82,0x83,0x7E,0x82,0x81,0x84,0x85,0x63,0x6A,0x86,0x8B,0x78, + 0x7D,0x97,0x78,0x77,0x88,0x84,0x86,0x90,0x9D,0x88,0x83,0x8A,0x8A,0x8A,0x82,0x8B, + 0x85,0x76,0x74,0x7A,0x7E,0x7E,0x80,0x81,0x7B,0x6E,0x74,0x77,0x75,0x77,0x7C,0x7F, + 0x7A,0x83,0x80,0x7C,0x82,0x89,0x8F,0x87,0x88,0x8D,0x83,0x88,0x8E,0x84,0x88,0x86, + 0x78,0x80,0x86,0x79,0x79,0x7B,0x70,0x78,0x7D,0x78,0x7E,0x7B,0x77,0x77,0x7C,0x7F, + 0x83,0x90,0x7B,0x6A,0x86,0x9A,0x95,0x90,0x8B,0x80,0x86,0x87,0x83,0x84,0x72,0x70, + 0x7F,0x81,0x7F,0x7A,0x74,0x7A,0x82,0x7D,0x7A,0x7B,0x74,0x72,0x80,0x7F,0x74,0x78, + 0x79,0x70,0x6E,0x83,0x8C,0x85,0x87,0x7A,0x6F,0x7C,0x7E,0x77,0x7A,0x74,0x75,0x87, + 0x86,0x84,0x8A,0x7A,0x80,0x88,0x84,0x7D,0x7E,0x86,0x84,0x85,0x7F,0x7C,0x7D,0x7A, + 0x7B,0x7C,0x8A,0x90,0x8E,0x8F,0x7D,0x78,0x81,0x7B,0x77,0x76,0x7B,0x88,0x8A,0x84, + 0x83,0x83,0x80,0x83,0x7E,0x78,0x7B,0x80,0x87,0x8F,0x87,0x82,0x82,0x7D,0x78,0x72, + 0x86,0x98,0x97,0x92,0x84,0x75,0x7E,0x85,0x72,0x73,0x7F,0x7A,0x87,0x87,0x7E,0x7C, + 0x7B,0x7E,0x7A,0x79,0x77,0x7C,0x84,0x86,0x86,0x7D,0x7E,0x81,0x79,0x77,0x77,0x8C, + 0x99,0x90,0x8A,0x80,0x7A,0x86,0x84,0x7C,0x7F,0x7F,0x7F,0x87,0x84,0x7E,0x85,0x82, + 0x82,0x81,0x7C,0x81,0x85,0x87,0x88,0x86,0x82,0x81,0x84,0x7F,0x76,0x7E,0x93,0x92, + 0x84,0x8A,0x7E,0x7C,0x8C,0x78,0x6C,0x7A,0x74,0x7C,0x86,0x79,0x7D,0x81,0x79,0x82, + 0x80,0x79,0x7F,0x80,0x82,0x7E,0x7C,0x7D,0x80,0x7A,0x77,0x74,0x7D,0x9A,0x8F,0x83, + 0x88,0x7B,0x83,0x8B,0x71,0x6F,0x75,0x75,0x88,0x80,0x76,0x85,0x87,0x8A,0x8F,0x79, + 0x78,0x88,0x82,0x7A,0x7E,0x84,0x83,0x84,0x81,0x77,0x76,0x94,0x9E,0x84,0x8B,0x87, + 0x7A,0x93,0x83,0x70,0x84,0x81,0x84,0x8C,0x79,0x7A,0x8C,0x87,0x88,0x85,0x79,0x89, + 0x88,0x7A,0x80,0x7E,0x7E,0x80,0x79,0x78,0x74,0x82,0x99,0x8A,0x81,0x8C,0x81,0x87, + 0x8A,0x6B,0x6E,0x7E,0x79,0x88,0x7E,0x6F,0x8A,0x89,0x81,0x86,0x79,0x82,0x90,0x7E, + 0x7C,0x7D,0x7A,0x83,0x7B,0x76,0x78,0x77,0x93,0x96,0x7E,0x8B,0x86,0x7E,0x8F,0x71, + 0x69,0x82,0x77,0x80,0x84,0x6F,0x85,0x91,0x84,0x89,0x81,0x82,0x8F,0x7D,0x76,0x81, + 0x83,0x86,0x80,0x77,0x7B,0x7B,0x8F,0x9B,0x81,0x8A,0x8E,0x7E,0x8D,0x7D,0x6D,0x83, + 0x75,0x74,0x81,0x6A,0x77,0x8A,0x7C,0x82,0x7F,0x78,0x87,0x80,0x76,0x7C,0x80,0x80, + 0x7B,0x74,0x74,0x73,0x80,0x97,0x85,0x82,0x8E,0x80,0x8A,0x83,0x65,0x76,0x78,0x6C, + 0x7B,0x6D,0x73,0x8F,0x84,0x7F,0x83,0x78,0x8B,0x8C,0x77,0x80,0x80,0x81,0x81,0x74, + 0x7A,0x7B,0x7D,0x98,0x93,0x82,0x8C,0x85,0x8A,0x8C,0x70,0x7A,0x82,0x75,0x83,0x7A, + 0x73,0x8D,0x86,0x7E,0x84,0x7C,0x83,0x8E,0x7E,0x79,0x82,0x79,0x79,0x74,0x77,0x7A, + 0x77,0x90,0x8F,0x7F,0x87,0x83,0x83,0x8C,0x75,0x76,0x82,0x72,0x79,0x75,0x6D,0x80, + 0x84,0x7F,0x82,0x81,0x84,0x89,0x80,0x78,0x7E,0x7F,0x7C,0x7C,0x7A,0x7A,0x77,0x89, + 0x8E,0x82,0x85,0x82,0x84,0x89,0x7C,0x75,0x80,0x77,0x78,0x7E,0x70,0x7A,0x86,0x80, + 0x85,0x85,0x7F,0x89,0x84,0x7B,0x82,0x85,0x80,0x7E,0x7D,0x79,0x76,0x7D,0x89,0x80, + 0x82,0x89,0x82,0x8B,0x85,0x76,0x7E,0x7D,0x77,0x7C,0x73,0x73,0x7E,0x7B,0x7E,0x81, + 0x7D,0x84,0x83,0x7A,0x83,0x7F,0x7B,0x7C,0x79,0x7A,0x73,0x7B,0x88,0x81,0x82,0x88, + 0x83,0x8A,0x85,0x75,0x7F,0x82,0x7B,0x7D,0x76,0x73,0x80,0x7C,0x78,0x80,0x83,0x85, + 0x89,0x82,0x7D,0x87,0x80,0x7C,0x7C,0x7A,0x7B,0x7D,0x8D,0x83,0x7F,0x89,0x87,0x8A, + 0x86,0x7F,0x83,0x83,0x7C,0x7C,0x75,0x79,0x7F,0x7B,0x7D,0x82,0x80,0x84,0x8C,0x84, + 0x83,0x85,0x80,0x80,0x80,0x7C,0x7C,0x81,0x88,0x84,0x7D,0x83,0x84,0x86,0x87,0x80, + 0x7E,0x7F,0x7B,0x7C,0x7C,0x77,0x80,0x80,0x7C,0x7E,0x7B,0x7F,0x87,0x84,0x80,0x86, + 0x84,0x82,0x7D,0x7D,0x7B,0x7E,0x87,0x81,0x80,0x84,0x83,0x88,0x86,0x7E,0x82,0x7F, + 0x7E,0x82,0x7A,0x7B,0x7E,0x80,0x7E,0x7E,0x7E,0x80,0x87,0x84,0x80,0x86,0x83,0x7D, + 0x80,0x7B,0x7A,0x84,0x85,0x7F,0x83,0x84,0x7F,0x86,0x81,0x7C,0x83,0x83,0x81,0x80, + 0x79,0x7B,0x7F,0x7B,0x7C,0x7F,0x81,0x82,0x82,0x81,0x84,0x85,0x81,0x80,0x7E,0x79, + 0x7A,0x86,0x83,0x7D,0x84,0x83,0x83,0x84,0x7F,0x81,0x87,0x82,0x7E,0x7D,0x79,0x7C, + 0x7F,0x7D,0x7F,0x7E,0x7F,0x86,0x82,0x80,0x86,0x84,0x82,0x82,0x7E,0x80,0x87,0x86, + 0x84,0x83,0x87,0x83,0x87,0x86,0x7B,0x82,0x83,0x7E,0x7C,0x77,0x7E,0x80,0x79,0x7A, + 0x7D,0x7C,0x84,0x84,0x80,0x83,0x83,0x7E,0x7F,0x7E,0x7C,0x81,0x87,0x86,0x81,0x84, + 0x84,0x88,0x86,0x7E,0x83,0x83,0x7E,0x7E,0x7F,0x7E,0x81,0x81,0x81,0x7E,0x7C,0x80, + 0x82,0x81,0x80,0x83,0x81,0x7F,0x7E,0x7E,0x7F,0x87,0x88,0x81,0x87,0x82,0x83,0x89, + 0x7F,0x7F,0x84,0x84,0x82,0x7B,0x77,0x80,0x85,0x7B,0x7B,0x7F,0x7F,0x84,0x7F,0x7D, + 0x83,0x80,0x80,0x7C,0x78,0x7C,0x8C,0x88,0x7C,0x86,0x84,0x87,0x8B,0x7A,0x79,0x84, + 0x80,0x7C,0x79,0x75,0x81,0x82,0x79,0x7A,0x7E,0x85,0x8C,0x7D,0x77,0x85,0x80,0x77, + 0x7A,0x74,0x7A,0x9B,0x8B,0x78,0x8A,0x87,0x8C,0x87,0x6E,0x7B,0x86,0x78,0x7B,0x76, + 0x78,0x8D,0x82,0x76,0x81,0x85,0x86,0x82,0x76,0x81,0x8D,0x7A,0x75,0x79,0x72,0x8D, + 0xA0,0x82,0x89,0x8F,0x84,0x88,0x71,0x6B,0x86,0x81,0x77,0x81,0x7E,0x8B,0x8E,0x72, + 0x77,0x86,0x81,0x7A,0x75,0x7F,0x8E,0x7F,0x72,0x79,0x73,0x8B,0x9C,0x7F,0x8B,0x9E, + 0x8F,0x89,0x7B,0x6D,0x88,0x7D,0x6A,0x80,0x79,0x88,0x7F,0x64,0x75,0x6B,0x72,0x82, + 0x69,0x7A,0x8A,0x6C,0x65,0x66,0x6B,0x88,0x95,0x87,0x86,0x8A,0x7D,0x79,0x70,0x6F, + 0x88,0x86,0x82,0x8E,0x87,0x86,0x86,0x76,0x7F,0x8C,0x7C,0x7D,0x8F,0x94,0x8B,0x7B, + 0x88,0x97,0x89,0xA0,0xB8,0x94,0x9B,0xAC,0x91,0x8D,0x8F,0x8C,0x98,0x99,0x92,0x90, + 0x7E,0x7C,0x7E,0x6E,0x81,0x91,0x7C,0x78,0x7C,0x78,0x70,0x54,0x53,0x68,0x61,0x73, + 0x88,0x71,0x6A,0x67,0x53,0x52,0x4D,0x50,0x6A,0x6E,0x64,0x69,0x68,0x66,0x65,0x5C, + 0x6A,0x76,0x71,0x76,0x82,0x7B,0x71,0x6D,0x75,0x78,0x69,0x82,0x95,0x7E,0x7D,0x78, + 0x6A,0x6A,0x65,0x71,0x8B,0x8A,0x88,0x94,0x98,0xA1,0xA6,0x9B,0xA2,0xA8,0x9A,0x99, + 0xA0,0x96,0x8D,0x86,0x86,0x86,0x83,0xA1,0xA8,0x8A,0x89,0x85,0x7C,0x7A,0x75,0x84, + 0x98,0x8E,0x86,0x90,0x8B,0x83,0x7F,0x7F,0x8D,0x91,0x8A,0x92,0x97,0x8B,0x83,0x83, + 0x86,0x80,0x85,0xA2,0x9A,0x8B,0x94,0x8D,0x82,0x7A,0x7D,0x93,0x9C,0x91,0x97,0xA0, + 0x9A,0x92,0x89,0x90,0x9C,0x97,0x94,0x9B,0x93,0x83,0x7E,0x81,0x7D,0x71,0x85,0x9A, + 0x86,0x7E,0x80,0x75,0x6A,0x5D,0x62,0x75,0x6F,0x61,0x66,0x68,0x5B,0x51,0x4E,0x56, + 0x58,0x4F,0x53,0x5F,0x59,0x4F,0x51,0x56,0x50,0x4E,0x6E,0x77,0x63,0x6A,0x70,0x63, + 0x5C,0x5D,0x70,0x7F,0x72,0x71,0x7B,0x73,0x63,0x5F,0x66,0x6B,0x6B,0x67,0x70,0x77, + 0x71,0x6F,0x7B,0x83,0x7B,0x90,0xB5,0xAE,0xA5,0xAF,0xA7,0x99,0x8F,0x92,0xA7,0xA3, + 0x93,0x9B,0x9E,0x8F,0x86,0x85,0x88,0x86,0x81,0x88,0x92,0x8D,0x83,0x83,0x88,0x82, + 0x79,0x99,0xA8,0x8E,0x94,0x9A,0x8C,0x82,0x80,0x8F,0x9D,0x8F,0x90,0xA1,0x95,0x86, + 0x88,0x8C,0x93,0x92,0x8F,0x9C,0x9C,0x90,0x8C,0x8F,0x95,0x8B,0x8E,0xB2,0xAC,0x94, + 0xA3,0xA2,0x92,0x8B,0x8B,0x98,0x99,0x87,0x8A,0x94,0x83,0x7B,0x7F,0x81,0x82,0x79, + 0x7A,0x81,0x77,0x6B,0x68,0x68,0x62,0x53,0x66,0x7C,0x60,0x57,0x66,0x54,0x46,0x49, + 0x54,0x64,0x5D,0x55,0x67,0x65,0x54,0x57,0x60,0x65,0x65,0x64,0x71,0x76,0x68,0x69, + 0x70,0x70,0x69,0x64,0x7F,0x83,0x64,0x6B,0x78,0x64,0x5D,0x66,0x75,0x80,0x75,0x7C, + 0x94,0x8D,0x83,0x93,0x9D,0xA0,0xA4,0xA6,0xB2,0xAD,0x9D,0x9F,0x9E,0x97,0x8D,0x92, + 0xB0,0xA4,0x8B,0x9A,0x97,0x7D,0x7A,0x82,0x8D,0x8E,0x80,0x8D,0x9A,0x83,0x7C,0x8B, + 0x8C,0x88,0x89,0x8F,0x97,0x8E,0x87,0x8B,0x8A,0x85,0x7E,0x8A,0xAB,0x99,0x87,0xA3, + 0x9D,0x83,0x84,0x8D,0x93,0x92,0x89,0x99,0xA3,0x8C,0x89,0x98,0x92,0x8E,0x93,0x98, + 0x9C,0x92,0x89,0x8D,0x85,0x80,0x7A,0x80,0x9F,0x8C,0x73,0x8C,0x82,0x63,0x69,0x72, + 0x71,0x6D,0x63,0x6B,0x73,0x5C,0x54,0x60,0x58,0x52,0x57,0x5D,0x62,0x5A,0x57,0x5E, + 0x55,0x55,0x55,0x56,0x7A,0x72,0x58,0x73,0x74,0x54,0x56,0x64,0x68,0x6B,0x65,0x6D, + 0x79,0x64,0x5B,0x6A,0x67,0x62,0x6A,0x6F,0x76,0x74,0x70,0x79,0x7A,0x7B,0x7C,0x81, + 0xA8,0xA9,0x92,0xAD,0xB4,0x97,0x97,0xA1,0xA1,0xA4,0x9A,0x9E,0xAD,0x99,0x89,0x98, + 0x93,0x86,0x8A,0x8E,0x8F,0x8A,0x82,0x86,0x82,0x7A,0x7F,0x7C,0x92,0xA0,0x86,0x8E, + 0x9E,0x83,0x76,0x86,0x8B,0x8D,0x89,0x88,0x97,0x90,0x7E,0x8A,0x91,0x88,0x89,0x90, + 0x90,0x90,0x90,0x92,0x8F,0x8B,0x8D,0x84,0x97,0xB0,0x94,0x91,0xA7,0x93,0x7E,0x88, + 0x8A,0x89,0x86,0x82,0x8D,0x8A,0x76,0x78,0x7E,0x74,0x72,0x75,0x78,0x77,0x71,0x6F, + 0x6C,0x65,0x64,0x5C,0x61,0x7D,0x6D,0x59,0x71,0x6A,0x4E,0x56,0x63,0x62,0x62,0x5F, + 0x66,0x71,0x63,0x5C,0x67,0x65,0x61,0x65,0x6D,0x72,0x6E,0x6D,0x70,0x6B,0x67,0x65, + 0x63,0x7C,0x83,0x69,0x76,0x84,0x6B,0x64,0x76,0x7B,0x7E,0x80,0x88,0x99,0x94,0x8A, + 0x97,0xA2,0x9D,0x9C,0xA3,0xA7,0xA1,0x9D,0x9D,0x9A,0x94,0x94,0x8B,0x95,0xAB,0x94, + 0x8D,0xA1,0x8E,0x78,0x80,0x86,0x85,0x83,0x82,0x8D,0x8D,0x7F,0x7F,0x88,0x85,0x83, + 0x89,0x8E,0x8D,0x88,0x85,0x87,0x83,0x82,0x81,0x86,0xA2,0x9D,0x89,0x98,0x9A,0x84, + 0x80,0x8A,0x90,0x90,0x8A,0x8E,0x98,0x8E,0x84,0x8D,0x8F,0x87,0x85,0x8A,0x8D,0x8A, + 0x84,0x85,0x82,0x7B,0x77,0x71,0x85,0x92,0x78,0x78,0x87,0x73,0x63,0x67,0x6F,0x71, + 0x6A,0x68,0x72,0x6D,0x5D,0x60,0x68,0x66,0x65,0x68,0x6C,0x6C,0x66,0x66,0x68,0x65, + 0x63,0x5F,0x6E,0x84,0x70,0x67,0x7B,0x72,0x60,0x64,0x6C,0x70,0x6C,0x69,0x74,0x77, + 0x6C,0x6B,0x72,0x72,0x71,0x74,0x7C,0x83,0x82,0x81,0x87,0x8B,0x8C,0x88,0x95,0xB4, + 0xAB,0x98,0xA9,0xA7,0x93,0x91,0x97,0x9E,0x9E,0x92,0x93,0x9B,0x8E,0x85,0x8B,0x8C, + 0x89,0x83,0x83,0x89,0x86,0x7E,0x7E,0x83,0x82,0x7A,0x7C,0x97,0x92,0x7D,0x8D,0x91, + 0x7E,0x79,0x80,0x88,0x8B,0x82,0x85,0x92,0x8D,0x83,0x83,0x8B,0x8C,0x88,0x89,0x90, + 0x92,0x8A,0x88,0x89,0x8A,0x85,0x84,0x9E,0xA2,0x87,0x8C,0x94,0x81,0x7A,0x7D,0x83, + 0x89,0x80,0x7A,0x82,0x80,0x73,0x72,0x77,0x77,0x74,0x72,0x72,0x74,0x71,0x69,0x65, + 0x69,0x66,0x60,0x76,0x81,0x68,0x6E,0x76,0x64,0x5F,0x61,0x76,0x74,0x72,0x6C,0x56, + 0x6C,0x68,0x51,0x52,0x63,0x6D,0x70,0x76,0x7B,0x7B,0x73,0x7B,0x88,0x86,0x7D,0x9A, + 0xA9,0x85,0x81,0x7C,0x6E,0x7B,0x6C,0x62,0x7B,0x7D,0x69,0x6A,0x6E,0x69,0x7B,0x85, + 0x89,0x7F,0x7F,0x90,0x90,0x91,0x94,0x98,0xA9,0xAC,0x97,0xB3,0xC7,0xB6,0xC7,0xA4, + 0xA9,0xB5,0x95,0xAF,0xA8,0xA4,0xAD,0x9D,0x94,0x87,0x82,0x8E,0x83,0x75,0x7B,0x68, + 0x70,0x7D,0x6D,0x80,0x7D,0x68,0x71,0x7D,0x84,0x77,0x5C,0x5B,0x61,0x59,0x5A,0x66, + 0x6B,0x65,0x5F,0x6B,0x78,0x75,0x82,0x80,0x8F,0xA0,0x95,0x8D,0x91,0x91,0x8C,0x94, + 0xA1,0xA5,0xAC,0xB2,0xAD,0xA7,0xA1,0xA2,0x91,0x8A,0x87,0x87,0x8D,0x79,0x77,0x75, + 0x6B,0x65,0x63,0x6F,0x6B,0x5E,0x4D,0x40,0x47,0x4F,0x47,0x36,0x3D,0x43,0x42,0x56, + 0x54,0x5A,0x62,0x5B,0x62,0x62,0x66,0x7D,0x87,0x78,0x76,0x74,0x7E,0x89,0x82,0x8A, + 0x8E,0x91,0xA0,0x9A,0xAD,0xBA,0xAC,0xBA,0xBD,0xA8,0xB9,0xB8,0x91,0xA3,0xA1,0x90, + 0xA1,0x92,0x8C,0x94,0x86,0x7F,0x8C,0x88,0x7C,0x75,0x66,0x74,0x73,0x66,0x65,0x66, + 0x74,0x69,0x61,0x59,0x50,0x67,0x6E,0x6B,0x62,0x5A,0x6F,0x74,0x66,0x73,0x72,0x76, + 0x87,0x78,0x85,0x90,0x8E,0x96,0x92,0x9F,0xA9,0xB1,0xB2,0xAB,0xC4,0xC7,0xBD,0xC9, + 0xC0,0xBC,0xC5,0xC2,0xBD,0xB5,0xAE,0x9C,0x8B,0x85,0x80,0x8E,0x7E,0x6F,0x82,0x81, + 0x78,0x63,0x47,0x46,0x54,0x5D,0x5D,0x54,0x4A,0x47,0x48,0x40,0x3C,0x51,0x58,0x4A, + 0x41,0x44,0x4A,0x4E,0x55,0x4E,0x63,0x7B,0x74,0x68,0x58,0x5C,0x6D,0x70,0x79,0x83, + 0x8C,0x9B,0x92,0x7D,0x80,0x8B,0x8B,0x94,0xA5,0xA5,0xA7,0xA9,0xAB,0xB5,0xB8,0xB9, + 0xBE,0xBC,0xC0,0xC3,0xB2,0xA2,0x92,0x95,0xAA,0xB3,0xA6,0x95,0x8B,0x8A,0x84,0x81, + 0x7E,0x78,0x71,0x6C,0x77,0x71,0x69,0x4E,0x4B,0x59,0x56,0x5D,0x53,0x4D,0x59,0x5D, + 0x51,0x42,0x45,0x4D,0x4C,0x58,0x5A,0x4B,0x5A,0x5D,0x57,0x66,0x6A,0x74,0x7D,0x81, + 0x8E,0x9C,0x9E,0x9F,0xA3,0xAC,0xBC,0xB6,0xB8,0xC1,0xCB,0xCD,0xC7,0xC4,0xBB,0xC0, + 0xC5,0xBD,0xAF,0xAC,0xAB,0xA7,0xA3,0x9A,0x9F,0xA1,0x91,0x91,0x95,0x93,0x8A,0x83, + 0x79,0x6B,0x6D,0x69,0x67,0x65,0x5F,0x5D,0x57,0x4F,0x4B,0x58,0x56,0x49,0x48,0x4F, + 0x5B,0x63,0x66,0x58,0x4F,0x56,0x56,0x5E,0x65,0x60,0x63,0x63,0x5E,0x5A,0x61,0x67, + 0x56,0x5B,0x63,0x64,0x6E,0x67,0x68,0x6A,0x6C,0x76,0x78,0x82,0x8B,0x88,0x88,0x86, + 0x8C,0x96,0x96,0xAB,0xBC,0xB9,0xBA,0xBC,0xB3,0xAA,0xAA,0xA1,0xAC,0xBC,0xB8,0xB9, + 0xA8,0x9D,0xA0,0xA7,0xA5,0x8F,0x87,0x91,0x97,0x90,0x86,0x88,0x8A,0x87,0x82,0x7B, + 0x8A,0x83,0x6F,0x6A,0x5E,0x69,0x74,0x71,0x75,0x84,0x83,0x7B,0x7B,0x6C,0x71,0x7C, + 0x74,0x71,0x6F,0x72,0x6F,0x69,0x60,0x5A,0x5E,0x61,0x64,0x72,0x81,0x86,0x75,0x66, + 0x6E,0x71,0x77,0x78,0x7C,0x8D,0x8A,0x84,0x7B,0x76,0x84,0x8D,0x92,0x98,0x92,0x97, + 0x99,0x8E,0x8D,0x85,0x90,0x8D,0x7E,0x97,0x9B,0x9A,0xA0,0x86,0x7E,0x88,0x85,0x8B, + 0x93,0x84,0x7D,0x82,0x76,0x7C,0x83,0x71,0x6E,0x6E,0x6F,0x7F,0x7A,0x71,0x68,0x59, + 0x65,0x63,0x5F,0x75,0x80,0x7C,0x74,0x6F,0x70,0x7A,0x79,0x72,0x7C,0x7F,0x81,0x89, + 0x8B,0x84,0x7C,0x77,0x79,0x7D,0x92,0x9B,0x8D,0x83,0x75,0x82,0x85,0x78,0x76,0x6F, + 0x74,0x78,0x7E,0x77,0x72,0x7D,0x79,0x77,0x85,0x83,0x7D,0x85,0x86,0x90,0x8E,0x89, + 0x93,0x97,0x92,0x8F,0x97,0x96,0x93,0x94,0x92,0x8A,0x84,0x8B,0x88,0x88,0x91,0x8B, + 0x80,0x91,0x90,0x87,0x94,0x90,0x94,0x9C,0x97,0x97,0x93,0x87,0x85,0x8A,0x8F,0x8F, + 0x86,0x7C,0x7E,0x88,0x94,0x8E,0x85,0x8C,0x85,0x7F,0x87,0x7C,0x6E,0x7A,0x7B,0x79, + 0x7B,0x72,0x6D,0x75,0x78,0x75,0x6E,0x6D,0x79,0x7C,0x7B,0x71,0x63,0x67,0x64,0x5E, + 0x5D,0x52,0x57,0x63,0x67,0x66,0x64,0x5C,0x5B,0x6A,0x64,0x65,0x67,0x54,0x55,0x61, + 0x66,0x6D,0x6B,0x6A,0x6D,0x72,0x7F,0x81,0x75,0x73,0x78,0x79,0x7A,0x7C,0x7D,0x80, + 0x87,0x89,0x8F,0x8D,0x8D,0x99,0x95,0x8A,0x86,0x84,0x89,0x9A,0x9F,0x95,0x94,0x92, + 0x8F,0x9C,0xA3,0x9D,0x97,0x92,0x97,0x98,0x8D,0x82,0x80,0x85,0x91,0x94,0x93,0x90, + 0x88,0x97,0x9F,0x97,0x99,0x91,0x8F,0x93,0x94,0x8E,0x86,0x8D,0x91,0x8F,0x93,0x94, + 0x96,0x95,0x8E,0x8A,0x84,0x7B,0x79,0x7D,0x7F,0x7D,0x7E,0x81,0x81,0x85,0x8A,0x87, + 0x84,0x82,0x76,0x77,0x7B,0x79,0x73,0x6C,0x72,0x6F,0x6C,0x6C,0x6B,0x71,0x72,0x6D, + 0x62,0x5E,0x5C,0x62,0x6A,0x5B,0x5C,0x60,0x59,0x61,0x69,0x64,0x66,0x68,0x6C,0x74, + 0x6F,0x6A,0x65,0x64,0x64,0x68,0x69,0x61,0x62,0x6C,0x74,0x74,0x77,0x77,0x75,0x82, + 0x8B,0x82,0x7A,0x82,0x82,0x86,0x92,0x91,0x93,0x94,0x99,0x97,0x8D,0x8C,0x87,0x8C, + 0x8D,0x89,0x91,0x87,0x83,0x91,0x98,0x9C,0x9B,0x95,0x95,0x9B,0x9F,0x9A,0x96,0x96, + 0x98,0xA1,0x9F,0x9B,0x99,0x9C,0xA1,0x9D,0x98,0x92,0x95,0x96,0x97,0x93,0x8A,0x90, + 0x92,0x92,0x92,0x94,0x91,0x8E,0x8D,0x8A,0x96,0x95,0x92,0x90,0x88,0x8A,0x8E,0x8A, + 0x89,0x8B,0x89,0x83,0x82,0x83,0x80,0x81,0x82,0x7C,0x7D,0x81,0x82,0x7C,0x73,0x75, + 0x72,0x72,0x75,0x72,0x6D,0x6B,0x78,0x71,0x6B,0x76,0x6C,0x6B,0x6B,0x66,0x66,0x5C, + 0x5D,0x5A,0x56,0x5C,0x59,0x57,0x54,0x5A,0x5C,0x5C,0x60,0x5C,0x64,0x69,0x68,0x69, + 0x64,0x62,0x70,0x75,0x6F,0x6F,0x65,0x67,0x73,0x76,0x77,0x73,0x6C,0x6F,0x74,0x73, + 0x71,0x6D,0x69,0x6E,0x78,0x7D,0x80,0x83,0x85,0x8C,0x91,0x8D,0x8F,0x8F,0x8E,0x98, + 0x9A,0x95,0x94,0x8F,0x93,0x9A,0x96,0x97,0x98,0x8F,0x93,0x9D,0x97,0x92,0x95,0x96, + 0x98,0xA2,0xA0,0x98,0x9C,0x9E,0xA4,0xA8,0xA1,0x9B,0x98,0x9C,0xA8,0xA6,0x9E,0x98, + 0x90,0x93,0x9A,0x98,0x95,0x91,0x8A,0x91,0x90,0x8F,0x93,0x8D,0x93,0x98,0x99,0x9B, + 0x97,0x90,0x8E,0x8E,0x8A,0x88,0x81,0x7D,0x8B,0x94,0x96,0x93,0x86,0x7D,0x7C,0x7E, + 0x78,0x6F,0x68,0x5D,0x68,0x6F,0x6C,0x72,0x6F,0x71,0x79,0x7B,0x73,0x6C,0x6D,0x6E, + 0x6F,0x6A,0x68,0x64,0x66,0x74,0x7B,0x7E,0x7D,0x6B,0x65,0x68,0x64,0x62,0x5A,0x50, + 0x54,0x60,0x6A,0x6C,0x69,0x68,0x65,0x68,0x64,0x64,0x65,0x64,0x63,0x5F,0x65,0x61, + 0x64,0x75,0x7D,0x80,0x81,0x7B,0x72,0x73,0x6F,0x6B,0x6E,0x6B,0x6E,0x7C,0x81,0x86, + 0x88,0x83,0x89,0x8A,0x89,0x92,0x8E,0x8C,0x90,0x87,0x8B,0x8C,0x83,0x91,0x9B,0x99, + 0x9B,0x94,0x86,0x89,0x89,0x87,0x8D,0x87,0x87,0x93,0x92,0x94,0x9A,0x97,0x9F,0x9E, + 0x9A,0x9C,0x97,0x95,0x93,0x8B,0x8F,0x92,0x8D,0x94,0xA1,0xA6,0xA5,0xA1,0x92,0x8F, + 0x91,0x88,0x87,0x83,0x7C,0x85,0x86,0x84,0x8B,0x84,0x8D,0x93,0x8C,0x88,0x82,0x81, + 0x83,0x82,0x84,0x8A,0x81,0x7B,0x89,0x8F,0x93,0x93,0x81,0x7D,0x87,0x7D,0x79,0x72, + 0x68,0x73,0x7C,0x78,0x7C,0x79,0x7B,0x8A,0x85,0x7F,0x7D,0x75,0x74,0x77,0x72,0x73, + 0x73,0x66,0x6B,0x7C,0x7E,0x82,0x7A,0x6A,0x74,0x73,0x6B,0x68,0x5C,0x61,0x70,0x75, + 0x73,0x70,0x6E,0x79,0x80,0x7C,0x78,0x74,0x74,0x7A,0x7D,0x7D,0x7F,0x7A,0x72,0x7A, + 0x86,0x88,0x8B,0x82,0x76,0x7A,0x7B,0x74,0x6C,0x66,0x6E,0x78,0x79,0x73,0x72,0x76, + 0x81,0x86,0x81,0x7B,0x75,0x7B,0x80,0x79,0x7A,0x7A,0x7D,0x7A,0x74,0x80,0x84,0x87, + 0x83,0x79,0x7B,0x80,0x7C,0x7B,0x79,0x78,0x7F,0x7F,0x7A,0x7B,0x80,0x81,0x86,0x86, + 0x81,0x81,0x84,0x84,0x85,0x7F,0x81,0x85,0x82,0x7F,0x79,0x81,0x85,0x88,0x87,0x81, + 0x83,0x84,0x80,0x7D,0x79,0x7C,0x7F,0x81,0x85,0x84,0x84,0x8A,0x8B,0x89,0x8B,0x8A, + 0x89,0x8A,0x89,0x8B,0x88,0x85,0x85,0x82,0x84,0x86,0x85,0x83,0x85,0x83,0x84,0x82, + 0x7D,0x7D,0x7D,0x7D,0x7A,0x7D,0x80,0x80,0x85,0x84,0x83,0x84,0x82,0x88,0x8A,0x88, + 0x8A,0x86,0x84,0x89,0x85,0x81,0x83,0x82,0x83,0x86,0x83,0x81,0x7F,0x80,0x7F,0x7D, + 0x81,0x7E,0x7D,0x7E,0x7C,0x80,0x84,0x81,0x80,0x83,0x84,0x86,0x82,0x82,0x83,0x81, + 0x84,0x82,0x7F,0x7F,0x82,0x83,0x80,0x80,0x81,0x81,0x81,0x80,0x7F,0x81,0x81,0x7F, + 0x7F,0x80,0x7A,0x7B,0x7C,0x7B,0x80,0x7E,0x7E,0x7F,0x7E,0x80,0x82,0x83,0x80,0x7E, + 0x83,0x84,0x82,0x81,0x80,0x80,0x81,0x82,0x81,0x80,0x82,0x80,0x81,0x81,0x7C,0x80, + 0x82,0x81,0x80,0x7F,0x82,0x81,0x80,0x7E,0x80,0x7F,0x7D,0x7D,0x7F,0x80,0x7E,0x7D, + 0x7D,0x7D,0x7D,0x7F,0x7C,0x7B,0x7E,0x7E,0x7F,0x7C,0x7B,0x7D,0x7D,0x7E,0x7D,0x7F, + 0x7F,0x7F,0x80,0x7F,0x81,0x80,0x81,0x81,0x7F,0x80,0x81,0x81,0x7F,0x7E,0x80,0x7E, + 0x7D,0x7E,0x7F,0x81,0x80,0x80,0x7F,0x7F,0x81,0x82,0x83,0x80,0x81,0x81,0x81,0x82, + 0x80,0x7F,0x81,0x82,0x80,0x81,0x81,0x80,0x7F,0x81,0x83,0x81,0x81,0x82,0x82,0x7F, + 0x7D,0x80,0x80,0x80,0x82,0x82,0x7E,0x80,0x81,0x7E,0x7F,0x80,0x7E,0x7D,0x7F,0x7C, + 0x7C,0x7C,0x7B,0x7C,0x7C,0x7F,0x7E,0x7C,0x7C,0x7E,0x7F,0x7E,0x7F,0x7F,0x7F,0x81, + 0x82,0x85,0x85,0x83,0x85,0x85,0x85,0x84,0x83,0x85,0x85,0x82,0x82,0x81,0x80,0x81, + 0x81,0x81,0x80,0x81,0x82,0x7F,0x7F,0x80,0x81,0x7F,0x80,0x84,0x7F,0x7F,0x81,0x80, + 0x81,0x82,0x83,0x82,0x81,0x81,0x82,0x82,0x82,0x82,0x80,0x81,0x83,0x82,0x82,0x84, + 0x83,0x83,0x83,0x83,0x84,0x80,0x80,0x81,0x83,0x82,0x82,0x84,0x82,0x7F,0x7F,0x82, + 0x81,0x81,0x80,0x7D,0x80,0x7C,0x80,0x81,0x7E,0x7F,0x7E,0x81,0x81,0x82,0x7F,0x7E, + 0x81,0x81,0x82,0x81,0x81,0x80,0x80,0x81,0x81,0x81,0x80,0x80,0x80,0x7F,0x80,0x80, + 0x7D,0x7F,0x80,0x7F,0x7E,0x7D,0x7F,0x7F,0x81,0x80,0x7D,0x7F,0x7E,0x7F,0x80,0x80, + 0x80,0x80,0x80,0x82,0x81,0x80,0x82,0x82,0x82,0x84,0x82,0x81,0x81,0x7F,0x82,0x83, + 0x83,0x82,0x80,0x81,0x80,0x80,0x81,0x80,0x81,0x81,0x80,0x81,0x80,0x7F,0x7F,0x7F, + 0x80,0x81,0x80,0x80,0x80,0x80,0x7F,0x7F,0x81,0x7D,0x7E,0x81,0x7F,0x7F,0x81,0x80, + 0x80,0x7F,0x81,0x7F,0x7F,0x82,0x7E,0x80,0x7F,0x7E,0x80,0x7D,0x7F,0x7E,0x7F,0x82, + 0x80,0x7F,0x7E,0x7C,0x80,0x80,0x7E,0x81,0x7E,0x80,0x80,0x7D,0x7F,0x7E,0x80,0x80, + 0x81,0x81,0x7D,0x80,0x7F,0x80,0x82,0x80,0x81,0x80,0x81,0x82,0x81,0x80,0x81,0x82, + 0x83,0x80,0x81,0x81,0x80,0x81,0x81,0x82,0x7F,0x80,0x7F,0x7F,0x81,0x7F,0x7E,0x80, + 0x80,0x7E,0x7D,0x7E,0x7C,0x7E,0x7F,0x80,0x80,0x7B,0x7E,0x7F, +}; diff --git a/boop/branches/ram_version/telekatz_soundtest/spaceenc_codes.h b/boop/branches/ram_version/telekatz_soundtest/spaceenc_codes.h new file mode 100644 index 0000000..501d6f4 --- /dev/null +++ b/boop/branches/ram_version/telekatz_soundtest/spaceenc_codes.h @@ -0,0 +1,8 @@ +#ifndef SPACEENC_CODES_H +#define SPACEENC_CODES_H + +#include "ir-codes/spaceenc/seleco_027" +#include "ir-codes/spaceenc/schneider_dtv3" + +#endif + diff --git a/boop/trunk/CHANGELOG b/boop/trunk/CHANGELOG new file mode 100644 index 0000000..d267b83 --- /dev/null +++ b/boop/trunk/CHANGELOG @@ -0,0 +1,2 @@ +06.12.2007 : +- starting complete code rework diff --git a/boop/trunk/LICENSE b/boop/trunk/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/boop/trunk/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/boop/trunk/Make.conf b/boop/trunk/Make.conf new file mode 100644 index 0000000..c8d471a --- /dev/null +++ b/boop/trunk/Make.conf @@ -0,0 +1,5 @@ +SUBDIRS := adc audio cc1100 display flash games gui infrared interrupt \ + keyboard rtc serial timer tools + +SRCS := crt.s main.c global.c buffer.c syscalls.c + diff --git a/boop/trunk/Makefile b/boop/trunk/Makefile new file mode 100644 index 0000000..39e0f13 --- /dev/null +++ b/boop/trunk/Makefile @@ -0,0 +1,150 @@ +############################################################### +##### +##### Makefile for boop - OpenSource firmware for Betty +##### Created at 30.8.2007 02:26 am +##### +##### boop V0.1 by netguy - ck@mamalala.net +##### Makefile V0.1 by alterego - alteregon@gmx.net +##### Makefile v0.2 by Tobias - tobias-betty@23.gs +##### +############################################################### + +############################################################### +##### +##### PATHS (default installation) +##### +##### You can put your path-config into Makefile.local +##### to override these defaults +##### +############################################################### + +ARMBASE = /opt/toolchains/gcc-arm-none-eabi-4_9-2014q4 +INCLUDEPATH = $(ARMBASE)/include +#LIBGCCPATH = $(ARMBASE)/lib/gcc/arm-none-eabi/4.7.3/thumb/arm7tdmi-s +#LIBCPATH = $(ARMBASE)/arm-none-eabi/lib/thumb/arm7tdmi-s +ARMPATH = $(ARMBASE)/bin +TOOLPREFIX = arm-none-eabi- +LPCTOOL = lpctool +OPENOCD = openocd -f betty.cfg -f interface/parport.cfg + +############################################################### +##### +##### Compiler, Linker and Tools +##### +############################################################### + +CC = $(ARMPATH)/$(TOOLPREFIX)gcc +AS = $(ARMPATH)/$(TOOLPREFIX)as +#LD = $(ARMPATH)/$(TOOLPREFIX)ld +LD = $(ARMPATH)/$(TOOLPREFIX)gcc +OC = $(ARMPATH)/$(TOOLPREFIX)objcopy +OD = $(ARMPATH)/$(TOOLPREFIX)objdump + +CPUFLAGS = -mcpu=arm7tdmi-s +OPTFLAGS = -Os +CFLAGS = -Wall -mthumb-interwork -msoft-float +INC = -I$(INCLUDEPATH) -I. -Iinterrupt -Idisplay -Ikeyboard -Iaudio -Iinfrared -Iserial -Iflash -Icc1100 -Igui -Itimer -Igames -Iadc -Irtc -Itools +ASFLAGS = -D --gstabs -mthumb-interwork -mfpu=softfpa +#LDFLAGS = -Tlpc2220_rom.ld -Map boop.map +#LIBS = -lc -lgcc +LDFLAGS = -mthumb-interwork -nostartfiles -Xlinker -Map -Xlinker boop.map -Tlpc2220_rom.ld +THUMBFLAGS = -mthumb + +COMPILE = $(CC) $(CPUFLAGS) $(CFLAGS) $(INC) + +ifeq ($(MAKECMDGOALS),debug) + COMPILE += -D DEBUGMODE +endif + +ifeq ($(MAKECMDGOALS),release) + COMPILE += -D RELEASE +endif + +-include Makefile.local + +############################################################### +##### +##### Do the boop +##### +############################################################### + +# Recursive expansion of Makefile rules. +define expand_dir + # Reset vars for subdir for the case that Make.conf does not exist + SUBDIRS := + SRCS := + THUMBSRCS := + THUMBSRCSUNOPT := + -include $(1)Make.conf + ALLSRCS += $$(SRCS:%=$(1)%) + ALLTHUMBSRCS += $$(THUMBSRCS:%=$(1)%) + ALLTHUMBSRCSUNOPT += $$(THUMBSRCSUNOPT:%=$(1)%) + DEPS += $(1).deps + $$(foreach adir,$$(SUBDIRS),$$(eval $$(call expand_dir,$(1)$$(adir)/))) +endef + +ALLSRCS := +ALLTHUMBSRCS := +ALLTHUMBSRCSUNOPT := + +$(eval $(call expand_dir,)) + +OBJS := $(patsubst %.s,%.o,$(ALLSRCS:.c=.o)) $(ALLTHUMBSRCS:.c=.thumb.o) $(ALLTHUMBSRCSUNOPT:.c=.thumbunopt.o) + +all: version $(DEPS) boop_rom.bin boop_rom.hex + +debug: version.h $(DEPS) boop_rom.bin boop_rom.hex + +release: clean version $(DEPS) boop_rom.bin boop_rom.hex + @echo -n '\n\nRelease erstellt SVN Version ++' + @cat .svn/entries | sed -n '4p' + +version: + echo -n '#define SVNVERSION ' > version.h + svnversion -n |cut -f1 -d M -n >> version.h + echo >> version.h + +version.h: + echo -n '#define SVNVERSION ' > version.h + svnversion -n|cut -f1 -d M >> version.h + echo >> version.h + +test: boop_rom.elf + $(OD) -h $< + +%.bin: %.elf + $(OC) -O binary $< $@ + +%.hex: %.elf + $(OC) -O ihex $< $@ + +boop_rom.elf: $(OBJS) + $(LD) $(LDFLAGS) -L$(LIBGCCPATH) -L$(LIBCPATH) -o $@ $^ $(LIBS) + +%.o: %.s + $(AS) $(CPUFLAGS) $(ASFLAGS) -o $@ $< + +%.o: %.c + $(COMPILE) $(OPTFLAGS) -c -MMD -MF $(dir $<).deps/$(notdir $@) -o $@ $< + +%.thumb.o: %.c + $(COMPILE) $(THUMBFLAGS) $(OPTFLAGS) -c -MMD -MF $(dir $<).deps/$(notdir $@) -o $@ $< + +%.thumbunopt.o: %.c + $(COMPILE) $(THUMBFLAGS) -c -MMD -MF $(dir $<).deps/$(notdir $@) -o $@ $< + +$(DEPS): + mkdir -p $@ + +uresident: resident +resident: boop_rom.bin + $(LPCTOOL) -i -v -e -a $< + +program: boop_rom.bin + $(OPENOCD) -c init -c 'flash_boop $<' -c shutdown + +clean: + -rm -Rf $(DEPS) + -rm -f $(OBJS) *.elf *.bin *.hex *~ + +-include $(DEPS:=/*) diff --git a/boop/trunk/Makefile.local.Telekatz b/boop/trunk/Makefile.local.Telekatz new file mode 100644 index 0000000..2a8c536 --- /dev/null +++ b/boop/trunk/Makefile.local.Telekatz @@ -0,0 +1,23 @@ +############################################################### +##### +##### Makefile.local.WinARM for boop +##### Created in the early morninghours +##### +##### Makefile.local.WinARM V1.0 by alterego - alteregon@gmx.net +##### +##### Copy this file to Makefile.local for your Windows +##### installation +##### +############################################################### + +ARMBASE = F:/Tools/WinARM +INCLUDEPATH = $(ARMBASE)/include +LIBPATH = $(ARMBASE)/arm-elf/lib/interwork +ARMPATH = $(ARMBASE)/bin +TOOLPREFIX = arm-elf- +LPCTOOL = lpctool.exe + +CFLAGS = -Wall -mthumb-interwork -msoft-float -ggdb + +######################## EOF ################################## + diff --git a/boop/trunk/Makefile.local.WinARM b/boop/trunk/Makefile.local.WinARM new file mode 100644 index 0000000..efcfb9d --- /dev/null +++ b/boop/trunk/Makefile.local.WinARM @@ -0,0 +1,21 @@ +############################################################### +##### +##### Makefile.local.WinARM for boop +##### Created in the early morninghours +##### +##### Makefile.local.WinARM V1.0 by alterego - alteregon@gmx.net +##### +##### Copy this file to Makefile.local for your Windows +##### installation +##### +############################################################### + +ARMBASE = c:/WinARM/ +INCLUDEPATH = $(ARMBASE)/include +LIBPATH = $(ARMBASE)/arm-elf/lib/interwork +ARMPATH = $(ARMBASE)/bin +TOOLPREFIX = arm-elf- +LPCTOOL = lpctool.exe +OPENOCD = C:\OpenOCD\openocd.exe -f betty.cfg -f C:\OpenOCD\OpenOCD\interface\parport.cfg + +######################## EOF ################################## diff --git a/boop/trunk/Makefile.local.linuxARM b/boop/trunk/Makefile.local.linuxARM new file mode 100644 index 0000000..e87b3b7 --- /dev/null +++ b/boop/trunk/Makefile.local.linuxARM @@ -0,0 +1,19 @@ +############################################################### +##### +##### Makefile.local.linuxARM for boop +##### Created in the early morninghours +##### +##### Copy this to Makefile.local and modify for your Linux +##### installation +##### +############################################################### + +ARMBASE = /opt/arm-elf +INCLUDEPATH = $(ARMBASE)/include +LIBPATH = $(ARMBASE)/lib/gcc/arm-elf/4.1.1/interwork +ARMPATH = $(ARMBASE)/bin +TOOLPREFIX = arm-elf- +LPCTOOL = lpctool -d /dev/ttyUSB0 +OPENOCD = openocd -f betty.cfg -f interface/parport.cfg + +######################## EOF ################################## diff --git a/boop/trunk/README b/boop/trunk/README new file mode 100644 index 0000000..109a0c2 --- /dev/null +++ b/boop/trunk/README @@ -0,0 +1,17 @@ +9.11.2007: + +- serial console: + 115200 baud, 8N1, no handshake + +- serial commands: + 0 - backlight off + 1 - dimmed backlight + 2 - full backlight + . - prints "HELO" + S - prints RCA_Encode status (hex value) + I - prints irIRQ status (hex value) + K - prints keyIRQ status (hex value) + all other inputs are echoed + +- flash boop_rom.bin: + lpctool -i -e -a ./boop_rom.bin -d /dev/ diff --git a/boop/trunk/adc/Make.conf b/boop/trunk/adc/Make.conf new file mode 100644 index 0000000..26f9a6d --- /dev/null +++ b/boop/trunk/adc/Make.conf @@ -0,0 +1 @@ +THUMBSRCS := adc.c adcirq.c diff --git a/boop/trunk/adc/adc.c b/boop/trunk/adc/adc.c new file mode 100644 index 0000000..1b1a838 --- /dev/null +++ b/boop/trunk/adc/adc.c @@ -0,0 +1,164 @@ +/* + adc.c - adc readout for battery status + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "irq.h" +#include "timerfuncs.h" +#include "adc.h" +#include "adcirq.h" +#include "lcd.h" +#include "fonty.h" +#include "lpc2220.h" + +extern volatile unsigned int bat_adc; +extern volatile unsigned int bmax, bmin; +extern unsigned int is_drawing; + +static unsigned short bat_max, bat_min; +static unsigned short diffs[4]; +static unsigned short diff; +volatile unsigned char bat_state; + + + +void draw_b(unsigned char x, unsigned char y) +{ + unsigned char w; + + if(!(is_drawing)) + { + if(bat_state & BAT_DEBUG) + { + draw_block(4,0,108,24,3,DRAW_ERASE); + draw_numU(4,0,bat_min>>2,0,3,DRAW_PUT); + draw_numU(32,0,bat_max>>2,0,3,DRAW_PUT); + draw_numU(4,8,(bat_max>>2)-(bat_min>>2),0,3,DRAW_PUT); + + draw_numU(60,0,bat_min,0,3,DRAW_PUT); + draw_numU(88,0,bat_max,0,3,DRAW_PUT); + draw_numU(60,8,bat_max-bat_min,0,3,DRAW_PUT); + if((bat_state & BAT_NORMAL)) + draw_string(4,16,"Bat.Operation",3,DRAW_PUT); + if((bat_state & BAT_CHARGE)) + draw_string(4,16,"Charging",3,DRAW_PUT); + if((bat_state & BAT_CHARGE_DONE)) + draw_string(4,16,"Done Charging",3,DRAW_PUT); + } + + if (bat_min<0x320) + w = 0; + else if (bat_min>0x380) + w = 12; + else + w = (bat_min-0x320)/8; + + draw_block(x+1,y+1,12,5,3,DRAW_ERASE); + draw_rect(x,y,14,7,1,3,DRAW_PUT); + draw_vline(x+14,y+2,3,3,DRAW_PUT); + + if(w>0) + draw_block(x+1,y+1,w,5,2,DRAW_PUT); + + if(w<12) + draw_block(x+1+w,y+1,12-w,5,0,DRAW_PUT); + } +} + +void calcBat(unsigned int cb) +{ + ADCR |= ((1<<21) | (1<<24)); +// ADCR |= (1<<24); /* Start A/D Conversion (START:0=1) */ + ADINTEN = 1<<5; +} + +void showBat(unsigned int cb) +{ + static int cnt; + unsigned char x; + + bat_max = bmax; + bat_min = bmin; + + cnt &= 0x03; + diffs[cnt++] = bat_max - bat_min; + + diff = 0; + for(x=0;x<4;x++) + diff += diffs[x]; + diff >>= 2; + + if(bat_state & BAT_NORMAL) + { + if(diff > 15) + { + bat_state |= BAT_CHARGE; + bat_state &= ~BAT_NORMAL; + } + } + else if(bat_state & BAT_CHARGE) + { + if(bat_max >= 1020) + { + bat_state |= BAT_CHARGE_DONE; + bat_state &= ~BAT_CHARGE; + } + } + else if(bat_state & BAT_CHARGE_DONE) + { + if(bat_max < 1000) + { + bat_state |= BAT_CHARGE; + bat_state &= ~BAT_CHARGE_DONE; + } + } + + if((diff < 7) && (bat_min < 1000)) + { + bat_state |= BAT_NORMAL; + bat_state &= ~BAT_CHARGE; + bat_state &= ~BAT_CHARGE_DONE; + } + + draw_b(113,0); + bmin = bat_max; + bmax = bat_min; +} + +void startADC(void) +{ + ADCR = ( 1<<5 | ((15-1)<<8) /*| (1UL<<16)*/ | (1UL<<21) ); + ADCR |= (1UL<<24); /* Start A/D Conversion (START:0=1) */ + while ((ADDR & (1UL<<31)) == 0); /* Wait for the conversion to complete (DONE=1)*/ + bmin = ((ADDR >> 6) & 0x03FF); /* Extract the A/D result */ + ADCR &=~(1UL<<21); + bmax = bmin; + bat_max = bmin; + bat_min = bmin; + bat_state = BAT_NORMAL; + + diffs[0] = 0; + diffs[0] = 1; + diffs[0] = 2; + diffs[0] = 3; + + VICVectAddr14 = (unsigned long)&(adcIRQ); + VICVectCntl14 = VIC_SLOT_EN | INT_SRC_ADC; + VICIntEnable = INT_ADC; + + startCB(addTimerCB(calcBat, 6)); + startCB(addTimerCB(showBat, 220)); +} diff --git a/boop/trunk/adc/adc.h b/boop/trunk/adc/adc.h new file mode 100644 index 0000000..1f3fe81 --- /dev/null +++ b/boop/trunk/adc/adc.h @@ -0,0 +1,32 @@ +/* + adc.h - adc readout for battery status + Copyright (C) 2007 Ch. Klippel + + 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 3 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 ADC_H +#define ADC_H + +#define BAT_NORMAL 0x01 +#define BAT_CHARGE 0x02 +#define BAT_CHARGE_DONE 0x04 +#define BAT_DEBUG 0x80 + + +void startADC(void); +void calcBat(unsigned int cb); +void showBat(unsigned int cb); + +#endif diff --git a/boop/trunk/adc/adcirq.c b/boop/trunk/adc/adcirq.c new file mode 100644 index 0000000..099b461 --- /dev/null +++ b/boop/trunk/adc/adcirq.c @@ -0,0 +1,38 @@ +/* + adcirq.c - adc iinterrupt handler + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "irq.h" +#include "adcirq.h" +#include "adc.h" +#include "lpc2220.h" + +volatile unsigned int bat_adc; +volatile unsigned int bmax, bmin; + +void __attribute__ ((section(".text.fastcode"))) adcIRQ (void) +{ + ADINTEN = 0; + bat_adc = ADDR; + bat_adc >>= 6; + bat_adc &= 0x03FF; + if(bmax < bat_adc) + bmax = bat_adc; + if(bmin > bat_adc) + bmin = bat_adc; + ADCR &=~(1UL<<21); +} diff --git a/boop/trunk/adc/adcirq.h b/boop/trunk/adc/adcirq.h new file mode 100644 index 0000000..c2e1027 --- /dev/null +++ b/boop/trunk/adc/adcirq.h @@ -0,0 +1,24 @@ +/* + adcirq.c - adc iinterrupt handler + Copyright (C) 2007 Ch. Klippel + + 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 3 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 ADCIRQ_H +#define ADCIRQ_H + +void __attribute__ ((section(".text.fastcode"))) adcIRQ (void); + +#endif diff --git a/boop/trunk/audio/Make.conf b/boop/trunk/audio/Make.conf new file mode 100644 index 0000000..ca8a4d0 --- /dev/null +++ b/boop/trunk/audio/Make.conf @@ -0,0 +1,2 @@ +THUMBSRCS := sound.c sid.c +SRCS := soundirq.c diff --git a/boop/trunk/audio/sid.c b/boop/trunk/audio/sid.c new file mode 100644 index 0000000..0128d39 --- /dev/null +++ b/boop/trunk/audio/sid.c @@ -0,0 +1,165 @@ +/* + sid.c - tone encoder routines + Copyright (C) 2008 Telekatz + + 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 3 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 "irq.h" +#include "sid.h" +#include "sound.h" +#include "soundirq.h" +#include "lpc2220.h" +#include "timerfuncs.h" + +unsigned int playtone_cb; +unsigned char *playtone[3]; +unsigned char playstate; +unsigned char tonelen[3]; +unsigned short playcounter; +unsigned short playcountermax; + +const unsigned short AttackRate[16] = {19531,9766,2441,1628,1028,673,574,488,391,156,78,49,39,13,8,5}; +const unsigned short DecayReleaseRate[16] = {6510,1628,814,543,343,233,191,163,130,52,16,13,4,3,2}; + +const unsigned char song2[] = { note_d,2, note_e,2, note_f,2, note_e,2, note_d,2, note_g,2, note_f,2, note_e,2, + note_d,2, note_e,2, note_f,2, note_g,2, note_a,2, note_g,2, note_f,2, note_e,2, + note_d,2, note_e,2, note_f,2, note_e,2, note_d,2, note_g,2, note_f,2, note_e,2, + note_cis,2, note_d,2, note_e,2, note_f,2, note_g,2, note_a,2, note_f,2, note_e,2,0}; + +const unsigned char song3[] = { note_0,1, note_c,2, note_c,2, note_c,2, note_c,2, note_c,2, note_c,2, note_c,2, note_c,2, + note_c,2, note_c,2, note_c,2, note_c,2, note_c,2, note_c,2, note_c,2, note_c,2, + note_c,2, note_c,2, note_c,2, note_c,2, note_c,2, note_c,2, note_c,2, note_c,2, + note_c,2, note_c,2, note_c,2, note_c,2, note_c,2, note_c,2, note_c,2, note_c,1,0}; + +const unsigned short notes[] = {0,4455,4720,5001,5298,5613,5947,6301,6676,7072,7493,7939,8411,0}; + + +void SIDsetfrq(unsigned char voice, unsigned short frq) { + + if (voice < voices) { + SID.reg[(voice * 7) + REG_FREQhi] = frq>>8; + SID.reg[(voice * 7) + REG_FREQlo] = frq & 0xFF; + } +} + +void SIDsetadsr(unsigned char voice,unsigned char attack, unsigned char decay, unsigned char sustain, unsigned char release) { + + if (voice < voices) { + SID.reg[(voice * 7) + REG_AttackDecay] = (attack<<4) + (decay&0x0f); + SID.reg[(voice * 7) + REG_SustainRelease] = (sustain<<4) + (release&0x0f); + } +} + +void SIDsetwave(unsigned char voice,unsigned char wave) { + + if (voice < voices) { + SID.reg[(voice * 7)+REG_Control] &= 0x0f; + SID.reg[(voice * 7)+REG_Control] |= wave; + } +} + +void SIDplaytone(unsigned int cb) { + unsigned char tone; + unsigned char x; + + switch (playstate) { + case 0x01: + playstate++; + setCBIntervall(playtone_cb,48); + for (x=0; x<3; x++) { + if (playtone[x]) { + if (!tonelen[x]) { + tone = *playtone[x]; + if (tone) { + playtone[x]++; + tonelen[x] = *playtone[x]; + playtone[x]++; + SIDsetfrq(x,notes[tone]); + SID.reg[(x*7)+REG_Control] |= GATE; + } + else { + playstate = 0x00; + playtone[0] = 0; + playtone[1] = 0; + playtone[2] = 0; + removeTimerCB(playtone_cb); + } + } + } + } + break; + case 0x02: + playstate = 0x01; + for (x=0; x<3; x++) { + if (playtone[x]) { + tonelen[x]--; + if (!tonelen[x]) + SID.reg[(x*7)+REG_Control] &= ~GATE; + } + } + setCBIntervall(playtone_cb,2); + break; + default: + playstate = 0x00; + removeTimerCB(playtone_cb); + } +} + +void SIDplaydump(unsigned int cb) { + unsigned char x; + + if (playcounter++ < playcountermax) { + for (x=0;x<14;x++) { + SID.reg[x] = *playtone[0]; + playtone[0]++; + } + } + else { + SID.reg[REG_Control] &= ~GATE; + SID.reg[7+REG_Control] &= ~GATE; + SID.reg[14+REG_Control] &= ~GATE; + playstate = 0x00; + playtone[0] =0; + removeTimerCB(playtone_cb); + } +} + +void beepEnd(unsigned int cb) { + SID.reg[REG_Control] &= ~GATE; + SID.flags |= SID_AUTO_OFF; + removeTimerCB(cb); +} + +void beep(unsigned char n) { + + + switch(n) { + case 1: + SIDsetwave(0,TRIANGLE); + SIDsetadsr(0,0,10,0,10); + SIDsetfrq(0,8411); + break; + default: + SIDsetwave(0,SAWTOOTH); + SIDsetadsr(0,1,5,10,5); + SIDsetfrq(0,5001); + break; + } + PWMPR = 0; + switchSound(SOUND_ON); + SID.flags |= SIDenable; + SID.reg[REG_Control] |= GATE; + startCB(addTimerCB(beepEnd, 20)); +} diff --git a/boop/trunk/audio/sid.h b/boop/trunk/audio/sid.h new file mode 100644 index 0000000..e67980f --- /dev/null +++ b/boop/trunk/audio/sid.h @@ -0,0 +1,118 @@ +/* + sid.h - tone encoder routines + Copyright (C) 2008 Telekatz + + 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 3 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 SID_H +#define SID_H + +// SID voice controll register bits +#define GATE (1<<0) +#define SYNC (1<<1) +#define RINGMOD (1<<2) +#define TEST (1<<3) +#define TRIANGLE (1<<4) +#define SAWTOOTH (1<<5) +#define RECTANGLE (1<<6) +#define NOISE (1<<7) + +// SID RES/FILT ( reg.23 ) +#define FILT1 (1<<0) +#define FILT2 (1<<1) +#define FILT3 (1<<2) +// SID MODE/VOL ( reg.24 ) +#define VOICE3OFF (1<<7) + +// SID registers +#define REG_FREQlo 00 +#define REG_FREQhi 01 +#define REG_PWlo 02 +#define REG_PWhi 03 +#define REG_Control 04 +#define REG_AttackDecay 05 +#define REG_SustainRelease 06 + +#define REG_FClo 21 +#define REG_FChi 22 +#define REG_ResFilt 23 +#define REG_ModeVol 24 + +#define max_sid_registers 25 +#define max_level 40000 +#define voices 3 +#define sustainstep 2666 + +//SID.flags +#define ATTACK 1 +#define SIDenable (1<<3) +#define phaseoverflow (1<<4) +#define SID_AUTO_OFF (1<<5) + + +#define note_c 1 +#define note_cis 2 +#define note_d 3 +#define note_dis 4 +#define note_e 5 +#define note_f 6 +#define note_fis 7 +#define note_g 8 +#define note_gis 9 +#define note_a 10 +#define note_ais 11 +#define note_h 12 +#define note_0 13 + +extern const unsigned char song2[]; +extern const unsigned char song3[]; +extern const unsigned char song4[]; + +extern const unsigned short notes[]; + + +const unsigned short AttackRate[16]; +const unsigned short DecayReleaseRate[16]; + +struct voice_ { + unsigned short envelope; + unsigned short phase; +}; + +struct SID_ { + struct voice_ voice[3]; + unsigned short noise; + unsigned char flags; + unsigned char reg[max_sid_registers]; + +}; + +struct SID_ SID; + +unsigned int playtone_cb; +unsigned char *playtone[3]; +unsigned char playstate; +unsigned char tonelen[3]; +unsigned short playcounter; +unsigned short playcountermax; + +void SIDsetfrq(unsigned char voice, unsigned short frq); +void SIDsetadsr(unsigned char voice,unsigned char attack, unsigned char decay, unsigned char sustain, unsigned char release); +void SIDsetwave(unsigned char voice,unsigned char wave); +void SIDplaytone(unsigned int cb); +void SIDplaydump(unsigned int cb); +void beep(unsigned char n); + +#endif diff --git a/boop/trunk/audio/sidfiles.h b/boop/trunk/audio/sidfiles.h new file mode 100644 index 0000000..0a4dccb --- /dev/null +++ b/boop/trunk/audio/sidfiles.h @@ -0,0 +1,1004 @@ + +const unsigned char song1[] = { +0x00,0x00,0x00,0x00,0x20,0x11,0x70,0x00,0x00,0x00,0x00,0x20,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa2,0x25,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa2,0x25,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa2,0x25,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa2,0x25,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa2,0x25,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa2,0x25,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa2,0x25,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa2,0x25,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa2,0x25,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa2,0x25,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa2,0x25,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa2,0x25,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa5,0x1f,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa5,0x1f,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa5,0x1f,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa5,0x1f,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa5,0x1f,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa5,0x1f,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa5,0x1f,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa5,0x1f,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa5,0x1f,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa5,0x1f,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa5,0x1f,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xa5,0x1f,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0xa5,0x1f,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa5,0x1f,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa5,0x1f,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa5,0x1f,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa5,0x1f,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa5,0x1f,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0x1e,0x19,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0x87,0x21,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xdf,0x1d,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xdf,0x1d,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xdf,0x1d,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xdf,0x1d,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xdf,0x1d,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xdf,0x1d,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xdf,0x1d,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xdf,0x1d,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xdf,0x1d,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xdf,0x1d,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xdf,0x1d,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xdf,0x1d,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xef,0x13,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xef,0x13,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xef,0x13,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xef,0x13,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xef,0x13,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xef,0x13,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xef,0x13,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xef,0x13,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xef,0x13,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xef,0x13,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xef,0x13,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xef,0x13,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x3e,0x2a,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x18,0x0e,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x87,0x21,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0xd1,0x12,0x00,0x00,0x21,0x11,0x70,0x30,0x0b,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0x8f,0x0c,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x60,0x16,0x00,0x00,0x21,0x11,0x70,0xd1,0x12,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x1e,0x19,0x00,0x00,0x21,0x11,0x70,0x1f,0x15,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0x31,0x1c,0x00,0x00,0x21,0x11,0x70,0x60,0x16,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70, +0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70 +}; diff --git a/boop/trunk/audio/sound.c b/boop/trunk/audio/sound.c new file mode 100644 index 0000000..310ecbc --- /dev/null +++ b/boop/trunk/audio/sound.c @@ -0,0 +1,114 @@ +/* + sound.c - sound core routines + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "irq.h" +#include "sound.h" +#include "soundirq.h" +#include "lpc2220.h" + +#define AUTO_OFF_TIME 0x4000 + + +extern unsigned int tval; +extern unsigned char bl_val, cmp_val; +extern unsigned int slen; +extern unsigned char *sdata; +extern volatile unsigned char sact; +extern char out1; +extern char last_sample; +extern unsigned char sound_shutdown; + +unsigned char timeout; +unsigned int auto_timeout; + +void startSoundIRQ(void) +{ + timeout = 0; + auto_timeout = 0; + out1 = 0; + + PWMTC = 0; +// PWMPR = 0; + PWMPR = 7; + PWMMR0 = 0x1E6; // pwm rate + PWMMR2 = 0x00; // pwm value + PWMLER = 0x05; + PWMMCR = 0x03; + PWMPCR = (1<<10); + PWMTCR = 0x03; + PWMTCR = 0x09; + + //VICVectAddr0 = (unsigned long)&(soundIRQ); + //VICVectCntl0 = VIC_SLOT_EN | INT_SRC_PWM; + VICIntSelect |= INT_PWM; + VICIntEnable = INT_PWM; +} + +void initSound(void) +{ + slen = 0; + sdata = 0; + sact = 0; + tval = 0; + last_sample = 0; + bl_val = 0x3F; +} + +void switchSound(unsigned char onoff) +{ + if(onoff) + { + sound_shutdown = 0; + PINSEL0 &= ~(3 << (2 * SND_PWM)); // IO + PINSEL0 |= (2 << (2 * SND_PWM)); // PWM + PINSEL0 &= ~(3 << (2 * SND_EN)); // IO + PINSEL0 &= ~(3 << (2 * SND_ON)); // IO + FIODIR0 |= (1< + + 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 3 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 SOUND_H +#define SOUND_H + +#define SOUND_OFF 0x00 +#define SOUND_ON 0x01 + +//IO PINS on P0 +#define SND_ON 6 +#define SND_EN 11 +#define SND_PWM 7 + +void startSoundIRQ(void); + +void initSound(void); +void switchSound(unsigned char onoff); +void playSound(unsigned char *sound, unsigned long len); +void stopSound(void); +void waitSound(void); + +#endif diff --git a/boop/trunk/audio/soundirq.c b/boop/trunk/audio/soundirq.c new file mode 100644 index 0000000..d034c08 --- /dev/null +++ b/boop/trunk/audio/soundirq.c @@ -0,0 +1,226 @@ +/* + soundcore.c - sound core routines (output, ipol, mixing, ...) + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "irq.h" +#include "soundirq.h" +#include "sound.h" +#include "sid.h" +#include "lpc2220.h" + +#define AUTO_OFF_TIME 0x4000 + +/* +extern volatile unsigned int tval; +extern volatile unsigned char bl_val, cmp_val; +extern volatile unsigned int slen; +extern volatile unsigned char *sdata; +extern volatile unsigned char sact; +extern volatile char out1; +extern volatile char last_sample; +*/ + +unsigned int tval; +unsigned char bl_val, cmp_val; // backlight PWM +unsigned int slen; +unsigned char *sdata; +unsigned char sact; +unsigned char out1; +unsigned char last_sample; +unsigned char sound_shutdown; + +const unsigned char prevvoice[3] = {2,0,1}; + +void __attribute__ ((section(".text.fastcode"))) soundIRQ (void) +{ + PWMIR = 0x01; + + // play sample + if(sact != 0) + { + out1++; + if(out1 == 2) // quik & dirty anti-aliasing filter + { // (2 point linear interpolated 2x upsampling) + + PWMMR2 = (sdata[tval] + last_sample) >> 1; + PWMLER = 0x04; + } + else + if(out1 == 4) // prepare next sample + { + out1 = 0; + last_sample = sdata[tval]; + PWMMR2 = last_sample; + tval++; + if(tval >= slen) + { + tval = 0; + FIOCLR0 |= (1<>6; + for (x=0; x<3; x++) { + volatile unsigned char phase8; + unsigned char tempwave; + + if ((SID.reg[(x * 7) + REG_Control] & SYNC) && (SID.flags & phaseoverflow)) + SID.voice[x].phase = 0; + + + tempphase=SID.voice[x].phase + ((SID.reg[(x * 7) + REG_FREQlo] + (SID.reg[(x * 7) + REG_FREQhi]<<8))>>4); + phase8 = (SID.voice[x].phase)>>8; + + switch (SID.reg[(x * 7) + REG_Control] & 0xf0) { + case TRIANGLE: + + tempwave = phase8<<1; + if (phase8 & 0x80) + tempwave ^= 0xff; + + if ((SID.reg[(x * 7) + REG_Control] & RINGMOD) && (SID.voice[prevvoice[x]].phase & 0x8000)) + tempwave ^= 0xff; + + wave[x] = tempwave - 128; + break; + + + case SAWTOOTH: + wave[x] = phase8 - 0x80; + break; + + case RECTANGLE: + if(phase8 > ((SID.reg[(x * 7) + REG_PWlo] + (SID.reg[(x * 7) + REG_PWhi]<<8)) >> 4)) + wave[x] = 127; + else + wave[x] = -128; + break; + + case NOISE: + if(SID.voice[x].phase & 0x4000) + wave[x]=noise8; + break; + + default: + wave[x] = 0; + } + sig[x]=((SID.voice[x].envelope)>>8) * (wave[x]); + + if (SID.voice[x].phase > tempphase) + SID.flags |= phaseoverflow; + else + SID.flags &= ~phaseoverflow; + + SID.voice[x].phase=tempphase; + + if (!PWMcounter) { + signed int envelope; + if (SID.reg[(x * 7) + REG_Control] & GATE) { + if (!(SID.flags & (ATTACK<>4]; + if (envelope > max_level) { + SID.voice[x].envelope = max_level; + SID.flags |= (ATTACK<>4))) + SID.voice[x].envelope = sustainstep * (SID.reg[(x * 7) + REG_SustainRelease]>>4); + else + SID.voice[x].envelope = envelope; + } + } + else { + SID.flags &= ~(ATTACK<>8); + + autooff |= SID.voice[x].envelope; + } + + PWMMR2 = temp; + PWMLER = 0x04; + + if (!(PWMcounter--)) + PWMcounter = 29; + + temp = SID.noise; + SID.noise=SID.noise << 1; + + temp ^= SID.noise; + if ( ( temp & 0x4000 ) == 0x4000 ) + { + SID.noise |= 1; + } + + if((SID.flags & SID_AUTO_OFF) && !autooff) { + FIOCLR0 |= (1<= 63) + { + FIODIR0 |= (1<<4); // sck0/P0.4 + cmp_val -= 63; + } + else + { + FIODIR0 &= ~(1<<4); // sck0/P0.4 + } + +} diff --git a/boop/trunk/audio/soundirq.h b/boop/trunk/audio/soundirq.h new file mode 100644 index 0000000..e988d29 --- /dev/null +++ b/boop/trunk/audio/soundirq.h @@ -0,0 +1,24 @@ +/* + soundirq.h - sound interrupt handler + Copyright (C) 2007 Ch. Klippel + + 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 3 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 SOUNDIRQ_H +#define SOUNDIRQ_H + +void __attribute__ ((section(".text.fastcode"))) soundIRQ (void); + +#endif diff --git a/boop/trunk/audio/sounds.h b/boop/trunk/audio/sounds.h new file mode 100644 index 0000000..2fd1f10 --- /dev/null +++ b/boop/trunk/audio/sounds.h @@ -0,0 +1,4417 @@ +#define sound1_len 0x0000371C +const unsigned char sound1_data[] = { + 0x80,0x7D,0x7B,0x7A,0x7A,0x7D,0x7F,0x80,0x7E,0x7D,0x7F,0x7D,0x7C,0x7F,0x80,0x81, + 0x83,0x83,0x82,0x80,0x7F,0x7D,0x7D,0x7E,0x87,0x8D,0x90,0x92,0x81,0x77,0x6D,0x6B, + 0x72,0x7A,0x77,0x76,0x6B,0x5A,0x80,0x7F,0x73,0x8A,0x8A,0x83,0x7B,0x86,0x80,0x77, + 0x7B,0x75,0x79,0x7C,0x7F,0x7A,0x7A,0x7D,0x7F,0x7D,0x7A,0x88,0x89,0x86,0x88,0x7A, + 0x7E,0x8F,0x8B,0x8B,0xA2,0xA3,0x9A,0x9A,0x82,0x7F,0x93,0x8E,0x98,0xA7,0x97,0x94, + 0x9D,0x95,0x77,0x78,0x8A,0x8F,0x94,0x89,0x79,0x6D,0x6C,0x6B,0x66,0x75,0x7A,0x6E, + 0x6A,0x62,0x5B,0x57,0x5C,0x5E,0x5D,0x61,0x5A,0x59,0x57,0x54,0x61,0x6F,0x70,0x69, + 0x6B,0x73,0x6F,0x63,0x64,0x74,0x7F,0x7D,0x76,0x74,0x71,0x71,0x6E,0x70,0x78,0x77, + 0x79,0x78,0x77,0x7D,0x86,0xA1,0xA9,0x9A,0x8F,0x8C,0x8F,0x8E,0x8F,0x8D,0x8C,0x8D, + 0x90,0x97,0x8C,0x78,0x7B,0x89,0x8C,0x8E,0x96,0x9E,0x97,0x8F,0x89,0x84,0x8C,0x92, + 0x94,0x8D,0x88,0x81,0x7C,0x86,0x8C,0x91,0x99,0x9A,0x95,0x8E,0x8C,0x8B,0x88,0x8D, + 0x94,0x95,0x8F,0x8C,0x88,0x8C,0x93,0x99,0x9A,0x99,0x95,0x8D,0x8E,0x88,0x90,0xA3, + 0xA8,0xA3,0x93,0x87,0x84,0x80,0x80,0x86,0x84,0x7A,0x6E,0x65,0x60,0x5F,0x68,0x6E, + 0x68,0x5C,0x52,0x4B,0x4A,0x57,0x62,0x69,0x70,0x6A,0x5D,0x5C,0x5F,0x63,0x68,0x70, + 0x70,0x67,0x68,0x67,0x6B,0x77,0x78,0x70,0x6C,0x61,0x5D,0x61,0x67,0x76,0x78,0x78, + 0x73,0x70,0x74,0x7D,0x88,0x97,0x9E,0x96,0x95,0x90,0x89,0x92,0x98,0x96,0x95,0x87, + 0x7A,0x79,0x7D,0x87,0x95,0xA1,0xA1,0x96,0x8F,0x8C,0x89,0x8E,0x93,0x8D,0x89,0x86, + 0x7E,0x83,0x93,0x96,0x94,0x91,0x84,0x7D,0x7F,0x8B,0x98,0x9E,0xA2,0x99,0x8C,0x89, + 0x8C,0x90,0x9B,0x95,0x8F,0x8F,0x8C,0x92,0x9E,0xA6,0xA7,0x9E,0x8D,0x82,0x82,0x8C, + 0x98,0xA2,0xA0,0x9B,0x91,0x85,0x85,0x82,0x80,0x7C,0x6F,0x63,0x60,0x62,0x68,0x70, + 0x6C,0x66,0x5B,0x4F,0x50,0x57,0x5F,0x66,0x69,0x68,0x5F,0x5E,0x62,0x62,0x69,0x6A, + 0x66,0x63,0x6A,0x72,0x76,0x7B,0x75,0x6A,0x60,0x5A,0x5A,0x61,0x6C,0x70,0x73,0x74, + 0x73,0x7A,0x80,0x86,0x8F,0x93,0x94,0x95,0x99,0x9C,0x9E,0x9E,0x95,0x8A,0x80,0x7D, + 0x7E,0x87,0x8E,0x92,0x97,0x97,0x95,0x8E,0x8A,0x88,0x83,0x82,0x84,0x87,0x8E,0x94, + 0x99,0x9C,0x96,0x8C,0x82,0x7F,0x85,0x8D,0x9B,0xA5,0xA5,0xA4,0x9D,0x98,0x93,0x8D, + 0x8D,0x8D,0x93,0x9A,0x9F,0xA4,0xA4,0xA1,0x96,0x8D,0x89,0x8A,0x8D,0x93,0x99,0x9C, + 0xA1,0x9E,0x95,0x85,0x7C,0x76,0x78,0x7F,0x7B,0x7A,0x78,0x71,0x6D,0x65,0x5C,0x52, + 0x50,0x55,0x59,0x65,0x6A,0x6B,0x6C,0x64,0x59,0x50,0x4E,0x54,0x59,0x65,0x71,0x71, + 0x74,0x71,0x6C,0x63,0x5B,0x60,0x62,0x65,0x6C,0x71,0x75,0x70,0x6A,0x61,0x5B,0x62, + 0x6B,0x7C,0x8D,0x93,0x9D,0x9E,0x9F,0x9E,0x94,0x92,0x90,0x92,0x95,0x9B,0x9F,0x98, + 0x95,0x89,0x7F,0x7C,0x7B,0x85,0x8D,0x90,0x90,0x8C,0x88,0x82,0x7A,0x7B,0x7B,0x7D, + 0x82,0x88,0x92,0x9B,0xA0,0x98,0x8B,0x81,0x7F,0x8B,0x9B,0xA0,0xA0,0x9A,0x95,0x94, + 0x90,0x92,0x8E,0x8A,0x96,0x99,0xA0,0xA9,0xAB,0xA2,0x94,0x87,0x7D,0x83,0x8F,0x96, + 0x9B,0x96,0x8E,0x88,0x7B,0x74,0x72,0x6E,0x70,0x6B,0x6D,0x74,0x73,0x77,0x68,0x52, + 0x4D,0x4C,0x57,0x67,0x6B,0x69,0x61,0x5C,0x5A,0x54,0x55,0x55,0x5C,0x62,0x68,0x72, + 0x73,0x78,0x6A,0x5A,0x56,0x50,0x5D,0x67,0x69,0x6D,0x66,0x63,0x60,0x5B,0x5F,0x63, + 0x6D,0x7E,0x89,0x99,0xA6,0xA9,0xA5,0x93,0x88,0x85,0x8D,0x9D,0x9F,0xA4,0x99,0x8F, + 0x8C,0x7F,0x7E,0x7B,0x7C,0x85,0x84,0x8E,0x92,0x93,0x8D,0x79,0x73,0x6F,0x7B,0x88, + 0x90,0x95,0x8C,0x8D,0x8E,0x89,0x87,0x87,0x8B,0x97,0x9B,0x9E,0xA2,0x9C,0x99,0x8E, + 0x87,0x87,0x8E,0x9C,0xA3,0xA4,0xA1,0x9C,0x93,0x8A,0x88,0x84,0x8A,0x8F,0x8B,0x96, + 0x99,0x97,0x8D,0x78,0x6E,0x6A,0x73,0x7F,0x7E,0x79,0x72,0x6C,0x63,0x60,0x5A,0x58, + 0x60,0x63,0x68,0x71,0x70,0x6D,0x62,0x51,0x50,0x57,0x63,0x70,0x71,0x74,0x73,0x6C, + 0x67,0x60,0x5C,0x60,0x66,0x65,0x69,0x72,0x72,0x6F,0x5E,0x4E,0x56,0x59,0x6C,0x7B, + 0x7D,0x89,0x8A,0x8D,0x8B,0x8C,0x8E,0x94,0x9C,0x9B,0xA3,0xA6,0xA3,0x9A,0x84,0x7F, + 0x84,0x85,0x93,0x91,0x8F,0x8D,0x85,0x81,0x7A,0x7D,0x7F,0x87,0x89,0x8C,0x95,0x95, + 0x95,0x88,0x7A,0x7E,0x89,0x94,0x9E,0x9D,0x9B,0x95,0x91,0x8C,0x88,0x8B,0x91,0x99, + 0x97,0xA1,0xA6,0xA4,0x9E,0x8F,0x86,0x8B,0x97,0xA0,0x9F,0x9B,0x95,0x8C,0x88,0x83, + 0x81,0x82,0x8C,0x8C,0x8A,0x8D,0x84,0x80,0x6D,0x60,0x60,0x65,0x72,0x75,0x74,0x70, + 0x69,0x62,0x5F,0x5A,0x5B,0x60,0x66,0x66,0x6D,0x73,0x71,0x67,0x59,0x58,0x5E,0x6B, + 0x76,0x77,0x70,0x6A,0x62,0x5A,0x5D,0x5D,0x5F,0x65,0x62,0x6A,0x78,0x81,0x7C,0x6D, + 0x68,0x73,0x85,0x99,0xA5,0xA3,0xA2,0x9E,0x98,0x93,0x94,0x98,0x99,0x96,0x9A,0x9E, + 0x9F,0x96,0x86,0x79,0x74,0x81,0x86,0x8F,0x92,0x8B,0x88,0x81,0x7C,0x78,0x7E,0x88, + 0x93,0x95,0x99,0x9B,0x92,0x8B,0x83,0x81,0x85,0x93,0x9F,0xA4,0xA0,0x94,0x8B,0x82, + 0x88,0x8D,0x95,0x97,0x94,0xA1,0xA4,0xA5,0x90,0x80,0x81,0x84,0x93,0x9B,0x99,0x92, + 0x8B,0x85,0x7E,0x79,0x7C,0x7E,0x7A,0x7E,0x85,0x83,0x7E,0x6C,0x59,0x57,0x5F,0x6A, + 0x70,0x75,0x73,0x6C,0x64,0x5C,0x56,0x59,0x64,0x69,0x6C,0x76,0x7B,0x76,0x68,0x5B, + 0x57,0x60,0x6C,0x71,0x70,0x71,0x69,0x61,0x5A,0x56,0x5A,0x68,0x73,0x75,0x7F,0x84, + 0x83,0x7D,0x79,0x7D,0x8C,0x9D,0xAA,0xAF,0xA9,0x9F,0x91,0x8B,0x8D,0x92,0x98,0x8C, + 0x91,0x9B,0x9E,0x97,0x7A,0x6D,0x6E,0x7A,0x8B,0x8E,0x8A,0x8A,0x89,0x81,0x79,0x75, + 0x7B,0x89,0x8C,0x94,0x9B,0x99,0x90,0x81,0x7C,0x7E,0x8E,0x98,0xA0,0xA0,0x99,0x91, + 0x84,0x85,0x86,0x93,0x91,0x8E,0x9E,0xA3,0xA9,0x97,0x7F,0x79,0x7F,0x90,0x94,0x91, + 0x8E,0x88,0x82,0x79,0x71,0x71,0x7A,0x79,0x7C,0x82,0x7D,0x78,0x66,0x5D,0x5A,0x60, + 0x70,0x77,0x7D,0x73,0x67,0x5E,0x5B,0x5C,0x66,0x67,0x60,0x72,0x78,0x81,0x70,0x59, + 0x54,0x52,0x67,0x71,0x72,0x70,0x6B,0x62,0x5B,0x57,0x5D,0x6A,0x6A,0x77,0x7C,0x83, + 0x88,0x7B,0x79,0x7B,0x8A,0x9B,0xA6,0xAB,0xA5,0x9D,0x8A,0x84,0x85,0x90,0x99,0x91, + 0x99,0x97,0x92,0x84,0x6F,0x6C,0x70,0x83,0x8C,0x90,0x8C,0x82,0x7C,0x71,0x74,0x7B, + 0x84,0x82,0x8D,0x99,0x9A,0x93,0x7C,0x76,0x77,0x87,0x96,0x9A,0x9C,0x98,0x90,0x80, + 0x7B,0x81,0x8F,0x9B,0x9F,0xA0,0x9C,0x97,0x8D,0x80,0x7C,0x83,0x8C,0x99,0x9B,0x8F, + 0x83,0x73,0x6E,0x76,0x7B,0x7F,0x78,0x7D,0x86,0x83,0x78,0x60,0x5A,0x5D,0x6D,0x79, + 0x79,0x78,0x6F,0x68,0x61,0x5C,0x63,0x6F,0x65,0x70,0x7A,0x7B,0x7B,0x65,0x5B,0x59, + 0x62,0x6D,0x70,0x72,0x72,0x6E,0x5C,0x57,0x57,0x62,0x71,0x72,0x7B,0x7E,0x80,0x7A, + 0x73,0x75,0x7D,0x93,0x9F,0xA7,0xA9,0x9D,0x93,0x8C,0x8B,0x96,0x97,0x91,0x9C,0xA0, + 0xA0,0x8B,0x72,0x6F,0x72,0x80,0x8A,0x8C,0x8A,0x85,0x7C,0x71,0x6F,0x79,0x81,0x80, + 0x8E,0x8F,0x90,0x89,0x76,0x75,0x76,0x86,0x92,0x97,0x99,0x95,0x8B,0x7F,0x7E,0x84, + 0x94,0x97,0x9C,0xA4,0x9F,0x9A,0x86,0x7F,0x81,0x8C,0x99,0x9B,0x9A,0x92,0x87,0x7C, + 0x78,0x80,0x85,0x80,0x8A,0x8D,0x8D,0x84,0x6D,0x64,0x64,0x73,0x7C,0x7E,0x81,0x7C, + 0x70,0x65,0x60,0x63,0x73,0x79,0x7A,0x7E,0x78,0x72,0x65,0x5C,0x61,0x6A,0x77,0x7D, + 0x7B,0x77,0x69,0x5B,0x58,0x5D,0x6B,0x70,0x72,0x7C,0x7E,0x7A,0x69,0x64,0x6D,0x7A, + 0x90,0x97,0x9D,0x9F,0x96,0x8F,0x88,0x92,0x9C,0x94,0x9D,0xA5,0xA8,0xA0,0x85,0x7A, + 0x75,0x80,0x89,0x8A,0x8D,0x8C,0x83,0x70,0x6A,0x70,0x7E,0x86,0x85,0x8A,0x88,0x84, + 0x76,0x6F,0x72,0x7A,0x8D,0x92,0x96,0x96,0x89,0x81,0x79,0x81,0x8E,0x8A,0x97,0x9D, + 0xA3,0x9F,0x87,0x81,0x7E,0x8C,0x9A,0x9D,0x9F,0x9A,0x8F,0x7F,0x79,0x82,0x87,0x87, + 0x8E,0x8F,0x94,0x8E,0x75,0x6C,0x69,0x73,0x7F,0x83,0x86,0x82,0x74,0x65,0x5E,0x67, + 0x77,0x7A,0x7B,0x80,0x7D,0x78,0x6A,0x5E,0x60,0x6C,0x79,0x7D,0x80,0x7B,0x6D,0x63, + 0x5C,0x64,0x71,0x70,0x75,0x7A,0x7A,0x77,0x63,0x5F,0x67,0x70,0x81,0x85,0x8C,0x92, + 0x86,0x7C,0x7D,0x89,0x98,0x9C,0x9C,0xA1,0xA3,0x9D,0x8D,0x82,0x85,0x8D,0x93,0x8E, + 0x8C,0x8D,0x84,0x78,0x6E,0x70,0x7D,0x7D,0x7C,0x84,0x85,0x85,0x78,0x6A,0x6E,0x73, + 0x7F,0x81,0x81,0x8B,0x89,0x80,0x78,0x79,0x84,0x88,0x86,0x90,0x96,0x96,0x8F,0x7F, + 0x81,0x85,0x8E,0x96,0x93,0x99,0x99,0x8D,0x83,0x7C,0x86,0x8F,0x88,0x8E,0x92,0x91, + 0x8E,0x79,0x75,0x74,0x79,0x84,0x7D,0x82,0x83,0x7C,0x71,0x66,0x6D,0x79,0x78,0x76, + 0x7C,0x7D,0x81,0x72,0x66,0x67,0x6B,0x78,0x77,0x78,0x7A,0x79,0x70,0x64,0x65,0x70, + 0x75,0x71,0x79,0x7B,0x7E,0x76,0x64,0x66,0x69,0x76,0x7D,0x7D,0x88,0x8A,0x86,0x7B, + 0x78,0x84,0x92,0x8E,0x8F,0x98,0x99,0x9D,0x88,0x80,0x82,0x84,0x91,0x8B,0x8C,0x90, + 0x8B,0x7F,0x73,0x73,0x80,0x83,0x7D,0x87,0x89,0x8D,0x81,0x6F,0x73,0x72,0x7C,0x82, + 0x81,0x89,0x89,0x81,0x72,0x70,0x7C,0x86,0x82,0x83,0x8B,0x8F,0x8F,0x7B,0x75,0x7A, + 0x7E,0x88,0x88,0x8A,0x8E,0x8C,0x81,0x74,0x76,0x82,0x84,0x81,0x8B,0x8B,0x8E,0x85, + 0x72,0x75,0x74,0x7C,0x82,0x81,0x89,0x87,0x7F,0x72,0x6C,0x76,0x82,0x80,0x80,0x87, + 0x87,0x87,0x79,0x6F,0x72,0x77,0x81,0x80,0x83,0x88,0x84,0x7B,0x70,0x6F,0x7A,0x81, + 0x7E,0x86,0x8B,0x8B,0x84,0x73,0x74,0x75,0x7E,0x86,0x84,0x8E,0x8D,0x85,0x7B,0x74, + 0x7C,0x87,0x89,0x87,0x8D,0x8E,0x8E,0x81,0x75,0x78,0x7B,0x85,0x86,0x84,0x8A,0x86, + 0x7C,0x71,0x6D,0x76,0x80,0x7C,0x81,0x84,0x85,0x82,0x6E,0x6D,0x6F,0x76,0x7E,0x7C, + 0x83,0x85,0x80,0x74,0x6D,0x75,0x7F,0x81,0x7E,0x85,0x88,0x8A,0x81,0x72,0x77,0x79, + 0x82,0x86,0x83,0x8A,0x8A,0x84,0x78,0x73,0x7C,0x86,0x85,0x84,0x8B,0x8A,0x8C,0x7F, + 0x75,0x79,0x7B,0x85,0x85,0x86,0x8C,0x8A,0x81,0x75,0x75,0x82,0x88,0x81,0x86,0x8B, + 0x8C,0x89,0x78,0x77,0x78,0x7F,0x86,0x81,0x87,0x88,0x85,0x7B,0x71,0x76,0x81,0x84, + 0x7E,0x87,0x8B,0x8A,0x84,0x75,0x76,0x7A,0x82,0x86,0x84,0x8B,0x8C,0x86,0x7B,0x74, + 0x7A,0x88,0x86,0x85,0x8E,0x8C,0x90,0x80,0x77,0x78,0x79,0x86,0x83,0x84,0x8A,0x88, + 0x82,0x72,0x71,0x79,0x80,0x80,0x7C,0x84,0x86,0x85,0x7A,0x6F,0x72,0x75,0x80,0x81, + 0x7F,0x85,0x85,0x7C,0x73,0x70,0x7A,0x82,0x7E,0x88,0x88,0x8A,0x89,0x77,0x77,0x72, + 0x7A,0x86,0x82,0x88,0x8A,0x88,0x7D,0x72,0x79,0x81,0x88,0x85,0x87,0x8B,0x8D,0x8A, + 0x7C,0x76,0x89,0x86,0x88,0x8F,0x6D,0x80,0x8B,0x6D,0x5E,0x6A,0x7E,0x84,0x8C,0x96, + 0x95,0x94,0x92,0x92,0x92,0x8D,0x95,0x93,0x91,0x94,0x91,0x89,0x71,0x62,0x60,0x61, + 0x60,0x5D,0x62,0x63,0x6A,0x65,0x5C,0x64,0x68,0x76,0x81,0x7F,0x88,0x8D,0x8B,0x80, + 0x7D,0x86,0x91,0x9A,0xA8,0xB5,0xBB,0xBE,0xB1,0xA7,0xA1,0x9C,0xA1,0x9D,0x9B,0x9A, + 0x98,0x8A,0x76,0x71,0x71,0x7C,0x78,0x73,0x7B,0x7A,0x77,0x63,0x58,0x56,0x54,0x57, + 0x4B,0x4C,0x54,0x57,0x54,0x4D,0x50,0x5C,0x6C,0x6F,0x78,0x80,0x80,0x84,0x7B,0x79, + 0x73,0x6F,0x7A,0x82,0x8E,0x92,0x98,0x9B,0x9C,0xA8,0xAB,0xAF,0xAC,0xAC,0xB5,0xB2, + 0xB0,0xA4,0x98,0x93,0x91,0x96,0x95,0x93,0x91,0x8F,0x8E,0x87,0x7D,0x77,0x70,0x6A, + 0x63,0x5B,0x56,0x51,0x49,0x46,0x47,0x4D,0x54,0x58,0x60,0x63,0x66,0x61,0x5E,0x63, + 0x6A,0x7A,0x7D,0x84,0x8F,0x97,0x9F,0x9C,0xA0,0xA8,0xB2,0xBD,0xC3,0xC6,0xC6,0xC6, + 0xBD,0xB1,0xAA,0xA6,0xA2,0x9E,0x9A,0x94,0x90,0x85,0x7C,0x74,0x69,0x68,0x66,0x64, + 0x64,0x5F,0x59,0x4A,0x3E,0x39,0x3A,0x3E,0x3A,0x40,0x42,0x45,0x48,0x45,0x4C,0x52, + 0x5F,0x69,0x6E,0x78,0x7C,0x7C,0x7A,0x79,0x7D,0x83,0x8B,0x92,0x9C,0xA5,0xAB,0xA7, + 0xA5,0xA7,0xA7,0xAF,0xB5,0xB9,0xC2,0xC4,0xC0,0xB9,0xB2,0xB1,0xAE,0xA9,0xA4,0xA2, + 0xA1,0x9E,0x97,0x8F,0x88,0x80,0x7D,0x7A,0x71,0x6E,0x6C,0x66,0x5B,0x52,0x50,0x51, + 0x4F,0x50,0x52,0x51,0x55,0x4B,0x46,0x44,0x45,0x50,0x55,0x60,0x69,0x70,0x76,0x6F, + 0x6E,0x75,0x80,0x85,0x88,0x92,0x96,0x9D,0x9D,0x97,0x9B,0x9F,0xA7,0xAB,0xAC,0xB2, + 0xB2,0xB0,0xA5,0x9D,0xA0,0xA2,0xA2,0xA1,0xA3,0xA2,0xA2,0x98,0x8B,0x85,0x7F,0x80, + 0x7E,0x7D,0x7D,0x7F,0x7B,0x6C,0x65,0x63,0x6B,0x6B,0x6A,0x70,0x6E,0x71,0x69,0x5B, + 0x56,0x53,0x5E,0x62,0x65,0x6D,0x6F,0x70,0x67,0x62,0x63,0x6B,0x73,0x74,0x7C,0x81, + 0x85,0x83,0x7C,0x7B,0x7C,0x85,0x8D,0x90,0x97,0x9C,0x9A,0x90,0x8A,0x8B,0x92,0x96, + 0x97,0x9E,0x9F,0xA2,0x9C,0x91,0x8D,0x88,0x90,0x94,0x94,0x99,0x99,0x98,0x8D,0x84, + 0x81,0x81,0x87,0x85,0x88,0x8A,0x89,0x87,0x76,0x6F,0x69,0x6A,0x73,0x71,0x73,0x75, + 0x73,0x68,0x59,0x55,0x5A,0x61,0x65,0x6B,0x6F,0x74,0x73,0x67,0x63,0x61,0x6A,0x76, + 0x7B,0x82,0x89,0x8D,0x86,0x7A,0x76,0x7A,0x86,0x88,0x8E,0x95,0x95,0x9B,0x8F,0x87, + 0x84,0x83,0x8D,0x8F,0x95,0x98,0x9B,0x9A,0x8C,0x86,0x88,0x91,0x95,0x99,0xA0,0xA3, + 0xA8,0xA0,0x95,0x8E,0x8C,0x95,0x98,0x9A,0x9D,0x9E,0x9A,0x8B,0x81,0x79,0x7B,0x7E, + 0x7B,0x81,0x80,0x80,0x7A,0x6B,0x63,0x5C,0x60,0x62,0x63,0x66,0x67,0x6A,0x60,0x56, + 0x51,0x53,0x5A,0x5A,0x63,0x69,0x6F,0x71,0x65,0x5E,0x58,0x5A,0x61,0x65,0x6D,0x73, + 0x7C,0x79,0x6F,0x6B,0x6C,0x76,0x7A,0x80,0x8A,0x8F,0x96,0x8E,0x86,0x81,0x7F,0x88, + 0x8C,0x94,0x9A,0xA1,0xA5,0x9A,0x90,0x8B,0x91,0x96,0x98,0xA1,0xA4,0xAA,0xA6,0x9A, + 0x94,0x8E,0x91,0x95,0x99,0xA0,0xA3,0xA8,0x9F,0x93,0x8C,0x8A,0x8F,0x8F,0x96,0x9B, + 0x9C,0x9D,0x91,0x8A,0x80,0x7B,0x7E,0x7D,0x83,0x83,0x87,0x86,0x78,0x6F,0x67,0x6A, + 0x6A,0x6D,0x77,0x77,0x7C,0x75,0x6C,0x64,0x5A,0x5E,0x5E,0x64,0x69,0x6B,0x71,0x69, + 0x5F,0x56,0x56,0x5C,0x5C,0x66,0x6B,0x70,0x72,0x69,0x66,0x5E,0x5E,0x65,0x69,0x72, + 0x74,0x7D,0x7F,0x76,0x70,0x6B,0x73,0x76,0x7D,0x88,0x8B,0x94,0x8D,0x87,0x83,0x7D, + 0x85,0x87,0x91,0x97,0x9B,0xA6,0xA1,0x9A,0x90,0x90,0x97,0x97,0xA3,0xA7,0xAC,0xAF, + 0xA4,0x9E,0x91,0x90,0x94,0x95,0x9E,0x9D,0xA4,0xA6,0x9B,0x92,0x86,0x8A,0x8B,0x8E, + 0x98,0x96,0x9C,0x96,0x8C,0x86,0x79,0x7D,0x7A,0x7D,0x82,0x81,0x89,0x81,0x77,0x6D, + 0x64,0x68,0x64,0x6D,0x72,0x71,0x76,0x69,0x64,0x5A,0x54,0x5A,0x57,0x61,0x62,0x68, + 0x6E,0x66,0x61,0x55,0x56,0x5B,0x5B,0x69,0x6A,0x6F,0x70,0x67,0x67,0x5B,0x5D,0x60, + 0x62,0x6F,0x6F,0x7A,0x7A,0x74,0x6F,0x66,0x6D,0x6D,0x73,0x82,0x83,0x8E,0x89,0x86, + 0x84,0x7A,0x82,0x80,0x89,0x8F,0x91,0x9D,0x99,0x95,0x89,0x82,0x89,0x87,0x94,0x9B, + 0x9E,0xA5,0x9B,0x9D,0x94,0x8E,0x91,0x8E,0x9B,0x9B,0xA3,0xAA,0xA4,0x9F,0x91,0x90, + 0x92,0x92,0xA0,0xA1,0xA7,0xA8,0x9D,0x9D,0x8F,0x8F,0x8E,0x8D,0x97,0x94,0x9D,0x9D, + 0x96,0x8C,0x7B,0x7C,0x78,0x7B,0x86,0x83,0x8A,0x82,0x79,0x73,0x65,0x67,0x60,0x65, + 0x6C,0x6C,0x76,0x74,0x71,0x64,0x58,0x5C,0x59,0x64,0x6E,0x6F,0x78,0x6E,0x6D,0x65, + 0x5C,0x5F,0x59,0x64,0x67,0x6C,0x76,0x72,0x6F,0x60,0x59,0x5C,0x5A,0x6A,0x70,0x76, + 0x7C,0x73,0x75,0x6A,0x67,0x68,0x65,0x72,0x74,0x7E,0x85,0x85,0x83,0x74,0x73,0x74, + 0x78,0x88,0x8D,0x97,0x98,0x92,0x93,0x87,0x88,0x84,0x87,0x91,0x94,0x9F,0xA2,0xA3, + 0x9B,0x8D,0x8C,0x89,0x91,0x9F,0xA3,0xAE,0xA9,0xA5,0xA2,0x96,0x97,0x90,0x94,0x9A, + 0x9D,0xA8,0xA9,0xA8,0x9D,0x8F,0x8E,0x8B,0x94,0x9F,0xA2,0xA9,0xA2,0x9F,0x98,0x8E, + 0x8D,0x84,0x89,0x8C,0x90,0x98,0x98,0x97,0x89,0x7E,0x7C,0x77,0x80,0x86,0x8A,0x8F, + 0x86,0x83,0x7B,0x75,0x73,0x6A,0x6D,0x6D,0x73,0x7A,0x7B,0x79,0x6B,0x62,0x5E,0x5A, + 0x64,0x6B,0x70,0x73,0x6B,0x69,0x61,0x5E,0x59,0x51,0x56,0x57,0x60,0x68,0x6C,0x6B, + 0x5F,0x58,0x54,0x53,0x5F,0x66,0x6F,0x71,0x6D,0x6E,0x67,0x66,0x60,0x5B,0x61,0x64, + 0x6F,0x77,0x7E,0x7E,0x71,0x69,0x64,0x66,0x73,0x7C,0x86,0x89,0x86,0x87,0x80,0x7F, + 0x7B,0x77,0x7D,0x7F,0x8A,0x93,0x9A,0x99,0x8C,0x83,0x7E,0x7F,0x8C,0x94,0x9F,0xA0, + 0x9D,0x9D,0x96,0x96,0x91,0x8F,0x92,0x95,0xA0,0xA9,0xAF,0xAD,0xA0,0x98,0x92,0x95, + 0xA1,0xA8,0xB2,0xB0,0xAC,0xA9,0xA2,0xA0,0x98,0x96,0x95,0x96,0x9F,0xA4,0xA9,0xA3, + 0x95,0x8B,0x83,0x85,0x8F,0x96,0x9D,0x98,0x92,0x8E,0x88,0x87,0x7F,0x7C,0x7A,0x7B, + 0x84,0x89,0x8F,0x8A,0x7E,0x74,0x6B,0x6D,0x77,0x7E,0x84,0x81,0x7C,0x77,0x73,0x72, + 0x6B,0x67,0x64,0x65,0x6D,0x72,0x79,0x76,0x6B,0x60,0x56,0x56,0x60,0x68,0x6F,0x6D, + 0x69,0x66,0x62,0x63,0x5E,0x5B,0x58,0x59,0x61,0x68,0x70,0x70,0x67,0x5D,0x54,0x54, + 0x5F,0x6A,0x72,0x73,0x6F,0x6D,0x6B,0x6C,0x6A,0x67,0x65,0x65,0x6C,0x75,0x7E,0x82, + 0x7D,0x73,0x6B,0x68,0x72,0x7E,0x88,0x8B,0x85,0x83,0x80,0x83,0x82,0x7E,0x7D,0x7C, + 0x83,0x8C,0x95,0x9B,0x97,0x8E,0x84,0x80,0x89,0x95,0x9F,0xA3,0x9E,0x9C,0x97,0x9A, + 0x99,0x95,0x92,0x8E,0x92,0x98,0xA0,0xA6,0xA3,0x99,0x8E,0x86,0x8B,0x94,0x9C,0xA1, + 0x9B,0x97,0x92,0x92,0x92,0x8D,0x8A,0x83,0x84,0x89,0x90,0x98,0x97,0x90,0x85,0x7A, + 0x7C,0x85,0x8F,0x96,0x91,0x8E,0x89,0x89,0x8B,0x88,0x86,0x7F,0x7D,0x81,0x87,0x90, + 0x91,0x8B,0x81,0x74,0x72,0x7A,0x83,0x8C,0x87,0x83,0x7D,0x79,0x7D,0x7B,0x7B,0x74, + 0x6F,0x72,0x76,0x7F,0x82,0x7E,0x78,0x6B,0x67,0x6D,0x74,0x7F,0x7E,0x79,0x75,0x6F, + 0x74,0x76,0x76,0x73,0x6B,0x6B,0x6C,0x73,0x7A,0x7A,0x77,0x6D,0x64,0x6A,0x70,0x7A, + 0x7D,0x77,0x76,0x6F,0x73,0x78,0x78,0x79,0x71,0x6E,0x70,0x74,0x7E,0x82,0x80,0x7C, + 0x70,0x71,0x77,0x7C,0x86,0x81,0x80,0x7D,0x7A,0x82,0x82,0x81,0x7D,0x75,0x77,0x7B, + 0x82,0x8A,0x87,0x84,0x7A,0x73,0x7A,0x7D,0x86,0x88,0x83,0x82,0x7D,0x7F,0x83,0x80, + 0x7E,0x7A,0x76,0x7C,0x80,0x85,0x88,0x83,0x7D,0x77,0x79,0x80,0x86,0x8B,0x89,0x85, + 0x82,0x82,0x83,0x85,0x84,0x82,0x81,0x81,0x84,0x88,0x8A,0x87,0x83,0x7F,0x7F,0x85, + 0x88,0x8C,0x8B,0x89,0x87,0x85,0x84,0x85,0x85,0x84,0x83,0x81,0x82,0x84,0x84,0x83, + 0x81,0x80,0x80,0x82,0x83,0x85,0x86,0x85,0x83,0x81,0x80,0x82,0x84,0x84,0x84,0x84, + 0x83,0x84,0x84,0x84,0x83,0x83,0x83,0x83,0x83,0x85,0x86,0x87,0x86,0x85,0x85,0x85, + 0x86,0x87,0x87,0x87,0x86,0x85,0x84,0x83,0x84,0x84,0x84,0x84,0x83,0x83,0x82,0x82, + 0x81,0x80,0x80,0x7F,0x7F,0x7F,0x80,0x81,0x80,0x7F,0x7E,0x7D,0x7E,0x7F,0x7F,0x7E, + 0x7E,0x7E,0x7E,0x7D,0x7D,0x7D,0x7D,0x7E,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7E,0x7E,0x7F,0x7F,0x7F,0x7E, + 0x7D,0x7D,0x7D,0x7F,0x81,0x81,0x81,0x80,0x7F,0x7F,0x7F,0x7F,0x80,0x80,0x80,0x7F, + 0x7F,0x7F,0x7F,0x7F,0x7E,0x7E,0x7E,0x7E,0x7F,0x80,0x80,0x80,0x7F,0x7E,0x7D,0x7D, + 0x7F,0x7F,0x7E,0x7D,0x7C,0x7C,0x7B,0x7B,0x7B,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7D, + 0x7E,0x7E,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x80,0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x7E, + 0x7E,0x7E,0x7E,0x7E,0x7D,0x7E,0x80,0x81,0x81,0x80,0x80,0x7F,0x7F,0x80,0x80,0x81, + 0x81,0x80,0x80,0x7F,0x7F,0x7F,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, + 0x81,0x81,0x81,0x82,0x82,0x81,0x80,0x7F,0x7F,0x80,0x80,0x80,0x81,0x81,0x82,0x81, + 0x81,0x80,0x81,0x82,0x83,0x83,0x84,0x84,0x83,0x81,0x81,0x81,0x81,0x81,0x81,0x81, + 0x80,0x80,0x7F,0x7E,0x7E,0x7F,0x7F,0x7E,0x7F,0x7F,0x80,0x80,0x80,0x80,0x80,0x81, + 0x81,0x81,0x81,0x82,0x81,0x80,0x7F,0x7F,0x80,0x80,0x81,0x81,0x81,0x81,0x80,0x7F, + 0x7F,0x80,0x81,0x82,0x83,0x83,0x83,0x82,0x82,0x82,0x82,0x82,0x83,0x83,0x83,0x82, + 0x82,0x81,0x80,0x80,0x81,0x81,0x81,0x81,0x82,0x82,0x82,0x82,0x81,0x81,0x81,0x81, + 0x82,0x82,0x82,0x81,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x7F,0x7E,0x7E,0x7E, + 0x7F,0x7F,0x80,0x80,0x80,0x80,0x80,0x80,0x81,0x80,0x80,0x80,0x80,0x81,0x80,0x80, + 0x80,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x82,0x82,0x82,0x81,0x81,0x82,0x82, + 0x82,0x82,0x81,0x81,0x80,0x80,0x7F,0x7F,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7F,0x80, + 0x7F,0x7F,0x7F,0x7F,0x80,0x80,0x81,0x81,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x80, + 0x81,0x81,0x81,0x81,0x81,0x80,0x80,0x80,0x81,0x82,0x82,0x82,0x81,0x82,0x81,0x81, + 0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x7F,0x7F,0x7E,0x7E,0x7F,0x7F,0x80,0x80, + 0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7F,0x80,0x80,0x80,0x7F,0x7F,0x7E,0x7E,0x7E,0x7E, + 0x7F,0x7F,0x80,0x80,0x80,0x7F,0x7F,0x7F,0x80,0x81,0x81,0x82,0x82,0x81,0x81,0x80, + 0x80,0x80,0x80,0x80,0x80,0x81,0x81,0x81,0x80,0x80,0x7F,0x7F,0x80,0x81,0x81,0x82, + 0x82,0x81,0x80,0x80,0x80,0x80,0x81,0x81,0x80,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7F, + 0x80,0x80,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x80,0x81,0x81,0x81,0x80,0x80,0x7F,0x7E, + 0x7E,0x7E,0x7F,0x7E,0x7F,0x7E,0x7E,0x80,0x88,0x88,0x68,0x6C,0x85,0x8E,0x7D,0x7A, + 0x95,0x75,0x6D,0x83,0x7F,0x80,0x84,0x94,0x84,0x79,0x86,0x88,0x81,0x77,0x87,0x85, + 0x76,0x73,0x77,0x7F,0x80,0x81,0x87,0x86,0x78,0x7F,0x86,0x8C,0x86,0x86,0x87,0x74, + 0x7C,0x75,0x7C,0x87,0x8B,0x8B,0x75,0x7E,0x73,0x6C,0x90,0x81,0x68,0x82,0x7A,0x6A, + 0x6A,0x72,0x82,0x76,0x77,0x79,0x77,0x7A,0x75,0x7B,0x7A,0x7A,0x82,0x8B,0x8C,0x87, + 0x8B,0x8F,0x85,0x7F,0x88,0x83,0x77,0x84,0x92,0x8F,0x90,0x99,0xA5,0x9C,0x94,0x91, + 0x81,0x7D,0x89,0x8F,0x91,0x98,0x96,0x90,0x8F,0x8F,0x8E,0x7E,0x79,0x81,0x83,0x85, + 0x86,0x84,0x80,0x76,0x6F,0x73,0x6D,0x65,0x67,0x71,0x75,0x78,0x7C,0x71,0x6B,0x6C, + 0x6E,0x77,0x6F,0x64,0x67,0x6E,0x6A,0x66,0x6E,0x6F,0x6D,0x72,0x77,0x70,0x72,0x76, + 0x67,0x5C,0x6D,0x7C,0x7A,0x77,0x7D,0x81,0x76,0x74,0x73,0x74,0x7D,0x7D,0x75,0x77, + 0x85,0x86,0x8A,0x93,0xA2,0xAE,0x9F,0x9C,0xA8,0x98,0x90,0x9A,0x97,0x9C,0x97,0x8D, + 0x8A,0x91,0x88,0x78,0x7E,0x7D,0x86,0x87,0x7E,0x86,0x86,0x80,0x79,0x83,0x91,0x86, + 0x8B,0x88,0x8A,0x97,0x86,0x89,0x93,0x99,0x95,0x90,0x8F,0x89,0x95,0x8E,0x8B,0x8C, + 0x84,0x85,0x7D,0x8F,0x90,0x87,0x91,0x87,0x9A,0x94,0x8A,0x92,0x85,0x8D,0x80,0x79, + 0x7D,0x83,0x8E,0x89,0x90,0x8F,0x8B,0x7A,0x7D,0x8C,0x83,0x86,0x7A,0x7C,0x87,0x79, + 0x78,0x70,0x6D,0x70,0x63,0x5D,0x5F,0x65,0x6A,0x65,0x69,0x66,0x5E,0x55,0x56,0x67, + 0x60,0x5F,0x62,0x66,0x73,0x61,0x5F,0x64,0x63,0x6B,0x60,0x63,0x70,0x72,0x79,0x79, + 0x7C,0x74,0x66,0x5D,0x5E,0x6E,0x6B,0x70,0x79,0x7A,0x83,0x79,0x75,0x7A,0x7C,0x7F, + 0x7D,0x89,0x9F,0xA2,0xA6,0xA6,0xA1,0x9D,0x8E,0x87,0x88,0x96,0x9C,0x97,0x9C,0x99, + 0x9B,0x94,0x80,0x7F,0x84,0x84,0x87,0x86,0x93,0x9A,0x94,0x93,0x88,0x85,0x81,0x7F, + 0x85,0x8D,0xA1,0xA7,0x9F,0x9B,0x97,0x95,0x88,0x82,0x8D,0x8C,0x94,0x94,0x91,0x9C, + 0x95,0x8B,0x84,0x88,0x8C,0x89,0x85,0x88,0x9E,0xA2,0x9B,0x8C,0x87,0x90,0x84,0x7C, + 0x88,0x8E,0x95,0x90,0x8B,0x8F,0x82,0x7A,0x73,0x76,0x7B,0x70,0x67,0x6F,0x84,0x7B, + 0x6B,0x69,0x6C,0x6A,0x59,0x59,0x6A,0x6C,0x67,0x62,0x60,0x63,0x59,0x54,0x5B,0x65, + 0x63,0x5A,0x52,0x65,0x74,0x67,0x64,0x66,0x72,0x70,0x5F,0x6A,0x79,0x78,0x6D,0x63, + 0x6D,0x6D,0x66,0x6C,0x70,0x76,0x73,0x6E,0x6B,0x7A,0x8C,0x84,0x84,0x8A,0x93,0x92, + 0x88,0x94,0xA1,0xA5,0xA3,0xA0,0xA0,0x9C,0x96,0x97,0x96,0x93,0x8E,0x8A,0x83,0x89, + 0x9A,0x8F,0x88,0x88,0x89,0x89,0x79,0x80,0x8F,0x94,0x8E,0x87,0x8C,0x89,0x82,0x8E, + 0x97,0x9B,0x98,0x91,0x90,0x83,0x94,0x9E,0x92,0x98,0x8E,0x8E,0x8D,0x82,0x8B,0x91, + 0x94,0x91,0x86,0x8E,0x88,0x82,0x8F,0x96,0x95,0x87,0x85,0x85,0x8B,0x9C,0x95,0x90, + 0x8A,0x85,0x82,0x76,0x7C,0x87,0x86,0x82,0x77,0x74,0x6D,0x62,0x6B,0x71,0x73,0x6B, + 0x66,0x5F,0x54,0x67,0x70,0x68,0x65,0x5E,0x5C,0x5B,0x54,0x5E,0x64,0x66,0x67,0x60, + 0x63,0x5D,0x5B,0x64,0x68,0x6A,0x68,0x63,0x61,0x6B,0x7E,0x79,0x6A,0x6F,0x69,0x66, + 0x60,0x68,0x78,0x78,0x75,0x72,0x75,0x73,0x76,0x7B,0x89,0x92,0x8B,0x8A,0x8B,0x8A, + 0x9E,0xB2,0xAB,0xA9,0xA2,0x9A,0x94,0x89,0x8F,0x9A,0x9A,0x97,0x91,0x8A,0x89,0x81, + 0x82,0x8C,0x8E,0x86,0x7C,0x78,0x80,0x99,0x97,0x91,0x93,0x8C,0x8C,0x85,0x84,0x98, + 0x9F,0x96,0x95,0x8E,0x92,0x89,0x86,0x98,0x99,0x96,0x8C,0x89,0x82,0x90,0xA3,0x9C, + 0x9A,0x8F,0x8B,0x8D,0x7D,0x8A,0x98,0x93,0x96,0x8C,0x88,0x88,0x7B,0x7F,0x8C,0x8C, + 0x82,0x7A,0x71,0x77,0x8D,0x86,0x7D,0x7B,0x70,0x6D,0x63,0x5D,0x6F,0x75,0x6F,0x6B, + 0x65,0x62,0x58,0x55,0x65,0x69,0x5E,0x5C,0x5A,0x4D,0x5D,0x72,0x69,0x69,0x64,0x5A, + 0x5F,0x5A,0x5C,0x6E,0x73,0x75,0x70,0x6B,0x69,0x61,0x60,0x71,0x6E,0x67,0x6A,0x60, + 0x67,0x80,0x82,0x79,0x80,0x7D,0x7A,0x73,0x77,0x90,0x9C,0x9D,0x9E,0x9E,0x9C,0x9C, + 0x99,0xA8,0xAD,0xA4,0xA0,0x9A,0x8D,0x91,0xA8,0xA3,0x9B,0x94,0x8D,0x89,0x7A,0x7B, + 0x8E,0x8F,0x88,0x8A,0x83,0x84,0x83,0x81,0x8E,0x94,0x8F,0x8B,0x85,0x83,0x98,0xA2, + 0x99,0x96,0x94,0x8E,0x8A,0x82,0x91,0xA3,0x98,0x98,0x97,0x92,0x8E,0x86,0x8E,0x9A, + 0x98,0x90,0x8D,0x86,0x84,0x9A,0x9F,0x91,0x93,0x8A,0x82,0x7E,0x75,0x85,0x8D,0x83, + 0x82,0x7B,0x78,0x77,0x6D,0x74,0x7C,0x75,0x6D,0x67,0x5C,0x65,0x7D,0x71,0x67,0x6C, + 0x64,0x5F,0x53,0x59,0x6E,0x65,0x5D,0x66,0x62,0x5F,0x5A,0x5B,0x69,0x66,0x5F,0x60, + 0x5F,0x58,0x69,0x7B,0x70,0x70,0x6C,0x68,0x67,0x61,0x67,0x77,0x71,0x6D,0x74,0x73, + 0x74,0x70,0x78,0x81,0x82,0x7D,0x82,0x82,0x83,0xA3,0xAB,0xA4,0xAA,0xA4,0x9C,0x9A, + 0x95,0xA1,0xAA,0xA1,0x9F,0x9F,0x97,0x8F,0x8A,0x8B,0x92,0x8B,0x87,0x8A,0x7D,0x7E, + 0x97,0x91,0x8B,0x92,0x88,0x86,0x83,0x81,0x8F,0x91,0x8B,0x8F,0x92,0x8F,0x8B,0x8A, + 0x95,0x98,0x92,0x95,0x93,0x85,0x8F,0xA6,0xA0,0x99,0x9F,0x94,0x8D,0x88,0x84,0x91, + 0x92,0x8F,0x94,0x92,0x8C,0x85,0x83,0x85,0x86,0x7F,0x7D,0x84,0x72,0x74,0x8C,0x82, + 0x77,0x80,0x77,0x6D,0x68,0x63,0x6E,0x70,0x66,0x68,0x71,0x68,0x5D,0x61,0x61,0x63, + 0x5F,0x5A,0x60,0x59,0x59,0x6E,0x71,0x64,0x6C,0x6E,0x5B,0x5A,0x5D,0x5C,0x65,0x63, + 0x64,0x70,0x6D,0x66,0x68,0x6B,0x6A,0x68,0x66,0x6D,0x69,0x5F,0x77,0x8A,0x74,0x78, + 0x8C,0x7F,0x79,0x7F,0x82,0x8C,0x91,0x8E,0xA0,0xAB,0x9F,0xA1,0xAD,0xA7,0x9B,0x9C, + 0x9D,0x9C,0x91,0x8E,0xA4,0xA0,0x8C,0x93,0x9A,0x86,0x7C,0x84,0x84,0x83,0x7E,0x7E, + 0x8B,0x8D,0x80,0x8A,0x95,0x8C,0x85,0x85,0x86,0x89,0x82,0x84,0x9A,0x9A,0x8A,0x97, + 0xA4,0x91,0x8C,0x98,0x95,0x92,0x8E,0x90,0x95,0x94,0x90,0x93,0x9A,0x95,0x91,0x8C, + 0x89,0x89,0x8A,0x86,0x87,0x8A,0x83,0x85,0x87,0x83,0x7E,0x80,0x81,0x77,0x76,0x7A, + 0x73,0x72,0x75,0x72,0x6F,0x6C,0x6D,0x6B,0x69,0x69,0x67,0x68,0x67,0x66,0x64,0x61, + 0x61,0x63,0x63,0x63,0x61,0x64,0x64,0x62,0x64,0x65,0x63,0x61,0x65,0x66,0x67,0x68, + 0x6A,0x6C,0x69,0x6C,0x6D,0x6E,0x70,0x72,0x74,0x77,0x7C,0x7B,0x7C,0x81,0x83,0x84, + 0x87,0x8B,0x8C,0x8E,0x91,0x92,0x93,0x93,0x95,0x96,0x95,0x95,0x95,0x98,0x96,0x94, + 0x96,0x94,0x92,0x90,0x90,0x91,0x91,0x8E,0x91,0x8D,0x8A,0x8B,0x8A,0x8B,0x89,0x89, + 0x88,0x8A,0x88,0x86,0x87,0x86,0x88,0x88,0x86,0x8A,0x89,0x86,0x8B,0x8B,0x89,0x8A, + 0x8B,0x8A,0x8A,0x8B,0x8A,0x8B,0x8A,0x8A,0x8A,0x88,0x86,0x85,0x86,0x84,0x83,0x81, + 0x7F,0x80,0x7F,0x7D,0x7F,0x80,0x7D,0x7D,0x7C,0x7A,0x7A,0x7A,0x7A,0x7A,0x79,0x79, + 0x79,0x77,0x78,0x77,0x77,0x75,0x73,0x72,0x71,0x72,0x71,0x70,0x70,0x72,0x71,0x6F, + 0x71,0x72,0x70,0x71,0x72,0x71,0x72,0x73,0x74,0x75,0x76,0x75,0x77,0x75,0x75,0x77, + 0x76,0x78,0x78,0x77,0x77,0x79,0x79,0x79,0x7B,0x7D,0x7E,0x80,0x80,0x81,0x83,0x82, + 0x86,0x87,0x88,0x8B,0x89,0x8A,0x8B,0x8C,0x8D,0x8C,0x8B,0x8B,0x89,0x88,0x88,0x86, + 0x85,0x84,0x82,0x80,0x81,0x7F,0x81,0x81,0x7E,0x7F,0x7E,0x7D,0x7D,0x7F,0x7E,0x80, + 0x80,0x80,0x80,0x7F,0x80,0x80,0x82,0x82,0x82,0x81,0x82,0x80,0x80,0x80,0x80,0x82, + 0x81,0x80,0x81,0x81,0x82,0x84,0x83,0x83,0x84,0x84,0x84,0x86,0x86,0x86,0x87,0x85, + 0x85,0x85,0x85,0x85,0x85,0x86,0x83,0x81,0x81,0x7F,0x7E,0x80,0x7E,0x7F,0x7F,0x7F, + 0x80,0x7E,0x7D,0x7F,0x7F,0x7C,0x7D,0x7C,0x7E,0x7F,0x7D,0x7F,0x80,0x7F,0x7C,0x7C, + 0x7C,0x7D,0x7D,0x7D,0x7D,0x7B,0x7A,0x7C,0x78,0x78,0x7C,0x79,0x7A,0x7A,0x7B,0x7C, + 0x7D,0x7E,0x80,0x80,0x80,0x81,0x80,0x83,0x83,0x83,0x87,0x87,0x85,0x87,0x87,0x86, + 0x86,0x87,0x87,0x86,0x84,0x84,0x84,0x82,0x84,0x85,0x84,0x84,0x83,0x83,0x84,0x83, + 0x82,0x83,0x82,0x82,0x81,0x82,0x83,0x81,0x81,0x82,0x81,0x7E,0x7F,0x7F,0x7E,0x80, + 0x7F,0x7E,0x7D,0x7D,0x7D,0x7C,0x7D,0x7E,0x7E,0x7F,0x80,0x7F,0x82,0x81,0x81,0x81, + 0x81,0x82,0x82,0x83,0x84,0x85,0x85,0x84,0x83,0x81,0x81,0x81,0x81,0x81,0x80,0x80, + 0x80,0x7E,0x7F,0x7D,0x7D,0x80,0x7F,0x7E,0x80,0x80,0x7F,0x80,0x80,0x7F,0x80,0x81, + 0x81,0x82,0x82,0x83,0x80,0x7F,0x81,0x7D,0x7E,0x80,0x7F,0x7E,0x7E,0x7C,0x7B,0x7C, + 0x7A,0x7A,0x7C,0x7D,0x7E,0x7F,0x7E,0x7E,0x7E,0x7E,0x7F,0x7F,0x81,0x83,0x83,0x84, + 0x84,0x83,0x84,0x83,0x82,0x83,0x83,0x83,0x84,0x84,0x82,0x82,0x81,0x81,0x81,0x81, + 0x81,0x82,0x82,0x82,0x82,0x82,0x82,0x81,0x82,0x83,0x82,0x83,0x84,0x84,0x83,0x82, + 0x82,0x81,0x81,0x81,0x81,0x81,0x7F,0x80,0x7E,0x7E,0x7B,0x7B,0x7D,0x7B,0x7C,0x7C, + 0x7D,0x7D,0x7E,0x7D,0x7D,0x7E,0x7F,0x80,0x80,0x82,0x83,0x83,0x84,0x83,0x83,0x84, + 0x83,0x82,0x83,0x83,0x82,0x83,0x82,0x81,0x81,0x80,0x7F,0x7F,0x7D,0x7E,0x7F,0x7F, + 0x7F,0x7E,0x7F,0x7F,0x7F,0x80,0x80,0x80,0x82,0x82,0x82,0x81,0x83,0x82,0x83,0x83, + 0x81,0x81,0x80,0x80,0x80,0x80,0x7F,0x7E,0x7E,0x7D,0x7C,0x7C,0x7C,0x7B,0x7C,0x7D, + 0x7C,0x7C,0x7D,0x7C,0x7C,0x7E,0x7E,0x7F,0x80,0x80,0x80,0x81,0x81,0x81,0x82,0x81, + 0x82,0x82,0x82,0x81,0x82,0x82,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x7F,0x7F, + 0x7E,0x7F,0x7F,0x7F,0x81,0x80,0x7F,0x80,0x81,0x7F,0x80,0x81,0x80,0x81,0x81,0x80, + 0x80,0x82,0x80,0x80,0x7F,0x7E,0x7E,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7B,0x7B,0x7B, + 0x7B,0x7C,0x7C,0x7C,0x7E,0x7F,0x7E,0x7F,0x80,0x80,0x80,0x81,0x81,0x81,0x82,0x82, + 0x83,0x83,0x83,0x82,0x82,0x82,0x81,0x81,0x81,0x81,0x81,0x7F,0x7E,0x7E,0x7E,0x7E, + 0x7D,0x7E,0x7E,0x7D,0x7E,0x7D,0x7D,0x7E,0x7E,0x7D,0x7F,0x80,0x7F,0x80,0x82,0x80, + 0x81,0x82,0x80,0x81,0x81,0x81,0x81,0x82,0x81,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7D, + 0x7D,0x7E,0x7D,0x7C,0x7D,0x7D,0x7D,0x7E,0x7E,0x7E,0x7F,0x7F,0x7F,0x81,0x81,0x81, + 0x82,0x81,0x82,0x82,0x82,0x82,0x83,0x83,0x83,0x82,0x82,0x82,0x81,0x82,0x81,0x81, + 0x80,0x80,0x7F,0x7F,0x7F,0x7E,0x7E,0x7D,0x7D,0x7D,0x7E,0x7E,0x7D,0x7D,0x7E,0x7E, + 0x7E,0x80,0x80,0x80,0x81,0x81,0x80,0x80,0x7F,0x80,0x81,0x80,0x80,0x81,0x81,0x80, + 0x80,0x80,0x7F,0x7F,0x7F,0x7E,0x7E,0x7F,0x7E,0x7E,0x7E,0x7E,0x7E,0x7F,0x7E,0x7F, + 0x81,0x81,0x81,0x82,0x83,0x82,0x83,0x83,0x82,0x83,0x83,0x83,0x82,0x83,0x82,0x81, + 0x82,0x82,0x81,0x82,0x82,0x81,0x81,0x80,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F, + 0x7F,0x80,0x7F,0x81,0x80,0x81,0x82,0x82,0x93,0x85,0x86,0x85,0x64,0x7E,0x82,0x6B, + 0x69,0x76,0x7F,0x85,0x8A,0x8B,0x8C,0x88,0x95,0xA1,0xA0,0xA8,0x9F,0x91,0x88,0x75, + 0x88,0x91,0x6D,0x6B,0x75,0x68,0x59,0x59,0x54,0x51,0x5F,0x5E,0x5D,0x54,0x64,0x6F, + 0x6D,0x79,0x6F,0x97,0xAB,0x8C,0x95,0xA2,0x93,0xA7,0xA2,0x91,0xC3,0xA0,0xA1,0xB7, + 0x99,0xB5,0xAC,0x90,0x8E,0x8B,0x93,0x8F,0x7A,0x80,0x73,0x6C,0x7A,0x6B,0x86,0x91, + 0x6A,0x7C,0x87,0x77,0x87,0x67,0x44,0x68,0x6D,0x66,0x6C,0x59,0x50,0x59,0x60,0x62, + 0x64,0x7D,0x87,0x92,0x9D,0x92,0x89,0x8A,0x89,0x80,0x8F,0xA3,0xB3,0xB7,0x9D,0x99, + 0xB2,0xA4,0xA7,0xA4,0x8F,0x97,0x8D,0x88,0x7E,0x7E,0x81,0x6A,0x65,0x64,0x6C,0x6D, + 0x59,0x55,0x4B,0x4B,0x51,0x44,0x3D,0x40,0x47,0x3B,0x37,0x49,0x58,0x5A,0x5D,0x74, + 0x81,0x85,0xA2,0xB2,0xA0,0x9C,0x8C,0x8E,0x9F,0x9A,0x9E,0xA0,0xA2,0xBD,0xCC,0xD2, + 0xD2,0xC1,0xC5,0xC7,0xB1,0xB2,0xAA,0x89,0x81,0x7C,0x7A,0x8A,0x7F,0x6F,0x69,0x5E, + 0x5D,0x68,0x66,0x60,0x56,0x4B,0x67,0x69,0x5D,0x63,0x62,0x6E,0x6B,0x66,0x64,0x60, + 0x73,0x78,0x81,0x86,0x82,0x96,0xA0,0x9A,0xA4,0x96,0x8A,0x94,0x8B,0x9C,0x9D,0x8F, + 0x8F,0x8B,0x92,0x8E,0x91,0x94,0x87,0x97,0x94,0x91,0xA7,0x9C,0x91,0x96,0x97,0x95, + 0x91,0x8D,0x75,0x68,0x71,0x72,0x7C,0x6F,0x6B,0x81,0x82,0x7C,0x64,0x4C,0x51,0x57, + 0x63,0x6C,0x59,0x49,0x47,0x44,0x46,0x54,0x5A,0x4C,0x49,0x47,0x4A,0x4A,0x4E,0x5B, + 0x63,0x7F,0x92,0x94,0x88,0x72,0x7E,0x93,0x8E,0x9B,0xA2,0xA0,0xA9,0x8F,0x7E,0x84, + 0x80,0x7F,0xA2,0xBB,0xA8,0xA6,0xB1,0xB7,0xBC,0xB1,0xB7,0xBC,0xB9,0xB9,0xAD,0xA2, + 0x99,0x8D,0x94,0xAC,0xAF,0x9F,0x8C,0x80,0x80,0x82,0x8A,0x83,0x7D,0x83,0x92,0x7D, + 0x6E,0x6C,0x5C,0x6B,0x65,0x61,0x64,0x5E,0x5F,0x61,0x65,0x5E,0x60,0x6B,0x66,0x67, + 0x79,0x60,0x52,0x60,0x51,0x59,0x5E,0x59,0x66,0x70,0x72,0x70,0x72,0x70,0x78,0x73, + 0x79,0x81,0x83,0x87,0x8D,0x98,0x9A,0xA1,0x99,0x91,0x9D,0x9E,0x8F,0x8B,0x90,0x8D, + 0x8B,0x7C,0x80,0x95,0x8D,0x87,0x84,0x7F,0x76,0x73,0x71,0x65,0x73,0x78,0x78,0x8C, + 0x90,0x8F,0x97,0x95,0x88,0x83,0x78,0x6A,0x6C,0x69,0x6C,0x79,0x81,0x70,0x69,0x70, + 0x6A,0x73,0x79,0x6B,0x6B,0x74,0x78,0x78,0x7B,0x7C,0x76,0x7E,0x7A,0x77,0x8C,0x8B, + 0x8C,0x84,0x80,0x92,0x8F,0x90,0x93,0x8F,0x8B,0x87,0x91,0x91,0x91,0xAB,0xAD,0x9B, + 0x9F,0xAC,0xA7,0xA0,0x99,0x93,0xAF,0xBC,0xB2,0xB7,0xAA,0xA4,0xA9,0xAC,0xAA,0x97, + 0x8E,0x96,0x99,0x91,0x84,0x90,0x95,0x84,0x7D,0x74,0x6D,0x53,0x43,0x45,0x41,0x49, + 0x49,0x51,0x60,0x67,0x60,0x59,0x58,0x49,0x4F,0x55,0x53,0x51,0x50,0x57,0x51,0x46, + 0x43,0x4F,0x54,0x52,0x5E,0x5C,0x5A,0x63,0x5A,0x64,0x71,0x6B,0x7B,0x90,0x9E,0xA7, + 0xA2,0xA6,0x9F,0x9D,0xA9,0xAE,0xB2,0xAC,0xAB,0xAD,0xA4,0x9B,0x99,0xA0,0xA4,0x8E, + 0x8E,0x93,0x7F,0x88,0x8E,0x83,0x87,0x84,0x89,0xA2,0x9E,0x86,0x8B,0x8E,0x8C,0xA1, + 0x9F,0x96,0x99,0x90,0x9F,0xAC,0x9E,0x94,0x8E,0x95,0x95,0x87,0x88,0x89,0x81,0x80, + 0x81,0x86,0x85,0x83,0x81,0x88,0x89,0x82,0x86,0x85,0x82,0x76,0x6F,0x76,0x6D,0x77, + 0x91,0x87,0x7A,0x64,0x70,0x8A,0x75,0x6B,0x5E,0x4D,0x49,0x54,0x5F,0x5C,0x5F,0x58, + 0x59,0x69,0x67,0x5B,0x5B,0x58,0x5E,0x5F,0x5C,0x6C,0x6D,0x69,0x6C,0x72,0x74,0x70, + 0x81,0x8C,0x7A,0x75,0x7E,0x7A,0x7B,0x82,0x84,0x84,0x89,0x90,0x99,0xA9,0xA5,0xAB, + 0xB8,0xB6,0xB6,0xAF,0xA8,0xAB,0xA7,0xA5,0xA5,0x99,0x8B,0x87,0x9D,0xAC,0x99,0x93, + 0x98,0x89,0x80,0x83,0x82,0x7B,0x79,0x7C,0x88,0x86,0x75,0x75,0x7B,0x80,0x7C,0x73, + 0x7B,0x8D,0x89,0x87,0x81,0x6E,0x72,0x70,0x78,0x7D,0x63,0x6A,0x77,0x72,0x6F,0x68, + 0x63,0x6C,0x72,0x6D,0x7E,0x7C,0x64,0x69,0x73,0x78,0x7C,0x74,0x7B,0x86,0x7C,0x83, + 0x84,0x72,0x6A,0x6D,0x7C,0x78,0x6D,0x73,0x70,0x6A,0x69,0x69,0x6C,0x74,0x72,0x71, + 0x75,0x6C,0x65,0x6D,0x7B,0x7D,0x6E,0x6C,0x77,0x79,0x7E,0x83,0x7D,0x76,0x73,0x78, + 0x89,0x80,0x6F,0x78,0x80,0x83,0x84,0x84,0x89,0x8D,0x94,0x9D,0xAC,0xAD,0xA6,0xAE, + 0xB3,0xB8,0xAB,0xA3,0xB5,0xB5,0xA9,0xAB,0xAA,0xA5,0x9A,0x95,0xA0,0x90,0x7F,0x88, + 0x85,0x7A,0x74,0x72,0x7C,0x7E,0x77,0x80,0x87,0x80,0x79,0x73,0x75,0x77,0x6F,0x67, + 0x76,0x7B,0x6F,0x74,0x74,0x79,0x7B,0x7C,0x89,0x7E,0x74,0x7D,0x82,0x6E,0x65,0x6A, + 0x6E,0x74,0x70,0x73,0x7F,0x7B,0x7B,0x85,0x81,0x7A,0x6D,0x67,0x72,0x72,0x6C,0x67, + 0x61,0x63,0x67,0x70,0x7C,0x71,0x6B,0x7C,0x79,0x66,0x59,0x5F,0x67,0x64,0x69,0x75, + 0x7D,0x76,0x7A,0x7C,0x6E,0x69,0x60,0x66,0x71,0x68,0x6C,0x69,0x61,0x6B,0x6F,0x82, + 0x8C,0x76,0x7B,0x8D,0x85,0x77,0x76,0x7D,0x87,0x8F,0x90,0x9E,0xA5,0xA8,0xB6,0xBB, + 0xB7,0xAF,0xAE,0xB6,0xBE,0xB4,0xAA,0xAE,0xAB,0xA2,0xA5,0xBA,0xAC,0x9D,0xA6,0xA1, + 0x9A,0x8C,0x8B,0x91,0x84,0x82,0x90,0x90,0x8B,0x8B,0x89,0x87,0x83,0x7C,0x7C,0x88, + 0x86,0x81,0x87,0x8A,0x87,0x7B,0x89,0x96,0x81,0x88,0x92,0x86,0x79,0x73,0x83,0x80, + 0x77,0x83,0x88,0x85,0x7B,0x7B,0x78,0x70,0x6C,0x5F,0x6B,0x70,0x66,0x68,0x68,0x68, + 0x5C,0x6D,0x7E,0x70,0x5F,0x5B,0x66,0x67,0x4C,0x43,0x6E,0x51,0x3A,0x5C,0x57,0x55, + 0x5A,0x6B,0x63,0x45,0x49,0x59,0x58,0x49,0x54,0x53,0x44,0x42,0x57,0x71,0x68,0x6A, + 0x7B,0x7A,0x62,0x5D,0x68,0x6E,0x6E,0x77,0x8A,0x8B,0x8F,0x94,0x9C,0xA9,0xAB,0xAC, + 0xAC,0xB2,0xBC,0xB9,0xB7,0xB4,0xA9,0xB2,0xC8,0xBC,0xB0,0xBA,0xAF,0xA6,0xA1,0x94, + 0x9D,0x98,0x86,0x94,0xA1,0x97,0x8D,0x8C,0x90,0x97,0x95,0x8A,0x8A,0x90,0x96,0x99, + 0x9C,0x9C,0x98,0xB1,0xB4,0xAD,0xB4,0xAE,0xA8,0x9B,0x95,0x9A,0x95,0x8B,0x98,0xA1, + 0x95,0x96,0x93,0x90,0x93,0x84,0x81,0x85,0x7D,0x7D,0x75,0x77,0x75,0x68,0x80,0x84, + 0x77,0x7E,0x7F,0x79,0x6E,0x65,0x62,0x61,0x55,0x56,0x64,0x60,0x56,0x51,0x54,0x60, + 0x58,0x4C,0x4C,0x49,0x46,0x40,0x40,0x42,0x3A,0x51,0x60,0x4D,0x54,0x54,0x4F,0x57, + 0x4B,0x4C,0x57,0x48,0x48,0x59,0x5C,0x64,0x68,0x66,0x72,0x84,0x89,0x83,0x82,0x8A, + 0x90,0x8E,0x96,0x93,0x90,0xA1,0x9C,0x94,0x99,0x97,0x92,0x96,0x92,0x90,0x96,0x8A, + 0x83,0x8D,0x8D,0x8D,0x8C,0x83,0x87,0x88,0x89,0x8A,0x85,0x8B,0x8D,0x8F,0x99,0x92, + 0x98,0xA9,0xA0,0xA2,0xAB,0xA7,0xA7,0xA8,0xA2,0xAA,0xA8,0x96,0x9D,0xA1,0xA2,0xB0, + 0xA6,0xA3,0xAA,0xA0,0xA4,0xA3,0x99,0x9A,0x8E,0x92,0x98,0x87,0x95,0x9A,0x8D,0x96, + 0x94,0x93,0x92,0x83,0x82,0x83,0x72,0x70,0x76,0x74,0x78,0x74,0x71,0x76,0x6D,0x66, + 0x67,0x60,0x5E,0x56,0x51,0x58,0x4A,0x53,0x6E,0x64,0x65,0x6F,0x6B,0x70,0x64,0x60, + 0x70,0x67,0x5D,0x6C,0x72,0x73,0x75,0x76,0x86,0x8B,0x83,0x8B,0x8D,0x87,0x88,0x8B, + 0x90,0x86,0x86,0x9B,0x95,0x94,0x9D,0x8F,0x87,0x79,0x72,0x7F,0x6F,0x60,0x6A,0x70, + 0x72,0x72,0x70,0x7D,0x7B,0x6F,0x79,0x74,0x6C,0x6D,0x70,0x7A,0x71,0x76,0x8C,0x81, + 0x84,0x96,0x92,0x8D,0x83,0x81,0x8D,0x82,0x7A,0x87,0x84,0x87,0x91,0x92,0x95,0x8D, + 0x88,0x8F,0x88,0x81,0x7E,0x80,0x84,0x77,0x82,0x94,0x84,0x87,0x95,0x90,0x8A,0x7E, + 0x79,0x7B,0x6E,0x6D,0x7B,0x78,0x71,0x73,0x7B,0x7E,0x74,0x71,0x73,0x68,0x62,0x61, + 0x60,0x60,0x55,0x61,0x78,0x66,0x68,0x78,0x6F,0x66,0x5F,0x67,0x6A,0x5B,0x65,0x76, + 0x6F,0x71,0x80,0x88,0x8C,0x84,0x8B,0x93,0x8A,0x8E,0x94,0x93,0x98,0x93,0xA2,0xBB, + 0xA6,0xA2,0xB7,0xAB,0xA1,0x9D,0x9A,0x96,0x82,0x83,0x90,0x81,0x7B,0x84,0x89,0x88, + 0x7F,0x80,0x7E,0x70,0x73,0x79,0x74,0x74,0x6E,0x76,0x93,0x83,0x7F,0x9C,0x90,0x86, + 0x8D,0x8C,0x85,0x79,0x7F,0x8D,0x87,0x82,0x91,0x96,0x91,0x97,0x9B,0x96,0x86,0x85, + 0x8B,0x82,0x82,0x82,0x77,0x8E,0x92,0x7F,0x95,0x92,0x83,0x85,0x7D,0x7A,0x70,0x6C, + 0x7A,0x76,0x6B,0x78,0x80,0x7B,0x7D,0x7F,0x7A,0x71,0x6B,0x6F,0x68,0x64,0x6D,0x62, + 0x67,0x7E,0x6C,0x72,0x85,0x74,0x72,0x75,0x6F,0x6D,0x62,0x66,0x76,0x70,0x71,0x82, + 0x88,0x85,0x8C,0x92,0x8C,0x8A,0x8B,0x89,0x84,0x89,0x90,0x84,0x92,0xA0,0x8B,0x99, + 0xA5,0x90,0x8C,0x91,0x89,0x7E,0x79,0x80,0x80,0x76,0x7A,0x82,0x7D,0x80,0x89,0x82, + 0x79,0x79,0x79,0x72,0x6C,0x75,0x76,0x6A,0x7E,0x8B,0x76,0x83,0x95,0x82,0x7D,0x88, + 0x82,0x75,0x74,0x7E,0x7D,0x73,0x7E,0x8C,0x84,0x89,0x94,0x8C,0x85,0x86,0x85,0x7F, + 0x7D,0x7D,0x80,0x77,0x7F,0x97,0x7D,0x7C,0x99,0x88,0x7A,0x8A,0x85,0x72,0x74,0x7C, + 0x79,0x72,0x7B,0x82,0x7B,0x7D,0x89,0x83,0x7C,0x84,0x82,0x77,0x78,0x79,0x7A,0x75, + 0x73,0x8B,0x81,0x71,0x8F,0x88,0x70,0x7F,0x81,0x6F,0x73,0x7A,0x75,0x71,0x78,0x7F, + 0x7B,0x7E,0x8A,0x87,0x80,0x8C,0x8C,0x83,0x85,0x88,0x86,0x8A,0x84,0x85,0x9A,0x89, + 0x87,0x9E,0x8A,0x82,0x96,0x88,0x7A,0x82,0x7D,0x78,0x7B,0x7C,0x7E,0x7C,0x7F,0x83, + 0x7E,0x7F,0x83,0x7A,0x77,0x7C,0x7C,0x79,0x7B,0x76,0x6F,0x87,0x83,0x74,0x8A,0x86, + 0x76,0x86,0x85,0x74,0x7C,0x7E,0x78,0x79,0x7D,0x81,0x7D,0x7D,0x88,0x86,0x81,0x8A, + 0x8A,0x82,0x85,0x84,0x80,0x83,0x84,0x7D,0x77,0x89,0x84,0x77,0x8D,0x88,0x75,0x80, + 0x84,0x72,0x76,0x7E,0x71,0x6F,0x7A,0x79,0x75,0x7A,0x7E,0x7D,0x7C,0x82,0x81,0x7E, + 0x80,0x7F,0x7D,0x7F,0x7E,0x7C,0x77,0x80,0x86,0x7A,0x86,0x8D,0x7E,0x7F,0x88,0x7A, + 0x78,0x81,0x7B,0x78,0x80,0x7F,0x7C,0x82,0x86,0x86,0x88,0x8B,0x89,0x8A,0x8D,0x8A, + 0x87,0x87,0x84,0x83,0x86,0x80,0x80,0x8A,0x84,0x83,0x8E,0x85,0x81,0x86,0x7E,0x79, + 0x7B,0x79,0x76,0x7A,0x7C,0x78,0x7C,0x80,0x7E,0x7E,0x84,0x82,0x80,0x83,0x81,0x7D, + 0x7E,0x7F,0x79,0x7B,0x85,0x7E,0x7F,0x8B,0x84,0x7F,0x87,0x81,0x76,0x7B,0x7C,0x79, + 0x7C,0x7F,0x7D,0x81,0x84,0x83,0x86,0x87,0x86,0x88,0x8A,0x87,0x85,0x85,0x83,0x82, + 0x82,0x83,0x82,0x7F,0x81,0x82,0x7F,0x7F,0x7C,0x79,0x7A,0x7B,0x79,0x79,0x7A,0x7B, + 0x7E,0x7F,0x7F,0x80,0x82,0x84,0x84,0x84,0x84,0x83,0x83,0x83,0x83,0x85,0x83,0x81, + 0x85,0x86,0x83,0x84,0x85,0x82,0x82,0x83,0x7F,0x7D,0x7E,0x7F,0x7F,0x81,0x80,0x7F, + 0x82,0x82,0x82,0x82,0x82,0x81,0x83,0x83,0x82,0x81,0x81,0x80,0x81,0x81,0x7F,0x7E, + 0x7E,0x7D,0x7D,0x7E,0x7E,0x7D,0x7B,0x7B,0x7A,0x77,0x77,0x7A,0x79,0x7A,0x7B,0x7B, + 0x7B,0x7C,0x7F,0x80,0x7F,0x80,0x82,0x81,0x81,0x82,0x81,0x81,0x80,0x82,0x80,0x80, + 0x82,0x81,0x81,0x81,0x81,0x81,0x80,0x7F,0x80,0x80,0x7F,0x7E,0x7F,0x80,0x80,0x80, + 0x80,0x80,0x81,0x81,0x80,0x80,0x82,0x82,0x82,0x82,0x7F,0x7F,0x7F,0x81,0x80,0x7E, + 0x7F,0x7F,0x7D,0x7C,0x7D,0x7E,0x7E,0x7E,0x80,0x7F,0x7F,0x7E,0x7D,0x7E,0x7F,0x7F, + 0x80,0x7F,0x7D,0x80,0x82,0x81,0x7F,0x7F,0x7F,0x80,0x84,0x83,0x7F,0x80,0x85,0x84, + 0x82,0x81,0x7F,0x81,0x83,0x80,0x7C,0x7A,0x7B,0x7F,0x7F,0x7D,0x7E,0x7F,0x80,0x7C, + 0x7B,0x7D,0x7E,0x7F,0x7F,0x82,0x82,0x7D,0x80,0x83,0x82,0x83,0x7F,0x80,0x83,0x80, + 0x7D,0x7F,0x80,0x7D,0x7F,0x7D,0x7F,0x7F,0x80,0x82,0x83,0x80,0x7D,0x7B,0x77,0x79, + 0x7A,0x7D,0x7D,0x7E,0x7F,0x7C,0x7F,0x82,0x7F,0x82,0x86,0x84,0x82,0x84,0x8B,0x85, + 0x83,0x86,0x89,0x81,0x7F,0x85,0x81,0x80,0x82,0x82,0x82,0x83,0x81,0x80,0x83,0x7F, + 0x7C,0x7C,0x7C,0x7B,0x74,0x7B,0x81,0x7B,0x7F,0x80,0x7D,0x7E,0x7E,0x7F,0x81,0x80, + 0x7B,0x82,0x82,0x83,0x85,0x84,0x87,0x84,0x84,0x84,0x83,0x7F,0x84,0x88,0x83,0x86, + 0x85,0x81,0x85,0x86,0x82,0x80,0x83,0x82,0x7D,0x81,0x85,0x7F,0x83,0x86,0x7E,0x7F, + 0x81,0x7D,0x7E,0x82,0x7D,0x7F,0x81,0x7B,0x7A,0x7F,0x80,0x7E,0x80,0x7F,0x7F,0x7E, + 0x7C,0x81,0x80,0x82,0x84,0x83,0x80,0x80,0x81,0x80,0x82,0x81,0x7D,0x7E,0x80,0x81, + 0x82,0x87,0x83,0x7D,0x81,0x7C,0x7D,0x7F,0x81,0x7F,0x80,0x80,0x81,0x86,0x81,0x83, + 0x82,0x7F,0x7E,0x7D,0x82,0x82,0x82,0x82,0x81,0x81,0x82,0x84,0x80,0x82,0x81,0x7E, + 0x81,0x7D,0x7E,0x7F,0x7F,0x82,0x7E,0x7F,0x80,0x7E,0x7C,0x7E,0x7E,0x7E,0x7E,0x80, + 0x83,0x82,0x81,0x81,0x80,0x7F,0x83,0x81,0x84,0x85,0x81,0x83,0x86,0x82,0x83,0x85, + 0x83,0x83,0x83,0x83,0x81,0x85,0x85,0x81,0x83,0x83,0x7D,0x7D,0x80,0x7D,0x7E,0x80, + 0x7C,0x7D,0x7F,0x80,0x7F,0x7B,0x7C,0x7F,0x7C,0x7D,0x7D,0x7E,0x7E,0x80,0x7E,0x80, + 0x7F,0x7E,0x81,0x82,0x83,0x80,0x80,0x80,0x7E,0x7C,0x7F,0x7F,0x7D,0x82,0x81,0x7D, + 0x82,0x81,0x80,0x83,0x7F,0x81,0x80,0x82,0x80,0x7F,0x81,0x7F,0x83,0x80,0x82,0x86, + 0x80,0x83,0x83,0x81,0x84,0x85,0x84,0x82,0x81,0x81,0x7F,0x82,0x80,0x82,0x83,0x83, + 0x84,0x80,0x84,0x83,0x7D,0x80,0x7D,0x7C,0x7E,0x80,0x81,0x7D,0x7D,0x82,0x7F,0x7C, + 0x80,0x80,0x7E,0x80,0x7E,0x7C,0x7E,0x7E,0x7E,0x7E,0x80,0x81,0x81,0x81,0x81,0x83, + 0x84,0x86,0x83,0x81,0x85,0x83,0x81,0x80,0x82,0x84,0x7F,0x82,0x81,0x7E,0x82,0x80, + 0x7E,0x7C,0x7C,0x80,0x7E,0x7E,0x7F,0x7E,0x80,0x81,0x7C,0x7D,0x80,0x7C,0x7F,0x7F, + 0x7F,0x82,0x83,0x85,0x82,0x82,0x84,0x84,0x82,0x80,0x84,0x80,0x80,0x83,0x80,0x80, + 0x80,0x81,0x80,0x7F,0x81,0x7E,0x7E,0x80,0x7E,0x80,0x7F,0x7E,0x7F,0x80,0x7C,0x7A, + 0x7F,0x80,0x80,0x7F,0x81,0x81,0x80,0x80,0x7D,0x80,0x81,0x82,0x82,0x81,0x81,0x83, + 0x81,0x81,0x82,0x80,0x80,0x80,0x81,0x82,0x81,0x81,0x82,0x80,0x80,0x80,0x7E,0x81, + 0x7F,0x7C,0x7D,0x7B,0x7D,0x7C,0x7F,0x7F,0x7D,0x81,0x81,0x80,0x82,0x7F,0x7E,0x7F, + 0x7F,0x7F,0x80,0x82,0x7F,0x82,0x82,0x82,0x83,0x81,0x81,0x80,0x80,0x81,0x7F,0x7E, + 0x80,0x80,0x83,0x82,0x81,0x82,0x81,0x7D,0x7E,0x7E,0x7D,0x7E,0x7E,0x7F,0x7E,0x7F, + 0x80,0x7F,0x7E,0x7B,0x7F,0x80,0x7E,0x7F,0x80,0x81,0x7E,0x7F,0x7F,0x7F,0x81,0x82, + 0x81,0x7F,0x81,0x84,0x82,0x82,0x81,0x81,0x83,0x80,0x7F,0x7D,0x7F,0x80,0x7C,0x7E, + 0x7E,0x7F,0x82,0x80,0x7F,0x80,0x7E,0x80,0x7F,0x7D,0x7D,0x80,0x80,0x7E,0x80,0x82, + 0x81,0x80,0x83,0x82,0x7F,0x81,0x83,0x7E,0x80,0x83,0x7D,0x81,0x83,0x7F,0x81,0x82, + 0x81,0x82,0x82,0x81,0x7F,0x82,0x83,0x80,0x7E,0x80,0x80,0x7D,0x80,0x7F,0x7E,0x7F, + 0x80,0x81,0x81,0x81,0x81,0x80,0x7E,0x7E,0x7E,0x7E,0x80,0x80,0x7F,0x80,0x80,0x7F, + 0x81,0x81,0x81,0x81,0x80,0x81,0x81,0x7E,0x81,0x81,0x7D,0x7E,0x7F,0x7C,0x7C,0x7F, + 0x7E,0x7D,0x7E,0x7D,0x7D,0x80,0x7E,0x7F,0x81,0x7F,0x81,0x81,0x81,0x7E,0x81,0x82, + 0x7F,0x83,0x80,0x81,0x83,0x80,0x81,0x84,0x83,0x83,0x81,0x82,0x82,0x80,0x81,0x80, + 0x80,0x82,0x80,0x80,0x83,0x81,0x7D,0x7F,0x7F,0x7D,0x80,0x82,0x7C,0x7F,0x80,0x7B, + 0x7E,0x81,0x7F,0x7E,0x7F,0x7F,0x7D,0x7E,0x7E,0x7F,0x80,0x81,0x81,0x82,0x82,0x81, + 0x7F,0x81,0x80,0x7D,0x7F,0x81,0x80,0x7F,0x82,0x7F,0x7F,0x82,0x81,0x7E,0x80,0x81, + 0x7C,0x81,0x7E,0x7F,0x80,0x80,0x7F,0x7E,0x80,0x80,0x7F,0x80,0x80,0x7D,0x80,0x7F, + 0x7F,0x7F,0x80,0x82,0x81,0x80,0x7F,0x81,0x7F,0x7F,0x81,0x7F,0x7E,0x80,0x7F,0x7E, + 0x7F,0x7F,0x81,0x80,0x7E,0x81,0x81,0x7F,0x81,0x80,0x7F,0x81,0x81,0x7F,0x82,0x81, + 0x81,0x83,0x80,0x81,0x82,0x81,0x81,0x81,0x80,0x80,0x81,0x81,0x80,0x7F,0x82,0x81, + 0x81,0x83,0x81,0x82,0x82,0x81,0x7F,0x81,0x81,0x81,0x81,0x80,0x81,0x7F,0x80,0x7F, + 0x7F,0x7F,0x7F,0x7E,0x80,0x80,0x7F,0x81,0x81,0x82,0x82,0x7E,0x7E,0x80,0x7E,0x80, + 0x81,0x81,0x81,0x80,0x83,0x81,0x80,0x81,0x82,0x7F,0x82,0x82,0x7E,0x81,0x7F,0x7F, + 0x80,0x81,0x7E,0x7E,0x81,0x7F,0x83,0x81,0x81,0x81,0x80,0x82,0x80,0x80,0x81,0x7E, + 0x80,0x85,0x7F,0x80,0x84,0x81,0x82,0x83,0x82,0x81,0x82,0x81,0x81,0x83,0x82,0x81, + 0x83,0x87,0x8F,0x80,0x68,0x7A,0x8B,0x8B,0x76,0x87,0x8C,0x6C,0x7C,0x82,0x7D,0x81, + 0x8B,0x90,0x7E,0x81,0x89,0x86,0x79,0x7B,0x8B,0x7C,0x71,0x75,0x7D,0x83,0x81,0x82, + 0x89,0x7C,0x72,0x7C,0x76,0x79,0x7C,0x7F,0x81,0x84,0x85,0x81,0x88,0x89,0x8C,0x89, + 0x81,0x85,0x86,0x85,0x87,0x81,0x81,0x85,0x7E,0x7F,0x85,0x81,0x7C,0x81,0x7A,0x7A, + 0x83,0x7B,0x7A,0x7B,0x7A,0x78,0x77,0x7B,0x81,0x88,0x86,0x7B,0x7B,0x85,0x84,0x82, + 0x8D,0x89,0x81,0x84,0x86,0x83,0x80,0x85,0x85,0x81,0x80,0x7F,0x7F,0x83,0x86,0x7E, + 0x78,0x7B,0x7E,0x7A,0x7A,0x80,0x7A,0x79,0x7C,0x7F,0x80,0x7C,0x78,0x7C,0x80,0x79, + 0x7D,0x7E,0x84,0x89,0x84,0x82,0x7E,0x7F,0x83,0x86,0x88,0x86,0x7F,0x80,0x86,0x85, + 0x85,0x84,0x81,0x7E,0x79,0x7C,0x7D,0x7C,0x80,0x7F,0x7A,0x7A,0x7D,0x7E,0x81,0x80, + 0x7F,0x7F,0x7A,0x7E,0x83,0x81,0x81,0x7F,0x80,0x81,0x82,0x83,0x7F,0x7F,0x82,0x81, + 0x80,0x84,0x82,0x84,0x83,0x81,0x80,0x7E,0x80,0x80,0x80,0x7C,0x7C,0x7F,0x81,0x80, + 0x7F,0x82,0x83,0x82,0x7F,0x7C,0x7B,0x7A,0x7C,0x7F,0x7F,0x7D,0x7C,0x7F,0x80,0x80, + 0x7E,0x82,0x84,0x7E,0x7C,0x7E,0x81,0x7F,0x7C,0x7F,0x81,0x81,0x81,0x80,0x84,0x86, + 0x82,0x80,0x7C,0x7C,0x7D,0x7C,0x7D,0x7B,0x7B,0x7B,0x7E,0x7F,0x7F,0x82,0x83,0x81, + 0x82,0x83,0x81,0x81,0x81,0x7F,0x80,0x81,0x83,0x81,0x84,0x86,0x82,0x81,0x7F,0x80, + 0x81,0x7F,0x7E,0x7E,0x7E,0x7C,0x7C,0x80,0x81,0x82,0x81,0x81,0x83,0x7E,0x7E,0x80, + 0x81,0x80,0x80,0x82,0x82,0x80,0x81,0x80,0x81,0x80,0x80,0x7E,0x7F,0x7F,0x7D,0x7E, + 0x7E,0x7E,0x7F,0x7F,0x80,0x82,0x80,0x7D,0x7D,0x7E,0x7F,0x7F,0x7E,0x7E,0x80,0x80, + 0x7F,0x7F,0x81,0x83,0x7F,0x7F,0x7F,0x7D,0x7E,0x7F,0x82,0x82,0x83,0x82,0x80,0x80, + 0x82,0x82,0x80,0x81,0x82,0x7F,0x7E,0x80,0x80,0x80,0x81,0x82,0x80,0x80,0x81,0x7F, + 0x7F,0x7F,0x7F,0x7F,0x80,0x81,0x81,0x82,0x80,0x7E,0x81,0x81,0x80,0x80,0x81,0x7F, + 0x7E,0x80,0x7E,0x80,0x82,0x82,0x82,0x80,0x7E,0x7F,0x82,0x80,0x7C,0x7F,0x7E,0x7F, + 0x80,0x7E,0x7E,0x7F,0x81,0x81,0x7F,0x7F,0x7F,0x80,0x81,0x81,0x7F,0x80,0x81,0x81, + 0x81,0x83,0x80,0x7F,0x80,0x7E,0x81,0x80,0x81,0x7F,0x7D,0x80,0x7F,0x81,0x82,0x81, + 0x82,0x81,0x7F,0x80,0x82,0x81,0x83,0x82,0x80,0x82,0x82,0x81,0x83,0x82,0x82,0x83, + 0x81,0x83,0x81,0x7F,0x82,0x83,0x81,0x81,0x81,0x82,0x81,0x80,0x83,0x81,0x7F,0x80, + 0x7F,0x80,0x7F,0x7F,0x7F,0x7F,0x7E,0x7F,0x81,0x7F,0x81,0x83,0x80,0x80,0x80,0x82, + 0x81,0x81,0x82,0x80,0x7F,0x82,0x82,0x82,0x84,0x82,0x7F,0x80,0x80,0x7F,0x80,0x81, + 0x81,0x81,0x7F,0x80,0x81,0x81,0x81,0x81,0x81,0x7F,0x7F,0x80,0x7F,0x7E,0x82,0x80, + 0x7E,0x7F,0x7F,0x81,0x82,0x83,0x80,0x82,0x83,0x80,0x81,0x82,0x82,0x81,0x81,0x82, + 0x81,0x80,0x82,0x82,0x83,0x84,0x81,0x81,0x82,0x7F,0x80,0x81,0x7D,0x7D,0x7F,0x81, + 0x81,0x80,0x81,0x80,0x7E,0x80,0x82,0x81,0x80,0x80,0x80,0x80,0x80,0x7F,0x82,0x81, + 0x81,0x81,0x80,0x80,0x80,0x81,0x80,0x7F,0x7F,0x80,0x7E,0x7D,0x7F,0x80,0x7F,0x7D, + 0x7F,0x7F,0x7E,0x7E,0x80,0x80,0x7C,0x7F,0x80,0x7F,0x80,0x81,0x82,0x81,0x81,0x80, + 0x7F,0x7F,0x7F,0x7F,0x80,0x7E,0x7C,0x7E,0x7E,0x7F,0x7F,0x7F,0x7F,0x81,0x80,0x7F, + 0x82,0x81,0x81,0x80,0x80,0x7F,0x80,0x80,0x81,0x80,0x81,0x80,0x7D,0x7E,0x7F,0x7E, + 0x7F,0x80,0x7D,0x7D,0x7F,0x7E,0x7E,0x7F,0x80,0x81,0x80,0x80,0x81,0x7F,0x7F,0x80, + 0x80,0x7F,0x7F,0x7F,0x7F,0x80,0x7F,0x7F,0x7E,0x7F,0x80,0x7E,0x7F,0x80,0x7F,0x7F, + 0x7E,0x7D,0x7D,0x7D,0x7F,0x7E,0x7E,0x7F,0x7F,0x7F,0x7F,0x80,0x7F,0x7F,0x81,0x80, + 0x7F,0x7F,0x7E,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7F,0x81,0x7F,0x80,0x80,0x7E,0x7E, + 0x7F,0x7F,0x7E,0x7E,0x7F,0x7F,0x7F,0x7F,0x7E,0x80,0x7F,0x7E,0x7F,0x80,0x7F,0x7E, + 0x80,0x7F,0x7E,0x80,0x80,0x7F,0x80,0x81,0x80,0x80,0x81,0x7F,0x80,0x81,0x80,0x80, + 0x7F,0x7F,0x80,0x7F,0x80,0x80,0x80,0x81,0x80,0x7F,0x80,0x80,0x7F,0x7F,0x7F,0x7F, + 0x80,0x7F,0x7F,0x80,0x7F,0x7F,0x80,0x7F,0x80,0x80,0x81,0x80,0x80,0x82,0x81,0x80, + 0x82,0x82,0x80,0x7F,0x81,0x81,0x7F,0x80,0x81,0x80,0x7E,0x7F,0x80,0x7F,0x80,0x80, + 0x80,0x80,0x80,0x81,0x81,0x81,0x82,0x81,0x80,0x81,0x7F,0x80,0x82,0x81,0x81,0x81, + 0x80,0x81,0x81,0x80,0x80,0x81,0x81,0x81,0x81,0x82,0x81,0x80,0x82,0x81,0x80,0x80, + 0x7F,0x7F,0x7F,0x80,0x7F,0x80,0x81,0x80,0x81,0x81,0x81,0x81,0x81,0x81,0x82,0x82, + 0x81,0x82,0x83,0x82,0x82,0x82,0x83,0x82,0x81,0x82,0x81,0x80,0x80,0x80,0x80,0x80, + 0x7F,0x80,0x81,0x80,0x7F,0x80,0x81,0x7F,0x7F,0x80,0x80,0x80,0x81,0x81,0x81,0x82, + 0x82,0x81,0x81,0x81,0x82,0x83,0x82,0x82,0x83,0x83,0x82,0x81,0x82,0x81,0x81,0x82, + 0x81,0x81,0x82,0x82,0x81,0x82,0x81,0x81,0x81,0x82,0x81,0x81,0x80,0x80,0x80,0x80, + 0x80,0x80,0x81,0x81,0x80,0x82,0x81,0x81,0x81,0x82,0x81,0x81,0x82,0x81,0x82,0x82, + 0x82,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x80,0x80,0x81,0x81,0x7F,0x7F,0x81, + 0x80,0x80,0x81,0x80,0x7F,0x80,0x80,0x7F,0x80,0x80,0x80,0x81,0x81,0x80,0x80,0x80, + 0x81,0x81,0x81,0x81,0x81,0x80,0x82,0x7F,0x91,0x88,0x83,0x89,0x66,0x78,0x84,0x6D, + 0x67,0x75,0x7F,0x83,0x8A,0x8A,0x8C,0x87,0x92,0xA2,0x9F,0x9A,0x95,0x91,0x8D,0x89, + 0x87,0x82,0x76,0x6A,0x61,0x5D,0x5F,0x63,0x6A,0x60,0x5F,0x6B,0x69,0x6A,0x70,0x6E, + 0x74,0x81,0x7E,0x8C,0x86,0x7C,0x92,0x83,0x7C,0x9A,0xB1,0xA3,0xA1,0xBA,0xB3,0xA7, + 0xA1,0x91,0x95,0x9D,0x8F,0x84,0x84,0x7D,0x77,0x7B,0x78,0x77,0x76,0x6C,0x6A,0x6D, + 0x70,0x73,0x73,0x67,0x5D,0x57,0x59,0x52,0x51,0x57,0x4E,0x56,0x60,0x6A,0x6F,0x69, + 0x6E,0x7E,0x8E,0x92,0x98,0x9B,0x9B,0x98,0x9C,0xA7,0xAC,0xAB,0xB0,0xBF,0xC5,0xB8, + 0xA8,0xAC,0xB2,0xB3,0xAC,0xAD,0xB0,0xA3,0x9E,0x9B,0x91,0x85,0x78,0x79,0x77,0x6E, + 0x6D,0x66,0x58,0x4E,0x4C,0x4A,0x45,0x3F,0x40,0x40,0x40,0x4A,0x4D,0x54,0x5F,0x5D, + 0x5F,0x60,0x62,0x61,0x5E,0x62,0x65,0x6E,0x71,0x70,0x78,0x78,0x7A,0x86,0x8F,0x93, + 0x91,0x97,0x9B,0xA0,0xA4,0xA0,0x9D,0x97,0x9D,0x9B,0x91,0x8D,0x8B,0x93,0x95,0x94, + 0x95,0x90,0x8E,0x8D,0x8E,0x91,0x90,0x8D,0x92,0x93,0x89,0x7B,0x73,0x6D,0x69,0x67, + 0x67,0x6D,0x6F,0x71,0x70,0x6E,0x6E,0x73,0x78,0x7D,0x7F,0x7D,0x7D,0x7C,0x79,0x7A, + 0x7E,0x80,0x86,0x8C,0x8E,0x95,0x9A,0x9C,0x9E,0xA2,0xA7,0xA9,0xAB,0xA9,0xA7,0xA4, + 0xA3,0xA1,0x9C,0x9C,0x9B,0x99,0x97,0x91,0x8E,0x8B,0x87,0x85,0x82,0x7F,0x7A,0x74, + 0x6E,0x69,0x6C,0x66,0x60,0x5D,0x5D,0x5D,0x5A,0x57,0x53,0x55,0x58,0x5C,0x62,0x67, + 0x6D,0x72,0x74,0x76,0x7B,0x7F,0x83,0x88,0x88,0x85,0x83,0x8B,0x90,0x8D,0x8E,0x8E, + 0x8B,0x90,0x92,0x85,0x81,0x87,0x80,0x7C,0x7E,0x77,0x78,0x7D,0x74,0x71,0x77,0x75, + 0x70,0x6C,0x66,0x66,0x64,0x5A,0x56,0x55,0x56,0x63,0x69,0x64,0x62,0x5E,0x56,0x54, + 0x4C,0x44,0x4C,0x56,0x57,0x5A,0x60,0x65,0x6A,0x6A,0x67,0x6E,0x76,0x78,0x7F,0x89, + 0x90,0x94,0x94,0x93,0x98,0xA8,0xB2,0xB2,0xB3,0xBA,0xC0,0xC2,0xC2,0xC1,0xCB,0xD1, + 0xCB,0xC6,0xC7,0xCB,0xC7,0xBE,0xB7,0xB6,0xB6,0xAC,0xA7,0xA8,0xA6,0x9F,0x94,0x8B, + 0x84,0x87,0x90,0x88,0x7E,0x81,0x7E,0x78,0x75,0x70,0x76,0x7F,0x7B,0x77,0x7E,0x80, + 0x77,0x70,0x6D,0x6F,0x73,0x6F,0x6E,0x79,0x7C,0x71,0x68,0x6A,0x6A,0x6A,0x79,0x7D, + 0x76,0x79,0x74,0x6A,0x6A,0x66,0x68,0x76,0x7B,0x7A,0x83,0x88,0x83,0x7F,0x7F,0x85, + 0x8F,0x90,0x8F,0x9B,0x9E,0x95,0x8C,0x8F,0x91,0x8F,0xA0,0xAD,0xA5,0xA2,0xA0,0x97, + 0x91,0x8B,0x87,0x91,0x96,0x8E,0x90,0x92,0x86,0x79,0x72,0x72,0x78,0x78,0x73,0x78, + 0x7B,0x70,0x62,0x5E,0x62,0x58,0x5D,0x6C,0x67,0x5F,0x5C,0x54,0x4C,0x4A,0x47,0x4D, + 0x54,0x50,0x50,0x52,0x4C,0x47,0x45,0x47,0x4F,0x56,0x55,0x5A,0x5D,0x56,0x4E,0x4E, + 0x54,0x53,0x5C,0x6E,0x70,0x6F,0x72,0x71,0x73,0x78,0x7C,0x8B,0x9A,0x9E,0xA7,0xB2, + 0xB1,0xB1,0xB5,0xBC,0xCA,0xD1,0xD1,0xD7,0xD9,0xD1,0xC9,0xC9,0xCA,0xC2,0xC7,0xD3, + 0xCB,0xBE,0xB8,0xAE,0xA5,0x9F,0x9B,0xA1,0xA6,0x9E,0x98,0x99,0x91,0x88,0x85,0x87, + 0x8F,0x90,0x8B,0x8E,0x8B,0x7F,0x7C,0x80,0x83,0x7D,0x89,0x9A,0x92,0x87,0x87,0x80, + 0x7A,0x78,0x77,0x7F,0x82,0x77,0x73,0x71,0x68,0x5F,0x5E,0x62,0x67,0x67,0x65,0x69, + 0x64,0x5A,0x5B,0x61,0x65,0x5E,0x66,0x7B,0x75,0x68,0x6B,0x6C,0x67,0x67,0x6B,0x76, + 0x7B,0x74,0x71,0x73,0x6E,0x68,0x6A,0x6F,0x74,0x74,0x71,0x71,0x6E,0x66,0x65,0x6A, + 0x6B,0x64,0x6E,0x81,0x77,0x6C,0x71,0x70,0x6B,0x6C,0x71,0x7E,0x82,0x79,0x7B,0x82, + 0x7B,0x77,0x7C,0x83,0x89,0x88,0x84,0x88,0x85,0x7D,0x7F,0x86,0x88,0x80,0x87,0x9A, + 0x90,0x80,0x85,0x86,0x7F,0x7E,0x85,0x8F,0x93,0x8B,0x89,0x8E,0x87,0x82,0x87,0x8E, + 0x93,0x94,0x92,0x95,0x93,0x8D,0x91,0x98,0x9A,0x93,0x9B,0xAD,0xA3,0x92,0x96,0x95, + 0x8A,0x84,0x86,0x8C,0x8A,0x7C,0x76,0x77,0x6C,0x62,0x65,0x68,0x68,0x66,0x62,0x63, + 0x61,0x58,0x5C,0x62,0x62,0x5D,0x61,0x75,0x72,0x63,0x6A,0x70,0x6B,0x6B,0x73,0x7F, + 0x86,0x7F,0x7F,0x87,0x84,0x7F,0x86,0x8D,0x91,0x92,0x90,0x94,0x93,0x8C,0x8F,0x95, + 0x95,0x8E,0x92,0xA6,0xA1,0x91,0x97,0x99,0x91,0x90,0x95,0x9E,0xA3,0x98,0x95,0x9C, + 0x94,0x8C,0x90,0x95,0x96,0x94,0x90,0x90,0x8D,0x83,0x84,0x88,0x86,0x7E,0x7E,0x8E, + 0x89,0x74,0x75,0x76,0x6A,0x64,0x67,0x6E,0x70,0x66,0x5F,0x64,0x5C,0x51,0x55,0x5A, + 0x5B,0x5A,0x57,0x59,0x56,0x4D,0x4C,0x50,0x50,0x49,0x4D,0x61,0x5D,0x4D,0x52,0x56, + 0x4E,0x4D,0x54,0x5F,0x64,0x5D,0x5C,0x64,0x5F,0x59,0x61,0x6B,0x70,0x71,0x72,0x77, + 0x78,0x73,0x78,0x81,0x84,0x81,0x8C,0xA3,0xA0,0x95,0x9F,0xA4,0x9F,0xA1,0xA9,0xB6, + 0xBB,0xB0,0xB1,0xB7,0xAC,0xA3,0xA8,0xAC,0xAB,0xA6,0xA2,0xA3,0x9A,0x91,0x93,0x95, + 0x90,0x89,0x93,0xA3,0x95,0x8A,0x93,0x90,0x88,0x88,0x8F,0x99,0x97,0x8F,0x93,0x96, + 0x8D,0x8C,0x92,0x98,0x9B,0x9A,0x9B,0x9E,0x96,0x91,0x97,0x99,0x95,0x91,0x9F,0xAC, + 0x9B,0x93,0x9B,0x95,0x8C,0x8E,0x95,0x9B,0x98,0x8F,0x93,0x92,0x88,0x86,0x8B,0x8E, + 0x8D,0x89,0x89,0x88,0x7E,0x7A,0x7D,0x7C,0x74,0x74,0x84,0x82,0x6F,0x6D,0x6E,0x63, + 0x5E,0x5F,0x66,0x69,0x5F,0x59,0x5B,0x53,0x4A,0x4B,0x50,0x54,0x53,0x4F,0x50,0x4D, + 0x44,0x45,0x49,0x48,0x43,0x4D,0x5E,0x56,0x4A,0x51,0x50,0x49,0x4B,0x52,0x5E,0x61, + 0x59,0x5D,0x63,0x5C,0x5A,0x60,0x67,0x6E,0x6D,0x6F,0x74,0x72,0x6F,0x74,0x79,0x79, + 0x7A,0x8E,0x98,0x8B,0x8D,0x93,0x8F,0x8E,0x95,0xA1,0xAC,0xAA,0xA9,0xB4,0xB4,0xB0, + 0xB7,0xBF,0xC8,0xCD,0xCC,0xCF,0xCE,0xC5,0xC2,0xC3,0xC1,0xB9,0xBD,0xCD,0xC3,0xB1, + 0xB2,0xAC,0xA0,0x9B,0x9C,0xA3,0xA4,0x99,0x96,0x98,0x8E,0x88,0x8C,0x8E,0x91,0x91, + 0x8F,0x91,0x8D,0x87,0x87,0x8A,0x86,0x83,0x94,0x9D,0x8C,0x88,0x8C,0x84,0x81,0x81, + 0x88,0x8F,0x8A,0x83,0x87,0x85,0x7C,0x7D,0x80,0x83,0x84,0x81,0x82,0x82,0x7B,0x78, + 0x79,0x7A,0x74,0x79,0x8B,0x84,0x76,0x78,0x74,0x6D,0x6A,0x6C,0x73,0x75,0x6C,0x6A, + 0x6B,0x63,0x5D,0x5E,0x61,0x63,0x60,0x5D,0x5E,0x59,0x52,0x50,0x51,0x4C,0x48,0x5A, + 0x62,0x51,0x4F,0x52,0x4A,0x47,0x48,0x4F,0x59,0x56,0x51,0x55,0x54,0x4F,0x50,0x55, + 0x5C,0x5F,0x5E,0x62,0x65,0x61,0x5F,0x62,0x66,0x62,0x6A,0x81,0x7E,0x72,0x79,0x78, + 0x73,0x75,0x7B,0x86,0x8B,0x86,0x8A,0x90,0x8D,0x8B,0x90,0x98,0xA0,0xA3,0xA5,0xAC, + 0xAE,0xAD,0xAE,0xB5,0xB8,0xB8,0xCD,0xDA,0xCC,0xCB,0xCD,0xC4,0xBE,0xBD,0xC2,0xC7, + 0xBE,0xB6,0xB5,0xAE,0xA4,0x9D,0x9B,0x9B,0x98,0x91,0x8D,0x8B,0x83,0x7A,0x77,0x75, + 0x6E,0x77,0x88,0x7E,0x73,0x76,0x70,0x6A,0x6A,0x6E,0x7A,0x7B,0x75,0x78,0x7A,0x77, + 0x74,0x77,0x7E,0x83,0x82,0x83,0x86,0x84,0x80,0x7D,0x7F,0x7C,0x7F,0x95,0x95,0x86, + 0x87,0x82,0x7B,0x7A,0x7A,0x84,0x89,0x82,0x7F,0x81,0x7E,0x79,0x76,0x7A,0x7F,0x7F, + 0x7B,0x7B,0x7A,0x75,0x6F,0x6E,0x6D,0x68,0x7A,0x85,0x74,0x70,0x70,0x67,0x61,0x5F, + 0x66,0x6E,0x68,0x61,0x62,0x60,0x5B,0x58,0x59,0x5F,0x61,0x5E,0x5E,0x5F,0x5C,0x57, + 0x55,0x58,0x52,0x5B,0x73,0x6A,0x5E,0x63,0x60,0x5B,0x5A,0x5D,0x6B,0x6E,0x68,0x69, + 0x6C,0x6B,0x69,0x69,0x71,0x78,0x78,0x79,0x7C,0x7E,0x7C,0x79,0x7E,0x7F,0x7F,0x97, + 0xA0,0x91,0x93,0x96,0x92,0x92,0x93,0xA0,0xAC,0xA9,0xA8,0xAC,0xAE,0xAC,0xA8,0xAA, + 0xB0,0xB1,0xAD,0xAB,0xA9,0xA3,0x9A,0x96,0x94,0x8C,0x97,0xA3,0x92,0x87,0x85,0x7B, + 0x74,0x6E,0x71,0x7B,0x76,0x6E,0x6F,0x70,0x6F,0x68,0x68,0x6F,0x73,0x71,0x71,0x73, + 0x74,0x6F,0x6D,0x72,0x70,0x7B,0x92,0x8D,0x83,0x86,0x83,0x81,0x7E,0x81,0x8F,0x94, + 0x8E,0x8C,0x8F,0x91,0x8D,0x89,0x8D,0x94,0x95,0x92,0x91,0x93,0x90,0x88,0x89,0x85, + 0x8A,0xA0,0x9D,0x90,0x91,0x8C,0x87,0x81,0x7F,0x89,0x8D,0x87,0x83,0x83,0x84,0x80, + 0x79,0x7B,0x7F,0x7F,0x7B,0x77,0x79,0x76,0x6D,0x6B,0x68,0x6C,0x80,0x80,0x71,0x70, + 0x6C,0x68,0x62,0x5E,0x67,0x6F,0x6B,0x65,0x65,0x68,0x66,0x61,0x62,0x68,0x6D,0x6B, + 0x68,0x6B,0x6D,0x67,0x65,0x65,0x69,0x82,0x87,0x7A,0x7B,0x7B,0x7A,0x77,0x74,0x7F, + 0x8B,0x8B,0x87,0x88,0x90,0x93,0x8E,0x8F,0x98,0xA1,0xA2,0x9F,0xA1,0xA7,0xA4,0xA2, + 0xA1,0xA3,0xBA,0xC4,0xB5,0xAE,0xAC,0xA8,0xA1,0x96,0x98,0xA0,0x9F,0x96,0x8C,0x8C, + 0x8B,0x81,0x78,0x77,0x7C,0x7B,0x72,0x6C,0x6C,0x69,0x62,0x5D,0x5A,0x6D,0x7E,0x73, + 0x68,0x68,0x68,0x66,0x5F,0x60,0x6C,0x76,0x78,0x73,0x75,0x7C,0x7C,0x78,0x79,0x82, + 0x8A,0x8A,0x86,0x87,0x89,0x87,0x84,0x81,0x8F,0xA5,0xA2,0x96,0x91,0x90,0x91,0x8A, + 0x84,0x8A,0x94,0x97,0x92,0x8C,0x8C,0x8E,0x8B,0x84,0x85,0x8B,0x8D,0x89,0x83,0x80, + 0x7F,0x7C,0x74,0x76,0x8B,0x92,0x89,0x7F,0x77,0x77,0x74,0x6C,0x6A,0x72,0x78,0x79, + 0x73,0x6F,0x70,0x71,0x6E,0x6A,0x6B,0x6F,0x70,0x6E,0x6B,0x68,0x66,0x63,0x60,0x6F, + 0x7D,0x79,0x73,0x6D,0x68,0x69,0x65,0x61,0x65,0x6C,0x72,0x75,0x74,0x74,0x76,0x78, + 0x79,0x7A,0x7C,0x81,0x86,0x89,0x88,0x87,0x88,0x85,0x8E,0xA3,0xA9,0xA5,0xA1,0x9B, + 0x9B,0x9D,0x98,0x96,0x99,0x9C,0xA2,0xA3,0x9E,0x9B,0x9A,0x99,0x96,0x94,0x91,0x90, + 0x90,0x8D,0x88,0x85,0x80,0x7A,0x83,0x8C,0x89,0x85,0x7F,0x76,0x77,0x77,0x70,0x6F, + 0x6E,0x6D,0x72,0x73,0x71,0x72,0x72,0x71,0x74,0x76,0x75,0x74,0x74,0x75,0x76,0x76, + 0x76,0x74,0x7D,0x86,0x82,0x80,0x81,0x7D,0x81,0x84,0x80,0x81,0x82,0x81,0x85,0x84, + 0x83,0x85,0x83,0x83,0x85,0x86,0x87,0x87,0x87,0x88,0x88,0x87,0x86,0x85,0x88,0x8C, + 0x88,0x88,0x88,0x84,0x87,0x88,0x83,0x84,0x84,0x82,0x82,0x7F,0x7C,0x7C,0x78,0x77, + 0x78,0x79,0x79,0x78,0x77,0x78,0x79,0x79,0x79,0x78,0x7B,0x80,0x7D,0x7C,0x7D,0x7A, + 0x7D,0x80,0x7C,0x7D,0x7E,0x7B,0x7B,0x79,0x77,0x78,0x75,0x75,0x77,0x78,0x79,0x79, + 0x79,0x7A,0x7C,0x7D,0x7E,0x7D,0x7F,0x86,0x84,0x81,0x84,0x81,0x84,0x8A,0x86,0x87, + 0x89,0x84,0x84,0x85,0x82,0x83,0x82,0x80,0x83,0x84,0x84,0x84,0x84,0x85,0x85,0x86, + 0x87,0x85,0x83,0x87,0x88,0x82,0x82,0x82,0x7E,0x83,0x83,0x7D,0x7E,0x7A,0x76,0x77, + 0x74,0x72,0x72,0x6F,0x70,0x71,0x72,0x73,0x73,0x73,0x75,0x77,0x79,0x79,0x78,0x79, + 0x80,0x7F,0x7B,0x7F,0x7E,0x80,0x86,0x82,0x81,0x82,0x7E,0x7F,0x81,0x7E,0x7E,0x7D, + 0x7C,0x7E,0x80,0x81,0x81,0x82,0x83,0x85,0x88,0x88,0x87,0x86,0x89,0x8E,0x8B,0x89, + 0x8C,0x89,0x8C,0x8F,0x8A,0x8A,0x89,0x84,0x86,0x85,0x81,0x81,0x7E,0x7D,0x7F,0x7F, + 0x80,0x80,0x81,0x81,0x84,0x85,0x83,0x82,0x81,0x85,0x89,0x84,0x84,0x85,0x81,0x86, + 0x87,0x83,0x86,0x8E,0x78,0x61,0x75,0x85,0x82,0x68,0x80,0x83,0x5F,0x72,0x7C,0x7B, + 0x7C,0x8B,0x91,0x7A,0x80,0x88,0x8B,0x82,0x80,0x8E,0x7D,0x71,0x78,0x81,0x81,0x80, + 0x81,0x85,0x7C,0x73,0x78,0x71,0x73,0x73,0x7A,0x7B,0x76,0x7D,0x7B,0x83,0x87,0x91, + 0x92,0x88,0x8C,0x90,0x8F,0x8D,0x89,0x89,0x88,0x8B,0x85,0x84,0x8A,0x80,0x7F,0x7F, + 0x7A,0x7C,0x73,0x6C,0x69,0x6A,0x6A,0x68,0x6D,0x71,0x7E,0x84,0x77,0x75,0x7C,0x7B, + 0x7B,0x87,0x85,0x7A,0x7F,0x7E,0x81,0x83,0x7F,0x87,0x7E,0x78,0x80,0x79,0x76,0x80, + 0x78,0x6F,0x77,0x7C,0x7A,0x79,0x79,0x7E,0x80,0x83,0x85,0x83,0x83,0x85,0x85,0x87, + 0x86,0x81,0x81,0x88,0x92,0x91,0x8A,0x88,0x85,0x88,0x83,0x80,0x83,0x7A,0x7B,0x82, + 0x82,0x81,0x81,0x86,0x84,0x80,0x86,0x89,0x88,0x87,0x85,0x88,0x82,0x84,0x85,0x82, + 0x84,0x87,0x87,0x84,0x84,0x85,0x82,0x80,0x7A,0x76,0x7A,0x76,0x7A,0x7F,0x7B,0x7B, + 0x7D,0x7E,0x81,0x87,0x80,0x82,0x87,0x7F,0x7C,0x84,0x85,0x80,0x83,0x7A,0x7D,0x88, + 0x89,0x84,0x82,0x85,0x7F,0x7C,0x79,0x77,0x72,0x70,0x7C,0x7D,0x79,0x7F,0x7C,0x7D, + 0x84,0x85,0x88,0x87,0x8B,0x82,0x85,0x89,0x83,0x87,0x80,0x85,0x8C,0x8C,0x89,0x88, + 0x8F,0x84,0x80,0x80,0x7C,0x7C,0x78,0x77,0x7A,0x7D,0x7A,0x77,0x7C,0x80,0x82,0x84, + 0x84,0x82,0x7E,0x80,0x84,0x83,0x7F,0x7E,0x7D,0x7D,0x85,0x81,0x7A,0x7C,0x7C,0x78, + 0x75,0x7D,0x78,0x77,0x76,0x75,0x7B,0x74,0x7A,0x7D,0x7A,0x83,0x82,0x85,0x88,0x7F, + 0x7D,0x83,0x94,0x93,0x8C,0x8E,0x89,0x85,0x89,0x88,0x7C,0x76,0x7D,0x7F,0x7B,0x7F, + 0x7D,0x78,0x81,0x84,0x82,0x84,0x83,0x86,0x83,0x7F,0x80,0x79,0x7E,0x83,0x7C,0x7C, + 0x91,0x9B,0x8E,0x8D,0x87,0x85,0x8A,0x82,0x7B,0x74,0x76,0x81,0x7E,0x80,0x81,0x7A, + 0x80,0x8A,0x84,0x80,0x81,0x88,0x8A,0x7D,0x7B,0x7E,0x7E,0x7D,0x76,0x7D,0x90,0x8F, + 0x89,0x87,0x81,0x81,0x83,0x7B,0x75,0x72,0x78,0x81,0x79,0x7B,0x7C,0x7E,0x86,0x87, + 0x82,0x80,0x7F,0x84,0x83,0x7A,0x82,0x85,0x82,0x7E,0x76,0x84,0x95,0x91,0x87,0x84, + 0x87,0x8A,0x83,0x77,0x73,0x71,0x79,0x7F,0x74,0x78,0x7E,0x80,0x8C,0x80,0x80,0x85, + 0x84,0x84,0x7A,0x7D,0x83,0x7F,0x7C,0x77,0x74,0x89,0x98,0x8B,0x87,0x85,0x83,0x88, + 0x7C,0x6F,0x74,0x74,0x7B,0x77,0x73,0x7F,0x80,0x84,0x89,0x7B,0x7E,0x83,0x79,0x7B, + 0x7D,0x7E,0x83,0x80,0x7A,0x75,0x7B,0x8E,0x91,0x84,0x8A,0x89,0x84,0x8A,0x7A,0x74, + 0x7B,0x7D,0x7E,0x78,0x77,0x82,0x87,0x84,0x7F,0x81,0x88,0x83,0x78,0x80,0x82,0x7E, + 0x80,0x7C,0x7A,0x76,0x7A,0x8F,0x8C,0x82,0x8C,0x86,0x85,0x8B,0x7B,0x75,0x7C,0x7B, + 0x7D,0x78,0x7A,0x82,0x8A,0x86,0x7E,0x81,0x87,0x82,0x7E,0x82,0x7C,0x7E,0x80,0x7A, + 0x7B,0x7A,0x7C,0x8D,0x89,0x7F,0x8B,0x85,0x87,0x89,0x76,0x79,0x7F,0x78,0x78,0x76, + 0x77,0x81,0x81,0x83,0x81,0x7E,0x8A,0x89,0x7B,0x82,0x82,0x7A,0x7A,0x77,0x7F,0x7B, + 0x75,0x8C,0x8E,0x80,0x8A,0x85,0x83,0x89,0x74,0x76,0x84,0x72,0x79,0x7A,0x72,0x82, + 0x82,0x7D,0x7F,0x85,0x86,0x87,0x7E,0x7C,0x80,0x7C,0x79,0x79,0x7C,0x78,0x74,0x86, + 0x8E,0x7F,0x8B,0x89,0x7F,0x89,0x7A,0x72,0x80,0x75,0x76,0x7A,0x70,0x81,0x85,0x7E, + 0x88,0x85,0x82,0x87,0x80,0x7D,0x80,0x82,0x7D,0x76,0x7E,0x7B,0x73,0x82,0x90,0x86, + 0x87,0x8C,0x82,0x8B,0x83,0x73,0x81,0x7A,0x71,0x7C,0x76,0x7B,0x85,0x7F,0x86,0x86, + 0x82,0x86,0x83,0x80,0x84,0x81,0x7D,0x7C,0x7C,0x80,0x75,0x76,0x8B,0x87,0x83,0x8B, + 0x83,0x84,0x8A,0x7B,0x7C,0x7F,0x71,0x7C,0x78,0x72,0x83,0x7F,0x7D,0x84,0x83,0x85, + 0x86,0x82,0x83,0x83,0x7F,0x78,0x7A,0x80,0x7B,0x75,0x7E,0x8D,0x83,0x86,0x8A,0x7E, + 0x8C,0x88,0x76,0x80,0x77,0x74,0x7E,0x71,0x75,0x81,0x79,0x7E,0x84,0x81,0x8A,0x85, + 0x81,0x87,0x81,0x7C,0x79,0x7A,0x82,0x7B,0x72,0x87,0x8B,0x82,0x8C,0x86,0x7F,0x8D, + 0x82,0x74,0x7D,0x76,0x78,0x7B,0x71,0x7D,0x7D,0x7E,0x87,0x7E,0x84,0x89,0x7F,0x82, + 0x84,0x7C,0x7A,0x7C,0x76,0x79,0x77,0x72,0x81,0x85,0x83,0x86,0x80,0x85,0x8B,0x7B, + 0x77,0x7B,0x76,0x78,0x77,0x70,0x7B,0x80,0x7D,0x84,0x81,0x84,0x8A,0x85,0x83,0x86, + 0x80,0x7D,0x7C,0x7D,0x7F,0x7A,0x7B,0x88,0x87,0x82,0x88,0x84,0x83,0x8C,0x81,0x76, + 0x81,0x7C,0x78,0x7D,0x76,0x7B,0x7F,0x7E,0x7E,0x7C,0x84,0x8C,0x82,0x82,0x87,0x7F, + 0x81,0x81,0x7F,0x81,0x7C,0x78,0x83,0x87,0x80,0x85,0x88,0x86,0x88,0x83,0x7E,0x82, + 0x7E,0x7B,0x7C,0x75,0x79,0x7F,0x7C,0x7E,0x7F,0x80,0x87,0x82,0x82,0x86,0x82,0x85, + 0x80,0x7C,0x80,0x7D,0x7B,0x81,0x87,0x7F,0x84,0x85,0x83,0x89,0x86,0x81,0x83,0x80, + 0x7D,0x7D,0x79,0x7B,0x81,0x7B,0x7D,0x80,0x7F,0x87,0x84,0x81,0x89,0x84,0x82,0x82, + 0x7E,0x84,0x82,0x7D,0x83,0x86,0x82,0x86,0x84,0x81,0x89,0x85,0x81,0x85,0x82,0x80, + 0x81,0x7A,0x7A,0x7F,0x7A,0x7D,0x80,0x80,0x84,0x83,0x81,0x86,0x84,0x82,0x83,0x81, + 0x81,0x81,0x79,0x7F,0x85,0x80,0x82,0x81,0x81,0x84,0x82,0x80,0x82,0x80,0x7F,0x81, + 0x7A,0x7B,0x81,0x7E,0x7D,0x81,0x7E,0x83,0x82,0x82,0x87,0x84,0x84,0x83,0x80,0x81, + 0x82,0x7D,0x83,0x88,0x81,0x83,0x83,0x82,0x87,0x82,0x80,0x85,0x82,0x82,0x83,0x7D, + 0x7F,0x81,0x7C,0x80,0x81,0x7B,0x84,0x88,0x82,0x86,0x83,0x82,0x87,0x82,0x85,0x84, + 0x7B,0x86,0x86,0x7D,0x85,0x82,0x82,0x8A,0x82,0x7E,0x84,0x7F,0x80,0x7F,0x79,0x80, + 0x7D,0x7B,0x80,0x7D,0x7B,0x84,0x86,0x81,0x83,0x82,0x84,0x84,0x7D,0x83,0x85,0x88, + 0x94,0x87,0x85,0x81,0x75,0x79,0x76,0x7B,0x7B,0x7E,0x71,0x75,0x7C,0x5F,0x76,0x92, + 0x75,0x79,0x89,0x7F,0x84,0x76,0x82,0x93,0x82,0x85,0x83,0x7D,0x82,0x82,0x88,0x89, + 0x82,0x87,0x8A,0x87,0x88,0x87,0x8C,0x8E,0x88,0x86,0x7F,0x79,0x7F,0x86,0x7C,0x77, + 0x82,0x88,0x86,0x89,0x86,0x7B,0x7E,0x88,0x8A,0x88,0x90,0x8D,0x87,0x89,0x86,0x7F, + 0x79,0x7C,0x85,0x8A,0x91,0x91,0x83,0x79,0x76,0x74,0x75,0x75,0x71,0x74,0x76,0x70, + 0x6D,0x6A,0x69,0x6D,0x72,0x70,0x6A,0x6A,0x68,0x64,0x6D,0x6E,0x63,0x6D,0x75,0x79, + 0x7C,0x75,0x74,0x79,0x72,0x6C,0x68,0x69,0x76,0x7C,0x72,0x70,0x77,0x79,0x7A,0x74, + 0x74,0x7F,0x80,0x7C,0x7B,0x7E,0x7C,0x89,0xA7,0xAF,0xB5,0xB6,0xA4,0xA4,0x9C,0x88, + 0x8B,0x90,0x8A,0x86,0x7E,0x82,0x92,0x89,0x7E,0x86,0x88,0x89,0x88,0x82,0x89,0x89, + 0x84,0x86,0x84,0x79,0x8C,0xA6,0x9A,0x98,0x9A,0x93,0x97,0x85,0x75,0x86,0x8C,0x89, + 0x8E,0x8B,0x94,0x97,0x82,0x82,0x88,0x82,0x80,0x79,0x7F,0x87,0x7F,0x77,0x7B,0x78, + 0x76,0x8F,0x92,0x85,0x8A,0x87,0x83,0x7D,0x69,0x6C,0x7A,0x77,0x7C,0x80,0x81,0x8B, + 0x80,0x73,0x7A,0x75,0x71,0x73,0x72,0x79,0x7A,0x6A,0x64,0x61,0x56,0x66,0x76,0x69, + 0x6A,0x6D,0x5E,0x5A,0x4D,0x48,0x5A,0x5D,0x5B,0x65,0x67,0x6C,0x68,0x5B,0x5F,0x67, + 0x69,0x6A,0x70,0x77,0x76,0x69,0x64,0x66,0x5E,0x6E,0x81,0x7A,0x7B,0x7B,0x6D,0x6E, + 0x67,0x65,0x7B,0x86,0x8C,0x99,0x9D,0xA2,0xA0,0x91,0x94,0x9E,0x9F,0xA2,0xA3,0xA0, + 0x99,0x86,0x83,0x86,0x7B,0x90,0xA6,0x99,0x97,0x93,0x86,0x81,0x7B,0x7B,0x8F,0x96, + 0x94,0x9B,0x99,0x93,0x8C,0x82,0x8B,0x99,0x97,0x9A,0x9E,0x9B,0x93,0x87,0x8A,0x8C, + 0x8B,0xA4,0xAB,0x9B,0x9B,0x90,0x82,0x7C,0x72,0x7C,0x8F,0x8F,0x8D,0x93,0x8D,0x84, + 0x78,0x74,0x85,0x8D,0x89,0x8B,0x8D,0x83,0x78,0x77,0x7D,0x7C,0x89,0x9F,0x97,0x8C, + 0x88,0x7B,0x73,0x6D,0x6A,0x78,0x7D,0x74,0x76,0x70,0x67,0x5D,0x52,0x59,0x66,0x63, + 0x61,0x63,0x5F,0x55,0x4D,0x56,0x56,0x5B,0x75,0x76,0x69,0x69,0x63,0x5D,0x5C,0x5B, + 0x67,0x73,0x6E,0x6C,0x6C,0x67,0x64,0x5D,0x60,0x70,0x73,0x72,0x77,0x78,0x76,0x71, + 0x77,0x81,0x7F,0x9B,0xB4,0xA8,0xA7,0xAA,0xA1,0x9E,0x98,0x98,0xA8,0xA4,0x97,0x9A, + 0x93,0x8B,0x86,0x83,0x90,0x96,0x8D,0x8E,0x90,0x89,0x83,0x83,0x8D,0x89,0x93,0xAE, + 0xA6,0x97,0x94,0x90,0x8D,0x8B,0x89,0x9B,0xA6,0x98,0x97,0x97,0x91,0x8C,0x88,0x8F, + 0x9A,0x96,0x92,0x90,0x85,0x83,0x81,0x87,0x8B,0x82,0x95,0xA8,0x91,0x85,0x8A,0x82, + 0x80,0x7C,0x80,0x94,0x92,0x81,0x83,0x84,0x7F,0x7C,0x7B,0x88,0x8E,0x87,0x85,0x82, + 0x7A,0x74,0x74,0x74,0x68,0x6E,0x87,0x7B,0x67,0x65,0x5F,0x5B,0x56,0x54,0x65,0x6F, + 0x60,0x5B,0x5E,0x59,0x55,0x54,0x5C,0x69,0x67,0x62,0x68,0x63,0x5B,0x5E,0x64,0x69, + 0x60,0x66,0x7E,0x72,0x5F,0x65,0x62,0x62,0x66,0x67,0x77,0x84,0x76,0x73,0x7F,0x7F, + 0x82,0x8A,0x95,0xA5,0xA7,0xA1,0xA2,0x9F,0x97,0x94,0x97,0x92,0x8C,0xA4,0xA9,0x8F, + 0x8D,0x8C,0x83,0x80,0x7F,0x89,0x94,0x90,0x87,0x8C,0x89,0x86,0x84,0x88,0x97,0x9A, + 0x92,0x93,0x93,0x89,0x8A,0x90,0x90,0x95,0x8F,0x91,0xA6,0x99,0x85,0x8D,0x89,0x83, + 0x86,0x87,0x91,0x95,0x86,0x86,0x89,0x86,0x83,0x81,0x8B,0x91,0x8A,0x84,0x85,0x83, + 0x80,0x7F,0x83,0x7F,0x7B,0x94,0x97,0x82,0x84,0x82,0x7C,0x79,0x76,0x81,0x8B,0x80, + 0x78,0x78,0x72,0x6A,0x65,0x68,0x70,0x73,0x69,0x68,0x68,0x5E,0x58,0x5D,0x62,0x64, + 0x63,0x5C,0x6D,0x74,0x5B,0x59,0x63,0x5F,0x60,0x5E,0x64,0x72,0x67,0x5C,0x63,0x63, + 0x60,0x62,0x64,0x6F,0x72,0x6A,0x6D,0x6F,0x6E,0x70,0x76,0x7E,0x7B,0x7F,0x9B,0x9E, + 0x91,0x97,0x97,0x97,0x98,0x93,0xA0,0xA9,0x98,0x94,0x97,0x8F,0x8C,0x8A,0x8E,0x97, + 0x93,0x89,0x8C,0x8C,0x85,0x82,0x89,0x90,0x91,0x8C,0x87,0x9B,0xA3,0x8A,0x89,0x90, + 0x8B,0x8A,0x88,0x8F,0x9B,0x92,0x86,0x8E,0x90,0x89,0x88,0x8C,0x91,0x92,0x89,0x88, + 0x8D,0x89,0x87,0x87,0x8C,0x85,0x7C,0x98,0x9E,0x88,0x87,0x88,0x83,0x81,0x7A,0x86, + 0x93,0x88,0x82,0x84,0x81,0x7F,0x7B,0x7F,0x8A,0x8A,0x80,0x80,0x82,0x7C,0x75,0x75, + 0x78,0x73,0x6F,0x6A,0x72,0x81,0x6C,0x60,0x69,0x65,0x60,0x5D,0x63,0x71,0x6A,0x5B, + 0x61,0x65,0x5F,0x5E,0x63,0x69,0x6C,0x66,0x64,0x6A,0x68,0x64,0x64,0x68,0x68,0x5E, + 0x6E,0x84,0x75,0x6A,0x71,0x70,0x6E,0x6F,0x76,0x87,0x8A,0x80,0x85,0x8E,0x8E,0x8C, + 0x90,0x9D,0xA2,0x9C,0x97,0x9B,0x9B,0x92,0x8F,0x95,0x98,0x91,0x8A,0x8E,0xA0,0x9A, + 0x84,0x88,0x8D,0x86,0x83,0x84,0x8F,0x95,0x87,0x82,0x8A,0x88,0x84,0x86,0x8C,0x91, + 0x8C,0x87,0x8B,0x8C,0x88,0x87,0x89,0x8D,0x87,0x81,0x98,0xA0,0x89,0x86,0x8B,0x86, + 0x85,0x7E,0x86,0x97,0x8F,0x83,0x86,0x88,0x85,0x81,0x85,0x8D,0x8D,0x86,0x83,0x87, + 0x89,0x81,0x80,0x89,0x8A,0x81,0x7A,0x8B,0x9A,0x85,0x79,0x81,0x80,0x77,0x6E,0x73, + 0x7F,0x78,0x6C,0x6C,0x71,0x6C,0x65,0x64,0x6C,0x70,0x67,0x66,0x67,0x66,0x64,0x63, + 0x67,0x69,0x5F,0x61,0x7B,0x76,0x62,0x68,0x69,0x69,0x60,0x67,0x76,0x6F,0x75,0x54, + 0x58,0x72,0x61,0x53,0x60,0x79,0x7F,0x83,0x87,0x90,0x8F,0x92,0xAA,0xB4,0xB5,0xB6, + 0xB2,0xBB,0xB0,0x8C,0xA0,0xA4,0x7E,0x79,0x7D,0x78,0x6E,0x66,0x50,0x5C,0x74,0x72, + 0x69,0x5D,0x74,0x7D,0x72,0x7D,0x8B,0x98,0xA0,0x9F,0xA2,0xB1,0xAD,0xC9,0xD0,0xB0, + 0xD6,0xBF,0xB4,0xC5,0xA8,0xB1,0xAC,0x98,0x8E,0x8D,0x94,0x93,0x71,0x68,0x71,0x62, + 0x71,0x68,0x6A,0x88,0x6C,0x6A,0x7B,0x76,0x7C,0x67,0x56,0x69,0x68,0x60,0x67,0x67, + 0x5C,0x5D,0x5F,0x74,0x7F,0x80,0x8B,0x82,0x8E,0x8D,0x7C,0x7D,0x81,0x7B,0x78,0x82, + 0x93,0x96,0x8B,0x80,0x91,0x8C,0x84,0x9A,0x8C,0x82,0x81,0x81,0x7D,0x72,0x77,0x74, + 0x72,0x6F,0x74,0x80,0x74,0x67,0x5B,0x50,0x5B,0x5F,0x4D,0x42,0x50,0x4C,0x43,0x49, + 0x55,0x66,0x5A,0x69,0x7D,0x71,0x76,0x86,0x83,0x85,0x83,0x7E,0x97,0x9B,0x98,0x9E, + 0x94,0xA5,0xB6,0xB3,0xC1,0xBE,0xB2,0xB4,0xAB,0x99,0x9E,0x89,0x78,0x8B,0x7A,0x87, + 0x9E,0x88,0x7B,0x71,0x6A,0x75,0x80,0x74,0x73,0x6B,0x6F,0x81,0x70,0x6F,0x73,0x76, + 0x81,0x78,0x7B,0x71,0x71,0x83,0x82,0x84,0x7B,0x82,0x96,0x8D,0x8D,0xA1,0x8C,0x8D, + 0x91,0x8A,0x9B,0x91,0x90,0x98,0x99,0x99,0x9B,0xA4,0xA4,0x9F,0xAB,0xAB,0xB1,0xB8, + 0xA5,0xA0,0xA1,0xA1,0x9E,0x93,0x89,0x6E,0x68,0x74,0x74,0x71,0x5C,0x5C,0x6D,0x67, + 0x58,0x45,0x34,0x36,0x3E,0x49,0x4C,0x3E,0x3B,0x44,0x42,0x44,0x4B,0x45,0x46,0x43, + 0x3D,0x47,0x4A,0x55,0x56,0x61,0x85,0x87,0x84,0x79,0x6B,0x7D,0x88,0x93,0xA8,0xA6, + 0xAF,0xBD,0xAD,0xA2,0xA8,0xAD,0xB0,0xCA,0xD7,0xBF,0xC2,0xCD,0xCF,0xCE,0xC7,0xC9, + 0xC3,0xC5,0xC8,0xB4,0xA0,0x8E,0x7A,0x79,0x8D,0x8E,0x7E,0x6C,0x5B,0x59,0x5D,0x5C, + 0x54,0x51,0x4E,0x5F,0x5A,0x43,0x3B,0x2F,0x46,0x49,0x47,0x55,0x4C,0x59,0x6C,0x69, + 0x5E,0x5C,0x68,0x6B,0x6C,0x85,0x7B,0x73,0x86,0x73,0x7B,0x91,0x8D,0x98,0x9E,0xAB, + 0xB3,0xAD,0xA9,0xB2,0xB4,0xB6,0xBB,0xB5,0xB8,0xBF,0xC7,0xBD,0xBD,0xBC,0xAE,0xB1, + 0xAB,0xA3,0xA1,0x9F,0x99,0x91,0x86,0x83,0x8E,0x81,0x7E,0x7F,0x74,0x6A,0x61,0x68, + 0x60,0x57,0x55,0x53,0x5F,0x68,0x62,0x58,0x56,0x52,0x51,0x50,0x44,0x43,0x45,0x4C, + 0x58,0x5F,0x5E,0x50,0x49,0x4D,0x56,0x61,0x58,0x51,0x5B,0x64,0x68,0x63,0x6B,0x6B, + 0x64,0x7E,0x80,0x84,0x90,0x89,0x8F,0x89,0x89,0x97,0x9F,0xAD,0xAB,0x9F,0x9E,0x97, + 0x98,0x98,0x9B,0xAF,0xA9,0x9C,0xA2,0xA5,0x95,0x8C,0x85,0x79,0x9A,0xB3,0xA9,0xA1, + 0x8C,0x8F,0x9B,0x9D,0x94,0x86,0x91,0xA1,0x9E,0x95,0x94,0x9B,0x9B,0x93,0x8F,0x89, + 0x8D,0x7B,0x6B,0x6D,0x66,0x6D,0x6E,0x69,0x7D,0x95,0x86,0x77,0x77,0x6E,0x76,0x74, + 0x6C,0x6D,0x71,0x79,0x6B,0x64,0x65,0x60,0x66,0x6B,0x73,0x7D,0x7E,0x84,0x7A,0x7E, + 0x88,0x81,0x80,0x7D,0x98,0xA9,0x92,0x83,0x73,0x76,0x84,0x7D,0x7E,0x84,0x87,0x87, + 0x7D,0x74,0x74,0x6E,0x76,0x70,0x6A,0x79,0x72,0x76,0x81,0x73,0x70,0x75,0x6D,0x7B, + 0x98,0x8E,0x80,0x80,0x74,0x89,0x96,0x7D,0x7B,0x7F,0x8D,0xA0,0x8F,0x86,0x83,0x79, + 0x81,0x80,0x7B,0x83,0x88,0x86,0x85,0x87,0x82,0x84,0x7C,0x75,0x8D,0x8C,0x81,0x7A, + 0x71,0x6F,0x66,0x62,0x5D,0x60,0x82,0x8B,0x7C,0x6D,0x5E,0x79,0x7D,0x74,0x6F,0x5C, + 0x64,0x6C,0x75,0x79,0x75,0x7C,0x78,0x7C,0x98,0x98,0x8A,0x86,0x82,0x92,0x90,0x8A, + 0x8E,0x95,0x9A,0x96,0x9B,0x95,0x92,0x99,0x97,0x92,0x8E,0x8F,0x92,0x94,0x96,0x94, + 0x88,0x94,0x95,0x97,0xAF,0xAF,0xAD,0xAE,0xA5,0xA2,0x9F,0x94,0x90,0x98,0x9F,0x9B, + 0x8E,0x7C,0x7C,0x8A,0x95,0x91,0x87,0x88,0x82,0x7A,0x7C,0x72,0x63,0x69,0x65,0x6C, + 0x79,0x71,0x6A,0x6A,0x6C,0x68,0x63,0x66,0x70,0x77,0x79,0x70,0x5F,0x5F,0x5B,0x57, + 0x56,0x4D,0x53,0x58,0x63,0x65,0x5E,0x5A,0x58,0x63,0x5D,0x67,0x77,0x68,0x66,0x69, + 0x69,0x6F,0x6F,0x6E,0x70,0x77,0x83,0x80,0x73,0x6E,0x6F,0x6F,0x6D,0x6F,0x70,0x6C, + 0x73,0x79,0x7C,0x7A,0x7D,0x85,0x7B,0x79,0x86,0x89,0x8A,0x93,0x94,0x8D,0x8E,0x91, + 0x8D,0x9B,0xA6,0xA1,0x9E,0x97,0x97,0x9B,0x8C,0x87,0x8C,0x8B,0x97,0xA0,0x9B,0x9B, + 0x93,0x9A,0xA0,0x9D,0xAE,0xB0,0xAA,0xA4,0x9E,0x96,0x90,0x98,0x9B,0x96,0x9D,0xA1, + 0xA3,0xA4,0x97,0x8E,0x87,0x7F,0x83,0x84,0x80,0x84,0x83,0x83,0x88,0x86,0x81,0x85, + 0x8F,0x97,0x8E,0x82,0x79,0x74,0x70,0x6B,0x71,0x6C,0x66,0x66,0x69,0x75,0x73,0x69, + 0x5A,0x57,0x5B,0x5F,0x63,0x55,0x53,0x59,0x58,0x5F,0x5D,0x56,0x67,0x74,0x7C,0x80, + 0x6F,0x66,0x62,0x60,0x65,0x6A,0x64,0x5A,0x5B,0x69,0x72,0x6F,0x71,0x6E,0x6F,0x7D, + 0x80,0x77,0x6E,0x75,0x77,0x7C,0x83,0x7F,0x8D,0x97,0x9A,0x98,0x88,0x83,0x82,0x88, + 0x8C,0x89,0x8B,0x7F,0x7B,0x8A,0x91,0x96,0x96,0x8C,0x8E,0x99,0x99,0x91,0x91,0x93, + 0x94,0xA0,0x9C,0x92,0x93,0xA0,0xA8,0xA4,0x9F,0x96,0x9C,0x9F,0xA0,0xA1,0x95,0x95, + 0x95,0x91,0x92,0x95,0x93,0x8F,0x8F,0x90,0x99,0x94,0x93,0x94,0x8B,0x8F,0x96,0x8D, + 0x89,0x92,0x92,0x8E,0x8C,0x89,0x88,0x8F,0x90,0x8C,0x8A,0x8A,0x8A,0x80,0x74,0x74, + 0x6F,0x6C,0x6D,0x6C,0x6A,0x64,0x6E,0x6C,0x62,0x6F,0x6A,0x64,0x62,0x5E,0x66,0x59, + 0x5C,0x59,0x4E,0x5E,0x5E,0x5D,0x5E,0x5E,0x5F,0x5B,0x5E,0x58,0x5C,0x64,0x5F,0x5F, + 0x5D,0x59,0x63,0x69,0x66,0x6A,0x64,0x63,0x6C,0x6F,0x7B,0x78,0x6E,0x75,0x76,0x77, + 0x7C,0x76,0x74,0x7A,0x7F,0x81,0x82,0x86,0x87,0x8D,0x8F,0x8A,0x8A,0x8F,0x8D,0x90, + 0x95,0x90,0x8C,0x8A,0x8B,0x8D,0x90,0x93,0x92,0x8E,0x8D,0x94,0x99,0x93,0x93,0x99, + 0x97,0x9A,0x9C,0x93,0x93,0x98,0x9D,0x9E,0x9C,0x9A,0x9B,0x9E,0xA0,0xA4,0x9F,0x9A, + 0x9A,0x95,0x9A,0xA5,0x9D,0x9D,0x9D,0x9A,0x9E,0x9D,0x9F,0x9B,0x9D,0xA0,0x97,0x95, + 0x91,0x8D,0x8E,0x8B,0x85,0x84,0x82,0x82,0x86,0x84,0x7F,0x7F,0x7D,0x7D,0x7A,0x7C, + 0x82,0x7A,0x7A,0x76,0x6D,0x77,0x75,0x74,0x79,0x79,0x78,0x76,0x75,0x6F,0x70,0x71, + 0x6A,0x69,0x68,0x67,0x68,0x61,0x5E,0x5F,0x66,0x69,0x61,0x5E,0x66,0x68,0x63,0x5F, + 0x58,0x57,0x63,0x69,0x68,0x6C,0x63,0x5C,0x61,0x63,0x63,0x6B,0x66,0x5E,0x65,0x69, + 0x6E,0x70,0x6B,0x6D,0x73,0x7A,0x7D,0x72,0x73,0x7A,0x79,0x7C,0x79,0x75,0x7C,0x81, + 0x84,0x85,0x80,0x7E,0x7D,0x87,0x8A,0x85,0x88,0x82,0x7E,0x87,0x86,0x85,0x85,0x83, + 0x87,0x8D,0x8E,0x87,0x86,0x8F,0x96,0x99,0x98,0x94,0x96,0x9A,0x9E,0xA0,0xA0,0x9F, + 0x99,0x9F,0xA0,0x9D,0x9D,0x93,0x91,0x94,0x96,0x9C,0x99,0x97,0x99,0x96,0x9A,0x97, + 0x8F,0x93,0x98,0x97,0x97,0x90,0x8B,0x8C,0x90,0x8F,0x8F,0x8F,0x8B,0x8B,0x89,0x87, + 0x86,0x83,0x82,0x84,0x82,0x82,0x83,0x7F,0x80,0x81,0x7D,0x7C,0x7B,0x79,0x80,0x80, + 0x79,0x7A,0x78,0x78,0x7A,0x79,0x7B,0x7E,0x7B,0x77,0x77,0x77,0x73,0x73,0x75,0x6E, + 0x6C,0x6E,0x6E,0x71,0x74,0x73,0x74,0x72,0x74,0x75,0x76,0x7D,0x76,0x77,0x7B,0x7A, + 0x80,0x7B,0x77,0x79,0x7A,0x7B,0x77,0x72,0x73,0x74,0x79,0x76,0x71,0x72,0x70,0x74, + 0x77,0x73,0x73,0x74,0x74,0x74,0x72,0x78,0x77,0x71,0x75,0x77,0x79,0x7C,0x78,0x7B, + 0x7E,0x80,0x7D,0x78,0x77,0x77,0x7E,0x7F,0x78,0x77,0x78,0x7D,0x80,0x7E,0x7C,0x7C, + 0x7E,0x7E,0x7D,0x82,0x86,0x82,0x85,0x84,0x82,0x88,0x84,0x80,0x85,0x85,0x80,0x7F, + 0x7D,0x7B,0x7E,0x82,0x7E,0x7D,0x7C,0x7E,0x81,0x80,0x7F,0x80,0x81,0x83,0x83,0x85, + 0x8D,0x8C,0x89,0x8A,0x82,0x87,0x8B,0x89,0x8F,0x8D,0x87,0x87,0x87,0x8A,0x89,0x87, + 0x83,0x80,0x82,0x85,0x85,0x84,0x81,0x83,0x87,0x86,0x84,0x81,0x87,0x8B,0x88,0x8A, + 0x85,0x84,0x8C,0x89,0x8A,0x88,0x82,0x83,0x81,0x86,0x86,0x81,0x80,0x7D,0x7F,0x82, + 0x80,0x82,0x7E,0x7E,0x83,0x81,0x7F,0x7C,0x80,0x85,0x83,0x83,0x7F,0x7B,0x83,0x82, + 0x82,0x86,0x7D,0x7C,0x7F,0x7E,0x85,0x84,0x80,0x7F,0x7E,0x82,0x83,0x80,0x81,0x80, + 0x82,0x85,0x82,0x7F,0x83,0x8A,0x86,0x81,0x82,0x82,0x85,0x89,0x85,0x85,0x83,0x7E, + 0x80,0x80,0x7F,0x7F,0x7B,0x78,0x7A,0x7B,0x7B,0x7D,0x7D,0x7D,0x80,0x83,0x84,0x7E, + 0x81,0x89,0x85,0x84,0x82,0x7F,0x83,0x86,0x86,0x82,0x80,0x7F,0x7E,0x81,0x7E,0x7B, + 0x7C,0x7B,0x7C,0x7A,0x79,0x7C,0x7B,0x7B,0x7C,0x7D,0x7D,0x7B,0x7D,0x81,0x7F,0x7F, + 0x7E,0x7E,0x82,0x85,0x85,0x7F,0x7D,0x7F,0x80,0x81,0x7F,0x7D,0x7D,0x7C,0x7D,0x7C, + 0x7D,0x7E,0x7E,0x81,0x80,0x82,0x82,0x7E,0x84,0x84,0x82,0x85,0x80,0x81,0x84,0x82, + 0x83,0x7F,0x7D,0x7F,0x7E,0x7F,0x7D,0x7A,0x7B,0x7B,0x7D,0x7C,0x7B,0x7D,0x7D,0x80, + 0x82,0x81,0x80,0x80,0x86,0x85,0x82,0x85,0x80,0x82,0x87,0x85,0x87,0x83,0x80,0x81, + 0x7E,0x7D,0x7C,0x79,0x7B,0x7A,0x7A,0x79,0x79,0x7B,0x7A,0x7C,0x7E,0x7E,0x7E,0x7E, + 0x83,0x82,0x80,0x81,0x7E,0x83,0x86,0x83,0x85,0x81,0x80,0x81,0x7F,0x80,0x7D,0x7B, + 0x7C,0x7B,0x7D,0x7D,0x7C,0x7D,0x7E,0x80,0x80,0x81,0x80,0x81,0x85,0x82,0x83,0x83, + 0x80,0x84,0x85,0x84,0x86,0x84,0x83,0x83,0x7F,0x81,0x7F,0x7D,0x80,0x7D,0x7C,0x7E, + 0x7E,0x80,0x81,0x81,0x81,0x81,0x81,0x84,0x86,0x84,0x84,0x82,0x80,0x84,0x83,0x82, + 0x85,0x81,0x81,0x80,0x7D,0x7F,0x7B,0x78,0x7B,0x78,0x7A,0x7D,0x7D,0x7E,0x7C,0x7D, + 0x7F,0x80,0x81,0x82,0x84,0x83,0x83,0x84,0x83,0x84,0x84,0x83,0x86,0x85,0x84,0x84, + 0x7F,0x7E,0x7E,0x7C,0x7D,0x7C,0x7B,0x7C,0x7B,0x7C,0x7C,0x7C,0x7C,0x7D,0x7F,0x80, + 0x82,0x82,0x80,0x82,0x80,0x81,0x83,0x82,0x86,0x85,0x83,0x84,0x80,0x7F,0x81,0x80, + 0x80,0x7F,0x7E,0x80,0x80,0x81,0x81,0x80,0x80,0x80,0x82,0x83,0x82,0x84,0x82,0x83, + 0x84,0x81,0x82,0x83,0x83,0x84,0x82,0x81,0x80,0x7D,0x7E,0x7D,0x7B,0x7C,0x7B,0x7B, + 0x7B,0x7B,0x7C,0x7B,0x7B,0x7E,0x7E,0x7E,0x80,0x81,0x81,0x80,0x82,0x82,0x82,0x83, + 0x84,0x84,0x84,0x83,0x83,0x82,0x82,0x80,0x7F,0x7E,0x7E,0x7D,0x7C,0x7B,0x7C,0x7D, + 0x7D,0x7E,0x7E,0x7E,0x7F,0x80,0x82,0x82,0x82,0x83,0x83,0x84,0x85,0x85,0x86,0x86, + 0x85,0x85,0x85,0x82,0x81,0x80,0x80,0x80,0x7F,0x7C,0x7C,0x7C,0x7D,0x7C,0x7C,0x7C, + 0x7D,0x7E,0x7D,0x7E,0x7E,0x7E,0x7F,0x81,0x82,0x82,0x82,0x81,0x82,0x84,0x84,0x83, + 0x81,0x81,0x80,0x80,0x7F,0x7C,0x7B,0x7C,0x7D,0x7D,0x7D,0x7B,0x7D,0x7E,0x7E,0x7F, + 0x7F,0x7E,0x7F,0x81,0x82,0x81,0x80,0x81,0x82,0x84,0x85,0x84,0x83,0x82,0x81,0x80, + 0x7F,0x7D,0x7D,0x7B,0x7B,0x7B,0x79,0x7B,0x7D,0x7D,0x7E,0x7F,0x80,0x80,0x80,0x82, + 0x82,0x83,0x84,0x83,0x84,0x86,0x86,0x87,0x85,0x85,0x86,0x83, +}; +#define sound2_len 0x0000DC8C +const unsigned char sound2_data[] = { + 0x80,0x84,0x8C,0x88,0x7F,0x85,0x8E,0x8B,0x87,0x8B,0x88,0x7C,0x7C,0x81,0x7D,0x75, + 0x77,0x80,0x81,0x86,0x95,0x86,0x78,0x75,0x6A,0x71,0x78,0x75,0x76,0x95,0x7C,0x7C, + 0xA1,0x7D,0x82,0x8D,0x77,0x66,0x6A,0x79,0x70,0x72,0x75,0x76,0x7C,0x8B,0x90,0x86, + 0x87,0x89,0x81,0x6B,0x6D,0x6E,0x62,0x80,0x94,0x81,0x8C,0x95,0x82,0x8D,0x94,0x7C, + 0x80,0x7F,0x73,0x86,0x8B,0x8D,0x9D,0x9E,0x9D,0xA2,0xA0,0x96,0x83,0x8A,0x96,0x91, + 0x97,0x88,0x86,0x96,0x92,0x8B,0x7B,0x7C,0x87,0x72,0x67,0x69,0x6B,0x7C,0x7E,0x72, + 0x72,0x6C,0x69,0x68,0x5B,0x5B,0x60,0x5E,0x67,0x63,0x62,0x63,0x63,0x77,0x7B,0x7A, + 0x70,0x5A,0x59,0x64,0x5F,0x5D,0x5F,0x70,0x7B,0x6E,0x73,0x7A,0x7C,0x83,0x99,0xB1, + 0xB1,0xA1,0x99,0x98,0x89,0x89,0x8B,0x91,0xA7,0xAE,0xAA,0xA3,0x95,0x87,0x85,0x85, + 0x86,0x88,0x94,0x9F,0x94,0x88,0x81,0x7E,0x80,0x81,0x8A,0x92,0x8D,0x8B,0x85,0x7F, + 0x84,0x7F,0x79,0x88,0x93,0x8E,0x8B,0x7F,0x7B,0x7D,0x7D,0x88,0x87,0x8D,0x9D,0x8F, + 0x87,0x84,0x7B,0x8C,0x93,0x97,0xA0,0x95,0x8B,0x8D,0x89,0x88,0x8C,0x88,0x9B,0xA6, + 0x96,0x8A,0x76,0x6E,0x77,0x74,0x73,0x72,0x74,0x7B,0x6C,0x5D,0x62,0x64,0x66,0x6C, + 0x67,0x6A,0x65,0x52,0x48,0x4A,0x58,0x58,0x5B,0x6D,0x77,0x70,0x61,0x54,0x52,0x60, + 0x5F,0x5C,0x64,0x6B,0x6C,0x60,0x58,0x5C,0x66,0x6F,0x75,0x7A,0x84,0x88,0x8E,0x93, + 0x98,0x9E,0x9B,0x99,0x9B,0xAD,0xAA,0x98,0x90,0x8C,0x99,0xA3,0x99,0x94,0x97,0x94, + 0x8B,0x82,0x85,0x90,0x97,0x93,0x8F,0x90,0x8F,0x87,0x86,0x8F,0x93,0x91,0x84,0x85, + 0x99,0x9B,0x89,0x7A,0x78,0x86,0x87,0x81,0x87,0x8F,0x90,0x81,0x78,0x80,0x8F,0x99, + 0x9A,0x98,0x99,0x9A,0x8C,0x91,0x94,0x91,0x97,0x94,0x97,0x9B,0xA3,0xA1,0x90,0x8B, + 0x84,0x86,0x8B,0x83,0x7E,0x7C,0x78,0x6C,0x65,0x68,0x6D,0x71,0x6D,0x66,0x64,0x62, + 0x59,0x57,0x5F,0x5B,0x57,0x52,0x4F,0x64,0x6E,0x63,0x5B,0x57,0x5D,0x5F,0x58,0x5F, + 0x66,0x67,0x61,0x57,0x54,0x5F,0x67,0x66,0x71,0x78,0x77,0x75,0x78,0x87,0x95,0x9A, + 0x99,0x9C,0x9A,0xA3,0xAD,0xA4,0x9A,0x96,0x94,0x97,0x97,0x95,0x98,0x8F,0x89,0x8E, + 0x88,0x8B,0x93,0x8F,0x93,0x95,0x8E,0x87,0x86,0x8C,0x92,0x8F,0x88,0x89,0x85,0x8F, + 0x97,0x8B,0x81,0x7B,0x82,0x88,0x84,0x87,0x90,0x91,0x88,0x7E,0x7C,0x85,0x8E,0x8D, + 0x94,0x9E,0x9D,0x94,0x8A,0x92,0x9B,0x96,0x90,0x90,0x93,0x98,0xA3,0x99,0x8B,0x8B, + 0x86,0x86,0x89,0x7D,0x81,0x81,0x73,0x6D,0x64,0x67,0x70,0x6B,0x6B,0x6D,0x63,0x59, + 0x55,0x52,0x5A,0x59,0x51,0x59,0x55,0x58,0x71,0x6A,0x58,0x5A,0x56,0x5D,0x5D,0x59, + 0x64,0x67,0x60,0x59,0x56,0x5E,0x68,0x66,0x72,0x7C,0x7D,0x78,0x76,0x86,0x94,0x99, + 0x99,0x9B,0x99,0x95,0xA5,0xAD,0x9D,0x94,0x94,0x8E,0x92,0x8C,0x8E,0x96,0x8F,0x84, + 0x83,0x82,0x89,0x92,0x8F,0x97,0x97,0x8B,0x86,0x86,0x8B,0x92,0x88,0x87,0x82,0x7C, + 0x95,0x9D,0x8A,0x85,0x84,0x81,0x81,0x7F,0x87,0x92,0x8F,0x86,0x86,0x8B,0x8B,0x8E, + 0x92,0x9E,0x9E,0x96,0x8F,0x8B,0x97,0x9B,0x96,0x96,0x95,0x89,0x9A,0xA9,0x96,0x8D, + 0x85,0x82,0x7D,0x78,0x7B,0x7F,0x7C,0x6F,0x68,0x65,0x67,0x62,0x5D,0x67,0x68,0x5F, + 0x55,0x4E,0x52,0x57,0x52,0x51,0x55,0x4E,0x57,0x6F,0x62,0x5A,0x59,0x56,0x5A,0x54, + 0x5A,0x67,0x6C,0x62,0x5E,0x63,0x66,0x6F,0x6C,0x7B,0x89,0x89,0x88,0x88,0x92,0x9C, + 0x99,0x9C,0xA2,0x96,0x9E,0xB4,0xAC,0x99,0x96,0x90,0x8E,0x89,0x85,0x93,0x93,0x88, + 0x7F,0x83,0x87,0x85,0x87,0x8E,0x95,0x94,0x8E,0x84,0x83,0x84,0x86,0x86,0x88,0x83, + 0x81,0x9A,0x9A,0x88,0x83,0x85,0x82,0x7E,0x82,0x8E,0x96,0x8F,0x87,0x8F,0x8E,0x85, + 0x8F,0x92,0x98,0x9E,0x97,0x90,0x8F,0x8E,0x8A,0x8E,0x95,0x8F,0x86,0x9A,0xA8,0x8F, + 0x85,0x85,0x7B,0x77,0x76,0x78,0x83,0x7F,0x6C,0x6B,0x6B,0x61,0x5D,0x5F,0x62,0x68, + 0x60,0x56,0x58,0x53,0x4D,0x4F,0x58,0x59,0x4F,0x60,0x75,0x64,0x56,0x5C,0x59,0x55, + 0x56,0x5F,0x6A,0x71,0x67,0x66,0x6D,0x68,0x69,0x74,0x7F,0x8A,0x93,0x90,0x98,0x9A, + 0x95,0x9D,0xA5,0xA6,0x9C,0xA6,0xBA,0xA9,0x91,0x97,0x93,0x86,0x81,0x89,0x92,0x95, + 0x8E,0x85,0x8D,0x88,0x80,0x83,0x8A,0x8E,0x8C,0x88,0x89,0x85,0x7A,0x7D,0x84,0x87, + 0x7B,0x84,0x9D,0x93,0x82,0x88,0x8C,0x7F,0x81,0x87,0x92,0x9B,0x93,0x90,0x9A,0x95, + 0x8A,0x8E,0x94,0x95,0x95,0x95,0x96,0x97,0x8C,0x8D,0x97,0x94,0x89,0x8B,0x9F,0x99, + 0x81,0x85,0x86,0x74,0x6C,0x73,0x78,0x7B,0x76,0x6F,0x73,0x6D,0x5D,0x5B,0x60,0x5D, + 0x5D,0x5C,0x5C,0x5F,0x57,0x51,0x5A,0x5C,0x53,0x5D,0x6B,0x60,0x5B,0x65,0x5B,0x51, + 0x58,0x5A,0x5C,0x67,0x65,0x68,0x76,0x70,0x71,0x7C,0x7F,0x85,0x90,0x97,0x9E,0xA4, + 0xA0,0xA3,0xA6,0xA3,0xA8,0xB0,0xA5,0x9F,0xA5,0x99,0x8B,0x90,0x8F,0x86,0x8C,0x8D, + 0x88,0x8E,0x8D,0x83,0x89,0x89,0x7F,0x81,0x84,0x82,0x81,0x80,0x80,0x83,0x7C,0x80, + 0x90,0x8D,0x84,0x8C,0x93,0x85,0x80,0x89,0x88,0x86,0x8C,0x8D,0x91,0x99,0x93,0x93, + 0x9D,0x98,0x90,0x96,0x98,0x94,0x92,0x90,0x94,0x94,0x8E,0x94,0x9E,0x95,0x8C,0x8F, + 0x8E,0x80,0x79,0x7E,0x77,0x70,0x72,0x6E,0x6E,0x71,0x69,0x64,0x69,0x65,0x60,0x5F, + 0x5D,0x5A,0x59,0x57,0x5A,0x5E,0x5B,0x5D,0x65,0x65,0x5D,0x5C,0x65,0x64,0x5C,0x60, + 0x66,0x63,0x66,0x68,0x69,0x6F,0x72,0x74,0x79,0x80,0x86,0x8B,0x92,0x9E,0x9F,0xA1, + 0xA6,0xA8,0xA6,0xA5,0xA6,0xA4,0xA2,0x9D,0x99,0x94,0x95,0x92,0x8F,0x8D,0x8A,0x88, + 0x86,0x86,0x86,0x84,0x82,0x83,0x82,0x80,0x7E,0x7E,0x7D,0x7E,0x7E,0x7D,0x81,0x82, + 0x82,0x84,0x82,0x84,0x85,0x85,0x86,0x88,0x89,0x8C,0x8E,0x91,0x94,0x93,0x93,0x93, + 0x93,0x93,0x94,0x96,0x95,0x95,0x95,0x92,0x92,0x92,0x91,0x91,0x92,0x92,0x8D,0x88, + 0x85,0x81,0x7F,0x7C,0x7B,0x77,0x74,0x73,0x71,0x6C,0x69,0x68,0x63,0x62,0x62,0x61, + 0x5F,0x5E,0x5C,0x5B,0x59,0x5B,0x5C,0x5E,0x5F,0x60,0x61,0x60,0x61,0x60,0x63,0x63, + 0x64,0x67,0x69,0x6D,0x6F,0x72,0x76,0x7B,0x7E,0x86,0x8E,0x93,0x9A,0x9F,0xA2,0xA5, + 0xA4,0xA3,0xA5,0xA1,0xA0,0x9E,0x9A,0x97,0x94,0x92,0x8E,0x8C,0x88,0x87,0x84,0x84, + 0x83,0x81,0x80,0x7C,0x7B,0x7B,0x7B,0x7A,0x7B,0x7B,0x7A,0x7B,0x7C,0x7C,0x7C,0x7E, + 0x7F,0x7F,0x7F,0x81,0x81,0x82,0x85,0x86,0x87,0x8A,0x8C,0x8D,0x8E,0x92,0x91,0x90, + 0x93,0x92,0x93,0x96,0x96,0x95,0x98,0x96,0x93,0x91,0x91,0x8F,0x8E,0x8D,0x8B,0x88, + 0x85,0x81,0x7E,0x7A,0x78,0x75,0x72,0x72,0x6E,0x6B,0x69,0x67,0x65,0x64,0x63,0x62, + 0x5F,0x5E,0x60,0x5D,0x5D,0x5D,0x5C,0x5D,0x5E,0x5C,0x5E,0x60,0x60,0x60,0x62,0x63, + 0x66,0x69,0x6B,0x6F,0x72,0x76,0x7A,0x7F,0x83,0x8B,0x91,0x96,0x9B,0x9E,0xA2,0xA2, + 0xA3,0xA3,0xA2,0xA0,0x9E,0x9B,0x97,0x94,0x90,0x8D,0x8B,0x87,0x84,0x82,0x81,0x7F, + 0x7D,0x7C,0x7D,0x7B,0x79,0x7A,0x79,0x78,0x78,0x78,0x78,0x79,0x7A,0x7D,0x7C,0x7E, + 0x80,0x81,0x83,0x83,0x84,0x86,0x89,0x8A,0x8C,0x8C,0x8F,0x8E,0x8D,0x8F,0x8F,0x8E, + 0x90,0x91,0x90,0x90,0x8F,0x8E,0x8E,0x8D,0x8B,0x8B,0x89,0x88,0x86,0x85,0x82,0x7F, + 0x7F,0x7D,0x7A,0x79,0x7B,0x77,0x77,0x74,0x72,0x73,0x6E,0x6D,0x6C,0x6B,0x6A,0x69, + 0x68,0x6A,0x6A,0x69,0x6B,0x6C,0x6C,0x6B,0x6D,0x6E,0x6E,0x6E,0x71,0x73,0x72,0x76, + 0x79,0x79,0x7D,0x7E,0x7F,0x84,0x84,0x86,0x8A,0x8B,0x8E,0x8E,0x8F,0x91,0x8F,0x8F, + 0x91,0x8F,0x8D,0x8C,0x8B,0x8A,0x89,0x86,0x85,0x85,0x82,0x80,0x80,0x81,0x7F,0x7E, + 0x7F,0x7D,0x7A,0x79,0x7B,0x79,0x79,0x7A,0x78,0x79,0x79,0x79,0x7A,0x7B,0x7B,0x7C, + 0x7C,0x80,0x7E,0x7E,0x82,0x81,0x82,0x83,0x85,0x86,0x87,0x86,0x88,0x88,0x88,0x88, + 0x87,0x88,0x88,0x8A,0x88,0x89,0x87,0x88,0x89,0x88,0x88,0x88,0x87,0x88,0x86,0x83, + 0x86,0x83,0x83,0x83,0x83,0x84,0x82,0x82,0x81,0x81,0x7F,0x80,0x7E,0x7F,0x7F,0x7D, + 0x7E,0x7D,0x7B,0x7B,0x7C,0x7A,0x7C,0x7B,0x7A,0x7B,0x7A,0x7C,0x7C,0x7D,0x7D,0x80, + 0x80,0x82,0x83,0x83,0x86,0x85,0x87,0x89,0x88,0x89,0x8B,0x89,0x8A,0x88,0x88,0x88, + 0x88,0x88,0x87,0x85,0x84,0x84,0x81,0x7F,0x7F,0x7F,0x7E,0x7D,0x7B,0x7B,0x79,0x78, + 0x7A,0x78,0x78,0x78,0x79,0x78,0x79,0x78,0x79,0x7A,0x7A,0x7B,0x7A,0x7B,0x7C,0x7B, + 0x7D,0x7E,0x7D,0x7F,0x80,0x80,0x81,0x80,0x81,0x80,0x81,0x82,0x82,0x82,0x82,0x84, + 0x82,0x83,0x82,0x83,0x84,0x83,0x84,0x83,0x82,0x83,0x84,0x81,0x83,0x83,0x82,0x81, + 0x82,0x82,0x81,0x81,0x80,0x81,0x80,0x81,0x7F,0x80,0x80,0x7E,0x7E,0x7E,0x7D,0x7D, + 0x7F,0x7E,0x7C,0x7C,0x7E,0x7D,0x7E,0x7C,0x7E,0x7F,0x7E,0x7E,0x7E,0x80,0x80,0x81, + 0x81,0x82,0x82,0x83,0x84,0x84,0x85,0x84,0x85,0x86,0x85,0x85,0x86,0x85,0x84,0x84, + 0x83,0x83,0x83,0x83,0x82,0x82,0x82,0x80,0x7F,0x81,0x80,0x7F,0x7F,0x7E,0x7E,0x7D, + 0x7D,0x7D,0x7E,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7E,0x7D,0x7C,0x7D,0x7E,0x7E,0x7F, + 0x7E,0x7E,0x80,0x7E,0x7E,0x80,0x80,0x80,0x81,0x81,0x81,0x81,0x82,0x82,0x82,0x83, + 0x83,0x84,0x83,0x83,0x83,0x83,0x83,0x81,0x83,0x83,0x82,0x82,0x82,0x81,0x81,0x7F, + 0x80,0x80,0x80,0x7F,0x7E,0x7F,0x7F,0x7F,0x7F,0x80,0x7E,0x7E,0x7F,0x7E,0x7E,0x7F, + 0x7F,0x7F,0x7F,0x7E,0x7F,0x80,0x80,0x80,0x80,0x80,0x80,0x7E,0x7F,0x80,0x80,0x80, + 0x7F,0x7F,0x7F,0x80,0x81,0x82,0x81,0x82,0x82,0x81,0x81,0x82,0x82,0x82,0x83,0x81, + 0x81,0x81,0x81,0x80,0x81,0x82,0x80,0x80,0x80,0x80,0x7F,0x7F,0x7E,0x7C,0x7D,0x7C, + 0x7C,0x7C,0x7C,0x7C,0x7D,0x7C,0x7C,0x7D,0x7C,0x7C,0x7C,0x7D,0x7D,0x7D,0x7E,0x7E, + 0x7E,0x7F,0x7E,0x7F,0x80,0x80,0x81,0x81,0x81,0x80,0x7F,0x80,0x80,0x80,0x80,0x80, + 0x80,0x80,0x7F,0x7F,0x80,0x81,0x80,0x81,0x81,0x80,0x81,0x81,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0x7F,0x81,0x81,0x7F,0x80,0x80,0x7F,0x7E,0x7E,0x7D, + 0x7D,0x7E,0x7D,0x7E,0x7F,0x7E,0x7E,0x80,0x80,0x7F,0x80,0x80,0x80,0x81,0x81,0x81, + 0x80,0x82,0x82,0x82,0x84,0x83,0x83,0x83,0x82,0x80,0x80,0x81,0x80,0x80,0x81,0x80, + 0x80,0x81,0x80,0x7F,0x80,0x7F,0x7F,0x80,0x7F,0x7F,0x80,0x80,0x80,0x81,0x80,0x7F, + 0x80,0x7F,0x7F,0x80,0x80,0x7F,0x7F,0x80,0x7F,0x7E,0x80,0x7F,0x7F,0x7F,0x7D,0x7C, + 0x7D,0x7D,0x7D,0x7E,0x7F,0x7E,0x7F,0x80,0x80,0x7F,0x81,0x82,0x80,0x81,0x81,0x82, + 0x81,0x83,0x82,0x84,0x97,0x82,0x86,0x84,0x64,0x7F,0x80,0x68,0x67,0x77,0x7E,0x86, + 0x8C,0x8B,0x8A,0x86,0x95,0xA0,0x9C,0x98,0x95,0x91,0x8D,0x89,0x87,0x82,0x75,0x6B, + 0x63,0x5D,0x5C,0x5B,0x58,0x5A,0x61,0x65,0x6A,0x6F,0x72,0x78,0x7A,0x7D,0x83,0x85, + 0x86,0x8B,0x8E,0x90,0x95,0xA0,0xA9,0xB1,0xB7,0xB5,0xB5,0xB2,0xA9,0xA2,0x9D,0x98, + 0x92,0x8C,0x89,0x84,0x7F,0x7D,0x7A,0x77,0x74,0x71,0x6E,0x6B,0x69,0x68,0x66,0x60, + 0x58,0x51,0x49,0x46,0x49,0x4B,0x4C,0x54,0x5B,0x61,0x6A,0x6F,0x73,0x76,0x7C,0x81, + 0x85,0x8A,0x8C,0x8F,0x91,0x94,0x96,0x98,0xA2,0xAB,0xB1,0xB6,0xB4,0xB4,0xB1,0xAF, + 0xAD,0xAB,0xA4,0x9C,0x9A,0x91,0x8B,0x8A,0x86,0x83,0x7F,0x7C,0x78,0x72,0x68,0x60, + 0x5A,0x58,0x52,0x4F,0x51,0x4C,0x4F,0x54,0x57,0x61,0x64,0x69,0x6E,0x76,0x7F,0x84, + 0x8A,0x8B,0x92,0x94,0x94,0x9A,0x99,0x9F,0x9F,0xA1,0x9E,0x93,0x9D,0xA3,0xAB,0xB0, + 0xAA,0xA2,0x97,0x94,0x8D,0x85,0x7E,0x77,0x7C,0x77,0x77,0x7B,0x71,0x70,0x73,0x73, + 0x70,0x70,0x6E,0x6C,0x69,0x66,0x65,0x61,0x61,0x60,0x5A,0x5A,0x58,0x5B,0x5C,0x5B, + 0x63,0x63,0x65,0x6A,0x6D,0x73,0x75,0x78,0x7B,0x7D,0x82,0x88,0x8D,0x92,0x96,0x9D, + 0xA5,0xAD,0xB4,0xB8,0xBB,0xBD,0xC0,0xC3,0xC1,0xBF,0xBB,0xB8,0xB4,0xAB,0xA5,0x9C, + 0x96,0x92,0x89,0x83,0x7D,0x78,0x74,0x6C,0x65,0x5F,0x60,0x5F,0x57,0x51,0x4F,0x52, + 0x4F,0x4B,0x4A,0x4B,0x4A,0x48,0x4B,0x52,0x53,0x57,0x5B,0x62,0x6B,0x6B,0x6D,0x73, + 0x76,0x78,0x7A,0x7E,0x86,0x8C,0x8A,0x8A,0x92,0x99,0x9E,0xA2,0xA2,0xAC,0xB8,0xB8, + 0xB7,0xB5,0xB4,0xBB,0xBD,0xB8,0xB8,0xB8,0xB9,0xBB,0xB8,0xB1,0xB0,0xB0,0xA9,0xA1, + 0x97,0x92,0x8B,0x7E,0x76,0x6E,0x67,0x5F,0x59,0x60,0x61,0x59,0x55,0x4D,0x4B,0x49, + 0x38,0x35,0x3C,0x3A,0x3C,0x3E,0x3F,0x46,0x49,0x45,0x49,0x4B,0x4C,0x52,0x58,0x5F, + 0x67,0x6D,0x72,0x82,0x8C,0x8E,0x94,0x98,0x9B,0x9D,0x98,0x9B,0xA6,0xAA,0xA9,0xAD, + 0xB2,0xB8,0xB6,0xB1,0xB2,0xB1,0xAE,0xAD,0xAE,0xB2,0xAE,0xA8,0x9F,0xA7,0xB2,0xA4, + 0x9F,0x9F,0x96,0x90,0x7F,0x7A,0x85,0x7B,0x6F,0x75,0x77,0x76,0x70,0x62,0x66,0x63, + 0x51,0x52,0x58,0x5A,0x5B,0x56,0x58,0x5D,0x6A,0x6B,0x66,0x6E,0x6E,0x67,0x63,0x61, + 0x67,0x6A,0x69,0x70,0x7A,0x79,0x78,0x7A,0x7A,0x79,0x76,0x76,0x7B,0x7D,0x7F,0x81, + 0x84,0x80,0x86,0x99,0x92,0x91,0x9C,0x97,0x92,0x8C,0x8B,0x95,0x92,0x8C,0x96,0x9A, + 0x98,0x9B,0x99,0x99,0x97,0x91,0x98,0x99,0x94,0x95,0x90,0x8D,0x8A,0x96,0x9E,0x93, + 0x96,0x9B,0x8F,0x85,0x80,0x81,0x82,0x77,0x79,0x82,0x7B,0x75,0x74,0x6D,0x69,0x64, + 0x61,0x65,0x60,0x60,0x5F,0x5A,0x55,0x5A,0x6E,0x67,0x63,0x73,0x6D,0x65,0x62,0x63, + 0x6A,0x65,0x65,0x77,0x7A,0x75,0x7C,0x7E,0x7D,0x7B,0x7C,0x86,0x86,0x84,0x8B,0x86, + 0x83,0x81,0x92,0x9B,0x8A,0x93,0x9C,0x8E,0x89,0x8A,0x8C,0x8A,0x86,0x92,0x9E,0x99, + 0x99,0xA0,0x9D,0x97,0x94,0x96,0x97,0x91,0x93,0x93,0x8B,0x83,0x89,0x9B,0x8E,0x8A, + 0x9B,0x91,0x85,0x83,0x82,0x84,0x7A,0x7A,0x89,0x88,0x82,0x87,0x86,0x7F,0x78,0x76, + 0x7B,0x74,0x72,0x77,0x6D,0x66,0x63,0x72,0x76,0x63,0x6E,0x74,0x63,0x5E,0x60,0x60, + 0x5E,0x59,0x61,0x69,0x62,0x66,0x6C,0x68,0x66,0x66,0x6C,0x6E,0x6D,0x77,0x7A,0x76, + 0x76,0x83,0x99,0x8E,0x8E,0xA2,0x98,0x8E,0x91,0x93,0x91,0x8B,0x8F,0x9C,0x96,0x92, + 0x9B,0x99,0x92,0x8F,0x91,0x92,0x89,0x8A,0x8E,0x86,0x82,0x81,0x91,0x97,0x85,0x92, + 0x9A,0x88,0x86,0x8A,0x8A,0x87,0x82,0x8D,0x94,0x89,0x8F,0x97,0x8F,0x8B,0x8C,0x8D, + 0x88,0x82,0x88,0x84,0x7B,0x78,0x7C,0x8D,0x83,0x7A,0x8C,0x7F,0x6E,0x6F,0x6C,0x69, + 0x63,0x62,0x6F,0x6A,0x63,0x6F,0x6C,0x65,0x66,0x68,0x69,0x63,0x66,0x6E,0x63,0x5E, + 0x5E,0x68,0x75,0x66,0x70,0x7E,0x69,0x65,0x6A,0x68,0x67,0x63,0x6E,0x78,0x70,0x77, + 0x81,0x7A,0x79,0x7B,0x7D,0x7C,0x78,0x82,0x83,0x7A,0x7B,0x7C,0x8D,0x92,0x85,0x9A, + 0x9B,0x89,0x8C,0x8C,0x8B,0x89,0x87,0x96,0x98,0x93,0x9F,0xA1,0x99,0x99,0x99,0x9A, + 0x95,0x95,0x9D,0x96,0x90,0x90,0x92,0xA5,0x9D,0x97,0xAC,0x9F,0x92,0x94,0x90,0x8F, + 0x85,0x88,0x96,0x8E,0x8C,0x97,0x92,0x8B,0x8A,0x89,0x87,0x80,0x83,0x86,0x7C,0x7A, + 0x76,0x80,0x90,0x7D,0x84,0x8F,0x7B,0x77,0x76,0x74,0x71,0x65,0x72,0x78,0x6B,0x72, + 0x76,0x6E,0x69,0x66,0x67,0x61,0x5B,0x63,0x61,0x5A,0x5A,0x57,0x6B,0x6F,0x5E,0x73, + 0x75,0x63,0x64,0x64,0x67,0x5F,0x5C,0x70,0x6E,0x68,0x76,0x77,0x72,0x6F,0x70,0x75, + 0x6D,0x6F,0x78,0x73,0x71,0x6E,0x75,0x8C,0x7D,0x7C,0x92,0x85,0x7C,0x7B,0x7E,0x82, + 0x75,0x7D,0x8F,0x86,0x88,0x93,0x93,0x91,0x8C,0x92,0x94,0x8B,0x91,0x97,0x91,0x90, + 0x8B,0x9E,0xAB,0x95,0xA4,0xB0,0x9E,0x97,0x95,0x9B,0x98,0x8C,0x9C,0xA4,0x98,0x9E, + 0xA5,0xA5,0x9D,0x96,0x9F,0x99,0x8F,0x96,0x95,0x91,0x8B,0x88,0xA5,0x9E,0x8D,0xA5, + 0xA0,0x90,0x8B,0x89,0x92,0x82,0x7B,0x90,0x8D,0x84,0x88,0x8C,0x8E,0x81,0x7C,0x83, + 0x78,0x71,0x74,0x71,0x6E,0x62,0x68,0x81,0x6D,0x6A,0x7B,0x71,0x68,0x5D,0x63,0x6A, + 0x54,0x56,0x67,0x62,0x5F,0x61,0x69,0x6B,0x5E,0x60,0x64,0x5C,0x58,0x59,0x5D,0x5C, + 0x4E,0x5F,0x73,0x60,0x65,0x71,0x6D,0x68,0x5A,0x66,0x6B,0x58,0x5F,0x68,0x69,0x6D, + 0x6A,0x75,0x7E,0x74,0x77,0x7B,0x7A,0x76,0x74,0x7C,0x80,0x76,0x7F,0x94,0x8B,0x8C, + 0x95,0x93,0x99,0x89,0x8C,0x97,0x8A,0x8C,0x8F,0x90,0x98,0x93,0x97,0xA0,0x9D,0x9E, + 0x9C,0x9C,0x9D,0x98,0x9C,0x9E,0x9D,0x9D,0xA4,0xA4,0x9F,0xA4,0xA3,0xA4,0xA3,0x9D, + 0xA1,0x9F,0x9B,0x9D,0x9A,0x9B,0x9C,0x99,0x9C,0x9B,0x9A,0x9B,0x97,0x96,0x95,0x93, + 0x92,0x90,0x8E,0x8F,0x93,0x8D,0x8A,0x8D,0x8A,0x8A,0x85,0x82,0x85,0x80,0x7D,0x7D, + 0x7A,0x7B,0x79,0x77,0x79,0x76,0x75,0x74,0x72,0x73,0x6F,0x6E,0x6D,0x6C,0x6C,0x6B, + 0x74,0x6D,0x6A,0x70,0x6D,0x70,0x6A,0x67,0x6E,0x67,0x64,0x67,0x65,0x6A,0x65,0x62, + 0x69,0x64,0x62,0x63,0x64,0x64,0x5E,0x5E,0x5E,0x5C,0x58,0x60,0x6C,0x5F,0x63,0x6C, + 0x69,0x6B,0x62,0x68,0x6D,0x61,0x65,0x6B,0x6D,0x70,0x6C,0x76,0x7B,0x75,0x7B,0x7F, + 0x7F,0x7C,0x7B,0x7E,0x7D,0x77,0x78,0x90,0x8B,0x82,0x96,0x94,0x94,0x8B,0x8A,0x97, + 0x86,0x83,0x8E,0x8D,0x8F,0x8C,0x94,0x9F,0x94,0x99,0xA0,0x9A,0x96,0x92,0x95,0x92, + 0x8A,0x85,0x9D,0xA3,0x90,0xA4,0xA8,0xA0,0x98,0x91,0x9F,0x8F,0x82,0x92,0x8F,0x8D, + 0x8E,0x93,0x9F,0x94,0x94,0x9E,0x93,0x8D,0x8B,0x8C,0x86,0x7F,0x79,0x89,0x96,0x80, + 0x90,0x9A,0x8E,0x8A,0x81,0x8C,0x81,0x6F,0x81,0x7E,0x78,0x7E,0x81,0x8D,0x84,0x83, + 0x90,0x83,0x7D,0x7E,0x7C,0x78,0x73,0x6E,0x75,0x8B,0x76,0x7E,0x90,0x80,0x7E,0x74, + 0x7A,0x74,0x60,0x70,0x6F,0x65,0x6E,0x70,0x79,0x75,0x72,0x82,0x74,0x6E,0x73,0x6D, + 0x6C,0x6B,0x67,0x69,0x83,0x78,0x76,0x8D,0x81,0x80,0x7A,0x7C,0x7D,0x66,0x74,0x79, + 0x6B,0x76,0x7A,0x80,0x80,0x7B,0x89,0x7F,0x76,0x7C,0x74,0x72,0x72,0x71,0x6A,0x83, + 0x84,0x74,0x90,0x88,0x81,0x7F,0x7B,0x82,0x6B,0x6F,0x7E,0x6F,0x75,0x7E,0x81,0x84, + 0x7F,0x8B,0x87,0x7A,0x81,0x7B,0x78,0x79,0x7A,0x70,0x84,0x91,0x7A,0x90,0x94,0x85, + 0x86,0x81,0x86,0x75,0x71,0x83,0x77,0x76,0x84,0x85,0x87,0x84,0x8D,0x8B,0x7B,0x84, + 0x7F,0x79,0x7C,0x7E,0x74,0x7E,0x97,0x7F,0x8B,0x9C,0x8A,0x89,0x85,0x89,0x7E,0x72, + 0x85,0x80,0x78,0x88,0x8A,0x8B,0x8A,0x8E,0x92,0x81,0x86,0x85,0x7B,0x7E,0x80,0x79, + 0x75,0x94,0x89,0x80,0x9C,0x8F,0x85,0x85,0x84,0x80,0x70,0x7D,0x82,0x73,0x81,0x8A, + 0x85,0x85,0x88,0x8D,0x7D,0x7E,0x85,0x78,0x7A,0x7E,0x7C,0x70,0x87,0x93,0x78,0x91, + 0x96,0x82,0x83,0x83,0x82,0x73,0x75,0x84,0x76,0x78,0x8B,0x86,0x83,0x88,0x8C,0x81, + 0x79,0x84,0x7B,0x76,0x7C,0x7F,0x74,0x76,0x96,0x81,0x7F,0x9C,0x88,0x80,0x84,0x82, + 0x7B,0x70,0x7F,0x80,0x73,0x84,0x8B,0x82,0x86,0x8C,0x88,0x7B,0x80,0x81,0x75,0x7B, + 0x7E,0x7C,0x71,0x84,0x94,0x76,0x8C,0x98,0x7D,0x82,0x84,0x7D,0x73,0x73,0x82,0x77, + 0x75,0x8A,0x86,0x7E,0x88,0x89,0x7E,0x7B,0x80,0x79,0x74,0x7B,0x7C,0x77,0x72,0x8D, + 0x88,0x74,0x92,0x8B,0x76,0x80,0x7F,0x76,0x6F,0x77,0x7F,0x73,0x7C,0x8B,0x7F,0x80, + 0x89,0x82,0x7B,0x7C,0x80,0x76,0x77,0x7F,0x7D,0x79,0x7A,0x95,0x84,0x7B,0x9A,0x84, + 0x77,0x85,0x7C,0x76,0x73,0x7C,0x80,0x77,0x84,0x8A,0x81,0x85,0x86,0x81,0x7A,0x7B, + 0x7E,0x75,0x7B,0x7E,0x7F,0x7D,0x7B,0x96,0x82,0x7C,0x98,0x7F,0x77,0x81,0x7A,0x78, + 0x73,0x7C,0x84,0x79,0x81,0x8B,0x7F,0x7F,0x84,0x7D,0x78,0x7B,0x7E,0x77,0x7A,0x80, + 0x7E,0x81,0x79,0x88,0x90,0x77,0x88,0x8D,0x76,0x7C,0x7D,0x7A,0x79,0x7A,0x85,0x7F, + 0x7F,0x8B,0x82,0x80,0x84,0x80,0x7F,0x7E,0x81,0x7F,0x7D,0x82,0x80,0x81,0x88,0x7F, + 0x7F,0x91,0x83,0x7F,0x8B,0x7F,0x7B,0x7D,0x7D,0x7A,0x7A,0x82,0x81,0x80,0x84,0x83, + 0x7F,0x7F,0x81,0x7D,0x7E,0x82,0x82,0x80,0x81,0x85,0x80,0x81,0x87,0x7C,0x85,0x8B, + 0x7C,0x89,0x86,0x7C,0x81,0x7C,0x7C,0x7B,0x7C,0x80,0x7D,0x7F,0x81,0x7F,0x81,0x7F, + 0x7F,0x80,0x80,0x80,0x80,0x7F,0x7F,0x80,0x7E,0x83,0x81,0x77,0x84,0x87,0x80,0x89, + 0x88,0x81,0x7D,0x7E,0x7A,0x76,0x7E,0x7F,0x7D,0x82,0x83,0x81,0x80,0x84,0x85,0x81, + 0x85,0x84,0x80,0x81,0x82,0x81,0x80,0x83,0x81,0x7E,0x82,0x82,0x82,0x83,0x83,0x80, + 0x7C,0x7B,0x77,0x79,0x7D,0x7E,0x83,0x82,0x80,0x81,0x80,0x82,0x85,0x86,0x85,0x84, + 0x88,0x86,0x83,0x83,0x82,0x7F,0x7C,0x81,0x80,0x7E,0x80,0x7D,0x78,0x75,0x83,0x85, + 0x7D,0x8B,0x8A,0x7E,0x7B,0x7C,0x78,0x74,0x7C,0x81,0x7B,0x7D,0x81,0x7D,0x7E,0x85, + 0x85,0x84,0x86,0x85,0x82,0x7F,0x83,0x7F,0x7B,0x85,0x84,0x81,0x88,0x8C,0x87,0x7E, + 0x7E,0x79,0x70,0x74,0x7A,0x7B,0x7E,0x81,0x82,0x7E,0x7E,0x81,0x82,0x82,0x84,0x84, + 0x7F,0x7E,0x80,0x82,0x82,0x86,0x89,0x83,0x81,0x81,0x7B,0x7B,0x7D,0x7D,0x7D,0x7C, + 0x82,0x82,0x7D,0x7F,0x87,0x8A,0x85,0x89,0x8C,0x83,0x7E,0x7A,0x78,0x77,0x79,0x7F, + 0x7F,0x7F,0x82,0x81,0x80,0x80,0x81,0x82,0x81,0x78,0x78,0x80,0x77,0x7D,0x87,0x86, + 0x85,0x82,0x80,0x79,0x74,0x75,0x78,0x7B,0x7D,0x81,0x82,0x7F,0x7F,0x80,0x81,0x83, + 0x85,0x82,0x81,0x7F,0x80,0x80,0x7F,0x89,0x86,0x83,0x87,0x7E,0x7A,0x78,0x77,0x78, + 0x7B,0x7D,0x7D,0x7C,0x7E,0x80,0x83,0x96,0x85,0x6F,0x84,0x95,0x82,0x66,0x87,0x7D, + 0x64,0x80,0x85,0x82,0x7F,0x92,0x8A,0x77,0x89,0x85,0x7F,0x7D,0x90,0x92,0x7D,0x7B, + 0x7B,0x7F,0x7B,0x75,0x76,0x79,0x6D,0x71,0x7E,0x7C,0x85,0x93,0x8F,0x8B,0x8D,0x83, + 0x87,0x85,0x87,0x8D,0x8A,0x85,0x84,0x8D,0x79,0x76,0x8F,0x77,0x61,0x73,0x73,0x74, + 0x69,0x67,0x82,0x71,0x6D,0x7C,0x75,0x78,0x76,0x7D,0x7C,0x6B,0x71,0x82,0x80,0x73, + 0x6C,0x7B,0x84,0x7D,0x80,0x75,0x7D,0x92,0x8B,0x93,0x8E,0x8C,0x96,0x8A,0x8E,0x8D, + 0x82,0x8E,0xA0,0xA1,0x96,0x9D,0xA0,0x97,0x97,0x96,0x90,0x83,0x88,0x93,0x8A,0x9B, + 0xAE,0x92,0x85,0x8A,0x7D,0x6A,0x65,0x72,0x77,0x74,0x77,0x71,0x70,0x73,0x78,0x79, + 0x6F,0x6D,0x6B,0x6F,0x6B,0x73,0x74,0x71,0x7C,0x7D,0x7E,0x6F,0x72,0x8C,0x7F,0x70, + 0x75,0x6F,0x64,0x65,0x71,0x6C,0x63,0x6D,0x7B,0x77,0x69,0x6E,0x71,0x6D,0x6B,0x70, + 0x79,0x79,0x83,0x91,0x9C,0xA7,0x9C,0x8E,0xA2,0xAE,0x98,0x96,0xA1,0x8C,0x81,0x7F, + 0x79,0x7F,0x7F,0x85,0x88,0x8A,0x8D,0x84,0x80,0x7D,0x75,0x74,0x7F,0x82,0x80,0x82, + 0x81,0x81,0x7D,0x76,0x84,0x9A,0x8C,0x86,0x90,0x7C,0x71,0x76,0x70,0x6F,0x73,0x7B, + 0x89,0x89,0x84,0x83,0x82,0x78,0x75,0x76,0x80,0x89,0x86,0x88,0x8B,0x8B,0x7E,0x8D, + 0xA1,0x97,0x95,0x9A,0x90,0x85,0x85,0x88,0x8E,0x86,0x8A,0x96,0x94,0x88,0x82,0x7D, + 0x73,0x6F,0x6E,0x79,0x7B,0x6F,0x74,0x6B,0x61,0x61,0x5B,0x71,0x72,0x65,0x74,0x76, + 0x6B,0x67,0x6A,0x6A,0x6E,0x6A,0x76,0x81,0x74,0x73,0x78,0x76,0x6E,0x70,0x77,0x7F, + 0x7C,0x76,0x70,0x68,0x67,0x6B,0x7C,0x7F,0x78,0x85,0x81,0x6C,0x72,0x74,0x7B,0x8B, + 0x8D,0xA3,0xB1,0xAA,0xAA,0xAA,0x9D,0x94,0x9A,0x98,0x99,0x9C,0x94,0x91,0x8D,0x85, + 0x8C,0x9A,0x92,0x8A,0x97,0x8D,0x7B,0x77,0x7A,0x88,0x85,0x85,0x8D,0x91,0x89,0x84, + 0x88,0x7F,0x80,0x82,0x83,0x86,0x83,0x7F,0x7A,0x7F,0x7C,0x89,0x96,0x80,0x81,0x8C, + 0x7C,0x72,0x71,0x78,0x84,0x80,0x8C,0x9B,0x9C,0x99,0x94,0x90,0x90,0x8A,0x8B,0x98, + 0x97,0x95,0x8F,0x8F,0x8D,0x87,0x9A,0x9D,0x8B,0x91,0x94,0x81,0x6F,0x6E,0x73,0x70, + 0x6A,0x70,0x79,0x71,0x6E,0x6A,0x63,0x64,0x5C,0x63,0x69,0x6C,0x6E,0x5F,0x63,0x5D, + 0x61,0x78,0x74,0x70,0x7A,0x74,0x65,0x5D,0x5F,0x6E,0x72,0x6D,0x79,0x7F,0x70,0x6A, + 0x62,0x61,0x65,0x64,0x6F,0x77,0x75,0x6F,0x6C,0x6D,0x77,0x8E,0x9F,0x99,0xA6,0xAC, + 0x9C,0x94,0x8E,0x96,0x98,0x98,0xA2,0xA8,0xA0,0x99,0x8E,0x8B,0x89,0x84,0x88,0x91, + 0x90,0x84,0x7E,0x7B,0x7B,0x7F,0x9A,0x9C,0x8A,0x92,0x8F,0x7F,0x76,0x76,0x81,0x86, + 0x80,0x8A,0x8F,0x8A,0x84,0x7E,0x7E,0x7C,0x7B,0x7F,0x8B,0x8B,0x7B,0x73,0x78,0x79, + 0x88,0x9A,0x95,0x97,0x9E,0x8C,0x80,0x7F,0x8C,0x98,0x8C,0x94,0xA1,0x9A,0x93,0x8B, + 0x8D,0x8E,0x89,0x86,0x90,0x92,0x8A,0x7F,0x74,0x72,0x71,0x83,0x86,0x78,0x7A,0x77, + 0x62,0x56,0x59,0x65,0x65,0x5D,0x6B,0x74,0x6C,0x65,0x62,0x65,0x68,0x63,0x64,0x73, + 0x76,0x6F,0x66,0x5E,0x62,0x76,0x8C,0x81,0x77,0x84,0x7A,0x66,0x5C,0x5F,0x70,0x70, + 0x6A,0x79,0x7F,0x76,0x72,0x6F,0x72,0x7D,0x7E,0x8C,0x9A,0x9C,0x9E,0x94,0x91,0x95, + 0xA7,0xB5,0xAD,0xA9,0xAD,0x9B,0x8C,0x85,0x86,0x92,0x8D,0x88,0x93,0x93,0x87,0x82, + 0x7E,0x80,0x85,0x7E,0x86,0x8F,0x89,0x82,0x75,0x72,0x76,0x8A,0x94,0x88,0x8D,0x91, + 0x83,0x72,0x6D,0x77,0x80,0x7C,0x7E,0x89,0x87,0x85,0x82,0x76,0x81,0x86,0x82,0x8B, + 0x90,0x93,0x8A,0x83,0x88,0x85,0x9B,0xA7,0x99,0x9D,0x9D,0x90,0x86,0x7F,0x82,0x8E, + 0x83,0x83,0x94,0x8D,0x88,0x7A,0x6D,0x79,0x74,0x69,0x71,0x79,0x75,0x6A,0x61,0x60, + 0x63,0x70,0x7D,0x72,0x71,0x79,0x6C,0x5D,0x5A,0x5C,0x67,0x63,0x60,0x6F,0x72,0x71, + 0x6F,0x6A,0x6F,0x70,0x64,0x65,0x70,0x72,0x6C,0x60,0x60,0x62,0x6D,0x7C,0x72,0x73, + 0x7C,0x77,0x70,0x69,0x6F,0x83,0x82,0x81,0x92,0x9F,0xAB,0xA8,0x9E,0xA6,0xA3,0x98, + 0x96,0x9E,0xA0,0x9B,0x95,0x8C,0x85,0x8A,0x9C,0x95,0x89,0x93,0x8E,0x81,0x7A,0x73, + 0x80,0x7F,0x73,0x7A,0x83,0x86,0x84,0x81,0x7E,0x82,0x7B,0x73,0x78,0x7B,0x7F,0x7F, + 0x7B,0x7C,0x76,0x88,0x96,0x86,0x88,0x8C,0x85,0x85,0x7D,0x79,0x88,0x85,0x84,0x8B, + 0x8D,0x96,0x93,0x8F,0x96,0x92,0x8B,0x89,0x89,0x8A,0x8C,0x8D,0x89,0x8C,0x84,0x85, + 0x8E,0x80,0x83,0x82,0x78,0x7F,0x78,0x71,0x75,0x6E,0x6F,0x73,0x6D,0x6E,0x73,0x6D, + 0x6C,0x6C,0x67,0x6A,0x6A,0x69,0x6E,0x6F,0x6C,0x6C,0x6A,0x69,0x6D,0x6E,0x6F,0x70, + 0x6E,0x70,0x71,0x6D,0x6D,0x6E,0x6F,0x6F,0x6E,0x6B,0x6C,0x6D,0x6C,0x6E,0x71,0x75, + 0x7B,0x7E,0x85,0x8B,0x8E,0x95,0x9A,0x9E,0x9E,0xA2,0xAA,0xA9,0xA2,0xA4,0xA4,0xA0, + 0xA1,0x9A,0x97,0x9A,0x94,0x8D,0x89,0x85,0x86,0x82,0x7F,0x7F,0x7C,0x7F,0x7F,0x7A, + 0x7B,0x7E,0x7C,0x7C,0x7A,0x7B,0x7E,0x7B,0x7F,0x81,0x7B,0x7A,0x81,0x85,0x87,0x84, + 0x83,0x8B,0x87,0x83,0x86,0x85,0x89,0x8A,0x81,0x88,0x8D,0x8D,0x94,0x92,0x94,0x97, + 0x93,0x94,0x93,0x91,0x91,0x8E,0x91,0x99,0x94,0x90,0x8D,0x8C,0x8D,0x84,0x7E,0x83, + 0x80,0x7B,0x79,0x78,0x7C,0x7A,0x70,0x77,0x7C,0x74,0x76,0x72,0x74,0x77,0x6D,0x6E, + 0x74,0x71,0x6F,0x68,0x76,0x80,0x70,0x72,0x75,0x77,0x76,0x67,0x6B,0x76,0x69,0x65, + 0x6A,0x69,0x71,0x6A,0x66,0x73,0x73,0x6D,0x6B,0x6C,0x74,0x72,0x71,0x7D,0x80,0x80, + 0x79,0x8B,0xA7,0x9D,0x98,0xAA,0xB2,0xAA,0x97,0x98,0xA9,0x9B,0x8D,0x94,0x9C,0x9C, + 0x93,0x8A,0x98,0x96,0x82,0x7F,0x84,0x82,0x7B,0x79,0x7F,0x7D,0x77,0x6E,0x77,0x93, + 0x84,0x75,0x85,0x88,0x80,0x6F,0x6C,0x80,0x7A,0x6A,0x77,0x84,0x87,0x81,0x7D,0x8C, + 0x8E,0x7D,0x7D,0x88,0x8A,0x84,0x80,0x8F,0x96,0x89,0x81,0x8A,0xA6,0x9F,0x8B,0x9D, + 0xA2,0x9A,0x8A,0x80,0x92,0x91,0x77,0x7E,0x90,0x8D,0x83,0x7E,0x8B,0x8F,0x7B,0x74, + 0x82,0x7D,0x74,0x72,0x78,0x7F,0x73,0x6A,0x6A,0x80,0x84,0x6D,0x76,0x80,0x77,0x6D, + 0x62,0x6F,0x74,0x5F,0x5E,0x6F,0x74,0x6B,0x67,0x70,0x7A,0x6A,0x5E,0x6D,0x6D,0x5F, + 0x5F,0x67,0x6C,0x66,0x61,0x5F,0x68,0x82,0x72,0x6E,0x89,0x87,0x7F,0x7F,0x82,0x90, + 0x8E,0x85,0x97,0xA5,0xA2,0x9F,0x9F,0xAC,0xAB,0x95,0x9B,0xA4,0x91,0x8B,0x8F,0x8E, + 0x8A,0x7F,0x80,0x76,0x7E,0x92,0x7B,0x79,0x88,0x7C,0x74,0x6C,0x6B,0x73,0x66,0x61, + 0x71,0x76,0x6E,0x71,0x77,0x80,0x7E,0x73,0x7F,0x82,0x77,0x77,0x80,0x81,0x7E,0x7F, + 0x83,0x80,0x87,0xA0,0x8F,0x8C,0x9E,0x96,0x91,0x8B,0x88,0x8F,0x85,0x7B,0x88,0x8A, + 0x84,0x86,0x88,0x8C,0x8C,0x82,0x85,0x89,0x81,0x7C,0x7C,0x7C,0x7C,0x79,0x7B,0x79, + 0x6F,0x88,0x87,0x71,0x83,0x83,0x7C,0x78,0x6D,0x77,0x77,0x65,0x69,0x76,0x72,0x6D, + 0x6F,0x76,0x79,0x75,0x72,0x7B,0x7B,0x6E,0x70,0x72,0x6E,0x6C,0x6D,0x72,0x6C,0x69, + 0x81,0x7A,0x72,0x81,0x7E,0x80,0x7A,0x76,0x81,0x7B,0x71,0x79,0x80,0x80,0x81,0x84, + 0x8E,0x90,0x8A,0x8F,0x95,0x8D,0x87,0x88,0x8A,0x83,0x7F,0x84,0x86,0x7F,0x79,0x88, + 0x86,0x78,0x83,0x80,0x7C,0x7D,0x71,0x7A,0x7A,0x6C,0x71,0x74,0x73,0x74,0x73,0x78, + 0x79,0x77,0x79,0x7D,0x7D,0x7B,0x7C,0x7D,0x7D,0x7E,0x7F,0x80,0x82,0x82,0x83,0x87, + 0x86,0x7E,0x86,0x87,0x83,0x86,0x84,0x89,0x88,0x85,0x89,0x89,0x87,0x86,0x85,0x88, + 0x85,0x83,0x87,0x85,0x87,0x86,0x85,0x8A,0x87,0x86,0x89,0x87,0x85,0x87,0x84,0x83, + 0x85,0x82,0x80,0x81,0x83,0x80,0x80,0x81,0x80,0x80,0x7E,0x7E,0x7E,0x7C,0x7C,0x7C, + 0x7E,0x7E,0x7C,0x7F,0x7F,0x7E,0x7E,0x7B,0x7F,0x7E,0x7C,0x81,0x81,0x7E,0x81,0x80, + 0x82,0x83,0x82,0x83,0x86,0x84,0x83,0x84,0x84,0x85,0x84,0x86,0x86,0x87,0x86,0x86, + 0x84,0x84,0x84,0x82,0x82,0x81,0x82,0x82,0x82,0x80,0x80,0x80,0x7C,0x7E,0x7B,0x7A, + 0x7B,0x7B,0x7C,0x7B,0x7A,0x79,0x7A,0x7B,0x7A,0x78,0x7B,0x79,0x79,0x7A,0x7A,0x7B, + 0x7B,0x7D,0x7D,0x7E,0x7D,0x80,0x7F,0x7E,0x7F,0x80,0x81,0x81,0x82,0x80,0x82,0x82, + 0x84,0x83,0x83,0x85,0x84,0x84,0x85,0x84,0x84,0x85,0x84,0x84,0x85,0x84,0x84,0x86, + 0x87,0x87,0x85,0x85,0x87,0x85,0x84,0x84,0x84,0x85,0x84,0x82,0x84,0x84,0x83,0x85, + 0x85,0x83,0x82,0x84,0x82,0x81,0x82,0x80,0x82,0x82,0x81,0x81,0x80,0x81,0x82,0x82, + 0x81,0x80,0x81,0x81,0x7F,0x81,0x80,0x81,0x81,0x82,0x83,0x82,0x82,0x84,0x85,0x82, + 0x83,0x85,0x86,0x85,0x85,0x87,0x86,0x86,0x87,0x88,0x86,0x86,0x87,0x87,0x86,0x87, + 0x85,0x86,0x86,0x83,0x83,0x83,0x83,0x81,0x80,0x80,0x7E,0x7E,0x7F,0x7F,0x7E,0x7F, + 0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7E,0x7E,0x7E,0x7D,0x7D,0x80,0x7F,0x80,0x81,0x80, + 0x80,0x80,0x80,0x80,0x7F,0x80,0x81,0x80,0x81,0x84,0x82,0x83,0x84,0x82,0x82,0x83, + 0x81,0x81,0x82,0x81,0x81,0x81,0x80,0x82,0x81,0x81,0x83,0x82,0x82,0x82,0x81,0x83, + 0x82,0x80,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x80,0x81,0x80,0x7F,0x80,0x80,0x81, + 0x7F,0x7F,0x80,0x7F,0x7E,0x80,0x80,0x7E,0x80,0x7F,0x7D,0x7E,0x7E,0x7C,0x7D,0x7E, + 0x7E,0x7F,0x7F,0x7F,0x80,0x7F,0x7F,0x80,0x7F,0x80,0x7F,0x7F,0x7F,0x7F,0x80,0x7F, + 0x81,0x81,0x80,0x81,0x81,0x80,0x80,0x7F,0x80,0x80,0x7F,0x80,0x7F,0x80,0x80,0x7F, + 0x7E,0x7F,0x7F,0x7C,0x7E,0x7E,0x7D,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7E,0x7D,0x7C, + 0x7B,0x7C,0x7C,0x7C,0x7C,0x7D,0x7D,0x7C,0x7C,0x7D,0x7C,0x7B,0x7C,0x7C,0x7E,0x7D, + 0x7E,0x7D,0x7D,0x7E,0x7D,0x80,0x7E,0x7F,0x80,0x80,0x7F,0x7F,0x7F,0x7D,0x7E,0x7F, + 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x7F,0x7F,0x7E,0x80,0x7F,0x7F,0x7F,0x7F,0x7F, + 0x7E,0x80,0x7E,0x7F,0x7F,0x7E,0x7D,0x7F,0x80,0x7E,0x80,0x80,0x81,0x7F,0x7F,0x7F, + 0x7E,0x7F,0x7D,0x7F,0x7F,0x7E,0x7F,0x7F,0x7E,0x7E,0x7E,0x7F,0x7E,0x7F,0x7F,0x7D, + 0x7F,0x7E,0x7D,0x7F,0x7F,0x7F,0x81,0x80,0x80,0x81,0x80,0x7F,0x80,0x7F,0x7F,0x7F, + 0x82,0x80,0x7E,0x81,0x80,0x81,0x81,0x80,0x81,0x81,0x81,0x81,0x7F,0x81,0x80,0x7F, + 0x81,0x7E,0x7F,0x7E,0x7D,0x80,0x7E,0x7E,0x7F,0x7E,0x7E,0x7F,0x7E,0x7F,0x7E,0x7D, + 0x7F,0x7E,0x7C,0x80,0x7D,0x7E,0x7F,0x7E,0x81,0x7E,0x81,0x7F,0x7E,0x82,0x80,0x7F, + 0x80,0x80,0x7F,0x81,0x81,0x82,0x7F,0x7F,0x80,0x80,0x80,0x80,0x81,0x83,0x81,0x7F, + 0x82,0x81,0x81,0x81,0x7D,0x81,0x80,0x81,0x82,0x80,0x83,0x82,0x80,0x82,0x80,0x81, + 0x80,0x7F,0x83,0x80,0x80,0x81,0x81,0x82,0x81,0x82,0x81,0x81,0x81,0x81,0x81,0x7D, + 0x80,0x81,0x80,0x81,0x7F,0x82,0x81,0x8C,0x84,0x81,0x85,0x67,0x78,0x80,0x6D,0x69, + 0x77,0x7E,0x85,0x8C,0x87,0x8C,0x86,0x91,0xA1,0x9D,0xA4,0xA3,0x93,0x8E,0x79,0x82, + 0x92,0x76,0x70,0x76,0x6F,0x58,0x5A,0x52,0x51,0x71,0x6A,0x65,0x55,0x5E,0x70,0x6B, + 0x73,0x77,0x81,0x83,0x94,0x95,0x93,0x9B,0xB0,0xAC,0x85,0xBE,0xAF,0x98,0xB6,0x9B, + 0xB0,0xB5,0xA0,0x94,0x8B,0x94,0x9A,0x7B,0x6E,0x79,0x66,0x75,0x6F,0x6B,0x7F,0x68, + 0x63,0x68,0x6F,0x7C,0x6C,0x50,0x4E,0x55,0x5A,0x60,0x64,0x5E,0x56,0x5A,0x6E,0x6F, + 0x78,0x88,0x89,0xA1,0xA9,0x9D,0x91,0x95,0x90,0x8D,0x9A,0xA3,0xB4,0xB1,0x9F,0xA8, + 0xA9,0xA4,0xAB,0x9E,0x9B,0x95,0x8B,0x80,0x77,0x7C,0x70,0x76,0x76,0x75,0x84,0x77, + 0x6E,0x65,0x55,0x5E,0x61,0x50,0x44,0x4F,0x4F,0x3B,0x3A,0x46,0x5D,0x5A,0x62,0x74, + 0x6F,0x7F,0x92,0x90,0x98,0x8A,0x81,0xA0,0x98,0x9A,0xA5,0x93,0xA1,0xB1,0xB6,0xC5, + 0xBA,0xB1,0xC4,0xBB,0xB4,0xC1,0xA7,0x9A,0xAB,0x9C,0x9A,0x99,0x85,0x7B,0x71,0x6B, + 0x70,0x75,0x69,0x63,0x57,0x55,0x5D,0x57,0x56,0x50,0x5A,0x5F,0x4A,0x4B,0x44,0x4E, + 0x5C,0x5B,0x67,0x69,0x71,0x85,0x83,0x8D,0x9A,0x8A,0x9A,0x9F,0x9E,0xB0,0xAE,0xB7, + 0xB5,0xB5,0xB6,0xAF,0xB4,0xA6,0x9E,0xAC,0xA4,0xA5,0xA3,0x99,0x9A,0x98,0x92,0x8F, + 0x83,0x76,0x68,0x63,0x59,0x5F,0x60,0x49,0x50,0x5B,0x5D,0x4F,0x2D,0x22,0x2C,0x39, + 0x43,0x44,0x3D,0x3F,0x47,0x47,0x44,0x4B,0x4F,0x5A,0x5F,0x5A,0x66,0x6F,0x82,0x82, + 0x85,0xAD,0xBE,0xBB,0xAC,0xA5,0xB7,0xBD,0xC1,0xCE,0xC7,0xC9,0xC6,0xAA,0x93,0x92, + 0xA1,0xA1,0xAD,0xB1,0xA0,0xA4,0xA4,0xA3,0xA4,0x9A,0x9E,0xA2,0xA0,0xA4,0x9C,0x91, + 0x82,0x75,0x7A,0x8B,0x86,0x70,0x62,0x60,0x5E,0x60,0x65,0x5F,0x56,0x52,0x63,0x58, + 0x4E,0x45,0x48,0x63,0x5C,0x67,0x6F,0x6B,0x6C,0x70,0x76,0x6C,0x65,0x78,0x88,0x8C, + 0x93,0x84,0x87,0x83,0x65,0x76,0x7D,0x7A,0x7D,0x83,0x97,0x91,0x85,0x8C,0x91,0x84, + 0x8A,0x90,0x8F,0x8B,0x84,0x8E,0xA3,0xA2,0x94,0xA4,0xA9,0x9A,0x8F,0x91,0x99,0x91, + 0x91,0x95,0x9C,0x98,0x8D,0x94,0x86,0x78,0x77,0x78,0x76,0x62,0x66,0x7B,0x78,0x71, + 0x78,0x79,0x73,0x6F,0x6C,0x75,0x6E,0x59,0x57,0x5B,0x5A,0x5B,0x66,0x5E,0x50,0x57, + 0x60,0x67,0x5B,0x51,0x6B,0x77,0x6E,0x71,0x79,0x7A,0x6C,0x74,0x82,0x86,0x91,0x8F, + 0x9C,0x9B,0x89,0x95,0x9E,0xA1,0xA6,0xA2,0xA0,0x94,0x8A,0x9D,0xA7,0xA7,0xAA,0xAD, + 0xAA,0xA7,0xA5,0xA4,0xAB,0x9D,0xA4,0xBF,0xB9,0xAD,0x9F,0xA2,0xAD,0xB2,0xAF,0x99, + 0x90,0x8D,0x9A,0xAA,0x92,0x8A,0x97,0x88,0x77,0x66,0x6A,0x6C,0x5A,0x52,0x51,0x54, + 0x49,0x3F,0x4C,0x5E,0x58,0x4B,0x51,0x48,0x44,0x4B,0x58,0x5F,0x52,0x59,0x58,0x4A, + 0x41,0x3E,0x4B,0x53,0x50,0x50,0x54,0x53,0x48,0x4E,0x62,0x68,0x6B,0x6E,0x78,0x8A, + 0x81,0x8F,0xA5,0x9E,0xA7,0xB2,0xAE,0xAB,0xA5,0xAE,0xB7,0xAE,0xA6,0xA0,0xA6,0x99, + 0x88,0x95,0x92,0x94,0xA3,0x91,0x8A,0x92,0x86,0x9D,0xBE,0xA2,0x90,0x98,0x8B,0x93, + 0xA3,0x95,0x97,0x96,0x8C,0x9D,0x99,0x8A,0x85,0x7A,0x88,0x8A,0x78,0x79,0x7D,0x77, + 0x7D,0x95,0x97,0x8E,0x8C,0x81,0x85,0x83,0x7E,0x8B,0x96,0x89,0x78,0x75,0x6D,0x68, + 0x83,0x9A,0x92,0x7F,0x69,0x70,0x78,0x6F,0x5F,0x59,0x62,0x5A,0x5B,0x5D,0x55,0x55, + 0x4E,0x51,0x63,0x5E,0x4C,0x4D,0x50,0x59,0x5C,0x61,0x6B,0x6E,0x68,0x69,0x71,0x6F, + 0x84,0x8E,0x7F,0x78,0x71,0x6C,0x6E,0x74,0x83,0x8F,0x7F,0x80,0x89,0x83,0x89,0x8F, + 0xA2,0xB9,0xB7,0xAE,0xAD,0xA9,0xAE,0xAB,0xB0,0xC5,0xB6,0x98,0x94,0xA1,0xAD,0xA5, + 0x9A,0xA1,0x9D,0x88,0x83,0x83,0x79,0x7D,0x83,0x88,0x87,0x77,0x6E,0x76,0x75,0x80, + 0x8B,0x81,0x83,0x88,0x80,0x76,0x6A,0x75,0x81,0x79,0x6A,0x5E,0x61,0x69,0x72,0x7C, + 0x80,0x7C,0x6F,0x72,0x76,0x80,0x80,0x6C,0x80,0x91,0x83,0x81,0x7F,0x80,0x85,0x85, + 0x92,0x99,0x80,0x6B,0x70,0x76,0x73,0x73,0x73,0x6C,0x69,0x65,0x68,0x61,0x65,0x80, + 0x7A,0x62,0x5B,0x59,0x59,0x6A,0x77,0x7B,0x81,0x76,0x6B,0x76,0x7F,0x7D,0x7E,0x81, + 0x8A,0x82,0x6A,0x67,0x6C,0x6B,0x74,0x89,0x8F,0x84,0x75,0x7D,0x8D,0x8F,0x94,0x9A, + 0xA6,0xA6,0x9E,0x9F,0xA1,0xAF,0xBB,0xBC,0xBE,0xB9,0xB1,0xB0,0xA4,0xA2,0xAE,0xA1, + 0x8F,0x8B,0x85,0x81,0x7F,0x83,0x91,0x94,0x87,0x7D,0x79,0x78,0x74,0x74,0x7D,0x81, + 0x6F,0x5B,0x63,0x6A,0x62,0x67,0x7A,0x82,0x74,0x69,0x60,0x65,0x6A,0x6E,0x7C,0x76, + 0x6C,0x66,0x67,0x76,0x7F,0x7F,0x86,0x87,0x87,0x89,0x80,0x76,0x81,0x90,0x86,0x7C, + 0x76,0x67,0x64,0x6C,0x79,0x7F,0x7C,0x6C,0x63,0x6D,0x6F,0x68,0x63,0x6D,0x6D,0x63, + 0x61,0x67,0x6A,0x6C,0x86,0x88,0x70,0x68,0x61,0x69,0x72,0x72,0x81,0x7D,0x70,0x73, + 0x77,0x7F,0x82,0x81,0x88,0x8B,0x82,0x77,0x78,0x74,0x7C,0x9E,0x9D,0x8C,0x8C,0x90, + 0x99,0x9C,0xA0,0xAB,0xB7,0xAF,0xAB,0xAA,0xA5,0xAD,0xAF,0xB3,0xB7,0xAE,0x9C,0x9A, + 0x9A,0x99,0xB1,0xAF,0xA1,0x9A,0x87,0x88,0x91,0x8C,0x94,0x9C,0x8F,0x7E,0x78,0x7B, + 0x7F,0x83,0x89,0x86,0x7E,0x77,0x79,0x6F,0x67,0x81,0x84,0x76,0x73,0x6D,0x6A,0x69, + 0x75,0x7E,0x80,0x86,0x76,0x6E,0x71,0x76,0x78,0x75,0x7D,0x74,0x62,0x69,0x68,0x69, + 0x7B,0x86,0x78,0x6E,0x69,0x5E,0x67,0x6F,0x75,0x79,0x6A,0x58,0x63,0x5E,0x44,0x56, + 0x69,0x6D,0x56,0x59,0x6C,0x45,0x43,0x64,0x72,0x68,0x63,0x62,0x4A,0x53,0x67,0x72, + 0x71,0x6F,0x73,0x66,0x5F,0x63,0x6D,0x79,0x7D,0x7D,0x7B,0x71,0x6B,0x74,0x84,0x97, + 0x94,0x92,0x93,0x90,0xA1,0xAC,0xB5,0xC1,0xC3,0xBC,0xAE,0xB5,0xBC,0xB4,0xBA,0xBE, + 0xBB,0xB1,0xA4,0xA1,0x9E,0xA5,0xB4,0xB3,0x9E,0x8A,0x8A,0x88,0x88,0x90,0x95,0x94, + 0x87,0x7F,0x7F,0x8A,0x98,0x8D,0x94,0xA2,0x96,0x89,0x8D,0x91,0x95,0xA4,0xA3,0x99, + 0x8F,0x8A,0x92,0x90,0x93,0xA0,0xA2,0x9A,0x91,0x87,0x84,0x89,0x8D,0x8E,0x8B,0x86, + 0x75,0x71,0x77,0x75,0x86,0x93,0x85,0x6D,0x67,0x66,0x64,0x63,0x65,0x72,0x6E,0x56, + 0x45,0x43,0x57,0x5D,0x59,0x5E,0x53,0x45,0x41,0x44,0x42,0x4B,0x63,0x62,0x4F,0x46, + 0x3E,0x41,0x4C,0x52,0x5D,0x5A,0x45,0x3B,0x44,0x56,0x5E,0x61,0x68,0x67,0x63,0x69, + 0x72,0x72,0x71,0x87,0x9C,0x97,0x88,0x81,0x8C,0x98,0x9D,0xA3,0xA8,0x9D,0x8D,0x91, + 0x95,0x99,0x99,0x95,0x9A,0x99,0x84,0x80,0x88,0x84,0x91,0xA3,0x9A,0x85,0x7C,0x7C, + 0x86,0x8B,0x8F,0x9D,0x9D,0x8B,0x87,0x8B,0x97,0x9E,0x9E,0xAA,0xA9,0x9B,0x8F,0x8E, + 0x92,0x9B,0xB4,0xBB,0xA6,0x9C,0x9A,0x9F,0xA9,0xA7,0xAD,0xB3,0xA2,0x92,0x8D,0x95, + 0x99,0x96,0x9C,0x99,0x90,0x85,0x83,0x89,0x87,0x98,0x9E,0x8A,0x81,0x78,0x75,0x7C, + 0x7A,0x7C,0x83,0x79,0x66,0x5E,0x64,0x6C,0x6C,0x6A,0x6A,0x61,0x55,0x54,0x56,0x51, + 0x5A,0x6F,0x6E,0x5F,0x58,0x57,0x5D,0x64,0x6A,0x72,0x71,0x68,0x5E,0x64,0x76,0x7D, + 0x81,0x89,0x8E,0x8B,0x85,0x8A,0x8A,0x94,0xAA,0xA8,0x9A,0x8A,0x7E,0x83,0x89,0x8D, + 0x95,0x8D,0x7B,0x71,0x70,0x77,0x7B,0x78,0x7A,0x78,0x6B,0x5E,0x62,0x61,0x68,0x7E, + 0x80,0x72,0x64,0x5A,0x62,0x70,0x79,0x82,0x85,0x7D,0x73,0x75,0x7D,0x84,0x85,0x8D, + 0x96,0x8C,0x7F,0x7D,0x80,0x8C,0xA2,0xA3,0x91,0x86,0x81,0x83,0x87,0x8A,0x93,0x96, + 0x8D,0x82,0x7E,0x81,0x82,0x81,0x8A,0x8E,0x7F,0x72,0x71,0x6B,0x74,0x8D,0x8A,0x7C, + 0x72,0x6B,0x6C,0x6D,0x70,0x7A,0x80,0x73,0x66,0x62,0x67,0x6F,0x71,0x75,0x73,0x66, + 0x5F,0x5C,0x5D,0x6F,0x81,0x7C,0x73,0x70,0x69,0x68,0x6E,0x7B,0x89,0x8D,0x84,0x7C, + 0x7C,0x85,0x93,0x9E,0xA9,0xA6,0x95,0x92,0x90,0x92,0xA7,0xB1,0xA8,0x9C,0x93,0x88, + 0x87,0x8C,0x96,0xA2,0x97,0x84,0x7C,0x77,0x7D,0x85,0x89,0x8F,0x80,0x71,0x6E,0x69, + 0x76,0x8D,0x8B,0x7E,0x7A,0x73,0x6E,0x6D,0x7A,0x8B,0x8C,0x84,0x79,0x77,0x78,0x7E, + 0x8C,0x95,0x95,0x88,0x7F,0x7E,0x81,0x96,0xA1,0x95,0x8E,0x8A,0x80,0x7D,0x83,0x92, + 0x9B,0x8F,0x85,0x7F,0x7B,0x80,0x84,0x89,0x8F,0x86,0x78,0x72,0x6D,0x7A,0x90,0x8C, + 0x81,0x7E,0x74,0x6B,0x6B,0x75,0x84,0x89,0x7D,0x70,0x6B,0x6C,0x72,0x77,0x7F,0x7F, + 0x73,0x6B,0x64,0x67,0x7F,0x8D,0x81,0x7C,0x7D,0x72,0x70,0x77,0x89,0x97,0x8C,0x83, + 0x83,0x7F,0x81,0x88,0x92,0x99,0x91,0x85,0x7D,0x75,0x84,0x9B,0x99,0x8D,0x89,0x7E, + 0x73,0x72,0x7C,0x8F,0x8F,0x81,0x7A,0x74,0x72,0x74,0x7B,0x87,0x87,0x7A,0x6E,0x66, + 0x69,0x82,0x90,0x83,0x7D,0x7B,0x70,0x6C,0x6E,0x7E,0x8C,0x84,0x7A,0x78,0x74,0x76, + 0x7D,0x84,0x8E,0x8A,0x7F,0x77,0x6F,0x7F,0x98,0x94,0x8B,0x88,0x7C,0x75,0x76,0x7D, + 0x8E,0x91,0x85,0x7C,0x79,0x77,0x79,0x7E,0x87,0x8A,0x7E,0x71,0x6A,0x6F,0x86,0x90, + 0x85,0x81,0x7B,0x74,0x73,0x71,0x80,0x8E,0x88,0x7D,0x78,0x75,0x76,0x7A,0x81,0x89, + 0x85,0x7A,0x71,0x6C,0x7C,0x93,0x90,0x86,0x84,0x7F,0x78,0x76,0x82,0x94,0x97,0x8A, + 0x83,0x82,0x80,0x84,0x8B,0x91,0x92,0x88,0x7E,0x74,0x7A,0x91,0x97,0x89,0x84,0x83, + 0x7C,0x77,0x78,0x88,0x92,0x89,0x80,0x7E,0x79,0x79,0x7D,0x84,0x8C,0x85,0x79,0x6F, + 0x6C,0x80,0x92,0x8A,0x80,0x7E,0x76,0x72,0x71,0x79,0x8B,0x8B,0x80,0x7A,0x77,0x79, + 0x7B,0x7E,0x89,0x8D,0x82,0x77,0x70,0x7B,0x92,0x93,0x88,0x86,0x83,0x7D,0x77,0x78, + 0x87,0x90,0x8B,0x81,0x7B,0x78,0x79,0x7E,0x86,0x8C,0x86,0x79,0x6E,0x6E,0x81,0x90, + 0x89,0x7F,0x7E,0x7A,0x76,0x71,0x7A,0x89,0x8A,0x81,0x78,0x77,0x78,0x7A,0x7D,0x84, + 0x87,0x7E,0x73,0x6D,0x7C,0x92,0x90,0x83,0x80,0x7F,0x7D,0x77,0x78,0x88,0x91,0x8D, + 0x80,0x7A,0x7D,0x81,0x81,0x87,0x8D,0x86,0x7B,0x6F,0x74,0x8B,0x93,0x87,0x80,0x7E, + 0x7C,0x78,0x73,0x7F,0x8B,0x89,0x7F,0x74,0x74,0x7B,0x7E,0x81,0x86,0x84,0x7D,0x72, + 0x6E,0x81,0x91,0x8F,0x84,0x7C,0x7C,0x7C,0x75,0x78,0x86,0x8B,0x84,0x77,0x72,0x76, + 0x7B,0x7E,0x81,0x82,0x7D,0x75,0x6E,0x7A,0x8F,0x91,0x88,0x7E,0x7C,0x81,0x7D,0x7B, + 0x88,0x8F,0x8D,0x84,0x7B,0x7B,0x81,0x86,0x8D,0x8F,0x88,0x7F,0x71,0x71,0x81,0x88, + 0x84,0x7D,0x7A,0x7C,0x78,0x72,0x78,0x80,0x85,0x81,0x77,0x76,0x7D,0x83,0x88,0x88, + 0x84,0x7F,0x75,0x72,0x83,0x8E,0x88,0x7A,0x73,0x76,0x78,0x77,0x7D,0x85,0x89,0x89, + 0x81,0x7B,0x7F,0x85,0x88,0x8B,0x87,0x84,0x7A,0x71,0x80,0x90,0x91,0x87,0x79,0x72, + 0x72,0x71,0x78,0x83,0x8B,0x89,0x7B,0x72,0x72,0x78,0x7E,0x81,0x7F,0x80,0x7E,0x75, + 0x7D,0x89,0x8F,0x90,0x8A,0x8A,0x8B,0x83,0x81,0x8A,0x92,0x95,0x8C,0x7F,0x7A,0x78, + 0x79,0x79,0x76,0x77,0x72,0x6B,0x73,0x82,0x8C,0x87,0x79,0x74,0x75,0x75,0x79,0x7C, + 0x84,0x89,0x7E,0x77,0x74,0x77,0x84,0x86,0x89,0x8C,0x82,0x74,0x75,0x84,0x92,0x94, + 0x87,0x7F,0x78,0x6D,0x74,0x82,0x8B,0x98,0x9A,0x8C,0x81,0x7C,0x7D,0x84,0x83,0x7F, + 0x7D,0x6F,0x6A,0x7C,0x88,0x94,0x90,0x71,0x70,0x75,0x69,0x61,0x65,0x7E,0x80,0x7F, + 0x79,0x86,0x95,0x95,0xAF,0xB6,0xB5,0xAD,0x99,0x99,0x9E,0x8F,0x8E,0x7B,0x5D,0x5A, + 0x58,0x56,0x50,0x5F,0x69,0x79,0x78,0x74,0x84,0x89,0x9B,0xAA,0x9B,0x78,0x7E,0x87, + 0x7C,0x7D,0x74,0x74,0x7F,0x89,0x8A,0x84,0x7B,0x88,0x96,0x94,0x83,0x62,0x57,0x6A, + 0x75,0x8E,0x8F,0x77,0x64,0x62,0x86,0x8A,0x77,0x73,0x77,0x7C,0x79,0x77,0x80,0x8E, + 0x9B,0x94,0x90,0x92,0x7B,0x78,0x6E,0x60,0x71,0x7A,0x6F,0x7C,0x93,0x80,0x79,0x6F, + 0x7C,0x91,0x96,0xB2,0xA5,0x94,0x8C,0x84,0x84,0x82,0x86,0x81,0x91,0x98,0xA5,0xAF, + 0x87,0x7A,0x87,0x90,0x90,0x83,0x81,0x72,0x62,0x59,0x47,0x4F,0x54,0x51,0x5F,0x74, + 0x72,0x5F,0x68,0x81,0x7B,0x6B,0x74,0x7D,0x7B,0x94,0xA7,0x9C,0x8A,0x8F,0xA3,0x9F, + 0x94,0x8E,0x87,0x7C,0x8B,0x96,0xA0,0xA3,0x8E,0x89,0x81,0x75,0x68,0x56,0x64,0x5E, + 0x55,0x70,0x7A,0x6C,0x5E,0x60,0x75,0x87,0x88,0x96,0x93,0x85,0x8E,0x88,0x8B,0x8F, + 0x77,0x7C,0x94,0x9C,0xA6,0x98,0x93,0x98,0x90,0x8E,0x7E,0x73,0x64,0x5D,0x67,0x6F, + 0x76,0x6B,0x77,0x8A,0x89,0x86,0x67,0x68,0x76,0x7D,0x89,0x73,0x6D,0x7C,0x7F,0x94, + 0xA8,0x9B,0x86,0x72,0x83,0x91,0x80,0x7D,0x75,0x73,0x81,0x94,0x80,0x65,0x74,0x78, + 0x80,0x8A,0x7C,0x72,0x75,0x74,0x6C,0x6E,0x67,0x63,0x64,0x6E,0x87,0x84,0x7F,0x94, + 0xA1,0x9A,0xA1,0xA1,0xA1,0x97,0x87,0x98,0xA1,0x96,0x82,0x7C,0x8A,0x99,0x9B,0x96, + 0xA1,0x8C,0x6E,0x73,0x7F,0x71,0x58,0x5B,0x65,0x6E,0x6A,0x5C,0x5F,0x6B,0x6B,0x73, + 0x7B,0x73,0x6E,0x7A,0x96,0x9E,0x9F,0x99,0x90,0x7D,0x71,0x8F,0x9F,0x7F,0x76,0x83, + 0x89,0x8A,0x70,0x76,0x80,0x7A,0x82,0x77,0x76,0x6E,0x65,0x6D,0x7C,0x8C,0x84,0x8C, + 0x85,0x70,0x89,0x97,0x86,0x7E,0x8E,0x90,0x8C,0x94,0x8B,0x80,0x8F,0x98,0x9F,0xA7, + 0x90,0x75,0x6C,0x73,0x68,0x68,0x89,0x8D,0x85,0x76,0x73,0x75,0x6C,0x77,0x7E,0x88, + 0x86,0x7C,0x85,0x7F,0x7A,0x80,0x78,0x6B,0x5B,0x5E,0x66,0x6B,0x80,0x88,0xA3,0xB3, + 0x99,0xA3,0xAF,0x93,0x8B,0x9E,0xA1,0x94,0x84,0x7A,0x7E,0x8D,0x8A,0x89,0x8F,0x83, + 0x7A,0x83,0x7F,0x6D,0x73,0x71,0x64,0x5A,0x5E,0x68,0x66,0x65,0x73,0x82,0x89,0x87, + 0x88,0x90,0x88,0x8D,0x96,0x94,0x9D,0x8F,0x7A,0x78,0x89,0x85,0x6E,0x71,0x6F,0x72, + 0x7C,0x74,0x6A,0x7A,0x86,0x7A,0x7B,0x77,0x78,0x79,0x75,0x8C,0x99,0x90,0x80,0x78, + 0x89,0x8D,0x84,0x90,0x94,0x83,0x7D,0x81,0x84,0x93,0x91,0x90,0x9B,0x89,0x7F,0x7E, + 0x6F,0x65,0x74,0x86,0x8B,0x82,0x78,0x73,0x72,0x79,0x7A,0x85,0x80,0x7C,0x81,0x88, + 0x86,0x70,0x75,0x7C,0x74,0x66,0x5D,0x5B,0x62,0x70,0x87,0x95,0x91,0x9C,0xAC,0xAF, + 0xAC,0xA1,0x99,0x8E,0x79,0x77,0x84,0x89,0x77,0x72,0x87,0x92,0x90,0x8B,0x92,0x7F, + 0x68,0x71,0x76,0x70,0x6D,0x68,0x5D,0x6C,0x80,0x76,0x7A,0x7B,0x78,0x91,0x97,0x8C, + 0x8F,0x94,0x8D,0x85,0x8F,0x85,0x79,0x72,0x73,0x8A,0x8F,0x7B,0x64,0x77,0x7A,0x64, + 0x67,0x6F,0x75,0x6F,0x74,0x77,0x7B,0x84,0x79,0x79,0x83,0x7E,0x87,0x97,0x8C,0x89, + 0x9B,0x98,0x92,0x7B,0x71,0x89,0x7F,0x79,0x8B,0x9A,0x93,0x7D,0x77,0x79,0x67,0x5B, + 0x6C,0x75,0x84,0x89,0x7D,0x76,0x76,0x84,0x8D,0x7F,0x7E,0x84,0x82,0x8D,0x89,0x81, + 0x89,0x79,0x61,0x5E,0x6D,0x69,0x58,0x5D,0x6C,0x85,0x8F,0x87,0x9A,0xA0,0x89,0x96, + 0x9B,0x95,0xA5,0x8F,0x7D,0x86,0x8F,0x7E,0x74,0x88,0x87,0x95,0x9C,0x87,0x85,0x8D, + 0x73,0x75,0x79,0x6A,0x76,0x68,0x67,0x75,0x7D,0x72,0x67,0x7E,0x81,0x77,0x78,0x80, + 0x85,0x85,0x7D,0x81,0x8E,0x77,0x68,0x65,0x6D,0x75,0x7B,0x88,0x77,0x6E,0x78,0x89, + 0x7D,0x67,0x72,0x73,0x7D,0x81,0x80,0x97,0x96,0x7B,0x82,0x9E,0x8A,0x82,0x88,0x85, + 0x89,0x81,0x7E,0x73,0x79,0x7E,0x7C,0x86,0x79,0x7B,0x87,0x84,0x84,0x87,0x88,0x78, + 0x6F,0x6E,0x7D,0x88,0x7B,0x7B,0x8F,0x92,0x88,0x93,0x98,0x8B,0x80,0x83,0x83,0x7D, + 0x79,0x60,0x5A,0x67,0x60,0x52,0x60,0x6B,0x6D,0x8A,0x9E,0xA4,0xAB,0xAF,0xA2,0x94, + 0x96,0x8C,0x81,0x7B,0x77,0x8A,0x97,0x80,0x87,0x94,0x83,0x7D,0x76,0x7E,0x88,0x77, + 0x66,0x78,0x7E,0x6E,0x61,0x68,0x74,0x6F,0x8B,0x92,0x7F,0x7A,0x82,0x8F,0x85,0x7A, + 0x76,0x73,0x75,0x70,0x7D,0x8D,0x7E,0x70,0x7F,0x8B,0x7D,0x6F,0x73,0x81,0x7E,0x79, + 0x8E,0x8A,0x89,0x87,0x7C,0x84,0x83,0x82,0x84,0x8E,0x8B,0x8F,0x95,0x7E,0x7F,0x70, + 0x6D,0x82,0x7A,0x7F,0x8E,0x90,0x8F,0x92,0x93,0x81,0x70,0x7B,0x81,0x7F,0x83,0x6F, + 0x7C,0x95,0x88,0x7C,0x7A,0x79,0x78,0x83,0x92,0x8F,0x93,0x95,0x7E,0x80,0x7C,0x72, + 0x6C,0x52,0x5C,0x6E,0x6C,0x67,0x73,0x73,0x77,0x8C,0x91,0xA6,0xAC,0xA3,0x95,0x92, + 0xA0,0x86,0x7D,0x84,0x7A,0x8E,0x99,0x94,0x91,0x8C,0x97,0x92,0x83,0x80,0x71,0x68, + 0x6D,0x69,0x78,0x79,0x6B,0x71,0x72,0x7A,0x73,0x73,0x7C,0x7C,0x7D,0x8B,0x90,0x83, + 0x83,0x77,0x71,0x73,0x77,0x81,0x8B,0x8F,0x94,0x99,0x82,0x79,0x76,0x6E,0x79,0x7F, + 0x77,0x80,0x85,0x83,0x8D,0x92,0x8C,0x74,0x74,0x80,0x7F,0x90,0x88,0x69,0x72,0x8E, + 0x87,0x78,0x7F,0x8E,0x94,0x7D,0x79,0x98,0xA8,0x83,0x6A,0x91,0x7B,0x6A,0x75,0x6E, + 0x7D,0x7E,0x8F,0x83,0x7C,0x88,0x83,0x83,0x7F,0x90,0x9A,0x8A,0x72,0x79,0x86,0x77, + 0x6D,0x5D,0x5A,0x64,0x6D,0x69,0x6E,0x85,0x92,0xA0,0x97,0x94,0x92,0x7C,0x80,0x93, + 0x95,0x93,0x93,0x8F,0x92,0x9B,0x91,0x87,0x8A,0x8F,0x85,0x88,0x90,0x7D,0x71,0x6A, + 0x60,0x68,0x7B,0x7D,0x74,0x7C,0x85,0x73,0x6B,0x77,0x6D,0x70,0x79,0x66,0x74,0x81, + 0x7B,0x86,0x95,0x9E,0x8C,0x79,0x80,0x83,0x80,0x88,0x77,0x69,0x83,0x86,0x78,0x73, + 0x73,0x7D,0x7E,0x89,0x96,0x8F,0x8C,0x78,0x66,0x70,0x7C,0x78,0x6C,0x77,0x75,0x7B, + 0x8B,0x8D,0x85,0x84,0x96,0x8C,0x8A,0x94,0x91,0x84,0x74,0x87,0x92,0x88,0x79,0x6F, + 0x6F,0x85,0x88,0x79,0x87,0x81,0x7E,0x7F,0x7A,0x81,0x7C,0x77,0x7C,0x76,0x6D,0x73, + 0x6F,0x60,0x65,0x6B,0x6C,0x72,0x87,0x90,0x95,0xAA,0x9F,0x8F,0x88,0x7A,0x77,0x7F, + 0x91,0x8D,0x92,0xA1,0xA3,0xA0,0x8E,0x8F,0x88,0x77,0x7C,0x7A,0x78,0x73,0x6F,0x73, + 0x85,0x86,0x72,0x69,0x68,0x6C,0x6E,0x7B,0x74,0x64,0x77,0x7E,0x75,0x6D,0x6E,0x78, + 0x79,0x7F,0x91,0x9A,0x95,0x7D,0x71,0x83,0x86,0x76,0x7A,0x7A,0x76,0x83,0x84,0x83, + 0x80,0x80,0x82,0x7C,0x7D,0x75,0x83,0x79,0x77,0x8F,0x81,0x76,0x6C,0x65,0x7F,0x95, + 0x8E,0x9D,0x97,0x91,0x95,0x7B,0x81,0x84,0x6A,0x77,0x84,0x7F,0x85,0x80,0x7C,0x7A, + 0x79,0x78,0x76,0x7A,0x7A,0x79,0x87,0x92,0x93,0x86,0x87,0x85,0x6A,0x79,0x7E,0x65, + 0x6A,0x77,0x83,0x80,0x7E,0x86,0x83,0x87,0x8A,0x92,0x90,0x83,0x84,0x86,0x8F,0x8F, + 0x85,0x82,0x86,0x86,0x95,0x97,0x82,0x84,0x91,0x8E,0x7F,0x6B,0x76,0x81,0x6F,0x7C, + 0x7C,0x81,0x7A,0x5F,0x70,0x7E,0x73,0x6E,0x6C,0x6F,0x78,0x80,0x84,0x86,0x7E,0x7D, + 0x81,0x82,0x83,0x86,0x8F,0x7C,0x83,0x8C,0x80,0x7A,0x66,0x63,0x75,0x88,0x8F,0x89, + 0x89,0x8E,0x81,0x82,0x84,0x6B,0x6F,0x86,0x7B,0x86,0x90,0x8A,0x83,0x7D,0x95,0x90, + 0x8D,0x8A,0x7F,0x87,0x94,0x91,0x7F,0x7E,0x79,0x6F,0x74,0x7C,0x78,0x78,0x80,0x91, + 0x92,0x79,0x82,0x7F,0x6D,0x7C,0x89,0x90,0x8D,0x8A,0x88,0x7E,0x7B,0x74,0x67,0x63, + 0x5D,0x5A,0x73,0x87,0x76,0x82,0xA6,0x99,0x83,0x8A,0x90,0x89,0x8D,0x8E,0xA1,0xAC, + 0x8A,0x85,0x8B,0x8C,0x8D,0x82,0x89,0x7F,0x80,0x8B,0x84,0x88,0x7A,0x6E,0x76,0x6F, + 0x62,0x76,0x77,0x68,0x72,0x74,0x76,0x6A,0x6A,0x6C,0x7B,0x85,0x7E,0xA4,0xA8,0x81, + 0x81,0x98,0x8F,0x76,0x81,0x8D,0x81,0x7D,0x77,0x80,0x81,0x75,0x72,0x7C,0x84,0x72, + 0x6E,0x80,0x94,0x88,0x82,0x90,0x7C,0x6C,0x71,0x87,0x87,0x78,0x94,0xA2,0x93,0x90, + 0x8D,0x7B,0x74,0x7C,0x82,0x89,0x84,0x86,0x7A,0x7F,0x8B,0x78,0x7F,0x82,0x71,0x62, + 0x7B,0x8C,0x79,0x88,0x94,0x87,0x8A,0x88,0x8A,0x8E,0x7A,0x71,0x84,0x7E,0x62,0x66, + 0x67,0x60,0x6D,0x76,0x86,0x97,0x8D,0x80,0x87,0x8E,0x7E,0x80,0x8D,0x86,0x8F,0x8D, + 0x8C,0x94,0x93,0x92,0x89,0x87,0x8F,0x88,0x83,0x83,0x80,0x84,0x8A,0x87,0x6C,0x63, + 0x71,0x62,0x68,0x75,0x6A,0x7B,0x7E,0x71,0x78,0x89,0x88,0x81,0x83,0x7B,0x85,0x84, + 0x7F,0x94,0x95,0x87,0x87,0x7E,0x69,0x6D,0x6D,0x68,0x76,0x82,0x8B,0x8D,0x85,0x70, + 0x74,0x7F,0x78,0x7A,0x7E,0x8C,0x80,0x6D,0x86,0x8D,0x87,0x8F,0x8B,0x84,0x79,0x7C, + 0x8D,0x8E,0x86,0x79,0x7D,0x8C,0x7A,0x76,0x82,0x7F,0x84,0x8B,0x80,0x7F,0x78,0x64, + 0x76,0x84,0x86,0x90,0x93,0x8A,0x80,0x84,0x88,0x7F,0x7F,0x74,0x6C,0x6D,0x5A,0x64, + 0x6F,0x71,0x7C,0x81,0x84,0x82,0x7B,0x7B,0x88,0x87,0x8C,0x96,0x8E,0x87,0x78,0x89, + 0x93,0x8A,0x92,0x9D,0xAB,0x92,0x85,0x92,0x8A,0x8B,0x80,0x6D,0x6C,0x6A,0x68,0x6E, + 0x79,0x7B,0x75,0x7A,0x71,0x65,0x72,0x77,0x78,0x82,0x82,0x88,0x8B,0x77,0x79,0x85, + 0x7F,0x85,0x86,0x88,0x82,0x6D,0x6C,0x70,0x7B,0x78,0x72,0x82,0x7D,0x7B,0x82,0x81, + 0x80,0x79,0x82,0x83,0x80,0x82,0x79,0x7E,0x8E,0x8D,0x85,0x8C,0x81,0x87,0x86,0x7A, + 0x91,0x86,0x82,0x81,0x75,0x78,0x79,0x7C,0x84,0x88,0x7E,0x82,0x82,0x7D,0x78,0x79, + 0x8B,0x89,0x7C,0x7B,0x7E,0x89,0x83,0x7B,0x8A,0x83,0x75,0x70,0x73,0x73,0x69,0x72, + 0x78,0x88,0x89,0x80,0x89,0x87,0x88,0x87,0x81,0x85,0x85,0x7D,0x85,0x87,0x7F,0x83, + 0x8E,0x8D,0x8A,0x94,0x97,0x98,0x92,0x92,0x88,0x7C,0x7E,0x75,0x6D,0x67,0x6B,0x75, + 0x7C,0x7B,0x75,0x77,0x7B,0x77,0x78,0x7B,0x79,0x79,0x77,0x7D,0x7B,0x79,0x7F,0x7F, + 0x83,0x85,0x7F,0x80,0x7D,0x77,0x77,0x77,0x78,0x79,0x7E,0x80,0x7F,0x88,0x8A,0x89, + 0x88,0x86,0x89,0x7F,0x7D,0x80,0x7E,0x81,0x7D,0x82,0x87,0x85,0x86,0x8C,0x8E,0x8F, + 0x8B,0x86,0x85,0x7F,0x7E,0x7D,0x7B,0x7E,0x80,0x7D,0x80,0x82,0x80,0x83,0x81,0x7E, + 0x80,0x84,0x82,0x7D,0x7E,0x80,0x80,0x7E,0x7D,0x78,0x74,0x75,0x77,0x77,0x78,0x7B, + 0x7E,0x84,0x88,0x89,0x89,0x88,0x89,0x8C,0x8D,0x8B,0x89,0x81,0x7E,0x7D,0x7C,0x80, + 0x83,0x85,0x87,0x8D,0x90,0x91,0x91,0x8C,0x88,0x83,0x7E,0x7B,0x79,0x7B,0x78,0x78, + 0x7B,0x7C,0x79,0x79,0x7B,0x7A,0x7C,0x7D,0x7D,0x7E,0x80,0x82,0x7F,0x7F,0x80,0x7E, + 0x81,0x82,0x7C,0x79,0x7C,0x7A,0x77,0x79,0x77,0x77,0x79,0x7E,0x81,0x81,0x85,0x85, + 0x83,0x86,0x84,0x82,0x82,0x82,0x84,0x83,0x88,0x83,0x8B,0x98,0x83,0x92,0x7C,0x6B, + 0x89,0x7C,0x6A,0x6D,0x7D,0x86,0x8A,0x8C,0x8E,0x8A,0x8B,0x9C,0xA1,0x9B,0x96,0x92, + 0x90,0x90,0x89,0x83,0x7F,0x72,0x6A,0x69,0x65,0x6D,0x67,0x55,0x62,0x64,0x5F,0x69, + 0x6B,0x6D,0x78,0x79,0x7B,0x79,0x6F,0x8A,0x88,0x73,0x88,0xA4,0xA2,0x96,0xB7,0xC1, + 0xAF,0xAA,0x9A,0x99,0xA7,0xA4,0x94,0x93,0x93,0x89,0x88,0x85,0x7A,0x76,0x72,0x6D, + 0x6B,0x74,0x7E,0x79,0x6C,0x68,0x68,0x5B,0x53,0x4C,0x47,0x4C,0x4C,0x50,0x5B,0x63, + 0x63,0x68,0x7A,0x88,0x8A,0x8A,0x90,0x94,0x8F,0x85,0x8F,0x9D,0x9D,0x98,0x98,0xA5, + 0xB0,0xBA,0xC1,0xC4,0xBD,0xAD,0xAA,0xAD,0xAA,0xA2,0x9A,0x9A,0x95,0x8B,0x8D,0x86, + 0x7E,0x7D,0x75,0x6C,0x64,0x64,0x62,0x59,0x54,0x53,0x52,0x4D,0x4F,0x51,0x54,0x58, + 0x56,0x56,0x57,0x5C,0x5B,0x58,0x67,0x6C,0x68,0x6D,0x70,0x70,0x75,0x79,0x74,0x7D, + 0x8B,0x87,0x8C,0x98,0x9F,0xAA,0xB7,0xB0,0x9E,0x9F,0x9D,0x94,0x8E,0x83,0x86,0x89, + 0x88,0x85,0x81,0x84,0x85,0x85,0x82,0x83,0x85,0x86,0x84,0x7B,0x73,0x6C,0x6B,0x6A, + 0x66,0x63,0x61,0x62,0x5D,0x59,0x5B,0x5D,0x61,0x6F,0x77,0x79,0x77,0x77,0x73,0x7B, + 0x8F,0x91,0x84,0x85,0x8C,0x8C,0x8D,0x8C,0x92,0xA1,0xA8,0xAC,0xB3,0xB8,0xB9,0xB9, + 0xB8,0xB5,0xBA,0xB8,0xB6,0xB9,0xB9,0xAF,0xA3,0x9D,0x93,0x92,0xA0,0x9D,0x90,0x8C, + 0x86,0x77,0x6A,0x62,0x62,0x69,0x62,0x59,0x60,0x63,0x5E,0x53,0x4A,0x4D,0x54,0x58, + 0x5C,0x62,0x6D,0x6C,0x67,0x6E,0x70,0x76,0x85,0x85,0x7F,0x82,0x7F,0x74,0x70,0x73, + 0x7C,0x86,0x85,0x87,0x90,0x8D,0x86,0x84,0x84,0x88,0x8D,0x90,0x90,0x94,0x95,0x86, + 0x81,0x81,0x81,0x84,0x89,0x84,0x78,0x7B,0x73,0x5F,0x59,0x57,0x62,0x67,0x60,0x62, + 0x64,0x5E,0x52,0x4E,0x4D,0x50,0x58,0x56,0x5D,0x61,0x5B,0x51,0x50,0x55,0x55,0x69, + 0x78,0x6E,0x6B,0x6E,0x66,0x68,0x6D,0x6F,0x80,0x8A,0x8B,0x93,0x99,0x9A,0x99,0xA1, + 0xAF,0xB9,0xBA,0xB9,0xC1,0xC3,0xC0,0xBC,0xBF,0xBE,0xBE,0xCF,0xCD,0xC2,0xBE,0xB7, + 0xAE,0xA5,0xA1,0xA5,0xA6,0x9E,0x93,0x8D,0x86,0x80,0x7B,0x79,0x7D,0x7E,0x7E,0x7E, + 0x77,0x6D,0x6C,0x71,0x70,0x70,0x7D,0x84,0x7A,0x71,0x70,0x6A,0x66,0x68,0x6E,0x78, + 0x79,0x71,0x74,0x75,0x6E,0x6E,0x76,0x7D,0x83,0x82,0x83,0x88,0x84,0x7E,0x85,0x8A, + 0x85,0x8C,0x9C,0x9A,0x8F,0x8F,0x93,0x90,0x8D,0x8F,0x9A,0xA0,0x99,0x92,0x92,0x8F, + 0x8A,0x8B,0x8E,0x95,0x96,0x8F,0x90,0x90,0x89,0x85,0x89,0x80,0x7A,0x8D,0x8E,0x7C, + 0x77,0x78,0x6F,0x64,0x64,0x6B,0x71,0x69,0x5A,0x5B,0x58,0x4F,0x4B,0x4F,0x53,0x55, + 0x53,0x52,0x53,0x4E,0x4C,0x53,0x57,0x51,0x58,0x6B,0x62,0x56,0x59,0x54,0x49,0x45, + 0x4A,0x55,0x5C,0x54,0x51,0x56,0x50,0x4C,0x52,0x5B,0x62,0x67,0x6B,0x72,0x74,0x76, + 0x7E,0x8D,0x94,0x96,0xAE,0xC1,0xB7,0xB3,0xBA,0xBA,0xB7,0xB9,0xC0,0xC9,0xCA,0xC2, + 0xC2,0xC3,0xB8,0xB4,0xB8,0xB9,0xB9,0xB6,0xB2,0xAF,0xA5,0x9D,0x9F,0xA3,0x9C,0x9C, + 0xB2,0xB3,0xA0,0xA1,0xA5,0x9B,0x98,0x9E,0xA7,0xAC,0xA3,0x9B,0x9D,0x97,0x8D,0x8B, + 0x8E,0x90,0x8D,0x86,0x82,0x7D,0x73,0x6E,0x71,0x71,0x64,0x6B,0x78,0x6A,0x5E,0x62, + 0x5F,0x54,0x54,0x5C,0x67,0x6B,0x61,0x63,0x6A,0x62,0x61,0x68,0x6C,0x70,0x70,0x6F, + 0x72,0x6C,0x68,0x6D,0x71,0x70,0x6B,0x76,0x83,0x74,0x6C,0x76,0x75,0x6B,0x6D,0x76, + 0x81,0x7F,0x74,0x7B,0x7E,0x74,0x74,0x7C,0x7F,0x81,0x7F,0x7C,0x80,0x7B,0x77,0x7D, + 0x80,0x7F,0x76,0x83,0x91,0x7E,0x75,0x83,0x7F,0x76,0x79,0x81,0x89,0x86,0x7C,0x81, + 0x83,0x77,0x76,0x7E,0x81,0x81,0x7D,0x7C,0x7C,0x74,0x72,0x78,0x79,0x79,0x74,0x80, + 0x94,0x84,0x79,0x89,0x8A,0x81,0x85,0x92,0x9C,0x9D,0x94,0x98,0x9F,0x94,0x8F,0x97, + 0x99,0x95,0x94,0x90,0x8C,0x81,0x7B,0x7D,0x79,0x76,0x6C,0x73,0x83,0x71,0x61,0x6E, + 0x6A,0x5B,0x5F,0x6A,0x71,0x70,0x66,0x6C,0x74,0x6A,0x69,0x75,0x7A,0x7B,0x7F,0x81, + 0x84,0x7F,0x7D,0x85,0x89,0x8B,0x88,0x8E,0xA4,0x9E,0x8D,0x99,0x9D,0x8F,0x8F,0x99, + 0xA2,0xA2,0x96,0x96,0x9E,0x93,0x8C,0x96,0x9B,0x98,0x96,0x98,0x9B,0x94,0x8D,0x90, + 0x92,0x91,0x8C,0x8D,0xA3,0xA0,0x87,0x90,0x96,0x83,0x7E,0x8A,0x94,0x94,0x8A,0x88, + 0x8E,0x82,0x7A,0x84,0x8A,0x85,0x82,0x81,0x7E,0x78,0x6E,0x70,0x6E,0x68,0x63,0x5E, + 0x6F,0x71,0x55,0x58,0x5E,0x4A,0x41,0x49,0x52,0x54,0x4A,0x48,0x51,0x49,0x3C,0x46, + 0x50,0x4E,0x4D,0x4E,0x50,0x4D,0x46,0x4B,0x4F,0x4E,0x4D,0x4D,0x61,0x68,0x54,0x56, + 0x64,0x59,0x54,0x61,0x6D,0x73,0x71,0x71,0x7F,0x7F,0x78,0x85,0x93,0x96,0x9B,0xA4, + 0xA7,0xA7,0xA2,0xA4,0xA9,0xA6,0xA4,0xA0,0xB0,0xBF,0xA9,0x9F,0xAE,0xA2,0x94,0x99, + 0xA2,0xA6,0xA0,0x98,0x9D,0x9D,0x90,0x91,0x9B,0x9D,0x9D,0x9E,0x9F,0x9E,0x99,0x99, + 0x9F,0x9F,0x9F,0x99,0xA4,0xB8,0xA9,0x9B,0xA9,0xA6,0x96,0x9B,0xA5,0xAB,0xA7,0x9D, + 0xA1,0xA4,0x94,0x8F,0x9A,0x99,0x96,0x94,0x95,0x95,0x8E,0x88,0x8A,0x8B,0x88,0x81, + 0x83,0x97,0x90,0x79,0x82,0x85,0x73,0x72,0x7C,0x81,0x7F,0x74,0x72,0x78,0x6C,0x63, + 0x6C,0x6E,0x6B,0x6B,0x69,0x69,0x62,0x5D,0x5E,0x5F,0x60,0x59,0x54,0x67,0x69,0x51, + 0x54,0x5C,0x4E,0x47,0x4D,0x55,0x59,0x50,0x4D,0x55,0x4F,0x45,0x4A,0x53,0x52,0x53, + 0x53,0x54,0x53,0x4D,0x4F,0x53,0x57,0x57,0x53,0x64,0x72,0x5E,0x5A,0x6A,0x62,0x5A, + 0x63,0x6D,0x74,0x71,0x6B,0x76,0x7B,0x73,0x79,0x86,0x8A,0x8E,0x92,0x97,0x9D,0x9A, + 0x9D,0xA7,0xAC,0xAE,0xAB,0xB8,0xD2,0xC8,0xB8,0xC7,0xC6,0xB5,0xB6,0xC0,0xC5,0xC0, + 0xB4,0xB6,0xBA,0xAD,0xA6,0xAE,0xB0,0xAC,0xAA,0xA7,0xA6,0xA0,0x9A,0x9C,0x9E,0x9C, + 0x94,0x99,0xB2,0xA9,0x95,0xA0,0xA2,0x93,0x92,0x9B,0xA3,0xA1,0x95,0x97,0x9E,0x92, + 0x8C,0x94,0x95,0x92,0x91,0x8E,0x8E,0x8A,0x83,0x83,0x84,0x81,0x79,0x79,0x91,0x8C, + 0x75,0x7B,0x7E,0x70,0x6E,0x75,0x7E,0x7F,0x72,0x70,0x78,0x6F,0x67,0x6F,0x70,0x6F, + 0x6E,0x68,0x67,0x66,0x61,0x60,0x61,0x61,0x5A,0x56,0x6B,0x6F,0x57,0x57,0x5E,0x53, + 0x4B,0x4D,0x56,0x5D,0x53,0x4D,0x56,0x55,0x4E,0x51,0x55,0x59,0x59,0x54,0x56,0x59, + 0x55,0x53,0x55,0x5B,0x58,0x52,0x6B,0x74,0x5E,0x5D,0x67,0x5F,0x5B,0x5E,0x67,0x72, + 0x69,0x61,0x6B,0x6E,0x68,0x6C,0x73,0x7A,0x7D,0x7B,0x7E,0x84,0x83,0x86,0x8C,0x93, + 0x91,0x8F,0xA9,0xBA,0xA8,0xAA,0xB8,0xB4,0xB2,0xB7,0xC2,0xCE,0xC7,0xBE,0xC4,0xC5, + 0xBD,0xBB,0xBB,0xBE,0xBE,0xB6,0xB1,0xB0,0xA8,0xA0,0x9D,0x9E,0x96,0x8D,0xA0,0xA3, + 0x8A,0x89,0x8D,0x84,0x81,0x81,0x88,0x93,0x8C,0x83,0x88,0x89,0x85,0x85,0x87,0x8B, + 0x8D,0x8A,0x8C,0x8E,0x8D,0x8D,0x89,0x8C,0x87,0x84,0x9B,0x9C,0x86,0x87,0x87,0x80, + 0x7E,0x7A,0x80,0x89,0x80,0x78,0x7B,0x7A,0x74,0x71,0x76,0x7C,0x7D,0x77,0x72,0x72, + 0x73,0x6F,0x6E,0x72,0x6C,0x72,0x88,0x7F,0x6E,0x72,0x6F,0x6A,0x68,0x69,0x73,0x78, + 0x6E,0x68,0x6C,0x6A,0x64,0x62,0x64,0x6A,0x68,0x61,0x5F,0x60,0x60,0x5A,0x58,0x57, + 0x52,0x63,0x74,0x63,0x5A,0x5C,0x55,0x54,0x53,0x57,0x64,0x63,0x59,0x57,0x5E,0x5F, + 0x59,0x58,0x60,0x68,0x68,0x64,0x64,0x68,0x67,0x63,0x66,0x66,0x69,0x80,0x84,0x74, + 0x77,0x79,0x78,0x7B,0x7C,0x87,0x95,0x94,0x8F,0x91,0x99,0x9D,0x9B,0x9D,0xA9,0xB0, + 0xAE,0xAB,0xAD,0xAF,0xA9,0xA4,0xA5,0xA0,0xA9,0xBB,0xAD,0x9C,0x9B,0x92,0x8F,0x8A, + 0x86,0x91,0x97,0x8C,0x83,0x82,0x83,0x80,0x79,0x7B,0x84,0x85,0x7F,0x7C,0x80,0x80, + 0x7C,0x7D,0x7D,0x7F,0x95,0x9D,0x8B,0x87,0x88,0x84,0x85,0x80,0x86,0x92,0x91,0x89, + 0x87,0x8B,0x8E,0x88,0x84,0x8B,0x92,0x91,0x8A,0x87,0x8B,0x88,0x84,0x81,0x87,0x8F, + 0x99,0x94,0x85,0x87,0x85,0x83,0x7E,0x7C,0x87,0x8E,0x88,0x7D,0x7B,0x81,0x7F,0x7A, + 0x7A,0x80,0x85,0x81,0x7B,0x79,0x79,0x74,0x6E,0x69,0x6E,0x85,0x87,0x74,0x6E,0x6E, + 0x6F,0x6A,0x60,0x64,0x70,0x71,0x68,0x5F,0x63,0x68,0x62,0x5E,0x61,0x67,0x69,0x65, + 0x60,0x62,0x64,0x60,0x5B,0x57,0x6A,0x7D,0x72,0x64,0x61,0x64,0x69,0x65,0x64,0x6E, + 0x7A,0x7B,0x75,0x72,0x78,0x7E,0x7C,0x7C,0x82,0x8C,0x91,0x8F,0x8F,0x93,0x98,0x9B, + 0x98,0x9F,0xB8,0xBD,0xB1,0xA9,0xA4,0xA8,0xA7,0xA2,0xA3,0xAB,0xAE,0xA8,0x9B,0x96, + 0x98,0x98,0x8F,0x89,0x8A,0x8C,0x8C,0x85,0x7E,0x7A,0x79,0x72,0x70,0x81,0x8D,0x87, + 0x7E,0x77,0x76,0x79,0x75,0x75,0x7C,0x84,0x87,0x83,0x7C,0x7D,0x80,0x81,0x81,0x80, + 0x82,0x86,0x86,0x84,0x81,0x80,0x7F,0x7B,0x87,0x9A,0x97,0x8B,0x84,0x81,0x84,0x84, + 0x81,0x82,0x87,0x8B,0x8E,0x8A,0x86,0x84,0x83,0x84,0x83,0x82,0x84,0x86,0x84,0x82, + 0x7E,0x7C,0x76,0x78,0x89,0x90,0x88,0x80,0x77,0x73,0x74,0x70,0x6E,0x72,0x73,0x78, + 0x7A,0x74,0x71,0x72,0x71,0x6E,0x6C,0x6D,0x72,0x72,0x6E,0x6C,0x6A,0x67,0x62,0x6A, + 0x79,0x78,0x70,0x6A,0x62,0x63,0x65,0x61,0x61,0x60,0x61,0x69,0x6B,0x6B,0x6E,0x6F, + 0x70,0x70,0x70,0x75,0x79,0x79,0x7B,0x7F,0x81,0x81,0x81,0x8B,0x98,0x99,0x97,0x98, + 0x94,0x95,0x9B,0x9A,0x9A,0x9A,0x97,0x9A,0x9B,0x9A,0x9C,0x9B,0x99,0x99,0x99,0x98, + 0x96,0x92,0x92,0x93,0x92,0x8F,0x8D,0x8D,0x90,0x90,0x8A,0x8A,0x8A,0x88,0x8C,0x8A, + 0x86,0x88,0x87,0x85,0x85,0x85,0x83,0x81,0x80,0x80,0x81,0x82,0x82,0x82,0x83,0x84, + 0x84,0x82,0x7F,0x7F,0x84,0x87,0x84,0x82,0x84,0x84,0x88,0x87,0x84,0x85,0x82,0x7F, + 0x80,0x7F,0x7D,0x7D,0x7C,0x7D,0x7E,0x7E,0x7E,0x7E,0x7F,0x80,0x83,0x83,0x7F,0x7D, + 0x7E,0x83,0x82,0x7E,0x81,0x80,0x7E,0x81,0x82,0x7F,0x7E,0x7B,0x79,0x7B,0x78,0x75, + 0x76,0x74,0x73,0x74,0x76,0x75,0x75,0x76,0x76,0x78,0x77,0x76,0x75,0x75,0x7A,0x7C, + 0x7A,0x7B,0x7A,0x7A,0x81,0x7E,0x7C,0x7C,0x77,0x77,0x78,0x75,0x76,0x74,0x70,0x72, + 0x74,0x74,0x77,0x77,0x77,0x78,0x7A,0x7A,0x7A,0x7A,0x7B,0x82,0x83,0x7F,0x81,0x81, + 0x82,0x88,0x89,0x87,0x88,0x84,0x84,0x86,0x83,0x84,0x84,0x82,0x83,0x84,0x86,0x86, + 0x86,0x86,0x86,0x88,0x89,0x88,0x86,0x83,0x85,0x8C,0x88,0x84,0x83,0x7F,0x83,0x86, + 0x80,0x81,0x7F,0x79,0x7A,0x79,0x77,0x78,0x75,0x74,0x76,0x77,0x79,0x7A,0x7A,0x7C, + 0x7E,0x82,0x83,0x81,0x81,0x7F,0x84,0x86,0x82,0x84,0x83,0x80,0x87,0x88,0x84,0x84, + 0x80,0x7F,0x81,0x81,0x80,0x7E,0x7C,0x7B,0x7C,0x7E,0x7F,0x7E,0x81,0x82,0x83,0x85, + 0x85,0x86,0x84,0x83,0x8A,0x8B,0x86,0x85,0x84,0x84,0x85,0x83,0x86,0x90,0x7C,0x62, + 0x77,0x87,0x86,0x6E,0x80,0x88,0x62,0x72,0x7F,0x7B,0x7C,0x88,0x8E,0x7B,0x7F,0x85, + 0x84,0x7A,0x7F,0x8C,0x7B,0x71,0x74,0x78,0x81,0x80,0x7F,0x88,0x79,0x6E,0x7B,0x77, + 0x71,0x72,0x79,0x76,0x78,0x7E,0x79,0x7F,0x84,0x87,0x87,0x82,0x87,0x86,0x86,0x89, + 0x80,0x82,0x83,0x7D,0x7C,0x81,0x83,0x80,0x80,0x7C,0x7F,0x81,0x77,0x78,0x79,0x77, + 0x75,0x75,0x7C,0x7E,0x88,0x8C,0x80,0x82,0x8A,0x8A,0x8B,0x8E,0x8E,0x85,0x86,0x8C, + 0x8D,0x8A,0x8B,0x88,0x81,0x87,0x7E,0x74,0x7D,0x77,0x68,0x6C,0x73,0x76,0x77,0x71, + 0x70,0x72,0x70,0x77,0x7B,0x7F,0x7D,0x76,0x7B,0x7C,0x7A,0x78,0x79,0x85,0x8B,0x89, + 0x89,0x80,0x80,0x86,0x88,0x88,0x80,0x7C,0x7B,0x7D,0x81,0x85,0x83,0x7C,0x79,0x72, + 0x78,0x7F,0x7F,0x81,0x7B,0x7D,0x7D,0x80,0x86,0x89,0x88,0x85,0x87,0x84,0x7D,0x83, + 0x87,0x83,0x83,0x85,0x84,0x84,0x8C,0x86,0x84,0x85,0x7E,0x82,0x82,0x7C,0x7D,0x80, + 0x7B,0x7C,0x7C,0x7D,0x87,0x89,0x7F,0x7E,0x7F,0x7E,0x7E,0x7D,0x89,0x82,0x7E,0x85, + 0x78,0x77,0x7C,0x7D,0x7E,0x82,0x81,0x7D,0x82,0x83,0x81,0x84,0x81,0x7A,0x78,0x78, + 0x7A,0x80,0x84,0x84,0x84,0x85,0x84,0x83,0x83,0x7C,0x89,0x8F,0x88,0x88,0x83,0x82, + 0x85,0x88,0x81,0x81,0x7D,0x74,0x7D,0x81,0x85,0x8A,0x81,0x80,0x82,0x83,0x89,0x86, + 0x81,0x85,0x88,0x86,0x86,0x83,0x83,0x7F,0x76,0x80,0x90,0x91,0x8F,0x8A,0x7D,0x7D, + 0x7F,0x77,0x77,0x75,0x6F,0x77,0x82,0x83,0x82,0x81,0x80,0x88,0x84,0x81,0x83,0x7D, + 0x7E,0x80,0x7F,0x7F,0x80,0x7F,0x7B,0x78,0x7F,0x8F,0x94,0x91,0x89,0x80,0x79,0x7E, + 0x7C,0x72,0x76,0x77,0x7E,0x87,0x86,0x83,0x7E,0x80,0x87,0x83,0x7A,0x7D,0x81,0x87, + 0x8B,0x87,0x84,0x81,0x7B,0x80,0x7C,0x82,0x96,0x94,0x92,0x8F,0x83,0x86,0x84,0x79, + 0x79,0x7A,0x78,0x86,0x8E,0x82,0x82,0x83,0x84,0x88,0x7E,0x7C,0x7E,0x81,0x80,0x83, + 0x85,0x86,0x82,0x7C,0x75,0x76,0x8B,0x95,0x8B,0x89,0x84,0x76,0x82,0x7C,0x6C,0x72, + 0x75,0x7C,0x85,0x80,0x79,0x82,0x8A,0x88,0x80,0x79,0x79,0x7C,0x82,0x82,0x80,0x84, + 0x84,0x7F,0x7A,0x77,0x7C,0x8E,0x95,0x8B,0x88,0x84,0x80,0x8B,0x81,0x72,0x78,0x76, + 0x79,0x80,0x7B,0x79,0x80,0x87,0x84,0x7F,0x7F,0x80,0x84,0x84,0x7C,0x7A,0x81,0x86, + 0x80,0x7B,0x76,0x80,0x92,0x88,0x82,0x88,0x82,0x87,0x8A,0x76,0x74,0x76,0x75,0x7C, + 0x77,0x71,0x79,0x80,0x87,0x7F,0x79,0x84,0x80,0x7C,0x76,0x75,0x7F,0x82,0x7C,0x76, + 0x73,0x75,0x88,0x91,0x82,0x84,0x84,0x7F,0x88,0x80,0x79,0x79,0x7B,0x7E,0x7C,0x77, + 0x7B,0x84,0x88,0x86,0x80,0x84,0x88,0x84,0x84,0x7C,0x7C,0x7E,0x7B,0x75,0x75,0x79, + 0x81,0x94,0x8C,0x84,0x88,0x81,0x87,0x87,0x71,0x74,0x7B,0x78,0x7F,0x79,0x79,0x86, + 0x85,0x85,0x82,0x80,0x87,0x84,0x84,0x82,0x81,0x82,0x7C,0x7E,0x7F,0x79,0x7B,0x8F, + 0x8B,0x7C,0x87,0x85,0x83,0x87,0x77,0x73,0x7B,0x75,0x7B,0x77,0x70,0x7D,0x82,0x7C, + 0x7F,0x81,0x81,0x85,0x80,0x7D,0x7D,0x7F,0x7F,0x7E,0x83,0x7C,0x73,0x85,0x8C,0x82, + 0x8B,0x8D,0x84,0x8A,0x82,0x78,0x7D,0x78,0x78,0x7E,0x72,0x76,0x81,0x7E,0x82,0x81, + 0x7F,0x83,0x81,0x7B,0x7F,0x7D,0x7A,0x7A,0x75,0x7A,0x72,0x75,0x8C,0x8A,0x86,0x89, + 0x7F,0x8A,0x88,0x74,0x7E,0x7B,0x73,0x7B,0x77,0x73,0x82,0x81,0x7E,0x87,0x7F,0x86, + 0x84,0x80,0x84,0x7F,0x7F,0x7D,0x73,0x7C,0x79,0x72,0x86,0x8A,0x84,0x87,0x83,0x81, + 0x8A,0x7F,0x7C,0x84,0x78,0x7C,0x78,0x75,0x7B,0x7D,0x80,0x83,0x81,0x84,0x8B,0x81, + 0x80,0x80,0x81,0x7F,0x7A,0x7A,0x7D,0x7B,0x7E,0x8A,0x82,0x86,0x88,0x82,0x8A,0x88, + 0x7D,0x7E,0x7C,0x75,0x78,0x73,0x73,0x7E,0x79,0x7F,0x83,0x7C,0x87,0x86,0x80,0x88, + 0x85,0x81,0x80,0x7C,0x7E,0x7B,0x7A,0x8A,0x86,0x80,0x8B,0x82,0x85,0x8C,0x7C,0x7F, + 0x86,0x7A,0x7D,0x7A,0x73,0x7D,0x78,0x7C,0x7D,0x78,0x82,0x83,0x80,0x86,0x86,0x84, + 0x87,0x80,0x81,0x80,0x79,0x84,0x84,0x7E,0x86,0x83,0x83,0x85,0x7D,0x82,0x86,0x7C, + 0x7E,0x80,0x74,0x7C,0x7C,0x72,0x7F,0x7C,0x7C,0x86,0x7E,0x81,0x85,0x7F,0x82,0x7C, + 0x7A,0x81,0x7C,0x80,0x87,0x81,0x85,0x85,0x7D,0x86,0x81,0x7A,0x85,0x80,0x7A,0x80, + 0x7C,0x7E,0x7F,0x78,0x7F,0x7F,0x7B,0x86,0x84,0x83,0x89,0x85,0x85,0x84,0x7F,0x7D, + 0x7B,0x80,0x86,0x7E,0x80,0x84,0x7F,0x89,0x84,0x81,0x87,0x7F,0x80,0x82,0x79,0x7D, + 0x83,0x7B,0x7C,0x82,0x81,0x81,0x83,0x87,0x86,0x85,0x86,0x84,0x7F,0x81,0x7F,0x80, + 0x89,0x7F,0x7F,0x86,0x85,0x85,0x81,0x81,0x82,0x7F,0x7F,0x7E,0x7A,0x7F,0x81,0x7A, + 0x7D,0x7E,0x7C,0x81,0x80,0x81,0x88,0x84,0x83,0x83,0x82,0x81,0x7E,0x84,0x87,0x7E, + 0x83,0x85,0x83,0x86,0x80,0x7F,0x84,0x83,0x80,0x80,0x7C,0x80,0x7F,0x7A,0x7E,0x7C, + 0x7F,0x80,0x82,0x86,0x85,0x83,0x84,0x81,0x7F,0x81,0x7D,0x84,0x84,0x7E,0x84,0x84, + 0x83,0x84,0x80,0x81,0x82,0x7F,0x80,0x7C,0x7B,0x80,0x7D,0x7C,0x7E,0x7D,0x7E,0x7F, + 0x7F,0x86,0x85,0x80,0x83,0x84,0x81,0x7F,0x7F,0x85,0x7F,0x7F,0x83,0x81,0x83,0x81, + 0x7F,0x7F,0x80,0x80,0x7C,0x7C,0x7F,0x7E,0x7B,0x7B,0x7C,0x80,0x7F,0x7D,0x83,0x85, + 0x83,0x82,0x83,0x83,0x82,0x80,0x85,0x84,0x7D,0x80,0x83,0x82,0x85,0x7F,0x83,0x84, + 0x7B,0x80,0x7D,0x7A,0x7C,0x7B,0x7C,0x7D,0x7F,0x7F,0x82,0x81,0x84,0x84,0x84,0x84, + 0x7F,0x81,0x82,0x82,0x82,0x81,0x83,0x81,0x82,0x83,0x83,0x88,0x8B,0x92,0x8B,0x8A, + 0x88,0x7C,0x7F,0x73,0x70,0x77,0x75,0x79,0x74,0x83,0x7D,0x6D,0x89,0x81,0x6A,0x7C, + 0x81,0x80,0x72,0x70,0x89,0x81,0x80,0x7F,0x74,0x83,0x83,0x81,0x81,0x76,0x7F,0x88, + 0x7F,0x78,0x78,0x82,0x89,0x83,0x83,0x87,0x87,0x90,0x91,0x86,0x80,0x8A,0x9C,0x92, + 0x8A,0x93,0x88,0x85,0x97,0x96,0x94,0x9C,0xA0,0x98,0x91,0x94,0x94,0x84,0x78,0x80, + 0x88,0x8D,0x8C,0x85,0x82,0x81,0x7E,0x77,0x6E,0x69,0x6F,0x79,0x74,0x6A,0x68,0x62, + 0x64,0x63,0x5D,0x5F,0x60,0x62,0x65,0x5F,0x5A,0x60,0x5E,0x63,0x64,0x5C,0x60,0x66, + 0x6D,0x73,0x6A,0x68,0x6F,0x77,0x78,0x75,0x7E,0x7B,0x76,0x77,0x78,0x7D,0x80,0x7D, + 0x82,0x88,0x87,0x8A,0x8D,0x99,0xAD,0xAA,0x9F,0xA0,0x9E,0x9D,0x9D,0x9C,0x9E,0x97, + 0x8C,0x8A,0x86,0x7E,0x7F,0x99,0x95,0x89,0x93,0x90,0x8F,0x82,0x75,0x84,0x85,0x79, + 0x82,0x89,0x8F,0x95,0x86,0x8E,0x96,0x8C,0x85,0x85,0x8D,0x8B,0x83,0x82,0x88,0x7E, + 0x7C,0x9D,0xA1,0x94,0x9C,0x95,0x90,0x85,0x71,0x81,0x89,0x83,0x8F,0x96,0x98,0x96, + 0x86,0x86,0x92,0x88,0x86,0x89,0x93,0x98,0x8A,0x86,0x83,0x7B,0x72,0x82,0x90,0x81, + 0x7E,0x7D,0x71,0x67,0x53,0x57,0x64,0x5B,0x5A,0x5D,0x5F,0x5D,0x4B,0x42,0x4E,0x48, + 0x44,0x4E,0x59,0x59,0x51,0x4C,0x45,0x4F,0x49,0x55,0x6F,0x67,0x66,0x67,0x61,0x5E, + 0x55,0x58,0x6F,0x71,0x6F,0x79,0x7D,0x7B,0x71,0x6E,0x77,0x79,0x78,0x82,0x8F,0x90, + 0x8B,0x8C,0x95,0xA0,0x9A,0xAA,0xC7,0xB3,0xAB,0xAE,0x9D,0x91,0x83,0x86,0x9A,0x96, + 0x91,0x9C,0x96,0x89,0x7A,0x7C,0x88,0x89,0x88,0x94,0x9C,0x94,0x89,0x87,0x8A,0x8E, + 0x8A,0x8E,0xAE,0xA7,0x95,0x9C,0x95,0x89,0x81,0x84,0x95,0x98,0x8F,0x9B,0x9F,0x93, + 0x8D,0x8A,0x92,0x96,0x90,0x98,0xA3,0x99,0x92,0x8F,0x93,0x91,0x86,0xA2,0xB2,0x9C, + 0x9E,0xA0,0x90,0x88,0x81,0x8C,0x9B,0x8C,0x89,0x95,0x88,0x78,0x75,0x74,0x77,0x72, + 0x70,0x7A,0x72,0x5F,0x5A,0x5A,0x55,0x59,0x51,0x5C,0x73,0x58,0x4E,0x59,0x4F,0x44, + 0x44,0x4D,0x5D,0x58,0x4F,0x5D,0x5A,0x4F,0x54,0x58,0x60,0x63,0x61,0x6F,0x6F,0x65, + 0x68,0x6B,0x6D,0x66,0x74,0x8D,0x7C,0x6F,0x7D,0x77,0x6E,0x71,0x7F,0x94,0x96,0x92, + 0xA3,0xAA,0x9B,0x9A,0x9F,0xA2,0x9F,0x9C,0xA3,0x9E,0x8E,0x8C,0x8F,0x88,0x8C,0x8C, + 0x8C,0xA3,0x98,0x81,0x93,0x8D,0x7F,0x84,0x8A,0x96,0x96,0x8C,0x94,0x98,0x87,0x89, + 0x8F,0x91,0x95,0x95,0x9B,0x99,0x8E,0x91,0x8F,0x8D,0x8E,0x8F,0xAB,0xA8,0x90,0xA0, + 0x9C,0x87,0x88,0x92,0x9D,0x9E,0x94,0x9E,0xA2,0x90,0x8E,0x97,0x95,0x92,0x93,0x95, + 0x96,0x89,0x82,0x89,0x84,0x7D,0x82,0x7D,0x88,0x8F,0x71,0x75,0x7A,0x61,0x5E,0x60, + 0x63,0x68,0x5E,0x5E,0x66,0x51,0x49,0x50,0x4C,0x4F,0x52,0x55,0x57,0x50,0x4D,0x4D, + 0x49,0x4C,0x4B,0x62,0x70,0x58,0x62,0x6C,0x59,0x52,0x5D,0x6A,0x6E,0x6B,0x73,0x7E, + 0x71,0x67,0x70,0x73,0x71,0x77,0x7F,0x86,0x80,0x80,0x8A,0x89,0x8E,0x99,0x93,0xA6, + 0xBB,0xA1,0xA0,0xAD,0x94,0x8A,0x91,0x93,0x98,0x94,0x93,0x9E,0x8C,0x80,0x8A,0x85, + 0x82,0x8A,0x8D,0x90,0x8C,0x86,0x89,0x82,0x86,0x85,0x86,0xA3,0x96,0x87,0x9F,0x95, + 0x80,0x85,0x8B,0x91,0x91,0x8D,0x9D,0x9E,0x8A,0x90,0x98,0x8D,0x90,0x96,0x9A,0x9E, + 0x99,0x96,0x97,0x8E,0x8F,0x94,0x89,0xA2,0xAA,0x8F,0x9B,0x9E,0x83,0x80,0x85,0x88, + 0x8C,0x84,0x89,0x8E,0x7A,0x74,0x7B,0x72,0x70,0x75,0x74,0x75,0x6D,0x67,0x66,0x5A, + 0x59,0x58,0x55,0x6E,0x65,0x54,0x69,0x60,0x4B,0x50,0x53,0x56,0x5A,0x56,0x64,0x67, + 0x56,0x5C,0x61,0x58,0x5B,0x66,0x6A,0x6D,0x70,0x71,0x6E,0x6B,0x6D,0x6E,0x66,0x79, + 0x8A,0x73,0x7B,0x88,0x77,0x74,0x7C,0x85,0x8C,0x8C,0x96,0xA5,0x99,0x92,0x9C,0x96, + 0x8F,0x95,0x98,0x98,0x94,0x93,0x94,0x89,0x86,0x89,0x7E,0x8B,0x9D,0x86,0x89,0x97, + 0x82,0x7A,0x81,0x84,0x87,0x88,0x89,0x95,0x8D,0x84,0x8C,0x89,0x85,0x89,0x90,0x93, + 0x8E,0x91,0x92,0x8C,0x8A,0x90,0x8B,0x88,0xA4,0xA2,0x8E,0xA2,0x9D,0x89,0x8D,0x92, + 0x94,0x93,0x91,0x99,0x9A,0x8A,0x8B,0x91,0x87,0x85,0x8C,0x8D,0x88,0x85,0x86,0x81, + 0x79,0x7B,0x79,0x6F,0x82,0x86,0x6F,0x79,0x7A,0x62,0x60,0x66,0x63,0x64,0x63,0x66, + 0x6B,0x5D,0x5A,0x63,0x5A,0x58,0x5F,0x61,0x61,0x61,0x60,0x5E,0x5C,0x5A,0x61,0x5A, + 0x60,0x7B,0x6C,0x67,0x7D,0x6D,0x62,0x6B,0x6C,0x6F,0x70,0x71,0x7B,0x7A,0x70,0x79, + 0x7C,0x77,0x7F,0x86,0x8A,0x8D,0x8E,0x92,0x93,0x8F,0x95,0x93,0x8C,0xA5,0xA5,0x8F, + 0x9D,0x9E,0x86,0x86,0x8A,0x87,0x8A,0x88,0x8C,0x8F,0x81,0x81,0x89,0x81,0x7F,0x87, + 0x89,0x8B,0x8B,0x8A,0x8A,0x86,0x84,0x8A,0x80,0x8A,0xA3,0x90,0x8C,0xA0,0x90,0x82, + 0x8B,0x8D,0x90,0x91,0x90,0x9B,0x96,0x89,0x93,0x96,0x8B,0x92,0x99,0x97,0x96,0x94, + 0x94,0x93,0x8A,0x8E,0x8C,0x84,0x9C,0x9B,0x84,0x92,0x94,0x7B,0x7B,0x80,0x7D,0x80, + 0x7A,0x7D,0x83,0x70,0x6C,0x76,0x6B,0x65,0x6C,0x6B,0x6B,0x6A,0x66,0x65,0x5F,0x5C, + 0x60,0x57,0x64,0x7A,0x60,0x66,0x81,0x5C,0x5B,0x55,0x46,0x65,0x5E,0x4C,0x5E,0x6A, + 0x62,0x72,0x79,0x73,0x74,0x79,0x8E,0x93,0x8B,0x8C,0x99,0x8D,0x7F,0x7A,0x6C,0x90, + 0x91,0x64,0x77,0x83,0x68,0x5E,0x64,0x64,0x6E,0x76,0x85,0x8A,0x6C,0x78,0x89,0x7E, + 0x84,0x92,0xA1,0xB0,0xA3,0x97,0xAB,0xA9,0xBC,0xAF,0x93,0xD5,0xBF,0xA4,0xBA,0xAC, + 0xAA,0x9E,0x95,0x92,0x8D,0x93,0x93,0x83,0x7F,0x6E,0x6D,0x82,0x74,0x85,0x90,0x7D, + 0x84,0x7A,0x78,0x84,0x60,0x52,0x60,0x6D,0x83,0x76,0x70,0x78,0x66,0x64,0x72,0x75, + 0x90,0x91,0x92,0xAC,0xA3,0x91,0x96,0x98,0x94,0xA1,0xB2,0xBE,0xBE,0xA5,0x9D,0xAA, + 0x9B,0x98,0x8D,0x8C,0xA0,0x8C,0x86,0x87,0x7C,0x6C,0x61,0x66,0x69,0x70,0x65,0x56, + 0x4C,0x2B,0x25,0x33,0x33,0x30,0x34,0x3E,0x34,0x35,0x40,0x53,0x56,0x4D,0x57,0x65, + 0x74,0x7E,0x7A,0x79,0x7B,0x6F,0x7D,0x8A,0x8D,0x99,0x97,0x9E,0xBA,0xC4,0xCB,0xD5, + 0xC7,0xC6,0xC6,0xB4,0xB9,0xA5,0x8A,0x99,0x8C,0x8A,0x8A,0x7F,0x8C,0x74,0x5C,0x6F, + 0x77,0x65,0x5D,0x53,0x5A,0x68,0x53,0x57,0x65,0x65,0x68,0x62,0x6A,0x69,0x6C,0x7D, + 0x81,0x7F,0x7C,0x87,0x98,0x95,0x97,0x9B,0x92,0x9F,0x9E,0x9D,0xAA,0xA3,0xA4,0xA2, + 0xAA,0xAF,0xAA,0xB4,0xB0,0xAB,0xB3,0xAB,0xB3,0xB7,0xA6,0xA5,0xA8,0xA3,0x9C,0x91, + 0x87,0x79,0x65,0x66,0x82,0x7B,0x63,0x73,0x75,0x6D,0x62,0x48,0x43,0x4D,0x52,0x60, + 0x61,0x50,0x4E,0x53,0x53,0x55,0x5C,0x5D,0x5E,0x5C,0x5A,0x5B,0x64,0x75,0x68,0x78, + 0x9D,0x98,0x8D,0x7B,0x6D,0x7F,0x84,0x88,0x9A,0x96,0x9D,0x9C,0x82,0x7B,0x7F,0x7E, + 0x8A,0xA1,0x96,0x89,0x91,0x90,0x98,0x95,0x8F,0x9A,0x95,0x9E,0xA1,0x86,0x77,0x6A, + 0x64,0x75,0x84,0x85,0x7C,0x69,0x63,0x69,0x72,0x6C,0x65,0x65,0x74,0x7A,0x62,0x5D, + 0x49,0x52,0x5C,0x54,0x5F,0x57,0x5E,0x6A,0x6C,0x65,0x5F,0x67,0x6C,0x6D,0x7C,0x7E, + 0x74,0x84,0x80,0x84,0x96,0x94,0xA1,0xA5,0xB3,0xBC,0xBA,0xB6,0xBD,0xC4,0xC3,0xCB, + 0xC2,0xC3,0xD3,0xD7,0xCA,0xCE,0xC6,0xB7,0xBA,0xB2,0xAE,0xAB,0xA2,0x9D,0x95,0x8E, + 0x8A,0x8D,0x85,0x85,0x86,0x78,0x6E,0x68,0x6C,0x61,0x57,0x51,0x4C,0x5F,0x65,0x55, + 0x4D,0x4E,0x48,0x46,0x46,0x3A,0x39,0x42,0x48,0x48,0x52,0x51,0x45,0x45,0x46,0x54, + 0x5F,0x52,0x4D,0x56,0x60,0x62,0x5F,0x63,0x63,0x72,0x82,0x75,0x7D,0x82,0x81,0x85, + 0x7A,0x7E,0x8A,0x93,0x9A,0x93,0x8F,0x91,0x91,0x98,0x94,0xA6,0xBB,0xAF,0xA8,0xB2, + 0xB7,0xAB,0xA0,0x8F,0x9D,0xC3,0xBB,0xB0,0xA3,0x98,0xA6,0xAA,0xA7,0x98,0x93,0x9F, + 0xA0,0x9A,0x91,0x92,0x98,0x8F,0x8E,0x85,0x81,0x78,0x61,0x63,0x5E,0x5D,0x61,0x5C, + 0x70,0x85,0x7C,0x69,0x64,0x5F,0x66,0x69,0x62,0x63,0x66,0x6F,0x68,0x62,0x62,0x61, + 0x6A,0x6D,0x73,0x7A,0x78,0x7D,0x7A,0x7A,0x86,0x84,0x7F,0x8C,0xA1,0xAB,0x9D,0x8E, + 0x82,0x83,0x92,0x92,0x95,0x9F,0x9B,0x9F,0x9A,0x90,0x94,0x8C,0x92,0x91,0x85,0x8D, + 0x84,0x84,0x91,0x82,0x7D,0x7E,0x77,0x91,0xA4,0x8A,0x77,0x74,0x6D,0x82,0x8D,0x74, + 0x72,0x78,0x7D,0x89,0x7B,0x72,0x6D,0x63,0x6E,0x6E,0x67,0x6E,0x6A,0x68,0x68,0x6A, + 0x68,0x67,0x70,0x7C,0x86,0x7E,0x73,0x74,0x7C,0x7E,0x78,0x73,0x73,0x7F,0x98,0x94, + 0x81,0x72,0x6C,0x7D,0x7C,0x76,0x65,0x56,0x5B,0x62,0x6D,0x68,0x61,0x67,0x71,0x7F, + 0x87,0x79,0x6D,0x6B,0x75,0x84,0x7E,0x7F,0x89,0x90,0x92,0x95,0x96,0x93,0x99,0x9F, + 0xA0,0x97,0x95,0x98,0x98,0x9D,0xA0,0x97,0x8E,0xA1,0xAE,0xB7,0xB7,0xA8,0xA7,0xA8, + 0xAB,0xAE,0xA2,0x9B,0xA3,0xA8,0xAB,0xA2,0x8E,0x87,0x92,0xA2,0xA8,0x9D,0x9A,0x93, + 0x8B,0x8E,0x8E,0x7A,0x70,0x7D,0x8B,0x90,0x83,0x6E,0x62,0x65,0x6C,0x69,0x62,0x68, + 0x70,0x70,0x6E,0x5C,0x50,0x51,0x4B,0x4D,0x48,0x47,0x4A,0x4C,0x51,0x4C,0x46,0x41, + 0x46,0x53,0x62,0x6C,0x58,0x48,0x49,0x4E,0x5F,0x67,0x67,0x6D,0x6E,0x77,0x81,0x78, + 0x70,0x70,0x70,0x75,0x7C,0x81,0x7A,0x7A,0x82,0x84,0x87,0x88,0x89,0x8E,0x90,0x8D, + 0x8D,0x86,0x87,0x8F,0x8A,0x8E,0x96,0x93,0x97,0x9D,0x99,0x98,0x93,0x94,0x95,0x89, + 0x85,0x8A,0x8B,0x94,0x9A,0x95,0x97,0x93,0x97,0xA8,0xB1,0xB7,0xB1,0xAB,0xA2,0xA1, + 0x9F,0x98,0xA4,0xAA,0xA3,0xA5,0xA4,0xA5,0xA6,0x9D,0x93,0x88,0x82,0x85,0x84,0x85, + 0x86,0x81,0x83,0x84,0x80,0x85,0x8D,0x8D,0x8B,0x81,0x76,0x76,0x76,0x6C,0x6B,0x72, + 0x6A,0x65,0x61,0x65,0x6F,0x6D,0x66,0x5B,0x5A,0x58,0x5D,0x5C,0x4E,0x53,0x56,0x56, + 0x5D,0x5A,0x5A,0x61,0x60,0x6B,0x6C,0x63,0x64,0x5F,0x5E,0x62,0x62,0x59,0x52,0x55, + 0x60,0x65,0x61,0x65,0x62,0x6A,0x76,0x74,0x6D,0x6D,0x75,0x78,0x82,0x84,0x8A,0x92, + 0x92,0x9B,0x91,0x88,0x8D,0x90,0x95,0x94,0x95,0x90,0x86,0x8C,0x96,0x9C,0x9C,0x93, + 0x8E,0x96,0x9D,0x98,0x92,0x94,0x93,0x9D,0xA1,0x97,0x95,0x9A,0xA2,0xA3,0x9E,0x96, + 0x96,0x9A,0x9C,0x9F,0x94,0x92,0x94,0x93,0x93,0x94,0x95,0x8D,0x8E,0x8F,0x98,0x99, + 0x93,0x98,0x92,0x93,0x9B,0x95,0x91,0x94,0x95,0x92,0x8D,0x8D,0x8A,0x8A,0x8D,0x89, + 0x87,0x85,0x84,0x7E,0x71,0x74,0x72,0x6D,0x6F,0x6E,0x6F,0x67,0x6D,0x70,0x66,0x70, + 0x6F,0x69,0x69,0x63,0x63,0x5D,0x61,0x5E,0x59,0x60,0x60,0x63,0x61,0x62,0x63,0x5F, + 0x62,0x5C,0x61,0x68,0x66,0x66,0x63,0x5F,0x68,0x6E,0x6C,0x6E,0x69,0x6B,0x72,0x76, + 0x77,0x6E,0x6B,0x76,0x78,0x77,0x77,0x71,0x72,0x79,0x7F,0x85,0x85,0x84,0x8A,0x8E, + 0x8F,0x8C,0x8D,0x8F,0x8C,0x92,0x96,0x93,0x91,0x8F,0x94,0x96,0x94,0x96,0x94,0x8E, + 0x97,0x9F,0x99,0x95,0x95,0x97,0x99,0xA1,0x9E,0x95,0x94,0x9A,0x9E,0x9C,0x99,0x97, + 0x96,0x95,0x9B,0x9B,0x95,0x95,0x91,0x93,0x99,0x96,0x95,0x97,0x94,0x99,0x98,0x98, + 0x97,0x97,0x9E,0x9D,0x9D,0x99,0x94,0x95,0x94,0x90,0x8C,0x88,0x84,0x86,0x87,0x84, + 0x84,0x80,0x80,0x85,0x81,0x81,0x7F,0x7B,0x7B,0x72,0x72,0x72,0x70,0x72,0x75,0x77, + 0x74,0x75,0x70,0x6D,0x73,0x6D,0x69,0x68,0x64,0x64,0x60,0x59,0x59,0x5F,0x64,0x60, + 0x5E,0x61,0x64,0x65,0x61,0x5F,0x5C,0x60,0x69,0x68,0x6E,0x6B,0x60,0x67,0x67,0x68, + 0x70,0x69,0x63,0x68,0x6A,0x6D,0x6B,0x65,0x66,0x69,0x70,0x75,0x6D,0x6A,0x6C,0x70, + 0x76,0x76,0x74,0x79,0x7E,0x83,0x83,0x7F,0x82,0x85,0x8D,0x95,0x91,0x91,0x92,0x8C, + 0x94,0x95,0x8D,0x8D,0x8B,0x88,0x8E,0x8E,0x86,0x86,0x88,0x8D,0x95,0x92,0x91,0x94, + 0x94,0x9A,0x9C,0x9B,0x99,0x94,0x9A,0x9E,0x9B,0x9A,0x93,0x90,0x92,0x97,0x9A,0x96, + 0x94,0x92,0x91,0x96,0x91,0x8B,0x8A,0x8A,0x92,0x8E,0x8A,0x88,0x87,0x90,0x8E,0x8C, + 0x91,0x90,0x94,0x8E,0x89,0x8E,0x8E,0x8B,0x8B,0x89,0x8A,0x89,0x80,0x7F,0x83,0x7E, + 0x7A,0x7A,0x77,0x76,0x74,0x6E,0x71,0x74,0x70,0x73,0x75,0x75,0x7B,0x7A,0x7A,0x7F, + 0x7D,0x7C,0x7E,0x7B,0x78,0x79,0x77,0x76,0x78,0x78,0x7A,0x78,0x74,0x7A,0x79,0x75, + 0x77,0x6F,0x70,0x75,0x75,0x76,0x71,0x6E,0x73,0x75,0x75,0x76,0x72,0x75,0x7C,0x7E, + 0x7B,0x79,0x74,0x76,0x7A,0x77,0x75,0x76,0x76,0x78,0x76,0x74,0x73,0x6F,0x6F,0x74, + 0x74,0x74,0x72,0x6F,0x74,0x79,0x79,0x77,0x75,0x74,0x7B,0x81,0x7E,0x7D,0x79,0x7A, + 0x80,0x78,0x7B,0x83,0x7A,0x7B,0x7F,0x76,0x81,0x81,0x74,0x81,0x82,0x80,0x89,0x75, + 0x74,0x85,0x7B,0x80,0x80,0x76,0x86,0x89,0x87,0x89,0x81,0x89,0x87,0x82,0x86,0x82, + 0x7D,0x80,0x93,0x8E,0x84,0x91,0x86,0x8A,0x8D,0x73,0x7D,0x80,0x7C,0x86,0x7B,0x7B, + 0x86,0x89,0x89,0x86,0x87,0x86,0x87,0x83,0x80,0x85,0x80,0x7F,0x83,0x83,0x84,0x75, + 0x7F,0x99,0x8C,0x8C,0x8C,0x83,0x90,0x84,0x75,0x7C,0x7C,0x7D,0x7D,0x7E,0x84,0x8D, + 0x8C,0x81,0x85,0x89,0x87,0x85,0x78,0x7C,0x88,0x84,0x82,0x81,0x7E,0x77,0x7C,0x93, + 0x8C,0x81,0x88,0x83,0x86,0x83,0x6F,0x74,0x7B,0x79,0x80,0x83,0x84,0x8E,0x90,0x86, + 0x88,0x88,0x84,0x81,0x7B,0x80,0x88,0x82,0x80,0x84,0x80,0x73,0x78,0x93,0x8F,0x87, + 0x8B,0x84,0x88,0x81,0x6C,0x74,0x7D,0x79,0x79,0x78,0x7D,0x8A,0x87,0x7A,0x7E,0x82, + 0x81,0x7E,0x78,0x7A,0x81,0x7E,0x7D,0x7C,0x7B,0x74,0x71,0x8D,0x93,0x83,0x87,0x83, + 0x85,0x86,0x71,0x71,0x7D,0x7C,0x79,0x78,0x7B,0x89,0x8A,0x7D,0x83,0x89,0x83,0x7B, + 0x75,0x7C,0x82,0x79,0x78,0x7F,0x7F,0x74,0x78,0x94,0x8D,0x82,0x8C,0x86,0x8C,0x80, + 0x6A,0x79,0x7F,0x75,0x75,0x76,0x7D,0x8C,0x85,0x7D,0x89,0x8B,0x83,0x7B,0x76,0x80, + 0x80,0x76,0x7B,0x80,0x7C,0x6E,0x7C,0x99,0x8B,0x85,0x89,0x84,0x8D,0x7B,0x6E,0x7F, + 0x7B,0x77,0x75,0x77,0x86,0x8A,0x7D,0x7D,0x8A,0x86,0x80,0x7A,0x77,0x81,0x7A,0x74, + 0x7D,0x7D,0x79,0x70,0x83,0x94,0x83,0x86,0x87,0x89,0x91,0x72,0x71,0x85,0x79,0x78, + 0x77,0x79,0x89,0x87,0x7B,0x82,0x89,0x84,0x7F,0x7C,0x82,0x86,0x77,0x77,0x82,0x80, + 0x7C,0x77,0x8B,0x92,0x80,0x8A,0x88,0x8A,0x8C,0x74,0x7E,0x88,0x7D,0x7D,0x79,0x7D, + 0x88,0x80,0x7B,0x84,0x88,0x87,0x85,0x7F,0x86,0x84,0x76,0x80,0x84,0x81,0x80,0x7C, + 0x91,0x8B,0x7D,0x89,0x85,0x8A,0x8A,0x79,0x83,0x87,0x7F,0x80,0x7C,0x7D,0x84,0x7B, + 0x7A,0x83,0x82,0x83,0x82,0x7E,0x82,0x7F,0x7D,0x82,0x7F,0x80,0x80,0x82,0x89,0x81, + 0x81,0x84,0x80,0x86,0x84,0x80,0x87,0x83,0x7E,0x80,0x7E,0x81,0x81,0x7D,0x7E,0x7F, + 0x80,0x80,0x7E,0x7F,0x7F,0x7E,0x80,0x81,0x82,0x82,0x81,0x80,0x82,0x81,0x80,0x81, + 0x81,0x84,0x83,0x80,0x82,0x80,0x7F,0x7F,0x7D,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7E, + 0x7D,0x7C,0x7F,0x81,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x80,0x81,0x81,0x83,0x81, + 0x81,0x81,0x7F,0x81,0x82,0x80,0x81,0x81,0x80,0x81,0x7F,0x7E,0x7F,0x7F,0x7F,0x80, + 0x7E,0x7F,0x80,0x7F,0x7E,0x7E,0x7F,0x80,0x80,0x81,0x81,0x80,0x80,0x7F,0x7E,0x7F, + 0x7F,0x7E,0x7F,0x80,0x80,0x7E,0x7E,0x7E,0x7E,0x7E,0x7D,0x7D,0x7D,0x7C,0x7D,0x7C, + 0x7C,0x7D,0x7C,0x7F,0x81,0x82,0x82,0x82,0x81,0x84,0x84,0x84,0x82,0x80,0x82,0x82, + 0x83,0x82,0x81,0x81,0x81,0x81,0x80,0x7E,0x7E,0x7E,0x7E,0x7E,0x7D,0x7A,0x7A,0x7B, + 0x7C,0x7C,0x7B,0x7D,0x7F,0x7D,0x7F,0x7D,0x7E,0x7E,0x7D,0x80,0x7F,0x80,0x80,0x7F, + 0x7F,0x80,0x80,0x81,0x81,0x7F,0x80,0x80,0x7E,0x7D,0x7D,0x7E,0x7E,0x7E,0x7D,0x7E, + 0x7E,0x7E,0x7E,0x7F,0x7E,0x7D,0x7F,0x7F,0x7F,0x7F,0x7F,0x80,0x81,0x80,0x81,0x81, + 0x81,0x81,0x81,0x82,0x82,0x82,0x81,0x80,0x81,0x7F,0x7F,0x7F,0x7F,0x80,0x7F,0x7E, + 0x7D,0x7E,0x7F,0x7E,0x7F,0x80,0x7F,0x80,0x81,0x80,0x81,0x81,0x7F,0x80,0x80,0x80, + 0x80,0x80,0x7F,0x81,0x81,0x80,0x80,0x80,0x80,0x80,0x7F,0x7E,0x7D,0x7E,0x7F,0x7F, + 0x7E,0x7E,0x7F,0x7F,0x7F,0x7F,0x80,0x81,0x81,0x81,0x80,0x7F,0x7F,0x80,0x80,0x7F, + 0x7F,0x80,0x81,0x83,0x84,0x8C,0x8C,0x92,0x92,0x84,0x7E,0x7A,0x7D,0x7B,0x7A,0x75, + 0x7B,0x66,0x73,0x8F,0x73,0x79,0x7E,0x7C,0x6F,0x72,0x80,0x74,0x7E,0x7D,0x79,0x7B, + 0x7A,0x82,0x77,0x78,0x7B,0x75,0x72,0x77,0x81,0x79,0x85,0x80,0x74,0x82,0x81,0x7A, + 0x82,0x92,0x89,0x8A,0x8E,0x81,0x99,0xA5,0x9A,0xA6,0xA4,0x96,0x9D,0xA8,0x95,0x84, + 0x90,0x97,0x9B,0x98,0x87,0x85,0x80,0x7E,0x7C,0x73,0x78,0x81,0x7C,0x76,0x77,0x76, + 0x78,0x73,0x71,0x74,0x67,0x65,0x66,0x63,0x6D,0x7A,0x79,0x76,0x7A,0x73,0x6D,0x70, + 0x69,0x6C,0x70,0x66,0x66,0x65,0x65,0x72,0x6C,0x68,0x6E,0x64,0x6E,0x77,0x76,0x85, + 0x93,0xA8,0xB3,0xA3,0x9D,0x99,0x87,0x92,0x8D,0x8B,0x9E,0x86,0x89,0x98,0x8B,0x89, + 0x71,0x74,0x8A,0x6A,0x6D,0x80,0x78,0x82,0x7F,0x86,0x97,0x88,0x83,0x90,0x8B,0x83, + 0x7D,0x7B,0x7F,0x7A,0x71,0x7B,0x98,0x8C,0x89,0xA0,0x99,0x89,0x7C,0x7E,0x85,0x79, + 0x79,0x88,0x92,0x8C,0x84,0x95,0xA2,0x95,0x90,0x96,0x91,0x8B,0x8F,0x95,0x8F,0x8D, + 0x8D,0x91,0xA5,0x8E,0x87,0x95,0x87,0x7A,0x70,0x76,0x7D,0x70,0x6F,0x7C,0x7B,0x75, + 0x72,0x7D,0x79,0x62,0x67,0x6C,0x5E,0x5E,0x68,0x6D,0x67,0x63,0x62,0x69,0x76,0x63, + 0x63,0x72,0x5E,0x56,0x56,0x5E,0x66,0x54,0x62,0x6F,0x61,0x69,0x71,0x7B,0x80,0x78, + 0x8D,0x9C,0x9A,0x9E,0x9B,0x9A,0x90,0x8D,0x8F,0x88,0x95,0x91,0x89,0x92,0x84,0x77, + 0x7B,0x77,0x81,0x82,0x7B,0x91,0x89,0x83,0x91,0x8B,0x86,0x83,0x84,0x84,0x83,0x8D, + 0x8C,0x88,0x85,0x86,0x7B,0x87,0xA2,0x8B,0x92,0xA4,0x8F,0x88,0x80,0x82,0x8F,0x80, + 0x89,0xA0,0x99,0x9A,0xA6,0xA4,0x9E,0x92,0x93,0x94,0x90,0x98,0x98,0x97,0x91,0x8E, + 0x96,0x86,0x96,0xA4,0x85,0x8D,0x8C,0x79,0x7A,0x72,0x7A,0x83,0x78,0x80,0x85,0x77, + 0x77,0x73,0x66,0x68,0x61,0x62,0x68,0x66,0x6E,0x68,0x58,0x5A,0x58,0x4A,0x6A,0x6F, + 0x53,0x69,0x64,0x4E,0x50,0x4D,0x5B,0x57,0x52,0x67,0x67,0x64,0x73,0x7A,0x78,0x7C, + 0x87,0x95,0x99,0x9C,0xA3,0x98,0x8B,0x87,0x87,0x7F,0x85,0xA2,0x8A,0x85,0x99,0x81, + 0x76,0x77,0x78,0x82,0x7B,0x80,0x90,0x86,0x84,0x8A,0x81,0x80,0x80,0x7E,0x84,0x85, + 0x87,0x8F,0x86,0x82,0x89,0x7F,0x93,0xA2,0x8B,0x9A,0x9F,0x86,0x8C,0x88,0x8A,0x93, + 0x8B,0x9E,0xA8,0x9D,0xA3,0xA6,0x99,0x93,0x90,0x8F,0x92,0x95,0x9D,0x9E,0x92,0x90, + 0x95,0x84,0x8D,0x9D,0x88,0x8C,0x92,0x80,0x77,0x75,0x78,0x75,0x6D,0x78,0x82,0x6F, + 0x6E,0x78,0x64,0x63,0x63,0x62,0x60,0x59,0x63,0x63,0x59,0x58,0x58,0x4E,0x67,0x67, + 0x53,0x6F,0x64,0x4E,0x57,0x4E,0x4D,0x55,0x51,0x65,0x66,0x5F,0x72,0x76,0x75,0x81, + 0x8B,0x8E,0x94,0x9C,0xA0,0x95,0x8C,0x90,0x88,0x7B,0x98,0x9A,0x81,0x9E,0x94,0x79, + 0x81,0x7B,0x7B,0x78,0x78,0x88,0x86,0x80,0x8A,0x85,0x7D,0x7F,0x84,0x83,0x80,0x8A, + 0x8B,0x87,0x7F,0x89,0x83,0x81,0xA6,0x92,0x90,0xA7,0x90,0x89,0x90,0x8C,0x90,0x90, + 0x98,0xA7,0x9D,0xA0,0xAB,0x9C,0x96,0x9F,0x99,0x97,0x9A,0x9E,0x9E,0x98,0x93,0x95, + 0x87,0x8E,0xA5,0x86,0x92,0xA0,0x7F,0x80,0x81,0x76,0x74,0x70,0x78,0x7B,0x68,0x6F, + 0x73,0x60,0x61,0x65,0x5C,0x58,0x60,0x5F,0x5E,0x56,0x57,0x58,0x4C,0x69,0x69,0x53, + 0x71,0x6C,0x4F,0x59,0x58,0x4D,0x50,0x55,0x61,0x62,0x60,0x70,0x75,0x67,0x7A,0x84, + 0x80,0x8F,0x96,0x99,0x95,0x90,0x93,0x8A,0x85,0xA3,0x95,0x89,0xA2,0x90,0x7A,0x86, + 0x84,0x76,0x77,0x7E,0x88,0x81,0x80,0x90,0x85,0x7B,0x8A,0x84,0x7A,0x84,0x8A,0x8A, + 0x87,0x89,0x8E,0x80,0x8A,0xA5,0x8E,0x94,0xAD,0x90,0x89,0x98,0x90,0x8B,0x8F,0x9A, + 0x9F,0x98,0x9E,0xA9,0x98,0x96,0xA8,0x9D,0x95,0x9F,0xA1,0x9A,0x94,0x98,0x93,0x83, + 0x9F,0xA8,0x88,0x9E,0xA7,0x83,0x84,0x8B,0x77,0x75,0x79,0x7A,0x77,0x6F,0x74,0x75, + 0x62,0x66,0x6A,0x5B,0x5A,0x5F,0x62,0x5B,0x57,0x5E,0x58,0x50,0x6D,0x67,0x54,0x6C, + 0x62,0x4A,0x57,0x56,0x4C,0x4F,0x58,0x61,0x5F,0x5F,0x6D,0x6D,0x66,0x79,0x82,0x7C, + 0x89,0x93,0x97,0x98,0x92,0x98,0x8E,0x8D,0xA9,0x94,0x8F,0xA7,0x8F,0x7F,0x8B,0x81, + 0x76,0x79,0x7F,0x84,0x80,0x80,0x8C,0x83,0x77,0x87,0x86,0x7B,0x81,0x89,0x87,0x83, + 0x85,0x89,0x7E,0x8D,0xA7,0x8D,0x97,0xAA,0x8D,0x87,0x94,0x8D,0x8A,0x8F,0x99,0x9F, + 0x98,0x9C,0xA6,0x98,0x93,0xA0,0x9B,0x97,0x9B,0x9D,0x9D,0x97,0x93,0x97,0x88,0x94, + 0xAB,0x91,0x96,0xA5,0x88,0x80,0x8A,0x7D,0x76,0x79,0x7B,0x7E,0x74,0x6F,0x78,0x6B, + 0x63,0x6A,0x67,0x62,0x63,0x65,0x60,0x57,0x55,0x5B,0x4D,0x5B,0x6F,0x57,0x61,0x70, + 0x54,0x4D,0x58,0x50,0x4E,0x52,0x59,0x62,0x5C,0x60,0x6E,0x69,0x68,0x77,0x7D,0x82, + 0x88,0x93,0x99,0x93,0x91,0x96,0x88,0x95,0xAB,0x8D,0x96,0xA3,0x83,0x7B,0x84,0x7C, + 0x7B,0x7C,0x7E,0x8B,0x80,0x7B,0x88,0x80,0x77,0x7F,0x83,0x80,0x81,0x85,0x89,0x7E, + 0x7E,0x87,0x7B,0x90,0xA7,0x8C,0x99,0xAA,0x8C,0x89,0x95,0x91,0x94,0x91,0x96,0xA5, + 0x98,0x91,0xA1,0x9D,0x94,0x98,0x9F,0x9E,0x99,0x9C,0x9F,0x95,0x90,0x95,0x8A,0x9C, + 0xAF,0x94,0x9B,0xAA,0x8B,0x7E,0x84,0x7F,0x80,0x7B,0x79,0x83,0x77,0x69,0x73,0x70, + 0x64,0x62,0x68,0x6B,0x62,0x61,0x66,0x5E,0x56,0x56,0x51,0x62,0x75,0x5A,0x5F,0x6F, + 0x56,0x4A,0x4F,0x53,0x59,0x54,0x58,0x6A,0x64,0x5F,0x6A,0x72,0x74,0x74,0x82,0x90, + 0x92,0x93,0x96,0x96,0x95,0x92,0x8B,0xA0,0xB3,0x95,0x95,0x9D,0x8B,0x7D,0x76,0x7F, + 0x87,0x7C,0x77,0x85,0x82,0x78,0x79,0x7C,0x7F,0x7C,0x7B,0x80,0x82,0x7E,0x7D,0x7F, + 0x82,0x83,0x7A,0x90,0xA5,0x8F,0x8E,0x99,0x92,0x8A,0x87,0x92,0x9D,0x99,0x96,0x9C, + 0x9E,0x9B,0x94,0x93,0x9D,0x9B,0x97,0x98,0x9C,0x9C,0x95,0x94,0x94,0x93,0x8F,0xA2, + 0xAE,0x98,0x98,0x98,0x8B,0x84,0x7A,0x7E,0x86,0x80,0x78,0x76,0x78,0x77,0x6E,0x69, + 0x6B,0x70,0x6D,0x64,0x65,0x64,0x5F,0x5A,0x57,0x57,0x57,0x70,0x75,0x60,0x64,0x60, + 0x53,0x4F,0x4D,0x59,0x61,0x5F,0x5D,0x5D,0x65,0x67,0x65,0x69,0x74,0x83,0x81,0x83, + 0x8E,0x90,0x91,0x91,0x90,0x8C,0x97,0xB0,0xA4,0x92,0x92,0x8E,0x87,0x7D,0x78,0x80, + 0x8A,0x85,0x78,0x77,0x7D,0x7C,0x76,0x72,0x79,0x83,0x7C,0x76,0x78,0x7C,0x7B,0x78, + 0x77,0x76,0x8C,0xA1,0x97,0x8B,0x89,0x8C,0x8E,0x87,0x85,0x91,0x9F,0x9F,0x96,0x93, + 0x98,0x9D,0x97,0x90,0x98,0xA3,0x9E,0x9A,0x95,0x96,0x96,0x94,0x90,0x8F,0xA6,0xB1, + 0xA1,0x94,0x8B,0x8A,0x8D,0x81,0x7A,0x82,0x8A,0x85,0x79,0x74,0x74,0x76,0x6E,0x65, + 0x6A,0x6E,0x6D,0x68,0x5F,0x5D,0x5C,0x59,0x52,0x58,0x6F,0x75,0x6A,0x5D,0x53,0x57, + 0x58,0x53,0x52,0x59,0x66,0x67,0x62,0x5F,0x63,0x6B,0x6D,0x70,0x79,0x80,0x88,0x8C, + 0x8D,0x8E,0x8D,0x8F,0x8D,0x9D,0xAF,0xAA,0xA2,0x93,0x88,0x8A,0x85,0x80,0x7E,0x7F, + 0x85,0x84,0x7C,0x76,0x76,0x77,0x74,0x76,0x79,0x7A,0x7E,0x7A,0x78,0x76,0x74,0x73, + 0x75,0x8D,0x9D,0x98,0x90,0x83,0x7F,0x88,0x88,0x88,0x8B,0x90,0x97,0x9C,0x99,0x94, + 0x90,0x92,0x96,0x97,0x99,0x9B,0x9A,0x9A,0x9A,0x93,0x91,0x8C,0x91,0xA7,0xAF,0xA8, + 0x9C,0x8B,0x83,0x88,0x85,0x83,0x84,0x80,0x81,0x83,0x80,0x79,0x72,0x6E,0x6F,0x70, + 0x6F,0x6D,0x66,0x66,0x64,0x5E,0x5C,0x56,0x5A,0x6E,0x73,0x6B,0x65,0x57,0x50,0x56, + 0x54,0x56,0x59,0x56,0x5D,0x62,0x65,0x69,0x68,0x6A,0x6F,0x77,0x7D,0x81,0x87,0x8B, + 0x8E,0x91,0x94,0x93,0x92,0x9B,0x9E,0x95,0x97,0x92,0x88,0x8C,0x87,0x82,0x83,0x7B, + 0x79,0x7A,0x77,0x77,0x73,0x70,0x70,0x70,0x73,0x74,0x74,0x75,0x76,0x79,0x7B,0x79, + 0x7A,0x81,0x87,0x86,0x87,0x8B,0x88,0x8D,0x8F,0x8C,0x92,0x8F,0x8E,0x93,0x91,0x91, + 0x93,0x90,0x90,0x91,0x94,0x97,0x97,0x99,0x96,0x9A,0x9C,0x97,0x96,0x97,0x9C,0x9B, + 0x95,0x96,0x90,0x8E,0x90,0x88,0x89,0x85,0x7E,0x7F,0x7B,0x75,0x75,0x70,0x6E,0x6E, + 0x6D,0x6C,0x6A,0x68,0x66,0x66,0x68,0x65,0x63,0x60,0x63,0x69,0x63,0x63,0x63,0x5F, + 0x66,0x65,0x63,0x6A,0x66,0x64,0x6A,0x69,0x6D,0x70,0x70,0x77,0x7E,0x83,0x89,0x8C, + 0x8F,0x92,0x96,0x98,0x97,0x94,0x92,0x98,0x96,0x8F,0x91,0x8B,0x85,0x8A,0x83,0x7E, + 0x80,0x76,0x72,0x74,0x6E,0x70,0x70,0x6C,0x70,0x71,0x73,0x77,0x77,0x79,0x7D,0x7F, + 0x82,0x82,0x84,0x84,0x88,0x8C,0x8C,0x8F,0x8F,0x8D,0x94,0x95,0x93,0x95,0x90,0x90, + 0x94,0x8F,0x91,0x92,0x8E,0x92,0x95,0x93,0x97,0x95,0x95,0x99,0x98,0x98,0x9A,0x99, + 0x96,0x93,0x94,0x93,0x8D,0x8C,0x8B,0x87,0x89,0x84,0x80,0x80,0x7B,0x79,0x77,0x72, + 0x73,0x6F,0x6A,0x6C,0x67,0x66,0x6A,0x65,0x66,0x69,0x68,0x69,0x68,0x68,0x69,0x67, + 0x6A,0x6D,0x6B,0x6F,0x70,0x6D,0x73,0x75,0x76,0x7B,0x7C,0x7E,0x84,0x85,0x87,0x8A, + 0x89,0x8B,0x8B,0x8A,0x8A,0x88,0x8C,0x8D,0x87,0x89,0x8B,0x86,0x86,0x86,0x83,0x84, + 0x84,0x82,0x80,0x80,0x7D,0x7C,0x7D,0x7C,0x7C,0x7D,0x7B,0x7A,0x7B,0x79,0x79,0x7B, + 0x7B,0x7D,0x7F,0x80,0x80,0x82,0x85,0x86,0x89,0x89,0x8A,0x8D,0x8E,0x8D,0x8E,0x8E, + 0x8E,0x8F,0x8E,0x8F,0x8F,0x8F,0x8F,0x8D,0x8E,0x8E,0x8B,0x8C,0x8C,0x8B,0x8B,0x8B, + 0x88,0x86,0x86,0x84,0x85,0x87,0x84,0x85,0x86,0x84,0x83,0x82,0x81,0x82,0x81,0x80, + 0x7E,0x7D,0x7D,0x7B,0x7A,0x7A,0x79,0x79,0x79,0x78,0x77,0x76,0x76,0x75,0x74,0x74, + 0x75,0x76,0x78,0x78,0x79,0x79,0x7B,0x7B,0x7C,0x7F,0x80,0x81,0x83,0x84,0x84,0x85, + 0x84,0x85,0x85,0x85,0x84,0x84,0x84,0x82,0x80,0x80,0x7F,0x7D,0x7D,0x7C,0x7B,0x7B, + 0x7A,0x79,0x79,0x77,0x78,0x79,0x77,0x77,0x78,0x78,0x79,0x77,0x77,0x78,0x79,0x7B, + 0x7B,0x7C,0x7E,0x7E,0x7E,0x80,0x80,0x80,0x82,0x83,0x83,0x85,0x85,0x85,0x85,0x84, + 0x84,0x86,0x87,0x85,0x86,0x86,0x86,0x85,0x84,0x84,0x84,0x85,0x85,0x86,0x88,0x87, + 0x85,0x86,0x84,0x85,0x85,0x84,0x85,0x83,0x84,0x84,0x82,0x82,0x82,0x81,0x82,0x83, + 0x82,0x81,0x81,0x80,0x7E,0x7F,0x7E,0x7D,0x7E,0x7E,0x7D,0x7D,0x7D,0x7C,0x7D,0x7C, + 0x7C,0x7D,0x7E,0x7E,0x7E,0x7E,0x7D,0x7F,0x7F,0x7E,0x80,0x82,0x83,0x84,0x83,0x83, + 0x82,0x82,0x84,0x83,0x82,0x83,0x83,0x82,0x81,0x80,0x7F,0x80,0x7F,0x7F,0x7F,0x7F, + 0x7D,0x7C,0x7C,0x7B,0x7B,0x7B,0x7A,0x7A,0x7A,0x7A,0x7A,0x7B,0x7A,0x78,0x7B,0x7C, + 0x7A,0x7C,0x7D,0x7C,0x7C,0x7D,0x7C,0x7C,0x7E,0x7E,0x7E,0x7F,0x80,0x7F,0x80,0x81, + 0x81,0x81,0x83,0x83,0x82,0x80,0x84,0x84,0x83,0x83,0x82,0x83,0x83,0x94,0x85,0x87, + 0x85,0x61,0x7D,0x7F,0x68,0x66,0x76,0x7E,0x85,0x8B,0x8A,0x8B,0x85,0x93,0xA1,0x9C, + 0x98,0x91,0x8D,0x8A,0x83,0x81,0x7C,0x70,0x66,0x5B,0x55,0x54,0x51,0x50,0x53,0x59, + 0x60,0x67,0x6B,0x71,0x75,0x77,0x7C,0x81,0x83,0x85,0x89,0x8C,0x8C,0x91,0x9E,0xA7, + 0xB0,0xB8,0xB8,0xB9,0xB6,0xAE,0xAA,0xA2,0x9A,0x96,0x8F,0x8A,0x86,0x81,0x7F,0x79, + 0x76,0x73,0x6F,0x6D,0x69,0x68,0x65,0x63,0x60,0x57,0x51,0x49,0x46,0x46,0x45,0x47, + 0x4D,0x54,0x5B,0x62,0x67,0x6C,0x72,0x75,0x7A,0x81,0x83,0x85,0x89,0x8D,0x8D,0x91, + 0x94,0x9B,0xA8,0xAE,0xB2,0xB7,0xB9,0xB7,0xB5,0xB3,0xAF,0xAC,0xA4,0x9F,0x9B,0x91, + 0x8E,0x89,0x86,0x83,0x7E,0x7D,0x78,0x6F,0x69,0x61,0x59,0x58,0x52,0x4E,0x51,0x50, + 0x52,0x55,0x5B,0x63,0x68,0x6D,0x70,0x76,0x7E,0x86,0x8A,0x8F,0x93,0x94,0x96,0x97, + 0x9D,0x9F,0x9C,0xA0,0xA3,0x9A,0x98,0xA1,0xA7,0xAA,0xA7,0xA0,0x98,0x92,0x8E,0x88, + 0x83,0x7A,0x7B,0x7A,0x77,0x7C,0x78,0x74,0x75,0x76,0x73,0x72,0x6F,0x6E,0x6B,0x65, + 0x65,0x62,0x5F,0x61,0x5F,0x5D,0x5B,0x5A,0x5F,0x5C,0x60,0x65,0x62,0x67,0x69,0x6E, + 0x75,0x76,0x79,0x7F,0x7F,0x85,0x8B,0x8D,0x93,0x9A,0x9E,0xA6,0xB0,0xB0,0xB5,0xBA, + 0xBB,0xC0,0xC0,0xBE,0xBC,0xBB,0xB6,0xB1,0xAC,0xA2,0x9D,0x96,0x8F,0x8B,0x84,0x7F, + 0x7B,0x74,0x70,0x6B,0x64,0x61,0x61,0x5E,0x58,0x54,0x52,0x4E,0x4C,0x4D,0x4A,0x4E, + 0x4E,0x49,0x4B,0x50,0x55,0x5A,0x61,0x65,0x6A,0x70,0x70,0x76,0x7C,0x7B,0x81,0x8A, + 0x91,0x94,0x96,0x9C,0xA3,0xAA,0xAC,0xB4,0xBC,0xBB,0xBE,0xC0,0xC0,0xC3,0xC2,0xBF, + 0xC1,0xBE,0xBD,0xBB,0xB5,0xB3,0xAE,0xA5,0xA0,0x9C,0x95,0x8B,0x83,0x7A,0x77,0x72, + 0x6A,0x67,0x5D,0x5F,0x64,0x57,0x56,0x54,0x4F,0x54,0x46,0x3C,0x44,0x44,0x42,0x43, + 0x45,0x4F,0x55,0x55,0x57,0x5C,0x60,0x60,0x5B,0x5D,0x68,0x68,0x67,0x6E,0x6F,0x82, + 0x92,0x8A,0x8F,0x96,0x95,0x9B,0x91,0x91,0x9F,0xA0,0xA2,0xA8,0xAA,0xB2,0xB5,0xAC, + 0xAD,0xB2,0xAD,0xAA,0xA4,0xA6,0xAE,0xA6,0xA3,0xA1,0x9E,0xAF,0xAD,0x9D,0xA4,0xA4, + 0x9A,0x92,0x83,0x88,0x8E,0x7C,0x7B,0x80,0x7D,0x80,0x75,0x67,0x6D,0x67,0x5A,0x5A, + 0x58,0x5A,0x58,0x52,0x54,0x54,0x58,0x62,0x5D,0x5B,0x62,0x60,0x5C,0x59,0x56,0x5E, + 0x5F,0x5A,0x62,0x67,0x6C,0x72,0x6A,0x70,0x7A,0x74,0x76,0x7E,0x81,0x87,0x88,0x8A, + 0x93,0x8F,0x9B,0xAC,0xA2,0xA8,0xAF,0xA9,0xAB,0x9F,0x9D,0xAF,0xA8,0xA2,0xAC,0xAC, + 0xB3,0xB0,0xA2,0xA7,0xA6,0x97,0x95,0x94,0x93,0x90,0x85,0x84,0x84,0x73,0x7D,0x8A, + 0x75,0x77,0x78,0x6E,0x6A,0x55,0x56,0x62,0x54,0x4F,0x59,0x59,0x5D,0x56,0x51,0x5F, + 0x5A,0x50,0x58,0x5E,0x60,0x61,0x61,0x68,0x69,0x60,0x77,0x86,0x77,0x80,0x85,0x85, + 0x85,0x72,0x7D,0x89,0x7C,0x80,0x8C,0x90,0x94,0x8C,0x8C,0x96,0x8C,0x85,0x8B,0x8C, + 0x8B,0x89,0x89,0x8D,0x89,0x80,0x96,0x9F,0x8F,0x98,0x9B,0x98,0x91,0x81,0x8E,0x94, + 0x84,0x89,0x95,0x96,0x93,0x8A,0x8B,0x8F,0x83,0x7C,0x82,0x82,0x81,0x81,0x82,0x84, + 0x7E,0x77,0x8B,0x93,0x80,0x89,0x8C,0x84,0x7B,0x6C,0x7B,0x7E,0x6C,0x73,0x7E,0x7F, + 0x7A,0x76,0x7A,0x7A,0x6B,0x69,0x6D,0x68,0x67,0x68,0x6B,0x69,0x64,0x62,0x77,0x76, + 0x64,0x71,0x74,0x69,0x5E,0x5A,0x6C,0x67,0x5B,0x6D,0x7A,0x77,0x78,0x7E,0x87,0x84, + 0x7B,0x83,0x87,0x84,0x84,0x8D,0x8F,0x8C,0x89,0x8B,0xA6,0x9A,0x8C,0xA2,0x9D,0x8F, + 0x84,0x88,0x93,0x84,0x82,0x95,0x9A,0x93,0x93,0x9B,0x9D,0x90,0x8E,0x95,0x8F,0x89, + 0x90,0x95,0x90,0x8F,0x89,0x98,0xA8,0x8C,0x93,0xA3,0x91,0x85,0x7E,0x86,0x81,0x6D, + 0x79,0x84,0x78,0x75,0x7C,0x7F,0x75,0x6C,0x71,0x6E,0x62,0x62,0x69,0x64,0x5E,0x5E, + 0x59,0x71,0x6F,0x5A,0x72,0x72,0x62,0x5F,0x60,0x6A,0x5B,0x54,0x6C,0x6B,0x63,0x6E, + 0x79,0x78,0x6F,0x70,0x79,0x6E,0x69,0x73,0x74,0x70,0x74,0x71,0x77,0x92,0x7F,0x7D, + 0x95,0x85,0x7D,0x7B,0x7F,0x82,0x70,0x78,0x88,0x7D,0x7D,0x8B,0x91,0x8D,0x89,0x91, + 0x91,0x85,0x8A,0x92,0x8D,0x8D,0x94,0x8B,0x9D,0xAD,0x94,0xA5,0xB1,0x9D,0x9B,0x98, + 0x9D,0x94,0x86,0x98,0x9C,0x90,0x97,0xA1,0xA0,0x95,0x96,0x9D,0x90,0x88,0x90,0x8E, + 0x88,0x8B,0x8B,0x84,0x9A,0x97,0x87,0x9D,0x99,0x89,0x86,0x85,0x85,0x76,0x73,0x82, + 0x7D,0x74,0x7E,0x84,0x7A,0x73,0x7A,0x77,0x6A,0x6B,0x6F,0x68,0x62,0x67,0x5F,0x62, + 0x76,0x63,0x69,0x78,0x66,0x63,0x63,0x62,0x5D,0x55,0x60,0x65,0x5F,0x63,0x6F,0x6F, + 0x65,0x6B,0x73,0x67,0x65,0x6E,0x6D,0x69,0x69,0x6F,0x68,0x78,0x81,0x73,0x87,0x86, + 0x78,0x7C,0x7A,0x78,0x72,0x71,0x7D,0x7C,0x78,0x82,0x89,0x83,0x81,0x88,0x87,0x7F, + 0x83,0x88,0x87,0x83,0x87,0x8A,0x84,0x9C,0x9B,0x90,0xA9,0xA0,0x94,0x99,0x96,0x94, + 0x8B,0x8F,0x9B,0x95,0x95,0xA3,0xA4,0x9B,0x9E,0xA4,0x9E,0x99,0x9F,0x9F,0x9C,0x99, + 0x9A,0x98,0x92,0xAC,0xA5,0x99,0xB3,0xA5,0x9A,0x9B,0x98,0x95,0x89,0x8E,0x97,0x8C, + 0x8B,0x96,0x94,0x89,0x8C,0x90,0x87,0x80,0x86,0x84,0x7D,0x7A,0x7B,0x77,0x6D,0x86, + 0x80,0x71,0x89,0x7D,0x6F,0x71,0x6E,0x6A,0x5F,0x63,0x6B,0x62,0x61,0x6C,0x6B,0x61, + 0x65,0x68,0x60,0x5A,0x60,0x61,0x59,0x5A,0x5C,0x58,0x51,0x69,0x69,0x58,0x73,0x6C, + 0x5C,0x62,0x65,0x60,0x57,0x5E,0x68,0x60,0x60,0x6E,0x6F,0x67,0x6E,0x73,0x6F,0x6B, + 0x72,0x76,0x6F,0x71,0x76,0x74,0x6C,0x85,0x8D,0x78,0x93,0x94,0x80,0x86,0x8B,0x86, + 0x7E,0x84,0x8E,0x89,0x85,0x95,0x97,0x8D,0x95,0x9B,0x94,0x90,0x99,0x9B,0x91,0x95, + 0x99,0x96,0x8E,0xA5,0xB0,0x9A,0xB2,0xB6,0xA0,0xA4,0xA9,0xA2,0x99,0x9D,0xA6,0x9F, + 0x98,0xA6,0xA6,0x9A,0xA1,0xA5,0x9C,0x98,0x9D,0x9C,0x91,0x93,0x94,0x8D,0x83,0x98, + 0xA1,0x87,0x9C,0xA0,0x86,0x88,0x8D,0x84,0x78,0x7C,0x84,0x7C,0x75,0x82,0x81,0x75, + 0x7C,0x7F,0x76,0x73,0x78,0x76,0x6D,0x70,0x70,0x6A,0x61,0x74,0x81,0x66,0x7A,0x85, + 0x6A,0x6B,0x74,0x6B,0x5F,0x63,0x6D,0x66,0x61,0x6E,0x6F,0x64,0x6A,0x70,0x64,0x62, + 0x67,0x65,0x5E,0x60,0x61,0x5C,0x52,0x61,0x71,0x57,0x6B,0x78,0x5D,0x60,0x6A,0x62, + 0x58,0x5E,0x67,0x62,0x5F,0x6D,0x6F,0x66,0x6F,0x75,0x6D,0x70,0x77,0x77,0x73,0x79, + 0x7A,0x77,0x71,0x81,0x91,0x79,0x8F,0x9C,0x81,0x89,0x92,0x88,0x80,0x87,0x8E,0x87, + 0x85,0x93,0x92,0x88,0x93,0x96,0x8D,0x90,0x94,0x93,0x8F,0x94,0x93,0x8F,0x88,0x95, + 0xA5,0x8D,0xA2,0xAD,0x90,0x98,0xA2,0x93,0x8D,0x96,0x97,0x91,0x8F,0x99,0x98,0x8D, + 0x98,0x9A,0x8F,0x93,0x96,0x90,0x8C,0x8F,0x8B,0x87,0x7F,0x8E,0x98,0x7F,0x97,0x9A, + 0x7C,0x89,0x8F,0x7B,0x79,0x83,0x7F,0x79,0x7C,0x84,0x7F,0x7A,0x87,0x84,0x7A,0x82, + 0x83,0x7B,0x7B,0x7E,0x78,0x75,0x71,0x82,0x86,0x72,0x8D,0x88,0x6E,0x7F,0x81,0x6C, + 0x6F,0x77,0x6F,0x6C,0x72,0x75,0x6D,0x6F,0x79,0x71,0x6C,0x75,0x72,0x6C,0x6F,0x6F, + 0x6B,0x69,0x68,0x7E,0x76,0x70,0x8F,0x7A,0x6D,0x85,0x78,0x69,0x76,0x77,0x70,0x73, + 0x7B,0x7B,0x74,0x7C,0x81,0x77,0x7C,0x81,0x7B,0x79,0x7C,0x78,0x76,0x72,0x76,0x8B, + 0x79,0x81,0x97,0x7A,0x7C,0x8E,0x79,0x73,0x82,0x79,0x74,0x7E,0x7F,0x7A,0x7C,0x83, + 0x80,0x7B,0x82,0x81,0x7B,0x7E,0x7E,0x79,0x7A,0x75,0x7F,0x8B,0x7A,0x8E,0x95,0x7A, + 0x86,0x8E,0x75,0x7B,0x86,0x76,0x79,0x84,0x7D,0x7C,0x83,0x84,0x81,0x83,0x87,0x82, + 0x81,0x83,0x7F,0x7E,0x7E,0x78,0x88,0x8B,0x80,0x98,0x93,0x80,0x92,0x8F,0x7A,0x88, + 0x89,0x79,0x84,0x89,0x7F,0x85,0x8A,0x87,0x87,0x8A,0x89,0x87,0x87,0x86,0x81,0x81, + 0x7E,0x7C,0x8A,0x86,0x83,0x95,0x8C,0x80,0x90,0x88,0x79,0x87,0x83,0x76,0x84,0x83, + 0x79,0x82,0x85,0x7F,0x85,0x86,0x84,0x86,0x85,0x83,0x80,0x7F,0x7E,0x7F,0x87,0x85, + 0x86,0x90,0x89,0x82,0x8D,0x85,0x7B,0x87,0x80,0x76,0x83,0x80,0x78,0x81,0x80,0x7B, + 0x81,0x81,0x7F,0x83,0x80,0x7E,0x7E,0x7C,0x7A,0x7B,0x80,0x81,0x83,0x8A,0x83,0x80, + 0x89,0x82,0x7B,0x86,0x80,0x78,0x84,0x80,0x7A,0x83,0x81,0x7F,0x85,0x83,0x84,0x86, + 0x83,0x85,0x84,0x7E,0x7F,0x80,0x83,0x84,0x84,0x8A,0x87,0x82,0x88,0x83,0x7D,0x84, + 0x7E,0x79,0x80,0x7B,0x79,0x80,0x7B,0x7B,0x81,0x7D,0x80,0x82,0x7E,0x7F,0x7E,0x7A, + 0x79,0x79,0x7D,0x7F,0x7E,0x84,0x81,0x7D,0x83,0x7D,0x79,0x80,0x79,0x76,0x7D,0x76, + 0x77,0x7E,0x78,0x7B,0x81,0x7D,0x81,0x83,0x81,0x83,0x80,0x7D,0x7E,0x7C,0x82,0x83, + 0x81,0x88,0x85,0x81,0x87,0x80,0x7D,0x83,0x7A,0x79,0x80,0x77,0x79,0x7F,0x78,0x7B, + 0x80,0x7C,0x80,0x82,0x7F,0x81,0x7F,0x7C,0x7E,0x7B,0x80,0x83,0x81,0x87,0x85,0x81, + 0x87,0x81,0x7E,0x84,0x7B,0x7A,0x80,0x78,0x79,0x7F,0x78,0x7C,0x80,0x7D,0x81,0x82, + 0x7F,0x82,0x7F,0x7C,0x7D,0x7B,0x7F,0x82,0x80,0x86,0x85,0x81,0x85,0x80,0x7D,0x82, + 0x7A,0x79,0x7F,0x77,0x79,0x7F,0x79,0x7C,0x81,0x7E,0x83,0x84,0x81,0x84,0x81,0x7D, + 0x80,0x7D,0x81,0x85,0x82,0x88,0x88,0x83,0x87,0x83,0x7F,0x84,0x7D,0x7B,0x80,0x79, + 0x79,0x7F,0x7A,0x7B,0x80,0x7E,0x81,0x83,0x81,0x84,0x82,0x7F,0x80,0x7E,0x82,0x87, + 0x83,0x88,0x89,0x85,0x88,0x85,0x82,0x86,0x80,0x7D,0x82,0x7A,0x7A,0x80,0x7A,0x7B, + 0x81,0x7E,0x80,0x82,0x7F,0x82,0x80,0x7C,0x7E,0x7B,0x7F,0x83,0x80,0x84,0x86,0x81, + 0x85,0x82,0x7E,0x83,0x7E,0x7A,0x7E,0x79,0x78,0x7E,0x79,0x7A,0x81,0x7E,0x80,0x83, + 0x81,0x83,0x82,0x7E,0x80,0x7E,0x80,0x84,0x80,0x84,0x87,0x82,0x85,0x84,0x7F,0x83, + 0x80,0x7B,0x7E,0x7A,0x78,0x7F,0x7B,0x7B,0x82,0x80,0x81,0x85,0x83,0x84,0x84,0x81, + 0x82,0x80,0x82,0x86,0x83,0x85,0x89,0x84,0x85,0x86,0x81,0x83,0x82,0x7C,0x7D,0x7B, + 0x77,0x7B,0x78,0x77,0x7D,0x7B,0x7B,0x81,0x7F,0x80,0x82,0x7E,0x7F,0x7F,0x80,0x84, + 0x82,0x83,0x88,0x84,0x84,0x87,0x82,0x83,0x85,0x7F,0x7E,0x7F,0x7A,0x7C,0x7C,0x79, + 0x7E,0x7E,0x7C,0x81,0x81,0x7F,0x81,0x7F,0x7E,0x7E,0x7E,0x82,0x80,0x80,0x83,0x81, + 0x80,0x84,0x80,0x7F,0x83,0x7E,0x7C,0x7F,0x7B,0x7B,0x7E,0x7C,0x7F,0x81,0x80,0x83, + 0x85,0x83,0x85,0x85,0x83,0x83,0x83,0x86,0x86,0x83,0x85,0x84,0x82,0x84,0x83,0x81, + 0x83,0x81,0x7D,0x7E,0x7C,0x79,0x7B,0x7B,0x79,0x7C,0x7C,0x7C,0x7F,0x7F,0x7F,0x80, + 0x7F,0x80,0x81,0x81,0x83,0x83,0x82,0x83,0x82,0x81,0x82,0x82,0x81,0x82,0x80,0x7D, + 0x7D,0x7A,0x79,0x7C,0x7A,0x79,0x7D,0x7C,0x7C,0x7F,0x7F,0x7E,0x82,0x80,0x81,0x85, + 0x8F,0x87,0x69,0x77,0x8D,0x8E,0x78,0x88,0x97,0x6F,0x79,0x87,0x7F,0x81,0x87,0x90, + 0x7C,0x7A,0x88,0x88,0x7A,0x79,0x8B,0x82,0x76,0x77,0x7D,0x82,0x86,0x85,0x8A,0x82, + 0x73,0x81,0x80,0x83,0x8B,0x8C,0x8E,0x7E,0x7D,0x76,0x72,0x7F,0x7E,0x84,0x78,0x74, + 0x80,0x6D,0x79,0x93,0x7A,0x76,0x88,0x7B,0x7D,0x75,0x78,0x89,0x7B,0x7B,0x81,0x7B, + 0x7A,0x7B,0x80,0x7E,0x76,0x7C,0x85,0x81,0x7A,0x76,0x7A,0x83,0x84,0x86,0x82,0x7F, + 0x7F,0x7F,0x7E,0x76,0x80,0x91,0x90,0x8F,0x95,0x88,0x87,0x99,0x9F,0x9E,0x9D,0x9E, + 0x9F,0xA0,0xA0,0x9A,0x89,0x83,0x8E,0x92,0x92,0x95,0x87,0x79,0x78,0x72,0x6E,0x66, + 0x64,0x73,0x79,0x78,0x73,0x69,0x6B,0x71,0x72,0x72,0x66,0x63,0x6B,0x69,0x6A,0x68, + 0x63,0x66,0x68,0x69,0x69,0x65,0x67,0x70,0x6F,0x67,0x63,0x6A,0x79,0x7B,0x6E,0x70, + 0x70,0x6C,0x72,0x73,0x74,0x77,0x74,0x75,0x78,0x80,0x88,0x8E,0x97,0xA7,0xB6,0xB4, + 0xA8,0xA3,0xA2,0x9E,0x9C,0x9C,0x96,0x8F,0x93,0x90,0x8B,0x8D,0x8D,0x8C,0x8A,0x8E, + 0x90,0x8B,0x8D,0x8F,0x90,0x8C,0x86,0x85,0x89,0x8A,0x87,0x84,0x81,0x81,0x84,0x8C, + 0x8A,0x85,0x83,0x7F,0x81,0x82,0x81,0x7C,0x7D,0x84,0x82,0x7D,0x7C,0x7B,0x79,0x7A, + 0x7F,0x80,0x87,0x91,0x8F,0x8A,0x86,0x82,0x8B,0x8F,0x8F,0x97,0x97,0x94,0x90,0x90, + 0x96,0x92,0x8E,0x8D,0x86,0x83,0x83,0x7E,0x74,0x73,0x6E,0x6A,0x6C,0x68,0x68,0x6D, + 0x6A,0x66,0x63,0x61,0x65,0x5C,0x5D,0x64,0x62,0x61,0x5D,0x5D,0x59,0x58,0x5E,0x5E, + 0x5F,0x63,0x67,0x65,0x64,0x6A,0x6D,0x6D,0x6B,0x69,0x6C,0x6A,0x69,0x6B,0x6E,0x71, + 0x6F,0x6D,0x70,0x73,0x74,0x75,0x7E,0x92,0x95,0x95,0xA5,0xB0,0xB2,0xAE,0xAB,0x9F, + 0x9D,0x9F,0x96,0x95,0x9A,0x9C,0x98,0x9C,0x9A,0x9A,0xA0,0x9D,0x96,0x8D,0x88,0x88, + 0x8A,0x86,0x81,0x88,0x9C,0x9C,0x8F,0x8D,0x8B,0x89,0x8C,0x7C,0x6B,0x74,0x7C,0x7B, + 0x81,0x82,0x84,0x93,0x90,0x88,0x87,0x7F,0x7D,0x7F,0x7D,0x78,0x7E,0x81,0x7F,0x8A, + 0x9A,0x9E,0x99,0x9B,0x99,0x94,0x94,0x8E,0x83,0x89,0x8B,0x8E,0x96,0x95,0x96,0x94, + 0x90,0x88,0x82,0x79,0x73,0x7A,0x76,0x75,0x73,0x6D,0x68,0x6F,0x82,0x7B,0x71,0x6F, + 0x64,0x60,0x5F,0x53,0x4F,0x56,0x59,0x59,0x5F,0x55,0x52,0x5C,0x55,0x59,0x5A,0x59, + 0x61,0x6B,0x6B,0x62,0x5F,0x5C,0x64,0x72,0x7B,0x75,0x70,0x6E,0x69,0x67,0x67,0x62, + 0x65,0x72,0x78,0x85,0x8A,0x8B,0x8E,0x93,0x99,0xA0,0xA3,0xA1,0xAC,0xAF,0xAC,0xA1, + 0x97,0x99,0x9F,0xAE,0xB8,0xAA,0x9D,0x97,0x89,0x87,0x85,0x7F,0x83,0x8E,0x8D,0x8F, + 0x91,0x88,0x86,0x7E,0x7F,0x87,0x87,0x89,0x90,0x8F,0x8B,0x84,0x7D,0x7E,0x83,0x98, + 0xA0,0x9A,0x92,0x82,0x7A,0x7E,0x7C,0x78,0x84,0x86,0x88,0x94,0x94,0x89,0x85,0x85, + 0x88,0x91,0x91,0x95,0x97,0x9A,0x98,0x8C,0x8C,0x8A,0x8C,0x9C,0xA8,0x9C,0x90,0x82, + 0x75,0x7A,0x77,0x7A,0x7F,0x7B,0x7A,0x7F,0x77,0x69,0x64,0x5D,0x5D,0x64,0x63,0x60, + 0x63,0x60,0x5B,0x56,0x51,0x4C,0x58,0x6A,0x69,0x60,0x56,0x4E,0x4C,0x56,0x5A,0x63, + 0x68,0x67,0x6E,0x6D,0x65,0x5F,0x61,0x60,0x6C,0x74,0x75,0x75,0x77,0x77,0x77,0x7B, + 0x76,0x7C,0x90,0xA0,0xA6,0xA4,0x9A,0x95,0x9E,0xA2,0xA8,0xAE,0xAA,0xA7,0xAA,0xA6, + 0x9D,0x97,0x94,0x94,0x9C,0x9C,0x95,0x90,0x88,0x83,0x82,0x84,0x7E,0x82,0x94,0x97, + 0x96,0x8B,0x7D,0x72,0x76,0x7D,0x86,0x8A,0x87,0x88,0x87,0x89,0x84,0x7E,0x7C,0x83, + 0x8A,0x8C,0x8C,0x84,0x80,0x81,0x83,0x85,0x82,0x8D,0x9A,0x9D,0x9B,0x8F,0x80,0x81, + 0x89,0x94,0x9D,0x9A,0x94,0x93,0x95,0x91,0x8B,0x82,0x85,0x8C,0x8E,0x8F,0x8B,0x82, + 0x7A,0x78,0x7C,0x75,0x74,0x82,0x88,0x84,0x7B,0x68,0x56,0x5C,0x64,0x6A,0x6D,0x63, + 0x60,0x5C,0x5C,0x5D,0x55,0x52,0x55,0x5F,0x63,0x67,0x64,0x5C,0x5A,0x5F,0x62,0x5D, + 0x65,0x75,0x7B,0x7A,0x75,0x61,0x56,0x5E,0x6B,0x76,0x79,0x76,0x79,0x7A,0x7F,0x80, + 0x7E,0x84,0x8D,0x9B,0xA3,0xA7,0xA4,0x9E,0x9D,0xA2,0xA2,0x9D,0xA7,0xB0,0xAF,0xAA, + 0x9C,0x86,0x7F,0x83,0x8D,0x95,0x92,0x8C,0x87,0x84,0x82,0x83,0x7C,0x7C,0x84,0x85, + 0x8B,0x8A,0x82,0x7D,0x7D,0x80,0x7D,0x82,0x91,0x98,0x96,0x91,0x81,0x71,0x71,0x7E, + 0x88,0x91,0x93,0x89,0x86,0x88,0x88,0x87,0x8A,0x89,0x8F,0x95,0x99,0x93,0x8D,0x8D, + 0x88,0x8D,0x8B,0x93,0xA0,0xA2,0x9F,0x94,0x81,0x75,0x7A,0x85,0x8D,0x8B,0x8A,0x7F, + 0x7B,0x76,0x6F,0x6F,0x6A,0x6A,0x6C,0x70,0x6E,0x67,0x5D,0x5B,0x59,0x55,0x58,0x63, + 0x6C,0x6D,0x66,0x57,0x4A,0x46,0x4E,0x5C,0x63,0x65,0x66,0x60,0x60,0x62,0x62,0x62, + 0x60,0x67,0x6B,0x71,0x71,0x6C,0x6C,0x6B,0x72,0x6F,0x79,0x8C,0x92,0x98,0x91,0x88, + 0x81,0x85,0x95,0xA2,0xA9,0xAB,0xA5,0xA4,0xA6,0xA0,0xA0,0x9C,0x9A,0x9A,0x9E,0x9D, + 0x96,0x90,0x86,0x80,0x7F,0x80,0x88,0x95,0x9A,0x95,0x87,0x77,0x6F,0x71,0x7D,0x86, + 0x86,0x82,0x7D,0x79,0x7F,0x7F,0x7F,0x7D,0x7E,0x84,0x85,0x8A,0x86,0x80,0x80,0x83, + 0x83,0x85,0x93,0x9B,0x9D,0x98,0x8A,0x7E,0x7C,0x83,0x91,0x98,0x9A,0x94,0x8D,0x90, + 0x92,0x90,0x8F,0x8D,0x8A,0x8B,0x8D,0x8A,0x88,0x82,0x7A,0x7C,0x79,0x79,0x88,0x8C, + 0x88,0x7F,0x6C,0x5E,0x5B,0x64,0x6B,0x6C,0x69,0x61,0x59,0x5A,0x5D,0x5B,0x57,0x57, + 0x59,0x5B,0x60,0x5F,0x5D,0x57,0x56,0x58,0x55,0x65,0x77,0x7D,0x79,0x6F,0x5E,0x55, + 0x5A,0x66,0x70,0x77,0x78,0x71,0x71,0x76,0x7B,0x7F,0x83,0x82,0x89,0x95,0x96,0x98, + 0x9A,0x97,0x9D,0xA0,0x9F,0xAB,0xB6,0xB9,0xB5,0xA4,0x91,0x88,0x8C,0x94,0x9D,0x9A, + 0x94,0x8B,0x85,0x86,0x86,0x84,0x82,0x7F,0x81,0x86,0x82,0x80,0x7C,0x77,0x79,0x75, + 0x78,0x89,0x91,0x91,0x8E,0x80,0x75,0x71,0x78,0x85,0x8C,0x8C,0x87,0x85,0x85,0x86, + 0x8A,0x8B,0x8C,0x8D,0x91,0x98,0x98,0x97,0x91,0x8B,0x8E,0x8C,0x95,0xA6,0xA8,0xA6, + 0x9E,0x8D,0x7D,0x7A,0x82,0x8C,0x91,0x8E,0x88,0x80,0x7C,0x7C,0x78,0x74,0x72,0x6D, + 0x71,0x73,0x6F,0x69,0x61,0x5C,0x56,0x59,0x63,0x70,0x73,0x6F,0x65,0x51,0x47,0x4B, + 0x54,0x5F,0x67,0x66,0x61,0x5C,0x60,0x65,0x66,0x66,0x65,0x67,0x6E,0x74,0x74,0x72, + 0x6F,0x6F,0x6E,0x76,0x88,0x96,0x9B,0x98,0x8D,0x7D,0x78,0x80,0x8E,0x9A,0xA3,0xA1, + 0x9B,0x99,0x9B,0x9E,0x9C,0x9B,0x9B,0x9B,0xA1,0xA4,0x9E,0x98,0x90,0x8C,0x89,0x8D, + 0x9B,0xA3,0xA1,0x99,0x88,0x76,0x71,0x77,0x80,0x8B,0x8D,0x85,0x7D,0x7A,0x7C,0x7E, + 0x7D,0x7E,0x7E,0x7E,0x84,0x82,0x81,0x7E,0x79,0x79,0x77,0x80,0x91,0x9D,0x9E,0x97, + 0x86,0x78,0x75,0x7B,0x8A,0x95,0x95,0x8F,0x88,0x88,0x89,0x89,0x8A,0x87,0x84,0x86, + 0x89,0x88,0x86,0x81,0x7B,0x7A,0x75,0x7D,0x8E,0x95,0x92,0x88,0x76,0x69,0x65,0x6E, + 0x7C,0x82,0x81,0x76,0x70,0x70,0x72,0x75,0x73,0x71,0x6F,0x70,0x76,0x77,0x75,0x6F, + 0x6A,0x69,0x67,0x70,0x83,0x8B,0x8B,0x82,0x71,0x64,0x64,0x6E,0x79,0x82,0x80,0x7A, + 0x77,0x79,0x7F,0x82,0x81,0x7E,0x7C,0x80,0x88,0x8C,0x8D,0x88,0x84,0x82,0x7E,0x86, + 0x98,0x9F,0xA1,0x99,0x89,0x7B,0x77,0x7D,0x86,0x8D,0x89,0x84,0x82,0x7D,0x80,0x81, + 0x7E,0x7C,0x79,0x7A,0x7F,0x80,0x7F,0x79,0x74,0x72,0x6D,0x76,0x88,0x92,0x92,0x8A, + 0x7A,0x6C,0x6B,0x71,0x7D,0x85,0x85,0x82,0x7F,0x7C,0x80,0x83,0x80,0x80,0x7F,0x80, + 0x87,0x8B,0x89,0x85,0x7E,0x7C,0x79,0x7F,0x92,0x9A,0x9B,0x95,0x84,0x75,0x72,0x76, + 0x82,0x88,0x8A,0x85,0x7E,0x80,0x82,0x82,0x80,0x7D,0x78,0x7A,0x7F,0x82,0x82,0x7D, + 0x78,0x74,0x71,0x75,0x85,0x8F,0x91,0x8B,0x7A,0x6D,0x69,0x6A,0x74,0x7D,0x7E,0x7C, + 0x75,0x75,0x7A,0x7C,0x7F,0x7A,0x74,0x79,0x7C,0x81,0x86,0x81,0x7C,0x78,0x75,0x77, + 0x86,0x94,0x99,0x98,0x8B,0x7D,0x75,0x75,0x7F,0x89,0x8C,0x8C,0x86,0x82,0x87,0x8A, + 0x8B,0x86,0x7E,0x7D,0x81,0x86,0x8A,0x86,0x7F,0x7A,0x74,0x74,0x7F,0x8C,0x94,0x94, + 0x88,0x79,0x6E,0x6D,0x73,0x7C,0x83,0x7E,0x7B,0x79,0x7C,0x82,0x82,0x7F,0x77,0x75, + 0x78,0x7D,0x83,0x82,0x80,0x78,0x74,0x72,0x79,0x89,0x95,0x97,0x8F,0x80,0x71,0x6E, + 0x73,0x7C,0x84,0x83,0x7F,0x7C,0x7C,0x84,0x88,0x85,0x7F,0x7A,0x79,0x7E,0x84,0x86, + 0x84,0x7F,0x79,0x75,0x76,0x84,0x92,0x95,0x93,0x88,0x78,0x70,0x72,0x78,0x82,0x83, + 0x7F,0x7B,0x78,0x7C,0x82,0x83,0x81,0x7B,0x76,0x77,0x7E,0x82,0x82,0x7F,0x79,0x74, + 0x70,0x7B,0x8A,0x90,0x94,0x8C,0x7E,0x73,0x70,0x76,0x7D,0x84,0x85,0x7E,0x7C,0x7B, + 0x81,0x88,0x88,0x86,0x7E,0x7E,0x7E,0x82,0x86,0x87,0x83,0x7E,0x78,0x76,0x85,0x90, + 0x93,0x96,0x88,0x7A,0x75,0x70,0x7B,0x7F,0x82,0x82,0x76,0x76,0x79,0x7E,0x86,0x85, + 0x7F,0x7A,0x75,0x78,0x7F,0x82,0x84,0x7E,0x79,0x74,0x78,0x88,0x90,0x93,0x91,0x83, + 0x78,0x73,0x76,0x7F,0x84,0x85,0x7F,0x7A,0x7C,0x7E,0x85,0x88,0x88,0x85,0x7C,0x7A, + 0x7C,0x7F,0x83,0x85,0x81,0x7D,0x78,0x7E,0x89,0x8C,0x92,0x8D,0x82,0x7B,0x75,0x79, + 0x7E,0x80,0x81,0x7D,0x7C,0x79,0x7B,0x83,0x84,0x87,0x84,0x7E,0x7D,0x7A,0x7B,0x7E, + 0x80,0x7F,0x79,0x77,0x80,0x85,0x8D,0x8F,0x86,0x81,0x78,0x73,0x77,0x7C,0x7F,0x7F, + 0x7D,0x7C,0x7A,0x7F,0x84,0x86,0x89,0x85,0x80,0x7F,0x7E,0x80,0x81,0x82,0x80,0x7C, + 0x7F,0x86,0x8A,0x93,0x8E,0x87,0x84,0x7A,0x79,0x7C,0x7F,0x82,0x80,0x7E,0x7C,0x7E, + 0x81,0x81,0x86,0x88,0x83,0x80,0x7C,0x7C,0x7D,0x7F,0x80,0x7B,0x79,0x7F,0x84,0x8B, + 0x8F,0x88,0x85,0x7E,0x76,0x76,0x7A,0x7D,0x7F,0x7D,0x7B,0x7C,0x7D,0x7F,0x82,0x86, + 0x85,0x84,0x82,0x7F,0x7F,0x7F,0x80,0x7F,0x7A,0x7C,0x84,0x87,0x8E,0x8F,0x88,0x87, + 0x7F,0x7B,0x7D,0x7C,0x7E,0x7F,0x7E,0x7D,0x7F,0x80,0x81,0x83,0x85,0x85,0x85,0x80, + 0x7F,0x7F,0x7E,0x7F,0x7B,0x7A,0x7F,0x84,0x87,0x8D,0x88,0x85,0x85,0x7D,0x7B,0x7C, + 0x7A,0x7D,0x7D,0x7B,0x7C,0x80,0x80,0x80,0x83,0x85,0x85,0x84,0x80,0x7E,0x7D,0x7E, + 0x7F,0x7C,0x7C,0x83,0x86,0x8A,0x8D,0x86,0x86,0x85,0x7D,0x7D,0x7D,0x7B,0x7F,0x7C, + 0x7B,0x7F,0x7E,0x80,0x82,0x83,0x85,0x85,0x84,0x82,0x7F,0x7D,0x7C,0x7D,0x7B,0x7C, + 0x83,0x83,0x88,0x88,0x81,0x85,0x80,0x7C,0x7E,0x7B,0x7B,0x7E,0x7D,0x7B,0x7D,0x7D, + 0x7D,0x7E,0x81,0x82,0x83,0x83,0x82,0x7E,0x7C,0x7F,0x7D,0x7A,0x7E,0x82,0x81,0x86, + 0x86,0x81,0x85,0x80,0x7C,0x7F,0x7B,0x7C,0x7F,0x7C,0x7D,0x7E,0x7D,0x7F,0x80,0x81, + 0x84,0x84,0x84,0x83,0x81,0x81,0x82,0x81,0x7F,0x82,0x81,0x83,0x8B,0x84,0x80,0x83, + 0x7D,0x7D,0x7D,0x7C,0x7F,0x7D,0x7B,0x7F,0x7D,0x7A,0x7C,0x7C,0x7E,0x7C,0x8E,0x8A, + 0x7C,0x87,0x68,0x71,0x82,0x6E,0x6A,0x74,0x82,0x8A,0x8A,0x8B,0x8E,0x85,0x8C,0x9D, + 0x9A,0xA1,0xA5,0x91,0x8C,0x76,0x77,0x91,0x76,0x65,0x72,0x71,0x5B,0x5B,0x57,0x52, + 0x6B,0x63,0x62,0x59,0x5D,0x73,0x70,0x6D,0x79,0x79,0x82,0xA5,0x8B,0x8D,0x98,0x9B, + 0xAC,0x81,0xB8,0xBC,0x95,0xB4,0x96,0x9E,0xB1,0xA4,0x95,0x8D,0x95,0x9C,0x7D,0x70, + 0x76,0x5F,0x78,0x78,0x6F,0x8B,0x79,0x6B,0x77,0x77,0x7D,0x6E,0x4C,0x4B,0x56,0x62, + 0x64,0x62,0x5D,0x54,0x5A,0x6F,0x6E,0x6D,0x7E,0x80,0x95,0xA6,0x9C,0x8F,0x9B,0x9D, + 0x92,0x97,0xA4,0xB2,0xAD,0x9A,0xA3,0xA9,0xA2,0xA4,0x96,0x92,0x8E,0x8C,0x82,0x76, + 0x7F,0x76,0x76,0x74,0x72,0x7B,0x73,0x67,0x50,0x43,0x52,0x5E,0x43,0x30,0x41,0x3D, + 0x32,0x38,0x4B,0x5D,0x54,0x59,0x68,0x69,0x75,0x96,0xA7,0xA0,0x92,0x8E,0x9F,0x9B, + 0x92,0x96,0x94,0x9F,0x9E,0xA2,0xB9,0xB2,0xA9,0xB6,0xAD,0xA5,0xA6,0x88,0x8E,0x96, + 0x83,0x94,0x92,0x81,0x7E,0x71,0x6B,0x7F,0x87,0x7F,0x7F,0x6F,0x7E,0x82,0x6E,0x70, + 0x71,0x7F,0x81,0x74,0x6D,0x63,0x6A,0x6C,0x65,0x63,0x5F,0x72,0x80,0x76,0x82,0x81, + 0x7B,0x89,0x78,0x83,0x93,0x91,0x99,0x95,0x9E,0xA3,0xAF,0xBB,0xAD,0xB7,0xC1,0xB6, + 0xBD,0xBA,0xB2,0xB2,0xAE,0xAD,0xA5,0x99,0x89,0x78,0x74,0x6E,0x78,0x69,0x5D,0x75, + 0x75,0x6C,0x5C,0x49,0x44,0x46,0x4B,0x51,0x45,0x39,0x36,0x37,0x31,0x2C,0x39,0x39, + 0x3A,0x3C,0x3A,0x3D,0x46,0x50,0x4E,0x67,0x86,0x90,0x89,0x73,0x78,0x88,0x8A,0x99, + 0x9B,0x9A,0xA6,0x95,0x87,0x8B,0x90,0x96,0xA6,0xBC,0xB8,0xBC,0xC6,0xD0,0xD7,0xD1, + 0xD6,0xD8,0xD6,0xD7,0xCB,0xBC,0xAE,0xA0,0xA5,0xB3,0xB3,0xA4,0x8A,0x77,0x73,0x75, + 0x78,0x6E,0x69,0x64,0x72,0x6D,0x5C,0x57,0x47,0x58,0x54,0x55,0x5E,0x4E,0x55,0x5D, + 0x5E,0x54,0x52,0x5E,0x64,0x6F,0x7E,0x6E,0x6B,0x7B,0x6B,0x72,0x7B,0x78,0x7F,0x83, + 0x8F,0x94,0x97,0x95,0x98,0x93,0x94,0x96,0x91,0x95,0x9B,0x9F,0x9C,0xA4,0x9E,0x98, + 0xA5,0xA4,0x9B,0x8D,0x82,0x80,0x81,0x7D,0x80,0x7E,0x71,0x7B,0x7B,0x79,0x77,0x6F, + 0x66,0x51,0x50,0x56,0x61,0x74,0x6F,0x6F,0x7A,0x81,0x84,0x86,0x7F,0x6E,0x63,0x5B, + 0x66,0x77,0x81,0x74,0x5D,0x60,0x6E,0x80,0x82,0x70,0x71,0x79,0x79,0x79,0x82,0x8D, + 0x81,0x7D,0x78,0x78,0x91,0x90,0x8E,0x82,0x73,0x7F,0x87,0x91,0x99,0x91,0x89,0x7D, + 0x7E,0x93,0xA2,0xB5,0xB3,0xA0,0xA3,0xB1,0xB0,0xAD,0xAD,0x9F,0xB3,0xC5,0xBF,0xC5, + 0xB1,0xA5,0xAA,0xAF,0xB3,0xA5,0x9F,0xA4,0xA2,0x9A,0x8D,0x8E,0x95,0x92,0x92,0x84, + 0x77,0x65,0x55,0x55,0x53,0x5C,0x60,0x61,0x6D,0x75,0x69,0x5D,0x59,0x4D,0x57,0x5D, + 0x59,0x58,0x53,0x4C,0x42,0x41,0x38,0x35,0x46,0x49,0x4F,0x4D,0x41,0x42,0x3B,0x44, + 0x58,0x5F,0x65,0x6D,0x7D,0x83,0x7F,0x7D,0x7B,0x8D,0xA0,0xA6,0xA8,0x9E,0x94,0x92, + 0x8F,0x95,0x89,0x89,0xA1,0x95,0x92,0x89,0x76,0x8A,0x92,0x91,0x9F,0x9B,0x9A,0xAB, + 0xA5,0x93,0x95,0x93,0x9C,0xB9,0xB9,0xA6,0x9F,0x97,0xA2,0xAD,0xAB,0xA8,0x8F,0x91, + 0xA4,0x9B,0x90,0x81,0x7A,0x85,0x91,0x9A,0x99,0x91,0x85,0x86,0x86,0x7F,0x7C,0x81, + 0x8B,0x87,0x7C,0x71,0x66,0x74,0x8F,0x8A,0x80,0x65,0x65,0x7E,0x79,0x6E,0x47,0x30, + 0x41,0x5A,0x68,0x62,0x5C,0x5A,0x5A,0x5D,0x5F,0x59,0x5C,0x68,0x79,0x75,0x67,0x6A, + 0x70,0x72,0x71,0x78,0x79,0x73,0x74,0x7A,0x70,0x5F,0x5A,0x58,0x60,0x6C,0x6E,0x63, + 0x6B,0x77,0x75,0x7B,0x80,0x91,0xA2,0xAB,0xAE,0xA9,0x9D,0x9A,0xA1,0xA6,0xA6,0xA0, + 0x93,0x8A,0x99,0xB2,0xAE,0x9F,0x92,0x84,0x8B,0x93,0x8E,0x86,0x88,0x8D,0x8C,0x7E, + 0x76,0x79,0x86,0x93,0x8A,0x7D,0x80,0x8A,0x8F,0x8F,0x86,0x78,0x7C,0x7D,0x70,0x72, + 0x70,0x6D,0x6E,0x6E,0x6F,0x75,0x71,0x75,0x81,0x79,0x7E,0x77,0x61,0x6F,0x7D,0x86, + 0x8D,0x82,0x82,0x86,0x87,0x8F,0x8B,0x7C,0x7B,0x79,0x72,0x7F,0x85,0x74,0x65,0x5F, + 0x68,0x77,0x77,0x7D,0x7F,0x76,0x6A,0x5B,0x59,0x6A,0x81,0x88,0x7C,0x75,0x74,0x70, + 0x79,0x80,0x7C,0x77,0x72,0x79,0x72,0x61,0x6C,0x6A,0x62,0x6E,0x6B,0x75,0x7C,0x78, + 0x8A,0x8D,0x8D,0x90,0x8A,0x93,0xA3,0xAC,0xA7,0xA0,0xA6,0xA4,0xA1,0xA5,0xA4,0xA5, + 0x9E,0x94,0x87,0x83,0x93,0x91,0x80,0x79,0x74,0x80,0x8B,0x8C,0x94,0x95,0x90,0x89, + 0x7B,0x7A,0x88,0x91,0x8F,0x80,0x7D,0x7E,0x74,0x75,0x7C,0x86,0x85,0x7A,0x72,0x6B, + 0x74,0x7F,0x7A,0x6D,0x65,0x67,0x73,0x77,0x7E,0x80,0x7A,0x7A,0x79,0x7D,0x84,0x86, + 0x83,0x80,0x7C,0x7C,0x78,0x6C,0x70,0x7B,0x80,0x77,0x72,0x6D,0x7A,0x91,0x87,0x73, + 0x61,0x65,0x72,0x72,0x7B,0x7E,0x7F,0x78,0x6F,0x69,0x68,0x70,0x6E,0x6D,0x6A,0x64, + 0x64,0x5B,0x5F,0x71,0x76,0x6F,0x69,0x66,0x6B,0x83,0x86,0x73,0x6F,0x6E,0x7A,0x8F, + 0x8B,0x90,0x97,0x98,0x9E,0x9B,0xA0,0xAA,0xB1,0xB2,0xB3,0xAE,0xA2,0xA2,0xA2,0xA8, + 0xAA,0xA2,0x9A,0x95,0x99,0xAF,0xB4,0x9C,0x94,0x90,0x91,0x99,0x97,0x9B,0xA0,0x9A, + 0x8C,0x7E,0x85,0x94,0x96,0x97,0x94,0x8D,0x88,0x85,0x88,0x8B,0x89,0x82,0x75,0x79, + 0x7B,0x86,0x90,0x80,0x80,0x74,0x74,0x88,0x81,0x83,0x86,0x81,0x75,0x66,0x69,0x6D, + 0x76,0x7A,0x77,0x72,0x69,0x69,0x64,0x6D,0x74,0x68,0x69,0x67,0x5E,0x6A,0x76,0x68, + 0x64,0x5D,0x60,0x6B,0x45,0x49,0x6F,0x77,0x5F,0x45,0x58,0x4E,0x4C,0x61,0x5B,0x52, + 0x52,0x5F,0x53,0x53,0x69,0x6C,0x5F,0x59,0x68,0x62,0x6B,0x72,0x6A,0x74,0x71,0x70, + 0x81,0x81,0x82,0x8F,0x8D,0x8C,0x88,0x90,0xAC,0xB0,0xB0,0xAC,0xAB,0xAB,0xAB,0xB5, + 0xAF,0xB1,0xB1,0xA9,0xAD,0xA1,0xA8,0xBE,0xAC,0x9D,0xA2,0x9E,0x9A,0x98,0x97,0xA1, + 0xA9,0x98,0x8A,0x8B,0x97,0xA1,0x9B,0xA1,0x9F,0xA2,0xA5,0x94,0x9A,0xA9,0xA8,0xA0, + 0x9B,0x9A,0x93,0xA1,0xAF,0xA4,0x99,0x90,0x90,0x8F,0x92,0x96,0x98,0x97,0x89,0x7F, + 0x73,0x7C,0x8A,0x7F,0x7D,0x7F,0x79,0x71,0x73,0x7C,0x7B,0x7A,0x6E,0x64,0x60,0x62, + 0x78,0x73,0x61,0x5D,0x54,0x5E,0x5C,0x50,0x5C,0x60,0x58,0x49,0x35,0x36,0x42,0x49, + 0x4C,0x4C,0x4A,0x36,0x25,0x31,0x3F,0x43,0x42,0x36,0x34,0x38,0x41,0x60,0x63,0x55, + 0x55,0x58,0x68,0x6F,0x72,0x80,0x87,0x85,0x7F,0x79,0x82,0x93,0x97,0x97,0x97,0x93, + 0x8B,0x8C,0x97,0xA1,0xA2,0x97,0x8A,0x8C,0x8D,0x8E,0xA6,0xA0,0x8E,0x8C,0x8B,0x90, + 0x8F,0x90,0x9F,0xAA,0xA1,0x91,0x8A,0x8E,0x9C,0xA6,0xA7,0xAA,0xA2,0x9D,0x9F,0xA0, + 0xAE,0xAD,0xA3,0x9F,0x9C,0xA5,0xA4,0xB4,0xBF,0xA8,0xA4,0xA0,0x9B,0xA5,0xA4,0xAC, + 0xB4,0xA3,0x92,0x87,0x89,0x96,0x98,0x98,0x92,0x90,0x89,0x7E,0x7E,0x86,0x8B,0x86, + 0x7D,0x77,0x77,0x6D,0x74,0x84,0x75,0x66,0x5E,0x57,0x60,0x63,0x61,0x68,0x62,0x54, + 0x49,0x44,0x4F,0x5C,0x5A,0x58,0x59,0x56,0x4F,0x4E,0x5B,0x65,0x64,0x62,0x5D,0x5F, + 0x6A,0x68,0x80,0x8D,0x80,0x7E,0x76,0x7B,0x86,0x83,0x8D,0x98,0x90,0x80,0x74,0x75, + 0x84,0x8B,0x86,0x84,0x82,0x7D,0x79,0x78,0x82,0x8B,0x84,0x80,0x7A,0x79,0x76,0x7F, + 0x97,0x91,0x81,0x79,0x70,0x78,0x80,0x82,0x8D,0x8D,0x80,0x7B,0x79,0x84,0x8E,0x8D, + 0x8A,0x8E,0x91,0x86,0x7E,0x82,0x91,0x94,0x8F,0x8A,0x81,0x86,0x83,0x8F,0xA6,0x99, + 0x8A,0x81,0x80,0x8B,0x8E,0x8E,0x94,0x8E,0x85,0x7A,0x73,0x7F,0x85,0x82,0x84,0x83, + 0x7A,0x6E,0x66,0x6F,0x7B,0x77,0x6E,0x64,0x5F,0x5F,0x5D,0x6F,0x7D,0x6E,0x5E,0x54, + 0x50,0x5A,0x5C,0x60,0x6F,0x6D,0x60,0x5B,0x5D,0x6D,0x7A,0x79,0x7D,0x81,0x80,0x7C, + 0x7A,0x89,0x99,0x9A,0x99,0x95,0x92,0x93,0x8F,0xA3,0xB3,0xA3,0x92,0x89,0x88,0x91, + 0x8F,0x8C,0x95,0x8F,0x88,0x80,0x77,0x84,0x8A,0x88,0x8F,0x8F,0x89,0x7D,0x76,0x84, + 0x91,0x8E,0x88,0x82,0x80,0x85,0x83,0x91,0x9F,0x92,0x88,0x81,0x85,0x8C,0x8B,0x91, + 0x9B,0xA0,0x97,0x8B,0x86,0x8E,0x9A,0x9B,0x98,0x99,0x92,0x89,0x86,0x8B,0x96,0x95, + 0x93,0x8F,0x84,0x84,0x7C,0x87,0xA1,0x95,0x83,0x7A,0x73,0x7A,0x7D,0x7D,0x85,0x84, + 0x78,0x6C,0x63,0x68,0x74,0x75,0x72,0x73,0x71,0x66,0x5B,0x5D,0x6E,0x75,0x70,0x69, + 0x5F,0x5E,0x5E,0x67,0x81,0x82,0x74,0x6A,0x66,0x70,0x74,0x79,0x87,0x8C,0x86,0x7B, + 0x75,0x79,0x83,0x8A,0x8D,0x8E,0x8A,0x82,0x7A,0x78,0x83,0x8C,0x8A,0x84,0x7E,0x7B, + 0x78,0x72,0x87,0x9B,0x8C,0x7D,0x75,0x72,0x7E,0x82,0x83,0x8D,0x8D,0x85,0x7B,0x72, + 0x7C,0x87,0x8A,0x8A,0x89,0x8A,0x81,0x77,0x7A,0x87,0x8D,0x88,0x82,0x7F,0x7E,0x7A, + 0x82,0x98,0x99,0x8C,0x82,0x78,0x7C,0x84,0x87,0x8F,0x95,0x92,0x87,0x78,0x77,0x83, + 0x89,0x8C,0x8E,0x8C,0x87,0x7D,0x78,0x81,0x8A,0x8C,0x88,0x7F,0x7A,0x79,0x73,0x85, + 0x97,0x8C,0x7E,0x70,0x6A,0x73,0x78,0x7A,0x81,0x83,0x7F,0x72,0x63,0x68,0x75,0x7C, + 0x7F,0x7E,0x7B,0x76,0x6E,0x6D,0x78,0x84,0x89,0x84,0x7A,0x7A,0x7D,0x7C,0x8F,0x9D, + 0x94,0x8C,0x7D,0x7A,0x84,0x84,0x8B,0x91,0x8D,0x88,0x7D,0x72,0x78,0x82,0x87,0x88, + 0x83,0x80,0x7B,0x72,0x73,0x7A,0x84,0x87,0x7D,0x74,0x71,0x70,0x72,0x89,0x94,0x86, + 0x7A,0x6D,0x6E,0x76,0x77,0x7E,0x83,0x85,0x82,0x74,0x6F,0x76,0x80,0x86,0x86,0x85, + 0x84,0x80,0x77,0x75,0x7E,0x89,0x8E,0x86,0x7C,0x7B,0x79,0x78,0x8B,0x96,0x8B,0x80, + 0x71,0x6F,0x79,0x7B,0x81,0x85,0x85,0x87,0x7C,0x71,0x74,0x7A,0x84,0x88,0x85,0x86, + 0x81,0x76,0x71,0x77,0x82,0x88,0x83,0x7D,0x7A,0x76,0x72,0x82,0x90,0x8C,0x81,0x70, + 0x6C,0x75,0x78,0x7D,0x83,0x86,0x87,0x7C,0x72,0x75,0x7D,0x84,0x8A,0x8B,0x8C,0x8C, + 0x86,0x81,0x80,0x88,0x95,0x93,0x8B,0x85,0x7D,0x77,0x81,0x97,0x96,0x8C,0x7D,0x76, + 0x7B,0x79,0x7A,0x7C,0x82,0x86,0x81,0x74,0x6D,0x6E,0x75,0x7F,0x82,0x82,0x81,0x80, + 0x7A,0x73,0x76,0x81,0x86,0x85,0x81,0x7A,0x73,0x75,0x8A,0x96,0x90,0x86,0x76,0x77, + 0x7F,0x7C,0x80,0x82,0x86,0x8C,0x82,0x78,0x75,0x77,0x82,0x8A,0x88,0x87,0x84,0x83, + 0x7F,0x77,0x7C,0x85,0x89,0x8A,0x82,0x79,0x71,0x77,0x8C,0x93,0x8C,0x7F,0x73,0x75, + 0x7A,0x7D,0x7F,0x7F,0x85,0x8E,0x87,0x79,0x74,0x76,0x82,0x88,0x86,0x86,0x84,0x82, + 0x7C,0x79,0x7C,0x85,0x8A,0x84,0x7F,0x78,0x6F,0x7A,0x92,0x94,0x8F,0x7F,0x70,0x7B, + 0x7D,0x83,0x82,0x80,0x8B,0x88,0x86,0x80,0x79,0x76,0x7C,0x87,0x89,0x8B,0x80,0x75, + 0x76,0x80,0x85,0x7A,0x7C,0x89,0x83,0x72,0x65,0x6E,0x8E,0x9A,0x8D,0x79,0x6B,0x76, + 0x77,0x74,0x8C,0x84,0x6D,0x7C,0x8E,0x81,0x79,0x7D,0x6C,0x78,0x85,0x80,0x82,0x7D, + 0x83,0x8A,0x83,0x75,0x7A,0x8D,0x89,0x7A,0x7B,0x79,0x85,0x8F,0x95,0x97,0x77,0x68, + 0x76,0x8A,0x95,0x89,0x71,0x73,0x89,0x83,0x7D,0x79,0x71,0x81,0x83,0x79,0x89,0x8F, + 0x79,0x81,0x8B,0x75,0x72,0x73,0x85,0x90,0x7E,0x70,0x75,0x84,0x84,0xA0,0x9D,0x79, + 0x72,0x65,0x66,0x7F,0x89,0x86,0x90,0x7F,0x7A,0x91,0x80,0x6E,0x77,0x80,0x80,0x83, + 0x80,0x78,0x85,0x8D,0x8B,0x94,0x80,0x6D,0x7F,0x85,0x74,0x73,0x83,0x83,0x8E,0x8E, + 0x7C,0x7B,0x72,0x73,0x8E,0x95,0x7F,0x72,0x73,0x83,0x8B,0x8B,0x85,0x71,0x6C,0x72, + 0x79,0x87,0x93,0x91,0x96,0x90,0x79,0x8C,0x89,0x70,0x7C,0x81,0x69,0x64,0x77,0x7A, + 0x8E,0x95,0x86,0x8A,0x7F,0x69,0x75,0x84,0x7A,0x80,0x86,0x79,0x77,0x79,0x76,0x7A, + 0x87,0x86,0x94,0x9C,0x81,0x7A,0x7F,0x87,0x8F,0x91,0x8F,0x7E,0x6A,0x5E,0x5C,0x6D, + 0x86,0x8D,0x96,0x99,0x7D,0x7A,0x8B,0x89,0x87,0x90,0x93,0x84,0x81,0x79,0x80,0x90, + 0x85,0x88,0x89,0x72,0x5A,0x68,0x74,0x6F,0x74,0x6E,0x6C,0x6E,0x76,0x88,0x9B,0x98, + 0x99,0xA0,0x91,0x8C,0x88,0x8F,0x8D,0x85,0x84,0x74,0x7C,0x76,0x68,0x76,0x76,0x7D, + 0x89,0x84,0x7A,0x6D,0x96,0x93,0x82,0x9E,0xA2,0xA2,0x7D,0x6F,0x7D,0x85,0x7B,0x5A, + 0x74,0x77,0x53,0x58,0x65,0x64,0x6B,0x65,0x6A,0x99,0xA2,0x86,0x8B,0x95,0x8B,0x98, + 0x9E,0x9B,0x98,0x96,0xA1,0x99,0x88,0x79,0x6D,0x70,0x61,0x67,0x7C,0x85,0x86,0x76, + 0x64,0x54,0x6E,0x8E,0x8F,0x8F,0x8F,0x86,0x7B,0x7B,0x75,0x7A,0x8D,0x8E,0x93,0xA7, + 0x93,0x7C,0x8C,0x91,0x98,0x96,0x8E,0x83,0x5F,0x5F,0x61,0x5C,0x66,0x6C,0x72,0x67, + 0x57,0x4F,0x55,0x6B,0x80,0x81,0x7C,0x78,0x7E,0x83,0x88,0xA3,0xAA,0xAF,0xC3,0xAE, + 0xA4,0xB6,0x93,0x82,0x8D,0x81,0x7D,0x7C,0x74,0x73,0x85,0x87,0x84,0x81,0x73,0x61, + 0x5D,0x6A,0x77,0x7F,0x7D,0x75,0x73,0x7B,0x6C,0x72,0x75,0x66,0x7C,0x85,0x77,0x7A, + 0x80,0x84,0x82,0x8F,0xA4,0x9C,0x8B,0x84,0x7C,0x8F,0x9F,0x95,0x8F,0x81,0x69,0x6E, + 0x7F,0x68,0x6E,0x8C,0x73,0x6B,0x79,0x70,0x82,0x78,0x72,0x86,0x76,0x66,0x6A,0x6C, + 0x6B,0x8F,0x9C,0x98,0x8F,0x86,0x8F,0x83,0x84,0x8E,0x8D,0x96,0x8A,0x78,0x8C,0x94, + 0x8D,0x8B,0x92,0x87,0x6A,0x63,0x66,0x6E,0x75,0x73,0x79,0x7C,0x63,0x63,0x77,0x6F, + 0x63,0x80,0x8C,0x7F,0x8A,0x84,0x88,0x98,0x98,0xA3,0xBA,0xB2,0xA5,0xA7,0xA2,0x97, + 0x7B,0x7C,0x77,0x6A,0x68,0x56,0x53,0x63,0x71,0x7B,0x82,0x81,0x76,0x67,0x64,0x71, + 0x83,0x7F,0x73,0x70,0x77,0x84,0x84,0x8E,0x99,0xA5,0xA1,0x86,0x89,0x8C,0x80,0x82, + 0x8C,0x7E,0x72,0x6E,0x66,0x6D,0x79,0x82,0x8E,0x95,0x73,0x71,0x87,0x73,0x7D,0x83, + 0x83,0x79,0x66,0x79,0x8E,0x89,0x7A,0x8F,0x95,0x8E,0x85,0x6E,0x80,0x85,0x7A,0x8D, + 0x87,0x77,0x79,0x79,0x8F,0x93,0x87,0x90,0x8B,0x75,0x73,0x82,0x7E,0x80,0x88,0x76, + 0x79,0x7C,0x5F,0x6C,0x77,0x63,0x7D,0x8C,0x74,0x76,0x7A,0x76,0x7E,0x86,0x94,0x8E, + 0x87,0x95,0x93,0x96,0x8B,0x90,0xA5,0xAA,0x9C,0x8C,0x8A,0x7B,0x80,0x7D,0x82,0x78, + 0x62,0x78,0x74,0x6C,0x72,0x78,0x7F,0x7B,0x75,0x80,0x77,0x58,0x6D,0x8F,0x80,0x7A, + 0x7D,0x71,0x7B,0x80,0x7E,0x9A,0xA3,0x86,0x89,0x94,0x82,0x86,0x8E,0x93,0x87,0x7C, + 0x7D,0x70,0x6F,0x66,0x6B,0x7C,0x70,0x63,0x74,0x6E,0x6F,0x7A,0x7B,0x88,0x7A,0x7E, + 0x8C,0x93,0x94,0x8C,0x99,0x9A,0x91,0x82,0x7F,0x6E,0x70,0x86,0x77,0x6C,0x82,0x85, + 0x7D,0x8B,0x84,0x8E,0x93,0x7B,0x68,0x78,0x85,0x79,0x8F,0x99,0x8A,0x88,0x80,0x7D, + 0x77,0x6B,0x68,0x6F,0x88,0x87,0x7A,0x86,0x83,0x87,0x92,0x8E,0x84,0x7B,0x7A,0x76, + 0x7C,0x88,0x92,0xA0,0x95,0x90,0xA3,0x90,0x78,0x87,0x8D,0x80,0x7A,0x76,0x6E,0x65, + 0x5E,0x68,0x87,0x78,0x6C,0x94,0x84,0x70,0x7F,0x86,0x89,0x8A,0x86,0x7D,0x78,0x74, + 0x74,0x7C,0x8F,0x80,0x7B,0x87,0x77,0x6D,0x78,0x8D,0x79,0x6B,0x80,0x7C,0x6B,0x70, + 0x7B,0x7E,0x89,0x89,0x97,0x90,0x71,0x74,0x7E,0x7F,0x76,0x79,0x81,0x7B,0x83,0x87, + 0x9D,0xA8,0x87,0x8F,0x9A,0x77,0x77,0x85,0x8A,0x7F,0x6E,0x73,0x7A,0x77,0x71,0x79, + 0x8B,0x82,0x7C,0x89,0x83,0x6E,0x69,0x83,0x84,0x73,0x84,0x90,0x83,0x81,0x7C,0x89, + 0x9A,0x88,0x8F,0x93,0x86,0x71,0x79,0x9A,0x83,0x7A,0x7C,0x6F,0x6D,0x66,0x71,0x94, + 0x8E,0x7B,0x9C,0x96,0x82,0x94,0x90,0x8E,0x8C,0x77,0x70,0x78,0x70,0x6B,0x6F,0x7C, + 0x7A,0x7C,0x81,0x76,0x72,0x8B,0xA4,0x90,0x7F,0x8B,0x8E,0x79,0x74,0x72,0x80,0x8F, + 0x85,0x89,0x7C,0x64,0x5A,0x68,0x70,0x69,0x74,0x6A,0x73,0x85,0x78,0x90,0x92,0x6E, + 0x81,0x99,0x7C,0x68,0x7B,0x97,0x8A,0x7B,0x81,0x80,0x7D,0x75,0x79,0x88,0x9B,0x99, + 0x97,0x99,0x82,0x84,0x93,0x8C,0x7C,0x7A,0x7E,0x7F,0x7C,0x7E,0x84,0x82,0x84,0x89, + 0x79,0x68,0x59,0x50,0x6E,0x76,0x7C,0x81,0x7C,0x8F,0x7F,0x7E,0x9B,0x8D,0x86,0x97, + 0x94,0x8F,0x8A,0x95,0x98,0x8D,0x89,0x7A,0x79,0x70,0x65,0x6A,0x66,0x74,0x7F,0x76, + 0x81,0x72,0x7C,0xA3,0x9C,0x95,0x95,0x9E,0x9E,0x82,0x79,0x80,0x82,0x80,0x81,0x7C, + 0x6C,0x64,0x5B,0x6F,0x89,0x7E,0x73,0x7D,0x7A,0x73,0x7C,0x77,0x76,0x85,0x8A,0x89, + 0x79,0x6D,0x87,0x86,0x89,0x97,0x8A,0x87,0x72,0x6C,0x73,0x7B,0x8B,0x81,0x7F,0x89, + 0x76,0x76,0x90,0x8B,0x78,0x7A,0x8F,0x87,0x76,0x7C,0x78,0x82,0x9A,0x8D,0x86,0x78, + 0x70,0x7F,0x81,0x82,0x75,0x74,0x7D,0x74,0x73,0x7B,0x7F,0x8D,0x98,0xA1,0xA6,0x85, + 0x7A,0x86,0x7F,0x80,0x7C,0x7E,0x75,0x76,0x79,0x76,0x80,0x73,0x6F,0x8C,0x94,0x6E, + 0x97,0xA6,0x6A,0x7F,0x84,0x87,0x88,0x75,0x86,0x6F,0x7D,0x91,0x79,0x7E,0x7A,0x6B, + 0x74,0x8C,0x91,0x8E,0x8B,0x8D,0x94,0x8C,0x73,0x74,0x8C,0x87,0x83,0x78,0x70,0x70, + 0x75,0x85,0x86,0x8A,0x83,0x78,0x7A,0x66,0x6B,0x95,0x8B,0x80,0x97,0x82,0x77,0x8A, + 0x7C,0x7D,0x7C,0x72,0x8E,0x8D,0x75,0x77,0x72,0x84,0x84,0x71,0x71,0x58,0x5E,0x72, + 0x80,0x83,0x67,0x6B,0x7B,0x74,0x6B,0x7E,0x94,0x96,0xA3,0xB8,0xA6,0x81,0x87,0x9A, + 0x98,0x87,0x82,0x80,0x7D,0x7E,0x5F,0x6C,0x95,0x80,0x7C,0x8C,0x6D,0x74,0x88,0x72, + 0x77,0x73,0x76,0x83,0x7D,0x79,0x78,0x93,0x8B,0x83,0x90,0x7D,0x6B,0x63,0x70,0x8E, + 0x93,0x80,0x8B,0x95,0x86,0x6C,0x76,0x8F,0x7F,0x82,0x84,0x76,0x76,0x79,0x8A,0xA0, + 0xA8,0x98,0x8D,0x8A,0x78,0x76,0x8F,0x96,0x82,0x88,0x86,0x70,0x71,0x7B,0x77,0x69, + 0x64,0x7E,0x8A,0x76,0x67,0x6D,0x88,0x80,0x7F,0x87,0x72,0x71,0x62,0x73,0x8D,0x78, + 0x7F,0x88,0x81,0x70,0x73,0x95,0x90,0x87,0x9C,0x9E,0x7C,0x6E,0x77,0x83,0x87,0x7F, + 0x7A,0x78,0x6A,0x55,0x61,0x83,0x80,0x7D,0xA1,0x9A,0x7F,0x92,0x8F,0x8D,0x7C,0x7C, + 0x95,0x85,0x7B,0x6F,0x80,0x85,0x82,0x9B,0x90,0x77,0x68,0x6E,0x87,0x7F,0x66,0x78, + 0x93,0x81,0x67,0x7D,0x9A,0x84,0x83,0x95,0x8E,0x7E,0x75,0x83,0x95,0x8C,0x83,0x88, + 0x7E,0x70,0x63,0x7D,0x84,0x6D,0x87,0x8A,0x72,0x71,0x79,0x7F,0x72,0x6B,0x89,0xA8, + 0xA0,0x7E,0x85,0xA4,0x8D,0x8B,0x9E,0x91,0x78,0x5D,0x7B,0x96,0x77,0x6F,0x82,0x7D, + 0x64,0x68,0x7C,0x7D,0x73,0x86,0x9A,0x80,0x62,0x6A,0x8A,0x8B,0x7C,0x82,0x8A,0x79, + 0x5A,0x66,0x8E,0x88,0x6D,0x84,0x94,0x78,0x7A,0x84,0x7B,0x71,0x71,0x8C,0x91,0x79, + 0x65,0x79,0x82,0x77,0x9A,0xA3,0x90,0x7D,0x72,0x92,0x96,0x76,0x7F,0x93,0x84,0x6C, + 0x6D,0x87,0x7E,0x6F,0x81,0x8A,0x88,0x74,0x6E,0x89,0x88,0x76,0x7A,0x78,0x65,0x61, + 0x77,0x8A,0x8C,0x90,0x9C,0x9A,0x7E,0x7F,0x8D,0x74,0x6C,0x75,0x90,0x9B,0x78,0x71, + 0x8A,0x85,0x7C,0x93,0x96,0x80,0x67,0x67,0x83,0x8B,0x74,0x80,0x97,0x7E,0x7C,0x90, + 0x90,0x87,0x90,0x9C,0x92,0x8D,0x72,0x74,0x82,0x70,0x7B,0x88,0x7D,0x61,0x61,0x76, + 0x78,0x6C,0x75,0x91,0x82,0x72,0x86,0x88,0x71,0x65,0x78,0x8A,0x84,0x70,0x7E,0x8A, + 0x78,0x91,0x9D,0x98,0x88,0x64,0x6D,0x85,0x7E,0x70,0x81,0x90,0x74,0x6B,0x81,0x75, + 0x67,0x74,0x84,0x93,0x8B,0x78,0x89,0x98,0x8F,0x9D,0x98,0x82,0x73,0x68,0x75,0x75, + 0x74,0x8C,0x97,0x8C,0x84,0x92,0x83,0x6E,0x72,0x72,0x81,0x76,0x65,0x7C,0x83,0x6F, + 0x80,0xA2,0x9B,0x84,0x77,0x7E,0x8A,0x8C,0x87,0x8A,0x89,0x79,0x7E,0x86,0x80,0x7F, + 0x8F,0x88,0x89,0x8A,0x71,0x74,0x70,0x72,0x87,0x88,0x7C,0x71,0x7E,0x89,0x7A,0x7E, + 0x99,0x9A,0x96,0x97,0x9A,0x8B,0x7A,0x7E,0x7C,0x70,0x68,0x6D,0x71,0x6F,0x6F,0x82, + 0x93,0x92,0x7E,0x6D,0x6F,0x6A,0x74,0x88,0x8D,0x83,0x73,0x7F,0x91,0x7C,0x7C,0x8E, + 0x90,0x8E,0x82,0x84,0x7A,0x75,0x81,0x88,0x82,0x71,0x70,0x70,0x69,0x72,0x74,0x75, + 0x8C,0x87,0x86,0x9B,0x89,0x7C,0x91,0x92,0x7D,0x6B,0x81,0x8F,0x6F,0x6C,0x7E,0x8F, + 0x96,0x8D,0x95,0x8E,0x74,0x76,0x87,0x7B,0x73,0x6B,0x6E,0x81,0x74,0x7D,0x91,0x85, + 0x99,0xA1,0x90,0x87,0x6F,0x75,0x8B,0x84,0x79,0x80,0x8A,0x7A,0x6C,0x7D,0x84,0x7B, + 0x85,0x8E,0x93,0x85,0x6C,0x78,0x74,0x61,0x71,0x7E,0x82,0x84,0x82,0x85,0x87,0x92, + 0x99,0x9E,0x93,0x82,0x88,0x8B,0x88,0x7A,0x75,0x88,0x81,0x6E,0x75,0x7D,0x71,0x70, + 0x84,0x7F,0x76,0x73,0x75,0x7F,0x76,0x75,0x7D,0x7C,0x7A,0x83,0x82,0x82,0x8A,0x8A, + 0x96,0x92,0x82,0x80,0x8B,0x87,0x6B,0x78,0x88,0x78,0x69,0x68,0x71,0x68,0x6C,0x84, + 0x92,0x8D,0x81,0x88,0x86,0x7E,0x7F,0x7E,0x82,0x84,0x7F,0x82,0x85,0x84,0x87,0x94, + 0x9A,0x8B,0x89,0x8E,0x8B,0x7C,0x79,0x88,0x7B,0x68,0x6C,0x77,0x6D,0x71,0x83,0x8D, + 0x94,0x8C,0x84,0x82,0x80,0x75,0x75,0x81,0x84,0x7D,0x75,0x7D,0x83,0x83,0x8B,0x94, + 0x8D,0x85,0x87,0x85,0x75,0x74,0x7C,0x79,0x75,0x77,0x80,0x79,0x7F,0x84,0x8D,0x97, + 0x8D,0x88,0x87,0x86,0x7B,0x7F,0x83,0x86,0x8D,0x7B,0x7B,0x83,0x7C,0x84,0x7F,0x78, + 0x83,0x76,0x71,0x79,0x70,0x7C,0x80,0x71,0x78,0x7F,0x77,0x75,0x82,0x8A,0x89,0x8A, + 0x82,0x84,0x88,0x7F,0x7D,0x7F,0x86,0x8C,0x7C,0x7B,0x7E,0x72,0x78,0x78,0x79,0x79, + 0x7A,0x85,0x76,0x79,0x84,0x7B,0x78,0x79,0x7D,0x7B,0x7A,0x80,0x91,0x8F,0x90,0x8F, + 0x85,0x8C,0x88,0x86,0x7C,0x81,0x81,0x73,0x79,0x71,0x72,0x7E,0x81,0x7E,0x80,0x8C, + 0x82,0x7B,0x80,0x88,0x84,0x7B,0x85,0x8A,0x88,0x79,0x7B,0x8F,0x88,0x81,0x81,0x89, + 0x87,0x7A,0x78,0x79,0x7D,0x7B,0x7A,0x84,0x84,0x7B,0x84,0x85,0x84,0x87,0x82,0x7E, + 0x82,0x77,0x7E,0x86,0x75,0x7D,0x84,0x80,0x79,0x80,0x8A,0x85,0x86,0x7B,0x7D,0x78, + 0x76,0x75,0x71,0x7F,0x7B,0x77,0x7E,0x81,0x7E,0x7B,0x81,0x80,0x7A,0x82,0x82,0x76, + 0x78,0x7E,0x78,0x79,0x7A,0x81,0x82,0x75,0x82,0x87,0x80,0x84,0x82,0x7B,0x7E,0x82, + 0x76,0x7A,0x8A,0x85,0x80,0x84,0x85,0x7F,0x7E,0x7F,0x83,0x81,0x82,0x81,0x7E,0x8B, + 0x89,0x83,0x86,0x7F,0x84,0x83,0x72,0x82,0x7F,0x72,0x86,0x7C,0x7E,0x82,0x83,0x9D, + 0x83,0x8A,0x81,0x65,0x86,0x7D,0x69,0x71,0x7E,0x84,0x8C,0x8E,0x91,0x8E,0x90,0x9B, + 0x9E,0x9E,0x8F,0x8D,0x87,0x7E,0x89,0x86,0x7E,0x78,0x73,0x6B,0x67,0x65,0x58,0x56, + 0x62,0x61,0x62,0x67,0x69,0x7B,0x7C,0x77,0x8A,0x7B,0x7B,0x88,0x70,0x78,0x92,0x96, + 0x7C,0x85,0xA3,0x99,0x9D,0xAC,0xA0,0xA5,0xAA,0x9B,0x9A,0x95,0x8C,0x8A,0x8B,0x89, + 0x87,0x81,0x7E,0x7F,0x7A,0x7C,0x7B,0x72,0x68,0x67,0x69,0x60,0x52,0x4F,0x49,0x42, + 0x47,0x52,0x59,0x5E,0x5F,0x6A,0x82,0x90,0x8F,0x8B,0x8B,0x88,0x87,0x94,0x9E,0xA1, + 0xA4,0xAD,0xBB,0xC3,0xC6,0xCD,0xD1,0xCC,0xC6,0xB9,0xAF,0xAD,0xA9,0xA8,0xA6,0x9A, + 0x81,0x75,0x76,0x76,0x74,0x6D,0x60,0x55,0x54,0x4D,0x3E,0x35,0x2E,0x30,0x34,0x36, + 0x3C,0x41,0x42,0x49,0x53,0x59,0x60,0x68,0x70,0x71,0x78,0x84,0x89,0x8A,0x8D,0x8D, + 0x8E,0x92,0x96,0x97,0x93,0x93,0x95,0x9B,0xA3,0xA1,0x9B,0x95,0x90,0x8D,0x85,0x7E, + 0x7C,0x78,0x74,0x76,0x75,0x75,0x75,0x78,0x83,0x90,0x91,0x92,0x9F,0xA7,0xA3,0x9A, + 0x92,0x8B,0x86,0x83,0x7C,0x79,0x78,0x74,0x75,0x77,0x72,0x72,0x78,0x7C,0x7C,0x79, + 0x7E,0x82,0x80,0x7A,0x77,0x77,0x75,0x88,0x9B,0x91,0x92,0x9D,0x9A,0x9A,0x9A,0x92, + 0x91,0x9B,0x9A,0x97,0x9F,0xA2,0xA2,0xA0,0x91,0x89,0x8A,0x81,0x79,0x7A,0x7B,0x7A, + 0x7A,0x79,0x74,0x6F,0x7A,0x89,0x82,0x78,0x79,0x7D,0x7C,0x7B,0x77,0x78,0x80,0x7E, + 0x78,0x7C,0x82,0x84,0x84,0x7E,0x7E,0x88,0x88,0x84,0x88,0x90,0x8F,0x82,0x7F,0x7F, + 0x87,0x95,0x93,0x88,0x88,0x89,0x82,0x7D,0x75,0x71,0x7A,0x7A,0x72,0x73,0x79,0x7A, + 0x74,0x6D,0x6F,0x72,0x70,0x6C,0x6E,0x75,0x73,0x67,0x5B,0x59,0x5B,0x66,0x6E,0x65, + 0x64,0x69,0x5F,0x57,0x50,0x48,0x52,0x57,0x55,0x5B,0x5F,0x5E,0x57,0x51,0x4D,0x52, + 0x59,0x5A,0x63,0x6C,0x6B,0x66,0x6A,0x6E,0x72,0x81,0x92,0x9A,0x9F,0xA6,0xA7,0xA8, + 0xB2,0xBD,0xCC,0xD8,0xD9,0xDB,0xDD,0xDA,0xD8,0xD0,0xC8,0xCB,0xCC,0xC6,0xC6,0xC8, + 0xC1,0xB4,0xA9,0xA8,0x9C,0x95,0xA3,0x9F,0x8F,0x85,0x78,0x6E,0x69,0x61,0x62,0x67, + 0x64,0x61,0x61,0x5E,0x59,0x56,0x55,0x58,0x5E,0x5C,0x5F,0x66,0x61,0x56,0x57,0x5F, + 0x60,0x60,0x6C,0x74,0x6C,0x69,0x6B,0x67,0x65,0x66,0x6D,0x7C,0x83,0x81,0x86,0x87, + 0x82,0x82,0x89,0x91,0x98,0x9E,0xA7,0xAC,0xA6,0xA1,0xA4,0xAB,0xA9,0xA1,0xAF,0xB7, + 0xA4,0x9B,0x9B,0x94,0x90,0x8D,0x90,0x98,0x95,0x87,0x83,0x81,0x73,0x6D,0x74,0x78, + 0x75,0x71,0x71,0x6E,0x67,0x62,0x65,0x66,0x66,0x63,0x65,0x74,0x6D,0x5C,0x63,0x69, + 0x5E,0x5B,0x5F,0x65,0x69,0x5D,0x55,0x5C,0x56,0x4B,0x4E,0x55,0x58,0x57,0x54,0x59, + 0x56,0x4C,0x4B,0x52,0x55,0x4E,0x58,0x6D,0x65,0x5A,0x62,0x64,0x61,0x67,0x75,0x82, + 0x86,0x80,0x86,0x95,0x92,0x93,0xA5,0xB3,0xB7,0xB7,0xBB,0xBF,0xBD,0xB5,0xBC,0xC2, + 0xBC,0xBC,0xB3,0xC1,0xCC,0xB1,0xA9,0xB3,0xA4,0x98,0x9F,0xA2,0xA5,0x9F,0x92,0x9A, + 0x9D,0x8F,0x93,0x9D,0x9E,0xA0,0xA2,0x9F,0x9A,0x91,0x90,0x92,0x92,0x8C,0x89,0x9C, + 0x96,0x7D,0x84,0x87,0x79,0x79,0x81,0x86,0x86,0x79,0x75,0x7D,0x74,0x6C,0x76,0x79, + 0x76,0x7A,0x79,0x79,0x75,0x6C,0x6E,0x6F,0x69,0x72,0x6D,0x70,0x83,0x6D,0x63,0x6F, + 0x62,0x58,0x64,0x69,0x6E,0x6D,0x62,0x67,0x6A,0x5E,0x67,0x74,0x71,0x76,0x76,0x73, + 0x74,0x6E,0x6F,0x75,0x75,0x70,0x6C,0x81,0x84,0x6B,0x70,0x79,0x6C,0x65,0x6C,0x76, + 0x7B,0x71,0x70,0x7C,0x73,0x67,0x72,0x78,0x79,0x7B,0x7C,0x7E,0x7A,0x73,0x7A,0x7F, + 0x7E,0x84,0x7E,0x8B,0x9F,0x83,0x78,0x8C,0x7F,0x6F,0x7B,0x84,0x89,0x84,0x7B,0x85, + 0x85,0x77,0x82,0x8E,0x8C,0x91,0x98,0x9A,0x9B,0x9A,0x9F,0xA3,0xA0,0xA0,0x9B,0xAE, + 0xBA,0x9F,0x9E,0xA7,0x91,0x83,0x8A,0x8F,0x8C,0x7F,0x79,0x81,0x71,0x5E,0x68,0x6C, + 0x63,0x64,0x67,0x67,0x5F,0x56,0x5E,0x63,0x61,0x66,0x5F,0x6E,0x84,0x6E,0x69,0x7D, + 0x72,0x69,0x75,0x7E,0x83,0x82,0x7D,0x88,0x87,0x7A,0x81,0x89,0x86,0x88,0x8F,0x91, + 0x91,0x8E,0x91,0x93,0x91,0x94,0x91,0x9E,0xB4,0xA1,0x9C,0xAE,0xA0,0x94,0x9F,0xA5, + 0xA7,0xA7,0xA1,0xA4,0x9F,0x8E,0x94,0x9A,0x93,0x93,0x94,0x92,0x90,0x87,0x86,0x8B, + 0x84,0x87,0x80,0x80,0x96,0x86,0x72,0x81,0x78,0x61,0x67,0x6C,0x6C,0x6B,0x62,0x68, + 0x69,0x55,0x55,0x5F,0x59,0x59,0x5E,0x5F,0x5F,0x57,0x54,0x5A,0x56,0x56,0x53,0x57, + 0x70,0x63,0x4F,0x61,0x5F,0x4C,0x52,0x5C,0x5F,0x5D,0x55,0x5B,0x60,0x50,0x53,0x5F, + 0x5D,0x5F,0x63,0x67,0x6B,0x68,0x6A,0x70,0x6F,0x75,0x79,0x7C,0x9A,0x9F,0x8E,0xA0, + 0xA7,0x96,0x99,0xA5,0xAB,0xB0,0xAA,0xAA,0xB1,0xA2,0x9B,0xA4,0xA0,0x9C,0x9E,0x9F, + 0x9B,0x92,0x8D,0x91,0x8D,0x8B,0x8D,0x84,0x97,0xA0,0x87,0x8F,0x9D,0x8D,0x88,0x94, + 0x9A,0x9D,0x99,0x98,0xA3,0x9A,0x91,0x9B,0x9C,0x99,0x9D,0xA1,0xA5,0xA0,0x9D,0x9F, + 0x9C,0x9B,0xA0,0x97,0xA3,0xB9,0xA2,0x9A,0xAC,0x9D,0x8F,0x97,0x9B,0xA0,0x9D,0x94, + 0x9B,0x97,0x88,0x8F,0x94,0x8E,0x8C,0x8C,0x8A,0x85,0x7E,0x7F,0x81,0x7B,0x7E,0x77, + 0x6F,0x87,0x80,0x68,0x79,0x75,0x5D,0x5E,0x63,0x63,0x61,0x59,0x5D,0x5E,0x4C,0x48, + 0x4D,0x48,0x45,0x48,0x48,0x46,0x44,0x41,0x41,0x40,0x43,0x43,0x3B,0x53,0x5B,0x3F, + 0x48,0x55,0x43,0x40,0x4C,0x52,0x54,0x4F,0x51,0x5C,0x57,0x52,0x5F,0x65,0x64,0x67, + 0x6B,0x70,0x6D,0x6E,0x73,0x75,0x76,0x7B,0x76,0x83,0xA0,0x90,0x89,0xA1,0x9A,0x90, + 0x9B,0xA6,0xB0,0xAF,0xAC,0xB9,0xBC,0xB0,0xB6,0xC1,0xBF,0xBF,0xC1,0xC0,0xBD,0xB7, + 0xB5,0xB8,0xB2,0xB2,0xA8,0xA5,0xBF,0xB1,0x98,0xA8,0xA5,0x90,0x92,0x9A,0x9B,0x97, + 0x91,0x96,0x99,0x8B,0x89,0x94,0x92,0x8E,0x92,0x97,0x98,0x94,0x93,0x95,0x92,0x93, + 0x91,0x8B,0xA3,0xAA,0x8F,0x96,0xA0,0x8C,0x86,0x8E,0x95,0x96,0x8C,0x8A,0x91,0x86, + 0x7D,0x85,0x85,0x80,0x7F,0x80,0x80,0x7D,0x78,0x7A,0x7C,0x7A,0x76,0x6D,0x7E,0x8B, + 0x72,0x70,0x7D,0x6B,0x61,0x68,0x6C,0x70,0x6A,0x66,0x6E,0x69,0x5A,0x5B,0x5F,0x5C, + 0x59,0x56,0x57,0x54,0x4B,0x47,0x48,0x47,0x47,0x3F,0x4A,0x62,0x50,0x41,0x53,0x4E, + 0x41,0x45,0x4E,0x58,0x54,0x4B,0x55,0x58,0x50,0x53,0x5C,0x5F,0x5D,0x5D,0x66,0x6A, + 0x66,0x65,0x6A,0x6E,0x70,0x67,0x73,0x94,0x86,0x75,0x89,0x8A,0x7E,0x81,0x8A,0x97, + 0x99,0x91,0x9A,0xA3,0x9C,0x9C,0xA4,0xAB,0xAF,0xB1,0xB8,0xBC,0xBA,0xB6,0xBA,0xBC, + 0xBD,0xB6,0xB4,0xCF,0xCB,0xAF,0xB5,0xB9,0xAA,0xA4,0xA3,0xA9,0xA8,0x98,0x96,0x9A, + 0x8E,0x84,0x84,0x88,0x89,0x83,0x83,0x89,0x86,0x80,0x80,0x81,0x84,0x7C,0x76,0x94, + 0x96,0x7A,0x81,0x88,0x7E,0x7A,0x7B,0x87,0x8E,0x83,0x80,0x8A,0x86,0x80,0x80,0x85, + 0x8C,0x87,0x84,0x8A,0x8B,0x84,0x81,0x87,0x8B,0x82,0x7E,0x9A,0x9E,0x83,0x84,0x88, + 0x7F,0x7B,0x79,0x84,0x8D,0x80,0x79,0x82,0x81,0x79,0x75,0x7A,0x7D,0x74,0x70,0x74, + 0x74,0x6C,0x67,0x67,0x6B,0x5F,0x5C,0x79,0x74,0x5B,0x5F,0x5F,0x58,0x54,0x51,0x5E, + 0x65,0x55,0x51,0x5B,0x59,0x50,0x50,0x58,0x5D,0x59,0x56,0x5C,0x5E,0x58,0x52,0x56, + 0x5D,0x53,0x5A,0x78,0x6E,0x5F,0x67,0x68,0x67,0x65,0x67,0x74,0x78,0x6D,0x6D,0x76, + 0x75,0x72,0x73,0x7C,0x84,0x83,0x85,0x8C,0x8E,0x8C,0x8A,0x93,0x98,0x92,0xA7,0xBC, + 0xAA,0xA4,0xAA,0xA5,0xA3,0xA1,0xA2,0xAF,0xB0,0xA2,0x9F,0xA2,0x9B,0x91,0x8D,0x91, + 0x92,0x8F,0x8A,0x87,0x86,0x81,0x7A,0x7F,0x7A,0x74,0x8E,0x90,0x79,0x7C,0x7B,0x75, + 0x76,0x73,0x7B,0x87,0x83,0x7E,0x82,0x87,0x84,0x7E,0x81,0x8A,0x8C,0x8B,0x8A,0x8D, + 0x8E,0x8C,0x89,0x8B,0x87,0x94,0xAB,0x9D,0x90,0x96,0x90,0x8D,0x8C,0x8B,0x96,0x9A, + 0x93,0x8E,0x8F,0x92,0x8F,0x8B,0x8F,0x95,0x96,0x92,0x8B,0x8C,0x8B,0x83,0x82,0x7E, + 0x81,0x9B,0x9A,0x84,0x87,0x85,0x7C,0x7A,0x74,0x79,0x82,0x7C,0x74,0x71,0x71,0x71, + 0x6C,0x66,0x67,0x6E,0x6D,0x66,0x65,0x66,0x61,0x5C,0x59,0x53,0x68,0x7B,0x68,0x5D, + 0x60,0x5B,0x5C,0x57,0x59,0x69,0x6F,0x6A,0x65,0x64,0x69,0x6B,0x65,0x65,0x6D,0x75, + 0x74,0x70,0x73,0x77,0x76,0x75,0x72,0x7B,0x97,0x96,0x84,0x86,0x88,0x8A,0x8C,0x89, + 0x91,0x9D,0xA1,0x9C,0x98,0x9E,0xA6,0xA4,0x9E,0x9E,0xA5,0xAA,0xA4,0x9E,0x9D,0x99, + 0x96,0x8E,0x88,0x9E,0xAA,0x97,0x8B,0x83,0x7E,0x80,0x77,0x70,0x77,0x7F,0x7C,0x73, + 0x6A,0x6D,0x74,0x72,0x6E,0x72,0x79,0x7B,0x79,0x76,0x76,0x78,0x78,0x72,0x7F,0x95, + 0x91,0x86,0x82,0x7E,0x84,0x88,0x83,0x86,0x8F,0x96,0x97,0x8F,0x8A,0x8E,0x90,0x8F, + 0x90,0x92,0x96,0x98,0x96,0x93,0x90,0x8E,0x89,0x8D,0xA2,0xA3,0x98,0x92,0x88,0x85, + 0x87,0x83,0x82,0x88,0x8B,0x8F,0x8B,0x81,0x7E,0x81,0x7F,0x7B,0x7A,0x7C,0x7C,0x77, + 0x73,0x6E,0x6B,0x66,0x64,0x76,0x7F,0x73,0x6B,0x63,0x5C,0x61,0x5E,0x56,0x5A,0x5E, + 0x61,0x67,0x61,0x5D,0x61,0x60,0x61,0x62,0x62,0x66,0x68,0x69,0x6A,0x69,0x67,0x64, + 0x72,0x86,0x82,0x7F,0x7D,0x74,0x7A,0x7F,0x79,0x7C,0x7E,0x7E,0x87,0x8A,0x86,0x88, + 0x89,0x88,0x8D,0x8F,0x8C,0x8E,0x8F,0x90,0x91,0x93,0x93,0x91,0x9B,0xA2,0x98,0x97, + 0x95,0x8E,0x96,0x95,0x8B,0x8D,0x89,0x84,0x88,0x85,0x83,0x85,0x80,0x7D,0x7F,0x7D, + 0x7B,0x7C,0x7E,0x7C,0x7B,0x7C,0x7A,0x7A,0x82,0x81,0x7D,0x83,0x82,0x80,0x86,0x82, + 0x7E,0x85,0x84,0x84,0x86,0x84,0x84,0x84,0x81,0x84,0x87,0x87,0x88,0x8A,0x8A,0x8A, + 0x89,0x8C,0x8B,0x8A,0x8F,0x8C,0x8A,0x8E,0x8B,0x8D,0x92,0x8D,0x89,0x8C,0x88,0x87, + 0x8A,0x88,0x85,0x84,0x81,0x83,0x86,0x84,0x84,0x85,0x85,0x85,0x85,0x85,0x80,0x7F, + 0x86,0x86,0x80,0x81,0x7F,0x7D,0x81,0x7C,0x7B,0x7C,0x77,0x77,0x79,0x73,0x70,0x6F, + 0x6E,0x6F,0x6F,0x6E,0x6F,0x6F,0x70,0x72,0x76,0x75,0x73,0x73,0x7B,0x7C,0x75,0x79, + 0x7A,0x78,0x7D,0x7C,0x7A,0x7C,0x78,0x78,0x7D,0x79,0x76,0x78,0x75,0x73,0x78,0x7A, + 0x7A,0x7A,0x7B,0x80,0x82,0x80,0x82,0x83,0x86,0x8B,0x88,0x87,0x8A,0x85,0x89,0x91, + 0x8B,0x88,0x87,0x83,0x84,0x83,0x80,0x82,0x7E,0x79,0x7D,0x7F,0x7C,0x7C,0x7D,0x7F, + 0x7F,0x7E,0x7E,0x7E,0x7A,0x7F,0x83,0x7D,0x7E,0x7D,0x7B,0x81,0x7F,0x78,0x7E,0x7C, + 0x77,0x7B,0x7A,0x78,0x78,0x75,0x77,0x7B,0x7B,0x7B,0x7E,0x7F,0x81,0x84,0x85,0x86, + 0x84,0x82,0x89,0x8D,0x86,0x88,0x89,0x85,0x8A,0x8C,0x89,0x8B,0x88,0x86,0x8B,0x87, + 0x83,0x83,0x80,0x7F,0x83,0x84,0x84,0x84,0x85,0x86,0x86,0x86,0x86,0x86,0x84,0x86, + 0x8B,0x85,0x80,0x85,0x87,0x94,0x7D,0x65,0x7F,0x8D,0x83,0x72,0x8C,0x81,0x64,0x74, + 0x76,0x78,0x78,0x87,0x89,0x73,0x7C,0x84,0x84,0x77,0x7C,0x84,0x77,0x78,0x76,0x77, + 0x7E,0x7C,0x7B,0x85,0x78,0x6F,0x78,0x70,0x70,0x73,0x74,0x6F,0x74,0x78,0x71,0x7B, + 0x82,0x81,0x80,0x7E,0x87,0x87,0x88,0x8A,0x82,0x81,0x83,0x85,0x85,0x87,0x88,0x7D, + 0x7E,0x83,0x7F,0x84,0x7F,0x78,0x77,0x78,0x72,0x6F,0x76,0x75,0x7F,0x84,0x76,0x75, + 0x7F,0x81,0x81,0x8D,0x8F,0x85,0x84,0x82,0x84,0x87,0x89,0x86,0x82,0x81,0x80,0x83, + 0x83,0x83,0x7A,0x71,0x75,0x76,0x70,0x71,0x72,0x70,0x70,0x72,0x76,0x77,0x74,0x76, + 0x77,0x77,0x78,0x7A,0x7A,0x7D,0x82,0x8D,0x8A,0x80,0x8A,0x83,0x7D,0x89,0x8A,0x84, + 0x84,0x85,0x82,0x89,0x87,0x81,0x82,0x74,0x77,0x80,0x81,0x80,0x80,0x82,0x81,0x83, + 0x80,0x7C,0x82,0x86,0x7E,0x87,0x8A,0x89,0x89,0x7F,0x7E,0x7F,0x86,0x85,0x86,0x84, + 0x79,0x7E,0x85,0x81,0x7F,0x7D,0x77,0x7C,0x7C,0x7E,0x7F,0x7C,0x7F,0x82,0x82,0x7A, + 0x80,0x85,0x85,0x83,0x84,0x87,0x81,0x82,0x80,0x7C,0x7C,0x7F,0x7C,0x7D,0x7B,0x74, + 0x7A,0x76,0x76,0x7B,0x78,0x7A,0x7E,0x7C,0x76,0x7C,0x82,0x7F,0x83,0x82,0x85,0x83, + 0x85,0x8B,0x8A,0x90,0x8A,0x82,0x85,0x83,0x85,0x85,0x85,0x81,0x81,0x78,0x76,0x82, + 0x80,0x83,0x87,0x7D,0x7B,0x83,0x83,0x82,0x7E,0x81,0x8A,0x89,0x85,0x85,0x85,0x7D, + 0x7A,0x86,0x92,0x93,0x8F,0x86,0x79,0x7D,0x82,0x72,0x71,0x73,0x6F,0x79,0x80,0x7F, + 0x86,0x81,0x7A,0x85,0x89,0x7F,0x7E,0x7D,0x7F,0x89,0x83,0x7F,0x82,0x7F,0x7B,0x79, + 0x84,0x95,0x97,0x96,0x8C,0x76,0x76,0x80,0x7F,0x7F,0x7D,0x79,0x81,0x8A,0x89,0x86, + 0x80,0x81,0x87,0x86,0x83,0x82,0x80,0x88,0x8E,0x87,0x85,0x81,0x7D,0x7A,0x78,0x85, + 0x98,0x9C,0x95,0x8D,0x7F,0x7E,0x80,0x7A,0x75,0x75,0x78,0x83,0x8A,0x85,0x87,0x86, + 0x87,0x86,0x7F,0x79,0x79,0x7C,0x7F,0x84,0x87,0x89,0x89,0x87,0x7E,0x76,0x7F,0x9A, + 0x99,0x94,0x8D,0x7D,0x80,0x81,0x7E,0x77,0x7A,0x7E,0x88,0x88,0x79,0x81,0x88,0x86, + 0x83,0x7F,0x79,0x81,0x83,0x7C,0x80,0x80,0x80,0x7C,0x79,0x79,0x73,0x80,0x9D,0x91, + 0x84,0x8F,0x7F,0x83,0x8E,0x7A,0x79,0x7F,0x77,0x7F,0x82,0x79,0x83,0x88,0x89,0x86, + 0x82,0x83,0x80,0x83,0x7E,0x7D,0x81,0x7E,0x7F,0x80,0x7D,0x7A,0x7D,0x94,0x95,0x80, + 0x88,0x81,0x7B,0x8B,0x7C,0x6F,0x79,0x73,0x7A,0x83,0x75,0x7C,0x85,0x87,0x89,0x81, + 0x81,0x87,0x82,0x7C,0x7B,0x7C,0x85,0x80,0x7C,0x80,0x73,0x75,0x93,0x8E,0x7C,0x8C, + 0x85,0x80,0x8C,0x7A,0x71,0x7D,0x7C,0x7D,0x7E,0x70,0x7C,0x87,0x8B,0x8C,0x82,0x85, + 0x8B,0x81,0x7A,0x7E,0x7D,0x85,0x83,0x7B,0x7E,0x79,0x7C,0x99,0x93,0x7E,0x8A,0x80, + 0x82,0x89,0x73,0x71,0x7F,0x74,0x74,0x7A,0x71,0x7D,0x84,0x82,0x81,0x7D,0x84,0x8A, + 0x80,0x7B,0x7F,0x80,0x81,0x79,0x7A,0x7E,0x71,0x80,0x98,0x85,0x80,0x8D,0x7E,0x87, + 0x87,0x6D,0x75,0x7B,0x6F,0x75,0x77,0x6D,0x7F,0x7F,0x7B,0x86,0x7F,0x84,0x88,0x81, + 0x7D,0x79,0x7B,0x82,0x7A,0x7C,0x81,0x76,0x83,0x91,0x82,0x83,0x8A,0x7E,0x88,0x83, + 0x6E,0x7D,0x7D,0x71,0x7C,0x73,0x70,0x83,0x76,0x7C,0x86,0x76,0x82,0x88,0x7E,0x7D, + 0x7D,0x7D,0x7B,0x76,0x78,0x79,0x73,0x82,0x8A,0x7A,0x83,0x8B,0x7E,0x8A,0x80,0x70, + 0x7F,0x75,0x74,0x79,0x6D,0x77,0x84,0x74,0x79,0x7E,0x79,0x86,0x82,0x80,0x80,0x7C, + 0x7B,0x7C,0x7B,0x7D,0x7D,0x77,0x8B,0x8A,0x7C,0x89,0x86,0x7C,0x8A,0x7A,0x73,0x84, + 0x73,0x76,0x7E,0x72,0x7C,0x7E,0x75,0x80,0x80,0x83,0x8E,0x82,0x7D,0x85,0x81,0x7D, + 0x7E,0x79,0x7E,0x7A,0x7A,0x8C,0x7F,0x7A,0x89,0x7D,0x81,0x8B,0x7A,0x7B,0x84,0x76, + 0x7A,0x75,0x6E,0x80,0x78,0x77,0x82,0x7A,0x84,0x89,0x7B,0x83,0x87,0x7E,0x7C,0x77, + 0x78,0x7D,0x75,0x7E,0x88,0x79,0x84,0x8C,0x81,0x8A,0x88,0x79,0x84,0x7F,0x76,0x80, + 0x73,0x77,0x81,0x7C,0x7C,0x7F,0x7E,0x85,0x84,0x7C,0x89,0x86,0x84,0x82,0x7B,0x81, + 0x7A,0x79,0x85,0x83,0x7B,0x88,0x88,0x81,0x86,0x80,0x81,0x86,0x7C,0x7C,0x7C,0x72, + 0x7D,0x7C,0x75,0x7D,0x7A,0x7D,0x86,0x81,0x83,0x89,0x86,0x83,0x7D,0x7E,0x7E,0x78, + 0x81,0x88,0x80,0x82,0x86,0x7E,0x86,0x83,0x7E,0x87,0x7F,0x7C,0x7F,0x79,0x79,0x80, + 0x79,0x79,0x7D,0x7B,0x85,0x83,0x82,0x87,0x84,0x86,0x85,0x7E,0x85,0x81,0x7F,0x8A, + 0x82,0x81,0x86,0x83,0x89,0x89,0x7F,0x85,0x88,0x7E,0x84,0x7D,0x7D,0x86,0x7B,0x7A, + 0x81,0x7F,0x84,0x86,0x81,0x87,0x83,0x85,0x89,0x80,0x81,0x82,0x7F,0x89,0x88,0x7E, + 0x89,0x85,0x85,0x89,0x81,0x83,0x88,0x82,0x85,0x82,0x7A,0x82,0x7B,0x78,0x7D,0x7B, + 0x7E,0x83,0x7E,0x84,0x89,0x85,0x8A,0x84,0x84,0x84,0x7E,0x85,0x86,0x81,0x86,0x8A, + 0x84,0x8A,0x83,0x7F,0x87,0x81,0x82,0x84,0x80,0x83,0x82,0x79,0x81,0x7E,0x7C,0x83, + 0x7F,0x81,0x86,0x84,0x84,0x84,0x83,0x87,0x81,0x85,0x8A,0x80,0x83,0x84,0x80,0x84, + 0x83,0x7F,0x85,0x85,0x83,0x83,0x7F,0x81,0x7F,0x7D,0x7D,0x7F,0x7E,0x81,0x82,0x83, + 0x86,0x83,0x83,0x81,0x82,0x80,0x81,0x86,0x86,0x81,0x85,0x86,0x7F,0x86,0x82,0x80, + 0x83,0x81,0x81,0x82,0x7C,0x7E,0x82,0x7B,0x7D,0x7F,0x7E,0x81,0x7F,0x7D,0x81,0x80, + 0x82,0x85,0x80,0x85,0x83,0x88,0x8B,0x83,0x84,0x83,0x83,0x84,0x7E,0x7D,0x85,0x80, + 0x7D,0x7E,0x7D,0x7E,0x7D,0x7B,0x7C,0x81,0x7F,0x82,0x80,0x7F,0x82,0x81,0x80,0x84, + 0x83,0x82,0x89,0x84,0x85,0x86,0x84,0x83,0x87,0x84,0x7D,0x82,0x82,0x7E,0x7C,0x7F, + 0x7D,0x7D,0x7D,0x7B,0x7B,0x7D,0x82,0x80,0x82,0x8F,0x90,0x86,0x8C,0x7E,0x77,0x78, + 0x76,0x84,0x7C,0x82,0x7E,0x7C,0x87,0x6B,0x78,0x99,0x79,0x74,0x81,0x75,0x73,0x63, + 0x76,0x86,0x7C,0x82,0x79,0x72,0x72,0x75,0x78,0x76,0x75,0x7F,0x81,0x7C,0x78,0x75, + 0x79,0x78,0x7B,0x82,0x86,0x7F,0x86,0x8D,0x7F,0x77,0x86,0x91,0x87,0x84,0x83,0x7C, + 0x82,0x92,0x95,0x97,0xA9,0xA6,0x9B,0x9B,0x9C,0x94,0x86,0x8A,0x97,0x93,0x99,0x98, + 0x89,0x84,0x7D,0x7B,0x7B,0x74,0x6F,0x74,0x75,0x72,0x6B,0x64,0x64,0x64,0x6B,0x73, + 0x6C,0x6B,0x70,0x6A,0x67,0x64,0x62,0x67,0x70,0x73,0x6E,0x6D,0x6E,0x77,0x7C,0x6D, + 0x63,0x6A,0x76,0x79,0x71,0x6B,0x75,0x76,0x67,0x67,0x69,0x6D,0x70,0x68,0x73,0x80, + 0x7D,0x7F,0x82,0x8D,0x94,0xA0,0xA9,0x97,0x99,0x9A,0x96,0x9B,0x87,0x7D,0x85,0x7F, + 0x7B,0x7D,0x7F,0x8A,0x86,0x7D,0x87,0x8A,0x87,0x80,0x79,0x87,0x89,0x7F,0x83,0x88, + 0x80,0x81,0x9F,0x9B,0x91,0x9B,0x91,0x94,0x82,0x66,0x78,0x7C,0x70,0x78,0x7C,0x8E, + 0x9D,0x86,0x84,0x8B,0x82,0x7F,0x79,0x85,0x8F,0x82,0x7F,0x87,0x80,0x8F,0xAB,0x97, + 0xA2,0xAD,0x97,0x95,0x81,0x7D,0x99,0x8C,0x86,0x91,0x8C,0x98,0x8A,0x70,0x81,0x7F, + 0x68,0x6C,0x70,0x7C,0x76,0x62,0x64,0x62,0x54,0x5C,0x78,0x73,0x72,0x6E,0x60,0x61, + 0x50,0x45,0x5B,0x5E,0x5D,0x68,0x69,0x72,0x6A,0x5B,0x63,0x67,0x63,0x66,0x6E,0x7C, + 0x76,0x66,0x63,0x64,0x5D,0x6A,0x84,0x77,0x72,0x77,0x6A,0x72,0x68,0x66,0x81,0x83, + 0x8B,0x9E,0xA5,0xA8,0x9F,0x90,0x97,0x99,0x90,0x95,0x9E,0x9D,0x8F,0x87,0x86,0x88, + 0x7D,0x87,0xA2,0x9B,0x93,0x92,0x87,0x88,0x80,0x7C,0x93,0x99,0x94,0x9A,0x96,0x8D, + 0x84,0x7C,0x82,0x8B,0x8E,0x8F,0x8F,0x8D,0x82,0x77,0x7C,0x86,0x7F,0x95,0xAF,0x9C, + 0x96,0x91,0x85,0x86,0x7A,0x83,0x9B,0x96,0x94,0x97,0x92,0x92,0x87,0x86,0x98,0x99, + 0x94,0x9C,0xA2,0x96,0x89,0x87,0x8A,0x8E,0x83,0x8F,0xA8,0x93,0x81,0x7D,0x75,0x74, + 0x67,0x6E,0x7E,0x7C,0x73,0x6F,0x68,0x61,0x5B,0x57,0x66,0x6B,0x64,0x66,0x63,0x5C, + 0x57,0x56,0x61,0x5B,0x60,0x82,0x77,0x63,0x67,0x5D,0x5C,0x5A,0x5E,0x74,0x78,0x69, + 0x68,0x68,0x5F,0x5D,0x5A,0x66,0x75,0x71,0x73,0x7C,0x75,0x6F,0x79,0x82,0x90,0x99, + 0x97,0xB6,0xB8,0x95,0x99,0x97,0x8E,0x92,0x8E,0xA0,0xAC,0x96,0x8A,0x8E,0x88,0x85, + 0x85,0x8C,0x9B,0x94,0x89,0x8D,0x8B,0x87,0x87,0x89,0x8F,0x84,0x95,0xA9,0x8C,0x89, + 0x8D,0x80,0x7F,0x7C,0x86,0x9B,0x8E,0x82,0x8E,0x89,0x85,0x87,0x89,0x97,0x97,0x88, + 0x8F,0x98,0x8C,0x88,0x90,0x8F,0x96,0x95,0x8C,0xA8,0xA6,0x85,0x91,0x97,0x8F,0x92, + 0x91,0x9C,0xA4,0x8D,0x88,0x90,0x88,0x88,0x85,0x88,0x8F,0x82,0x76,0x7B,0x73,0x6C, + 0x6F,0x6C,0x6E,0x63,0x72,0x82,0x61,0x5C,0x65,0x57,0x55,0x55,0x5D,0x70,0x65,0x59, + 0x67,0x63,0x59,0x5B,0x60,0x6C,0x6C,0x61,0x67,0x6C,0x62,0x5E,0x63,0x65,0x65,0x61, + 0x61,0x7D,0x77,0x5D,0x6C,0x6F,0x66,0x6A,0x71,0x84,0x8E,0x7E,0x89,0x99,0x90,0x90, + 0x95,0x9C,0xA1,0x99,0x94,0x9B,0x93,0x8E,0x90,0x8F,0x90,0x81,0x91,0xA7,0x8A,0x82, + 0x94,0x85,0x7E,0x81,0x88,0x9A,0x8E,0x81,0x8E,0x8C,0x7D,0x80,0x86,0x8F,0x8F,0x7F, + 0x86,0x8E,0x7F,0x7B,0x87,0x89,0x8A,0x87,0x87,0xA2,0x9A,0x7F,0x8D,0x91,0x83,0x85, + 0x89,0x98,0x9A,0x86,0x8C,0x96,0x89,0x86,0x8D,0x95,0x98,0x8E,0x8E,0x97,0x8C,0x88, + 0x8D,0x8E,0x8D,0x82,0x86,0xA1,0x90,0x7B,0x8A,0x81,0x73,0x6F,0x70,0x80,0x7B,0x68, + 0x72,0x76,0x64,0x5F,0x66,0x6D,0x6C,0x63,0x66,0x6F,0x62,0x5B,0x65,0x65,0x60,0x61, + 0x5D,0x72,0x79,0x5B,0x65,0x72,0x5F,0x5A,0x62,0x6C,0x6F,0x5F,0x62,0x71,0x63,0x5C, + 0x68,0x6F,0x71,0x6D,0x73,0x7B,0x76,0x74,0x80,0x84,0x88,0x86,0x86,0xA8,0xA8,0x8B, + 0x9B,0xA1,0x8A,0x89,0x8F,0x99,0x9B,0x8A,0x8E,0x99,0x87,0x7E,0x89,0x8C,0x8A,0x88, + 0x89,0x8E,0x83,0x7E,0x86,0x85,0x80,0x84,0x7C,0x87,0x9C,0x80,0x7D,0x92,0x81,0x77, + 0x81,0x88,0x90,0x88,0x83,0x93,0x8B,0x7D,0x88,0x8D,0x8A,0x8C,0x90,0x94,0x8F,0x87, + 0x8B,0x8C,0x8B,0x8C,0x83,0x98,0xA7,0x89,0x8E,0x9C,0x88,0x81,0x84,0x8F,0x94,0x85, + 0x84,0x92,0x86,0x78,0x7F,0x84,0x81,0x7C,0x7C,0x80,0x7A,0x70,0x73,0x75,0x6E,0x6E, + 0x67,0x69,0x83,0x72,0x5D,0x73,0x6A,0x58,0x5E,0x65,0x6A,0x67,0x60,0x6A,0x6B,0x5A, + 0x5E,0x66,0x66,0x67,0x66,0x6A,0x6A,0x62,0x62,0x66,0x64,0x66,0x5F,0x66,0x82,0x72, + 0x67,0x7D,0x76,0x69,0x72,0x7C,0x87,0x87,0x84,0x92,0x97,0x8A,0x8E,0x98,0x96,0x97, + 0x97,0x9B,0x9B,0x93,0x92,0x94,0x8F,0x8C,0x8C,0x83,0x98,0xA0,0x84,0x8C,0x92,0x7E, + 0x7C,0x82,0x88,0x8C,0x81,0x82,0x8C,0x7F,0x78,0x81,0x85,0x85,0x86,0x88,0x8D,0x89, + 0x85,0x89,0x88,0x86,0x87,0x82,0x96,0xA7,0x8A,0x8E,0x9F,0x8A,0x83,0x8B,0x8F,0x94, + 0x8D,0x8C,0x9B,0x91,0x82,0x89,0x92,0x90,0x8D,0x8F,0x92,0x90,0x8B,0x8A,0x88,0x85, + 0x88,0x80,0x7D,0x98,0x8B,0x75,0x89,0x82,0x6C,0x70,0x75,0x7C,0x74,0x6D,0x84,0x74, + 0x70,0x60,0x51,0x6D,0x60,0x50,0x56,0x63,0x64,0x6A,0x74,0x72,0x6D,0x6B,0x74,0x99, + 0x9A,0x77,0x8E,0x95,0x6E,0x65,0x59,0x63,0x70,0x46,0x41,0x5F,0x4E,0x34,0x3C,0x3E, + 0x3F,0x54,0x64,0x6A,0x5D,0x64,0x7B,0x7F,0x87,0x95,0x9B,0xB9,0xD6,0xB2,0xB7,0xDA, + 0xD8,0xCC,0xA9,0xCC,0xD7,0xAF,0xC1,0xB9,0xBA,0xB9,0xA4,0x9A,0x8E,0x8C,0x96,0x82, + 0x70,0x70,0x5B,0x6E,0x6C,0x62,0x7C,0x6E,0x7F,0x7C,0x54,0x77,0x7A,0x3D,0x3E,0x55, + 0x5D,0x60,0x59,0x5C,0x63,0x5A,0x62,0x73,0x7C,0x8D,0x89,0x9C,0xB2,0xA5,0x97,0x9F, + 0xA3,0xA1,0xAE,0xBA,0xD5,0xDB,0xB3,0xBD,0xD4,0xB7,0xB1,0xAE,0xB1,0xAB,0x9B,0x9A, + 0x95,0x90,0x7A,0x70,0x7A,0x79,0x7C,0x73,0x64,0x57,0x40,0x41,0x4A,0x44,0x35,0x31, + 0x4A,0x55,0x3C,0x3D,0x65,0x57,0x4C,0x62,0x5F,0x65,0x6D,0x6A,0x74,0x70,0x5A,0x69, + 0x78,0x78,0x7E,0x79,0x80,0x99,0x9A,0xA2,0xA9,0x98,0x9D,0x96,0x8A,0xB1,0x99,0x6C, + 0x93,0x8B,0x76,0x8A,0x84,0x82,0x7B,0x6F,0x83,0x9B,0x8B,0x7F,0x78,0x72,0x82,0x76, + 0x6A,0x6B,0x67,0x6B,0x61,0x52,0x45,0x46,0x5E,0x6E,0x70,0x66,0x69,0x7D,0x7A,0x70, + 0x7F,0x7A,0x75,0x81,0x86,0x9E,0x9B,0x93,0x9C,0xA1,0xA9,0xA7,0xAF,0xB7,0xAE,0xC2, + 0xCD,0xC4,0xD0,0xBF,0xBA,0xC8,0xBD,0xB3,0xAF,0xA3,0x8B,0x7B,0x74,0x72,0x80,0x6C, + 0x69,0x87,0x7F,0x73,0x63,0x4C,0x47,0x53,0x68,0x73,0x67,0x5A,0x66,0x6E,0x66,0x61, + 0x70,0x7B,0x75,0x69,0x6E,0x78,0x7B,0x82,0x77,0x87,0x9A,0x95,0x8A,0x70,0x6D,0x7E, + 0x81,0x87,0x89,0x86,0x95,0x93,0x78,0x6C,0x75,0x74,0x79,0x84,0x7E,0x7F,0x7A,0x79, + 0x8C,0x87,0x7B,0x7C,0x7A,0x81,0x78,0x67,0x61,0x50,0x45,0x5C,0x75,0x70,0x5B,0x4F, + 0x5B,0x64,0x6C,0x70,0x70,0x72,0x78,0x84,0x7F,0x86,0x6D,0x72,0x8F,0x82,0x87,0x7F, + 0x80,0x8F,0x8E,0x89,0x86,0x89,0x85,0x7F,0x93,0x96,0x7A,0x7F,0x7B,0x7A,0x83,0x75, + 0x7F,0x84,0x88,0x8E,0xA3,0xA0,0x90,0x9F,0x9F,0xA3,0x9A,0x9D,0xA7,0xB0,0xAF,0xAF, + 0xB5,0xA5,0x9F,0xA4,0xA6,0x9B,0x93,0x90,0x90,0x91,0x83,0x8A,0x8C,0x82,0x86,0x7E, + 0x7D,0x7A,0x7A,0x7B,0x6F,0x6E,0x6A,0x74,0x7D,0x73,0x71,0x73,0x73,0x71,0x6F,0x68, + 0x65,0x64,0x60,0x6A,0x7E,0x86,0x6F,0x5E,0x65,0x6C,0x6B,0x73,0x76,0x6E,0x72,0x77, + 0x69,0x61,0x61,0x5C,0x6B,0x65,0x62,0x78,0x74,0x73,0x69,0x62,0x71,0x71,0x70,0x7B, + 0x7C,0x79,0x6D,0x6D,0x79,0x77,0x8C,0xAB,0xA3,0x99,0xA5,0xA2,0x98,0x91,0x86,0xA3, + 0xB9,0xAE,0xB2,0xAE,0xA7,0xA8,0xA8,0xA8,0x9A,0x93,0x96,0x98,0x95,0x85,0x82,0x82, + 0x7D,0x76,0x72,0x80,0x6C,0x54,0x59,0x4E,0x4D,0x54,0x50,0x5D,0x6D,0x61,0x5B,0x66, + 0x5E,0x5E,0x67,0x67,0x69,0x67,0x6B,0x6B,0x6B,0x65,0x60,0x6C,0x6F,0x75,0x8D,0x8C, + 0x86,0x8A,0x8D,0x9A,0x97,0x94,0xA1,0xB2,0xBE,0xAF,0xAE,0xAF,0xA3,0xA9,0xB1,0xB8, + 0xC1,0xB8,0xB9,0xBD,0xB0,0xAA,0x9C,0xA2,0x9C,0x94,0xA9,0x93,0x8D,0xA2,0x8A,0x79, + 0x77,0x70,0x84,0x92,0x78,0x68,0x73,0x6D,0x70,0x7B,0x6B,0x68,0x6A,0x62,0x75,0x76, + 0x65,0x5E,0x54,0x58,0x5A,0x68,0x6D,0x5F,0x64,0x67,0x65,0x60,0x5D,0x65,0x67,0x6E, + 0x66,0x62,0x6E,0x70,0x65,0x5B,0x5E,0x65,0x61,0x73,0x89,0x7D,0x6E,0x60,0x72,0x7B, + 0x82,0x8E,0x6B,0x63,0x72,0x82,0x83,0x73,0x7E,0x86,0x86,0x8B,0x86,0x84,0x89,0x82, + 0x8A,0x8D,0x8B,0x97,0x93,0x8C,0x8E,0x97,0x92,0x8E,0x8D,0x90,0xA1,0x9B,0x8D,0x91, + 0x97,0x9A,0x94,0x82,0x91,0xA3,0x9A,0x97,0x97,0xA1,0xAD,0xA5,0xA2,0xA7,0xA6,0xA5, + 0xA5,0xA9,0xB1,0xA8,0x96,0x95,0x9B,0xB6,0xC6,0xAC,0x9E,0x9A,0x94,0x96,0x85,0x70, + 0x7D,0x83,0x7A,0x74,0x6C,0x6B,0x6D,0x6B,0x65,0x63,0x68,0x6F,0x6F,0x70,0x6C,0x56, + 0x58,0x56,0x4F,0x65,0x61,0x53,0x56,0x5F,0x63,0x5A,0x4C,0x4A,0x61,0x66,0x60,0x5F, + 0x4E,0x4E,0x5B,0x5B,0x62,0x6A,0x6B,0x6B,0x69,0x70,0x76,0x67,0x62,0x61,0x67,0x7D, + 0x79,0x6C,0x65,0x6B,0x76,0x76,0x71,0x77,0x8C,0x91,0x82,0x78,0x7E,0x86,0x92,0x99, + 0x95,0x98,0x9D,0x98,0x9C,0xA7,0xA3,0x9A,0x95,0x94,0xA5,0xAC,0x9A,0x8F,0x8B,0x92, + 0xA0,0x9A,0x91,0x8D,0x9C,0xAB,0xA0,0x98,0x94,0x97,0x9A,0x97,0x94,0x8E,0x94,0x9C, + 0x97,0x98,0x9B,0x9B,0x9B,0x8E,0x98,0x9F,0x8D,0x83,0x7E,0x79,0x80,0x7D,0x74,0x79, + 0x80,0x84,0x83,0x79,0x76,0x73,0x6E,0x6E,0x70,0x6C,0x66,0x6C,0x6B,0x64,0x62,0x62, + 0x69,0x68,0x75,0x75,0x68,0x68,0x63,0x65,0x61,0x60,0x5E,0x5D,0x69,0x6E,0x6C,0x6C, + 0x6C,0x75,0x7C,0x75,0x71,0x68,0x64,0x66,0x66,0x65,0x5A,0x59,0x5F,0x62,0x68,0x6F, + 0x6C,0x69,0x74,0x76,0x6D,0x6A,0x6E,0x6E,0x74,0x7D,0x7D,0x86,0x87,0x8C,0x90,0x83, + 0x87,0x87,0x89,0x8F,0x8E,0x97,0x8F,0x87,0x98,0x9F,0xA1,0xA7,0xA2,0x9F,0xAA,0xAF, + 0xA4,0xA2,0xA6,0xA4,0xAC,0xAC,0xA0,0x9C,0xA0,0xA6,0xA2,0x98,0x93,0x98,0x97,0x97, + 0x9A,0x8E,0x90,0x92,0x90,0x8F,0x8E,0x8F,0x8F,0x91,0x8D,0x94,0x91,0x8D,0x92,0x89, + 0x88,0x8E,0x87,0x85,0x87,0x83,0x7E,0x7B,0x7C,0x7F,0x7F,0x80,0x7E,0x7F,0x82,0x82, + 0x7E,0x74,0x73,0x6F,0x6E,0x75,0x72,0x70,0x69,0x70,0x73,0x66,0x72,0x71,0x67,0x66, + 0x62,0x61,0x55,0x56,0x56,0x50,0x59,0x5B,0x5C,0x5C,0x61,0x64,0x61,0x67,0x63,0x67, + 0x6F,0x6D,0x6F,0x6B,0x63,0x6A,0x71,0x6F,0x71,0x6A,0x69,0x70,0x72,0x76,0x72,0x6C, + 0x6F,0x72,0x71,0x70,0x6B,0x68,0x6E,0x77,0x7C,0x7F,0x83,0x85,0x8B,0x91,0x8F,0x8E, + 0x90,0x8D,0x92,0x98,0x93,0x8F,0x8F,0x90,0x93,0x91,0x91,0x92,0x8D,0x8F,0x9A,0x9A, + 0x91,0x91,0x98,0x97,0x9F,0xA5,0x9D,0x9D,0xA0,0xA5,0xAB,0xA6,0xA3,0xA6,0xA2,0xA3, + 0xA7,0xA1,0x9D,0x9A,0x92,0x94,0x96,0x93,0x95,0x94,0x96,0x95,0x92,0x94,0x8E,0x92, + 0x94,0x93,0x93,0x91,0x90,0x8F,0x91,0x8D,0x8A,0x89,0x8A,0x8E,0x8B,0x89,0x87,0x80, + 0x7C,0x7B,0x7D,0x7E,0x75,0x74,0x74,0x71,0x72,0x6B,0x69,0x6C,0x6F,0x6E,0x71,0x70, + 0x6A,0x70,0x6F,0x6D,0x6F,0x6F,0x6F,0x6D,0x6D,0x6A,0x66,0x72,0x71,0x63,0x65,0x68, + 0x64,0x62,0x63,0x5E,0x59,0x64,0x66,0x63,0x6C,0x64,0x5D,0x67,0x64,0x65,0x69,0x61, + 0x64,0x67,0x6C,0x72,0x72,0x72,0x71,0x78,0x7D,0x7D,0x78,0x76,0x77,0x7A,0x7D,0x79, + 0x77,0x78,0x79,0x84,0x82,0x7E,0x82,0x83,0x8D,0x90,0x8A,0x8E,0x8C,0x88,0x91,0x8D, + 0x8A,0x8F,0x8A,0x8E,0x95,0x92,0x8F,0x8D,0x91,0x99,0x9E,0x98,0x96,0x96,0x94,0x9A, + 0x97,0x9A,0x99,0x95,0x9B,0x98,0x99,0x95,0x8B,0x8E,0x92,0x97,0x98,0x8F,0x8F,0x90, + 0x8B,0x8F,0x8C,0x88,0x8C,0x88,0x8E,0x8C,0x84,0x85,0x85,0x8B,0x87,0x8C,0x8E,0x8B, + 0x8E,0x8A,0x8E,0x8B,0x88,0x8D,0x8C,0x88,0x89,0x86,0x80,0x81,0x80,0x7D,0x7C,0x7B, + 0x7C,0x7D,0x7C,0x75,0x77,0x78,0x75,0x77,0x74,0x78,0x7D,0x7A,0x76,0x79,0x78,0x73, + 0x79,0x78,0x75,0x73,0x73,0x73,0x72,0x74,0x75,0x75,0x74,0x78,0x7B,0x78,0x77,0x74, + 0x72,0x75,0x7A,0x7C,0x74,0x72,0x73,0x77,0x78,0x74,0x72,0x73,0x77,0x7A,0x78,0x76, + 0x76,0x74,0x76,0x77,0x74,0x73,0x77,0x76,0x77,0x78,0x74,0x74,0x6F,0x74,0x7A,0x7B, + 0x7C,0x78,0x7B,0x7E,0x82,0x82,0x7D,0x7B,0x7F,0x86,0x85,0x80,0x7D,0x7D,0x80,0x82, + 0x81,0x7E,0x7F,0x80,0x7F,0x7F,0x7E,0x7E,0x7D,0x7F,0x82,0x82,0x81,0x7C,0x7C,0x7F, + 0x80,0x7F,0x81,0x7D,0x7A,0x82,0x82,0x83,0x82,0x7E,0x81,0x81,0x7F,0x80,0x81,0x82, + 0x84,0x83,0x84,0x86,0x84,0x83,0x82,0x7F,0x80,0x81,0x82,0x86,0x84,0x84,0x85,0x86, + 0x87,0x86,0x85,0x83,0x84,0x83,0x84,0x84,0x80,0x80,0x82,0x84,0x84,0x82,0x7F,0x7F, + 0x83,0x83,0x82,0x81,0x82,0x83,0x81,0x83,0x82,0x83,0x83,0x84,0x88,0x86,0x86,0x86, + 0x85,0x87,0x88,0x86,0x86,0x84,0x83,0x84,0x85,0x83,0x7F,0x80,0x81,0x82,0x82,0x7E, + 0x7D,0x7E,0x7C,0x80,0x81,0x7F,0x7E,0x7D,0x82,0x87,0x84,0x83,0x82,0x81,0x85,0x85, + 0x81,0x81,0x81,0x82,0x84,0x82,0x7F,0x81,0x83,0x7F,0x7F,0x7E,0x80,0x7F,0x7F,0x7F, + 0x7F,0x7F,0x7D,0x7E,0x80,0x80,0x7F,0x7E,0x7E,0x7C,0x7D,0x7D,0x7B,0x7C,0x7D,0x7E, + 0x81,0x80,0x7C,0x7C,0x81,0x81,0x7F,0x81,0x7E,0x7D,0x81,0x80,0x7E,0x81,0x80,0x80, + 0x84,0x81,0x80,0x84,0x83,0x84,0x81,0x7E,0x81,0x81,0x7F,0x7E,0x7F,0x7E,0x7E,0x7E, + 0x7D,0x7F,0x7D,0x7A,0x7F,0x7E,0x80,0x7F,0x79,0x7D,0x7E,0x7F,0x82,0x7F,0x81,0x83, + 0x82,0x84,0x80,0x80,0x81,0x82,0x83,0x82,0x84,0x83,0x83,0x81,0x7E,0x7F,0x80,0x7E, + 0x7D,0x7D,0x7B,0x7A,0x79,0x7B,0x7B,0x7D,0x7F,0x7B,0x7D,0x7E,0x81,0x80,0x7E,0x7E, + 0x81,0x80,0x81,0x83,0x80,0x80,0x80,0x83,0x80,0x81,0x82,0x7F,0x81,0x81,0x80,0x81, + 0x80,0x7F,0x80,0x80,0x7F,0x80,0x7E,0x81,0x83,0x7F,0x7E,0x7E,0x81,0x80,0x7F,0x83, + 0x81,0x81,0x81,0x82,0x80,0x7D,0x7F,0x80,0x81,0x81,0x80,0x80,0x7F,0x7F,0x80,0x82, + 0x81,0x80,0x81,0x82,0x81,0x80,0x80,0x7F,0x81,0x80,0x81,0x80,0x80,0x80,0x7E,0x80, + 0x7E,0x7D,0x7F,0x7E,0x7E,0x7E,0x7C,0x7D,0x7E,0x7E,0x7F,0x80,0x81,0x81,0x83,0x84, + 0x80,0x82,0x82,0x81,0x84,0x84,0x84,0x83,0x82,0x82,0x87,0x85,0x81,0x82,0x81,0x83, + 0x80,0x81,0x80,0x7E,0x81,0x7E,0x80,0x7F,0x7F,0x81,0x7F,0x80,0x80,0x80,0x80,0x81, + 0x82,0x82,0x80,0x83,0x84,0x82,0x82,0x82,0x80,0x81,0x84,0x81,0x83,0x82,0x7F,0x84, + 0x81,0x82,0x84,0x80,0x81,0x84,0x83,0x81,0x83,0x81,0x7F,0x80,0x80,0x7F,0x80,0x7C, + 0x80,0x7E,0x7E,0x81,0x7B,0x7D,0x7F,0x7D,0x7F,0x7F,0x7E,0x80,0x80,0x80,0x81,0x7F, + 0x7E,0x82,0x83,0x81,0x81,0x80,0x81,0x82,0x80,0x82,0x81,0x80,0x82,0x81,0x7E,0x80, + 0x7E,0x7D,0x80,0x7F,0x7B,0x7D,0x7F,0x7D,0x7E,0x7F,0x7D,0x7F,0x80,0x80,0x81,0x80, + 0x81,0x81,0x82,0x82,0x81,0x82,0x82,0x81,0x83,0x83,0x82,0x82,0x84,0x81,0x80,0x84, + 0x82,0x83,0x83,0x81,0x7F,0x80,0x80,0x7F,0x81,0x81,0x7F,0x7F,0x7F,0x7E,0x80,0x7D, + 0x7E,0x7C,0x7E,0x7F,0x7F,0x81,0x7D,0x7E,0x82,0x82,0x81,0x82,0x81,0x81,0x83,0x83, + 0x82,0x81,0x82,0x80,0x81,0x83,0x80,0x7F,0x81,0x81,0x81,0x81,0x7F,0x80,0x7E,0x7F, + 0x7E,0x7D,0x7F,0x7C,0x7E,0x7E,0x7D,0x7D,0x7D,0x7F,0x7D,0x7D,0x7E,0x7E,0x7D,0x7E, + 0x7E,0x7F,0x7E,0x7E,0x80,0x80,0x7F,0x80,0x82,0x80,0x82,0x83,0x83,0x82,0x80,0x84, + 0x82,0x81,0x82,0x80,0x7F,0x81,0x7F,0x7E,0x80,0x7E,0x7C,0x7F,0x80,0x7C,0x7E,0x7E, + 0x7D,0x7F,0x7D,0x7D,0x7E,0x7F,0x7E,0x80,0x80,0x7C,0x7F,0x81,0x81,0x7E,0x7F,0x81, + 0x7F,0x80,0x80,0x7F,0x80,0x80,0x81,0x80,0x81,0x7E,0x7D,0x81,0x7E,0x81,0x80,0x7F, + 0x80,0x7C,0x7B,0x7F,0x7D,0x7C,0x7F,0x7D,0x7F,0x82,0x7C,0x7E,0x7C,0x80,0x83,0x7F, + 0x80,0x7F,0x80,0x7F,0x7D,0x81,0x81,0x81,0x80,0x82,0x81,0x88,0x8B,0x90,0x93,0x81, + 0x7A,0x76,0x77,0x78,0x77,0x78,0x7E,0x6F,0x70,0x8F,0x78,0x72,0x83,0x7B,0x6F,0x6E, + 0x81,0x77,0x73,0x7A,0x77,0x79,0x84,0x87,0x83,0x8B,0x8D,0x88,0x82,0x83,0x8F,0x89, + 0x87,0x86,0x79,0x7D,0x86,0x86,0x88,0x9B,0x9C,0x92,0x92,0x80,0x82,0x93,0x8D,0x96, + 0x97,0x88,0x8D,0x93,0x8B,0x80,0x84,0x89,0x8C,0x90,0x84,0x7B,0x77,0x76,0x6F,0x63, + 0x6D,0x6E,0x70,0x70,0x6A,0x6D,0x6C,0x6F,0x72,0x75,0x6B,0x66,0x6A,0x69,0x6B,0x73, + 0x74,0x6C,0x67,0x6A,0x6F,0x6C,0x67,0x69,0x70,0x72,0x66,0x65,0x6D,0x71,0x6F,0x6D, + 0x74,0x77,0x73,0x74,0x82,0x87,0x8B,0xA4,0xB7,0xB2,0x9C,0x97,0x99,0x92,0x8F,0x8E, + 0x8E,0x8D,0x89,0x89,0x90,0x8B,0x80,0x81,0x89,0x85,0x7D,0x85,0x83,0x82,0x86,0x81, + 0x85,0x85,0x83,0x86,0x8B,0x89,0x87,0x93,0x92,0x8E,0x96,0x92,0x91,0x97,0x95,0x95, + 0x99,0x91,0x8C,0x91,0x95,0x95,0x98,0xA0,0x9B,0x9C,0x9C,0x8D,0x8C,0x91,0x93,0x92, + 0x92,0x93,0x92,0x8D,0x8B,0x8B,0x89,0x87,0x83,0x7D,0x7C,0x74,0x6E,0x70,0x6E,0x6A, + 0x69,0x68,0x65,0x60,0x61,0x64,0x62,0x5D,0x64,0x63,0x60,0x64,0x5F,0x62,0x66,0x64, + 0x66,0x66,0x63,0x62,0x62,0x65,0x62,0x5E,0x65,0x67,0x66,0x66,0x68,0x66,0x6D,0x6A, + 0x61,0x6F,0x75,0x75,0x7C,0x83,0x8E,0x9C,0xA3,0xA2,0x98,0x95,0x91,0x86,0x8A,0x87, + 0x88,0x93,0x94,0x8C,0x8C,0x88,0x80,0x82,0x7F,0x7A,0x80,0x80,0x80,0x81,0x81,0x89, + 0x8B,0x87,0x8C,0x90,0x91,0x97,0x9A,0x9F,0x9F,0x96,0x95,0x9D,0xA6,0xA4,0x9E,0xA2, + 0xA4,0xA3,0x95,0x8F,0x97,0x95,0x91,0x90,0x8F,0x98,0x99,0x92,0x96,0x9B,0x9E,0x95, + 0x92,0x96,0x98,0x95,0x8C,0x84,0x8C,0x99,0x8E,0x89,0x84,0x83,0x84,0x6E,0x5B,0x62, + 0x65,0x54,0x58,0x5F,0x67,0x67,0x5F,0x66,0x6C,0x6F,0x69,0x67,0x68,0x68,0x62,0x5C, + 0x5C,0x6D,0x79,0x6C,0x6D,0x6F,0x71,0x74,0x62,0x56,0x60,0x60,0x57,0x55,0x62,0x6E, + 0x72,0x73,0x7B,0x89,0x8A,0x8C,0x95,0x9D,0x9A,0x98,0x95,0x8E,0x9E,0xAA,0x9D,0x99, + 0x9D,0x97,0x90,0x7E,0x76,0x7F,0x78,0x71,0x75,0x7C,0x87,0x88,0x80,0x87,0x96,0x8F, + 0x86,0x8C,0x89,0x8A,0x8C,0x8C,0x87,0x8E,0xA9,0xA4,0x99,0xA3,0xAB,0xA2,0x94,0x8C, + 0x8E,0x92,0x86,0x85,0x91,0x97,0x99,0x98,0x9C,0xA0,0x96,0x8A,0x8D,0x8B,0x86,0x8A, + 0x8A,0x86,0x81,0x9D,0xA7,0x8D,0x8F,0x94,0x8A,0x79,0x6A,0x6D,0x73,0x67,0x5C,0x66, + 0x72,0x6D,0x65,0x6A,0x70,0x68,0x58,0x5F,0x64,0x59,0x58,0x60,0x5C,0x4B,0x67,0x7A, + 0x63,0x69,0x72,0x6A,0x5D,0x4F,0x55,0x60,0x58,0x52,0x65,0x74,0x72,0x68,0x71,0x7C, + 0x6F,0x68,0x71,0x80,0x80,0x82,0x94,0x9B,0x8F,0xA2,0xB9,0xA0,0x9A,0xA5,0x98,0x87, + 0x75,0x77,0x81,0x7B,0x73,0x7D,0x89,0x88,0x7D,0x7D,0x8A,0x7F,0x71,0x7C,0x83,0x80, + 0x80,0x84,0x87,0x7F,0x91,0xAA,0x99,0x94,0xA4,0x9C,0x8F,0x83,0x89,0x95,0x8B,0x84, + 0x90,0x9E,0x98,0x8E,0x90,0x96,0x8B,0x81,0x8B,0x93,0x8E,0x8A,0x8A,0x89,0x83,0x90, + 0xA5,0x95,0x92,0x9C,0x92,0x86,0x76,0x7A,0x85,0x75,0x69,0x77,0x7F,0x7D,0x6D,0x6C, + 0x76,0x6A,0x5A,0x63,0x6B,0x64,0x61,0x5E,0x60,0x5B,0x66,0x76,0x69,0x67,0x6F,0x65, + 0x58,0x51,0x50,0x5D,0x5B,0x53,0x67,0x70,0x6A,0x63,0x62,0x6C,0x67,0x58,0x66,0x73, + 0x6E,0x70,0x79,0x82,0x81,0x93,0xA9,0xA0,0xA4,0xAB,0xA0,0x92,0x8A,0x89,0x8E,0x86, + 0x7F,0x88,0x8F,0x89,0x7F,0x7C,0x82,0x7D,0x6A,0x77,0x82,0x7A,0x78,0x79,0x7E,0x77, + 0x81,0x9B,0x90,0x89,0x9C,0x94,0x88,0x80,0x85,0x91,0x89,0x85,0x94,0xA0,0x9C,0x99, + 0x94,0x95,0x96,0x82,0x84,0x93,0x8C,0x88,0x8A,0x90,0x88,0x85,0xA7,0x9F,0x89,0x9E, + 0x98,0x85,0x7F,0x7C,0x88,0x84,0x7B,0x83,0x8A,0x87,0x7C,0x73,0x76,0x77,0x62,0x61, + 0x74,0x6D,0x6A,0x6B,0x69,0x65,0x5C,0x74,0x7F,0x65,0x6D,0x74,0x64,0x58,0x51,0x61, + 0x63,0x56,0x61,0x70,0x6E,0x69,0x67,0x68,0x6D,0x61,0x59,0x6B,0x6E,0x68,0x6E,0x74, + 0x73,0x6E,0x89,0xA3,0x91,0x99,0xAF,0xA5,0x96,0x8D,0x94,0x99,0x8C,0x89,0x9E,0x9F, + 0x8F,0x8C,0x90,0x8C,0x7B,0x73,0x7F,0x81,0x79,0x7C,0x7E,0x7D,0x75,0x81,0x9C,0x8A, + 0x83,0x97,0x93,0x7F,0x74,0x7F,0x8A,0x7F,0x7C,0x96,0x9E,0x92,0x92,0x98,0x9D,0x8F, + 0x82,0x8E,0x94,0x8E,0x8B,0x90,0x8E,0x86,0x8C,0xA9,0xA1,0x90,0xA5,0xA2,0x8F,0x7F, + 0x7F,0x8C,0x83,0x77,0x8A,0x99,0x8A,0x84,0x82,0x87,0x7A,0x66,0x6E,0x75,0x71,0x6F, + 0x72,0x6D,0x65,0x63,0x7C,0x82,0x69,0x74,0x79,0x68,0x5C,0x53,0x62,0x66,0x54,0x61, + 0x75,0x73,0x6D,0x68,0x6E,0x6A,0x5C,0x5C,0x69,0x6A,0x6C,0x71,0x6E,0x6E,0x6A,0x7E, + 0x99,0x8B,0x8E,0xA2,0x9B,0x93,0x89,0x93,0xA0,0x93,0x92,0xA4,0xA7,0x9D,0x97,0x95, + 0x93,0x84,0x7C,0x83,0x82,0x80,0x80,0x7E,0x78,0x72,0x7A,0x96,0x90,0x83,0x93,0x93, + 0x81,0x74,0x73,0x83,0x80,0x77,0x89,0x96,0x96,0x90,0x93,0x9A,0x8F,0x84,0x87,0x8F, + 0x8A,0x8B,0x8F,0x8C,0x85,0x82,0x9C,0xA9,0x94,0x99,0xA4,0x96,0x88,0x7D,0x88,0x8E, + 0x7E,0x82,0x94,0x96,0x8E,0x87,0x89,0x89,0x79,0x75,0x79,0x7A,0x78,0x78,0x79,0x72, + 0x67,0x6E,0x89,0x7F,0x6F,0x7B,0x7A,0x6A,0x5B,0x58,0x69,0x64,0x58,0x69,0x72,0x73, + 0x6B,0x69,0x72,0x68,0x5D,0x5E,0x67,0x6D,0x6C,0x6C,0x6C,0x69,0x64,0x7C,0x92,0x85, + 0x8B,0x94,0x8E,0x8B,0x7E,0x8A,0x9A,0x8D,0x8D,0x9F,0xA2,0x9F,0x97,0x93,0x98,0x8A, + 0x7E,0x7D,0x85,0x86,0x7F,0x7B,0x7C,0x75,0x71,0x8D,0x91,0x85,0x8E,0x8B,0x82,0x78, + 0x68,0x7A,0x80,0x72,0x80,0x8C,0x93,0x90,0x86,0x8D,0x8F,0x84,0x7E,0x83,0x8A,0x8D, + 0x89,0x85,0x88,0x82,0x87,0xA5,0x9B,0x94,0xA4,0x9A,0x93,0x7E,0x7A,0x8D,0x83,0x7A, + 0x88,0x8F,0x98,0x91,0x81,0x88,0x85,0x7A,0x72,0x73,0x79,0x7A,0x73,0x6B,0x6A,0x62, + 0x75,0x8A,0x74,0x79,0x80,0x71,0x6E,0x55,0x59,0x6A,0x5A,0x5E,0x68,0x6A,0x76,0x71, + 0x63,0x70,0x6D,0x65,0x5E,0x5F,0x6C,0x6B,0x66,0x65,0x69,0x67,0x83,0x8F,0x7E,0x8F, + 0x92,0x8E,0x8E,0x7A,0x86,0x96,0x88,0x8F,0x91,0x95,0xA4,0x97,0x8C,0x95,0x93,0x89, + 0x7E,0x7A,0x84,0x7C,0x75,0x71,0x71,0x70,0x87,0x90,0x7C,0x8A,0x84,0x85,0x84,0x66, + 0x72,0x7F,0x71,0x77,0x77,0x7D,0x95,0x89,0x85,0x91,0x90,0x8E,0x85,0x80,0x86,0x85, + 0x80,0x86,0x89,0x82,0x90,0xA0,0x91,0x95,0x92,0x8A,0x9A,0x8C,0x7E,0x89,0x87,0x84, + 0x86,0x7B,0x86,0x8C,0x7D,0x84,0x7F,0x7B,0x84,0x7C,0x74,0x7B,0x79,0x76,0x78,0x72, + 0x72,0x75,0x77,0x71,0x6E,0x6E,0x6E,0x6F,0x6B,0x6C,0x6D,0x6C,0x6E,0x70,0x69,0x6A, + 0x69,0x67,0x68,0x68,0x68,0x6A,0x6D,0x6E,0x71,0x71,0x77,0x79,0x7C,0x7F,0x81,0x89, + 0x8B,0x8B,0x8C,0x90,0x9A,0x9A,0x95,0x9A,0x95,0x97,0x98,0x90,0x8F,0x8E,0x8A,0x86, + 0x85,0x7C,0x80,0x7D,0x7A,0x7A,0x75,0x7C,0x78,0x77,0x79,0x79,0x79,0x7C,0x77,0x79, + 0x7F,0x79,0x81,0x88,0x84,0x85,0x86,0x87,0x8B,0x84,0x81,0x88,0x86,0x85,0x83,0x82, + 0x8C,0x8C,0x88,0x8C,0x8E,0x8B,0x8C,0x8C,0x88,0x88,0x84,0x91,0x8D,0x82,0x89,0x81, + 0x8A,0x8E,0x7F,0x82,0x85,0x81,0x82,0x79,0x75,0x7C,0x79,0x79,0x77,0x72,0x7C,0x7E, + 0x78,0x7D,0x7B,0x79,0x7B,0x74,0x79,0x78,0x76,0x86,0x7B,0x76,0x7A,0x73,0x83,0x81, + 0x72,0x79,0x7A,0x7B,0x7C,0x73,0x79,0x82,0x7C,0x7F,0x82,0x7B,0x87,0x8B,0x84,0x88, + 0x88,0x88,0x88,0x85,0x82,0x86,0x95,0x8F,0x84,0x8B,0x82,0x8B,0x91,0x7A,0x7E,0x7D, + 0x7B,0x82,0x72,0x73,0x80,0x79,0x7C,0x79,0x72,0x80,0x80,0x75,0x78,0x7A,0x79,0x79, + 0x78,0x72,0x76,0x92,0x89,0x7C,0x86,0x7E,0x90,0x90,0x71,0x7C,0x80,0x7D,0x87,0x75, + 0x7A,0x8E,0x89,0x8B,0x85,0x86,0x8F,0x91,0x85,0x7C,0x87,0x88,0x7F,0x79,0x76,0x94, + 0xA3,0x8A,0x92,0x8F,0x8D,0x9B,0x7A,0x70,0x7E,0x7B,0x82,0x7C,0x78,0x89,0x94,0x8F, + 0x81,0x80,0x82,0x86,0x7E,0x71,0x7C,0x81,0x78,0x75,0x76,0x92,0x9A,0x8A,0x8E,0x81, + 0x85,0x8E,0x72,0x6D,0x75,0x7A,0x84,0x80,0x7E,0x86,0x92,0x8F,0x84,0x84,0x7F,0x84, + 0x87,0x7F,0x82,0x80,0x7A,0x79,0x8D,0x9F,0x8F,0x93,0x8F,0x7D,0x8B,0x7D,0x6D,0x73, + 0x73,0x78,0x7D,0x7E,0x79,0x82,0x86,0x79,0x7D,0x75,0x6D,0x79,0x75,0x74,0x76,0x6F, + 0x6A,0x77,0x93,0x8C,0x87,0x8A,0x78,0x7F,0x7F,0x73,0x72,0x72,0x79,0x80,0x88,0x83, + 0x81,0x87,0x81,0x82,0x83,0x7A,0x7E,0x81,0x80,0x81,0x7B,0x76,0x77,0x8C,0x98,0x91, + 0x8E,0x7F,0x7A,0x82,0x80,0x7D,0x78,0x75,0x78,0x82,0x88,0x85,0x83,0x7D,0x7C,0x83, + 0x80,0x7B,0x7C,0x79,0x7B,0x7C,0x79,0x75,0x78,0x8A,0x8F,0x93,0x8F,0x7B,0x78,0x79, + 0x77,0x7E,0x7F,0x7A,0x79,0x80,0x83,0x88,0x8C,0x84,0x81,0x83,0x7F,0x83,0x86,0x7F, + 0x81,0x7E,0x7A,0x7C,0x87,0x90,0x91,0x93,0x89,0x7E,0x7C,0x7A,0x7A,0x7B,0x7B,0x77, + 0x78,0x7C,0x7D,0x83,0x84,0x80,0x7E,0x7B,0x79,0x7C,0x7A,0x79,0x79,0x76,0x74,0x73, + 0x7E,0x88,0x8C,0x8D,0x85,0x7D,0x79,0x76,0x76,0x7A,0x7C,0x78,0x7B,0x7D,0x7B,0x83, + 0x85,0x84,0x85,0x82,0x80,0x7F,0x7D,0x7F,0x80,0x7F,0x7D,0x7A,0x80,0x8B,0x90,0x92, + 0x8E,0x85,0x7F,0x7A,0x76,0x7C,0x80,0x7D,0x81,0x7D,0x7A,0x81,0x80,0x80,0x85,0x83, + 0x80,0x7F,0x7A,0x7A,0x7E,0x7C,0x7B,0x7B,0x7F,0x85,0x89,0x8C,0x89,0x82,0x7F,0x7A, + 0x75,0x7B,0x7B,0x7C,0x82,0x7E,0x7F,0x82,0x7E,0x80,0x84,0x83,0x83,0x82,0x7D,0x7E, + 0x7E,0x7C,0x7D,0x7E,0x83,0x89,0x8A,0x8C,0x86,0x82,0x80,0x79,0x77,0x7C,0x7A,0x7B, + 0x7F,0x79,0x7C,0x7E,0x79,0x7D,0x80,0x7E,0x80,0x7F,0x79,0x79,0x79,0x78,0x78,0x7A, + 0x81,0x84,0x85,0x89,0x84,0x7E,0x80,0x7A,0x78,0x7E,0x7A,0x7B,0x7E,0x7A,0x7D,0x7D, + 0x7C,0x81,0x82,0x81,0x82,0x80,0x7E,0x7F,0x7D,0x7E,0x7D,0x7F,0x87,0x87,0x89,0x8A, + 0x83,0x82,0x82,0x7D,0x7F,0x83,0x7E,0x81,0x7F,0x7B,0x7F,0x7C,0x7C,0x81,0x7F,0x81, + 0x83,0x7D,0x7D,0x7F,0x7D,0x7E,0x7C,0x7F,0x84,0x85,0x87,0x86,0x80,0x81,0x7F,0x7C, + 0x81,0x80,0x7F,0x83,0x7D,0x7C,0x80,0x7C,0x7E,0x82,0x7F,0x82,0x83,0x7D,0x80,0x81, + 0x7F,0x80,0x7F,0x84,0x86,0x87,0x8B,0x84,0x80,0x85,0x7F,0x7D,0x84,0x7F,0x80,0x84, + 0x7B,0x7C,0x7F,0x79,0x7C,0x7E,0x7D,0x81,0x7E,0x7C,0x7F,0x7E,0x7E,0x7C,0x7E,0x85, + 0x84,0x87,0x89,0x80,0x82,0x84,0x7D,0x81,0x82,0x7E,0x84,0x82,0x7D,0x80,0x7D,0x7B, + 0x7F,0x7C,0x81,0x7E,0x8A,0x8F,0x7B,0x8A,0x6D,0x67,0x86,0x78,0x6A,0x79,0x84,0x84, + 0x90,0x8C,0x8C,0x8E,0x8F,0xA0,0xA7,0x9A,0x95,0x96,0x8C,0x88,0x89,0x85,0x7D,0x6F, + 0x63,0x5D,0x56,0x55,0x55,0x53,0x5F,0x68,0x6F,0x74,0x75,0x7A,0x7D,0x7D,0x82,0x8A, + 0x86,0x8D,0x93,0x8B,0x91,0x9B,0xA0,0xAC,0xB9,0xB6,0xBB,0xBB,0xAF,0xAB,0xA3,0x9B, + 0x96,0x93,0x92,0x8F,0x8D,0x86,0x7D,0x7E,0x76,0x6F,0x74,0x6E,0x6B,0x6F,0x67,0x60, + 0x58,0x49,0x45,0x43,0x40,0x40,0x44,0x4A,0x4F,0x56,0x5D,0x64,0x6B,0x76,0x80,0x84, + 0x89,0x8C,0x8D,0x90,0x8F,0x95,0x98,0x9A,0xA6,0xAF,0xB3,0xB9,0xB9,0xB4,0xB7,0xB6, + 0xB5,0xAE,0xA7,0xA4,0x99,0x95,0x8F,0x85,0x8A,0x88,0x86,0x87,0x7F,0x73,0x6D,0x61, + 0x54,0x54,0x4F,0x4D,0x4B,0x46,0x49,0x4F,0x55,0x5A,0x5E,0x67,0x71,0x73,0x74,0x78, + 0x7D,0x81,0x7F,0x86,0x92,0x96,0x9F,0xA4,0xA1,0xA8,0xAA,0xA6,0xAF,0xB2,0xB0,0xB4, + 0xAD,0xA5,0xA2,0x9A,0x92,0x8D,0x86,0x83,0x81,0x7A,0x77,0x72,0x6E,0x6A,0x6D,0x75, + 0x7A,0x7C,0x73,0x6C,0x68,0x5D,0x52,0x4E,0x49,0x45,0x4B,0x3C,0x32,0x44,0x4E,0x59, + 0x66,0x69,0x6B,0x72,0x77,0x77,0x7B,0x79,0x7A,0x87,0x94,0x9F,0xA8,0xAC,0xA6,0xAC, + 0xB1,0xAD,0xB1,0xB4,0xBA,0xBC,0xBE,0xC0,0xBF,0xBF,0xBC,0xB6,0xAC,0xA3,0x9A,0x8D, + 0x81,0x77,0x6C,0x62,0x5B,0x63,0x66,0x63,0x63,0x52,0x49,0x4B,0x3D,0x3F,0x45,0x4C, + 0x57,0x56,0x57,0x5A,0x5F,0x62,0x66,0x6A,0x71,0x77,0x78,0x7F,0x88,0x8D,0x8E,0x94, + 0x9D,0xA3,0xA5,0xA6,0xA1,0x9C,0x98,0x91,0x94,0x94,0x98,0x9F,0x9B,0x9A,0x9E,0x9A, + 0x9C,0x9D,0x95,0x93,0x8F,0x8A,0x86,0x81,0x7B,0x7B,0x85,0x87,0x88,0x8A,0x84,0x76, + 0x6E,0x66,0x62,0x65,0x62,0x68,0x6D,0x65,0x65,0x63,0x5F,0x63,0x63,0x5F,0x60,0x61, + 0x62,0x61,0x60,0x63,0x68,0x70,0x76,0x79,0x7C,0x79,0x79,0x76,0x74,0x7D,0x83,0x85, + 0x87,0x82,0x85,0x88,0x86,0x8F,0x96,0x92,0x92,0x93,0x90,0x94,0x96,0x97,0x9F,0xA8, + 0xAB,0xB0,0xB1,0xA8,0x9D,0x98,0x96,0x98,0x9A,0x99,0x98,0x8F,0x88,0x89,0x8A,0x88, + 0x89,0x83,0x7B,0x76,0x72,0x71,0x6A,0x62,0x69,0x6F,0x72,0x74,0x6D,0x61,0x57,0x53, + 0x55,0x5B,0x60,0x5F,0x5B,0x56,0x55,0x58,0x5A,0x5E,0x60,0x60,0x63,0x67,0x6C,0x71, + 0x71,0x74,0x82,0x90,0x9C,0xA3,0x9F,0x95,0x91,0x94,0x9E,0xAE,0xB1,0xAD,0xA9,0xA3, + 0xA5,0xA8,0xA8,0xA4,0x9F,0x9C,0x9D,0x9E,0x9B,0x95,0x8A,0x8A,0x93,0x99,0x9C,0x96, + 0x88,0x7F,0x7D,0x7D,0x85,0x89,0x83,0x7F,0x7A,0x77,0x7C,0x7D,0x78,0x72,0x6F,0x72, + 0x79,0x79,0x74,0x6D,0x68,0x71,0x7D,0x81,0x7D,0x70,0x62,0x61,0x6A,0x6D,0x70,0x69, + 0x60,0x63,0x68,0x6D,0x6E,0x67,0x60,0x63,0x69,0x70,0x73,0x6A,0x62,0x5F,0x6B,0x80, + 0x86,0x84,0x7B,0x6E,0x6F,0x7D,0x85,0x8B,0x8A,0x83,0x88,0x91,0x94,0x94,0x8E,0x89, + 0x8E,0x95,0x99,0x9A,0x93,0x8C,0x87,0x91,0xA4,0xAC,0xA8,0x9C,0x8F,0x90,0x99,0x9C, + 0x9E,0x9E,0x97,0x9A,0xA1,0x9D,0x99,0x92,0x8D,0x94,0x9B,0x9A,0x99,0x93,0x8B,0x84, + 0x89,0x98,0x9E,0x9B,0x90,0x80,0x77,0x7C,0x7C,0x7A,0x79,0x72,0x71,0x75,0x71,0x6B, + 0x65,0x5F,0x60,0x65,0x65,0x63,0x5C,0x52,0x49,0x4C,0x5D,0x67,0x66,0x5F,0x54,0x50, + 0x59,0x5E,0x61,0x65,0x64,0x67,0x71,0x73,0x70,0x6E,0x70,0x78,0x80,0x82,0x83,0x81, + 0x7B,0x78,0x7F,0x92,0x9D,0x9E,0x98,0x8C,0x87,0x90,0x95,0x96,0x98,0x97,0x99,0x9F, + 0x9C,0x97,0x94,0x94,0x99,0xA0,0x9E,0x9B,0x99,0x93,0x8B,0x8F,0xA3,0xAD,0xAA,0x9F, + 0x92,0x8C,0x95,0x9A,0x98,0x99,0x98,0x98,0x9D,0x9A,0x90,0x8A,0x89,0x8C,0x8E,0x89, + 0x86,0x81,0x77,0x6E,0x70,0x81,0x88,0x83,0x78,0x6B,0x66,0x6D,0x6D,0x6A,0x6B,0x6C, + 0x6C,0x71,0x6D,0x65,0x63,0x65,0x68,0x6B,0x67,0x66,0x65,0x5D,0x55,0x5C,0x6E,0x73, + 0x6D,0x62,0x55,0x55,0x5D,0x5D,0x5C,0x5F,0x61,0x65,0x69,0x63,0x5E,0x62,0x68,0x6F, + 0x73,0x70,0x71,0x72,0x6D,0x6A,0x79,0x8D,0x92,0x8E,0x85,0x7C,0x7F,0x88,0x87,0x89, + 0x8D,0x8F,0x94,0x96,0x8E,0x8D,0x91,0x95,0x9B,0x9B,0x96,0x98,0x96,0x8F,0x90,0xA3, + 0xB2,0xB2,0xAB,0x9F,0x98,0x9F,0xA3,0x9E,0x9F,0xA2,0xA3,0xA6,0xA4,0x98,0x95,0x98, + 0x9B,0x9C,0x9A,0x98,0x97,0x92,0x85,0x85,0x9B,0xA4,0x9D,0x92,0x84,0x7F,0x85,0x82, + 0x79,0x7B,0x7D,0x7B,0x7B,0x74,0x69,0x69,0x6D,0x6F,0x6D,0x6A,0x6A,0x69,0x60,0x56, + 0x61,0x75,0x77,0x6F,0x66,0x5E,0x60,0x67,0x61,0x60,0x66,0x67,0x68,0x69,0x60,0x5B, + 0x61,0x65,0x66,0x66,0x65,0x65,0x62,0x58,0x56,0x6C,0x7B,0x77,0x6F,0x66,0x61,0x6A, + 0x6C,0x66,0x6B,0x72,0x76,0x78,0x75,0x6C,0x6F,0x78,0x7B,0x7C,0x7B,0x7D,0x7F,0x7A, + 0x72,0x7F,0x98,0x9E,0x98,0x91,0x89,0x8B,0x94,0x8F,0x8F,0x99,0x9F,0xA2,0xA2,0x9B, + 0x98,0x9F,0xA3,0xA3,0xA1,0xA1,0xA2,0xA0,0x94,0x92,0xA6,0xB4,0xAF,0xA5,0x9B,0x96, + 0x9C,0x9B,0x94,0x97,0x9D,0x9E,0x9B,0x95,0x8E,0x91,0x96,0x96,0x93,0x92,0x91,0x8E, + 0x87,0x7C,0x87,0x9C,0x9D,0x93,0x89,0x80,0x82,0x87,0x80,0x7D,0x84,0x89,0x86,0x81, + 0x77,0x72,0x78,0x7A,0x77,0x74,0x73,0x70,0x6A,0x5D,0x5B,0x70,0x7C,0x74,0x68,0x60, + 0x5C,0x62,0x61,0x59,0x5E,0x67,0x69,0x65,0x60,0x59,0x5D,0x63,0x64,0x62,0x63,0x65, + 0x63,0x5B,0x52,0x63,0x78,0x77,0x6C,0x66,0x62,0x67,0x6C,0x63,0x64,0x6F,0x76,0x75, + 0x72,0x6C,0x70,0x79,0x7B,0x79,0x7A,0x7D,0x7D,0x79,0x6E,0x77,0x90,0x98,0x90,0x89, + 0x85,0x85,0x8D,0x87,0x83,0x8B,0x95,0x97,0x93,0x8C,0x89,0x94,0x98,0x97,0x95,0x99, + 0x9A,0x97,0x8D,0x88,0x9E,0xB0,0xAB,0xA1,0x9B,0x98,0x9E,0x9E,0x93,0x98,0xA4,0xA9, + 0xA5,0x9D,0x95,0x9B,0xA1,0x9E,0x9B,0x9C,0x9E,0x9A,0x92,0x86,0x92,0xA8,0xA8,0x9C, + 0x94,0x8F,0x91,0x94,0x86,0x85,0x90,0x96,0x94,0x8C,0x82,0x81,0x88,0x86,0x82,0x7F, + 0x82,0x80,0x79,0x6B,0x6D,0x84,0x8C,0x82,0x78,0x71,0x6F,0x74,0x6C,0x64,0x6C,0x73, + 0x73,0x6D,0x65,0x5F,0x66,0x67,0x63,0x62,0x65,0x66,0x60,0x57,0x53,0x68,0x76,0x70, + 0x65,0x5E,0x5D,0x64,0x64,0x59,0x5C,0x66,0x6D,0x69,0x63,0x5C,0x62,0x6A,0x67,0x67, + 0x6A,0x6D,0x6A,0x63,0x5B,0x6C,0x81,0x7F,0x76,0x6E,0x6D,0x75,0x7A,0x70,0x71,0x7C, + 0x82,0x81,0x7C,0x76,0x79,0x83,0x83,0x81,0x82,0x87,0x86,0x80,0x77,0x84,0x9C,0x9C, + 0x93,0x8C,0x89,0x8E,0x94,0x8C,0x8B,0x96,0x9C,0x9C,0x97,0x91,0x92,0x9C,0x9A,0x96, + 0x96,0x9B,0x99,0x92,0x86,0x91,0xA9,0xA8,0x9C,0x94,0x90,0x93,0x97,0x8E,0x8A,0x94, + 0x98,0x97,0x92,0x8B,0x89,0x93,0x92,0x8D,0x8B,0x8E,0x8E,0x86,0x7B,0x82,0x9A,0x9B, + 0x92,0x88,0x82,0x83,0x89,0x82,0x7C,0x84,0x8A,0x8B,0x85,0x7C,0x79,0x82,0x84,0x7F, + 0x7D,0x7E,0x7C,0x73,0x69,0x73,0x8A,0x89,0x7F,0x77,0x72,0x73,0x78,0x6F,0x6B,0x76, + 0x7C,0x7D,0x77,0x6F,0x6D,0x76,0x78,0x73,0x73,0x76,0x74,0x6A,0x64,0x75,0x88,0x85, + 0x7C,0x73,0x70,0x75,0x76,0x6D,0x70,0x7A,0x7E,0x7D,0x77,0x71,0x75,0x7D,0x7A,0x75, + 0x77,0x79,0x73,0x67,0x69,0x81,0x8A,0x82,0x79,0x72,0x72,0x78,0x73,0x6B,0x74,0x7D, + 0x7F,0x7B,0x73,0x72,0x79,0x7F,0x7B,0x7B,0x7F,0x7E,0x76,0x6D,0x7B,0x90,0x8E,0x86, + 0x7F,0x7C,0x80,0x82,0x78,0x78,0x86,0x8C,0x8A,0x82,0x7D,0x7E,0x84,0x83,0x7F,0x82, + 0x83,0x7D,0x73,0x76,0x8F,0x97,0x8B,0x84,0x80,0x80,0x83,0x7E,0x76,0x81,0x8C,0x8B, + 0x89,0x82,0x7E,0x84,0x87,0x80,0x81,0x86,0x83,0x79,0x70,0x84,0x98,0x91,0x89,0x85, + 0x82,0x84,0x82,0x78,0x79,0x85,0x89,0x87,0x83,0x7F,0x81,0x87,0x83,0x7E,0x84,0x87, + 0x7F,0x72,0x79,0x92,0x95,0x8A,0x85,0x82,0x84,0x86,0x7F,0x7A,0x85,0x8D,0x89,0x84, + 0x7F,0x80,0x88,0x88,0x81,0x82,0x88,0x85,0x77,0x71,0x88,0x97,0x8C,0x83,0x7F,0x80, + 0x83,0x7E,0x75,0x79,0x86,0x89,0x82,0x7E,0x7C,0x80,0x85,0x7F,0x7A,0x81,0x85,0x7B, + 0x70,0x7B,0x93,0x93,0x86,0x83,0x82,0x84,0x84,0x7B,0x77,0x80,0x89,0x87,0x82,0x81, + 0x81,0x85,0x84,0x7D,0x7E,0x84,0x7E,0x6F,0x6E,0x86,0x92,0x87,0x80,0x7F,0x80,0x81, + 0x7C,0x73,0x75,0x82,0x85,0x7C,0x7B,0x7E,0x80,0x82,0x7D,0x7B,0x81,0x84,0x77,0x6C, + 0x7B,0x91,0x8C,0x81,0x81,0x83,0x85,0x83,0x7B,0x77,0x81,0x8A,0x84,0x7E,0x81,0x84, + 0x86,0x84,0x7D,0x7F,0x85,0x81,0x72,0x74,0x8D,0x93,0x84,0x81,0x83,0x83,0x81,0x7C, + 0x76,0x78,0x85,0x87,0x7D,0x7C,0x81,0x83,0x81,0x7C,0x7A,0x7E,0x7F,0x74,0x6A,0x7B, + 0x91,0x88,0x7B,0x7F,0x84,0x81,0x7A,0x76,0x75,0x7A,0x84,0x7E,0x78,0x7E,0x85,0x85, + 0x7F,0x7D,0x7F,0x80,0x7B,0x71,0x72,0x89,0x92,0x83,0x7C,0x83,0x8A,0x83,0x77,0x78, + 0x7C,0x81,0x83,0x7D,0x7C,0x82,0x88,0x85,0x7D,0x7D,0x84,0x81,0x77,0x71,0x7C,0x8F, + 0x8C,0x7E,0x7D,0x85,0x8B,0x80,0x74,0x79,0x80,0x82,0x7C,0x78,0x7F,0x84,0x85,0x82, + 0x7D,0x80,0x83,0x7E,0x75,0x72,0x81,0x8F,0x85,0x7A,0x7E,0x89,0x89,0x7B,0x75,0x7E, + 0x83,0x80,0x79,0x79,0x80,0x81,0x81,0x7E,0x7F,0x83,0x82,0x7D,0x77,0x79,0x87,0x88, + 0x7D,0x7C,0x83,0x8B,0x85,0x7B,0x7D,0x82,0x83,0x7F,0x7A,0x7E,0x82,0x7F,0x7F,0x7E, + 0x81,0x82,0x7F,0x7C,0x7A,0x7F,0x86,0x81,0x7D,0x80,0x85,0x88,0x82,0x7D,0x82,0x84, + 0x83,0x7E,0x7C,0x80,0x81,0x7F,0x7F,0x7F,0x83,0x83,0x7E,0x7B,0x7C,0x83,0x83,0x7E, + 0x80,0x83,0x86,0x86,0x81,0x82,0x85,0x83,0x83,0x80,0x7F,0x81,0x80,0x81,0x81,0x81, + 0x84,0x82,0x7E,0x7C,0x7E,0x83,0x80,0x7E,0x7F,0x81,0x86,0x84,0x7F,0x82,0x83,0x83, + 0x81,0x7C,0x7E,0x7F,0x7E,0x7F,0x7E,0x81,0x82,0x7F,0x7D,0x7C,0x7F,0x83,0x7F,0x7F, + 0x80,0x81,0x86,0x83,0x80,0x83,0x83,0x83,0x80,0x7D,0x80,0x80,0x7F,0x7F,0x7F,0x83, + 0x83,0x7F,0x7F,0x7E,0x82,0x84,0x80,0x81,0x82,0x83,0x85,0x82,0x83,0x85,0x83,0x83, + 0x80,0x7E,0x80,0x7F,0x7F,0x7E,0x7E,0x81,0x80,0x7E,0x7C,0x7C,0x81,0x81,0x7E,0x80, + 0x80,0x82,0x83,0x7F,0x81,0x83,0x81,0x81,0x7D,0x7D,0x80,0x7E,0x7E,0x7F,0x80,0x83, + 0x80,0x7E,0x7D,0x7D,0x82,0x81,0x80,0x84,0x83,0x85,0x85,0x81,0x84,0x85,0x82,0x82, + 0x7D,0x7E,0x80,0x7E,0x7D,0x7D,0x7E,0x7F,0x7D,0x7C,0x7B,0x7B,0x7F,0x7D,0x7D,0x80, + 0x80,0x82,0x82,0x7E,0x82,0x84,0x81,0x81,0x7D,0x7F,0x80,0x7D,0x7E,0x7E,0x80,0x81, + 0x7E,0x7F,0x7E,0x7C,0x81,0x80,0x7F,0x83,0x82,0x84,0x84,0x7F,0x82,0x84,0x82,0x81, + 0x7D,0x7E,0x80,0x7D,0x7C,0x7C,0x7D,0x7F,0x7D,0x7C,0x7B,0x7A,0x7F,0x7F,0x7C,0x7F, + 0x81,0x83,0x84,0x81,0x80,0x83,0x83,0x8D,0x86,0x64,0x72,0x88,0x87,0x73,0x7E,0x90, + 0x6C,0x73,0x7F,0x78,0x7A,0x86,0x90,0x7C,0x7C,0x88,0x8B,0x7C,0x7A,0x8E,0x81,0x75, + 0x76,0x7B,0x81,0x7D,0x80,0x84,0x78,0x74,0x7E,0x7C,0x7F,0x85,0x88,0x8B,0x87,0x83, + 0x81,0x7C,0x85,0x87,0x81,0x87,0x7F,0x87,0x7D,0x6C,0x88,0x85,0x6B,0x7C,0x7A,0x78, + 0x6F,0x62,0x7F,0x76,0x6B,0x7B,0x73,0x77,0x80,0x7C,0x77,0x6D,0x73,0x81,0x8C,0x89, + 0x79,0x7B,0x8F,0x8E,0x88,0x89,0x82,0x86,0x91,0x92,0x8C,0x91,0xA4,0x99,0x90,0x9B, + 0x8D,0x8C,0x9E,0xA8,0xA2,0x9B,0x9D,0x97,0x92,0x94,0x92,0x81,0x7E,0x8C,0x8F,0x90, + 0x92,0x84,0x77,0x79,0x73,0x6F,0x69,0x6C,0x7A,0x78,0x73,0x6C,0x65,0x68,0x6A,0x6E, + 0x6D,0x62,0x63,0x61,0x59,0x5D,0x58,0x58,0x5E,0x62,0x6B,0x6D,0x62,0x61,0x6B,0x67, + 0x5F,0x61,0x69,0x77,0x78,0x6D,0x6F,0x70,0x74,0x7F,0x78,0x77,0x7A,0x79,0x80,0x7F, + 0x81,0x88,0x8F,0x9A,0xA9,0xB1,0xAF,0xA6,0x9F,0x9F,0x9F,0x98,0x91,0x94,0x91,0x8F, + 0x8C,0x89,0x92,0x93,0x8C,0x87,0x84,0x82,0x7F,0x7D,0x7C,0x7C,0x7D,0x82,0x85,0x89, + 0x8A,0x85,0x89,0x8D,0x88,0x86,0x8A,0x8E,0x8D,0x8D,0x8C,0x91,0x95,0x90,0x8D,0x8D, + 0x8E,0x91,0x8B,0x8C,0x91,0x91,0x91,0x8C,0x8E,0x95,0x91,0x8C,0x94,0x98,0x8F,0x95, + 0x98,0x93,0x9C,0x98,0x90,0x98,0x9A,0x98,0x93,0x90,0x90,0x88,0x87,0x81,0x78,0x7E, + 0x77,0x6E,0x6F,0x6A,0x6C,0x69,0x6E,0x71,0x5B,0x5D,0x5D,0x5B,0x64,0x53,0x52,0x57, + 0x50,0x53,0x45,0x4A,0x5C,0x59,0x5B,0x5A,0x62,0x6C,0x5F,0x5C,0x5F,0x5D,0x59,0x51, + 0x6C,0x7B,0x69,0x72,0x74,0x72,0x76,0x61,0x65,0x73,0x75,0x7F,0x79,0x7F,0x90,0x90, + 0x8F,0x99,0xA2,0xA9,0xA7,0xA2,0xA6,0x9D,0x8E,0x8E,0xA0,0xAD,0xA0,0x94,0x96,0x9A, + 0x90,0x7C,0x7E,0x88,0x8C,0x8D,0x86,0x89,0x8C,0x88,0x81,0x7C,0x86,0x8C,0x85,0x85, + 0x86,0x7D,0x7D,0x76,0x87,0xA2,0x97,0x90,0x96,0x92,0x92,0x8A,0x84,0x96,0x9C,0x97, + 0x92,0x95,0x9F,0x97,0x8B,0x8E,0x95,0x9B,0x9E,0x9A,0x9C,0x9C,0x91,0x88,0x8C,0xA6, + 0xA8,0x9A,0x9B,0x97,0x95,0x91,0x83,0x89,0x90,0x8E,0x88,0x7F,0x82,0x7F,0x75,0x72, + 0x73,0x74,0x71,0x69,0x66,0x62,0x5C,0x55,0x4A,0x5B,0x6F,0x63,0x56,0x54,0x55,0x56, + 0x4C,0x46,0x54,0x60,0x63,0x5A,0x56,0x5C,0x5D,0x5C,0x5C,0x63,0x6B,0x69,0x62,0x62, + 0x64,0x68,0x68,0x64,0x79,0x91,0x83,0x75,0x74,0x7D,0x87,0x82,0x85,0x97,0xA7,0xA8, + 0x9C,0x98,0xA3,0xA3,0x9A,0x94,0x98,0xA0,0x98,0x8F,0x8A,0x88,0x87,0x80,0x78,0x8B, + 0x9E,0x8D,0x80,0x7C,0x81,0x86,0x7F,0x7F,0x89,0x8F,0x87,0x7D,0x7B,0x89,0x8D,0x86, + 0x86,0x8C,0x90,0x89,0x87,0x8B,0x90,0x8F,0x89,0x87,0x9C,0xAF,0x9F,0x8F,0x8A,0x8F, + 0x96,0x8F,0x8B,0x9B,0xA5,0x9B,0x8A,0x86,0x92,0x9B,0x98,0x94,0x98,0x9A,0x92,0x87, + 0x88,0x8E,0x8D,0x85,0x7C,0x8A,0x9E,0x96,0x82,0x79,0x7B,0x7F,0x78,0x6F,0x71,0x75, + 0x73,0x5D,0x53,0x5E,0x63,0x5F,0x59,0x5E,0x5E,0x55,0x50,0x51,0x55,0x58,0x54,0x47, + 0x50,0x6F,0x70,0x5E,0x57,0x57,0x5D,0x65,0x60,0x5D,0x69,0x71,0x62,0x55,0x5F,0x6B, + 0x6F,0x72,0x73,0x7A,0x79,0x73,0x6F,0x77,0x83,0x85,0x88,0x89,0xA3,0xB9,0xAA,0x9B, + 0x96,0x9A,0xA1,0x9D,0x96,0x9A,0x9F,0x97,0x87,0x82,0x8D,0x8E,0x87,0x83,0x83,0x86, + 0x81,0x78,0x7A,0x83,0x81,0x7C,0x76,0x7D,0x96,0x96,0x83,0x7A,0x7A,0x87,0x8A,0x85, + 0x8D,0x95,0x96,0x8E,0x87,0x8E,0x99,0x98,0x94,0x94,0x98,0x97,0x8E,0x8D,0x90,0x95, + 0x93,0x8D,0x8A,0x9B,0xAE,0xA1,0x95,0x8F,0x8E,0x99,0x96,0x8D,0x94,0x9B,0x95,0x87, + 0x84,0x89,0x8C,0x8D,0x86,0x83,0x87,0x80,0x75,0x72,0x78,0x77,0x6E,0x66,0x60,0x71, + 0x80,0x6E,0x5C,0x56,0x59,0x5F,0x56,0x55,0x5D,0x62,0x60,0x51,0x4D,0x55,0x5C,0x59, + 0x57,0x5F,0x64,0x61,0x5A,0x58,0x60,0x65,0x61,0x5D,0x5B,0x73,0x83,0x78,0x6A,0x67, + 0x6F,0x76,0x75,0x76,0x83,0x8E,0x8E,0x88,0x8C,0x9B,0xA4,0xA2,0x9F,0xA3,0xA3,0x9F, + 0x96,0x93,0x97,0x98,0x93,0x89,0x89,0x98,0xA2,0x92,0x82,0x7A,0x7E,0x83,0x79,0x76, + 0x84,0x89,0x7F,0x77,0x75,0x7B,0x84,0x85,0x82,0x87,0x8F,0x86,0x7E,0x84,0x8F,0x90, + 0x90,0x8A,0x87,0x9F,0xAF,0x9E,0x8E,0x8D,0x90,0x97,0x91,0x8F,0x9C,0xA1,0x9B,0x8F, + 0x8D,0x94,0x99,0x99,0x93,0x9A,0xA0,0x95,0x8A,0x89,0x94,0x95,0x90,0x89,0x81,0x94, + 0xA6,0x93,0x85,0x81,0x80,0x83,0x7C,0x75,0x7B,0x82,0x75,0x65,0x61,0x69,0x6E,0x68, + 0x61,0x64,0x67,0x62,0x56,0x54,0x5B,0x60,0x59,0x51,0x4C,0x5A,0x75,0x6B,0x5B,0x57, + 0x5B,0x64,0x60,0x5B,0x68,0x70,0x6B,0x60,0x5B,0x6A,0x75,0x6F,0x6D,0x74,0x7A,0x7B, + 0x75,0x78,0x83,0x8D,0x8C,0x89,0x8C,0x97,0xB2,0xB1,0x9F,0x98,0x99,0x9F,0x99,0x8F, + 0x98,0xA0,0x9B,0x8F,0x7F,0x88,0x91,0x88,0x82,0x80,0x83,0x82,0x79,0x73,0x77,0x82, + 0x80,0x79,0x74,0x74,0x8F,0x9C,0x8A,0x82,0x82,0x86,0x8A,0x84,0x8A,0x95,0x98,0x92, + 0x88,0x89,0x92,0x96,0x8F,0x8D,0x97,0x9C,0x91,0x8A,0x90,0x99,0x9C,0x95,0x8E,0x89, + 0x98,0xB0,0xA8,0x94,0x91,0x8F,0x94,0x91,0x89,0x92,0x9C,0x95,0x89,0x86,0x88,0x8A, + 0x85,0x81,0x83,0x84,0x7E,0x71,0x6F,0x72,0x6F,0x6C,0x66,0x5C,0x58,0x6A,0x7D,0x69, + 0x59,0x57,0x57,0x59,0x4F,0x50,0x5E,0x63,0x5B,0x52,0x4F,0x57,0x5F,0x5D,0x5E,0x66, + 0x69,0x65,0x5E,0x61,0x6A,0x6E,0x6C,0x66,0x64,0x6A,0x86,0x8D,0x7A,0x7A,0x7B,0x7F, + 0x84,0x80,0x87,0x9C,0xA2,0x98,0x90,0x94,0xA0,0x9E,0x97,0x9A,0x9E,0x9C,0x93,0x8A, + 0x8C,0x91,0x8D,0x86,0x82,0x78,0x7E,0x99,0x91,0x7A,0x71,0x71,0x79,0x76,0x6C,0x78, + 0x8A,0x85,0x7D,0x76,0x7C,0x87,0x7F,0x7E,0x89,0x8D,0x8D,0x88,0x82,0x85,0x8E,0x8F, + 0x89,0x8D,0x85,0x91,0xAD,0xA1,0x93,0x91,0x8F,0x95,0x92,0x83,0x92,0xA0,0x9C,0x96, + 0x8B,0x91,0x99,0x8E,0x8B,0x95,0x99,0x97,0x8E,0x89,0x8C,0x8B,0x88,0x84,0x86,0x79, + 0x7F,0x98,0x8D,0x79,0x73,0x6D,0x72,0x68,0x59,0x66,0x6D,0x6A,0x62,0x5A,0x58,0x5C, + 0x57,0x52,0x5A,0x5F,0x62,0x5E,0x5A,0x5D,0x60,0x60,0x5E,0x62,0x59,0x61,0x7E,0x76, + 0x68,0x6C,0x61,0x6D,0x6D,0x5E,0x6A,0x76,0x77,0x7A,0x7A,0x7A,0x84,0x86,0x88,0x8A, + 0x8D,0x95,0x99,0x97,0x97,0xA0,0x9D,0x99,0x9A,0x94,0x91,0xA5,0xA0,0x8F,0x97,0x89, + 0x87,0x86,0x7A,0x7B,0x7B,0x74,0x75,0x79,0x71,0x75,0x76,0x77,0x79,0x78,0x7A,0x7F, + 0x7E,0x7B,0x7E,0x80,0x80,0x80,0x81,0x80,0x8C,0x92,0x8D,0x91,0x91,0x90,0x94,0x96, + 0x90,0x93,0x93,0x90,0x94,0x96,0x90,0x93,0x97,0x96,0x9C,0x98,0x94,0x95,0x93,0x91, + 0x91,0x91,0x91,0x8F,0x88,0x87,0x90,0x8D,0x86,0x88,0x85,0x84,0x88,0x80,0x7A,0x79, + 0x75,0x73,0x71,0x6C,0x6C,0x6B,0x6A,0x70,0x6D,0x6B,0x6C,0x69,0x65,0x68,0x68,0x6A, + 0x6A,0x6B,0x64,0x65,0x76,0x72,0x6C,0x70,0x6E,0x6F,0x74,0x70,0x6C,0x6F,0x6E,0x74, + 0x77,0x72,0x73,0x76,0x7A,0x7E,0x7D,0x7C,0x7C,0x82,0x82,0x84,0x88,0x89,0x8C,0x87, + 0x7F,0x84,0x9B,0x90,0x86,0x91,0x82,0x8D,0x8F,0x82,0x84,0x7E,0x83,0x87,0x7F,0x7C, + 0x7D,0x7D,0x81,0x80,0x76,0x78,0x7D,0x7A,0x78,0x7A,0x7D,0x80,0x7C,0x7A,0x72,0x78, + 0x98,0x93,0x81,0x86,0x7B,0x87,0x8C,0x73,0x7A,0x84,0x8D,0x8F,0x81,0x80,0x8A,0x8D, + 0x89,0x86,0x86,0x8F,0x90,0x8F,0x89,0x8E,0x94,0x8D,0x89,0x88,0x84,0x81,0x9E,0xA7, + 0x97,0x95,0x8A,0x87,0x8F,0x7B,0x79,0x89,0x90,0x93,0x85,0x7B,0x85,0x8B,0x81,0x7D, + 0x7D,0x84,0x87,0x81,0x7D,0x7D,0x7B,0x7B,0x7D,0x79,0x7B,0x70,0x7D,0x9C,0x8A,0x7E, + 0x77,0x6D,0x78,0x74,0x69,0x73,0x7F,0x84,0x7F,0x73,0x70,0x7A,0x7B,0x74,0x75,0x7D, + 0x84,0x87,0x7D,0x7A,0x7E,0x7E,0x83,0x81,0x81,0x79,0x7B,0x9C,0x9F,0x8A,0x82,0x7A, + 0x7F,0x83,0x74,0x75,0x83,0x8D,0x8A,0x7D,0x74,0x77,0x7E,0x79,0x73,0x76,0x7D,0x81, + 0x7B,0x72,0x76,0x77,0x7A,0x79,0x7A,0x75,0x68,0x81,0x92,0x86,0x78,0x71,0x6F,0x7C, + 0x79,0x6D,0x76,0x83,0x87,0x83,0x75,0x70,0x7F,0x81,0x7E,0x7D,0x82,0x86,0x8A,0x83, + 0x7C,0x7E,0x80,0x86,0x85,0x83,0x77,0x7D,0x9B,0xA1,0x8E,0x80,0x78,0x78,0x85,0x80, + 0x78,0x7F,0x8A,0x8D,0x8A,0x7B,0x75,0x82,0x82,0x81,0x80,0x7F,0x84,0x87,0x82,0x7E, + 0x7F,0x7F,0x80,0x81,0x7C,0x72,0x7C,0x94,0x99,0x87,0x7A,0x71,0x74,0x80,0x7C,0x7A, + 0x7D,0x82,0x87,0x84,0x78,0x74,0x7A,0x81,0x83,0x80,0x7F,0x81,0x84,0x81,0x7F,0x7E, + 0x81,0x84,0x82,0x7E,0x77,0x82,0x97,0x9B,0x92,0x84,0x74,0x77,0x82,0x84,0x84,0x7F, + 0x7F,0x88,0x8B,0x84,0x7F,0x7C,0x7C,0x82,0x84,0x7F,0x7B,0x7D,0x80,0x7E,0x7C,0x7C, + 0x7D,0x7F,0x79,0x71,0x7E,0x8D,0x8A,0x87,0x7D,0x71,0x73,0x79,0x7B,0x7E,0x7B,0x79, + 0x7F,0x81,0x80,0x80,0x7E,0x7D,0x7F,0x81,0x81,0x7F,0x7E,0x80,0x7F,0x82,0x85,0x83, + 0x82,0x82,0x7E,0x87,0x8E,0x86,0x84,0x85,0x7D,0x7F,0x84,0x80,0x82,0x81,0x7B,0x7D, + 0x81,0x7F,0x7E,0x7F,0x7E,0x80,0x82,0x82,0x81,0x81,0x81,0x80,0x80,0x81,0x7C,0x7F, + 0x80,0x7C,0x81,0x81,0x7E,0x80,0x80,0x7E,0x82,0x83,0x80,0x83,0x7F,0x7B,0x7D,0x7C, + 0x7A,0x7C,0x7A,0x79,0x7C,0x7D,0x7E,0x7D,0x7E,0x7C,0x7F,0x83,0x80,0x81,0x82,0x82, + 0x84,0x87,0x82,0x81,0x84,0x7F,0x82,0x85,0x82,0x81,0x81,0x7E,0x7D,0x7E,0x7E,0x7E, + 0x7D,0x7C,0x7C,0x7D,0x7E,0x7E,0x7D,0x7F,0x7F,0x7E,0x80,0x7E,0x7E,0x7E,0x7F,0x82, + 0x81,0x7F,0x7F,0x7E,0x7C,0x80,0x80,0x7D,0x7F,0x7D,0x7B,0x7D,0x7C,0x7A,0x7A,0x79, + 0x7A,0x7C,0x7D,0x7E,0x7F,0x7F,0x81,0x83,0x84,0x83,0x83,0x84,0x81,0x83,0x87,0x83, + 0x80,0x84,0x80,0x82,0x86,0x82,0x81,0x81,0x7E,0x7D,0x80,0x7D,0x7D,0x7D,0x7A,0x7D, + 0x7F,0x7E,0x80,0x80,0x80,0x82,0x84,0x83,0x81,0x82,0x82,0x80,0x85,0x87,0x81,0x82, + 0x83,0x7E,0x82,0x85,0x80,0x81,0x7F,0x7C,0x7E,0x7E,0x7B,0x7B,0x7B,0x7A,0x7D,0x7E, + 0x7E,0x7F,0x80,0x81,0x82,0x83,0x84,0x82,0x81,0x82,0x83,0x88,0x86,0x82,0x85,0x83, + 0x81,0x86,0x85,0x84,0x85,0x7F,0x7F,0x81,0x7F,0x7D,0x7E,0x7B,0x7C,0x7F,0x7F,0x80, + 0x80,0x81,0x81,0x84,0x83,0x82,0x82,0x82,0x80,0x83,0x86,0x82,0x83,0x82,0x7E,0x81, + 0x84,0x7E,0x7F,0x7F,0x7A,0x7D,0x7D,0x7A,0x7A,0x79,0x77,0x7A,0x7C,0x7E,0x7F,0x7F, + 0x81,0x83,0x83,0x84,0x84,0x83,0x82,0x84,0x88,0x85,0x82,0x85,0x82,0x81,0x86,0x84, + 0x81,0x82,0x7E,0x7D,0x80,0x7E,0x7D,0x7D,0x7A,0x7D,0x7F,0x7E,0x82,0x81,0x7F,0x82, + 0x85,0x85,0x84,0x84,0x83,0x82,0x87,0x89,0x83,0x84,0x85,0x80,0x85,0x86,0x80,0x83, + 0x81,0x7C,0x7F,0x7F,0x7C,0x7D,0x7A,0x7A,0x7E,0x7A,0x8D,0x84,0x80,0x88,0x66,0x79, + 0x86,0x6D,0x67,0x75,0x82,0x8B,0x8E,0x8D,0x8F,0x89,0x93,0xA8,0xA1,0x9D,0xAB,0x9B, + 0x8D,0x83,0x71,0x85,0x81,0x5C,0x62,0x70,0x63,0x5B,0x59,0x52,0x5B,0x63,0x63,0x5A, + 0x53,0x65,0x6C,0x6E,0x7C,0x72,0x88,0xAB,0x8D,0x93,0xA9,0x9C,0xAF,0x92,0x99,0xC7, + 0xA1,0xA5,0xA5,0x90,0xAB,0xA5,0x8E,0x8B,0x8A,0x93,0x8A,0x71,0x7E,0x70,0x6D,0x7A, + 0x68,0x87,0x8E,0x6A,0x7B,0x89,0x77,0x81,0x6B,0x44,0x5A,0x62,0x5F,0x6C,0x63,0x56, + 0x5A,0x64,0x69,0x5E,0x7B,0x81,0x84,0x9F,0x9A,0x8A,0x86,0x8C,0x85,0x88,0x92,0xA9, + 0xB3,0x9D,0x96,0xA0,0x99,0xA3,0x9B,0x8E,0x95,0x83,0x85,0x7E,0x74,0x7B,0x70,0x69, + 0x67,0x74,0x7C,0x66,0x52,0x4D,0x4E,0x58,0x4C,0x3B,0x40,0x52,0x49,0x43,0x51,0x5C, + 0x69,0x66,0x75,0x83,0x82,0x95,0xAB,0x9C,0x90,0x87,0x8B,0x98,0x8F,0x90,0x93,0x91, + 0xA2,0xB1,0xBB,0xC3,0xB3,0xAE,0xBC,0xAD,0xA5,0xA4,0x8B,0x95,0x99,0x8C,0x9C,0x96, + 0x88,0x80,0x74,0x76,0x81,0x7A,0x78,0x73,0x5F,0x67,0x68,0x5C,0x5B,0x5D,0x6A,0x65, + 0x5F,0x63,0x5E,0x69,0x70,0x79,0x77,0x71,0x8E,0x94,0x86,0x96,0x91,0x87,0x9B,0x94, + 0xA1,0xA7,0x96,0x98,0x96,0x96,0x98,0x9D,0x98,0x8B,0x96,0x9D,0x94,0x99,0x96,0x90, + 0x96,0x8D,0x8C,0x8A,0x7C,0x6E,0x62,0x5A,0x4E,0x60,0x58,0x4D,0x6B,0x6B,0x65,0x56, + 0x3F,0x3A,0x42,0x4A,0x4F,0x4B,0x42,0x45,0x4B,0x4B,0x4D,0x54,0x55,0x54,0x53,0x5B, + 0x69,0x6F,0x7D,0x80,0x93,0xB1,0xBD,0xB4,0x99,0x93,0x9F,0x9E,0x99,0x9F,0xA2,0xA8, + 0x9C,0x85,0x84,0x86,0x81,0x8F,0x9D,0x8F,0x8B,0x97,0xA2,0xA9,0xA7,0xAE,0xBC,0xB7, + 0xB5,0xB8,0xAB,0xA2,0x95,0x92,0xA7,0xB2,0xA9,0x9A,0x8A,0x8D,0x90,0x91,0x8B,0x80, + 0x7E,0x85,0x86,0x6E,0x66,0x56,0x5D,0x6F,0x6B,0x6E,0x67,0x64,0x6D,0x72,0x64,0x5D, + 0x5E,0x64,0x6A,0x74,0x72,0x55,0x5C,0x5D,0x58,0x64,0x5C,0x61,0x66,0x69,0x74,0x75, + 0x70,0x78,0x7F,0x7D,0x8A,0x87,0x88,0x92,0x9D,0x9E,0xA1,0xA7,0x9B,0x9D,0xA4,0xA3, + 0x9A,0x94,0x95,0x94,0x93,0x8B,0x91,0x8A,0x82,0x8B,0x83,0x7C,0x77,0x7B,0x75,0x6A, + 0x6C,0x6B,0x71,0x76,0x7D,0x8A,0x8F,0x85,0x73,0x70,0x6D,0x6A,0x67,0x62,0x6A,0x74, + 0x7A,0x6A,0x55,0x53,0x5A,0x65,0x61,0x5C,0x68,0x6E,0x72,0x70,0x72,0x7A,0x6E,0x7D, + 0x8D,0x93,0x9B,0x8D,0x89,0x8B,0x92,0x9A,0x9A,0x9E,0xA5,0xA2,0x9E,0x96,0x95,0x9F, + 0xA7,0xB7,0xB1,0xA4,0xAB,0xB5,0xAF,0xA5,0xA1,0x99,0xAD,0xC4,0xC4,0xC3,0xAC,0xA2, + 0xB1,0xBC,0xBB,0xAB,0xA5,0xAC,0xAA,0x9F,0x91,0x8E,0x8C,0x89,0x88,0x78,0x6E,0x60, + 0x52,0x4D,0x41,0x46,0x46,0x3F,0x53,0x62,0x53,0x44,0x3C,0x33,0x42,0x46,0x40,0x3D, + 0x3D,0x41,0x37,0x32,0x2E,0x32,0x3E,0x40,0x45,0x44,0x47,0x55,0x51,0x55,0x65,0x62, + 0x6A,0x80,0x94,0x9D,0x93,0x8D,0x92,0xA1,0xB1,0xB1,0xB1,0xB5,0xB1,0xAC,0xA4,0xA0, + 0xA7,0xA3,0xA5,0x98,0x8E,0x97,0x91,0x9A,0xA6,0x9A,0x93,0x9A,0xA9,0xBA,0xBA,0x9C, + 0x8E,0x9E,0xA4,0xB4,0xBB,0xA4,0xA0,0x9D,0x9C,0xAC,0xA8,0xA6,0xA1,0x8F,0x90,0x8B, + 0x7F,0x85,0x85,0x85,0x89,0x7F,0x83,0x98,0x91,0x7E,0x75,0x70,0x78,0x7D,0x7F,0x76, + 0x6E,0x6F,0x60,0x5B,0x77,0x80,0x78,0x67,0x55,0x67,0x67,0x5F,0x54,0x3C,0x43,0x46, + 0x52,0x68,0x66,0x62,0x51,0x47,0x5E,0x63,0x5B,0x5C,0x5B,0x69,0x62,0x57,0x62,0x6B, + 0x73,0x75,0x73,0x71,0x70,0x6D,0x6C,0x63,0x5C,0x61,0x5C,0x6B,0x84,0x7C,0x68,0x6E, + 0x77,0x86,0x95,0x99,0xA9,0xB7,0xB9,0xB2,0xAE,0xB1,0xB7,0xBF,0xB9,0xB0,0xA8,0x99, + 0x97,0xA0,0xA4,0xA2,0x97,0x99,0xA7,0xA1,0x99,0x86,0x77,0x8C,0x92,0x8F,0x8E,0x81, + 0x7F,0x7F,0x7A,0x80,0x81,0x8A,0x93,0x8A,0x8B,0x87,0x77,0x7D,0x79,0x75,0x71,0x65, + 0x7F,0x88,0x7E,0x76,0x6C,0x75,0x81,0x87,0x84,0x86,0x87,0x6E,0x63,0x73,0x80,0x89, + 0x83,0x74,0x75,0x78,0x7B,0x78,0x65,0x60,0x60,0x5B,0x6A,0x6D,0x5A,0x49,0x46,0x58, + 0x64,0x5F,0x65,0x6C,0x67,0x5A,0x4D,0x56,0x62,0x74,0x7C,0x6B,0x69,0x71,0x6F,0x79, + 0x7F,0x79,0x71,0x6E,0x88,0x90,0x71,0x5E,0x5C,0x67,0x7A,0x7F,0x7E,0x81,0x7D,0x81, + 0x88,0x93,0xA0,0xA1,0xA4,0xA5,0xB0,0xB1,0xA6,0xB3,0xB8,0xB1,0xAC,0xAE,0xC1,0xC0, + 0xA5,0x90,0x85,0x89,0x8D,0x86,0x8A,0x90,0x8A,0x81,0x80,0x8D,0x98,0x9A,0x91,0x89, + 0x85,0x84,0x86,0x88,0x7D,0x76,0x7D,0x7F,0x8E,0x8F,0x7F,0x7F,0x7F,0x86,0x7F,0x77, + 0x7A,0x7C,0x7E,0x6C,0x6A,0x79,0x7D,0x83,0x84,0x79,0x7C,0x7E,0x81,0x87,0x80,0x76, + 0x65,0x72,0x86,0x7C,0x68,0x56,0x59,0x69,0x6B,0x63,0x68,0x64,0x58,0x59,0x5E,0x61, + 0x5C,0x5E,0x5A,0x5F,0x6A,0x67,0x6B,0x6A,0x70,0x71,0x60,0x6B,0x77,0x70,0x67,0x60, + 0x6D,0x73,0x6E,0x77,0x83,0x83,0x7A,0x6F,0x74,0x87,0x8A,0x81,0x7D,0x7F,0x87,0x93, + 0x94,0x92,0x95,0x95,0xA7,0xC1,0xBF,0xAB,0xA6,0xA9,0xB5,0xB3,0xA3,0xA9,0xAC,0xA3, + 0x96,0x96,0xA0,0xA2,0xA0,0x9A,0xA0,0xA1,0x9E,0x9E,0x97,0x96,0x9F,0x98,0x9D,0xB2, + 0xA7,0x95,0x8A,0x8B,0x9A,0x9E,0x9D,0x9C,0x9B,0x99,0x93,0x8F,0x92,0x94,0x8A,0x86, + 0x88,0x89,0x83,0x7C,0x88,0x82,0x74,0x80,0x92,0x92,0x7F,0x6E,0x6C,0x6F,0x73,0x69, + 0x69,0x73,0x6A,0x5F,0x58,0x64,0x6D,0x6A,0x65,0x58,0x5F,0x65,0x5A,0x59,0x55,0x52, + 0x55,0x5E,0x6D,0x68,0x51,0x47,0x51,0x60,0x63,0x5A,0x5B,0x62,0x46,0x3C,0x50,0x61, + 0x57,0x53,0x72,0x5A,0x52,0x67,0x65,0x6B,0x74,0x79,0x6F,0x7E,0x90,0x86,0x7D,0x73, + 0x8D,0x93,0x84,0x8B,0x95,0xA0,0x9C,0x97,0xAB,0xBE,0xA9,0x9F,0xA2,0xA5,0xA5,0xA8, + 0xAE,0x9D,0xA0,0xA3,0xAB,0xC6,0xBF,0xAB,0x9E,0x9F,0xB2,0xB2,0xAA,0xA9,0xA1,0x9A, + 0x97,0x96,0x9F,0xAA,0x9F,0x9F,0xA4,0xA0,0xA3,0x9E,0xA0,0xA3,0x98,0x99,0xAC,0xAD, + 0x9E,0x92,0x97,0xA3,0x97,0x94,0xA5,0xA2,0x98,0x8F,0x88,0x91,0x94,0x8C,0x87,0x7F, + 0x87,0x81,0x74,0x78,0x6F,0x6E,0x6F,0x7A,0x80,0x70,0x61,0x55,0x5A,0x62,0x5C,0x5A, + 0x5B,0x5A,0x50,0x46,0x4A,0x50,0x52,0x51,0x45,0x44,0x49,0x49,0x4C,0x47,0x3F,0x33, + 0x47,0x64,0x5B,0x51,0x42,0x3E,0x52,0x4E,0x4D,0x5A,0x55,0x4B,0x46,0x4D,0x5D,0x63, + 0x5E,0x62,0x6B,0x74,0x74,0x74,0x79,0x7F,0x81,0x85,0x99,0x97,0x85,0x81,0x88,0x91, + 0x8F,0x87,0x8D,0x99,0x98,0x8A,0x89,0x94,0x9B,0x9E,0x9B,0x96,0x97,0x96,0x93,0x96, + 0x96,0x8C,0x8C,0xA4,0xAD,0x9F,0x94,0x98,0xA7,0xA8,0xA5,0xAE,0xB3,0xAE,0xA0,0xA0, + 0xAA,0xB1,0xAF,0xA2,0x9D,0xA3,0xA7,0xA7,0xA2,0x9D,0x9E,0x99,0xA4,0xAF,0x9F,0x8D, + 0x87,0x8E,0x95,0x8F,0x89,0x8B,0x8C,0x81,0x7A,0x83,0x87,0x86,0x7C,0x77,0x78,0x75, + 0x70,0x6D,0x6C,0x6D,0x61,0x67,0x7D,0x77,0x61,0x53,0x5E,0x69,0x62,0x5E,0x62,0x5E, + 0x57,0x4F,0x54,0x61,0x63,0x62,0x5E,0x5C,0x62,0x60,0x5D,0x5F,0x63,0x5F,0x5F,0x74, + 0x78,0x6B,0x69,0x73,0x81,0x87,0x85,0x8E,0x92,0x8C,0x81,0x7F,0x8F,0x96,0x91,0x87, + 0x81,0x83,0x85,0x82,0x7F,0x7D,0x72,0x76,0x91,0x90,0x79,0x6E,0x71,0x7E,0x7E,0x78, + 0x7D,0x7C,0x75,0x6D,0x76,0x84,0x83,0x79,0x78,0x80,0x89,0x84,0x82,0x88,0x8C,0x8F, + 0x8E,0x9E,0x9E,0x8C,0x8C,0x91,0x95,0x96,0x91,0x96,0x97,0x90,0x81,0x80,0x90,0x8F, + 0x88,0x84,0x81,0x82,0x80,0x7E,0x7F,0x7C,0x6D,0x73,0x8A,0x85,0x6D,0x65,0x6C,0x73, + 0x72,0x6F,0x77,0x72,0x65,0x5D,0x64,0x73,0x70,0x67,0x65,0x69,0x6D,0x67,0x69,0x6D, + 0x6B,0x63,0x65,0x7A,0x7A,0x65,0x60,0x6A,0x73,0x75,0x75,0x7F,0x80,0x75,0x6F,0x77, + 0x86,0x8E,0x8D,0x8E,0x91,0x92,0x96,0x98,0x9C,0x97,0x8A,0xA2,0xB4,0xA3,0x8D,0x88, + 0x95,0x99,0x91,0x90,0x96,0x8F,0x81,0x7E,0x88,0x90,0x8E,0x85,0x85,0x8C,0x8A,0x84, + 0x80,0x83,0x87,0x83,0x92,0x9E,0x92,0x83,0x85,0x91,0x95,0x91,0x91,0x97,0x95,0x8E, + 0x88,0x8F,0x99,0x97,0x97,0x96,0x94,0x92,0x8C,0x8D,0x90,0x82,0x82,0x99,0x9B,0x86, + 0x78,0x7C,0x86,0x87,0x7E,0x81,0x87,0x7B,0x6E,0x6E,0x7C,0x82,0x7D,0x78,0x75,0x77, + 0x74,0x71,0x70,0x72,0x6E,0x6E,0x80,0x7D,0x6B,0x62,0x69,0x74,0x75,0x6E,0x70,0x77, + 0x72,0x66,0x66,0x74,0x76,0x75,0x77,0x76,0x76,0x79,0x79,0x7D,0x80,0x73,0x86,0xA1, + 0x94,0x80,0x7C,0x8A,0x93,0x89,0x88,0x95,0x90,0x81,0x79,0x83,0x90,0x8C,0x85,0x86, + 0x87,0x85,0x7E,0x7A,0x7B,0x7D,0x7B,0x84,0x91,0x87,0x78,0x73,0x7C,0x83,0x81,0x7F, + 0x86,0x85,0x7B,0x78,0x83,0x8C,0x8A,0x85,0x87,0x8A,0x85,0x83,0x83,0x85,0x7E,0x7C, + 0x97,0x9C,0x85,0x7B,0x81,0x89,0x89,0x83,0x8E,0x93,0x84,0x7B,0x7B,0x86,0x8D,0x86, + 0x80,0x83,0x86,0x80,0x78,0x79,0x7E,0x79,0x78,0x8D,0x90,0x7D,0x6E,0x71,0x7E,0x7F, + 0x79,0x7E,0x83,0x7A,0x6F,0x6F,0x7C,0x80,0x7B,0x7A,0x7C,0x79,0x76,0x77,0x77,0x77, + 0x6E,0x7C,0x8F,0x81,0x71,0x72,0x7B,0x7F,0x7A,0x7C,0x8B,0x86,0x77,0x71,0x7D,0x8B, + 0x8A,0x86,0x86,0x89,0x89,0x83,0x7F,0x86,0x8A,0x81,0x8B,0x9B,0x90,0x7B,0x75,0x7F, + 0x86,0x84,0x80,0x88,0x85,0x76,0x70,0x79,0x85,0x81,0x80,0x81,0x7C,0x79,0x76,0x77, + 0x7D,0x76,0x76,0x8F,0x8F,0x7B,0x75,0x79,0x7F,0x7E,0x78,0x83,0x8B,0x7C,0x71,0x71, + 0x80,0x87,0x81,0x81,0x83,0x81,0x7D,0x79,0x7C,0x81,0x7B,0x7C,0x90,0x91,0x7E,0x73, + 0x7B,0x82,0x82,0x7C,0x82,0x89,0x7D,0x71,0x73,0x7F,0x80,0x7E,0x80,0x80,0x7D,0x79, + 0x78,0x7C,0x77,0x70,0x85,0x91,0x7F,0x70,0x74,0x7C,0x80,0x7C,0x7E,0x8B,0x82,0x72, + 0x6F,0x7A,0x81,0x7B,0x7A,0x7F,0x80,0x7A,0x76,0x77,0x7B,0x74,0x76,0x91,0x92,0x7F, + 0x75,0x7E,0x89,0x8B,0x87,0x8D,0x94,0x89,0x7D,0x81,0x8C,0x8B,0x87,0x85,0x87,0x86, + 0x81,0x7D,0x7D,0x78,0x73,0x89,0x92,0x7E,0x6E,0x72,0x7B,0x7C,0x77,0x7B,0x87,0x7D, + 0x71,0x70,0x7C,0x82,0x7D,0x7E,0x81,0x84,0x7F,0x78,0x7A,0x81,0x79,0x7F,0x95,0x8F, + 0x7C,0x76,0x7D,0x82,0x81,0x80,0x8A,0x89,0x79,0x73,0x79,0x81,0x83,0x80,0x81,0x84, + 0x81,0x7E,0x7B,0x7D,0x76,0x7C,0x95,0x92,0x7D,0x75,0x7C,0x80,0x7E,0x7C,0x85,0x88, + 0x79,0x71,0x76,0x80,0x81,0x7E,0x83,0x89,0x83,0x7E,0x7D,0x80,0x7C,0x75,0x8D,0x98, + 0x85,0x76,0x79,0x7E,0x7F,0x7C,0x80,0x8B,0x81,0x74,0x72,0x79,0x80,0x7F,0x7D,0x81, + 0x80,0x7D,0x7E,0x80,0x7D,0x76,0x90,0x9D,0x89,0x7C,0x80,0x85,0x84,0x81,0x87,0x92, + 0x87,0x7A,0x79,0x80,0x83,0x7F,0x7F,0x82,0x80,0x7A,0x77,0x77,0x77,0x6F,0x7D,0x95, + 0x89,0x76,0x76,0x7B,0x7F,0x7B,0x7D,0x8B,0x86,0x78,0x75,0x7C,0x83,0x80,0x80,0x83, + 0x81,0x7C,0x79,0x79,0x7D,0x73,0x7E,0x97,0x8E,0x7D,0x7C,0x82,0x84,0x83,0x84,0x8F, + 0x8C,0x7D,0x78,0x7F,0x87,0x85,0x84,0x88,0x86,0x81,0x7F,0x7C,0x7D,0x76,0x7A,0x94, + 0x90,0x7B,0x76,0x7C,0x7D,0x7D,0x7C,0x89,0x8C,0x7D,0x75,0x7A,0x84,0x82,0x80,0x87, + 0x88,0x81,0x7F,0x7E,0x82,0x7B,0x78,0x90,0x92,0x7D,0x76,0x7B,0x7C,0x7B,0x7B,0x84, + 0x8C,0x82,0x77,0x7A,0x83,0x84,0x82,0x85,0x89,0x80,0x79,0x7A,0x7E,0x7E,0x7C,0x93, + 0x9D,0x89,0x7D,0x80,0x7C,0x78,0x79,0x83,0x92,0x89,0x7D,0x7F,0x85,0x84,0x82,0x85, + 0x88,0x81,0x7A,0x76,0x74,0x71,0x69,0x7C,0x92,0x85,0x78,0x80,0x83,0x82,0x80,0x82, + 0x8E,0x86,0x76,0x75,0x7C,0x7D,0x7C,0x83,0x8B,0x89,0x83,0x81,0x7F,0x7F,0x77,0x84, + 0x9D,0x93,0x7E,0x80,0x86,0x81,0x7A,0x7D,0x8D,0x87,0x76,0x75,0x78,0x7B,0x7B,0x7E, + 0x87,0x86,0x7E,0x7D,0x7B,0x7B,0x73,0x78,0x91,0x8F,0x7B,0x7A,0x7E,0x7C,0x7D,0x81, + 0x90,0x8D,0x7C,0x7D,0x87,0x84,0x7F,0x7F,0x82,0x83,0x81,0x80,0x7A,0x78,0x71,0x79, + 0x95,0x8F,0x75,0x75,0x82,0x7F,0x76,0x79,0x8B,0x8D,0x83,0x7F,0x82,0x83,0x7D,0x7E, + 0x84,0x81,0x7B,0x7D,0x7F,0x92,0x85,0x68,0x71,0x7B,0x7E,0x8C,0x91,0x84,0x7A,0x75, + 0x82,0x84,0x7A,0x81,0x8B,0x92,0x94,0x8F,0x92,0x96,0x8E,0x84,0x81,0x81,0x6F,0x6D, + 0x7F,0x72,0x5E,0x63,0x60,0x5D,0x64,0x6B,0x7D,0x88,0x86,0x83,0x84,0x83,0x87,0x8E, + 0x92,0x8D,0x83,0x7B,0x7C,0x83,0x76,0x81,0x99,0xA5,0x9A,0x8D,0x97,0x8A,0x73,0x71, + 0x7D,0x70,0x7B,0x95,0x8F,0x89,0x80,0x71,0x7C,0x88,0x6D,0x5A,0x57,0x5E,0x63,0x6B, + 0x7F,0x7C,0x75,0x77,0x72,0x7D,0x87,0x92,0xAD,0xA4,0x94,0xB3,0xAA,0x7B,0x81,0x7E, + 0x67,0x66,0x76,0x7F,0x8D,0x9E,0x9E,0x9F,0xA7,0x9C,0x88,0x7A,0x58,0x3D,0x53,0x79, + 0x79,0x7C,0x8E,0x7F,0x6C,0x75,0x71,0x73,0x8E,0x92,0x9A,0x9A,0x8F,0x82,0x7E,0x92, + 0x86,0x75,0x79,0x71,0x73,0x5E,0x4E,0x66,0x72,0x73,0x80,0x88,0x75,0x5E,0x64,0x75, + 0x7D,0x8B,0x88,0x81,0x83,0x7A,0x98,0xB5,0xA2,0x99,0x96,0xA9,0xA8,0x88,0x8E,0x9A, + 0x91,0x88,0x80,0x77,0x76,0x61,0x58,0x61,0x52,0x61,0x76,0x78,0x79,0x86,0xA1,0x98, + 0x7D,0x90,0x95,0x7A,0x75,0x79,0x73,0x71,0x63,0x68,0x82,0x88,0x94,0x94,0x91,0x8D, + 0x85,0x7E,0x81,0x82,0x70,0x81,0xA4,0x97,0x86,0x8C,0x85,0x74,0x67,0x70,0x7F,0x77, + 0x64,0x69,0x7B,0x78,0x6F,0x80,0x97,0x8E,0x72,0x66,0x60,0x58,0x5E,0x73,0x8D,0x8E, + 0x90,0xA1,0x9A,0x8F,0x9C,0x9E,0xAB,0xA6,0x8E,0x95,0x78,0x6B,0x6B,0x59,0x5D,0x65, + 0x73,0x76,0x61,0x5D,0x7C,0x94,0x7C,0x7C,0x89,0x83,0x7D,0x7A,0x97,0xA0,0x94,0x8D, + 0x8B,0x8C,0x84,0x81,0x93,0xAD,0x99,0x85,0x8F,0x8A,0x73,0x6D,0x7B,0x82,0x89,0x79, + 0x6E,0x6A,0x5C,0x58,0x70,0x7B,0x6C,0x76,0x80,0x82,0x8E,0x8A,0x7F,0x8C,0x84,0x6F, + 0x7D,0x75,0x70,0x8A,0x7E,0x75,0x89,0x8D,0x83,0x83,0x7C,0x82,0x9B,0x9D,0x81,0x87, + 0x89,0x6E,0x80,0x85,0x76,0x78,0x73,0x73,0x7B,0x6C,0x71,0x89,0x76,0x6E,0x75,0x77, + 0x73,0x67,0x89,0xAD,0x92,0x8A,0x9A,0x97,0x91,0x84,0x7E,0x84,0x92,0x98,0x83,0x8A, + 0x8B,0x82,0x98,0x88,0x7B,0x7D,0x6B,0x68,0x71,0x77,0x77,0x6E,0x64,0x6D,0x6D,0x65, + 0x69,0x78,0x7B,0x78,0x90,0x86,0x7B,0x8D,0x98,0xAB,0xA5,0x97,0xA3,0x90,0x7D,0x8D, + 0x91,0x9E,0x97,0x89,0x96,0x92,0x81,0x82,0x84,0x84,0x73,0x63,0x6E,0x64,0x55,0x67, + 0x8B,0x84,0x67,0x6A,0x6C,0x66,0x6C,0x77,0x81,0x87,0x7C,0x7A,0x7A,0x84,0x88,0x8B, + 0x8A,0x83,0x88,0x7E,0x8A,0x83,0x7C,0x9F,0x96,0x80,0x90,0x95,0x85,0x7A,0x73,0x75, + 0x75,0x6B,0x6E,0x78,0x81,0x75,0x6D,0x84,0x8B,0x85,0x7A,0x71,0x73,0x7A,0x95,0xA4, + 0x9D,0xA6,0xAA,0x91,0x84,0x7D,0x7F,0x80,0x72,0x7C,0x7C,0x78,0x69,0x66,0x81,0x76, + 0x6E,0x86,0x85,0x77,0x7B,0x8A,0x8C,0x80,0x88,0x8E,0x7C,0x62,0x63,0x77,0x6D,0x63, + 0x81,0x8A,0x88,0x8F,0x86,0x9A,0x9A,0x89,0x82,0x7B,0x7E,0x6E,0x7E,0x87,0x8F,0x97, + 0x93,0xA9,0xA2,0x97,0x9C,0x91,0x82,0x80,0x7A,0x73,0x6A,0x64,0x64,0x5D,0x63,0x5A, + 0x5F,0x66,0x59,0x75,0x80,0x76,0x80,0x86,0x89,0x8C,0x8F,0x99,0x9B,0x8B,0x87,0x95, + 0x93,0x83,0x85,0x88,0x7B,0x71,0x68,0x6A,0x68,0x5C,0x79,0x82,0x7F,0x88,0x84,0x87, + 0x82,0x77,0x84,0x85,0x7F,0x89,0x82,0x8D,0x81,0x78,0x83,0x83,0x88,0x88,0x92,0x88, + 0x81,0x95,0x90,0x7E,0x85,0x87,0x84,0x6C,0x5E,0x72,0x77,0x75,0x74,0x8C,0x85,0x71, + 0x76,0x76,0x85,0x79,0x7C,0x90,0x8A,0x8D,0x8C,0x82,0x81,0x81,0x76,0x73,0x78,0x73, + 0x7A,0x8D,0x8D,0x87,0xA0,0x92,0x81,0x88,0x7E,0x80,0x79,0x71,0x79,0x8F,0x95,0x8F, + 0x9F,0x98,0x8C,0x89,0x7D,0x87,0x87,0x6F,0x61,0x5E,0x61,0x5D,0x64,0x70,0x6E,0x75, + 0x76,0x7A,0x7C,0x72,0x87,0x8E,0x87,0x8E,0x94,0xA0,0x99,0x90,0x92,0x93,0x86,0x7A, + 0x80,0x79,0x71,0x6D,0x61,0x63,0x6C,0x67,0x68,0x73,0x7A,0x75,0x7B,0x85,0x95,0x9F, + 0x88,0x8E,0x93,0x8F,0x86,0x73,0x7D,0x7F,0x7E,0x7E,0x8E,0x96,0x8A,0x8A,0x85,0x89, + 0x7F,0x7C,0x86,0x81,0x75,0x71,0x74,0x72,0x7A,0x72,0x74,0x77,0x6C,0x85,0x86,0x88, + 0x8F,0x9E,0x95,0x78,0x83,0x7C,0x83,0x7E,0x74,0x7E,0x6B,0x63,0x6D,0x7B,0x83,0x7E, + 0x86,0x91,0x83,0x88,0x8E,0x7D,0x77,0x74,0x72,0x79,0x7F,0x80,0x91,0xA4,0xA3,0x9A, + 0xA7,0xB0,0x95,0x84,0x8C,0x88,0x78,0x69,0x6B,0x73,0x67,0x69,0x68,0x68,0x69,0x65, + 0x6F,0x77,0x74,0x71,0x72,0x7C,0x7A,0x7D,0x92,0x8D,0x86,0x8E,0x8A,0x8D,0x8F,0x86, + 0x80,0x74,0x6B,0x6A,0x7F,0x79,0x74,0x87,0x84,0x86,0x7E,0x89,0x87,0x7A,0x83,0x86, + 0x84,0x80,0x8D,0x8F,0x96,0x8F,0x86,0x90,0x83,0x63,0x67,0x8D,0x94,0x82,0x74,0x8D, + 0x79,0x53,0x69,0x79,0x81,0x7A,0x94,0x98,0x79,0x85,0x87,0x89,0x82,0x85,0x95,0x8F, + 0x80,0x7B,0x8E,0x8D,0x88,0x90,0x8D,0x6D,0x5D,0x5C,0x5C,0x64,0x5F,0x77,0x8A,0x80, + 0x83,0x81,0x8D,0x93,0x85,0x8D,0x94,0x92,0x8C,0x97,0xA6,0x94,0x91,0x98,0x8C,0x93, + 0x9C,0x8C,0x89,0x82,0x72,0x6F,0x71,0x61,0x67,0x70,0x68,0x6F,0x6F,0x6C,0x76,0x7B, + 0x71,0x79,0x77,0x6F,0x7E,0x7F,0x81,0x89,0x87,0x82,0x85,0x8A,0x86,0x88,0x8B,0x7C, + 0x7C,0x80,0x7E,0x82,0x87,0x82,0x73,0x78,0x88,0x8D,0x82,0x8A,0x91,0x81,0x80,0x71, + 0x72,0x8D,0x78,0x77,0x8A,0x79,0x7D,0x7E,0x85,0x92,0x8C,0x90,0x82,0x79,0x7C,0x7D, + 0x8C,0x84,0x7E,0x84,0x7B,0x7D,0x7E,0x83,0x8A,0x77,0x6E,0x7F,0x84,0x81,0x84,0x8D, + 0x97,0x8F,0x88,0x95,0x8C,0x7A,0x6D,0x72,0x66,0x50,0x6B,0x73,0x78,0x83,0x7B,0x87, + 0x8F,0x84,0x84,0x7C,0x7D,0x81,0x78,0x92,0x99,0x89,0xA4,0xA5,0x9B,0x9C,0x8E,0x9A, + 0x98,0x88,0x82,0x79,0x71,0x66,0x65,0x66,0x64,0x67,0x70,0x70,0x6D,0x6E,0x6D,0x73, + 0x72,0x72,0x7C,0x88,0x83,0x83,0x99,0x92,0x86,0x87,0x83,0x7F,0x7D,0x74,0x74,0x76, + 0x6E,0x78,0x7E,0x7F,0x85,0x88,0x94,0x94,0x8E,0x97,0x96,0x89,0x82,0x78,0x71,0x6D, + 0x72,0x7B,0x74,0x76,0x85,0x8A,0x7F,0x83,0x91,0x92,0x89,0x7D,0x78,0x77,0x7F,0x83, + 0x82,0x89,0x84,0x73,0x7D,0x88,0x77,0x7B,0x7F,0x7D,0x7F,0x74,0x75,0x7D,0x89,0x8E, + 0x98,0x99,0x86,0x84,0x80,0x7B,0x68,0x60,0x73,0x6F,0x71,0x75,0x7D,0x8D,0x86,0x8C, + 0x99,0x8E,0x7E,0x7F,0x7B,0x75,0x75,0x7B,0x9A,0x96,0x95,0x9F,0x99,0x99,0x90,0x94, + 0x92,0x88,0x77,0x72,0x76,0x64,0x60,0x6A,0x6B,0x61,0x68,0x6F,0x73,0x75,0x74,0x7B, + 0x7E,0x7F,0x83,0x91,0x90,0x84,0x85,0x8D,0x8F,0x7F,0x7C,0x89,0x80,0x6D,0x73,0x78, + 0x6D,0x6C,0x7A,0x84,0x7B,0x7C,0x8F,0x91,0x86,0x86,0x87,0x8F,0x87,0x79,0x8C,0x8D, + 0x74,0x6C,0x82,0x8A,0x78,0x78,0x8C,0x8A,0x7C,0x79,0x7E,0x80,0x77,0x7C,0x8A,0x78, + 0x6B,0x82,0x8C,0x84,0x84,0x8B,0x87,0x79,0x71,0x75,0x7B,0x7A,0x7F,0x8E,0x93,0x92, + 0x93,0x91,0x91,0x7E,0x68,0x70,0x6C,0x5F,0x6C,0x7E,0x7D,0x7B,0x89,0x95,0x88,0x7B, + 0x80,0x87,0x79,0x6E,0x85,0x92,0x81,0x81,0x90,0x95,0x8D,0x8C,0x9A,0xA3,0x9B,0x8D, + 0x84,0x86,0x76,0x61,0x76,0x7B,0x6D,0x67,0x80,0x85,0x65,0x75,0x7C,0x6A,0x6E,0x71, + 0x79,0x83,0x6F,0x7C,0x8D,0x78,0x7A,0x79,0x84,0x87,0x78,0x87,0x81,0x7A,0x77,0x70, + 0x86,0x7B,0x77,0x90,0x8C,0x86,0x8B,0x90,0x8D,0x86,0x7A,0x78,0x76,0x6E,0x7E,0x8C, + 0x85,0x7E,0x89,0x92,0x89,0x7E,0x88,0x8E,0x85,0x7B,0x80,0x8C,0x81,0x7B,0x80,0x89, + 0x80,0x71,0x83,0x7F,0x6F,0x69,0x6B,0x73,0x6D,0x6E,0x80,0x8F,0x95,0x92,0x9B,0x9D, + 0x8B,0x86,0x85,0x79,0x70,0x65,0x67,0x72,0x77,0x83,0x87,0x91,0x93,0x8F,0x92,0x82, + 0x79,0x76,0x70,0x74,0x7B,0x7C,0x8D,0x89,0x8D,0xA3,0x98,0x92,0x9B,0x9F,0x95,0x7C, + 0x7E,0x8B,0x6E,0x5D,0x65,0x70,0x6D,0x60,0x72,0x7B,0x7F,0x72,0x6D,0x87,0x7C,0x6C, + 0x75,0x85,0x83,0x76,0x82,0x8F,0x89,0x84,0x89,0x85,0x7D,0x76,0x7D,0x82,0x70,0x83, + 0x92,0x7D,0x82,0x87,0x83,0x92,0x84,0x7A,0x8C,0x7E,0x73,0x78,0x7A,0x7A,0x6D,0x72, + 0x83,0x80,0x7C,0x89,0x90,0x8C,0x88,0x86,0x8D,0x84,0x7C,0x8B,0x8B,0x82,0x83,0x8E, + 0x93,0x7F,0x74,0x73,0x6C,0x68,0x6B,0x78,0x81,0x86,0x86,0x90,0x96,0x8E,0x94,0x95, + 0x8B,0x7E,0x78,0x73,0x69,0x6A,0x74,0x78,0x77,0x7D,0x88,0x8A,0x7F,0x7F,0x88,0x80, + 0x78,0x73,0x76,0x7F,0x7C,0x85,0x8F,0x98,0xA4,0x97,0x9E,0xAA,0x9A,0x8E,0x85,0x80, + 0x74,0x70,0x6D,0x6C,0x71,0x71,0x6C,0x6A,0x6A,0x70,0x73,0x69,0x77,0x85,0x82,0x7D, + 0x81,0x8A,0x83,0x82,0x8C,0x8A,0x8C,0x8A,0x82,0x88,0x84,0x6F,0x6F,0x78,0x77,0x73, + 0x7A,0x88,0x83,0x85,0x8F,0x88,0x85,0x7C,0x74,0x7C,0x7B,0x7A,0x7D,0x84,0x7E,0x78, + 0x7E,0x7D,0x89,0x8D,0x89,0x90,0x92,0x88,0x80,0x85,0x86,0x83,0x84,0x85,0x84,0x81, + 0x78,0x6D,0x6B,0x70,0x6C,0x6A,0x79,0x7C,0x85,0x89,0x8A,0x9B,0xA0,0x99,0x91,0x91, + 0x82,0x6E,0x71,0x73,0x73,0x78,0x76,0x82,0x7E,0x7B,0x85,0x82,0x82,0x78,0x74,0x78, + 0x77,0x6F,0x78,0x86,0x84,0x8B,0x8F,0x9C,0x9D,0x96,0x99,0x9C,0x94,0x87,0x86,0x7F, + 0x77,0x77,0x78,0x75,0x77,0x77,0x76,0x7A,0x76,0x6A,0x6D,0x70,0x6B,0x6B,0x72,0x79, + 0x76,0x77,0x87,0x86,0x81,0x8D,0x90,0x87,0x7A,0x82,0x88,0x7C,0x71,0x76,0x7E,0x75, + 0x7D,0x88,0x8F,0x93,0x82,0x89,0x8B,0x7D,0x73,0x7A,0x8F,0x82,0x82,0x92,0x84,0x81, + 0x7F,0x84,0x89,0x7B,0x7E,0x82,0x83,0x83,0x7C,0x7F,0x8C,0x7F,0x7C,0x88,0x76,0x75, + 0x77,0x73,0x77,0x73,0x72,0x73,0x79,0x7D,0x7F,0x8A,0x94,0x90,0x90,0x93,0x83,0x80, + 0x82,0x71,0x6E,0x73,0x7B,0x81,0x7C,0x82,0x87,0x8D,0x87,0x80,0x8B,0x7F,0x72,0x7C, + 0x81,0x7E,0x85,0x82,0x80,0x87,0x86,0x84,0x88,0x8E,0x8B,0x87,0x86,0x81,0x7A,0x80, + 0x83,0x79,0x7B,0x8A,0x83,0x79,0x81,0x81,0x7B,0x76,0x74,0x76,0x76,0x73,0x79,0x80, + 0x80,0x83,0x84,0x86,0x88,0x80,0x7C,0x7E,0x70,0x72,0x7E,0x73,0x72,0x71,0x7B,0x8B, + 0x7B,0x7B,0x91,0x8A,0x7D,0x7E,0x89,0x8C,0x81,0x7D,0x84,0x84,0x7B,0x77,0x88,0x8D, + 0x87,0x8B,0x88,0x8C,0x82,0x76,0x83,0x85,0x82,0x83,0x82,0x81,0x81,0x81,0x7B,0x77, + 0x76,0x72,0x78,0x79,0x77,0x82,0x89,0x72,0x70,0x8A,0x83,0x6F,0x76,0x87,0x8D,0x91, + 0x8F,0x8C,0x88,0x80,0x89,0x97,0x93,0x91,0x91,0x91,0x8B,0x85,0x7E,0x77,0x70,0x64, + 0x65,0x69,0x67,0x61,0x68,0x79,0x7C,0x7B,0x75,0x77,0x77,0x6D,0x6E,0x76,0x7A,0x7E, + 0x82,0x8B,0x93,0x87,0x8D,0x9A,0x8E,0xA0,0xB4,0xAE,0x9D,0x9F,0xAC,0x90,0x8D,0x93, + 0x85,0x89,0x89,0x8B,0x86,0x7F,0x79,0x78,0x79,0x69,0x5E,0x62,0x5F,0x5D,0x6A,0x68, + 0x69,0x5A,0x49,0x50,0x51,0x4D,0x4C,0x59,0x5D,0x61,0x67,0x76,0x81,0x73,0x7A,0x8A, + 0x8E,0x92,0x94,0x94,0x99,0x95,0x8F,0xA2,0xAE,0xB5,0xBC,0xC2,0xC9,0xC7,0xC9,0xC5, + 0xC0,0xBA,0xA7,0x95,0x8D,0x92,0x93,0x90,0x98,0x93,0x88,0x80,0x74,0x70,0x69,0x60, + 0x57,0x57,0x5B,0x4A,0x43,0x4B,0x47,0x43,0x42,0x4A,0x52,0x4F,0x51,0x55,0x5F,0x64, + 0x69,0x78,0x80,0x7F,0x80,0x8D,0x8F,0x8E,0x90,0x8A,0x92,0x90,0x8E,0x96,0x86,0x7F, + 0x86,0x8C,0x8E,0x8A,0x84,0x76,0x75,0x79,0x75,0x70,0x69,0x69,0x6A,0x73,0x75,0x71, + 0x72,0x71,0x74,0x73,0x78,0x7B,0x83,0x8C,0x8C,0x89,0x7F,0x7D,0x87,0x89,0x8A,0x8B, + 0x8C,0x8C,0x86,0x83,0x86,0x85,0x82,0x82,0x8A,0x8E,0x86,0x89,0x8F,0x91,0x96,0x95, + 0xA0,0xA2,0x9F,0xAA,0xA9,0xAB,0xB3,0xB3,0xB6,0xBA,0xB5,0xAF,0xAF,0xAA,0xA2,0x9D, + 0x9D,0x9A,0x92,0x90,0x8A,0x82,0x7D,0x77,0x73,0x6E,0x65,0x61,0x64,0x5E,0x5A,0x5B, + 0x58,0x54,0x52,0x51,0x4F,0x49,0x46,0x4D,0x51,0x4F,0x55,0x5B,0x62,0x69,0x6C,0x79, + 0x7E,0x7E,0x84,0x89,0x8C,0x8C,0x8C,0x8D,0x91,0x94,0x95,0x9A,0x9D,0x9E,0xA2,0xA1, + 0x9C,0x9D,0x9C,0x9B,0x98,0x93,0x93,0x92,0x92,0x91,0x90,0x8E,0x8B,0x87,0x83,0x81, + 0x7C,0x75,0x74,0x70,0x64,0x61,0x5E,0x5A,0x57,0x50,0x4E,0x4B,0x46,0x46,0x47,0x44, + 0x40,0x40,0x41,0x3E,0x3E,0x42,0x42,0x43,0x46,0x48,0x4A,0x4F,0x56,0x59,0x5E,0x64, + 0x69,0x72,0x78,0x7E,0x85,0x8E,0x95,0x97,0xA1,0xB1,0xB5,0xB7,0xC0,0xCC,0xD1,0xCF, + 0xCF,0xD1,0xD6,0xD2,0xD0,0xD2,0xC7,0xC0,0xC2,0xC3,0xBE,0xB7,0xB3,0xB5,0xB6,0xB1, + 0xAA,0xA9,0xA4,0x9C,0x97,0x92,0x8A,0x86,0x8C,0x8B,0x82,0x7E,0x7F,0x7E,0x7A,0x6D, + 0x64,0x66,0x64,0x64,0x66,0x68,0x6F,0x79,0x7B,0x74,0x75,0x7A,0x75,0x6E,0x69,0x6D, + 0x71,0x6E,0x6C,0x6B,0x6B,0x74,0x79,0x71,0x70,0x73,0x70,0x6F,0x6E,0x6A,0x6F,0x75, + 0x76,0x7B,0x82,0x88,0x90,0x8A,0x85,0x92,0x93,0x8B,0x90,0x98,0x9A,0x98,0x95,0x97, + 0xA2,0xA9,0xA1,0x9D,0x9E,0x99,0x93,0x88,0x7D,0x83,0x8A,0x83,0x7E,0x80,0x81,0x7F, + 0x6D,0x5F,0x67,0x66,0x5D,0x5D,0x60,0x5E,0x53,0x49,0x4D,0x5C,0x59,0x48,0x46,0x4B, + 0x46,0x3E,0x36,0x39,0x46,0x48,0x44,0x4D,0x56,0x58,0x57,0x4E,0x53,0x61,0x5E,0x5D, + 0x66,0x6C,0x69,0x64,0x67,0x75,0x85,0x82,0x7E,0x8C,0x95,0x92,0x8F,0x94,0xA2,0xB1, + 0xB2,0xBA,0xC9,0xD0,0xD0,0xC7,0xC2,0xCB,0xCB,0xC1,0xC5,0xCA,0xC3,0xB8,0xAE,0xAC, + 0xBB,0xBB,0xA6,0xA5,0xAB,0x9D,0x8B,0x80,0x83,0x8D,0x83,0x7A,0x84,0x87,0x7F,0x74, + 0x6E,0x77,0x7C,0x74,0x77,0x82,0x81,0x78,0x76,0x76,0x82,0x91,0x85,0x80,0x8C,0x88, + 0x7C,0x75,0x76,0x82,0x86,0x7C,0x7F,0x87,0x84,0x7C,0x75,0x76,0x7C,0x74,0x71,0x7E, + 0x80,0x77,0x75,0x73,0x7A,0x8B,0x85,0x7C,0x86,0x85,0x75,0x6E,0x6B,0x71,0x79,0x71, + 0x72,0x7F,0x7D,0x77,0x74,0x72,0x79,0x79,0x75,0x7F,0x84,0x7C,0x74,0x70,0x6E,0x7B, + 0x83,0x76,0x7A,0x7F,0x70,0x66,0x63,0x64,0x6E,0x6D,0x6A,0x73,0x77,0x6D,0x69,0x67, + 0x67,0x6C,0x6D,0x71,0x7A,0x75,0x6B,0x6B,0x6B,0x75,0x86,0x7F,0x7A,0x85,0x7E,0x73, + 0x72,0x73,0x7C,0x7F,0x7A,0x81,0x89,0x81,0x79,0x78,0x78,0x7C,0x7D,0x81,0x8C,0x8B, + 0x81,0x80,0x80,0x82,0x94,0x9F,0x96,0x9D,0xA2,0x95,0x8B,0x87,0x8A,0x92,0x90,0x8E, + 0x97,0x94,0x86,0x7F,0x7C,0x7B,0x7B,0x7B,0x81,0x85,0x79,0x6E,0x6D,0x6B,0x76,0x88, + 0x82,0x81,0x8B,0x81,0x77,0x76,0x78,0x80,0x84,0x82,0x8A,0x91,0x86,0x80,0x82,0x80, + 0x83,0x88,0x8D,0x93,0x90,0x87,0x85,0x83,0x83,0x98,0x9E,0x93,0x9B,0x9B,0x8E,0x89, + 0x87,0x8D,0x96,0x95,0x99,0xA4,0xA0,0x96,0x96,0x95,0x94,0x99,0x9D,0xA4,0xA5,0x9B, + 0x94,0x91,0x8D,0x93,0xA3,0x9F,0x97,0x9B,0x93,0x83,0x7C,0x7B,0x7D,0x7D,0x7A,0x7B, + 0x7B,0x71,0x66,0x63,0x5F,0x5F,0x62,0x64,0x66,0x62,0x57,0x52,0x4E,0x4D,0x5E,0x63, + 0x58,0x5F,0x60,0x4F,0x45,0x43,0x47,0x4A,0x49,0x4C,0x55,0x50,0x45,0x48,0x49,0x47, + 0x4B,0x50,0x59,0x5D,0x59,0x56,0x56,0x54,0x5D,0x72,0x6F,0x6D,0x7B,0x77,0x6C,0x6B, + 0x72,0x7E,0x82,0x85,0x93,0x9B,0x92,0x8F,0x95,0x95,0x99,0xA2,0xAB,0xB3,0xB2,0xAC, + 0xA8,0xA3,0xA1,0xAD,0xBB,0xAF,0xAD,0xB5,0xA6,0x97,0x92,0x94,0x98,0x96,0x94,0x9D, + 0x9D,0x8F,0x8C,0x8E,0x8B,0x8B,0x8F,0x94,0x98,0x98,0x92,0x8E,0x8C,0x8D,0x9F,0xA9, + 0x9C,0xA3,0xAB,0x9C,0x91,0x93,0x99,0x9E,0x9B,0x9D,0xA9,0xA5,0x97,0x96,0x96,0x8E, + 0x8F,0x94,0x98,0x9A,0x97,0x90,0x8A,0x84,0x84,0x98,0x9E,0x90,0x97,0x9B,0x89,0x7F, + 0x7F,0x84,0x86,0x81,0x84,0x8E,0x85,0x77,0x78,0x74,0x6B,0x6B,0x70,0x72,0x71,0x6D, + 0x66,0x5C,0x56,0x56,0x64,0x66,0x59,0x60,0x62,0x4E,0x42,0x44,0x47,0x48,0x45,0x4C, + 0x54,0x4B,0x40,0x44,0x42,0x3B,0x40,0x47,0x4D,0x4C,0x49,0x47,0x43,0x3E,0x42,0x58, + 0x5E,0x53,0x5C,0x64,0x56,0x4F,0x55,0x5F,0x63,0x62,0x6B,0x78,0x71,0x6B,0x74,0x77, + 0x77,0x7D,0x87,0x91,0x95,0x95,0x98,0x98,0x98,0x97,0xAE,0xC1,0xB2,0xB8,0xC6,0xBB, + 0xB0,0xB5,0xBE,0xC4,0xC3,0xC4,0xD0,0xC9,0xB8,0xBD,0xBF,0xB6,0xB6,0xBB,0xBC,0xBA, + 0xB1,0xAC,0xA5,0x9E,0x97,0xA0,0xB4,0xA5,0x99,0xA5,0x9B,0x87,0x87,0x8D,0x92,0x91, + 0x90,0x99,0x9A,0x88,0x86,0x8C,0x84,0x84,0x8C,0x90,0x92,0x8D,0x8A,0x87,0x81,0x7B, + 0x7E,0x96,0x96,0x83,0x8E,0x8F,0x79,0x70,0x78,0x7E,0x7E,0x7B,0x82,0x8A,0x7B,0x71, + 0x7B,0x77,0x6F,0x75,0x7D,0x7E,0x7A,0x78,0x76,0x6F,0x6D,0x69,0x78,0x8A,0x77,0x75, + 0x80,0x70,0x5E,0x60,0x66,0x67,0x62,0x61,0x6B,0x63,0x50,0x52,0x55,0x49,0x47,0x50, + 0x52,0x52,0x4E,0x4C,0x49,0x44,0x40,0x44,0x5D,0x5E,0x4C,0x58,0x5B,0x46,0x41,0x4A, + 0x52,0x57,0x56,0x60,0x6D,0x5F,0x58,0x65,0x63,0x5F,0x69,0x73,0x78,0x79,0x78,0x79, + 0x77,0x77,0x75,0x82,0x9E,0x95,0x8E,0xA0,0x98,0x88,0x8B,0x96,0x9F,0xA2,0xA3,0xB2, + 0xB7,0xA8,0xAA,0xB5,0xB0,0xB1,0xBD,0xC2,0xC7,0xC5,0xBF,0xBD,0xB6,0xB2,0xAA,0xB6, + 0xC9,0xB6,0xAB,0xB5,0xA5,0x90,0x8F,0x93,0x96,0x93,0x8F,0x98,0x93,0x7F,0x7E,0x82, + 0x7A,0x79,0x80,0x83,0x84,0x7E,0x7B,0x79,0x74,0x73,0x6F,0x82,0x95,0x82,0x7F,0x8D, + 0x7E,0x6E,0x73,0x7C,0x84,0x83,0x81,0x8D,0x8A,0x77,0x7C,0x82,0x7B,0x7B,0x82,0x87, + 0x87,0x81,0x7F,0x7F,0x7C,0x7A,0x77,0x8D,0x9B,0x85,0x83,0x8E,0x7B,0x6D,0x73,0x7A, + 0x80,0x7D,0x7B,0x83,0x7C,0x6C,0x6F,0x74,0x6E,0x6D,0x73,0x78,0x77,0x6E,0x6B,0x6A, + 0x65,0x61,0x5C,0x70,0x7D,0x65,0x63,0x6D,0x5A,0x4E,0x54,0x5A,0x61,0x5C,0x57,0x62, + 0x5C,0x4D,0x51,0x57,0x52,0x54,0x59,0x5F,0x61,0x5C,0x5D,0x61,0x5F,0x5D,0x5B,0x73, + 0x82,0x6B,0x6B,0x7B,0x6D,0x63,0x6A,0x75,0x81,0x7C,0x7A,0x8D,0x8C,0x7D,0x83,0x8C, + 0x8C,0x8D,0x93,0x9C,0xA0,0x9B,0x9D,0xA0,0x9E,0x9E,0x9C,0xB4,0xC3,0xAB,0xAA,0xB5, + 0xA5,0x9A,0x9C,0xA3,0xAB,0xA0,0x98,0xA2,0x9B,0x86,0x86,0x8C,0x87,0x83,0x83,0x87, + 0x86,0x7A,0x77,0x79,0x78,0x72,0x6F,0x8B,0x93,0x7A,0x7D,0x85,0x77,0x71,0x73,0x7D, + 0x8A,0x81,0x7C,0x89,0x84,0x78,0x7B,0x82,0x84,0x83,0x84,0x8B,0x8D,0x86,0x86,0x89, + 0x88,0x83,0x83,0x9F,0xA7,0x8E,0x92,0x9A,0x8D,0x88,0x89,0x94,0x9F,0x96,0x90,0x99, + 0x94,0x87,0x87,0x8B,0x8D,0x8B,0x89,0x8C,0x8D,0x84,0x81,0x7F,0x7F,0x79,0x75,0x8C, + 0x91,0x78,0x79,0x7B,0x6D,0x68,0x67,0x6F,0x78,0x6D,0x66,0x6C,0x69,0x5E,0x5D,0x5F, + 0x61,0x61,0x5F,0x62,0x64,0x60,0x5C,0x5B,0x5F,0x5A,0x57,0x71,0x77,0x64,0x67,0x69, + 0x62,0x60,0x5E,0x6B,0x77,0x6F,0x6B,0x74,0x73,0x6F,0x70,0x74,0x7E,0x83,0x81,0x87, + 0x8D,0x8B,0x88,0x89,0x90,0x8E,0x91,0xAF,0xB0,0x9E,0xA3,0xA3,0x9C,0x9D,0x9B,0xA6, + 0xB2,0xA7,0xA1,0xA5,0x9F,0x98,0x95,0x95,0x98,0x96,0x92,0x90,0x8F,0x86,0x7E,0x7B, + 0x7C,0x73,0x78,0x90,0x86,0x74,0x77,0x72,0x6E,0x6B,0x6B,0x79,0x80,0x75,0x72,0x74, + 0x72,0x70,0x6E,0x72,0x7B,0x7E,0x7C,0x7E,0x7F,0x7D,0x7A,0x7A,0x7D,0x79,0x88,0xA0, + 0x93,0x88,0x8D,0x84,0x83,0x83,0x85,0x95,0x9C,0x92,0x8D,0x8E,0x8F,0x8D,0x8B,0x8D, + 0x97,0x9A,0x93,0x93,0x95,0x93,0x8D,0x8A,0x8A,0x86,0x96,0xA5,0x93,0x89,0x87,0x7E, + 0x7D,0x78,0x78,0x86,0x88,0x7B,0x71,0x71,0x72,0x6F,0x6A,0x6A,0x73,0x74,0x6D,0x68, + 0x68,0x67,0x61,0x5E,0x5E,0x5C,0x70,0x7E,0x6C,0x62,0x60,0x5C,0x5F,0x5B,0x5D,0x6D, + 0x72,0x68,0x60,0x5F,0x64,0x67,0x63,0x63,0x6D,0x73,0x70,0x6D,0x6F,0x74,0x73,0x74, + 0x73,0x74,0x8D,0x9C,0x8D,0x85,0x87,0x8A,0x8E,0x8A,0x8E,0x9E,0xA6,0xA1,0x9A,0x99, + 0xA0,0xA3,0xA0,0x9E,0xA2,0xA7,0xA5,0x9E,0x9B,0x9A,0x96,0x94,0x8C,0x8A,0xA0,0xA9, + 0x98,0x8C,0x84,0x83,0x86,0x7E,0x79,0x80,0x85,0x80,0x75,0x6E,0x71,0x76,0x73,0x6E, + 0x70,0x78,0x7B,0x77,0x72,0x72,0x73,0x75,0x70,0x72,0x89,0x93,0x89,0x7E,0x74,0x76, + 0x7F,0x7E,0x7D,0x85,0x8B,0x8D,0x87,0x7C,0x7B,0x82,0x83,0x82,0x83,0x87,0x8A,0x8A, + 0x85,0x81,0x81,0x83,0x7F,0x86,0x99,0x9D,0x97,0x8B,0x7F,0x7F,0x85,0x84,0x87,0x8B, + 0x8C,0x8E,0x8A,0x81,0x80,0x81,0x84,0x85,0x84,0x84,0x84,0x84,0x80,0x78,0x74,0x72, + 0x6F,0x7A,0x8A,0x88,0x7F,0x75,0x69,0x6C,0x70,0x6B,0x6E,0x72,0x74,0x78,0x76,0x6F, + 0x6E,0x6F,0x71,0x75,0x76,0x77,0x79,0x7A,0x7A,0x77,0x73,0x72,0x72,0x81,0x8F,0x8B, + 0x86,0x7F,0x78,0x7C,0x7F,0x7B,0x7B,0x7D,0x7E,0x82,0x83,0x80,0x81,0x7F,0x7F,0x84, + 0x84,0x83,0x83,0x84,0x85,0x85,0x86,0x85,0x82,0x8A,0x93,0x91,0x8F,0x8B,0x84,0x86, + 0x89,0x83,0x83,0x81,0x7E,0x81,0x81,0x7F,0x7F,0x7D,0x7C,0x7E,0x7E,0x7C,0x7A,0x79, + 0x78,0x78,0x79,0x78,0x76,0x75,0x79,0x7D,0x79,0x7A,0x7A,0x77,0x7D,0x7E,0x7A,0x7E, + 0x7D,0x7A,0x7E,0x7E,0x7D,0x7E,0x7D,0x7E,0x82,0x82,0x81,0x82,0x83,0x83,0x83,0x83, + 0x83,0x82,0x87,0x8C,0x88,0x88,0x89,0x85,0x8A,0x8D,0x88,0x89,0x87,0x84,0x87,0x86, + 0x82,0x83,0x82,0x82,0x85,0x86,0x85,0x85,0x85,0x86,0x87,0x87,0x86,0x85,0x84,0x8A, + 0x8C,0x85,0x86,0x86,0x83,0x89,0x89,0x84,0x85,0x81,0x7C,0x7E,0x7A,0x77,0x79,0x77, + 0x76,0x79,0x79,0x77,0x78,0x78,0x7A,0x7C,0x7D,0x7D,0x7B,0x7B,0x82,0x82,0x7C,0x7F, + 0x7F,0x7E,0x85,0x83,0x7F,0x7E,0x7A,0x79,0x86,0x83,0x60,0x67,0x7E,0x86,0x75,0x77, + 0x92,0x70,0x70,0x86,0x82,0x81,0x88,0x95,0x80,0x80,0x90,0x8D,0x86,0x80,0x8C,0x8B, + 0x7E,0x76,0x7F,0x83,0x7F,0x82,0x84,0x7C,0x6E,0x72,0x71,0x72,0x74,0x7A,0x7B,0x77, + 0x82,0x80,0x81,0x86,0x89,0x87,0x82,0x89,0x86,0x82,0x86,0x7D,0x7F,0x81,0x7A,0x79, + 0x7A,0x78,0x74,0x74,0x72,0x6F,0x74,0x72,0x6D,0x70,0x71,0x6E,0x70,0x75,0x7A,0x87, + 0x8D,0x81,0x7F,0x85,0x8F,0x92,0x8C,0x91,0x8E,0x88,0x90,0x90,0x88,0x8B,0x89,0x81, + 0x85,0x84,0x81,0x82,0x81,0x7C,0x74,0x77,0x80,0x7B,0x77,0x80,0x81,0x7D,0x7F,0x82, + 0x83,0x7F,0x80,0x87,0x85,0x80,0x80,0x7E,0x89,0x90,0x87,0x87,0x85,0x7B,0x7F,0x87, + 0x83,0x80,0x7E,0x7B,0x80,0x85,0x83,0x81,0x83,0x82,0x7F,0x7D,0x7F,0x7E,0x7E,0x7F, + 0x7F,0x84,0x7D,0x80,0x87,0x7F,0x81,0x85,0x81,0x7D,0x81,0x7D,0x78,0x7F,0x79,0x78, + 0x7A,0x79,0x7C,0x79,0x7E,0x81,0x7C,0x84,0x84,0x88,0x8B,0x89,0x8A,0x87,0x84,0x88, + 0x8F,0x81,0x7E,0x8B,0x84,0x81,0x86,0x7F,0x81,0x83,0x7D,0x7C,0x79,0x76,0x78,0x7C, + 0x7A,0x77,0x76,0x77,0x7C,0x78,0x7B,0x82,0x88,0x88,0x83,0x85,0x86,0x84,0x82,0x86, + 0x86,0x84,0x7F,0x7E,0x8A,0x87,0x7B,0x7D,0x78,0x78,0x76,0x71,0x71,0x6E,0x73,0x75, + 0x7A,0x77,0x79,0x7F,0x7B,0x7E,0x81,0x85,0x85,0x85,0x87,0x86,0x86,0x8F,0x91,0x8C, + 0x8F,0x87,0x84,0x88,0x82,0x7D,0x81,0x83,0x7C,0x7E,0x7F,0x79,0x7B,0x79,0x7B,0x80, + 0x7E,0x7D,0x7D,0x83,0x81,0x83,0x88,0x84,0x8A,0x88,0x82,0x85,0x8A,0x8C,0x8B,0x87, + 0x83,0x80,0x82,0x85,0x7C,0x7C,0x7C,0x76,0x79,0x7C,0x80,0x7C,0x7C,0x79,0x75,0x7A, + 0x7B,0x7A,0x7E,0x7F,0x83,0x85,0x82,0x88,0x86,0x87,0x86,0x81,0x86,0x81,0x7E,0x80, + 0x83,0x89,0x8A,0x7F,0x7C,0x7B,0x75,0x78,0x7B,0x79,0x7C,0x7F,0x78,0x7C,0x81,0x80, + 0x81,0x82,0x81,0x86,0x87,0x88,0x88,0x83,0x83,0x80,0x7E,0x86,0x91,0x8B,0x89,0x85, + 0x7C,0x82,0x81,0x82,0x7F,0x73,0x71,0x76,0x7A,0x7F,0x82,0x79,0x77,0x7B,0x7B,0x7D, + 0x7F,0x7E,0x80,0x88,0x83,0x7F,0x82,0x80,0x7E,0x78,0x78,0x84,0x8D,0x90,0x8B,0x7E, + 0x7A,0x80,0x7D,0x76,0x75,0x6B,0x6D,0x7F,0x83,0x85,0x85,0x7E,0x7E,0x86,0x82,0x7F, + 0x7D,0x7B,0x7D,0x81,0x84,0x81,0x84,0x82,0x7F,0x7A,0x77,0x8A,0x9D,0x98,0x8E,0x80, + 0x75,0x7F,0x7D,0x7A,0x7B,0x76,0x78,0x86,0x8D,0x87,0x88,0x85,0x82,0x85,0x84,0x82, + 0x84,0x80,0x81,0x88,0x85,0x81,0x7E,0x7F,0x7E,0x78,0x75,0x82,0x8F,0x90,0x8D,0x7D, + 0x72,0x7E,0x7A,0x73,0x79,0x72,0x76,0x88,0x89,0x81,0x80,0x7F,0x82,0x8A,0x84,0x7D, + 0x79,0x7C,0x81,0x81,0x82,0x82,0x84,0x7D,0x7B,0x75,0x71,0x8B,0x8F,0x88,0x85,0x74, + 0x77,0x7C,0x76,0x73,0x71,0x75,0x7B,0x86,0x85,0x80,0x83,0x82,0x88,0x87,0x81,0x7E, + 0x81,0x86,0x82,0x84,0x83,0x83,0x88,0x82,0x7E,0x7C,0x7C,0x93,0x8E,0x80,0x87,0x78, + 0x7C,0x87,0x79,0x75,0x77,0x76,0x7B,0x7D,0x7C,0x73,0x75,0x82,0x84,0x81,0x7B,0x78, + 0x7D,0x7F,0x7A,0x7F,0x83,0x83,0x86,0x80,0x7D,0x74,0x78,0x94,0x90,0x81,0x85,0x7E, + 0x83,0x86,0x74,0x73,0x74,0x76,0x7E,0x7D,0x7A,0x78,0x80,0x8A,0x83,0x7C,0x7F,0x7E, + 0x82,0x83,0x7D,0x81,0x86,0x81,0x82,0x81,0x7A,0x78,0x8C,0x9A,0x88,0x87,0x88,0x84, + 0x8C,0x81,0x77,0x79,0x76,0x7C,0x7F,0x7C,0x7F,0x7E,0x89,0x8E,0x7F,0x82,0x81,0x7B, + 0x80,0x76,0x7A,0x87,0x82,0x84,0x82,0x7D,0x7B,0x82,0x97,0x8C,0x82,0x86,0x7D,0x84, + 0x81,0x70,0x78,0x7A,0x77,0x80,0x7A,0x7A,0x7F,0x82,0x87,0x85,0x81,0x83,0x82,0x81, + 0x7C,0x78,0x80,0x7F,0x7F,0x7D,0x79,0x77,0x7E,0x91,0x89,0x80,0x87,0x7D,0x85,0x88, + 0x70,0x76,0x78,0x78,0x83,0x79,0x78,0x81,0x82,0x86,0x87,0x80,0x83,0x86,0x84,0x7F, + 0x7C,0x84,0x82,0x81,0x7E,0x79,0x78,0x81,0x93,0x8D,0x84,0x86,0x7F,0x84,0x81,0x6F, + 0x7A,0x7C,0x73,0x7E,0x74,0x71,0x82,0x7F,0x80,0x84,0x7F,0x86,0x84,0x81,0x80,0x7B, + 0x80,0x80,0x7E,0x7D,0x7D,0x79,0x86,0x8D,0x81,0x87,0x88,0x7E,0x88,0x86,0x78,0x7F, + 0x78,0x77,0x7F,0x78,0x7A,0x7E,0x7C,0x83,0x81,0x7C,0x87,0x85,0x7E,0x84,0x84,0x81, + 0x7F,0x7D,0x80,0x7A,0x74,0x87,0x8B,0x84,0x89,0x84,0x80,0x8D,0x84,0x7A,0x85,0x79, + 0x7B,0x7E,0x71,0x7B,0x7D,0x7A,0x85,0x80,0x7D,0x8C,0x84,0x81,0x86,0x7F,0x7E,0x7E, + 0x7C,0x7F,0x7A,0x7B,0x8B,0x87,0x84,0x87,0x7F,0x85,0x8D,0x82,0x7F,0x83,0x78,0x7F, + 0x7A,0x71,0x7C,0x7D,0x7C,0x82,0x7D,0x80,0x89,0x83,0x87,0x85,0x83,0x86,0x7E,0x7D, + 0x7E,0x75,0x79,0x88,0x7F,0x81,0x89,0x83,0x8B,0x89,0x7F,0x80,0x7E,0x7A,0x7F,0x76, + 0x75,0x7D,0x77,0x7E,0x80,0x7D,0x86,0x85,0x82,0x85,0x81,0x83,0x81,0x79,0x7C,0x7B, + 0x78,0x82,0x87,0x82,0x87,0x86,0x85,0x8A,0x7F,0x7E,0x83,0x7B,0x7F,0x79,0x70,0x7B, + 0x76,0x75,0x7C,0x7C,0x80,0x85,0x84,0x86,0x89,0x85,0x86,0x80,0x7F,0x7C,0x78,0x83, + 0x84,0x80,0x88,0x85,0x82,0x8F,0x86,0x81,0x89,0x80,0x7F,0x80,0x76,0x7C,0x7E,0x7B, + 0x7F,0x7D,0x82,0x87,0x86,0x87,0x89,0x85,0x85,0x82,0x7B,0x7B,0x76,0x7F,0x86,0x7E, + 0x85,0x85,0x82,0x8A,0x81,0x7F,0x85,0x7B,0x7B,0x80,0x76,0x7D,0x7F,0x7A,0x7F,0x7E, + 0x7F,0x83,0x81,0x87,0x88,0x86,0x88,0x82,0x7D,0x80,0x7A,0x7D,0x83,0x7F,0x82,0x82, + 0x82,0x86,0x82,0x80,0x85,0x7F,0x7D,0x7F,0x77,0x7A,0x7E,0x7B,0x7E,0x7E,0x80,0x85, + 0x81,0x84,0x89,0x83,0x86,0x85,0x81,0x82,0x7E,0x84,0x85,0x80,0x86,0x83,0x7D,0x85, + 0x81,0x7F,0x82,0x7B,0x7E,0x7E,0x78,0x7D,0x7B,0x7A,0x7B,0x78,0x84,0x87,0x8E,0x90, + 0x90,0x91,0x81,0x80,0x78,0x77,0x78,0x7B,0x83,0x70,0x7E,0x72,0x63,0x8D,0x85,0x72, + 0x8C,0x83,0x7A,0x6C,0x62,0x7B,0x73,0x73,0x79,0x71,0x7F,0x7D,0x78,0x80,0x7E,0x84, + 0x8C,0x84,0x7B,0x73,0x7C,0x88,0x7E,0x7E,0x80,0x77,0x81,0x88,0x82,0x83,0x84,0x93, + 0x91,0x84,0x8F,0x84,0x7C,0x90,0x94,0x92,0xA0,0xA2,0x99,0x9B,0xA3,0xA2,0x8E,0x87, + 0x90,0x90,0x96,0x9D,0x91,0x8C,0x8C,0x86,0x84,0x75,0x72,0x7C,0x7B,0x78,0x6F,0x69, + 0x6D,0x68,0x64,0x69,0x69,0x68,0x68,0x65,0x66,0x65,0x63,0x68,0x6A,0x6C,0x6A,0x68, + 0x6F,0x6F,0x6F,0x6A,0x62,0x68,0x6C,0x6B,0x69,0x62,0x67,0x69,0x66,0x6C,0x6C,0x70, + 0x76,0x75,0x77,0x7B,0x80,0x8A,0x97,0xA8,0xB2,0xAA,0x9F,0x9C,0x9B,0x9C,0x9A,0x99, + 0x98,0x94,0x8F,0x8C,0x8D,0x8F,0x8C,0x87,0x85,0x87,0x8C,0x8A,0x83,0x84,0x85,0x83, + 0x82,0x82,0x87,0x8C,0x89,0x86,0x85,0x83,0x84,0x8A,0x8C,0x87,0x8A,0x88,0x86,0x87, + 0x82,0x7F,0x84,0x7F,0x7A,0x7F,0x79,0x79,0x7C,0x7B,0x7D,0x82,0x86,0x8B,0x8C,0x8C, + 0x8E,0x90,0x90,0x91,0x92,0x8E,0x95,0x92,0x94,0x96,0x90,0x90,0x8F,0x8D,0x8A,0x8B, + 0x88,0x83,0x7C,0x71,0x73,0x70,0x65,0x67,0x69,0x69,0x6C,0x65,0x67,0x6B,0x63,0x5F, + 0x60,0x55,0x56,0x6A,0x62,0x5D,0x63,0x61,0x68,0x61,0x55,0x62,0x66,0x5F,0x5B,0x55, + 0x62,0x67,0x5B,0x5F,0x67,0x67,0x65,0x62,0x6B,0x6F,0x65,0x6A,0x69,0x6F,0x6D,0x81, + 0x9C,0x91,0x9D,0xA7,0xAB,0xAA,0x8F,0x98,0xA9,0x98,0x9C,0xA1,0xA4,0xAD,0x96,0x8E, + 0x98,0x8F,0x89,0x88,0x92,0x9A,0x92,0x8D,0x88,0x7B,0x83,0xA0,0x98,0x8E,0xA0,0x98, + 0x92,0x7E,0x75,0x8F,0x88,0x84,0x91,0x95,0x9E,0x8F,0x7D,0x8E,0x8B,0x7E,0x82,0x86, + 0x92,0x86,0x7F,0x84,0x80,0x86,0x7B,0x8F,0xAD,0x94,0x91,0x9C,0x92,0x92,0x84,0x8B, + 0xA4,0x94,0x91,0x9B,0x99,0x98,0x86,0x83,0x94,0x8B,0x8A,0x93,0x90,0x8C,0x7E,0x74, + 0x76,0x6A,0x6F,0x8C,0x7E,0x7A,0x80,0x6F,0x6A,0x58,0x5A,0x6E,0x62,0x5E,0x69,0x66, + 0x60,0x50,0x50,0x5C,0x57,0x5B,0x65,0x6C,0x68,0x5C,0x59,0x5A,0x5C,0x62,0x59,0x73, + 0x7C,0x5D,0x67,0x66,0x5C,0x5F,0x5B,0x70,0x7C,0x6C,0x77,0x7E,0x75,0x7C,0x7D,0x90, + 0x9C,0x9B,0xAA,0xAF,0xA5,0xA0,0x97,0x9A,0x9C,0x8E,0xAA,0xB0,0x96,0xA1,0x99,0x8E, + 0x88,0x7C,0x93,0x97,0x84,0x93,0x93,0x89,0x82,0x7C,0x8C,0x8B,0x87,0x90,0x93,0x8E, + 0x84,0x80,0x84,0x80,0x8A,0x84,0x89,0xA1,0x84,0x80,0x8B,0x7A,0x7B,0x78,0x80,0x93, + 0x85,0x84,0x94,0x8A,0x84,0x87,0x8C,0x93,0x8F,0x97,0x9E,0x92,0x8F,0x8C,0x88,0x8F, + 0x83,0x93,0xA9,0x90,0x93,0x97,0x87,0x81,0x78,0x86,0x91,0x7B,0x83,0x8B,0x77,0x71, + 0x6D,0x71,0x75,0x6D,0x73,0x7A,0x6F,0x68,0x62,0x5E,0x58,0x5D,0x5B,0x5F,0x79,0x62, + 0x5D,0x69,0x58,0x55,0x54,0x5A,0x6B,0x62,0x61,0x71,0x63,0x5A,0x5C,0x5C,0x5E,0x5D, + 0x65,0x70,0x69,0x66,0x66,0x64,0x67,0x62,0x82,0x92,0x7E,0x94,0x9F,0x8E,0x8E,0x8E, + 0x9E,0xA6,0x9A,0xAC,0xAE,0x9B,0x99,0x97,0x94,0x90,0x8C,0x9B,0x9D,0x92,0x91,0x8C, + 0x85,0x7E,0x84,0x81,0x92,0x9F,0x89,0x95,0x92,0x7E,0x7E,0x7C,0x85,0x8B,0x85,0x92, + 0x93,0x85,0x88,0x84,0x82,0x83,0x83,0x8B,0x8A,0x84,0x8B,0x81,0x7D,0x7B,0x84,0xA3, + 0x89,0x8D,0xA8,0x90,0x84,0x87,0x89,0x8C,0x86,0x8D,0x9F,0x90,0x8B,0x93,0x8A,0x87, + 0x86,0x8C,0x96,0x8D,0x8D,0x91,0x84,0x7D,0x7E,0x7A,0x77,0x8D,0x87,0x79,0x89,0x78, + 0x6A,0x6C,0x66,0x6C,0x68,0x64,0x74,0x6B,0x5E,0x67,0x61,0x5C,0x5C,0x60,0x67,0x62, + 0x66,0x6B,0x5D,0x5C,0x59,0x5F,0x77,0x5F,0x64,0x7A,0x63,0x5C,0x65,0x63,0x62,0x62, + 0x6B,0x78,0x6D,0x71,0x7E,0x74,0x75,0x80,0x85,0x8A,0x90,0x98,0x9B,0x95,0x95,0x9A, + 0x93,0x96,0xB0,0xA1,0x9A,0xAE,0x97,0x8D,0x8C,0x86,0x8C,0x84,0x85,0x97,0x8B,0x81, + 0x8D,0x84,0x7F,0x81,0x84,0x88,0x84,0x86,0x89,0x7C,0x7C,0x7C,0x7A,0x97,0x88,0x82, + 0x9C,0x86,0x79,0x83,0x7D,0x7D,0x7D,0x80,0x90,0x89,0x82,0x90,0x89,0x80,0x89,0x8B, + 0x8B,0x8F,0x93,0x94,0x8D,0x88,0x8D,0x87,0x86,0xA3,0x96,0x8D,0xA4,0x8F,0x83,0x88, + 0x84,0x85,0x80,0x83,0x91,0x85,0x7D,0x88,0x7E,0x73,0x78,0x78,0x75,0x73,0x71,0x74, + 0x6B,0x61,0x66,0x5D,0x70,0x75,0x60,0x76,0x73,0x59,0x62,0x63,0x5D,0x5F,0x5D,0x6D, + 0x6D,0x5F,0x69,0x6A,0x5D,0x60,0x65,0x63,0x65,0x6A,0x6E,0x6A,0x67,0x6A,0x68,0x67, + 0x84,0x85,0x76,0x92,0x8E,0x7D,0x88,0x8B,0x8C,0x8D,0x91,0xA0,0x9E,0x96,0xA0,0x9C, + 0x93,0x95,0x95,0x92,0x92,0x94,0x93,0x8E,0x86,0x8A,0x7F,0x85,0x9B,0x86,0x89,0x98, + 0x82,0x7E,0x82,0x7D,0x80,0x7D,0x84,0x8D,0x82,0x82,0x88,0x7E,0x7B,0x80,0x7E,0x80, + 0x84,0x87,0x86,0x81,0x80,0x83,0x7C,0x8B,0x9B,0x87,0x92,0x9D,0x88,0x87,0x8C,0x88, + 0x8A,0x89,0x91,0x97,0x8D,0x92,0x94,0x8A,0x8A,0x8D,0x8C,0x8C,0x8E,0x8E,0x8C,0x85, + 0x83,0x7F,0x79,0x91,0x8F,0x7D,0x90,0x89,0x75,0x79,0x71,0x6E,0x70,0x6D,0x75,0x72, + 0x69,0x6F,0x6D,0x62,0x67,0x69,0x65,0x6A,0x6A,0x68,0x66,0x63,0x64,0x5D,0x5D,0x73, + 0x6A,0x63,0x78,0x69,0x5D,0x68,0x64,0x65,0x66,0x6A,0x78,0x72,0x6F,0x79,0x76,0x78, + 0x7B,0x89,0x91,0x8B,0x9D,0x88,0x82,0x95,0x8A,0x7A,0x8D,0xAA,0x9C,0xAB,0xB6,0x9E, + 0x94,0x9D,0xA4,0xA4,0x9F,0xA0,0xB1,0xA1,0x90,0x92,0x73,0x72,0x80,0x65,0x61,0x70, + 0x6B,0x5B,0x54,0x4D,0x51,0x5E,0x74,0x7C,0x5D,0x76,0x86,0x6C,0x74,0x82,0x8D,0x9B, + 0x95,0x94,0xB2,0xAE,0xC0,0xC1,0x97,0xC4,0xB8,0xA8,0xBD,0xA6,0xB9,0xB9,0x9A,0x94, + 0x8E,0x8E,0xA8,0x8A,0x7D,0x91,0x79,0x75,0x70,0x78,0x88,0x74,0x71,0x76,0x6F,0x74, + 0x67,0x4E,0x50,0x55,0x58,0x58,0x53,0x4D,0x4C,0x50,0x51,0x52,0x5D,0x6A,0x85,0x83, + 0x81,0x8A,0x73,0x6F,0x74,0x7D,0x91,0x99,0x9C,0x9C,0x8E,0x91,0x94,0x92,0x87,0x80, + 0x83,0x7E,0x80,0x70,0x73,0x6F,0x5C,0x64,0x60,0x7F,0x8B,0x65,0x68,0x65,0x4F,0x59, + 0x61,0x57,0x61,0x6B,0x6F,0x7E,0x79,0x8F,0x9C,0x8F,0x9B,0xA0,0x98,0xA1,0xA5,0x9B, + 0x95,0x84,0x80,0x82,0x84,0x98,0x9D,0x98,0xB1,0xB2,0xA9,0xB5,0xA1,0xA0,0xA2,0x89, + 0x9C,0x96,0x71,0x88,0x85,0x76,0x8A,0x80,0x74,0x71,0x6B,0x75,0x85,0x7E,0x7A,0x6B, + 0x6C,0x8B,0x73,0x66,0x6D,0x67,0x69,0x60,0x5C,0x5B,0x58,0x67,0x6F,0x71,0x6A,0x6F, + 0x82,0x85,0x81,0x8C,0x86,0x87,0x92,0x8E,0x9E,0x9D,0xA3,0xA5,0xAB,0xBA,0xAE,0xB7, + 0xBB,0xAC,0xB8,0xB4,0xB2,0xB5,0xA2,0x9F,0x9E,0x97,0x97,0x8D,0x81,0x6F,0x61,0x59, + 0x60,0x68,0x4F,0x57,0x64,0x5C,0x4D,0x32,0x31,0x36,0x38,0x4B,0x4C,0x36,0x2C,0x35, + 0x40,0x3D,0x3E,0x4B,0x4D,0x47,0x46,0x52,0x5C,0x66,0x6B,0x73,0x91,0x9A,0x96,0x8C, + 0x84,0x97,0x9F,0xAF,0xCD,0xC0,0xCB,0xDC,0xC2,0xB1,0xB2,0xB6,0xBE,0xCB,0xC7,0xBE, + 0xC0,0xBF,0xC3,0xC5,0xC1,0xC2,0xB5,0xB0,0xB0,0x9C,0x8B,0x76,0x65,0x6F,0x7D,0x84, + 0x78,0x5A,0x5D,0x65,0x5D,0x57,0x53,0x58,0x5C,0x63,0x52,0x51,0x44,0x3D,0x4D,0x49, + 0x58,0x57,0x53,0x60,0x6D,0x68,0x5A,0x5B,0x64,0x65,0x79,0x8D,0x78,0x83,0x8C,0x7F, + 0x8D,0x88,0x90,0x9F,0xA3,0xA8,0xAA,0xA6,0xA8,0xA9,0xA9,0xB6,0xB1,0xB2,0xB1,0xB6, + 0xB4,0xAB,0xA9,0x9C,0x9B,0x98,0x9B,0x9C,0x8C,0x87,0x87,0x7C,0x73,0x78,0x78,0x7B, + 0x7B,0x69,0x67,0x63,0x63,0x5D,0x53,0x5D,0x64,0x66,0x66,0x5C,0x59,0x5B,0x57,0x59, + 0x5B,0x55,0x60,0x5F,0x59,0x67,0x71,0x71,0x62,0x5C,0x68,0x72,0x76,0x6C,0x68,0x73, + 0x78,0x76,0x77,0x82,0x82,0x76,0x7B,0x79,0x81,0x86,0x82,0x88,0x7B,0x8B,0xA2,0x95, + 0x97,0x9D,0x95,0x91,0x89,0x91,0x9B,0xA3,0xAA,0xA1,0x9F,0xAB,0xAB,0x9B,0x9A,0x97, + 0x94,0xA4,0xA3,0xA1,0x9E,0x8F,0x94,0x97,0x98,0xA3,0x98,0x8B,0x97,0x9B,0x91,0x8E, + 0x92,0x94,0x9D,0x91,0x82,0x80,0x73,0x73,0x68,0x64,0x76,0x77,0x74,0x7C,0x7E,0x74, + 0x74,0x6A,0x66,0x6F,0x6F,0x78,0x6F,0x6A,0x6C,0x64,0x60,0x55,0x55,0x63,0x6A,0x6A, + 0x64,0x6B,0x71,0x69,0x70,0x73,0x78,0x80,0x7F,0x87,0x83,0x7A,0x72,0x67,0x6C,0x72, + 0x84,0x8E,0x7B,0x79,0x7B,0x71,0x70,0x60,0x6A,0x7B,0x6C,0x6D,0x67,0x6C,0x83,0x79, + 0x6F,0x7B,0x81,0x8A,0x97,0x8B,0x86,0x94,0x8C,0x98,0xA5,0x9F,0xAE,0xAD,0xA2,0xB3, + 0xB4,0xAD,0xA3,0x91,0x9C,0xA5,0x98,0x91,0x8D,0x8F,0x91,0x8F,0x88,0x88,0x89,0x7D, + 0x77,0x74,0x6F,0x70,0x70,0x63,0x58,0x67,0x6F,0x60,0x6D,0x76,0x6E,0x65,0x54,0x66, + 0x71,0x72,0x64,0x4B,0x4E,0x5B,0x6F,0x71,0x6C,0x78,0x7A,0x7B,0x84,0x83,0x85,0x8C, + 0x8D,0x92,0x97,0xAA,0xB3,0xAB,0x9D,0x9B,0xAB,0xA7,0x9D,0xA2,0xA8,0xA3,0x96,0x90, + 0x91,0x98,0xA0,0x97,0x89,0x98,0x9A,0x92,0x8F,0x8A,0x93,0x97,0x8F,0x8A,0x92,0x91, + 0x8B,0x87,0x7D,0x7B,0x76,0x6B,0x6E,0x7A,0x85,0x7E,0x72,0x6B,0x63,0x69,0x6F,0x61, + 0x58,0x5C,0x5E,0x5E,0x54,0x4B,0x4D,0x56,0x55,0x5A,0x67,0x71,0x76,0x6E,0x6B,0x63, + 0x62,0x6F,0x6E,0x74,0x73,0x70,0x76,0x7A,0x85,0x89,0x85,0x7F,0x86,0x8C,0x88,0x8B, + 0x7A,0x6B,0x76,0x79,0x80,0x93,0x94,0x8E,0x86,0x7D,0x81,0x7D,0x73,0x74,0x76,0x74, + 0x74,0x73,0x6A,0x64,0x6E,0x78,0x7B,0x7C,0x81,0x82,0x78,0x6F,0x6E,0x71,0x7A,0x84, + 0x8E,0x9A,0x9D,0x95,0x90,0x95,0x94,0x96,0x94,0x96,0xA0,0x9B,0x91,0x90,0x88,0x8E, + 0xA1,0xA2,0xA5,0xA3,0xA4,0xAE,0xA9,0xA7,0xA3,0x9F,0x9B,0x9C,0xAB,0xAB,0xA9,0xA9, + 0x98,0x92,0x98,0x99,0x98,0x91,0x89,0x84,0x7D,0x79,0x72,0x6E,0x70,0x72,0x78,0x7C, + 0x79,0x74,0x73,0x70,0x6D,0x65,0x5A,0x61,0x71,0x70,0x65,0x64,0x56,0x4C,0x51,0x56, + 0x60,0x63,0x5F,0x58,0x5B,0x5C,0x5C,0x60,0x55,0x58,0x63,0x66,0x6D,0x6E,0x67,0x6A, + 0x6E,0x74,0x7A,0x7A,0x7F,0x7B,0x78,0x78,0x72,0x6F,0x69,0x68,0x72,0x7A,0x73,0x77, + 0x76,0x74,0x83,0x83,0x78,0x71,0x75,0x77,0x7B,0x7E,0x7D,0x83,0x82,0x89,0x84,0x77, + 0x7D,0x7A,0x7D,0x82,0x7E,0x83,0x81,0x7F,0x8C,0x94,0x94,0x92,0x8F,0x92,0x9E,0x9D, + 0x93,0x97,0x96,0x9C,0xAA,0xA2,0x9E,0xA1,0xA6,0xAD,0xA9,0xA1,0xA2,0xA8,0xA5,0xAA, + 0xA2,0x99,0xA4,0xA1,0x9F,0xA0,0x9D,0x97,0x97,0x95,0x97,0x9D,0x94,0x94,0x94,0x8C, + 0x93,0x92,0x8A,0x8D,0x8E,0x8A,0x86,0x81,0x81,0x85,0x84,0x81,0x7F,0x7D,0x81,0x82, + 0x72,0x6F,0x71,0x68,0x6B,0x6C,0x6B,0x67,0x63,0x6B,0x62,0x65,0x6D,0x65,0x65,0x5F, + 0x60,0x5F,0x58,0x5A,0x52,0x5C,0x63,0x5C,0x5F,0x60,0x64,0x67,0x69,0x65,0x65,0x6B, + 0x6B,0x6E,0x6B,0x65,0x66,0x6E,0x6D,0x6F,0x6E,0x69,0x6F,0x75,0x79,0x7A,0x73,0x70, + 0x75,0x75,0x79,0x77,0x6E,0x72,0x79,0x7D,0x83,0x83,0x83,0x87,0x89,0x86,0x85,0x88, + 0x85,0x85,0x8A,0x87,0x87,0x86,0x85,0x8C,0x8D,0x8E,0x93,0x8E,0x8F,0x98,0x99,0x9A, + 0x9B,0x9C,0x9E,0xA2,0xA8,0xA3,0xA0,0xA0,0xA5,0xAB,0xA7,0xA3,0xA2,0x9E,0x9E,0xA3, + 0x9E,0x99,0x97,0x94,0x99,0x9C,0x97,0x9A,0x99,0x9B,0x9C,0x96,0x9C,0x98,0x98,0x9F, + 0x9B,0x98,0x97,0x93,0x92,0x91,0x89,0x88,0x85,0x80,0x82,0x7E,0x7B,0x79,0x74,0x77, + 0x74,0x72,0x76,0x72,0x74,0x70,0x6C,0x73,0x6B,0x6B,0x76,0x73,0x75,0x7A,0x73,0x74, + 0x79,0x73,0x74,0x72,0x6C,0x70,0x6A,0x62,0x63,0x60,0x67,0x68,0x60,0x5F,0x62,0x65, + 0x63,0x60,0x5D,0x5C,0x66,0x69,0x64,0x6D,0x65,0x5D,0x69,0x67,0x67,0x72,0x66,0x5F, + 0x6B,0x69,0x6B,0x6D,0x64,0x66,0x6C,0x70,0x6F,0x68,0x68,0x6C,0x72,0x77,0x77,0x76, + 0x7A,0x80,0x84,0x7E,0x7C,0x82,0x85,0x8F,0x94,0x8E,0x8F,0x8F,0x8A,0x92,0x92,0x8C, + 0x8E,0x8C,0x8A,0x90,0x8C,0x86,0x8A,0x8C,0x94,0x9A,0x97,0x98,0x9A,0x99,0x9F,0xA1, + 0xA0,0x9B,0x9D,0xA7,0xA3,0xA1,0x9D,0x94,0x99,0x9C,0x9C,0x9E,0x99,0x95,0x95,0x94, + 0x91,0x8B,0x89,0x89,0x8E,0x8F,0x89,0x89,0x87,0x87,0x8C,0x89,0x8D,0x8E,0x8C,0x8C, + 0x88,0x8D,0x8B,0x87,0x8D,0x8D,0x8C,0x8F,0x86,0x82,0x85,0x7F,0x7D,0x7D,0x79,0x7A, + 0x7A,0x75,0x75,0x76,0x77,0x77,0x77,0x78,0x7D,0x80,0x7E,0x80,0x7F,0x79,0x77,0x7C, + 0x7C,0x75,0x77,0x77,0x73,0x78,0x76,0x72,0x71,0x6E,0x74,0x74,0x6F,0x6C,0x6B,0x6E, + 0x73,0x77,0x73,0x6F,0x71,0x75,0x7A,0x7A,0x76,0x78,0x7A,0x7C,0x7C,0x79,0x7B,0x78, + 0x77,0x7D,0x79,0x78,0x7A,0x76,0x76,0x78,0x74,0x72,0x6E,0x6B,0x71,0x74,0x71,0x71, + 0x74,0x78,0x80,0x82,0x7D,0x7C,0x7C,0x82,0x87,0x83,0x7E,0x7C,0x81,0x84,0x82,0x7F, + 0x7F,0x7F,0x80,0x82,0x80,0x7F,0x7E,0x7E,0x80,0x7E,0x79,0x79,0x76,0x79,0x82,0x7D, + 0x7D,0x81,0x7D,0x80,0x85,0x86,0x88,0x85,0x83,0x80,0x82,0x85,0x80,0x85,0x85,0x85, + 0x8A,0x88,0x89,0x85,0x82,0x7F,0x7E,0x83,0x7D,0x81,0x85,0x7F,0x84,0x86,0x86,0x89, + 0x88,0x89,0x89,0x87,0x8A,0x8A,0x84,0x81,0x7B,0x81,0x91,0x89,0x82,0x85,0x81,0x89, + 0x8C,0x7D,0x7F,0x81,0x7E,0x85,0x7E,0x77,0x7D,0x7D,0x84,0x88,0x80,0x82,0x87,0x86, + 0x83,0x82,0x80,0x7F,0x81,0x80,0x7F,0x75,0x7E,0x92,0x89,0x88,0x86,0x7B,0x85,0x82, + 0x6F,0x76,0x77,0x76,0x81,0x77,0x75,0x86,0x87,0x87,0x83,0x7C,0x85,0x88,0x7D,0x7B, + 0x7E,0x81,0x85,0x81,0x7C,0x75,0x7A,0x91,0x92,0x88,0x88,0x83,0x85,0x89,0x76,0x70, + 0x79,0x7C,0x85,0x84,0x7B,0x82,0x8B,0x86,0x81,0x7C,0x7D,0x84,0x80,0x7C,0x88,0x8B, + 0x84,0x80,0x80,0x7E,0x74,0x83,0x95,0x8B,0x89,0x8A,0x82,0x87,0x7C,0x6B,0x78,0x7D, + 0x7B,0x81,0x7C,0x7D,0x88,0x82,0x78,0x77,0x76,0x79,0x7C,0x74,0x79,0x82,0x7C,0x79, + 0x76,0x72,0x6D,0x78,0x8F,0x8B,0x83,0x83,0x81,0x87,0x7D,0x6C,0x73,0x7D,0x7E,0x80, + 0x7C,0x7F,0x8C,0x8B,0x7E,0x7E,0x84,0x82,0x80,0x7B,0x7D,0x87,0x82,0x7C,0x7C,0x7B, + 0x75,0x70,0x86,0x8F,0x85,0x88,0x84,0x82,0x81,0x6F,0x6C,0x78,0x78,0x78,0x7B,0x79, + 0x85,0x8E,0x80,0x7C,0x80,0x7E,0x7B,0x79,0x79,0x82,0x82,0x7E,0x7F,0x7C,0x77,0x72, + 0x85,0x93,0x87,0x87,0x88,0x87,0x87,0x75,0x6B,0x78,0x7C,0x79,0x7C,0x7E,0x86,0x8E, + 0x82,0x7C,0x81,0x80,0x7D,0x79,0x78,0x85,0x86,0x7E,0x80,0x81,0x7E,0x76,0x80,0x97, + 0x8F,0x88,0x8B,0x87,0x8A,0x7E,0x6E,0x7A,0x81,0x7B,0x7C,0x7C,0x81,0x8C,0x84,0x7B, + 0x81,0x83,0x81,0x7B,0x77,0x80,0x85,0x7F,0x7F,0x83,0x83,0x78,0x7E,0x9A,0x92,0x88, + 0x8C,0x88,0x8F,0x86,0x71,0x7A,0x85,0x7E,0x7F,0x7E,0x80,0x8D,0x86,0x7D,0x84,0x88, + 0x85,0x7D,0x7A,0x82,0x85,0x7C,0x7C,0x81,0x80,0x78,0x75,0x8F,0x94,0x83,0x87,0x86, + 0x8B,0x89,0x74,0x76,0x81,0x7A,0x76,0x78,0x7B,0x88,0x86,0x79,0x80,0x89,0x88,0x82, + 0x7B,0x81,0x86,0x7A,0x7B,0x86,0x82,0x7D,0x74,0x83,0x94,0x81,0x82,0x87,0x87,0x8A, + 0x7A,0x74,0x81,0x7F,0x77,0x79,0x7B,0x81,0x85,0x7C,0x7F,0x87,0x85,0x84,0x80,0x84, + 0x89,0x7F,0x7E,0x83,0x84,0x85,0x7E,0x80,0x8E,0x87,0x81,0x87,0x84,0x85,0x82,0x7B, + 0x80,0x83,0x7D,0x7D,0x7E,0x7C,0x81,0x7E,0x79,0x7E,0x7F,0x7F,0x81,0x7D,0x81,0x83, + 0x7D,0x81,0x82,0x81,0x82,0x81,0x87,0x85,0x81,0x84,0x84,0x83,0x84,0x81,0x81,0x85, + 0x83,0x7F,0x80,0x7E,0x7F,0x81,0x7D,0x7E,0x7F,0x7C,0x7B,0x7E,0x7E,0x7E,0x7D,0x7D, + 0x80,0x80,0x7F,0x7D,0x7F,0x82,0x81,0x7E,0x80,0x81,0x7F,0x7F,0x7F,0x80,0x81,0x7F, + 0x80,0x80,0x7F,0x7F,0x7E,0x7C,0x7D,0x80,0x7F,0x7E,0x7F,0x81,0x82,0x81,0x80,0x81, + 0x82,0x81,0x80,0x82,0x82,0x81,0x80,0x82,0x82,0x81,0x82,0x80,0x80,0x82,0x81,0x80, + 0x7E,0x7C,0x7C,0x7D,0x7A,0x7B,0x7B,0x7B,0x7E,0x7D,0x7D,0x7D,0x7D,0x7F,0x7F,0x7E, + 0x80,0x7F,0x80,0x82,0x80,0x7E,0x80,0x80,0x81,0x82,0x81,0x81,0x81,0x7F,0x7E,0x7E, + 0x7D,0x7F,0x7E,0x7C,0x7D,0x7E,0x7B,0x7D,0x7D,0x7E,0x81,0x7F,0x80,0x80,0x80,0x83, + 0x82,0x81,0x84,0x84,0x82,0x85,0x83,0x82,0x83,0x80,0x81,0x83,0x80,0x81,0x81,0x7E, + 0x80,0x7F,0x7B,0x7C,0x7B,0x7C,0x7D,0x7A,0x7C,0x7F,0x7F,0x7E,0x7E,0x7D,0x81,0x83, + 0x80,0x81,0x80,0x80,0x81,0x80,0x80,0x81,0x81,0x83,0x8D,0x8C,0x8F,0x8F,0x7C,0x77, + 0x70,0x70,0x78,0x7F,0x75,0x76,0x64,0x61,0x8A,0x75,0x6F,0x7E,0x77,0x6E,0x6C,0x82, + 0x82,0x85,0x82,0x77,0x7B,0x80,0x85,0x83,0x89,0x93,0x94,0x90,0x8E,0x90,0x86,0x82, + 0x81,0x7B,0x84,0x8F,0x89,0x8C,0xA4,0x99,0x8D,0x93,0x7C,0x7D,0x96,0x8E,0x8F,0x8E, + 0x87,0x8F,0x90,0x88,0x7A,0x81,0x89,0x84,0x88,0x83,0x7F,0x7B,0x79,0x73,0x6C,0x72, + 0x74,0x75,0x74,0x6D,0x6D,0x6A,0x68,0x71,0x6B,0x65,0x67,0x62,0x64,0x6C,0x70,0x75, + 0x74,0x6B,0x6E,0x76,0x70,0x67,0x6B,0x72,0x7A,0x6C,0x61,0x6B,0x68,0x63,0x69,0x67, + 0x65,0x6E,0x6D,0x70,0x81,0x85,0x97,0xB7,0xAF,0x9B,0x96,0x8E,0x91,0x8B,0x8A,0x95, + 0x8B,0x85,0x8B,0x8F,0x8D,0x83,0x7B,0x90,0x92,0x7C,0x85,0x8B,0x87,0x86,0x84,0x8C, + 0x98,0x8F,0x89,0x8E,0x8F,0x98,0x98,0x92,0x9F,0x9C,0x94,0x93,0x8D,0xA0,0x9D,0x8A, + 0x98,0x97,0x92,0x95,0x86,0x97,0xA8,0x88,0x8A,0x95,0x86,0x89,0x84,0x8B,0x99,0x80, + 0x7E,0x97,0x92,0x8B,0x86,0x86,0x84,0x74,0x71,0x76,0x89,0x80,0x72,0x83,0x82,0x7A, + 0x6C,0x65,0x72,0x67,0x4E,0x57,0x61,0x5F,0x5E,0x59,0x6B,0x73,0x5D,0x64,0x6C,0x5F, + 0x5A,0x5A,0x61,0x67,0x5E,0x60,0x79,0x74,0x5A,0x66,0x6D,0x6A,0x61,0x57,0x6D,0x64, + 0x55,0x69,0x74,0x7B,0x7B,0x86,0xA3,0xA9,0x97,0x9C,0x9E,0x8D,0x89,0x89,0x8D,0x86, + 0x7A,0x87,0x9D,0x8E,0x83,0x91,0x8E,0x85,0x79,0x80,0x91,0x7B,0x7A,0x94,0x94,0x91, + 0x8E,0x97,0xA0,0x91,0x95,0xA5,0x9D,0x95,0x98,0xA0,0x98,0x8A,0x89,0x9D,0xA9,0x92, + 0x9B,0xA6,0x99,0x8D,0x88,0x98,0x8E,0x7B,0x91,0x9C,0x8D,0x8B,0x94,0x9A,0x8C,0x7E, + 0x8C,0x8D,0x81,0x83,0x8B,0x84,0x7D,0x79,0x7B,0x8F,0x7D,0x71,0x88,0x7F,0x70,0x69, + 0x6C,0x71,0x64,0x61,0x72,0x6D,0x64,0x6E,0x6F,0x6C,0x62,0x61,0x68,0x59,0x5D,0x66, + 0x67,0x65,0x68,0x62,0x68,0x77,0x61,0x6B,0x74,0x5B,0x5B,0x5C,0x5E,0x5C,0x54,0x64, + 0x73,0x6E,0x75,0x87,0x8C,0x8B,0x8D,0xA1,0x9E,0x8F,0x99,0x99,0x8F,0x8C,0x89,0x84, + 0x96,0x92,0x80,0x92,0x8A,0x75,0x7A,0x7B,0x7A,0x79,0x7C,0x8F,0x93,0x8A,0x94,0x96, + 0x91,0x8A,0x8C,0x9B,0x8F,0x96,0xA2,0x99,0x97,0x97,0x90,0x93,0xA9,0x9C,0x99,0xAA, + 0x96,0x8C,0x92,0x91,0x90,0x88,0x94,0xA0,0x94,0x95,0x9B,0x94,0x8E,0x8A,0x8A,0x8A, + 0x83,0x8C,0x90,0x85,0x82,0x80,0x76,0x87,0x90,0x7B,0x8B,0x8F,0x74,0x71,0x6F,0x67, + 0x68,0x61,0x6B,0x72,0x64,0x6E,0x6E,0x64,0x66,0x62,0x65,0x60,0x5A,0x63,0x63,0x5F, + 0x60,0x62,0x59,0x6D,0x70,0x5A,0x72,0x6A,0x53,0x5C,0x57,0x56,0x55,0x56,0x68,0x6A, + 0x66,0x75,0x7A,0x78,0x7F,0x89,0x90,0x93,0x9A,0xA2,0xA0,0x90,0x94,0x8C,0x83,0x9C, + 0x88,0x85,0x9A,0x82,0x79,0x7D,0x79,0x7F,0x78,0x7F,0x93,0x84,0x88,0x9D,0x8C,0x88, + 0x91,0x91,0x8F,0x93,0x9C,0x99,0x96,0x98,0x97,0x8D,0x9E,0xAC,0x93,0xA4,0xAB,0x94, + 0x98,0x92,0x8D,0x91,0x89,0x96,0xA0,0x8F,0x9C,0x9E,0x8E,0x91,0x8D,0x8B,0x87,0x86, + 0x8E,0x88,0x7D,0x85,0x7E,0x77,0x94,0x84,0x7B,0x97,0x7F,0x6F,0x7A,0x71,0x6C,0x66, + 0x68,0x78,0x68,0x65,0x79,0x67,0x5E,0x67,0x61,0x5F,0x5C,0x62,0x63,0x5C,0x5E,0x5F, + 0x53,0x65,0x72,0x57,0x6B,0x73,0x59,0x5A,0x5C,0x57,0x53,0x51,0x63,0x68,0x5E,0x6F, + 0x78,0x6E,0x78,0x7E,0x83,0x89,0x8E,0x9F,0x9B,0x91,0x99,0x8E,0x86,0xA5,0x90,0x84, + 0xA3,0x8B,0x78,0x85,0x7F,0x7B,0x78,0x79,0x87,0x80,0x7F,0x91,0x88,0x83,0x93,0x8B, + 0x8A,0x90,0x90,0x96,0x8E,0x8E,0x95,0x85,0x94,0xAA,0x90,0x9C,0xAF,0x95,0x96,0x9A, + 0x8E,0x91,0x8C,0x93,0x9B,0x8F,0x98,0x9B,0x8C,0x90,0x92,0x89,0x89,0x8C,0x8C,0x87, + 0x82,0x84,0x81,0x77,0x93,0x8E,0x79,0x97,0x89,0x70,0x7B,0x75,0x70,0x6C,0x66,0x71, + 0x72,0x6A,0x74,0x72,0x63,0x68,0x67,0x5E,0x5F,0x64,0x65,0x5E,0x5C,0x63,0x56,0x61, + 0x7E,0x61,0x64,0x7A,0x5B,0x55,0x5D,0x54,0x53,0x53,0x59,0x65,0x5D,0x64,0x71,0x69, + 0x6C,0x74,0x78,0x7B,0x82,0x8C,0x92,0x91,0x95,0x97,0x8A,0xA6,0xA8,0x8C,0xA4,0x9C, + 0x86,0x8B,0x82,0x7F,0x7F,0x79,0x8B,0x8B,0x7E,0x8E,0x90,0x86,0x8C,0x90,0x8E,0x8F, + 0x91,0x96,0x90,0x8A,0x93,0x86,0x8A,0xAF,0x9B,0x94,0xB5,0x9C,0x8F,0x99,0x8F,0x92, + 0x8C,0x8E,0xA2,0x94,0x90,0xA1,0x95,0x8F,0x92,0x90,0x90,0x8D,0x90,0x91,0x8A,0x86, + 0x88,0x7A,0x8C,0x9D,0x81,0x92,0x9B,0x7D,0x7F,0x7B,0x76,0x78,0x6A,0x77,0x7E,0x6E, + 0x75,0x78,0x6B,0x6B,0x69,0x68,0x67,0x64,0x66,0x65,0x61,0x5A,0x57,0x52,0x6D,0x6A, + 0x57,0x76,0x69,0x54,0x5B,0x52,0x53,0x50,0x4B,0x60,0x60,0x56,0x65,0x64,0x60,0x67, + 0x69,0x74,0x77,0x7D,0x8A,0x8D,0x92,0x92,0x8D,0x95,0xB0,0x9B,0x96,0xAD,0x9A,0x8A, + 0x87,0x86,0x86,0x7C,0x7E,0x93,0x89,0x83,0x8E,0x88,0x87,0x82,0x85,0x8F,0x8B,0x8B, + 0x93,0x90,0x8B,0x8B,0x80,0x92,0xAB,0x92,0x9B,0xB0,0x9C,0x91,0x8D,0x91,0x97,0x86, + 0x92,0xA3,0x96,0x96,0x93,0x92,0x94,0x8A,0x8E,0x94,0x91,0x91,0x8F,0x8E,0x86,0x80, + 0x7C,0x92,0xA1,0x84,0x92,0x9C,0x84,0x7D,0x74,0x80,0x85,0x6E,0x7B,0x84,0x79,0x74, + 0x6B,0x72,0x71,0x62,0x69,0x6F,0x6C,0x63,0x60,0x62,0x5B,0x51,0x4C,0x6A,0x75,0x59, + 0x67,0x6B,0x5B,0x52,0x46,0x5A,0x5C,0x4D,0x5B,0x63,0x60,0x5B,0x56,0x62,0x69,0x63, + 0x6D,0x79,0x80,0x7C,0x7F,0x86,0x87,0x85,0x8F,0xB2,0xAF,0x9D,0xA9,0xA1,0x94,0x84, + 0x7C,0x95,0x94,0x86,0x8D,0x91,0x90,0x84,0x7C,0x86,0x8A,0x88,0x88,0x8F,0x90,0x89, + 0x89,0x87,0x88,0x81,0x92,0xAD,0x9E,0x97,0x9E,0x95,0x91,0x84,0x89,0x9D,0x98,0x98, + 0x99,0x99,0x98,0x8A,0x86,0x90,0x94,0x92,0x90,0x96,0x91,0x8A,0x86,0x7E,0x80,0x82, + 0x98,0x9F,0x8E,0x92,0x8E,0x88,0x7B,0x6F,0x7E,0x89,0x80,0x7E,0x7D,0x7B,0x7A,0x6C, + 0x6C,0x71,0x72,0x71,0x6C,0x6D,0x69,0x62,0x5A,0x5B,0x56,0x5E,0x78,0x6D,0x66,0x67, + 0x5B,0x59,0x4D,0x4B,0x5D,0x60,0x5D,0x5A,0x5A,0x5F,0x5B,0x57,0x5C,0x67,0x6A,0x6A, + 0x70,0x74,0x7B,0x79,0x79,0x7F,0x83,0xA3,0xB1,0xA4,0xA2,0x96,0x97,0x92,0x83,0x8A, + 0x95,0x96,0x91,0x88,0x88,0x8E,0x86,0x80,0x82,0x8A,0x91,0x8A,0x84,0x87,0x8A,0x83, + 0x7F,0x7A,0x89,0xA5,0xA3,0x95,0x8F,0x8E,0x92,0x8B,0x83,0x8D,0x9A,0xA0,0x98,0x8B, + 0x91,0x95,0x91,0x89,0x88,0x96,0x99,0x90,0x8A,0x8A,0x89,0x86,0x7E,0x7C,0x97,0xA3, + 0x98,0x8E,0x81,0x85,0x89,0x7C,0x7A,0x80,0x8B,0x8D,0x81,0x78,0x79,0x7F,0x7C,0x73, + 0x71,0x79,0x7B,0x71,0x6B,0x6B,0x68,0x63,0x59,0x64,0x7C,0x7A,0x6E,0x5D,0x59,0x5D, + 0x5B,0x55,0x54,0x5D,0x64,0x64,0x5C,0x56,0x5A,0x64,0x62,0x5D,0x63,0x6A,0x6F,0x70, + 0x6E,0x70,0x75,0x72,0x7C,0x98,0xA5,0xA1,0x98,0x90,0x91,0x93,0x8D,0x8C,0x8E,0x94, + 0x96,0x90,0x8A,0x85,0x8A,0x8A,0x85,0x84,0x86,0x88,0x8B,0x86,0x80,0x7F,0x7B,0x7A, + 0x90,0xA1,0x9B,0x96,0x8B,0x89,0x8D,0x8A,0x87,0x89,0x8F,0x97,0x9B,0x95,0x90,0x90, + 0x91,0x92,0x91,0x8F,0x93,0x95,0x92,0x8F,0x88,0x85,0x7F,0x8E,0xA3,0xA3,0x9B,0x8E, + 0x86,0x89,0x88,0x85,0x83,0x83,0x89,0x8B,0x8B,0x88,0x81,0x7E,0x7E,0x7E,0x7C,0x7A, + 0x79,0x77,0x74,0x6D,0x6A,0x64,0x66,0x77,0x79,0x71,0x6A,0x60,0x60,0x62,0x5D,0x5D, + 0x5B,0x59,0x5B,0x5B,0x5C,0x5F,0x5E,0x5E,0x61,0x60,0x63,0x66,0x67,0x6B,0x70,0x73, + 0x76,0x77,0x7A,0x87,0x8E,0x8E,0x93,0x95,0x98,0x9F,0x9D,0x99,0x9C,0x93,0x95,0x96, + 0x8E,0x8F,0x8B,0x86,0x87,0x84,0x82,0x85,0x83,0x83,0x83,0x83,0x85,0x82,0x85,0x8B, + 0x89,0x89,0x8B,0x8A,0x91,0x8F,0x8E,0x92,0x8F,0x8E,0x91,0x90,0x8F,0x8E,0x8B,0x8B, + 0x8C,0x8D,0x8C,0x8F,0x8F,0x8E,0x8F,0x8D,0x8E,0x89,0x8F,0x94,0x8E,0x90,0x90,0x8D, + 0x92,0x91,0x8B,0x8D,0x88,0x87,0x89,0x86,0x84,0x81,0x7D,0x7C,0x7D,0x79,0x7A,0x7B, + 0x78,0x78,0x76,0x73,0x71,0x6C,0x6F,0x72,0x6B,0x6C,0x6B,0x66,0x6C,0x6A,0x65,0x66, + 0x62,0x5F,0x60,0x5C,0x5E,0x5C,0x5B,0x60,0x60,0x64,0x67,0x69,0x6C,0x71,0x75,0x77, + 0x7A,0x7C,0x82,0x8B,0x8C,0x8F,0x95,0x92,0x99,0x9C,0x96,0x9A,0x95,0x92,0x94,0x8C, + 0x8A,0x88,0x82,0x85,0x83,0x80,0x84,0x80,0x80,0x81,0x81,0x81,0x81,0x81,0x81,0x86, + 0x87,0x85,0x89,0x88,0x89,0x8E,0x8B,0x8B,0x8D,0x88,0x8B,0x8A,0x87,0x8A,0x85,0x86, + 0x8B,0x88,0x8B,0x8C,0x8B,0x8D,0x8D,0x8E,0x8B,0x8D,0x8D,0x8D,0x90,0x90,0x8E,0x8F, + 0x8F,0x8B,0x8E,0x8B,0x8C,0x8A,0x86,0x89,0x84,0x80,0x82,0x7F,0x7B,0x7D,0x7A,0x79, + 0x79,0x75,0x75,0x75,0x74,0x72,0x6F,0x6F,0x6D,0x6C,0x6E,0x6A,0x69,0x69,0x64,0x65, + 0x65,0x60,0x63,0x63,0x61,0x64,0x64,0x64,0x66,0x66,0x69,0x6C,0x6D,0x72,0x74,0x75, + 0x7C,0x7D,0x82,0x87,0x86,0x8B,0x8E,0x8D,0x8F,0x8F,0x8D,0x8D,0x8B,0x8B,0x8C,0x89, + 0x89,0x8A,0x88,0x87,0x87,0x85,0x84,0x85,0x82,0x83,0x83,0x82,0x83,0x85,0x84,0x84, + 0x86,0x86,0x87,0x89,0x89,0x89,0x89,0x88,0x89,0x8B,0x89,0x88,0x88,0x88,0x86,0x87, + 0x87,0x85,0x84,0x85,0x84,0x82,0x83,0x82,0x81,0x81,0x81,0x80,0x80,0x82,0x82,0x83, + 0x85,0x82,0x82,0x84,0x84,0x87,0x85,0x81,0x84,0x83,0x83,0x82,0x7F,0x7F,0x7F,0x7D, + 0x7E,0x7C,0x78,0x79,0x77,0x77,0x75,0x75,0x73,0x73,0x73,0x73,0x74,0x72,0x72,0x73, + 0x73,0x73,0x75,0x74,0x76,0x78,0x78,0x79,0x77,0x7A,0x7C,0x7C,0x7D,0x7E,0x7E,0x7F, + 0x7F,0x80,0x80,0x81,0x82,0x82,0x83,0x82,0x81,0x81,0x81,0x80,0x81,0x82,0x81,0x80, + 0x80,0x81,0x80,0x80,0x7F,0x7E,0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x7F,0x7E,0x80,0x80, + 0x80,0x7F,0x80,0x7F,0x7E,0x7F,0x7F,0x7E,0x7E,0x80,0x7F,0x7E,0x7F,0x80,0x80,0x81, + 0x80,0x80,0x82,0x81,0x82,0x82,0x83,0x83,0x83,0x84,0x83,0x85,0x86,0x86,0x87,0x86, + 0x85,0x85,0x86,0x85,0x85,0x83,0x85,0x85,0x83,0x84,0x84,0x82,0x82,0x82,0x80,0x81, + 0x80,0x80,0x7E,0x7E,0x7F,0x7E,0x7F,0x7E,0x7E,0x80,0x80,0x7E,0x7F,0x7F,0x7E,0x7F, + 0x7E,0x7E,0x80,0x80,0x7F,0x80,0x81,0x7F,0x7F,0x82,0x81,0x7F,0x80,0x80,0x81,0x80, + 0x81,0x81,0x83,0x84,0x82,0x84,0x84,0x82,0x82,0x84,0x84,0x83,0x82,0x83,0x82,0x84, + 0x84,0x82,0x83,0x83,0x83,0x80,0x80,0x80,0x7F,0x80,0x7F,0x7D,0x7F,0x7E,0x7F,0x80, + 0x7E,0x7D,0x7D,0x7D,0x7E,0x7D,0x7E,0x7E,0x7D,0x7E,0x7C,0x7D,0x7F,0x7F,0x81,0x81, + 0x7F,0x81,0x82,0x82,0x83,0x81,0x83,0x82,0x81,0x94,0x83,0x86,0x84,0x65,0x7F,0x81, + 0x6C,0x6A,0x78,0x80,0x87,0x8C,0x8F,0x8D,0x89,0x97,0xA0,0x9D,0x98,0x93,0x90,0x8B, + 0x89,0x86,0x81,0x78,0x6E,0x63,0x5E,0x5C,0x5A,0x56,0x54,0x5E,0x64,0x68,0x6E,0x70, + 0x76,0x7B,0x7E,0x82,0x85,0x87,0x8A,0x8A,0x8C,0x8F,0x9A,0xA2,0xAC,0xB6,0xB2,0xB3, + 0xB1,0xAB,0xA5,0xA0,0x9B,0x94,0x91,0x8C,0x87,0x82,0x7E,0x7B,0x76,0x77,0x76,0x72, + 0x71,0x72,0x6F,0x6C,0x68,0x5D,0x57,0x50,0x48,0x4C,0x49,0x4C,0x51,0x56,0x5D,0x5F, + 0x66,0x6D,0x70,0x76,0x7B,0x7D,0x85,0x85,0x86,0x8D,0x8E,0x8F,0x90,0x97,0xA0,0xA7, + 0xAC,0xAF,0xAF,0xB1,0xB2,0xAF,0xAC,0xA9,0xA1,0x9D,0x96,0x8F,0x8B,0x86,0x83,0x7F, + 0x7A,0x7A,0x76,0x71,0x6C,0x60,0x5B,0x53,0x4D,0x51,0x50,0x50,0x56,0x5A,0x61,0x6C, + 0x72,0x78,0x7D,0x80,0x85,0x88,0x8A,0x89,0x8A,0x8A,0x89,0x8B,0x83,0x87,0x90,0x9A, + 0xA6,0xA7,0xA6,0xA4,0xA4,0xA6,0x9F,0x97,0x92,0x90,0x8B,0x8A,0x8B,0x86,0x80,0x7F, + 0x7F,0x7B,0x79,0x78,0x78,0x7A,0x76,0x78,0x76,0x6D,0x6D,0x69,0x61,0x5C,0x56,0x52, + 0x4D,0x4D,0x4D,0x4E,0x54,0x57,0x5E,0x62,0x64,0x6E,0x70,0x72,0x77,0x7A,0x7F,0x85, + 0x87,0x8C,0x97,0x9C,0xA3,0xAB,0xAD,0xB1,0xB6,0xBB,0xBD,0xBE,0xBB,0xBE,0xBD,0xB4, + 0xB6,0xB4,0xAE,0xA8,0x9E,0x99,0x96,0x88,0x7F,0x7C,0x75,0x73,0x71,0x6B,0x68,0x63, + 0x5C,0x56,0x55,0x54,0x4F,0x4A,0x49,0x48,0x46,0x47,0x44,0x41,0x52,0x5F,0x57,0x57, + 0x5A,0x5F,0x67,0x60,0x62,0x6C,0x6E,0x77,0x7C,0x82,0x92,0x95,0x97,0x9F,0xA2,0xA5, + 0xA9,0xAE,0xB4,0xB8,0xB9,0xBC,0xBA,0xBC,0xCA,0xC8,0xC1,0xC5,0xC0,0xBC,0xB3,0xA8, + 0xAA,0xA5,0x9A,0x99,0x96,0x90,0x90,0x83,0x77,0x76,0x69,0x63,0x5F,0x55,0x59,0x56, + 0x53,0x50,0x48,0x55,0x58,0x4C,0x51,0x50,0x49,0x47,0x37,0x3D,0x4E,0x45,0x48,0x55, + 0x5D,0x69,0x65,0x64,0x6E,0x6B,0x67,0x68,0x6D,0x75,0x75,0x75,0x7B,0x7F,0x88,0x90, + 0x8F,0x95,0x9D,0x9E,0x9F,0x9B,0xA2,0xAD,0xA9,0xAB,0xB6,0xBA,0xBE,0xBB,0xB6,0xBF, + 0xBC,0xB3,0xB6,0xB5,0xB3,0xAB,0xA3,0xA6,0x9A,0x93,0xA2,0x98,0x8F,0x91,0x84,0x7F, + 0x71,0x63,0x68,0x62,0x56,0x5B,0x5D,0x61,0x62,0x52,0x56,0x58,0x4E,0x50,0x51,0x52, + 0x54,0x50,0x53,0x5A,0x55,0x65,0x70,0x62,0x6E,0x72,0x6F,0x70,0x62,0x6B,0x76,0x6B, + 0x72,0x7F,0x84,0x8D,0x88,0x88,0x96,0x8C,0x87,0x8E,0x8D,0x90,0x8E,0x8D,0x96,0x90, + 0x9B,0xB0,0xA4,0xA4,0xAB,0xA4,0xA2,0x98,0x97,0xA3,0x9A,0x92,0x9C,0x9B,0x9E,0x98, + 0x90,0x9A,0x91,0x85,0x88,0x87,0x84,0x7F,0x7C,0x7E,0x7D,0x75,0x7F,0x86,0x77,0x79, + 0x7A,0x77,0x74,0x60,0x6B,0x74,0x64,0x6A,0x75,0x78,0x78,0x71,0x75,0x7A,0x6D,0x6B, + 0x72,0x72,0x6F,0x6C,0x6C,0x70,0x65,0x67,0x80,0x71,0x69,0x76,0x70,0x6E,0x5F,0x60, + 0x75,0x66,0x5F,0x73,0x78,0x78,0x75,0x78,0x85,0x7B,0x76,0x7F,0x83,0x82,0x81,0x88, + 0x8B,0x8F,0x8D,0x97,0xAD,0x9D,0x9F,0xB1,0xA7,0xA1,0x98,0x9F,0xAA,0x97,0x97,0xA5, + 0xA2,0xA0,0x9E,0x9F,0xA0,0x93,0x8D,0x94,0x8E,0x88,0x8E,0x8C,0x89,0x83,0x7D,0x9A, + 0x8D,0x7A,0x91,0x89,0x7E,0x71,0x6C,0x80,0x6C,0x60,0x78,0x74,0x6D,0x6E,0x70,0x76, + 0x67,0x61,0x6A,0x61,0x5E,0x61,0x63,0x5F,0x5B,0x61,0x64,0x73,0x67,0x62,0x77,0x6C, + 0x64,0x65,0x67,0x6F,0x66,0x6B,0x80,0x7C,0x7A,0x8B,0x90,0x8D,0x89,0x8D,0x92,0x8D, + 0x8C,0x94,0x91,0x8F,0x91,0x85,0x9E,0xA4,0x87,0xA0,0xA5,0x91,0x8E,0x87,0x95,0x8A, + 0x79,0x95,0x95,0x87,0x94,0x98,0x9A,0x90,0x8D,0x99,0x8B,0x89,0x91,0x8D,0x8C,0x8B, + 0x8B,0x86,0x98,0x94,0x85,0x99,0x8F,0x81,0x82,0x7E,0x80,0x73,0x71,0x81,0x78,0x74, + 0x81,0x81,0x7B,0x76,0x78,0x76,0x6D,0x6F,0x71,0x6C,0x69,0x70,0x63,0x6F,0x87,0x67, + 0x76,0x85,0x6D,0x6E,0x67,0x6E,0x69,0x57,0x6F,0x71,0x60,0x6F,0x75,0x71,0x6C,0x6C, + 0x73,0x64,0x63,0x6B,0x65,0x62,0x66,0x6B,0x61,0x79,0x7D,0x68,0x83,0x7D,0x70,0x76, + 0x71,0x79,0x6E,0x6D,0x83,0x7B,0x7A,0x8D,0x90,0x8C,0x8D,0x94,0x92,0x8B,0x91,0x93, + 0x90,0x91,0x99,0x8D,0x94,0xB3,0x96,0x9D,0xB4,0x9D,0x9C,0x99,0x9B,0x98,0x84,0x96, + 0x9C,0x88,0x95,0xA1,0x9B,0x95,0x9A,0xA0,0x91,0x8F,0x97,0x8D,0x8A,0x8D,0x91,0x81, + 0x8E,0xA3,0x85,0x93,0xA2,0x8D,0x87,0x85,0x88,0x7D,0x70,0x81,0x7E,0x70,0x7D,0x82, + 0x77,0x71,0x79,0x77,0x66,0x6B,0x6D,0x65,0x62,0x66,0x64,0x58,0x73,0x6D,0x5B,0x77, + 0x6D,0x63,0x65,0x63,0x68,0x59,0x5E,0x6D,0x5D,0x5F,0x6F,0x6A,0x66,0x69,0x70,0x68, + 0x60,0x6D,0x66,0x61,0x66,0x68,0x62,0x64,0x81,0x6F,0x6E,0x87,0x76,0x74,0x74,0x77, + 0x76,0x6A,0x7A,0x80,0x72,0x80,0x8A,0x82,0x82,0x86,0x8D,0x81,0x83,0x91,0x86,0x87, + 0x8D,0x8D,0x84,0x8F,0xA6,0x8C,0x9C,0xAC,0x95,0x99,0x9A,0x9B,0x93,0x8D,0xA0,0x99, + 0x92,0xA4,0xA4,0x9C,0x9E,0xA4,0xA3,0x96,0x9D,0xA3,0x94,0x99,0x9A,0x95,0x8C,0x9D, + 0xAB,0x8D,0xA5,0xAC,0x94,0x98,0x98,0x96,0x88,0x86,0x96,0x8A,0x84,0x95,0x8F,0x86, + 0x88,0x8C,0x87,0x7A,0x84,0x84,0x76,0x7B,0x7A,0x72,0x69,0x82,0x82,0x6B,0x89,0x80, + 0x6D,0x74,0x71,0x6F,0x60,0x66,0x72,0x60,0x64,0x71,0x67,0x63,0x66,0x68,0x61,0x5A, + 0x64,0x5F,0x57,0x5D,0x5A,0x55,0x4F,0x6B,0x64,0x54,0x77,0x67,0x5A,0x64,0x62,0x5F, + 0x53,0x5F,0x68,0x5A,0x65,0x72,0x69,0x69,0x70,0x75,0x6E,0x6B,0x7A,0x72,0x6F,0x77, + 0x77,0x6F,0x6F,0x90,0x80,0x7A,0x9C,0x87,0x81,0x8A,0x89,0x85,0x7A,0x8A,0x8E,0x80, + 0x8F,0x97,0x8C,0x90,0x96,0x98,0x91,0x91,0xA0,0x96,0x95,0x9C,0x9B,0x93,0x95,0xB5, + 0x9E,0x9F,0xBD,0xA2,0xA0,0xA7,0xA4,0x9B,0x94,0xA4,0xA1,0x95,0xA3,0xA8,0x9D,0x9D, + 0xA4,0xA2,0x97,0x98,0xA1,0x95,0x92,0x97,0x94,0x87,0x8C,0xA9,0x8D,0x93,0xAB,0x8C, + 0x8E,0x92,0x8C,0x83,0x7D,0x8C,0x85,0x7C,0x8B,0x8A,0x7E,0x82,0x85,0x81,0x77,0x79, + 0x80,0x71,0x71,0x76,0x6F,0x63,0x6C,0x85,0x67,0x72,0x87,0x68,0x6C,0x70,0x6A,0x61, + 0x5E,0x6B,0x63,0x5D,0x6D,0x6B,0x61,0x68,0x6B,0x66,0x5F,0x64,0x69,0x5B,0x5E,0x61, + 0x5A,0x51,0x60,0x73,0x56,0x6B,0x78,0x5C,0x66,0x6A,0x63,0x5C,0x60,0x6B,0x63,0x62, + 0x73,0x71,0x6A,0x75,0x78,0x73,0x72,0x7A,0x7D,0x74,0x7A,0x7C,0x77,0x6F,0x85,0x92, + 0x76,0x94,0x9A,0x7F,0x8C,0x8D,0x84,0x7D,0x85,0x8C,0x83,0x86,0x94,0x8F,0x89,0x95, + 0x96,0x8F,0x8F,0x99,0x95,0x8D,0x95,0x93,0x8C,0x87,0xA2,0xA1,0x8D,0xB0,0xA9,0x93, + 0xA2,0x9F,0x93,0x8F,0x98,0x98,0x8E,0x95,0x9F,0x95,0x93,0x9B,0x97,0x91,0x93,0x97, + 0x8E,0x8C,0x8F,0x8A,0x81,0x80,0x99,0x8A,0x81,0xA4,0x8C,0x7E,0x91,0x86,0x78,0x7E, + 0x85,0x7E,0x7A,0x85,0x87,0x7D,0x83,0x8A,0x82,0x81,0x86,0x85,0x7D,0x7F,0x7F,0x7A, + 0x71,0x7A,0x8E,0x75,0x80,0x96,0x74,0x77,0x87,0x71,0x6A,0x75,0x71,0x6B,0x6E,0x75, + 0x72,0x6D,0x75,0x77,0x6E,0x72,0x75,0x70,0x6E,0x71,0x6F,0x6C,0x65,0x7A,0x80,0x6B, + 0x87,0x8A,0x6C,0x7F,0x85,0x6C,0x73,0x7C,0x72,0x74,0x7A,0x7C,0x79,0x79,0x80,0x7F, + 0x7A,0x7D,0x7E,0x78,0x78,0x78,0x76,0x71,0x6F,0x85,0x7C,0x74,0x91,0x81,0x71,0x88, + 0x7E,0x6B,0x7A,0x77,0x6F,0x77,0x79,0x79,0x7A,0x7E,0x81,0x80,0x7F,0x81,0x80,0x7D, + 0x7D,0x7C,0x7C,0x74,0x7C,0x8C,0x7B,0x86,0x95,0x7E,0x80,0x8F,0x78,0x77,0x85,0x76, + 0x76,0x81,0x7B,0x7B,0x82,0x81,0x84,0x86,0x83,0x85,0x85,0x82,0x7F,0x81,0x7E,0x79, + 0x88,0x8A,0x81,0x92,0x92,0x80,0x8D,0x8F,0x79,0x83,0x88,0x79,0x81,0x87,0x7F,0x83, + 0x87,0x84,0x87,0x89,0x85,0x87,0x87,0x81,0x81,0x82,0x7D,0x7D,0x87,0x85,0x83,0x8F, + 0x8B,0x80,0x8A,0x86,0x7A,0x84,0x82,0x79,0x81,0x82,0x7D,0x83,0x83,0x80,0x86,0x85, + 0x83,0x88,0x85,0x81,0x85,0x83,0x7D,0x81,0x87,0x86,0x85,0x8A,0x88,0x84,0x88,0x83, + 0x7F,0x85,0x7E,0x79,0x80,0x7C,0x79,0x7F,0x7C,0x7B,0x82,0x80,0x7D,0x82,0x81,0x7E, + 0x7F,0x7D,0x7B,0x7F,0x83,0x83,0x85,0x89,0x85,0x85,0x89,0x82,0x82,0x86,0x7E,0x7E, + 0x81,0x7B,0x7E,0x81,0x7C,0x80,0x84,0x81,0x82,0x84,0x80,0x80,0x7F,0x7C,0x7C,0x7E, + 0x83,0x82,0x83,0x87,0x82,0x82,0x85,0x7F,0x80,0x81,0x79,0x7B,0x7C,0x76,0x79,0x7C, + 0x77,0x7D,0x81,0x7D,0x81,0x81,0x7D,0x7E,0x7C,0x7A,0x7A,0x7C,0x81,0x80,0x82,0x86, + 0x81,0x82,0x84,0x7E,0x80,0x80,0x78,0x7B,0x7B,0x75,0x7B,0x7B,0x78,0x7F,0x80,0x7E, + 0x82,0x82,0x7F,0x80,0x7D,0x7C,0x7C,0x7E,0x84,0x81,0x83,0x88,0x81,0x83,0x85,0x7E, + 0x80,0x80,0x77,0x7B,0x7B,0x75,0x7B,0x7B,0x77,0x7F,0x80,0x7D,0x82,0x81,0x7F,0x80, + 0x7E,0x7D,0x7C,0x7F,0x85,0x82,0x84,0x8A,0x84,0x85,0x88,0x81,0x83,0x82,0x7A,0x7D, + 0x7D,0x77,0x7C,0x7C,0x78,0x7F,0x80,0x7D,0x83,0x81,0x7E,0x80,0x7D,0x7B,0x7B,0x7D, + 0x84,0x80,0x81,0x89,0x83,0x82,0x87,0x80,0x80,0x82,0x79,0x7B,0x7E,0x77,0x7C,0x7E, + 0x7A,0x81,0x84,0x80,0x86,0x86,0x82,0x85,0x82,0x7F,0x80,0x81,0x86,0x84,0x84,0x8C, + 0x87,0x84,0x8A,0x84,0x81,0x84,0x7D,0x7B,0x7F,0x78,0x79,0x7E,0x79,0x7E,0x82,0x7E, + 0x83,0x85,0x81,0x84,0x82,0x7F,0x80,0x80,0x85,0x85,0x85,0x8B,0x8A,0x85,0x8A,0x87, + 0x82,0x86,0x81,0x7C,0x81,0x7C,0x7A,0x80,0x7B,0x7C,0x82,0x7E,0x80,0x83,0x7E,0x80, + 0x80,0x7B,0x7C,0x7D,0x7F,0x82,0x81,0x85,0x86,0x82,0x86,0x86,0x7F,0x84,0x81,0x7A, + 0x80,0x7D,0x78,0x80,0x7D,0x7C,0x83,0x80,0x80,0x85,0x81,0x81,0x83,0x7F,0x7F,0x7F, + 0x7F,0x83,0x82,0x84,0x87,0x82,0x85,0x86,0x7E,0x82,0x82,0x7A,0x7E,0x7D,0x78,0x7E, + 0x7D,0x7A,0x81,0x81,0x80,0x84,0x83,0x82,0x84,0x81,0x80,0x82,0x81,0x85,0x84,0x84, + 0x88,0x85,0x85,0x87,0x81,0x82,0x83,0x7B,0x7B,0x7C,0x76,0x79,0x7B,0x77,0x7B,0x7E, + 0x7B,0x7F,0x80,0x7E,0x81,0x7F,0x7E,0x80,0x7F,0x83,0x84,0x82,0x87,0x85,0x84,0x87, + 0x82,0x81,0x84,0x7E,0x7C,0x7F,0x7A,0x7A,0x7C,0x79,0x7B,0x7F,0x7D,0x7E,0x81,0x7F, + 0x7F,0x7F,0x7D,0x7E,0x7E,0x80,0x81,0x7F,0x82,0x83,0x81,0x83,0x82,0x7F,0x81,0x7F, + 0x7B,0x7E,0x7C,0x79,0x7D,0x7D,0x7B,0x80,0x80,0x7F,0x84,0x84,0x82,0x84,0x83,0x83, + 0x83,0x83,0x85,0x83,0x83,0x85,0x82,0x81,0x83,0x81,0x80,0x80,0x7D,0x7C,0x7C,0x78, + 0x78,0x7B,0x78,0x79,0x7B,0x79,0x7C,0x7E,0x7D,0x7E,0x7F,0x7F,0x80,0x81,0x82,0x83, + 0x82,0x82,0x83,0x81,0x82,0x83,0x80,0x81,0x81,0x7E,0x7E,0x7D,0x7B,0x7B,0x7B,0x79, + 0x7C,0x7C,0x7C,0x7F,0x7F,0x7F,0x81,0x80,0x81,0x82,0x81,0x83,0x83,0x81,0x82,0x82, + 0x81,0x83,0x82,0x81,0x83,0x81,0x7F,0x7F,0x7F,0x7D,0x7C,0x7D,0x7C,0x7C,0x7D,0x7E, + 0x7E,0x80,0x7F,0x81,0x82,0x81,0x83,0x81,0x81,0x82,0x81,0x82,0x83,0x80,0x80,0x80, + 0x81,0x82,0x8C,0x88,0x66,0x6F,0x86,0x88,0x71,0x78,0x8E,0x6E,0x71,0x81,0x7E,0x7A, + 0x83,0x94,0x83,0x7C,0x87,0x8B,0x80,0x7A,0x8B,0x82,0x75,0x73,0x7B,0x83,0x7F,0x81, + 0x86,0x7F,0x70,0x7B,0x7D,0x7F,0x84,0x7E,0x82,0x79,0x75,0x71,0x6D,0x81,0x8A,0x93, + 0x8D,0x80,0x8B,0x71,0x71,0x93,0x7F,0x75,0x8C,0x80,0x81,0x7B,0x76,0x8A,0x80,0x79, + 0x80,0x7A,0x7C,0x7C,0x7C,0x76,0x6B,0x6F,0x7C,0x86,0x84,0x75,0x73,0x86,0x89,0x88, + 0x8C,0x89,0x8B,0x8F,0x90,0x87,0x86,0x97,0x98,0x8F,0x92,0x8A,0x82,0x92,0x9C,0x8E, + 0x8B,0x94,0x8F,0x8B,0x8C,0x86,0x7A,0x78,0x83,0x89,0x88,0x88,0x7F,0x71,0x6D,0x6C, + 0x61,0x5E,0x70,0x7B,0x75,0x77,0x71,0x69,0x73,0x71,0x66,0x6C,0x68,0x63,0x6C,0x6F, + 0x6D,0x73,0x75,0x77,0x7B,0x72,0x72,0x76,0x74,0x7A,0x81,0x77,0x69,0x72,0x8E,0x9B, + 0x92,0x8D,0x88,0x7C,0x7C,0x78,0x6A,0x6F,0x72,0x73,0x7F,0x84,0x89,0x8E,0x98,0xA2, + 0xB2,0xB1,0x9D,0x93,0x92,0x96,0x90,0x8B,0x85,0x8B,0x9D,0xA1,0x97,0x8E,0x85,0x7D, + 0x83,0x7E,0x7C,0x7C,0x76,0x7E,0x88,0x82,0x7C,0x80,0x84,0x86,0x89,0x85,0x7E,0x83, + 0x88,0x86,0x8C,0x88,0x77,0x79,0x88,0x91,0x8F,0x8D,0x84,0x82,0x8D,0x8B,0x85,0x83, + 0x80,0x80,0x86,0x86,0x86,0x88,0x83,0x8C,0x8D,0x85,0x85,0x82,0x86,0x8D,0x8B,0x87, + 0x80,0x7D,0x89,0x96,0x92,0x91,0x85,0x75,0x7A,0x76,0x71,0x6C,0x65,0x66,0x67,0x68, + 0x69,0x64,0x5B,0x5F,0x5F,0x5E,0x60,0x5E,0x5B,0x5C,0x5F,0x61,0x56,0x56,0x6C,0x75, + 0x77,0x7A,0x6F,0x66,0x6E,0x74,0x71,0x75,0x72,0x70,0x7C,0x80,0x7C,0x7C,0x72,0x69, + 0x70,0x76,0x78,0x7B,0x7A,0x78,0x7A,0x77,0x76,0x80,0x93,0xA8,0xAE,0xB3,0xA8,0x97, + 0x98,0x96,0x92,0x96,0x9D,0x9B,0x9E,0xA1,0x9B,0x97,0x89,0x7E,0x85,0x8C,0x88,0x88, + 0x8A,0x84,0x80,0x85,0x81,0x81,0x8F,0x9C,0x9E,0x9A,0x91,0x81,0x80,0x86,0x82,0x8B, + 0x8E,0x86,0x92,0x97,0x91,0x90,0x8B,0x86,0x8F,0x96,0x95,0x96,0x95,0x8D,0x86,0x88, + 0x80,0x84,0x99,0xA4,0xA4,0xA0,0x99,0x8B,0x86,0x86,0x87,0x8D,0x8E,0x88,0x8C,0x8C, + 0x87,0x8B,0x7F,0x76,0x7C,0x81,0x82,0x7F,0x74,0x64,0x5A,0x56,0x55,0x58,0x6B,0x75, + 0x76,0x74,0x65,0x53,0x4A,0x49,0x52,0x60,0x65,0x62,0x63,0x62,0x60,0x65,0x5D,0x5B, + 0x68,0x6F,0x76,0x76,0x75,0x6E,0x68,0x69,0x63,0x6C,0x79,0x85,0x85,0x83,0x7A,0x69, + 0x6B,0x6C,0x6F,0x79,0x7E,0x81,0x87,0x89,0x8B,0x92,0x92,0x93,0x9D,0xA4,0xA8,0xAB, + 0xA3,0x99,0x91,0x90,0x8F,0x91,0x98,0xA0,0xA2,0x97,0x8C,0x76,0x71,0x74,0x77,0x85, + 0x86,0x89,0x8B,0x89,0x88,0x87,0x80,0x81,0x86,0x8A,0x8E,0x96,0x96,0x8D,0x85,0x82, + 0x85,0x86,0x93,0xA3,0xA6,0xA1,0x99,0x86,0x7D,0x7F,0x84,0x90,0x95,0x98,0x94,0x8D, + 0x8F,0x90,0x8A,0x89,0x8E,0x8F,0x95,0x9A,0x95,0x8E,0x84,0x80,0x7E,0x7D,0x8D,0x9B, + 0x9A,0x92,0x85,0x73,0x66,0x64,0x66,0x6F,0x72,0x72,0x6A,0x62,0x61,0x60,0x5E,0x5B, + 0x5C,0x5D,0x60,0x64,0x63,0x60,0x57,0x51,0x51,0x59,0x68,0x76,0x81,0x7E,0x6E,0x60, + 0x5B,0x57,0x64,0x76,0x77,0x79,0x75,0x72,0x6F,0x6E,0x6E,0x6C,0x6D,0x6D,0x75,0x7A, + 0x7D,0x78,0x76,0x76,0x74,0x7B,0x90,0xA1,0xA6,0xAA,0xA0,0x94,0x8C,0x8F,0x9A,0xA0, + 0xA4,0xA2,0x9B,0x91,0x8F,0x8D,0x88,0x84,0x84,0x82,0x81,0x86,0x88,0x85,0x82,0x7D, + 0x78,0x80,0x91,0x9B,0xA1,0x9E,0x8B,0x7D,0x78,0x7D,0x87,0x91,0x9B,0x98,0x91,0x8C, + 0x8B,0x8E,0x90,0x90,0x8F,0x8F,0x90,0x95,0x95,0x94,0x8F,0x89,0x86,0x8B,0x9B,0xA8, + 0xAA,0x9F,0x91,0x82,0x7A,0x7E,0x86,0x91,0x95,0x90,0x89,0x82,0x82,0x86,0x83,0x80, + 0x79,0x74,0x74,0x71,0x72,0x6E,0x66,0x5C,0x58,0x60,0x6B,0x75,0x75,0x6B,0x5B,0x4E, + 0x4A,0x4E,0x57,0x64,0x6B,0x65,0x61,0x5F,0x62,0x66,0x67,0x67,0x67,0x68,0x6B,0x70, + 0x73,0x70,0x6C,0x68,0x69,0x6E,0x79,0x86,0x87,0x7D,0x71,0x64,0x62,0x6A,0x76,0x82, + 0x86,0x85,0x83,0x81,0x85,0x8B,0x90,0x99,0x9A,0x9A,0x9C,0xA0,0xA0,0x98,0x97,0x8D, + 0x87,0x91,0x9E,0xA1,0x9A,0x8F,0x82,0x74,0x70,0x7B,0x81,0x8C,0x90,0x87,0x84,0x7E, + 0x82,0x87,0x89,0x8A,0x83,0x88,0x8C,0x8B,0x8D,0x89,0x88,0x83,0x87,0x96,0x9E,0xA8, + 0xA4,0x98,0x8A,0x7C,0x7D,0x8A,0x94,0x9A,0x9D,0x94,0x8B,0x8C,0x90,0x91,0x93,0x95, + 0x90,0x8B,0x8E,0x8E,0x89,0x8B,0x89,0x80,0x86,0x8E,0x94,0x97,0x8B,0x7C,0x6D,0x63, + 0x67,0x70,0x78,0x78,0x73,0x6C,0x5E,0x5B,0x5D,0x62,0x67,0x62,0x61,0x5F,0x5F,0x5F, + 0x5D,0x60,0x5B,0x58,0x66,0x6D,0x74,0x7A,0x72,0x68,0x5C,0x59,0x62,0x6F,0x78,0x7B, + 0x77,0x6E,0x68,0x6A,0x72,0x76,0x7B,0x78,0x72,0x74,0x76,0x75,0x76,0x76,0x72,0x75, + 0x86,0x95,0x9F,0xA5,0x9B,0x8F,0x87,0x87,0x93,0xA1,0xA7,0xA5,0x9E,0x91,0x8A,0x89, + 0x8C,0x8F,0x8D,0x8A,0x84,0x82,0x83,0x80,0x82,0x81,0x7A,0x81,0x8B,0x94,0x98,0x97, + 0x8E,0x7C,0x75,0x74,0x83,0x91,0x97,0x99,0x90,0x89,0x85,0x89,0x92,0x96,0x96,0x94, + 0x90,0x8E,0x8E,0x8F,0x93,0x8C,0x88,0x91,0x9C,0xA2,0xA8,0xA4,0x91,0x83,0x7C,0x7E, + 0x8B,0x98,0x9D,0x96,0x8C,0x7F,0x7E,0x7F,0x83,0x85,0x80,0x7B,0x75,0x72,0x70,0x6E, + 0x69,0x62,0x60,0x69,0x72,0x77,0x7A,0x6E,0x5C,0x4E,0x48,0x53,0x64,0x6F,0x75,0x71, + 0x65,0x5E,0x62,0x64,0x67,0x6F,0x6C,0x68,0x69,0x6B,0x6B,0x6B,0x6B,0x66,0x6A,0x78, + 0x81,0x87,0x86,0x76,0x66,0x5E,0x5D,0x68,0x77,0x7F,0x83,0x7B,0x73,0x77,0x7E,0x87, + 0x8F,0x97,0x93,0x91,0x9A,0x98,0x97,0x9A,0x95,0x91,0x94,0x9F,0xA7,0xAA,0xA3,0x90, + 0x7F,0x75,0x74,0x82,0x8C,0x91,0x8F,0x85,0x7D,0x7D,0x81,0x87,0x8D,0x8B,0x88,0x84, + 0x85,0x85,0x85,0x85,0x80,0x80,0x8A,0x96,0xA0,0xA5,0x9B,0x8B,0x7E,0x78,0x82,0x8F, + 0x99,0x9E,0x98,0x8D,0x8A,0x8D,0x90,0x96,0x98,0x93,0x8D,0x8D,0x8E,0x8F,0x8F,0x8C, + 0x84,0x81,0x8C,0x92,0x9B,0x9C,0x8C,0x78,0x69,0x64,0x69,0x77,0x7D,0x7A,0x72,0x67, + 0x60,0x64,0x69,0x6A,0x69,0x65,0x62,0x63,0x68,0x68,0x66,0x63,0x5B,0x5A,0x6A,0x77, + 0x7F,0x81,0x73,0x62,0x58,0x5C,0x64,0x73,0x7B,0x78,0x72,0x6C,0x69,0x6E,0x73,0x74, + 0x74,0x6E,0x6F,0x74,0x74,0x78,0x78,0x76,0x6F,0x76,0x86,0x91,0x9A,0x9C,0x8E,0x7E, + 0x76,0x7A,0x8A,0x99,0x9D,0x98,0x91,0x89,0x8B,0x91,0x94,0x93,0x8D,0x87,0x88,0x8E, + 0x8C,0x8B,0x86,0x80,0x79,0x80,0x90,0x97,0x9C,0x97,0x86,0x75,0x71,0x75,0x83,0x8D, + 0x8C,0x86,0x80,0x7E,0x83,0x87,0x8A,0x88,0x83,0x84,0x88,0x8E,0x8C,0x8A,0x87,0x82, + 0x81,0x8A,0x97,0x9F,0xA1,0x96,0x87,0x79,0x76,0x7D,0x8A,0x90,0x8C,0x85,0x7E,0x7F, + 0x84,0x85,0x86,0x80,0x77,0x78,0x79,0x7C,0x7C,0x77,0x75,0x71,0x6D,0x77,0x82,0x88, + 0x89,0x7D,0x6E,0x64,0x66,0x6D,0x79,0x7E,0x78,0x74,0x70,0x71,0x78,0x7A,0x78,0x76, + 0x70,0x71,0x74,0x77,0x79,0x75,0x71,0x6E,0x68,0x77,0x84,0x88,0x8E,0x80,0x74,0x69, + 0x69,0x72,0x7C,0x82,0x7E,0x7D,0x7B,0x7C,0x83,0x86,0x84,0x81,0x7E,0x80,0x85,0x88, + 0x8A,0x88,0x81,0x7C,0x78,0x82,0x94,0x94,0x99,0x8D,0x7C,0x77,0x70,0x79,0x7F,0x84, + 0x81,0x7B,0x7B,0x7A,0x7E,0x82,0x7F,0x7A,0x78,0x78,0x7C,0x80,0x81,0x7E,0x7B,0x77, + 0x73,0x7E,0x8E,0x93,0x98,0x8E,0x7D,0x7A,0x76,0x7B,0x85,0x8A,0x89,0x84,0x83,0x84, + 0x8A,0x8F,0x8D,0x88,0x84,0x83,0x85,0x88,0x8B,0x89,0x84,0x83,0x7C,0x82,0x93,0x95, + 0x98,0x8F,0x84,0x7D,0x77,0x7F,0x86,0x82,0x83,0x82,0x7B,0x7B,0x82,0x87,0x85,0x85, + 0x81,0x7E,0x7D,0x7F,0x81,0x7E,0x7E,0x7B,0x73,0x78,0x87,0x8B,0x91,0x8C,0x7F,0x7A, + 0x70,0x73,0x7B,0x7C,0x7E,0x7A,0x76,0x78,0x7B,0x80,0x84,0x87,0x82,0x7D,0x7D,0x7D, + 0x80,0x7E,0x81,0x80,0x76,0x7C,0x88,0x90,0x98,0x95,0x87,0x81,0x79,0x79,0x7F,0x81, + 0x85,0x80,0x7B,0x7B,0x7E,0x82,0x85,0x86,0x83,0x7E,0x7C,0x7C,0x7C,0x7A,0x79,0x7A, + 0x72,0x78,0x82,0x86,0x8F,0x8C,0x80,0x7B,0x74,0x76,0x7A,0x7C,0x7E,0x7A,0x78,0x77, + 0x7A,0x80,0x83,0x84,0x83,0x81,0x80,0x81,0x81,0x7F,0x7F,0x7E,0x7A,0x7D,0x87,0x8B, + 0x92,0x91,0x88,0x83,0x7D,0x7C,0x82,0x81,0x81,0x7F,0x7D,0x7B,0x7A,0x81,0x81,0x84, + 0x86,0x82,0x82,0x83,0x80,0x7F,0x7F,0x7E,0x7C,0x7B,0x85,0x87,0x88,0x88,0x81,0x80, + 0x7C,0x7C,0x80,0x81,0x80,0x7D,0x79,0x78,0x78,0x79,0x79,0x7A,0x7C,0x7B,0x7B,0x7B, + 0x7B,0x7E,0x7E,0x7E,0x7D,0x7D,0x84,0x83,0x85,0x86,0x7F,0x80,0x81,0x80,0x85,0x86, + 0x86,0x85,0x81,0x80,0x7D,0x7E,0x7F,0x7F,0x81,0x80,0x7F,0x80,0x80,0x83,0x83,0x83, + 0x82,0x7F,0x86,0x85,0x85,0x87,0x7F,0x7E,0x7E,0x7D,0x83,0x81,0x80,0x7F,0x7A,0x79, + 0x77,0x77,0x76,0x7A,0x7A,0x79,0x7A,0x7B,0x7C,0x7F,0x80,0x80,0x81,0x7D,0x84,0x86, + 0x86,0x89,0x84,0x82,0x84,0x81,0x85,0x87,0x83,0x83,0x80,0x7E,0x7D,0x7C,0x7C,0x7E, + 0x7F,0x7F,0x7F,0x7E,0x7E,0x80,0x82,0x83,0x83,0x80,0x84,0x88,0x84,0x89,0x87,0x82, + 0x85,0x82,0x84,0x87,0x83,0x82,0x81,0x7C,0x7C,0x79,0x7A,0x7B,0x7B,0x7C,0x7B,0x7B, + 0x7C,0x7D,0x7F,0x81,0x80,0x7F,0x80,0x85,0x83,0x85,0x85,0x7F,0x82,0x82,0x80,0x85, + 0x82,0x80,0x80,0x7A,0x7C,0x7B,0x7A,0x7E,0x7C,0x7D,0x7D,0x7B,0x7E,0x7F,0x80,0x83, + 0x82,0x82,0x82,0x85,0x85,0x86,0x87,0x82,0x83,0x84,0x81,0x85,0x84,0x80,0x81,0x7C, + 0x7C,0x7C,0x79,0x7D,0x7B,0x7B,0x7B,0x78,0x7B,0x7D,0x7C,0x7E,0x7F,0x7E,0x7F,0x82, + 0x82,0x82,0x84,0x81,0x80,0x81,0x80,0x83,0x82,0x80,0x80,0x7C,0x7C,0x7D,0x7A,0x7D, + 0x7D,0x7A,0x7C,0x7B,0x7B,0x7E,0x7F,0x81,0x81,0x81,0x81,0x83,0x85,0x86,0x87,0x86, + 0x84,0x86,0x84,0x85,0x86,0x82,0x82,0x80,0x7E,0x80,0x7E,0x7E,0x7E,0x7B,0x7C,0x7C, + 0x7C,0x7E,0x7E,0x80,0x80,0x81,0x81,0x81,0x83,0x84,0x85,0x85,0x82,0x82,0x83,0x82, + 0x83,0x81,0x80,0x7F,0x7D,0x7E,0x7D,0x7C,0x7E,0x7C,0x7A,0x7C,0x7A,0x7C,0x7F,0x7E, + 0x7F,0x80,0x81,0x80,0x82,0x84,0x83,0x85,0x85,0x83,0x84,0x83,0x84,0x84,0x82,0x83, + 0x80,0x7F,0x81,0x7E,0x7D,0x7E,0x7B,0x7B,0x7C,0x7D,0x7E,0x7D,0x7E,0x7F,0x80,0x81, + 0x80,0x82,0x83,0x83,0x86,0x84,0x82,0x83,0x82,0x83,0x83,0x81,0x81,0x7F,0x7F,0x7F, + 0x7C,0x7C,0x7C,0x79,0x7B,0x7C,0x7B,0x7B,0x7C,0x7D,0x7D,0x7F,0x7F,0x7D,0x81,0x84, + 0x84,0x86,0x84,0x82,0x83,0x83,0x85,0x85,0x83,0x83,0x81,0x80,0x80,0x7E,0x7F,0x7D, + 0x7C,0x7F,0x7D,0x7E,0x80,0x7F,0x7E,0x80,0x81,0x80,0x80,0x83,0x83,0x84,0x85,0x82, + 0x81,0x82,0x82,0x85,0x85,0x83,0x82,0x80,0x7F,0x7F,0x7E,0x7E,0x7E,0x7C,0x7E,0x7D, + 0x7D,0x7F,0x7E,0x7C,0x7D,0x7F,0x80,0x82,0x81,0x82,0x82,0x82,0x84,0x82,0x84,0x84, + 0x84,0x86,0x83,0x81,0x80,0x80,0x80,0x80,0x7E,0x7E,0x7E,0x7E,0x7C,0x7D,0x7E,0x7C, + 0x8D,0x80,0x83,0x82,0x65,0x7F,0x7F,0x6B,0x6B,0x7B,0x83,0x89,0x8E,0x8E,0x8F,0x8A, + 0x97,0xA3,0x9E,0xA8,0xA3,0x91,0x88,0x76,0x82,0x8C,0x69,0x62,0x71,0x63,0x51,0x52, + 0x49,0x52,0x6D,0x6A,0x5D,0x50,0x63,0x73,0x6B,0x71,0x7B,0x99,0x8E,0x8A,0xA7,0x91, + 0x9C,0xA6,0x9B,0x9F,0xA7,0xAB,0x95,0xAA,0xAF,0x9C,0xA6,0xA3,0x85,0x88,0x8F,0x7E, + 0x7D,0x5B,0x6E,0x8E,0x77,0x76,0x6D,0x77,0x79,0x72,0x78,0x78,0x79,0x65,0x55,0x5D, + 0x51,0x59,0x6A,0x60,0x67,0x6F,0x65,0x64,0x7A,0x78,0x77,0x80,0x93,0x99,0x96,0xA5, + 0x9F,0xA4,0xA2,0x9B,0xA9,0xAC,0xA9,0x99,0x91,0xA2,0x9D,0x9D,0x9F,0x94,0x9A,0x95, + 0x92,0x91,0x7E,0x7C,0x74,0x76,0x73,0x6F,0x5F,0x45,0x47,0x4A,0x5A,0x5F,0x4C,0x37, + 0x40,0x45,0x34,0x38,0x3F,0x4B,0x58,0x61,0x6B,0x6C,0x7D,0x8E,0xA4,0xAE,0x99,0x8C, + 0x9A,0xA1,0x9A,0xA3,0xA0,0xA9,0xBF,0xCB,0xD1,0xC1,0xBA,0xAC,0xAE,0xA7,0x90,0x80, + 0x74,0x82,0x82,0x83,0x89,0x6F,0x69,0x6D,0x64,0x76,0x78,0x5B,0x57,0x5C,0x68,0x6D, + 0x5B,0x5C,0x65,0x6F,0x75,0x6E,0x69,0x68,0x7E,0x86,0x7C,0x7B,0x7C,0x93,0x9D,0x91, + 0x91,0x99,0x9A,0x9F,0x97,0x96,0xA7,0x9E,0x9D,0xA5,0x97,0xA4,0xA9,0x8D,0xA4,0xAF, + 0xA8,0xAE,0x98,0x94,0x93,0x89,0x8C,0x88,0x7E,0x79,0x69,0x57,0x5B,0x61,0x60,0x60, + 0x5B,0x66,0x6B,0x56,0x4A,0x38,0x3A,0x52,0x56,0x59,0x5B,0x59,0x62,0x57,0x47,0x57, + 0x55,0x50,0x4A,0x46,0x5A,0x61,0x75,0x79,0x7E,0xA2,0xB2,0xB5,0x9F,0x92,0xA3,0xA1, + 0xA4,0xA7,0xA6,0xB8,0xA3,0x91,0x99,0x9A,0xA1,0x96,0x97,0x98,0x88,0x97,0xA1,0xA2, + 0xA9,0xAC,0xB0,0xAD,0xA1,0x98,0x8D,0x74,0x66,0x63,0x71,0x85,0x72,0x63,0x5C,0x51, + 0x5B,0x64,0x62,0x67,0x69,0x6C,0x6F,0x63,0x5B,0x56,0x5F,0x71,0x74,0x83,0x8A,0x80, + 0x8B,0x91,0x83,0x79,0x83,0x8D,0x8E,0x9A,0x98,0x86,0x91,0x8E,0x7B,0x97,0xAB,0x9C, + 0xA4,0x9F,0x90,0x97,0x85,0x88,0x92,0x8E,0xA2,0x9E,0x97,0x9B,0x94,0x8C,0x8A,0x8D, + 0x85,0x8A,0x95,0x8E,0x83,0x79,0x7D,0x80,0x77,0x81,0x97,0x8C,0x83,0x73,0x5A,0x59, + 0x59,0x61,0x5D,0x55,0x65,0x66,0x60,0x5A,0x4D,0x59,0x66,0x64,0x68,0x6A,0x60,0x54, + 0x50,0x51,0x61,0x74,0x6B,0x62,0x6A,0x70,0x74,0x6B,0x5A,0x5C,0x6E,0x79,0x75,0x77, + 0x83,0x81,0x79,0x73,0x77,0x84,0x8E,0x96,0x95,0x95,0x97,0x99,0x99,0x9F,0xAC,0xAC, + 0xA1,0xA0,0xAD,0xBC,0xC3,0xC3,0xB6,0xBA,0xD2,0xD1,0xCA,0xC8,0xC1,0xCA,0xCD,0xC2, + 0xBC,0xBF,0xBA,0xB9,0xBF,0xB8,0xAB,0x96,0x97,0xA1,0x9F,0x9B,0x8D,0x86,0x85,0x81, + 0x77,0x5D,0x4C,0x40,0x43,0x3D,0x3D,0x47,0x43,0x4C,0x4E,0x41,0x40,0x49,0x4D,0x50, + 0x50,0x49,0x46,0x43,0x44,0x4F,0x4A,0x48,0x45,0x2D,0x4D,0x65,0x55,0x55,0x4A,0x51, + 0x5D,0x62,0x64,0x68,0x73,0x7E,0x84,0x79,0x7C,0x87,0x8B,0x9F,0xA6,0xA7,0xA9,0x9F, + 0x9F,0xA5,0xA8,0x9E,0x9C,0x9B,0x90,0xA4,0xA9,0x95,0x95,0x97,0x9A,0x9D,0x99,0x99, + 0xAC,0xB2,0xA3,0x8E,0x87,0x95,0xA5,0xAC,0x9B,0x8D,0x94,0x96,0x9C,0x9B,0x93,0x8E, + 0x85,0x80,0x80,0x83,0x90,0x92,0x82,0x7F,0x89,0x92,0x90,0x8C,0x8E,0x98,0x99,0x84, + 0x82,0x86,0x8B,0x8B,0x80,0x81,0x84,0x9B,0x94,0x84,0x87,0x7D,0x85,0x85,0x6B,0x5C, + 0x62,0x61,0x65,0x63,0x57,0x5B,0x5D,0x56,0x53,0x62,0x5F,0x4D,0x45,0x45,0x59,0x5B, + 0x58,0x61,0x62,0x5F,0x5E,0x62,0x63,0x6C,0x71,0x66,0x5A,0x53,0x60,0x7B,0x7B,0x71, + 0x66,0x65,0x7B,0x7A,0x77,0x8A,0x9A,0xA0,0xA2,0x98,0x9E,0xAF,0xA9,0xAB,0xAF,0xAD, + 0xA6,0x93,0x85,0x97,0xAB,0xA9,0x9B,0x8E,0x88,0x95,0xA7,0x97,0x7D,0x75,0x7F,0x88, + 0x81,0x7B,0x82,0x83,0x85,0x7D,0x6B,0x7B,0x92,0x98,0x99,0x94,0x85,0x7F,0x7A,0x79, + 0x82,0x7B,0x78,0x7B,0x79,0x85,0x92,0x8D,0x81,0x7C,0x80,0x89,0x86,0x78,0x7A,0x88, + 0x8F,0x88,0x78,0x7A,0x8B,0x8F,0x93,0x93,0x84,0x7E,0x74,0x6A,0x72,0x77,0x73,0x66, + 0x60,0x61,0x6F,0x7F,0x7B,0x71,0x65,0x5B,0x5C,0x5A,0x5C,0x75,0x81,0x71,0x62,0x5F, + 0x64,0x77,0x83,0x7A,0x74,0x75,0x75,0x6D,0x60,0x62,0x6E,0x6A,0x6C,0x71,0x6A,0x7E, + 0x8F,0x86,0x85,0x81,0x82,0x8F,0x8D,0x94,0xAB,0xA8,0x9E,0x9E,0x99,0xA0,0xAC,0xAC, + 0xA7,0xA7,0xA0,0x8C,0x7D,0x78,0x80,0x88,0x7C,0x76,0x77,0x71,0x8A,0x9A,0x89,0x83, + 0x7C,0x77,0x7E,0x78,0x7E,0x8F,0x87,0x7A,0x78,0x70,0x76,0x85,0x86,0x8F,0x91,0x85, + 0x7C,0x77,0x7B,0x8E,0x8B,0x7B,0x7C,0x76,0x77,0x99,0x9D,0x85,0x80,0x7C,0x87,0x8E, + 0x7F,0x82,0x8C,0x84,0x7C,0x71,0x63,0x6B,0x79,0x7D,0x7C,0x7B,0x76,0x68,0x6B,0x78, + 0x7A,0x71,0x67,0x67,0x64,0x6A,0x84,0x89,0x76,0x73,0x6D,0x69,0x6B,0x64,0x6D,0x7D, + 0x71,0x69,0x5D,0x53,0x69,0x7A,0x78,0x77,0x72,0x6C,0x6D,0x6B,0x6D,0x75,0x75,0x71, + 0x78,0x75,0x75,0x90,0x9A,0x91,0x8F,0x8F,0x93,0xA0,0xA5,0xAE,0xBA,0xAE,0x9F,0x9C, + 0x9C,0xA5,0xAC,0xA2,0x9F,0xA0,0x99,0x99,0x93,0x96,0x9C,0x95,0x91,0x93,0x8C,0x88, + 0xA3,0xA7,0x91,0x88,0x80,0x85,0x92,0x8E,0x8E,0x96,0x95,0x8D,0x7F,0x79,0x86,0x8D, + 0x88,0x8C,0x8E,0x86,0x7F,0x83,0x88,0x89,0x90,0x87,0x7E,0x7A,0x73,0x8C,0x8E,0x79, + 0x6D,0x65,0x72,0x76,0x6F,0x73,0x7D,0x78,0x71,0x64,0x47,0x5E,0x7E,0x78,0x63,0x63, + 0x6E,0x4E,0x4F,0x63,0x61,0x5B,0x5B,0x6A,0x5C,0x51,0x68,0x73,0x63,0x54,0x56,0x4E, + 0x48,0x46,0x54,0x68,0x68,0x5F,0x5B,0x55,0x55,0x6A,0x66,0x5B,0x63,0x66,0x66,0x65, + 0x6B,0x72,0x76,0x7B,0x84,0x87,0x83,0x96,0xAF,0xB3,0xAD,0x9F,0x9D,0xA9,0xAA,0xA8, + 0xBE,0xBF,0xA4,0xA0,0x9E,0xA7,0xB6,0xAA,0x9F,0xA0,0xA2,0x9D,0x93,0x95,0x9C,0xA2, + 0xA0,0x94,0x95,0x95,0x97,0xB0,0xBA,0xAC,0x9C,0x95,0x9F,0xAB,0xA9,0xAF,0xB4,0xAA, + 0xA2,0x9A,0x9C,0xA9,0xAD,0xA2,0x9B,0xA3,0x9F,0x94,0x91,0x96,0x9A,0x92,0x90,0x8E, + 0x89,0x81,0x83,0x96,0x8B,0x77,0x72,0x71,0x81,0x86,0x7E,0x7F,0x7B,0x70,0x65,0x60, + 0x6A,0x6F,0x64,0x5C,0x5B,0x5A,0x57,0x55,0x50,0x53,0x50,0x4A,0x47,0x42,0x3B,0x37, + 0x4D,0x59,0x48,0x40,0x36,0x38,0x44,0x40,0x3D,0x49,0x46,0x35,0x33,0x3A,0x48,0x50, + 0x4B,0x52,0x5B,0x5F,0x62,0x62,0x6C,0x7E,0x83,0x83,0x87,0x88,0x83,0x8A,0xA7,0xA8, + 0x91,0x88,0x89,0x98,0xA0,0x93,0x98,0xA1,0x93,0x8F,0x8B,0x8B,0x94,0x8E,0x90,0x99, + 0x97,0x8D,0x89,0x8D,0x9B,0xA0,0x9A,0x9E,0xA0,0x9F,0x96,0x9F,0xC0,0xBA,0xA3,0xA7, + 0xA8,0xB0,0xB0,0xA3,0xB0,0xBB,0xB2,0xAA,0xA3,0xA9,0xB4,0xAF,0xAA,0xA8,0xA2,0xA2, + 0x9E,0x9F,0xA4,0x9E,0x9C,0x98,0x95,0x96,0x8B,0x98,0xAD,0x9A,0x85,0x82,0x80,0x86, + 0x82,0x7C,0x83,0x7F,0x6E,0x65,0x60,0x67,0x69,0x60,0x5E,0x5D,0x5C,0x54,0x4D,0x55, + 0x5A,0x58,0x55,0x52,0x55,0x56,0x4E,0x5A,0x72,0x64,0x53,0x54,0x54,0x59,0x59,0x59, + 0x68,0x6E,0x68,0x63,0x65,0x75,0x81,0x80,0x82,0x87,0x89,0x86,0x83,0x89,0x8A,0x84, + 0x83,0x82,0x85,0x80,0x71,0x7C,0x94,0x8D,0x7C,0x76,0x75,0x7C,0x7B,0x77,0x80,0x80, + 0x7B,0x74,0x72,0x7C,0x80,0x7E,0x7D,0x82,0x89,0x86,0x82,0x85,0x8C,0x8D,0x8F,0x90, + 0x8C,0x8B,0x84,0x8D,0xA9,0xA6,0x8F,0x88,0x8B,0x94,0x91,0x89,0x92,0x9A,0x91,0x84, + 0x82,0x89,0x92,0x91,0x8E,0x8E,0x90,0x8C,0x7E,0x85,0x8F,0x8C,0x85,0x7E,0x7B,0x7F, + 0x7D,0x72,0x83,0x90,0x7B,0x6C,0x67,0x66,0x67,0x62,0x65,0x6D,0x69,0x5A,0x55,0x58, + 0x60,0x5D,0x59,0x5A,0x60,0x65,0x5A,0x5B,0x63,0x64,0x66,0x66,0x69,0x6B,0x6D,0x65, + 0x73,0x94,0x8D,0x79,0x7E,0x8A,0x91,0x90,0x8A,0x9A,0xA7,0x98,0x8E,0x91,0x96,0x98, + 0x93,0x91,0x93,0x92,0x8A,0x84,0x88,0x8A,0x86,0x82,0x82,0x89,0x89,0x7F,0x78,0x8F, + 0x9F,0x8A,0x7F,0x81,0x87,0x8B,0x86,0x8E,0x9A,0x95,0x89,0x85,0x8F,0x99,0x98,0x95, + 0x98,0x9F,0x9D,0x96,0x96,0x99,0x9A,0x9A,0x98,0x94,0x90,0x8E,0x86,0x8A,0xA8,0xA4, + 0x88,0x85,0x87,0x88,0x84,0x80,0x8C,0x93,0x86,0x78,0x7B,0x82,0x80,0x7E,0x7F,0x7E, + 0x80,0x78,0x6E,0x72,0x75,0x74,0x6E,0x6A,0x6F,0x70,0x6A,0x5B,0x62,0x81,0x78,0x5E, + 0x5D,0x60,0x63,0x60,0x5D,0x6C,0x74,0x66,0x60,0x65,0x6F,0x71,0x6E,0x74,0x7C,0x7E, + 0x79,0x77,0x7C,0x7F,0x82,0x83,0x83,0x88,0x86,0x81,0x78,0x83,0x9E,0x92,0x7C,0x80, + 0x82,0x7E,0x78,0x7B,0x8B,0x8F,0x7F,0x76,0x7A,0x82,0x83,0x7D,0x7D,0x85,0x85,0x80, + 0x7C,0x81,0x87,0x84,0x83,0x85,0x8A,0x86,0x82,0x7C,0x82,0x9F,0x98,0x7F,0x82,0x87, + 0x89,0x86,0x83,0x8F,0x97,0x8B,0x7F,0x82,0x8A,0x8A,0x85,0x87,0x8D,0x8C,0x84,0x82, + 0x85,0x86,0x83,0x83,0x83,0x86,0x88,0x83,0x7A,0x79,0x96,0x99,0x7F,0x7B,0x7F,0x7E, + 0x80,0x7D,0x82,0x8C,0x83,0x75,0x76,0x7D,0x7C,0x77,0x79,0x7F,0x7F,0x77,0x71,0x74, + 0x76,0x75,0x76,0x77,0x7B,0x7A,0x75,0x72,0x6F,0x84,0x93,0x7E,0x78,0x7F,0x7C,0x7C, + 0x7B,0x82,0x8E,0x8C,0x80,0x7E,0x86,0x87,0x82,0x83,0x88,0x8B,0x86,0x7F,0x80,0x85, + 0x83,0x81,0x82,0x85,0x83,0x7D,0x7B,0x76,0x7D,0x95,0x89,0x75,0x7C,0x7B,0x75,0x73, + 0x74,0x83,0x89,0x7A,0x72,0x79,0x7A,0x78,0x79,0x7F,0x84,0x84,0x7F,0x7D,0x84,0x83, + 0x7E,0x82,0x85,0x86,0x83,0x7E,0x7F,0x79,0x8A,0x9F,0x86,0x7C,0x88,0x81,0x7C,0x7A, + 0x7E,0x8A,0x87,0x78,0x7A,0x80,0x7B,0x7A,0x7E,0x83,0x85,0x82,0x7D,0x7E,0x81,0x7D, + 0x7E,0x83,0x83,0x83,0x7F,0x7E,0x7B,0x75,0x8E,0x96,0x7D,0x7D,0x82,0x77,0x76,0x78, + 0x7D,0x86,0x7D,0x75,0x7C,0x7F,0x7A,0x79,0x7C,0x81,0x83,0x7E,0x7B,0x7F,0x7E,0x7B, + 0x7F,0x85,0x86,0x83,0x80,0x83,0x7E,0x7A,0x95,0x96,0x7B,0x83,0x86,0x7A,0x7B,0x7C, + 0x84,0x8E,0x81,0x78,0x80,0x80,0x7B,0x7B,0x7E,0x84,0x82,0x7C,0x7C,0x7F,0x7D,0x7B, + 0x7C,0x7E,0x7E,0x7D,0x7C,0x7B,0x75,0x74,0x90,0x90,0x75,0x7E,0x84,0x7A,0x76,0x7C, + 0x86,0x8B,0x84,0x72,0x7D,0x87,0x7C,0x7F,0x87,0x8A,0x88,0x89,0x87,0x8A,0x86,0x7C, + 0x84,0x86,0x84,0x84,0x80,0x83,0x7D,0x73,0x8F,0x94,0x79,0x80,0x86,0x78,0x72,0x73, + 0x7F,0x89,0x81,0x7C,0x84,0x82,0x79,0x79,0x7F,0x84,0x80,0x7D,0x7F,0x84,0x80,0x79, + 0x7D,0x80,0x7F,0x80,0x7D,0x7E,0x7B,0x6F,0x89,0x96,0x77,0x7C,0x8B,0x79,0x76,0x7A, + 0x7E,0x8C,0x85,0x78,0x83,0x88,0x7A,0x78,0x84,0x89,0x83,0x82,0x85,0x86,0x82,0x7B, + 0x85,0x83,0x7C,0x7F,0x82,0x81,0x7C,0x73,0x7F,0x9B,0x81,0x73,0x8F,0x82,0x72,0x76, + 0x80,0x89,0x84,0x77,0x7D,0x88,0x74,0x6E,0x7C,0x78,0x73,0x77,0x79,0x7E,0x80,0x75, + 0x7F,0x8C,0x81,0x86,0x8E,0x88,0x8B,0x80,0x80,0x9C,0x88,0x6A,0x84,0x80,0x69,0x73, + 0x79,0x80,0x88,0x73,0x77,0x98,0x8B,0x72,0x80,0x91,0x84,0x77,0x71,0x7C,0x8F,0x7C, + 0x70,0x8A,0x95,0x83,0x74,0x79,0x89,0x7A,0x65,0x8C,0x9B,0x82,0x85,0x81,0x68,0x70, + 0x83,0x7A,0x7A,0x77,0x7B,0x7D,0x6F,0x77,0x8B,0x88,0x74,0x7D,0x94,0x9D,0x8D,0x74, + 0x77,0x90,0x8B,0x77,0x82,0x83,0x7D,0x82,0x6D,0x7A,0xA2,0x7B,0x64,0x96,0x91,0x6A, + 0x68,0x7B,0x93,0x83,0x68,0x84,0xA4,0x83,0x6B,0x8A,0x8C,0x6E,0x6B,0x87,0x8D,0x75, + 0x6E,0x7E,0x88,0x7F,0x83,0x87,0x77,0x72,0x6F,0x79,0x98,0x8D,0x77,0x8B,0x82,0x70, + 0x82,0x84,0x7E,0x79,0x76,0x81,0x78,0x6F,0x7D,0x90,0x8D,0x8F,0x8F,0x76,0x68,0x76, + 0x7C,0x87,0x9B,0x80,0x82,0x99,0x88,0x7C,0x97,0x84,0x62,0x8E,0x75,0x6A,0x91,0x74, + 0x69,0x76,0x72,0x6F,0x66,0x77,0x88,0x91,0xAC,0xA5,0xAA,0xAF,0x96,0x6C,0x6F,0x80, + 0x5E,0x5C,0x6F,0x73,0x6B,0x7E,0x93,0x99,0x9D,0x95,0x92,0x7F,0x5B,0x49,0x5A,0x81, + 0x91,0x80,0x76,0x77,0x81,0x7D,0x85,0x93,0x92,0x96,0x8F,0x84,0x93,0x98,0x8A,0x9F, + 0xA8,0x9C,0x8D,0x6D,0x68,0x70,0x7C,0x76,0x5A,0x5B,0x6F,0x69,0x6F,0x8C,0x7D,0x5C, + 0x77,0x87,0x73,0x7E,0x78,0x7A,0x99,0xA2,0x96,0x90,0x82,0x6E,0x8B,0xAE,0x9C,0x80, + 0x79,0x83,0x82,0x72,0x8B,0x95,0x71,0x6E,0x72,0x76,0x71,0x6A,0x7C,0x7E,0x89,0x93, + 0x77,0x6F,0x72,0x69,0x75,0x86,0x7D,0x70,0x6B,0x73,0x8B,0x9C,0xA3,0xA1,0x98,0x99, + 0x88,0x76,0x6E,0x80,0x92,0x89,0x95,0x95,0x7A,0x64,0x77,0x84,0x78,0x76,0x60,0x6C, + 0x88,0x70,0x6F,0x89,0x74,0x6E,0x7E,0x65,0x76,0x98,0x84,0x7F,0x8C,0x7D,0x7D,0x93, + 0x8E,0x9C,0xAF,0x9A,0x90,0x99,0x8A,0x7B,0x7C,0x7C,0x72,0x70,0x7C,0x73,0x67,0x69, + 0x7B,0x88,0x9F,0xA1,0x88,0x94,0x8E,0x67,0x6A,0x7C,0x7B,0x74,0x5F,0x68,0x78,0x66, + 0x6D,0x8F,0x82,0x76,0x8F,0x88,0x8E,0x92,0x7E,0x92,0x88,0x79,0x93,0x81,0x62,0x6F, + 0x95,0x9F,0x89,0x80,0x75,0x71,0x81,0x85,0xA2,0xA6,0x84,0x92,0x90,0x73,0x6A,0x6B, + 0x6B,0x68,0x71,0x72,0x76,0x6A,0x65,0x83,0x91,0x89,0x82,0x8D,0x88,0x86,0x90,0x94, + 0x89,0x7D,0x88,0x87,0x80,0x6E,0x6E,0x89,0x80,0x78,0x96,0x92,0x6F,0x72,0x7A,0x8D, + 0xA0,0x89,0x82,0x7D,0x71,0x75,0x8B,0x9D,0x84,0x91,0xAF,0x97,0x8E,0x82,0x7E,0x94, + 0x8B,0x81,0x81,0x66,0x54,0x64,0x6E,0x68,0x5E,0x65,0x67,0x69,0x71,0x71,0x87,0x87, + 0x85,0x93,0x85,0x7E,0x7D,0x7D,0x92,0x87,0x83,0x94,0x82,0x79,0x8A,0x99,0x99,0x8D, + 0x82,0x92,0x91,0x82,0x94,0x9D,0x87,0x6A,0x75,0x74,0x5A,0x6E,0x7A,0x7D,0x87,0x88, + 0x90,0x7A,0x63,0x74,0x87,0x80,0x71,0x7F,0x82,0x79,0x7D,0x7A,0x86,0x8F,0x8A,0x8C, + 0x94,0x85,0x78,0x96,0xA4,0x96,0x94,0x93,0x83,0x6E,0x6D,0x80,0x8D,0x8C,0x7F,0x74, + 0x6B,0x5D,0x69,0x81,0x77,0x6F,0x76,0x6E,0x75,0x76,0x86,0xA2,0x9D,0x99,0x9A,0x8B, + 0x61,0x59,0x78,0x84,0x74,0x75,0x86,0x7B,0x69,0x75,0x8F,0x88,0x7E,0x87,0x88,0x78, + 0x62,0x6B,0x7A,0x83,0x7B,0x84,0x90,0x77,0x74,0x73,0x7C,0x86,0x8F,0x98,0xA0,0x93, + 0x88,0x9B,0x91,0x7C,0x80,0x8E,0x82,0x7A,0x7C,0x88,0xA5,0xA4,0x92,0x94,0x83,0x6E, + 0x7E,0x7F,0x68,0x6F,0x6B,0x5E,0x6B,0x5D,0x67,0x7F,0x69,0x7A,0x82,0x6B,0x69,0x75, + 0x90,0x8F,0x8A,0x8E,0x88,0x7D,0x75,0x7C,0x87,0x96,0x8A,0x80,0x7E,0x74,0x89,0x90, + 0x88,0x7D,0x7F,0x92,0x86,0x75,0x79,0x75,0x7C,0x7D,0x76,0x7F,0x6D,0x56,0x67,0x88, + 0x8D,0x7A,0x80,0x81,0x7D,0x7D,0x76,0x84,0x99,0xA8,0xAF,0x9F,0x7F,0x67,0x6E,0x75, + 0x6F,0x7A,0x91,0x7F,0x75,0x86,0x80,0x86,0x7D,0x7F,0x8E,0x8A,0x79,0x74,0x77,0x62, + 0x64,0x75,0x77,0x6C,0x76,0x7C,0x80,0xA1,0x9C,0xA1,0x9A,0x73,0x87,0x94,0x8B,0x81, + 0x80,0x78,0x70,0x6F,0x6A,0x71,0x73,0x82,0x9A,0xA4,0x8D,0x7E,0x8B,0x97,0x9F,0x87, + 0x7E,0x7F,0x63,0x55,0x5A,0x73,0x7E,0x72,0x6A,0x69,0x6C,0x73,0x87,0x8E,0x82,0x89, + 0x98,0x8E,0x8C,0x85,0x7B,0x97,0x8C,0x7E,0x89,0x6E,0x60,0x77,0x8A,0x7C,0x75,0x75, + 0x70,0x7D,0x6F,0x6F,0x80,0x84,0x94,0x92,0x82,0x7C,0x78,0x76,0x87,0x97,0x96,0x85, + 0x77,0x69,0x6D,0x7B,0x88,0x99,0x90,0x94,0x9C,0x84,0x81,0x7D,0x62,0x6C,0x7E,0x7E, + 0x78,0x75,0x74,0x81,0x95,0xA6,0x9D,0x81,0x79,0x6F,0x75,0x76,0x71,0x74,0x74,0x82, + 0x6B,0x68,0x7D,0x75,0x84,0x9A,0x91,0x82,0x7C,0x7F,0x94,0xA3,0x93,0x88,0x7E,0x73, + 0x72,0x63,0x72,0x96,0x93,0x8B,0x95,0x99,0x9A,0x9A,0x7E,0x7D,0x9B,0x86,0x75,0x77, + 0x67,0x6F,0x78,0x82,0x80,0x6F,0x76,0x5D,0x65,0x7F,0x71,0x7F,0x7A,0x78,0x7E,0x72, + 0x83,0x85,0x85,0xA0,0x8B,0x6E,0x83,0x70,0x71,0x8C,0x87,0x8C,0x7F,0x76,0x78,0x79, + 0x86,0x97,0xA0,0x8C,0x82,0x7B,0x71,0x89,0x80,0x71,0x7F,0x84,0x88,0x83,0x72,0x76, + 0x88,0x94,0xA9,0x98,0x8A,0x86,0x6A,0x73,0x71,0x6D,0x74,0x6D,0x75,0x69,0x68,0x7C, + 0x7F,0x98,0xA8,0x92,0x81,0x79,0x80,0x92,0x9C,0x9E,0x94,0x78,0x70,0x67,0x57,0x73, + 0x8F,0x85,0x74,0x83,0x88,0x81,0x86,0x7A,0x83,0x9A,0x8B,0x85,0x86,0x73,0x70,0x7E, + 0x95,0x99,0x81,0x88,0x8D,0x94,0x98,0x8F,0x92,0x7F,0x86,0x7B,0x6D,0x76,0x6D,0x87, + 0x8C,0x78,0x7D,0x55,0x43,0x78,0x8E,0x7A,0x77,0x86,0x73,0x6F,0x7F,0x85,0x99,0xA4, + 0xA7,0x92,0x68,0x72,0x86,0x6E,0x60,0x74,0x77,0x72,0x6F,0x67,0x78,0x8E,0xA4,0xA9, + 0x88,0x7A,0x85,0x75,0x79,0x89,0x89,0x88,0x7F,0x82,0x75,0x79,0x78,0x7E,0xA1,0x9C, + 0x8A,0x87,0x79,0x81,0x9E,0x96,0x90,0x7E,0x5F,0x6D,0x70,0x62,0x87,0xA6,0x81,0x84, + 0x98,0x78,0x75,0x72,0x63,0x7C,0x88,0x76,0x7A,0x7C,0x65,0x5E,0x75,0x8E,0x89,0x77, + 0x79,0x82,0x82,0x8E,0x94,0x84,0x97,0x9E,0x83,0x74,0x70,0x7D,0x88,0x88,0x82,0x7E, + 0x75,0x71,0x8D,0xA3,0xA8,0x9D,0x81,0x7F,0x85,0x73,0x74,0x86,0x76,0x6C,0x76,0x6B, + 0x65,0x62,0x5E,0x5F,0x70,0x6C,0x64,0x76,0x7A,0x80,0x97,0xAA,0xA4,0x8D,0x8A,0x8B, + 0x7E,0x77,0x79,0x7C,0x7C,0x80,0x79,0x73,0x7A,0x7A,0x6F,0x87,0x96,0x76,0x71,0x6E, + 0x87,0xA4,0x8F,0x94,0x8A,0x6E,0x76,0x73,0x76,0x99,0x9F,0x82,0x89,0x99,0x82,0x6F, + 0x6F,0x75,0x79,0x7C,0x76,0x76,0x75,0x71,0x74,0x90,0x9F,0x8B,0x81,0x82,0x81,0x7A, + 0x87,0x86,0x83,0x94,0x87,0x78,0x62,0x62,0x78,0x7C,0x7E,0x79,0x76,0x62,0x59,0x76, + 0x8E,0x98,0x99,0x87,0x89,0x96,0x81,0x82,0x8F,0x83,0x81,0x87,0x86,0x81,0x85,0x83, + 0x7E,0x96,0x99,0x89,0x89,0x75,0x73,0x85,0x93,0x91,0x7F,0x79,0x77,0x6A,0x5D,0x6A, + 0x6A,0x6E,0x7A,0x77,0x79,0x73,0x72,0x7B,0x8B,0x90,0x8B,0x85,0x70,0x86,0x91,0x7B, + 0x85,0x72,0x6A,0x79,0x67,0x6E,0x92,0x8D,0x84,0xA0,0x9F,0x89,0x7C,0x74,0x7D,0x82, + 0x89,0x8A,0x8D,0x88,0x73,0x79,0x8D,0x99,0x8A,0x7F,0x79,0x7A,0x80,0x7E,0x87,0x7E, + 0x80,0x82,0x6B,0x5D,0x70,0x73,0x73,0x87,0x8F,0x8B,0x76,0x6C,0x7D,0x8D,0x94,0x99, + 0x88,0x8A,0x94,0x7C,0x80,0x82,0x74,0x7C,0x7A,0x71,0x6F,0x68,0x60,0x68,0x81,0x90, + 0xA0,0x8D,0x70,0x81,0x8A,0x8D,0x96,0x8F,0x83,0x82,0x79,0x73,0x83,0x84,0x8E,0xA3, + 0xA0,0x92,0x89,0x86,0x7E,0x8B,0x91,0x83,0x6C,0x5D,0x75,0x74,0x6E,0x73,0x69,0x70, + 0x74,0x65,0x71,0x93,0x7E,0x77,0x9D,0xA0,0x8B,0x7E,0x76,0x6E,0x69,0x6E,0x79,0x81, + 0x71,0x67,0x73,0x7A,0x81,0x95,0x8D,0x78,0x88,0x8A,0x8B,0x98,0x84,0x97,0xA1,0x79, + 0x71,0x7C,0x80,0x70,0x71,0x85,0x82,0x67,0x69,0x83,0x7D,0x8D,0x8F,0x83,0x8F,0x7B, + 0x72,0x8B,0x82,0x6F,0x91,0x9F,0x8A,0x93,0x80,0x6F,0x72,0x6A,0x7A,0x98,0x81,0x68, + 0x80,0x83,0x86,0x93,0x97,0x86,0x6F,0x62,0x64,0x74,0x69,0x70,0x91,0x97,0x94,0x90, + 0x95,0x96,0x84,0x8E,0x95,0x7B,0x69,0x6E,0x73,0x79,0x82,0x8A,0x8E,0x8D,0x8B,0x92, + 0xA7,0x90,0x81,0x9A,0x9B,0x8C,0x7A,0x6A,0x5E,0x52,0x58,0x73,0x85,0x71,0x63,0x6E, + 0x6A,0x70,0x88,0x93,0x89,0x7F,0x7F,0x91,0x95,0x74,0x7E,0x8C,0x70,0x69,0x76,0x81, + 0x6B,0x6C,0x93,0x97,0x81,0x74,0x8A,0x90,0x85,0x92,0x9A,0x9E,0x8D,0x77,0x7D,0x85, + 0x69,0x6F,0x97,0x8B,0x82,0x89,0x77,0x6B,0x69,0x7C,0x94,0x89,0x72,0x78,0x7C,0x71, + 0x85,0xA0,0x9E,0x7C,0x6F,0x82,0x86,0x80,0x70,0x7F,0x8A,0x7D,0x82,0x8B,0x8A,0x81, + 0x91,0x97,0x8B,0x77,0x60,0x67,0x6E,0x67,0x7E,0x8E,0x7A,0x80,0x83,0x88,0x8D,0x85, + 0x90,0x9D,0x91,0x7C,0x80,0x6F,0x54,0x5A,0x77,0x90,0x95,0x80,0x87,0x90,0x81,0x92, + 0xAA,0xA5,0x90,0x84,0x86,0x89,0x80,0x6E,0x75,0x6F,0x64,0x74,0x66,0x63,0x64,0x6D, + 0x8B,0x80,0x73,0x7B,0x85,0x80,0x86,0x97,0x90,0x7F,0x6D,0x70,0x6C,0x66,0x77,0x7E, + 0x8A,0x97,0x95,0x8D,0x7D,0x6C,0x75,0x83,0x87,0x92,0x8D,0x78,0x6B,0x71,0x90,0x9A, + 0x8A,0x78,0x72,0x84,0x88,0x7B,0x85,0x8E,0x78,0x80,0x88,0x7B,0x81,0x75,0x75,0x8D, + 0x8F,0x7F,0x75,0x7B,0x84,0x90,0x88,0x81,0x74,0x68,0x78,0x7A,0x80,0x8D,0x95,0x96, + 0x8C,0x7D,0x80,0x73,0x5C,0x65,0x77,0x85,0x87,0x7B,0x78,0x82,0x87,0x93,0xA0,0x99, + 0x85,0x6C,0x72,0x80,0x72,0x6C,0x78,0x84,0x8E,0x83,0x85,0x9B,0x90,0x8B,0x9F,0xA2, + 0x8A,0x7A,0x84,0x7F,0x7A,0x77,0x76,0x7B,0x69,0x5E,0x6F,0x74,0x68,0x76,0x8B,0x8C, + 0x7E,0x79,0x8A,0x8C,0x74,0x70,0x8B,0x89,0x6A,0x6B,0x7A,0x7E,0x87,0x93,0x92,0x7F, + 0x72,0x80,0x8A,0x7F,0x78,0x83,0x94,0x93,0x7C,0x7C,0x89,0x71,0x6C,0x88,0x8C,0x75, + 0x70,0x84,0x84,0x7F,0x7C,0x8C,0x97,0x7D,0x76,0x87,0x8D,0x87,0x86,0x8C,0x8A,0x7D, + 0x7A,0x84,0x80,0x6F,0x77,0x84,0x79,0x70,0x6F,0x77,0x84,0x92,0x9D,0xA2,0x89,0x73, + 0x7D,0x7A,0x65,0x60,0x71,0x82,0x7C,0x6F,0x7E,0x90,0x89,0x8F,0xA1,0x9B,0x78,0x6F, + 0x81,0x7A,0x72,0x76,0x85,0x88,0x77,0x75,0x88,0x93,0x8A,0x94,0xA1,0x95,0x8A,0x91, + 0x95,0x89,0x73,0x74,0x7D,0x70,0x62,0x60,0x69,0x6D,0x76,0x86,0x84,0x71,0x70,0x7F, + 0x84,0x7E,0x80,0x8B,0x8A,0x7C,0x73,0x75,0x76,0x77,0x88,0x98,0x89,0x75,0x7B,0x89, + 0x7F,0x72,0x7E,0x88,0x81,0x72,0x70,0x7F,0x81,0x79,0x8A,0x95,0x83,0x7E,0x8A,0x92, + 0x89,0x80,0x89,0x8E,0x7E,0x70,0x76,0x7F,0x7D,0x7E,0x94,0x93,0x77,0x73,0x80,0x7D, + 0x77,0x79,0x78,0x73,0x68,0x68,0x79,0x84,0x85,0x91,0xA2,0x9C,0x8C,0x87,0x82,0x75, + 0x73,0x80,0x7E,0x76,0x70,0x78,0x83,0x7E,0x7B,0x85,0x8B,0x81,0x7C,0x7A,0x79,0x89, + 0x8E,0x80,0x82,0x7D,0x75,0x7D,0x74,0x6A,0x82,0x99,0x95,0x91,0x8E,0x96,0xA3,0x9B, + 0x89,0x7C,0x83,0x78,0x6C,0x72,0x6D,0x7C,0x62,0x5D,0x73,0x70,0x7A,0x75,0x73,0x7B, + 0x8A,0x89,0x7F,0x6D,0x70,0x9C,0xA1,0x91,0x9B,0xA1,0x9E,0x9B,0x87,0x7B,0x7E,0x6E, + 0x59,0x5B,0x60,0x5F,0x66,0x5B,0x51,0x79,0x90,0x77,0x70,0x79,0x78,0x7F,0x76,0x6B, + 0x8B,0x8A,0x7C,0x8B,0x88,0x94,0xB5,0xBC,0x9E,0xA9,0xCA,0xB0,0x9B,0x97,0x88,0x8B, + 0x87,0x71,0x7F,0x8D,0x73,0x68,0x7E,0x83,0x74,0x6F,0x69,0x77,0x84,0x73,0x6D,0x72, + 0x72,0x59,0x41,0x42,0x42,0x4F,0x58,0x54,0x59,0x64,0x6B,0x6A,0x6B,0x78,0x8F,0x8D, + 0x80,0x92,0x9C,0x8F,0x86,0x90,0xAC,0xB6,0xAF,0xBB,0xD4,0xDC,0xDA,0xD5,0xD6,0xD9, + 0xCC,0xB6,0xB4,0xB5,0xA7,0x98,0x94,0x84,0x75,0x79,0x6D,0x62,0x65,0x57,0x41,0x38, + 0x2F,0x2F,0x3A,0x33,0x31,0x38,0x38,0x3C,0x40,0x42,0x4E,0x5C,0x60,0x69,0x75,0x7A, + 0x7D,0x81,0x86,0x89,0x91,0x93,0x91,0x9B,0x9F,0x9E,0xA6,0xAB,0xA8,0xA9,0xA5,0xAB, + 0xB6,0xB1,0x9F,0x90,0x8B,0x85,0x80,0x7A,0x7C,0x7C,0x6F,0x5F,0x5B,0x57,0x52,0x64, + 0x70,0x6E,0x6A,0x69,0x66,0x67,0x5C,0x53,0x59,0x5C,0x5E,0x5D,0x5E,0x5D,0x62,0x68, + 0x71,0x77,0x7A,0x88,0x8E,0x90,0x91,0x92,0x91,0x90,0xA0,0xAF,0xAA,0xA8,0xAF,0xAE, + 0xAF,0xB2,0xB4,0xBF,0xC3,0xBE,0xC0,0xC3,0xB9,0xAD,0xAB,0xAB,0xAD,0xAA,0xA3,0xA5, + 0x9B,0x85,0x7E,0x81,0x80,0x73,0x6F,0x7B,0x7B,0x66,0x5C,0x5A,0x4F,0x4D,0x54,0x59, + 0x5A,0x54,0x4D,0x53,0x54,0x49,0x4D,0x59,0x5D,0x62,0x69,0x71,0x71,0x70,0x78,0x80, + 0x82,0x86,0x8E,0x91,0x8B,0x8C,0x89,0x89,0x8F,0x8E,0x95,0xA1,0xA1,0x9D,0xA1,0xA0, + 0x9A,0x9A,0x9C,0xA0,0xA4,0xA7,0xA8,0xA6,0x9C,0x93,0x94,0x93,0x93,0x8A,0x86,0x8F, + 0x7E,0x6A,0x6B,0x69,0x5A,0x57,0x59,0x56,0x58,0x4C,0x46,0x4E,0x48,0x45,0x52,0x55, + 0x4F,0x56,0x52,0x4A,0x48,0x43,0x47,0x4F,0x52,0x56,0x68,0x6A,0x5D,0x65,0x67,0x60, + 0x64,0x6C,0x78,0x85,0x85,0x87,0x95,0x96,0x92,0xA8,0xB7,0xB9,0xC6,0xCE,0xCC,0xC9, + 0xBE,0xBF,0xC6,0xBE,0xC0,0xB9,0xB3,0xC2,0xB4,0xA1,0xA6,0x9F,0x8F,0x97,0x9C,0x96, + 0x95,0x8B,0x88,0x88,0x78,0x79,0x86,0x7E,0x7B,0x81,0x7C,0x78,0x74,0x70,0x75,0x70, + 0x73,0x78,0x76,0x81,0x74,0x65,0x72,0x72,0x6B,0x77,0x81,0x83,0x86,0x7F,0x80,0x87, + 0x7F,0x82,0x8E,0x8E,0x8E,0x94,0x94,0x8E,0x8D,0x8A,0x8A,0x8B,0x92,0x91,0x91,0xA4, + 0x97,0x87,0x95,0x8B,0x7A,0x84,0x8B,0x8C,0x8B,0x83,0x86,0x87,0x76,0x78,0x89,0x84, + 0x7E,0x85,0x84,0x7E,0x76,0x71,0x73,0x73,0x76,0x7D,0x7B,0x89,0x85,0x6A,0x6E,0x6F, + 0x60,0x62,0x68,0x67,0x6A,0x61,0x59,0x60,0x53,0x48,0x56,0x5A,0x56,0x5C,0x5C,0x5B, + 0x58,0x55,0x5A,0x5A,0x5B,0x5A,0x58,0x6F,0x6A,0x51,0x61,0x64,0x51,0x57,0x62,0x66, + 0x6C,0x68,0x6A,0x73,0x69,0x68,0x79,0x7C,0x7B,0x86,0x8D,0x8F,0x8C,0x8D,0x97,0x9A, + 0xA1,0xA8,0xAA,0xC0,0xC0,0xAB,0xB6,0xB6,0xA0,0xA3,0xB0,0xB0,0xB0,0xA9,0xA8,0xB0, + 0xA3,0x9B,0xA9,0xA4,0x9C,0xA2,0xA6,0xA5,0x9C,0x94,0x97,0x94,0x92,0x90,0x92,0xA4, + 0x9A,0x86,0x93,0x8E,0x79,0x7E,0x89,0x8D,0x90,0x8E,0x90,0x93,0x84,0x86,0x94,0x8A, + 0x82,0x85,0x83,0x81,0x78,0x6F,0x6D,0x67,0x67,0x67,0x6A,0x7C,0x70,0x60,0x73,0x6F, + 0x59,0x60,0x6A,0x6B,0x6F,0x70,0x73,0x73,0x66,0x68,0x76,0x72,0x73,0x7D,0x7F,0x80, + 0x7E,0x7C,0x7D,0x79,0x79,0x76,0x83,0x95,0x80,0x78,0x86,0x76,0x6A,0x76,0x79,0x7A, + 0x79,0x76,0x7E,0x7B,0x69,0x6D,0x75,0x6E,0x75,0x7A,0x77,0x78,0x71,0x73,0x74,0x71, + 0x73,0x71,0x83,0x91,0x7C,0x80,0x8F,0x7E,0x77,0x85,0x8B,0x8B,0x8A,0x89,0x90,0x88, + 0x7C,0x85,0x84,0x7A,0x81,0x87,0x83,0x80,0x7A,0x76,0x75,0x76,0x72,0x74,0x8C,0x86, + 0x74,0x85,0x86,0x72,0x76,0x82,0x87,0x8C,0x89,0x88,0x89,0x7D,0x7A,0x80,0x77,0x72, + 0x77,0x74,0x71,0x6E,0x67,0x64,0x65,0x64,0x60,0x72,0x7E,0x68,0x69,0x79,0x6C,0x64, + 0x70,0x75,0x79,0x7D,0x7E,0x85,0x81,0x76,0x7E,0x85,0x7E,0x85,0x8E,0x8D,0x91,0x95, + 0x95,0x92,0x92,0x8E,0x95,0xB0,0xA8,0x98,0xAA,0xA5,0x90,0x95,0x9C,0x9B,0x9D,0x9D, + 0xA2,0xA7,0x9A,0x96,0xA2,0x9D,0x9B,0xA7,0xA6,0xA3,0xA3,0x9F,0x9C,0x9C,0x98,0x92, + 0xA6,0xAE,0x96,0x99,0xA0,0x8A,0x7E,0x87,0x8A,0x87,0x85,0x83,0x86,0x79,0x6C,0x73, + 0x6F,0x62,0x66,0x6D,0x69,0x65,0x62,0x5C,0x56,0x55,0x4D,0x55,0x6B,0x59,0x4D,0x5F, + 0x53,0x3F,0x45,0x4E,0x52,0x51,0x51,0x59,0x59,0x4D,0x53,0x5D,0x55,0x57,0x60,0x5F, + 0x5F,0x5F,0x5C,0x5A,0x57,0x53,0x54,0x6F,0x73,0x5B,0x65,0x6D,0x58,0x55,0x60,0x65, + 0x68,0x69,0x71,0x7E,0x77,0x71,0x80,0x86,0x86,0x91,0x98,0x9B,0x9E,0x9D,0x9D,0x9C, + 0x9D,0x97,0xA9,0xC1,0xA9,0x9D,0xAF,0xA0,0x8D,0x95,0x9B,0x9D,0x9B,0x95,0x9B,0x9C, + 0x8D,0x8E,0x96,0x91,0x93,0x9C,0x9C,0x9D,0x9C,0x99,0x96,0x98,0x97,0x99,0xB4,0xB4, + 0xA0,0xB0,0xB3,0x9F,0x9D,0xA7,0xAE,0xAE,0xA8,0xAC,0xB2,0xA3,0x99,0xA2,0xA1,0x9B, + 0x9F,0xA2,0xA2,0x9D,0x94,0x91,0x90,0x90,0x89,0x98,0xAF,0x98,0x8C,0x9A,0x8B,0x78, + 0x7A,0x7F,0x80,0x7C,0x74,0x7A,0x7B,0x6A,0x69,0x70,0x6B,0x69,0x6C,0x6A,0x68,0x63, + 0x5E,0x5C,0x5B,0x53,0x50,0x69,0x6B,0x51,0x58,0x5D,0x48,0x41,0x47,0x4E,0x53,0x4D, + 0x4D,0x56,0x4D,0x3F,0x44,0x47,0x44,0x48,0x4C,0x50,0x52,0x4C,0x4D,0x51,0x53,0x50, + 0x5A,0x78,0x72,0x5F,0x6F,0x6F,0x61,0x64,0x6C,0x74,0x78,0x6F,0x71,0x7B,0x73,0x70, + 0x79,0x7B,0x7D,0x82,0x82,0x88,0x8C,0x87,0x8A,0x90,0x95,0x92,0xA6,0xC3,0xB6,0xB0, + 0xC0,0xB9,0xAE,0xB1,0xB5,0xC1,0xC2,0xB7,0xBC,0xC0,0xB4,0xAE,0xAD,0xAC,0xAE,0xAA, + 0xA6,0xAA,0xA3,0x9A,0x97,0x9A,0x9B,0x92,0xA6,0xB4,0x9A,0x97,0xA1,0x94,0x8F,0x91, + 0x95,0xA0,0x9D,0x94,0x9C,0xA1,0x99,0x96,0x99,0x9C,0x9F,0x9C,0x9C,0xA2,0x9D,0x94, + 0x90,0x93,0x8C,0x88,0xA2,0xA2,0x8B,0x8F,0x8C,0x7F,0x7C,0x76,0x7E,0x89,0x7E,0x75, + 0x7B,0x77,0x6D,0x6A,0x6C,0x71,0x70,0x68,0x69,0x6B,0x65,0x60,0x5F,0x68,0x5E,0x5D, + 0x7C,0x76,0x5E,0x62,0x61,0x58,0x54,0x4F,0x59,0x63,0x57,0x51,0x59,0x58,0x4F,0x4B, + 0x4B,0x4F,0x52,0x4E,0x4E,0x52,0x4F,0x4A,0x47,0x4F,0x48,0x4B,0x6C,0x66,0x54,0x5C, + 0x5D,0x59,0x5B,0x5C,0x6A,0x76,0x6C,0x68,0x70,0x73,0x73,0x72,0x73,0x7C,0x82,0x7E, + 0x7D,0x82,0x82,0x7F,0x7C,0x82,0x80,0x81,0x9D,0x9F,0x8F,0x95,0x95,0x94,0x97,0x94, + 0xA0,0xAF,0xAC,0xA6,0xAC,0xB1,0xB1,0xAC,0xA9,0xB2,0xB9,0xB5,0xAE,0xAE,0xAF,0xAB, + 0xA2,0xA5,0xA4,0x9D,0xB1,0xB5,0x9C,0x98,0x95,0x8E,0x91,0x8C,0x8C,0x99,0x96,0x89, + 0x87,0x88,0x87,0x85,0x7F,0x81,0x8D,0x8E,0x86,0x89,0x8E,0x8E,0x8A,0x88,0x8A,0x86, + 0x98,0xAA,0x97,0x8D,0x8E,0x8A,0x8A,0x81,0x7F,0x8F,0x93,0x87,0x7E,0x7F,0x82,0x80, + 0x7C,0x7C,0x85,0x87,0x7D,0x76,0x76,0x78,0x75,0x73,0x75,0x6C,0x78,0x92,0x83,0x70, + 0x72,0x72,0x72,0x6B,0x64,0x70,0x7A,0x74,0x6C,0x6B,0x6B,0x6D,0x69,0x62,0x64,0x6B, + 0x6B,0x66,0x60,0x61,0x63,0x5D,0x59,0x54,0x59,0x77,0x78,0x61,0x5C,0x5A,0x5B,0x61, + 0x5C,0x5B,0x65,0x6A,0x66,0x5F,0x5A,0x62,0x6C,0x69,0x62,0x67,0x72,0x71,0x69,0x64, + 0x6A,0x6D,0x68,0x65,0x5F,0x71,0x89,0x81,0x73,0x6D,0x6C,0x76,0x79,0x70,0x74,0x85, + 0x8E,0x8A,0x80,0x7E,0x88,0x90,0x8F,0x91,0x9C,0xA2,0xA3,0x9F,0x99,0x9A,0x9E,0xA0, + 0x9A,0x96,0xA8,0xB2,0xA6,0x96,0x88,0x8A,0x93,0x8E,0x85,0x86,0x89,0x8A,0x87,0x7D, + 0x74,0x75,0x7A,0x79,0x79,0x7A,0x80,0x85,0x81,0x7D,0x7C,0x80,0x81,0x7E,0x8E,0xA3, + 0xA1,0x99,0x8F,0x85,0x89,0x91,0x95,0x99,0x9A,0x9A,0x9D,0x9A,0x92,0x8E,0x8F,0x92, + 0x93,0x92,0x8F,0x8F,0x90,0x8D,0x8A,0x8A,0x8A,0x84,0x86,0x98,0x9D,0x97,0x93,0x85, + 0x7C,0x83,0x83,0x81,0x83,0x82,0x86,0x8B,0x87,0x7E,0x7A,0x78,0x78,0x7D,0x7D,0x7A, + 0x79,0x75,0x72,0x6F,0x6E,0x71,0x6E,0x74,0x7E,0x7A,0x74,0x70,0x67,0x68,0x6F,0x6B, + 0x67,0x65,0x62,0x64,0x66,0x68,0x6C,0x6A,0x69,0x6C,0x6E,0x6D,0x6C,0x6D,0x6F,0x6E, + 0x6E,0x6E,0x6E,0x70,0x76,0x7D,0x79,0x75,0x75,0x71,0x74,0x79,0x75,0x78,0x79,0x75, + 0x76,0x78,0x76,0x79,0x7F,0x81,0x84,0x86,0x86,0x89,0x8E,0x90,0x96,0x9B,0x99,0x98, + 0x99,0x9E,0xA1,0x9C,0x9D,0x9F,0x9B,0x9D,0x9C,0x94,0x93,0x90,0x8A,0x89,0x84,0x7E, + 0x7C,0x78,0x75,0x76,0x77,0x77,0x75,0x72,0x73,0x75,0x75,0x75,0x78,0x78,0x7B,0x7F, + 0x7B,0x7D,0x81,0x83,0x8D,0x90,0x89,0x8A,0x8B,0x89,0x8B,0x8E,0x8D,0x8D,0x8A,0x88, + 0x8A,0x8C,0x8B,0x8F,0x92,0x91,0x90,0x90,0x90,0x8F,0x8B,0x8D,0x95,0x8E,0x88,0x8D, + 0x88,0x88,0x8D,0x8B,0x8D,0x8C,0x84,0x86,0x87,0x82,0x82,0x81,0x7D,0x7C,0x7B,0x7C, + 0x7E,0x7E,0x80,0x82,0x85,0x82,0x7E,0x7E,0x7B,0x7F,0x82,0x7B,0x7B,0x77,0x6F,0x77, + 0x76,0x6D,0x70,0x71,0x6B,0x6C,0x69,0x66,0x67,0x63,0x62,0x66,0x67,0x67,0x68,0x69, + 0x69,0x6D,0x73,0x75,0x76,0x75,0x76,0x81,0x7F,0x78,0x7E,0x7C,0x7A,0x7F,0x7C,0x7C, + 0x7F,0x7A,0x7D,0x83,0x7D,0x7C,0x7E,0x7C,0x7D,0x7F,0x80,0x84,0x84,0x83,0x88,0x8D, + 0x8C,0x8D,0x90,0x8E,0x8E,0x95,0x91,0x90,0x92,0x8C,0x8F,0x95,0x8C,0x8A,0x8A,0x84, + 0x86,0x87,0x85,0x84,0x7F,0x7D,0x7F,0x7E,0x7D,0x7C,0x7D,0x7D,0x7D,0x7E,0x7E,0x7D, + 0x7C,0x7C,0x83,0x87,0x80,0x80,0x82,0x7E,0x84,0x88,0x83,0x84,0x83,0x83,0x89,0x87, + 0x85,0x88,0x85,0x83,0x82,0x84,0x88,0x88,0x87,0x89,0x8A,0x89,0x86,0x86,0x86,0x83, + 0x8A,0x91,0x89,0x87,0x89,0x83,0x87,0x88,0x82,0x85,0x83,0x7E,0x80,0x7E,0x7C,0x7C, + 0x7D,0x7F,0x80,0x81,0x81,0x83,0x84,0x83,0x83,0x85,0x84,0x83,0x85,0x83,0x86,0x8A, + 0x84,0x83,0x84,0x7C,0x81,0x85,0x7D,0x7D,0x7E,0x78,0x78,0x76,0x74,0x75,0x72,0x71, + 0x75,0x76,0x76,0x76,0x77,0x78,0x78,0x7B,0x7D,0x7D,0x7C,0x77,0x78,0x7F,0x7A,0x79, + 0x81,0x7C,0x7A,0x84,0x80,0x7D,0x7E,0x78,0x78,0x7B,0x77,0x79,0x7B,0x77,0x78,0x7B, + 0x7D,0x7E,0x7F,0x80,0x84,0x86,0x83,0x84,0x85,0x81,0x7D,0x84,0x88,0x83,0x84,0x85, + 0x83,0x87,0x86,0x81,0x82,0x7E,0x78,0x7D,0x7C,0x79,0x79,0x75,0x74,0x75,0x77,0x7B, + 0x7C,0x79,0x79,0x7D,0x7D,0x7B,0x79,0x79,0x78,0x78,0x81,0x81,0x7C,0x7E,0x7A,0x7C, + 0x82,0x7C,0x7B,0x80,0x7A,0x78,0x7D,0x7A,0x7A,0x7A,0x78,0x7B,0x7E,0x7E,0x7E,0x7F, + 0x7E,0x7F,0x83,0x84,0x84,0x85,0x87,0x86,0x8B,0x8F,0x88,0x88,0x88,0x83,0x8A,0x8C, + 0x85,0x86,0x84,0x80,0x82,0x83,0x7E,0x82,0x81,0x84,0x85,0x63,0x6A,0x86,0x8B,0x78, + 0x7D,0x97,0x78,0x77,0x88,0x84,0x86,0x90,0x9D,0x88,0x83,0x8A,0x8A,0x8A,0x82,0x8B, + 0x85,0x76,0x74,0x7A,0x7E,0x7E,0x80,0x81,0x7B,0x6E,0x74,0x77,0x75,0x77,0x7C,0x7F, + 0x7A,0x83,0x80,0x7C,0x82,0x89,0x8F,0x87,0x88,0x8D,0x83,0x88,0x8E,0x84,0x88,0x86, + 0x78,0x80,0x86,0x79,0x79,0x7B,0x70,0x78,0x7D,0x78,0x7E,0x7B,0x77,0x77,0x7C,0x7F, + 0x83,0x90,0x7B,0x6A,0x86,0x9A,0x95,0x90,0x8B,0x80,0x86,0x87,0x83,0x84,0x72,0x70, + 0x7F,0x81,0x7F,0x7A,0x74,0x7A,0x82,0x7D,0x7A,0x7B,0x74,0x72,0x80,0x7F,0x74,0x78, + 0x79,0x70,0x6E,0x83,0x8C,0x85,0x87,0x7A,0x6F,0x7C,0x7E,0x77,0x7A,0x74,0x75,0x87, + 0x86,0x84,0x8A,0x7A,0x80,0x88,0x84,0x7D,0x7E,0x86,0x84,0x85,0x7F,0x7C,0x7D,0x7A, + 0x7B,0x7C,0x8A,0x90,0x8E,0x8F,0x7D,0x78,0x81,0x7B,0x77,0x76,0x7B,0x88,0x8A,0x84, + 0x83,0x83,0x80,0x83,0x7E,0x78,0x7B,0x80,0x87,0x8F,0x87,0x82,0x82,0x7D,0x78,0x72, + 0x86,0x98,0x97,0x92,0x84,0x75,0x7E,0x85,0x72,0x73,0x7F,0x7A,0x87,0x87,0x7E,0x7C, + 0x7B,0x7E,0x7A,0x79,0x77,0x7C,0x84,0x86,0x86,0x7D,0x7E,0x81,0x79,0x77,0x77,0x8C, + 0x99,0x90,0x8A,0x80,0x7A,0x86,0x84,0x7C,0x7F,0x7F,0x7F,0x87,0x84,0x7E,0x85,0x82, + 0x82,0x81,0x7C,0x81,0x85,0x87,0x88,0x86,0x82,0x81,0x84,0x7F,0x76,0x7E,0x93,0x92, + 0x84,0x8A,0x7E,0x7C,0x8C,0x78,0x6C,0x7A,0x74,0x7C,0x86,0x79,0x7D,0x81,0x79,0x82, + 0x80,0x79,0x7F,0x80,0x82,0x7E,0x7C,0x7D,0x80,0x7A,0x77,0x74,0x7D,0x9A,0x8F,0x83, + 0x88,0x7B,0x83,0x8B,0x71,0x6F,0x75,0x75,0x88,0x80,0x76,0x85,0x87,0x8A,0x8F,0x79, + 0x78,0x88,0x82,0x7A,0x7E,0x84,0x83,0x84,0x81,0x77,0x76,0x94,0x9E,0x84,0x8B,0x87, + 0x7A,0x93,0x83,0x70,0x84,0x81,0x84,0x8C,0x79,0x7A,0x8C,0x87,0x88,0x85,0x79,0x89, + 0x88,0x7A,0x80,0x7E,0x7E,0x80,0x79,0x78,0x74,0x82,0x99,0x8A,0x81,0x8C,0x81,0x87, + 0x8A,0x6B,0x6E,0x7E,0x79,0x88,0x7E,0x6F,0x8A,0x89,0x81,0x86,0x79,0x82,0x90,0x7E, + 0x7C,0x7D,0x7A,0x83,0x7B,0x76,0x78,0x77,0x93,0x96,0x7E,0x8B,0x86,0x7E,0x8F,0x71, + 0x69,0x82,0x77,0x80,0x84,0x6F,0x85,0x91,0x84,0x89,0x81,0x82,0x8F,0x7D,0x76,0x81, + 0x83,0x86,0x80,0x77,0x7B,0x7B,0x8F,0x9B,0x81,0x8A,0x8E,0x7E,0x8D,0x7D,0x6D,0x83, + 0x75,0x74,0x81,0x6A,0x77,0x8A,0x7C,0x82,0x7F,0x78,0x87,0x80,0x76,0x7C,0x80,0x80, + 0x7B,0x74,0x74,0x73,0x80,0x97,0x85,0x82,0x8E,0x80,0x8A,0x83,0x65,0x76,0x78,0x6C, + 0x7B,0x6D,0x73,0x8F,0x84,0x7F,0x83,0x78,0x8B,0x8C,0x77,0x80,0x80,0x81,0x81,0x74, + 0x7A,0x7B,0x7D,0x98,0x93,0x82,0x8C,0x85,0x8A,0x8C,0x70,0x7A,0x82,0x75,0x83,0x7A, + 0x73,0x8D,0x86,0x7E,0x84,0x7C,0x83,0x8E,0x7E,0x79,0x82,0x79,0x79,0x74,0x77,0x7A, + 0x77,0x90,0x8F,0x7F,0x87,0x83,0x83,0x8C,0x75,0x76,0x82,0x72,0x79,0x75,0x6D,0x80, + 0x84,0x7F,0x82,0x81,0x84,0x89,0x80,0x78,0x7E,0x7F,0x7C,0x7C,0x7A,0x7A,0x77,0x89, + 0x8E,0x82,0x85,0x82,0x84,0x89,0x7C,0x75,0x80,0x77,0x78,0x7E,0x70,0x7A,0x86,0x80, + 0x85,0x85,0x7F,0x89,0x84,0x7B,0x82,0x85,0x80,0x7E,0x7D,0x79,0x76,0x7D,0x89,0x80, + 0x82,0x89,0x82,0x8B,0x85,0x76,0x7E,0x7D,0x77,0x7C,0x73,0x73,0x7E,0x7B,0x7E,0x81, + 0x7D,0x84,0x83,0x7A,0x83,0x7F,0x7B,0x7C,0x79,0x7A,0x73,0x7B,0x88,0x81,0x82,0x88, + 0x83,0x8A,0x85,0x75,0x7F,0x82,0x7B,0x7D,0x76,0x73,0x80,0x7C,0x78,0x80,0x83,0x85, + 0x89,0x82,0x7D,0x87,0x80,0x7C,0x7C,0x7A,0x7B,0x7D,0x8D,0x83,0x7F,0x89,0x87,0x8A, + 0x86,0x7F,0x83,0x83,0x7C,0x7C,0x75,0x79,0x7F,0x7B,0x7D,0x82,0x80,0x84,0x8C,0x84, + 0x83,0x85,0x80,0x80,0x80,0x7C,0x7C,0x81,0x88,0x84,0x7D,0x83,0x84,0x86,0x87,0x80, + 0x7E,0x7F,0x7B,0x7C,0x7C,0x77,0x80,0x80,0x7C,0x7E,0x7B,0x7F,0x87,0x84,0x80,0x86, + 0x84,0x82,0x7D,0x7D,0x7B,0x7E,0x87,0x81,0x80,0x84,0x83,0x88,0x86,0x7E,0x82,0x7F, + 0x7E,0x82,0x7A,0x7B,0x7E,0x80,0x7E,0x7E,0x7E,0x80,0x87,0x84,0x80,0x86,0x83,0x7D, + 0x80,0x7B,0x7A,0x84,0x85,0x7F,0x83,0x84,0x7F,0x86,0x81,0x7C,0x83,0x83,0x81,0x80, + 0x79,0x7B,0x7F,0x7B,0x7C,0x7F,0x81,0x82,0x82,0x81,0x84,0x85,0x81,0x80,0x7E,0x79, + 0x7A,0x86,0x83,0x7D,0x84,0x83,0x83,0x84,0x7F,0x81,0x87,0x82,0x7E,0x7D,0x79,0x7C, + 0x7F,0x7D,0x7F,0x7E,0x7F,0x86,0x82,0x80,0x86,0x84,0x82,0x82,0x7E,0x80,0x87,0x86, + 0x84,0x83,0x87,0x83,0x87,0x86,0x7B,0x82,0x83,0x7E,0x7C,0x77,0x7E,0x80,0x79,0x7A, + 0x7D,0x7C,0x84,0x84,0x80,0x83,0x83,0x7E,0x7F,0x7E,0x7C,0x81,0x87,0x86,0x81,0x84, + 0x84,0x88,0x86,0x7E,0x83,0x83,0x7E,0x7E,0x7F,0x7E,0x81,0x81,0x81,0x7E,0x7C,0x80, + 0x82,0x81,0x80,0x83,0x81,0x7F,0x7E,0x7E,0x7F,0x87,0x88,0x81,0x87,0x82,0x83,0x89, + 0x7F,0x7F,0x84,0x84,0x82,0x7B,0x77,0x80,0x85,0x7B,0x7B,0x7F,0x7F,0x84,0x7F,0x7D, + 0x83,0x80,0x80,0x7C,0x78,0x7C,0x8C,0x88,0x7C,0x86,0x84,0x87,0x8B,0x7A,0x79,0x84, + 0x80,0x7C,0x79,0x75,0x81,0x82,0x79,0x7A,0x7E,0x85,0x8C,0x7D,0x77,0x85,0x80,0x77, + 0x7A,0x74,0x7A,0x9B,0x8B,0x78,0x8A,0x87,0x8C,0x87,0x6E,0x7B,0x86,0x78,0x7B,0x76, + 0x78,0x8D,0x82,0x76,0x81,0x85,0x86,0x82,0x76,0x81,0x8D,0x7A,0x75,0x79,0x72,0x8D, + 0xA0,0x82,0x89,0x8F,0x84,0x88,0x71,0x6B,0x86,0x81,0x77,0x81,0x7E,0x8B,0x8E,0x72, + 0x77,0x86,0x81,0x7A,0x75,0x7F,0x8E,0x7F,0x72,0x79,0x73,0x8B,0x9C,0x7F,0x8B,0x9E, + 0x8F,0x89,0x7B,0x6D,0x88,0x7D,0x6A,0x80,0x79,0x88,0x7F,0x64,0x75,0x6B,0x72,0x82, + 0x69,0x7A,0x8A,0x6C,0x65,0x66,0x6B,0x88,0x95,0x87,0x86,0x8A,0x7D,0x79,0x70,0x6F, + 0x88,0x86,0x82,0x8E,0x87,0x86,0x86,0x76,0x7F,0x8C,0x7C,0x7D,0x8F,0x94,0x8B,0x7B, + 0x88,0x97,0x89,0xA0,0xB8,0x94,0x9B,0xAC,0x91,0x8D,0x8F,0x8C,0x98,0x99,0x92,0x90, + 0x7E,0x7C,0x7E,0x6E,0x81,0x91,0x7C,0x78,0x7C,0x78,0x70,0x54,0x53,0x68,0x61,0x73, + 0x88,0x71,0x6A,0x67,0x53,0x52,0x4D,0x50,0x6A,0x6E,0x64,0x69,0x68,0x66,0x65,0x5C, + 0x6A,0x76,0x71,0x76,0x82,0x7B,0x71,0x6D,0x75,0x78,0x69,0x82,0x95,0x7E,0x7D,0x78, + 0x6A,0x6A,0x65,0x71,0x8B,0x8A,0x88,0x94,0x98,0xA1,0xA6,0x9B,0xA2,0xA8,0x9A,0x99, + 0xA0,0x96,0x8D,0x86,0x86,0x86,0x83,0xA1,0xA8,0x8A,0x89,0x85,0x7C,0x7A,0x75,0x84, + 0x98,0x8E,0x86,0x90,0x8B,0x83,0x7F,0x7F,0x8D,0x91,0x8A,0x92,0x97,0x8B,0x83,0x83, + 0x86,0x80,0x85,0xA2,0x9A,0x8B,0x94,0x8D,0x82,0x7A,0x7D,0x93,0x9C,0x91,0x97,0xA0, + 0x9A,0x92,0x89,0x90,0x9C,0x97,0x94,0x9B,0x93,0x83,0x7E,0x81,0x7D,0x71,0x85,0x9A, + 0x86,0x7E,0x80,0x75,0x6A,0x5D,0x62,0x75,0x6F,0x61,0x66,0x68,0x5B,0x51,0x4E,0x56, + 0x58,0x4F,0x53,0x5F,0x59,0x4F,0x51,0x56,0x50,0x4E,0x6E,0x77,0x63,0x6A,0x70,0x63, + 0x5C,0x5D,0x70,0x7F,0x72,0x71,0x7B,0x73,0x63,0x5F,0x66,0x6B,0x6B,0x67,0x70,0x77, + 0x71,0x6F,0x7B,0x83,0x7B,0x90,0xB5,0xAE,0xA5,0xAF,0xA7,0x99,0x8F,0x92,0xA7,0xA3, + 0x93,0x9B,0x9E,0x8F,0x86,0x85,0x88,0x86,0x81,0x88,0x92,0x8D,0x83,0x83,0x88,0x82, + 0x79,0x99,0xA8,0x8E,0x94,0x9A,0x8C,0x82,0x80,0x8F,0x9D,0x8F,0x90,0xA1,0x95,0x86, + 0x88,0x8C,0x93,0x92,0x8F,0x9C,0x9C,0x90,0x8C,0x8F,0x95,0x8B,0x8E,0xB2,0xAC,0x94, + 0xA3,0xA2,0x92,0x8B,0x8B,0x98,0x99,0x87,0x8A,0x94,0x83,0x7B,0x7F,0x81,0x82,0x79, + 0x7A,0x81,0x77,0x6B,0x68,0x68,0x62,0x53,0x66,0x7C,0x60,0x57,0x66,0x54,0x46,0x49, + 0x54,0x64,0x5D,0x55,0x67,0x65,0x54,0x57,0x60,0x65,0x65,0x64,0x71,0x76,0x68,0x69, + 0x70,0x70,0x69,0x64,0x7F,0x83,0x64,0x6B,0x78,0x64,0x5D,0x66,0x75,0x80,0x75,0x7C, + 0x94,0x8D,0x83,0x93,0x9D,0xA0,0xA4,0xA6,0xB2,0xAD,0x9D,0x9F,0x9E,0x97,0x8D,0x92, + 0xB0,0xA4,0x8B,0x9A,0x97,0x7D,0x7A,0x82,0x8D,0x8E,0x80,0x8D,0x9A,0x83,0x7C,0x8B, + 0x8C,0x88,0x89,0x8F,0x97,0x8E,0x87,0x8B,0x8A,0x85,0x7E,0x8A,0xAB,0x99,0x87,0xA3, + 0x9D,0x83,0x84,0x8D,0x93,0x92,0x89,0x99,0xA3,0x8C,0x89,0x98,0x92,0x8E,0x93,0x98, + 0x9C,0x92,0x89,0x8D,0x85,0x80,0x7A,0x80,0x9F,0x8C,0x73,0x8C,0x82,0x63,0x69,0x72, + 0x71,0x6D,0x63,0x6B,0x73,0x5C,0x54,0x60,0x58,0x52,0x57,0x5D,0x62,0x5A,0x57,0x5E, + 0x55,0x55,0x55,0x56,0x7A,0x72,0x58,0x73,0x74,0x54,0x56,0x64,0x68,0x6B,0x65,0x6D, + 0x79,0x64,0x5B,0x6A,0x67,0x62,0x6A,0x6F,0x76,0x74,0x70,0x79,0x7A,0x7B,0x7C,0x81, + 0xA8,0xA9,0x92,0xAD,0xB4,0x97,0x97,0xA1,0xA1,0xA4,0x9A,0x9E,0xAD,0x99,0x89,0x98, + 0x93,0x86,0x8A,0x8E,0x8F,0x8A,0x82,0x86,0x82,0x7A,0x7F,0x7C,0x92,0xA0,0x86,0x8E, + 0x9E,0x83,0x76,0x86,0x8B,0x8D,0x89,0x88,0x97,0x90,0x7E,0x8A,0x91,0x88,0x89,0x90, + 0x90,0x90,0x90,0x92,0x8F,0x8B,0x8D,0x84,0x97,0xB0,0x94,0x91,0xA7,0x93,0x7E,0x88, + 0x8A,0x89,0x86,0x82,0x8D,0x8A,0x76,0x78,0x7E,0x74,0x72,0x75,0x78,0x77,0x71,0x6F, + 0x6C,0x65,0x64,0x5C,0x61,0x7D,0x6D,0x59,0x71,0x6A,0x4E,0x56,0x63,0x62,0x62,0x5F, + 0x66,0x71,0x63,0x5C,0x67,0x65,0x61,0x65,0x6D,0x72,0x6E,0x6D,0x70,0x6B,0x67,0x65, + 0x63,0x7C,0x83,0x69,0x76,0x84,0x6B,0x64,0x76,0x7B,0x7E,0x80,0x88,0x99,0x94,0x8A, + 0x97,0xA2,0x9D,0x9C,0xA3,0xA7,0xA1,0x9D,0x9D,0x9A,0x94,0x94,0x8B,0x95,0xAB,0x94, + 0x8D,0xA1,0x8E,0x78,0x80,0x86,0x85,0x83,0x82,0x8D,0x8D,0x7F,0x7F,0x88,0x85,0x83, + 0x89,0x8E,0x8D,0x88,0x85,0x87,0x83,0x82,0x81,0x86,0xA2,0x9D,0x89,0x98,0x9A,0x84, + 0x80,0x8A,0x90,0x90,0x8A,0x8E,0x98,0x8E,0x84,0x8D,0x8F,0x87,0x85,0x8A,0x8D,0x8A, + 0x84,0x85,0x82,0x7B,0x77,0x71,0x85,0x92,0x78,0x78,0x87,0x73,0x63,0x67,0x6F,0x71, + 0x6A,0x68,0x72,0x6D,0x5D,0x60,0x68,0x66,0x65,0x68,0x6C,0x6C,0x66,0x66,0x68,0x65, + 0x63,0x5F,0x6E,0x84,0x70,0x67,0x7B,0x72,0x60,0x64,0x6C,0x70,0x6C,0x69,0x74,0x77, + 0x6C,0x6B,0x72,0x72,0x71,0x74,0x7C,0x83,0x82,0x81,0x87,0x8B,0x8C,0x88,0x95,0xB4, + 0xAB,0x98,0xA9,0xA7,0x93,0x91,0x97,0x9E,0x9E,0x92,0x93,0x9B,0x8E,0x85,0x8B,0x8C, + 0x89,0x83,0x83,0x89,0x86,0x7E,0x7E,0x83,0x82,0x7A,0x7C,0x97,0x92,0x7D,0x8D,0x91, + 0x7E,0x79,0x80,0x88,0x8B,0x82,0x85,0x92,0x8D,0x83,0x83,0x8B,0x8C,0x88,0x89,0x90, + 0x92,0x8A,0x88,0x89,0x8A,0x85,0x84,0x9E,0xA2,0x87,0x8C,0x94,0x81,0x7A,0x7D,0x83, + 0x89,0x80,0x7A,0x82,0x80,0x73,0x72,0x77,0x77,0x74,0x72,0x72,0x74,0x71,0x69,0x65, + 0x69,0x66,0x60,0x76,0x81,0x68,0x6E,0x76,0x64,0x5F,0x61,0x76,0x74,0x72,0x6C,0x56, + 0x6C,0x68,0x51,0x52,0x63,0x6D,0x70,0x76,0x7B,0x7B,0x73,0x7B,0x88,0x86,0x7D,0x9A, + 0xA9,0x85,0x81,0x7C,0x6E,0x7B,0x6C,0x62,0x7B,0x7D,0x69,0x6A,0x6E,0x69,0x7B,0x85, + 0x89,0x7F,0x7F,0x90,0x90,0x91,0x94,0x98,0xA9,0xAC,0x97,0xB3,0xC7,0xB6,0xC7,0xA4, + 0xA9,0xB5,0x95,0xAF,0xA8,0xA4,0xAD,0x9D,0x94,0x87,0x82,0x8E,0x83,0x75,0x7B,0x68, + 0x70,0x7D,0x6D,0x80,0x7D,0x68,0x71,0x7D,0x84,0x77,0x5C,0x5B,0x61,0x59,0x5A,0x66, + 0x6B,0x65,0x5F,0x6B,0x78,0x75,0x82,0x80,0x8F,0xA0,0x95,0x8D,0x91,0x91,0x8C,0x94, + 0xA1,0xA5,0xAC,0xB2,0xAD,0xA7,0xA1,0xA2,0x91,0x8A,0x87,0x87,0x8D,0x79,0x77,0x75, + 0x6B,0x65,0x63,0x6F,0x6B,0x5E,0x4D,0x40,0x47,0x4F,0x47,0x36,0x3D,0x43,0x42,0x56, + 0x54,0x5A,0x62,0x5B,0x62,0x62,0x66,0x7D,0x87,0x78,0x76,0x74,0x7E,0x89,0x82,0x8A, + 0x8E,0x91,0xA0,0x9A,0xAD,0xBA,0xAC,0xBA,0xBD,0xA8,0xB9,0xB8,0x91,0xA3,0xA1,0x90, + 0xA1,0x92,0x8C,0x94,0x86,0x7F,0x8C,0x88,0x7C,0x75,0x66,0x74,0x73,0x66,0x65,0x66, + 0x74,0x69,0x61,0x59,0x50,0x67,0x6E,0x6B,0x62,0x5A,0x6F,0x74,0x66,0x73,0x72,0x76, + 0x87,0x78,0x85,0x90,0x8E,0x96,0x92,0x9F,0xA9,0xB1,0xB2,0xAB,0xC4,0xC7,0xBD,0xC9, + 0xC0,0xBC,0xC5,0xC2,0xBD,0xB5,0xAE,0x9C,0x8B,0x85,0x80,0x8E,0x7E,0x6F,0x82,0x81, + 0x78,0x63,0x47,0x46,0x54,0x5D,0x5D,0x54,0x4A,0x47,0x48,0x40,0x3C,0x51,0x58,0x4A, + 0x41,0x44,0x4A,0x4E,0x55,0x4E,0x63,0x7B,0x74,0x68,0x58,0x5C,0x6D,0x70,0x79,0x83, + 0x8C,0x9B,0x92,0x7D,0x80,0x8B,0x8B,0x94,0xA5,0xA5,0xA7,0xA9,0xAB,0xB5,0xB8,0xB9, + 0xBE,0xBC,0xC0,0xC3,0xB2,0xA2,0x92,0x95,0xAA,0xB3,0xA6,0x95,0x8B,0x8A,0x84,0x81, + 0x7E,0x78,0x71,0x6C,0x77,0x71,0x69,0x4E,0x4B,0x59,0x56,0x5D,0x53,0x4D,0x59,0x5D, + 0x51,0x42,0x45,0x4D,0x4C,0x58,0x5A,0x4B,0x5A,0x5D,0x57,0x66,0x6A,0x74,0x7D,0x81, + 0x8E,0x9C,0x9E,0x9F,0xA3,0xAC,0xBC,0xB6,0xB8,0xC1,0xCB,0xCD,0xC7,0xC4,0xBB,0xC0, + 0xC5,0xBD,0xAF,0xAC,0xAB,0xA7,0xA3,0x9A,0x9F,0xA1,0x91,0x91,0x95,0x93,0x8A,0x83, + 0x79,0x6B,0x6D,0x69,0x67,0x65,0x5F,0x5D,0x57,0x4F,0x4B,0x58,0x56,0x49,0x48,0x4F, + 0x5B,0x63,0x66,0x58,0x4F,0x56,0x56,0x5E,0x65,0x60,0x63,0x63,0x5E,0x5A,0x61,0x67, + 0x56,0x5B,0x63,0x64,0x6E,0x67,0x68,0x6A,0x6C,0x76,0x78,0x82,0x8B,0x88,0x88,0x86, + 0x8C,0x96,0x96,0xAB,0xBC,0xB9,0xBA,0xBC,0xB3,0xAA,0xAA,0xA1,0xAC,0xBC,0xB8,0xB9, + 0xA8,0x9D,0xA0,0xA7,0xA5,0x8F,0x87,0x91,0x97,0x90,0x86,0x88,0x8A,0x87,0x82,0x7B, + 0x8A,0x83,0x6F,0x6A,0x5E,0x69,0x74,0x71,0x75,0x84,0x83,0x7B,0x7B,0x6C,0x71,0x7C, + 0x74,0x71,0x6F,0x72,0x6F,0x69,0x60,0x5A,0x5E,0x61,0x64,0x72,0x81,0x86,0x75,0x66, + 0x6E,0x71,0x77,0x78,0x7C,0x8D,0x8A,0x84,0x7B,0x76,0x84,0x8D,0x92,0x98,0x92,0x97, + 0x99,0x8E,0x8D,0x85,0x90,0x8D,0x7E,0x97,0x9B,0x9A,0xA0,0x86,0x7E,0x88,0x85,0x8B, + 0x93,0x84,0x7D,0x82,0x76,0x7C,0x83,0x71,0x6E,0x6E,0x6F,0x7F,0x7A,0x71,0x68,0x59, + 0x65,0x63,0x5F,0x75,0x80,0x7C,0x74,0x6F,0x70,0x7A,0x79,0x72,0x7C,0x7F,0x81,0x89, + 0x8B,0x84,0x7C,0x77,0x79,0x7D,0x92,0x9B,0x8D,0x83,0x75,0x82,0x85,0x78,0x76,0x6F, + 0x74,0x78,0x7E,0x77,0x72,0x7D,0x79,0x77,0x85,0x83,0x7D,0x85,0x86,0x90,0x8E,0x89, + 0x93,0x97,0x92,0x8F,0x97,0x96,0x93,0x94,0x92,0x8A,0x84,0x8B,0x88,0x88,0x91,0x8B, + 0x80,0x91,0x90,0x87,0x94,0x90,0x94,0x9C,0x97,0x97,0x93,0x87,0x85,0x8A,0x8F,0x8F, + 0x86,0x7C,0x7E,0x88,0x94,0x8E,0x85,0x8C,0x85,0x7F,0x87,0x7C,0x6E,0x7A,0x7B,0x79, + 0x7B,0x72,0x6D,0x75,0x78,0x75,0x6E,0x6D,0x79,0x7C,0x7B,0x71,0x63,0x67,0x64,0x5E, + 0x5D,0x52,0x57,0x63,0x67,0x66,0x64,0x5C,0x5B,0x6A,0x64,0x65,0x67,0x54,0x55,0x61, + 0x66,0x6D,0x6B,0x6A,0x6D,0x72,0x7F,0x81,0x75,0x73,0x78,0x79,0x7A,0x7C,0x7D,0x80, + 0x87,0x89,0x8F,0x8D,0x8D,0x99,0x95,0x8A,0x86,0x84,0x89,0x9A,0x9F,0x95,0x94,0x92, + 0x8F,0x9C,0xA3,0x9D,0x97,0x92,0x97,0x98,0x8D,0x82,0x80,0x85,0x91,0x94,0x93,0x90, + 0x88,0x97,0x9F,0x97,0x99,0x91,0x8F,0x93,0x94,0x8E,0x86,0x8D,0x91,0x8F,0x93,0x94, + 0x96,0x95,0x8E,0x8A,0x84,0x7B,0x79,0x7D,0x7F,0x7D,0x7E,0x81,0x81,0x85,0x8A,0x87, + 0x84,0x82,0x76,0x77,0x7B,0x79,0x73,0x6C,0x72,0x6F,0x6C,0x6C,0x6B,0x71,0x72,0x6D, + 0x62,0x5E,0x5C,0x62,0x6A,0x5B,0x5C,0x60,0x59,0x61,0x69,0x64,0x66,0x68,0x6C,0x74, + 0x6F,0x6A,0x65,0x64,0x64,0x68,0x69,0x61,0x62,0x6C,0x74,0x74,0x77,0x77,0x75,0x82, + 0x8B,0x82,0x7A,0x82,0x82,0x86,0x92,0x91,0x93,0x94,0x99,0x97,0x8D,0x8C,0x87,0x8C, + 0x8D,0x89,0x91,0x87,0x83,0x91,0x98,0x9C,0x9B,0x95,0x95,0x9B,0x9F,0x9A,0x96,0x96, + 0x98,0xA1,0x9F,0x9B,0x99,0x9C,0xA1,0x9D,0x98,0x92,0x95,0x96,0x97,0x93,0x8A,0x90, + 0x92,0x92,0x92,0x94,0x91,0x8E,0x8D,0x8A,0x96,0x95,0x92,0x90,0x88,0x8A,0x8E,0x8A, + 0x89,0x8B,0x89,0x83,0x82,0x83,0x80,0x81,0x82,0x7C,0x7D,0x81,0x82,0x7C,0x73,0x75, + 0x72,0x72,0x75,0x72,0x6D,0x6B,0x78,0x71,0x6B,0x76,0x6C,0x6B,0x6B,0x66,0x66,0x5C, + 0x5D,0x5A,0x56,0x5C,0x59,0x57,0x54,0x5A,0x5C,0x5C,0x60,0x5C,0x64,0x69,0x68,0x69, + 0x64,0x62,0x70,0x75,0x6F,0x6F,0x65,0x67,0x73,0x76,0x77,0x73,0x6C,0x6F,0x74,0x73, + 0x71,0x6D,0x69,0x6E,0x78,0x7D,0x80,0x83,0x85,0x8C,0x91,0x8D,0x8F,0x8F,0x8E,0x98, + 0x9A,0x95,0x94,0x8F,0x93,0x9A,0x96,0x97,0x98,0x8F,0x93,0x9D,0x97,0x92,0x95,0x96, + 0x98,0xA2,0xA0,0x98,0x9C,0x9E,0xA4,0xA8,0xA1,0x9B,0x98,0x9C,0xA8,0xA6,0x9E,0x98, + 0x90,0x93,0x9A,0x98,0x95,0x91,0x8A,0x91,0x90,0x8F,0x93,0x8D,0x93,0x98,0x99,0x9B, + 0x97,0x90,0x8E,0x8E,0x8A,0x88,0x81,0x7D,0x8B,0x94,0x96,0x93,0x86,0x7D,0x7C,0x7E, + 0x78,0x6F,0x68,0x5D,0x68,0x6F,0x6C,0x72,0x6F,0x71,0x79,0x7B,0x73,0x6C,0x6D,0x6E, + 0x6F,0x6A,0x68,0x64,0x66,0x74,0x7B,0x7E,0x7D,0x6B,0x65,0x68,0x64,0x62,0x5A,0x50, + 0x54,0x60,0x6A,0x6C,0x69,0x68,0x65,0x68,0x64,0x64,0x65,0x64,0x63,0x5F,0x65,0x61, + 0x64,0x75,0x7D,0x80,0x81,0x7B,0x72,0x73,0x6F,0x6B,0x6E,0x6B,0x6E,0x7C,0x81,0x86, + 0x88,0x83,0x89,0x8A,0x89,0x92,0x8E,0x8C,0x90,0x87,0x8B,0x8C,0x83,0x91,0x9B,0x99, + 0x9B,0x94,0x86,0x89,0x89,0x87,0x8D,0x87,0x87,0x93,0x92,0x94,0x9A,0x97,0x9F,0x9E, + 0x9A,0x9C,0x97,0x95,0x93,0x8B,0x8F,0x92,0x8D,0x94,0xA1,0xA6,0xA5,0xA1,0x92,0x8F, + 0x91,0x88,0x87,0x83,0x7C,0x85,0x86,0x84,0x8B,0x84,0x8D,0x93,0x8C,0x88,0x82,0x81, + 0x83,0x82,0x84,0x8A,0x81,0x7B,0x89,0x8F,0x93,0x93,0x81,0x7D,0x87,0x7D,0x79,0x72, + 0x68,0x73,0x7C,0x78,0x7C,0x79,0x7B,0x8A,0x85,0x7F,0x7D,0x75,0x74,0x77,0x72,0x73, + 0x73,0x66,0x6B,0x7C,0x7E,0x82,0x7A,0x6A,0x74,0x73,0x6B,0x68,0x5C,0x61,0x70,0x75, + 0x73,0x70,0x6E,0x79,0x80,0x7C,0x78,0x74,0x74,0x7A,0x7D,0x7D,0x7F,0x7A,0x72,0x7A, + 0x86,0x88,0x8B,0x82,0x76,0x7A,0x7B,0x74,0x6C,0x66,0x6E,0x78,0x79,0x73,0x72,0x76, + 0x81,0x86,0x81,0x7B,0x75,0x7B,0x80,0x79,0x7A,0x7A,0x7D,0x7A,0x74,0x80,0x84,0x87, + 0x83,0x79,0x7B,0x80,0x7C,0x7B,0x79,0x78,0x7F,0x7F,0x7A,0x7B,0x80,0x81,0x86,0x86, + 0x81,0x81,0x84,0x84,0x85,0x7F,0x81,0x85,0x82,0x7F,0x79,0x81,0x85,0x88,0x87,0x81, + 0x83,0x84,0x80,0x7D,0x79,0x7C,0x7F,0x81,0x85,0x84,0x84,0x8A,0x8B,0x89,0x8B,0x8A, + 0x89,0x8A,0x89,0x8B,0x88,0x85,0x85,0x82,0x84,0x86,0x85,0x83,0x85,0x83,0x84,0x82, + 0x7D,0x7D,0x7D,0x7D,0x7A,0x7D,0x80,0x80,0x85,0x84,0x83,0x84,0x82,0x88,0x8A,0x88, + 0x8A,0x86,0x84,0x89,0x85,0x81,0x83,0x82,0x83,0x86,0x83,0x81,0x7F,0x80,0x7F,0x7D, + 0x81,0x7E,0x7D,0x7E,0x7C,0x80,0x84,0x81,0x80,0x83,0x84,0x86,0x82,0x82,0x83,0x81, + 0x84,0x82,0x7F,0x7F,0x82,0x83,0x80,0x80,0x81,0x81,0x81,0x80,0x7F,0x81,0x81,0x7F, + 0x7F,0x80,0x7A,0x7B,0x7C,0x7B,0x80,0x7E,0x7E,0x7F,0x7E,0x80,0x82,0x83,0x80,0x7E, + 0x83,0x84,0x82,0x81,0x80,0x80,0x81,0x82,0x81,0x80,0x82,0x80,0x81,0x81,0x7C,0x80, + 0x82,0x81,0x80,0x7F,0x82,0x81,0x80,0x7E,0x80,0x7F,0x7D,0x7D,0x7F,0x80,0x7E,0x7D, + 0x7D,0x7D,0x7D,0x7F,0x7C,0x7B,0x7E,0x7E,0x7F,0x7C,0x7B,0x7D,0x7D,0x7E,0x7D,0x7F, + 0x7F,0x7F,0x80,0x7F,0x81,0x80,0x81,0x81,0x7F,0x80,0x81,0x81,0x7F,0x7E,0x80,0x7E, + 0x7D,0x7E,0x7F,0x81,0x80,0x80,0x7F,0x7F,0x81,0x82,0x83,0x80,0x81,0x81,0x81,0x82, + 0x80,0x7F,0x81,0x82,0x80,0x81,0x81,0x80,0x7F,0x81,0x83,0x81,0x81,0x82,0x82,0x7F, + 0x7D,0x80,0x80,0x80,0x82,0x82,0x7E,0x80,0x81,0x7E,0x7F,0x80,0x7E,0x7D,0x7F,0x7C, + 0x7C,0x7C,0x7B,0x7C,0x7C,0x7F,0x7E,0x7C,0x7C,0x7E,0x7F,0x7E,0x7F,0x7F,0x7F,0x81, + 0x82,0x85,0x85,0x83,0x85,0x85,0x85,0x84,0x83,0x85,0x85,0x82,0x82,0x81,0x80,0x81, + 0x81,0x81,0x80,0x81,0x82,0x7F,0x7F,0x80,0x81,0x7F,0x80,0x84,0x7F,0x7F,0x81,0x80, + 0x81,0x82,0x83,0x82,0x81,0x81,0x82,0x82,0x82,0x82,0x80,0x81,0x83,0x82,0x82,0x84, + 0x83,0x83,0x83,0x83,0x84,0x80,0x80,0x81,0x83,0x82,0x82,0x84,0x82,0x7F,0x7F,0x82, + 0x81,0x81,0x80,0x7D,0x80,0x7C,0x80,0x81,0x7E,0x7F,0x7E,0x81,0x81,0x82,0x7F,0x7E, + 0x81,0x81,0x82,0x81,0x81,0x80,0x80,0x81,0x81,0x81,0x80,0x80,0x80,0x7F,0x80,0x80, + 0x7D,0x7F,0x80,0x7F,0x7E,0x7D,0x7F,0x7F,0x81,0x80,0x7D,0x7F,0x7E,0x7F,0x80,0x80, + 0x80,0x80,0x80,0x82,0x81,0x80,0x82,0x82,0x82,0x84,0x82,0x81,0x81,0x7F,0x82,0x83, + 0x83,0x82,0x80,0x81,0x80,0x80,0x81,0x80,0x81,0x81,0x80,0x81,0x80,0x7F,0x7F,0x7F, + 0x80,0x81,0x80,0x80,0x80,0x80,0x7F,0x7F,0x81,0x7D,0x7E,0x81,0x7F,0x7F,0x81,0x80, + 0x80,0x7F,0x81,0x7F,0x7F,0x82,0x7E,0x80,0x7F,0x7E,0x80,0x7D,0x7F,0x7E,0x7F,0x82, + 0x80,0x7F,0x7E,0x7C,0x80,0x80,0x7E,0x81,0x7E,0x80,0x80,0x7D,0x7F,0x7E,0x80,0x80, + 0x81,0x81,0x7D,0x80,0x7F,0x80,0x82,0x80,0x81,0x80,0x81,0x82,0x81,0x80,0x81,0x82, + 0x83,0x80,0x81,0x81,0x80,0x81,0x81,0x82,0x7F,0x80,0x7F,0x7F,0x81,0x7F,0x7E,0x80, + 0x80,0x7E,0x7D,0x7E,0x7C,0x7E,0x7F,0x80,0x80,0x7B,0x7E,0x7F, +}; diff --git a/boop/trunk/betty.cfg b/boop/trunk/betty.cfg new file mode 100644 index 0000000..77e37d7 --- /dev/null +++ b/boop/trunk/betty.cfg @@ -0,0 +1,110 @@ +# OpenOCD config file for Betty remote control +# http://bettyhacks.com/forum/index.php?topic=160.0 + +if { [info exists CHIPNAME] } { + set _CHIPNAME $CHIPNAME +} else { + set _CHIPNAME lpc2220 +} + +if { [info exists ENDIAN] } { + set _ENDIAN $ENDIAN +} else { + set _ENDIAN little +} + +if { [info exists CPUTAPID ] } { + set _CPUTAPID $CPUTAPID +} else { + set _CPUTAPID 0x4f1f0f0f +} + +#coonfigure reset options +jtag_nsrst_delay 50 +jtag_ntrst_delay 50 + +#use combined on interfaces or targets that can't set TRST/SRST separately +reset_config trst_and_srst srst_pulls_trst trst_push_pull srst_push_pull + +jtag_khz 1000 + +#jtag scan chain +jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID + +set _TARGETNAME $_CHIPNAME.cpu +target create $_TARGETNAME arm7tdmi -endian $_ENDIAN -chain-position $_TARGETNAME -variant arm7tdmi + +# Event handlers +$_TARGETNAME configure -event reset-start {jtag_khz 1000} +$_TARGETNAME configure -event reset-init {betty_init} + +arm7_9 dcc_downloads enable + +$_TARGETNAME configure -work-area-phys 0x40000000 -work-area-size 0x10000 -work-area-backup 0 + +#flash bank [ ] +set _FLASHNAME $_CHIPNAME.flash +flash bank $_FLASHNAME cfi 0x80000000 0x00100000 2 2 $_TARGETNAME +flash bank $_FLASHNAME cfi 0x82000000 0x00100000 2 2 $_TARGETNAME + +arm7_9 fast_memory_access enable + +proc betty_init { } { + # setup PLL + # PLLCON: Enable PLL, connect PLL + mww 0xe01fc080 0x03 + # VBPDIV: no division + mww 0xe01fc100 0x02 + # PLLCFG: 0x42 = psel = 10 (4) = msel= 00010 (3) = 240 mhz Fcco*/ + mww 0xe01fc084 0x42 + # Activate PLL settings + #mww 0xe01fc08c 0xaa + #mww 0xe01fc08c 0x55 + #sleep 100 + + # Memory Bank Configuration + # BCFG0: 16bit, rble, 2wst - 30 mhz : Betty: FLASH 0 @ 0x80000000 + mww 0xffe00000 0x10000420 + # BCFG2: 16bit, rble, 2wst - 30 mhz : Betty: FLASH 1 @ 0x82000000 + mww 0xffe00008 0x10000420 + + # BCFG1: 8 bit, 3 sram wst, rble, 5 wst 3 idcy : Betty: LCD @ 0x81000000 + #mww 0xffe00004 0x00000400 + + # GPIO Pin COnfiguration for Flash access + # PINSEL0: + mww 0xe002c000 0x00008005 + # PINSEL1: + mww 0xe002c004 0x00000000 + # PINSEL2: + mww 0xe002c014 0x0de049d4 + + # IO2SET: Set Outputs + mww 0xe0028024 0x1FC0000 + # IO2DIR: Set Direction + mww 0xe0028028 0x1FC0000 + + # IO0DIR: + mww 0xe0028008 0x002018D0 + + # disable watchdog + #mww 0xfffffd44 0x00008000 + # enable user reset + #mww 0xfffffd08 0xa5000001 +} + +proc flash_boop {IMAGE} { + reset init + flash erase_sector 0 0 last + flash write_bank 0 $IMAGE 0 + reset run +} + +proc start_debug {} { + reset halt + mwb 0xE000C01C 0x01 + resume +} + +# For more information about the configuration files, take a look at: +# openocd.texi diff --git a/boop/trunk/boop_rom.bin b/boop/trunk/boop_rom.bin new file mode 100644 index 0000000000000000000000000000000000000000..07d71ad42b3fb39c52a7820db9c2a9ab487fb462 GIT binary patch literal 268208 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 + + 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 3 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 "buffer.h" +#include "global.h" +#include "irq.h" + +void cBufferInit(struct cBuffer_ *buffer, unsigned char *start, unsigned short size) { + + unsigned cpsr; + cpsr = disableIRQ(); + + buffer->data = start; + buffer->size = size; + buffer->len = 0; + buffer->index = 0; + + restoreIRQ(cpsr); +} + +void cBufferFlush(struct cBuffer_ *buffer) { + + unsigned cpsr; + cpsr = disableIRQ(); + + buffer->len = 0; + buffer->index = 0; + + restoreIRQ(cpsr); +} + +unsigned char cBufferAdd(struct cBuffer_ *buffer, unsigned char data) { + + unsigned cpsr; + cpsr = disableIRQ(); + + if(buffer->size > buffer->len) { + buffer->data[(buffer->index + buffer->len++) % buffer->size] = data; + restoreIRQ(cpsr); + return 1; + } + restoreIRQ(cpsr); + return 0; + +} + +unsigned short cBufferAddBuffer(struct cBuffer_ *buffer, unsigned char* data, unsigned short len) { + + unsigned short lenw; + unsigned short start; + unsigned short end; + + unsigned cpsr; + cpsr = disableIRQ(); + + lenw = 0; + + if(buffer->size > buffer->len) { + start = (buffer->index + buffer->len) % buffer->size; + if(buffer->index) + end = buffer->index; + else + end = buffer->size; + + if(end <= start) { + if(buffer->size - start < len) { + lenw = buffer->size - start; + memcpy(&buffer->data[start],data,lenw); + } + else { + memcpy(&buffer->data[start],data,len); + buffer->len += len; + restoreIRQ(cpsr); + return len; + } + start = 0; + } + + if(end - start < len - lenw) { + memcpy(&buffer->data[start],&data[lenw],end - start); + buffer->len = buffer->size; + restoreIRQ(cpsr); + return lenw + end - start; + } + else { + memcpy(&buffer->data[start],&data[lenw],len-lenw); + buffer->len += len; + restoreIRQ(cpsr); + return len; + } + } + restoreIRQ(cpsr); + return 0; + +} + +unsigned char cBufferGet(struct cBuffer_ *buffer) { + + unsigned char data = 0; + + unsigned cpsr; + cpsr = disableIRQ(); + + if(buffer->len) { + data = buffer->data[buffer->index++]; + buffer->index %= buffer->size; + buffer->len--; + } + restoreIRQ(cpsr); + return data; +} + +unsigned short cBufferGetBuffer(struct cBuffer_ *buffer, unsigned char* data, unsigned short len) { + + unsigned cpsr; + cpsr = disableIRQ(); + + if(buffer->len) { + if(len > buffer->len) + len = buffer->len; + + if(buffer->index + len <= buffer->size) { + memcpy(data,&buffer->data[buffer->index],len); + } + else { + memcpy(data,&buffer->data[buffer->index],buffer->size - buffer->index); + memcpy(&data[buffer->size - buffer->index],buffer->data,len - (buffer->size - buffer->index)); + } + buffer->index = (buffer->index + len) % buffer->size; + buffer->len -= len; + restoreIRQ(cpsr); + return len; + + } + restoreIRQ(cpsr); + return 0; + +} diff --git a/boop/trunk/buffer.h b/boop/trunk/buffer.h new file mode 100644 index 0000000..da19c07 --- /dev/null +++ b/boop/trunk/buffer.h @@ -0,0 +1,35 @@ +/* + buffer.h - functions for buffers + Copyright (C) 2008 Telekatz + + 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 3 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 BUFFER_H +#define BUFFER_H + +struct cBuffer_ { + unsigned char* data; + unsigned short size; + unsigned short len; + unsigned short index; +}; + +void cBufferInit(struct cBuffer_ *buffer, unsigned char *start, unsigned short size); +void cBufferFlush(struct cBuffer_ *buffer); +unsigned char cBufferAdd(struct cBuffer_ *buffer, unsigned char data); +unsigned short cBufferAddBuffer(struct cBuffer_ *buffer, unsigned char* data, unsigned short len); +unsigned char cBufferGet(struct cBuffer_ *buffer); +unsigned short cBufferGetBuffer(struct cBuffer_ *buffer, unsigned char* data, unsigned short len); +#endif diff --git a/boop/trunk/cc1100/Make.conf b/boop/trunk/cc1100/Make.conf new file mode 100644 index 0000000..290d282 --- /dev/null +++ b/boop/trunk/cc1100/Make.conf @@ -0,0 +1 @@ +THUMBSRCS := cc1100.c rf.c fs20.c diff --git a/boop/trunk/cc1100/cc1100.c b/boop/trunk/cc1100/cc1100.c new file mode 100644 index 0000000..4495d30 --- /dev/null +++ b/boop/trunk/cc1100/cc1100.c @@ -0,0 +1,329 @@ +/* + cc1100.c - + Copyright (C) 2007 + + 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 3 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 . +*/ + +// CC1100 - http://focus.ti.com/docs/prod/folders/print/cc1100.html +// 27 MHz crystal +// http://en.wikipedia.org/wiki/ISM_band http://de.wikipedia.org/wiki/ISM-Band +// http://de.wikipedia.org/wiki/Short_Range_Devices http://en.wikipedia.org/wiki/Low-power_communication_device +// 433,05 MHz ... 434,79 MHz + +#include "lpc2220.h" +#include "cc1100.h" +#include "irq.h" + +//setting 6_WOR +const unsigned char conf[0x2F] = { + 0x29, // IOCFG2 + 0x2E, // IOCFG1 + 0x06, // IOCFG0 + 0x47, // FIFOTHR + 0xD3, // SYNC1 + 0x91, // SYNC0 + 0x3E, // PKTLEN + 0x1A, // PKTCTRL1 + 0x45, // PKTCTRL0 + 0x01, // ADDR + 0x01, // CHANNR + 0x06, // FSCTRL1 + 0x00, // FSCTRL0 + 0x10, // FREQ2 # + 0x0B, // FREQ1 # + 0xDA, // FREQ0 # -> 433,249969 MHz + 0x8A, // MDMCFG4 + 0x75, // MDMCFG3 + 0x13, // MDMCFG2 + 0x22, // MDMCFG1 + 0xC1, // MDMCFG0 CHANSPC_M + 0x35, // DEVIATN + 0x04, // MCSM2 + 0x0C, // MCSM1 0c + 0x38, // MCSM0 + 0x16, // FOCCFG + 0x6C, // BSCFG + 0x43, // AGCCTRL2 + 0x40, // AGCCTRL1 + 0x91, // AGCCTRL0 + 0x46, // WOREVT1 + 0x50, // WOREVT0 + 0x78, // WORCTRL + 0x56, // FREND1 + 0x10, // FREND0 + 0xA9, // FSCAL3 + 0x0A, // FSCAL2 + 0x00, // FSCAL1 + 0x11, // FSCAL0 + 0x41, // RCCTRL1 + 0x00, // RCCTRL0 + 0x57, // FSTEST + 0x7F, // PTEST + 0x3F, // AGCTEST + 0x98, // TEST2 + 0x31, // TEST1 + 0x0B // TEST0 +}; + +const unsigned char confasync[0x2F] = { + 0x0D, // IOCFG2 + 0x0D, // IOCFG1 + 0x2E, // IOCFG0 + 0x47, // FIFOTHR + 0xD3, // SYNC1 + 0x91, // SYNC0 + 0x3E, // PKTLEN + 0x1A, // PKTCTRL1 + 0x32, // PKTCTRL0 | asynchronous serial mode + 0x00, // ADDR + 0x00, // CHANNR channel number + 0x06, // FSCTRL1 + 0x00, // FSCTRL0 + 0x10, // FREQ2 # + 0x12, // FREQ1 # + 0x34, // FREQ0 # *27e6/2^16 = 433,919861 MHz base frequency + 0x4A, // MDMCFG4 | channel bandwidth + 0x84, // MDMCFG3 + 0x30, // MDMCFG2 + // 0x00, // MDMCFG2 // 2-FSK + 0x20, // MDMCFG1 + 0xe5, // MDMCFG0 CHANSPC_M Chann 49,95kHz | DRATE_E[3:0] + 0x37, // DEVIATN + 0x07, // MCSM2 + 0x30, // MCSM1 0c + 0x18, // MCSM0 + 0x14, // FOCCFG + 0x6C, // BSCFG + 0x07, // AGCCTRL2 + 0x00, // AGCCTRL1 + 0x90, // AGCCTRL0 + 0x46, // WOREVT1 + 0x50, // WOREVT0 + 0x78, // WORCTRL + 0x56, // FREND1 + 0x11, // FREND0 + 0xE9, // FSCAL3 + 0x2A, // FSCAL2 + 0x00, // FSCAL1 + 0x1F, // FSCAL0 + 0x41, // RCCTRL1 + 0x00, // RCCTRL0 + 0x59, // FSTEST + 0x7F, // PTEST + 0x3F, // AGCTEST + 0x81, // TEST2 + 0x35, // TEST1 + 0x09 // TEST0 +}; + +void cc1100_init(void) { + + unsigned long xx = 0x200; + + PINSEL1 &= 0xffffff00; //GDO0 SCK1 MISO1 MOSI1 as GPIO + FIODIR0 |= (CS1 | MOSI1 | SCK1); //output + + PCONP &= 0xfffffbff; + PCONP |= (1<<21); + FIOSET0 = SCK1; + FIOCLR0 = MOSI1; + FIOCLR0 = CS1; + while(xx) { + asm volatile("nop" : :); + xx--; + } + FIOSET0 = CS1; + xx=0x200; + while(xx) { + asm volatile("nop" : :); + xx--; + } + FIOCLR0 = CS1; + FIOCLR0 = SCK1; + while (FIOPIN0 & MISO1); + + PINSEL1 |= 0x000002A8; //SCK1 MISO1 MOSI1 as SPI1 + SSPCR0 = 0x0007; + SSPCPSR = 0x02; + SSPCR1 = 0x02; + + SSPDR = SRES; + while (FIOPIN0 & MISO1); + while (SSPSR & (1<<4)); + xx = SSPDR; + + cc1100_write((0x00 | BURST ),(unsigned char*)conf,0x2f); + cc1100_write1(PATABLE,0xC0); + cc1100_strobe(SIDLE); + cc1100_strobe(SPWD); +} + +// write length bytes of data to addr in CC1100 +unsigned char cc1100_write(unsigned char addr,unsigned char* data, unsigned char length) { + + unsigned short i; + unsigned char status; + unsigned char x; + + FIOCLR0 = CS1; + while (FIOPIN0 & MISO1); + SSPDR = (addr | WRITE); + while ((SSPSR & (1<<4))); + status = SSPDR; + for (i=0; i < length; i++) { + SSPDR = data[i]; + while ((SSPSR & (1<<4))); + x=SSPDR; + } + FIOSET0 = CS1; + + return(status); +} + +// write on byte of data to addr in CC1100 +// a few instructions faster than cc1100_write(addr, data, 1) +unsigned char cc1100_write1(unsigned char addr,unsigned char data) { + + unsigned char status; + unsigned char x; + + FIOCLR0 = CS1; + while (FIOPIN0 & MISO1); + SSPDR = (addr | WRITE); + while ((SSPSR & (1<<4))); + status = SSPDR; + + SSPDR = data; + while ((SSPSR & (1<<4))); + x=SSPDR; + + FIOSET0 = CS1; + + return(status); +} + + +unsigned char cc1100_read(unsigned char addr, unsigned char* data, unsigned char length) { + + unsigned short i; + unsigned char status; + + FIOCLR0 = CS1; + + while (FIOPIN0 & MISO1); + SSPDR = (addr | READ); + while ((SSPSR & (1<<4))); + status = SSPDR; + for (i=0; i < length; i++) { + SSPDR = 0x00; + while ((SSPSR & (1<<4))); + data[i]=SSPDR; + } + FIOSET0 = CS1; + + return(status); +} + +unsigned char cc1100_read1(unsigned char addr) { + + unsigned char r; + + FIOCLR0 = CS1; + while (FIOPIN0 & MISO1); + SSPDR = (addr | READ); + while ((SSPSR & (1<<4))); + r = SSPDR; + SSPDR = 0x00; + while ((SSPSR & (1<<4))); + r=SSPDR; + FIOSET0 = CS1; + + return(r); +} + +unsigned char cc1100_strobe(unsigned char cmd) { + + unsigned short status; + + FIOCLR0 = CS1; + while (FIOPIN0 & MISO1); + SSPDR = cmd; + while ((SSPSR & (1<<4))); + status = SSPDR; + FIOSET0 = CS1; + + return(status); +} +/* +// check that PLL has locked +unsigned char cc1100_pll_lock(void) +{ + //~ To check that the PLL is in lock the user can + //~ program register IOCFGx.GDOx_CFG to 0x0A + //~ and use the lock detector output available on + //~ the GDOx pin as an interrupt for the MCU (x = + //~ 0,1, or 2). A positive transition on the GDOx + //~ pin means that the PLL is in lock. As an + //~ alternative the user can read register FSCAL1. + //~ The PLL is in lock if the register content is + //~ different from 0x3F. Refer also to the CC1100 + //~ Errata Notes [1]. For more robust operation the + //~ source code could include a check so that the + //~ PLL is re-calibrated until PLL lock is achieved + //~ if the PLL does not lock the first time. +} +*/ +/* +// get carrier frequency +unsigned char cc1100_carrier(void) +{ + //~ f_carrier = fxosc/(2**16) * (FREQ + CHAN * (256+CHANSPC_M) * 2**(CHANSPC_E - 2)) +} + +// set intermediate frequency +unsigned char cc1100_if(void) +{ + //~ FSCTRL1.FREQ_IF + //~ f_ = fxosc/(2**10) * FREQ_IF +} + + +// set channel spacing +unsigned char cc1100_chspc(void) +{ + //~ MDMCFG0.CHANSPC_M + //~ MDMCFG1.CHANSPC_E r +} + +// set channel +unsigned char cc1100_channel(void) +{ + //~ CHANNR.CHAN +} + +// set frequency +unsigned char cc1100_frequency(void) +{ + //~ FREQ2, FREQ1, FREQ0 + //~ This word will typically be set to the centre of the lowest channel frequency that is to be used. +} + +// set modulation +unsigned char cc1100_modulation(void) +{ + //~ MDMCFG2.MOD_FORMAT + //~ MDMCFG2.MANCHESTER_EN. +} +*/ diff --git a/boop/trunk/cc1100/cc1100.h b/boop/trunk/cc1100/cc1100.h new file mode 100644 index 0000000..3e0b3c7 --- /dev/null +++ b/boop/trunk/cc1100/cc1100.h @@ -0,0 +1,131 @@ +/* + cc1100.h - + Copyright (C) 2007 + + 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 3 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 cc1100_H +#define cc1100_H + +#define MISO1 (1<<18) +#define MOSI1 (1<<19) +#define SCK1 (1<<17) +#define CS1 (1<<23) +#define GDO0 (1<<16) +#define GDO1 (1<<18) +#define GDO2 (1<<24) + + +#define WRITE 0x00 +#define BURST 0x40 +#define READ 0x80 +#define TX_fifo 0x7F +#define RX_fifo 0xff +#define PATABLE 0x3E + +//Command Strobes +#define SRES 0x30 +#define SFSTXON 0x31 +#define SXOFF 0x32 +#define SCAL 0x33 +#define SRX 0x34 +#define STX 0x35 +#define SIDLE 0x36 +#define SWOR 0x38 +#define SPWD 0x39 +#define SFRX 0x3A +#define SFTX 0x3B +#define SWORRST 0x3C +#define SNOP 0x3D + +//Status Registers +#define PARTNUM (0x30 | READ | BURST) +#define VERSION (0x31 | READ | BURST) +#define FREQEST (0x32 | READ | BURST) +#define LQI (0x33 | READ | BURST) +#define RSSI (0x34 | READ | BURST) +#define MARCSTATE (0x35 | READ | BURST) +#define WORTIME1 (0x36 | READ | BURST) +#define WORTIME0 (0x37 | READ | BURST) +#define PKTSTATUS (0x38 | READ | BURST) +#define VCO_VC_DAC (0x39 | READ | BURST) +#define TXBYTES (0x3A | READ | BURST) +#define RXBYTES (0x3B | READ | BURST) +#define RCCTRL1_STATUS (0x3C | READ | BURST) +#define RCCTRL0_STATUS (0x3D | READ | BURST) + +//Configuration Registers +#define IOCFG2 0x00 // GDO2 output pin configuration +#define IOCFG1 0x01 // GDO1 output pin configuration +#define IOCFG0 0x02 // GDO0 output pin configuration +#define FIFOTHR 0x03 // RX FIFO and TX FIFO thresholds +#define SYNC1 0x04 // Sync word, high byte +#define SYNC0 0x05 // Sync word, low byte +#define PKTLEN 0x06 // Packet length +#define PKTCTRL1 0x07 // Packet automation control +#define PKTCTRL0 0x08 // Packet automation control +#define ADDR_ 0x09 // Device address +#define CHANNR 0x0A // Channel number +#define FSCTRL1 0x0B // Frequency synthesizer control +#define FSCTRL0 0x0C // Frequency synthesizer control +#define FREQ2 0x0D // Frequency control word, high byte +#define FREQ1 0x0E // Frequency control word, middle byte +#define FREQ0 0x0F // Frequency control word, low byte +#define MDMCFG4 0x10 // Modem configuration +#define MDMCFG3 0x11 // Modem configuration +#define MDMCFG2 0x12 // Modem configuration +#define MDMCFG1 0x13 // Modem configuration +#define MDMCFG0 0x14 // Modem configuration +#define DEVIATN 0x15 // Modem deviation setting +#define MCSM2 0x16 // Main Radio Cntrl State Machine config +#define MCSM1 0x17 // Main Radio Cntrl State Machine config +#define MCSM0 0x18 // Main Radio Cntrl State Machine config +#define FOCCFG 0x19 // Frequency Offset Compensation config +#define BSCFG 0x1A // Bit Synchronization configuration +#define AGCCTRL2 0x1B // AGC control +#define AGCCTRL1 0x1C // AGC control +#define AGCCTRL0 0x1D // AGC control +#define WOREVT1 0x1E // High byte Event 0 timeout +#define WOREVT0 0x1F // Low byte Event 0 timeout +#define WORCTRL 0x20 // Wake On Radio control +#define FREND1 0x21 // Front end RX configuration +#define FREND0 0x22 // Front end TX configuration +#define FSCAL3 0x23 // Frequency synthesizer calibration +#define FSCAL2 0x24 // Frequency synthesizer calibration +#define FSCAL1 0x25 // Frequency synthesizer calibration +#define FSCAL0 0x26 // Frequency synthesizer calibration +#define RCCTRL1 0x27 // RC oscillator configuration +#define RCCTRL0 0x28 // RC oscillator configuration +#define FSTEST 0x29 // Frequency synthesizer cal control +#define PTEST 0x2A // Production test +#define AGCTEST 0x2B // AGC test +#define TEST2 0x2C // Various test settings +#define TEST1 0x2D // Various test settings +#define TEST0 0x2E // Various test settings + +#define MARCSTATE_IDLE 0x01 +#define MARCSTATE_RX 0x0d + +const unsigned char conf[0x2F] __attribute__((aligned(0x4))); +const unsigned char confasync[0x2F] __attribute__((aligned(0x4))); + +void cc1100_init(void); +unsigned char cc1100_write(unsigned char addr, unsigned char* data, unsigned char length); +unsigned char cc1100_write1(unsigned char addr,unsigned char data); +unsigned char cc1100_read(unsigned char addr, unsigned char* data, unsigned char length); +unsigned char cc1100_read1(unsigned char addr); +unsigned char cc1100_strobe(unsigned char cmd); + +#endif diff --git a/boop/trunk/cc1100/fs20.c b/boop/trunk/cc1100/fs20.c new file mode 100644 index 0000000..f029998 --- /dev/null +++ b/boop/trunk/cc1100/fs20.c @@ -0,0 +1,343 @@ +/* + fs20.c - FS20 functions + Copyright (C) 2009 + + 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 3 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 "lpc2220.h" +#include "fs20.h" +#include "rf.h" +#include "cc1100.h" +#include "fonty.h" +#include "rtc.h" +#include "global.h" +#include "lcd.h" +#include "keyboard.h" +#include "serial.h" +#include "timerfuncs.h" + +#define FS20_BETWEEN(x, a, b) ((x >= a) && (x <= b)) + +extern const char hval[16]; + +#define PROTOCOL_UNKNOWN 0 +#define PROTOCOL_FS20 1 +#define PROTOCOL_WEATHER 2 +#define PROTOCOL_WEATHER2 3 + +void fs20_decoder(void) { + + unsigned char x; + unsigned char FS20laststate = 0; + unsigned char FS20preamble = 0; + unsigned char FS20parity = 0; + unsigned char FS20state = 0; + unsigned long FS20lasttime = 0; + unsigned char FS20bitcounter = 0; + unsigned char FS20bytecounter = 0; + unsigned char FS20inbyte[20]; + unsigned char FS20inbit = 0; + unsigned char FS20protocol = PROTOCOL_UNKNOWN; + unsigned short tempbyte = 0; + unsigned char finish = 0; + + unsigned long pulse = 0; + unsigned long space = 0; + unsigned long now; + + lcd_fill(0); + set_font(BOLDFONT); + draw_string (0, 0, "FS20 Decoder", LCD_COLOR_B, DRAW_PUT); + draw_block (0,10,128,2, LCD_COLOR_B, DRAW_PUT); + set_font(SMALLFONT); + + RFasyncmode(true); + + cc1100_write1(FREQ2,0x20); + cc1100_write1(FREQ1,0x29); + cc1100_write1(FREQ0,0x3E); + + cc1100_write1(AGCCTRL2,0x07); + cc1100_write1(AGCCTRL1,0x00); + cc1100_write1(AGCCTRL0,0x91); + + cc1100_strobe(SFRX); + cc1100_strobe(SRX); + + serial_puts("\n\r"); + + while(KEY_Exit) {}; + while(!KEY_Exit) + { + + //internal receiver + if(FIOPIN0 & GDO2) + FS20state = 1; + else + FS20state = 0; + + /* + //external rexeiver on pin 0.14 + if(FIOPIN0 & (1<<14)) + FS20state = 1; + else + FS20state = 0; +*/ + + if(FS20state != FS20laststate) { + FS20laststate = FS20state; + + //Calculate pulse len + if(!FS20state) { + now = T0TC; + if(now > FS20lasttime) + pulse = now-FS20lasttime; + else + pulse = (now+5000)-FS20lasttime; + FS20lasttime = now; + } + //Calculate space len + else { + now = T0TC; + if(now > FS20lasttime) + space = now-FS20lasttime; + else + space = (now+5000)-FS20lasttime; + FS20lasttime = now; + } + + //Decode + if(FS20state || (FS20protocol == PROTOCOL_WEATHER2)) { + if(FS20protocol == PROTOCOL_UNKNOWN) { + if((FS20_BETWEEN(pulse, 350, 450) && FS20_BETWEEN(space, 350, 450)) || (FS20_BETWEEN(pulse, 550, 650) && FS20_BETWEEN(space, 550, 650))) { + FS20protocol = PROTOCOL_FS20; //FS20, FHT + FS20inbyte[0] = 'F'; + FS20bytecounter = 1; + FS20bitcounter = 0; + FS20preamble = PREAMBLELEN_FS20; + FS20parity = 0; + tempbyte = 0; + } + else if((FS20_BETWEEN(pulse, 200, 533) && FS20_BETWEEN(space, 685, 1020)) || (FS20_BETWEEN(pulse, 685, 1020) && FS20_BETWEEN(space, 200, 533))) { + FS20protocol = PROTOCOL_WEATHER; //KS200, KS300, S2XXX + FS20inbyte[0] = 'W'; + FS20bytecounter = 1; + FS20bitcounter = 0; + FS20preamble = PREAMBLELEN_WEATHER; + tempbyte = 0; + } + else if(FS20_BETWEEN(pulse, 200, 300) && FS20_BETWEEN(space, 200, 300)) { + FS20protocol = PROTOCOL_WEATHER2; //ASH500 + FS20inbyte[0] = 'S'; + FS20bytecounter = 1; + FS20bitcounter = 0; + FS20preamble = PREAMBLELEN_WEATHER2; + tempbyte = 0; + } + } + + if(FS20protocol == PROTOCOL_FS20) { + if(FS20_BETWEEN(pulse, 350, 450) && FS20_BETWEEN(space, 350, 450)) + FS20inbit = 0; + else if(FS20_BETWEEN(pulse, 550, 650) && FS20_BETWEEN(space, 550, 650)) + FS20inbit = 1; + else + FS20protocol = PROTOCOL_UNKNOWN; + + if(FS20protocol != PROTOCOL_UNKNOWN) { + if(FS20preamble) { + if((FS20preamble > 1) && FS20inbit) + FS20preamble = PREAMBLELEN_FS20; + else if((FS20preamble > 1) && !FS20inbit) { + FS20preamble--; + } + else if((FS20preamble == 1) && FS20inbit) { + FS20preamble = 0; + } + } + else { + if(FS20bitcounter == 8) { + if(FS20inbit == FS20parity) { + FS20bitcounter = 0; + FS20bytecounter++; + FS20parity = 0; + } + else { + FS20protocol = PROTOCOL_UNKNOWN; + } + } + else { + FS20inbyte[FS20bytecounter] = (FS20inbyte[FS20bytecounter]<<1) | FS20inbit; + FS20parity ^= FS20inbit; + FS20bitcounter++; + } + } + } + } + + if(FS20protocol == PROTOCOL_WEATHER) { + if(FS20_BETWEEN(pulse, 685, 1020) && FS20_BETWEEN(space, 200, 533)) + FS20inbit = 0; + else if(FS20_BETWEEN(pulse, 200, 533) && FS20_BETWEEN(space, 685, 1020)) + FS20inbit = (1<<3); + else + FS20protocol = PROTOCOL_UNKNOWN; + + if(FS20protocol != PROTOCOL_UNKNOWN) { + if(FS20preamble) { + if((FS20preamble > 1) && FS20inbit) + FS20preamble = PREAMBLELEN_WEATHER; + else if((FS20preamble > 1) && !FS20inbit) { + FS20preamble--; + } + else if((FS20preamble == 1) && FS20inbit) { + FS20preamble = 0; + } + } + else { + if(FS20bitcounter == 4) { + tempbyte<<=8; + FS20bitcounter++; + } + else if(FS20bitcounter == 9) { + FS20bitcounter = 0; + } + else { + tempbyte = (tempbyte>>=1) | FS20inbit; + if(FS20bitcounter++ == 8) { + FS20inbyte[FS20bytecounter] = tempbyte; + tempbyte = 0; + FS20bytecounter++; + } + } + } + } + } + + if(FS20protocol == PROTOCOL_WEATHER2) { + if(FS20preamble) { + if((FS20_BETWEEN(pulse, 200, 300) && FS20_BETWEEN(space, 200, 300))) { + if (FS20preamble > 1) + FS20preamble--; + } + else if((FS20_BETWEEN(pulse, 400, 600) && FS20_BETWEEN(space, 200, 300))) { + if (FS20preamble == 1) { + FS20preamble = 0; + pulse = 0; + space = 0; + } + else + FS20protocol = PROTOCOL_UNKNOWN; + } + else + FS20protocol = PROTOCOL_UNKNOWN; + } + else { + if((FS20_BETWEEN(pulse + space, 400, 600)) ) { + if(FS20state) + FS20inbit = 1; + else + FS20inbit = 0; + + pulse = 0; + space = 0; + + if(FS20inbit) + FS20parity++; + + if(FS20bitcounter == 8) { + if(!(FS20parity & 0x01)) { + FS20bitcounter = 0; + FS20bytecounter++; + FS20parity = 0; + if(FS20bytecounter == 0x0a) { //packet full received + unsigned char dec[8]; + + dec[0] = FS20inbyte[1] ^ 0x89; + for(x=9;x>1;x--) { + FS20inbyte[x] = (FS20inbyte[x-1] + 0x24) ^ FS20inbyte[x]; + } + FS20inbyte[1] = FS20inbyte[1] ^ 0x89; + + FS20protocol = PROTOCOL_UNKNOWN; + } + } + else { + FS20bytecounter = 0; + FS20protocol = PROTOCOL_UNKNOWN; + } + } + else { + FS20inbyte[FS20bytecounter] = (FS20inbyte[FS20bytecounter]<<1) | FS20inbit; + FS20bitcounter++; + } + } + else if(pulse && space) { + FS20bytecounter = 0; + FS20protocol = PROTOCOL_UNKNOWN; + } + } + } + + if((FS20protocol == PROTOCOL_UNKNOWN && FS20bytecounter > 1)) { + char msbuffer[20]; + + draw_block(0,32,128,24,3,DRAW_ERASE); + + //print time and protocol type + siprintf (msbuffer, "%02x:%02x:%02x.%02u %c ",rtc.time.hour,rtc.time.minute,rtc.time.second,(unsigned char)(T0overflow>>1) & 0xff, FS20inbyte[0]); + draw_string (0, 32, msbuffer, LCD_COLOR_B, DRAW_NORCU); + serial_puts(msbuffer); + + //print received data + for(x=1;x<(FS20bytecounter);x++) { + draw_hexC (((x-1)*14), 40, FS20inbyte[x], LCD_COLOR_B, DRAW_NORCU); + serial_putbyte (' '); + putHexC(FS20inbyte[x]); + } + + //print decoded data + if(FS20inbyte[0] == 'S') { + signed short temp; + + temp = ((FS20inbyte[6] & 0x7F)<<8) | FS20inbyte[7]; + if(temp & 0x4000) //negative + temp |=0x8000; + + serial_putbyte (' '); + serial_putbyte (' '); + + siprintf (msbuffer, "%4d °C %u%%", temp,FS20inbyte[8]); + msbuffer[4] = msbuffer[3]; + msbuffer[3] = '.'; + serial_puts(msbuffer); + msbuffer[5] = 0x15; //change °C on display + msbuffer[6] = ' '; + draw_string (0, 48, msbuffer, LCD_COLOR_B, DRAW_NORCU); + } + + serial_puts("\n\r"); + finish = 0; + FS20bytecounter = 0; + FS20protocol = PROTOCOL_UNKNOWN; + } + } + } + } + + RFasyncmode(false); +} + + diff --git a/boop/trunk/cc1100/fs20.h b/boop/trunk/cc1100/fs20.h new file mode 100644 index 0000000..ea60c22 --- /dev/null +++ b/boop/trunk/cc1100/fs20.h @@ -0,0 +1,29 @@ +/* + fs20.h - FS20 functions + Copyright (C) 2009 + + 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 3 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 FS20_H +#define FS20_H + +#define extensionbit 0x20 +#define PREAMBLELEN_FS20 10 +#define PREAMBLELEN_WEATHER 7 +#define PREAMBLELEN_WEATHER2 20 + +void fs20_decoder(void); + +#endif diff --git a/boop/trunk/cc1100/rf.c b/boop/trunk/cc1100/rf.c new file mode 100644 index 0000000..00ea4a1 --- /dev/null +++ b/boop/trunk/cc1100/rf.c @@ -0,0 +1,502 @@ +/* + rf.c - + Copyright (C) 2008 + + 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 3 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 "lpc2220.h" +#include "rf.h" +#include "cc1100.h" +#include "timerfuncs.h" +#include "irq.h" +#include "cc1100.h" +#include "lcd.h" +#include "fonty.h" +#include "rtc.h" +#include "global.h" +#include "buffer.h" +#include "bfs.h" + +unsigned char RFbuf[64]; +struct RFendpoint_ rfendpoint[MAX_ENDPOINTS]; +struct RF_ RF; + +const struct RFsettings_ default_RFsettings = +{ + 0x01, //address + 0x01 //channel +}; + +//********************* +//* Private functions * +//********************* + +void switch_to_idle() { + cc1100_strobe(SIDLE); + while (cc1100_read1(MARCSTATE) != 01); +} + +void WORsend_timeout(unsigned int cb) { + RF.state = RFsendworend; +} + +void RF_timed_rx_timeout(unsigned int cb) { + stopCB(RF.timeout_cb); + removeTimerCB(RF.timeout_cb); + RF.timeout_cb = 0xff; + if(RF.flags & WORenabled) + RF_changestate(RFwor); + else + RF_changestate(RFidle); + +} + +void sendendpoint(struct RFendpoint_ *currentEP) { + + unsigned char* epdata = 0; + unsigned short eplen; + struct cc1100frame_ *TXframe; + + TXframe = (struct cc1100frame_ *)RFbuf; + + //write header + eplen = currentEP->bufferlen; + switch ( currentEP->flags & EPtypemask) { + case EPtypedata: + if(eplen > 6) + eplen = 6; + epdata = currentEP->data; + break; + case EPtypebuffer: + if(eplen > 59) + eplen = 59; + epdata = currentEP->buffer; + break; + case EPtypecbuffer: + if(eplen > 59) + eplen = 59; + if(eplen > currentEP->cbuffer->len) + eplen = currentEP->cbuffer->len; + break; + } + TXframe->len = eplen + 3; + TXframe->destAddr = currentEP->dest; + TXframe->srcAddr = RF.addr; + TXframe->packetType = currentEP->type; + cc1100_write(TX_fifo | BURST,(unsigned char*)TXframe,4); + + //write data + switch ( currentEP->flags & EPtypemask) { + case EPtypedata: + case EPtypebuffer: + cc1100_write(TX_fifo | BURST,epdata,eplen); + break; + case EPtypecbuffer: + + if(currentEP->cbuffer->index + eplen <= currentEP->cbuffer->size) { + cc1100_write(TX_fifo | BURST,&(currentEP->cbuffer->data[currentEP->cbuffer->index]),eplen); + } + else { + cc1100_write(TX_fifo | BURST,&(currentEP->cbuffer->data[currentEP->cbuffer->index]), currentEP->cbuffer->size - currentEP->cbuffer->index); + cc1100_write(TX_fifo | BURST,currentEP->cbuffer->data,eplen - (currentEP->cbuffer->size - currentEP->cbuffer->index)); + } + currentEP->cbuffer->index = (currentEP->cbuffer->index + eplen) % currentEP->cbuffer->size; + currentEP->cbuffer->len -= eplen; + break; + } + + cc1100_strobe(STX); + + currentEP->flags &= ~EPnewdata; + + if(currentEP->flags & EPonce) + closeEP(currentEP); +} + +void receiveendpoint(struct RFendpoint_ *currentEP) { + + unsigned short eplen; + struct cc1100frame_ *RXframe; + + RXframe = (struct cc1100frame_ *)RFbuf; + + currentEP->dest = RXframe->srcAddr; + eplen = RXframe->len-3; + + switch ( currentEP->flags & EPtypemask) { + case EPtypedata: + if(eplen > 6) { + eplen = 6; + currentEP->flags |= EPoverflow; + } + memcpy(&(currentEP->data[0]),RXframe->data,eplen); + break; + case EPtypebuffer: + if(eplen > currentEP->buffersize) { + eplen = currentEP->buffersize; + currentEP->flags |= EPoverflow; + } + memcpy(currentEP->buffer,RXframe->data,eplen); + break; + case EPtypecbuffer: + if(eplen > currentEP->cbuffer->size - currentEP->cbuffer->len) { + eplen = currentEP->cbuffer->size - currentEP->cbuffer->len; + currentEP->flags |= EPoverflow; + } + cBufferAddBuffer(currentEP->cbuffer, RXframe->data, eplen); + break; + } + + currentEP->bufferlen = eplen; + if(currentEP->flags & EPnewdata) + currentEP->flags |= EPoverwritten; + else + currentEP->flags |= EPnewdata; + if(currentEP->flags & EPonce) + closeEP(currentEP); +} + +void cc1100IRQ (void) { + + unsigned char x; + + switch_to_idle(); + + if (cc1100_read1(RXBYTES) > 0) { + cc1100_read(RX_fifo, RFbuf,1); + cc1100_read(RX_fifo, &RFbuf[1],RFbuf[0]); + + struct cc1100frame_ *RXframe; + RXframe = (struct cc1100frame_ *)RFbuf; + + if ((RXframe->len == 1) && (RF.flags & WORenabled) && ((RXframe->destAddr == RF.addr) || (RXframe->destAddr == 0x00))) { + if(RF.timeout_cb != 0xff || RF.state != RFrx) + RF_timed_rx(WORrx_time); + } + + if (RXframe->len > 3) { + if (RF.timeout_cb != 0xff) + setCBIntervall(RF.timeout_cb,WORrx_time); + switch ( RXframe->packetType) { + case packet_test: + draw_block(0,50,128,10,3,DRAW_ERASE); + draw_string(0, 50, (char*)&RXframe->data[0], 3, DRAW_PUT); + break; + case packet_ping: + if (RXframe->data[0] == 0x01) { + struct RFendpoint_* cur_ep; + cur_ep = openEP(0,0, packet_ping); + if(cur_ep) { + cur_ep->dest = RXframe->srcAddr; + cur_ep->data[0] = 2; + cur_ep->bufferlen = 1; + cur_ep->flags |= EPenabled | EPoutput | EPnewdata | EPonce; + RF_changestate(RFtx); + } + } + else if (RXframe->data[0] == 0x02) { + RF.flags |= PingACK; + } + break; + case packet_time: + if ((RXframe->data[0] == 0xFF) && (timeInfo & TIME_ACCURATE)) { + send_time(RXframe->srcAddr,0); + } + else if (RXframe->len == 10) { + memcpy((unsigned char *)&rtc,&RXframe->data[0],7); + timeInfo |= SETNEWTIME; + VICSoftInt = INT_EINT2; + } + break; + default: + for(x=0; xpacketType) && ((rfendpoint[x].flags & (EPoutput | EPenabled)) == EPenabled)) { + receiveendpoint(&rfendpoint[x]); + break; + } + } + } + } + } + + if(RF.state == RFtx) { + for(x=0; xdest = dest; + cur_ep->data[0] = 1; + cur_ep->bufferlen = 1; + cur_ep->flags |= EPenabled | EPoutput | EPnewdata | EPonce | EPsendwor; + + RF.flags &= ~PingACK; + RF_changestate(RFtx); + + RF_timed_rx(WORrx_time); + + while ((RF.timeout_cb != 0xff) && !(RF.flags & PingACK)); + + if(RF.flags & PingACK) + return(1); + } + return(0); +} + +void RF_init (void) { + cc1100_init(); + RF.flags = 0; + RF.addr = conf[0x09]; + RF.state = RFpwrdown; + RF.nextstate = RFpwrdown; + RF.timeout_cb = 0xff; +} + +void RF_changestate (unsigned char state) { + unsigned char oldstate; + + VICIntEnClr = INT_EINT0; + + if(RF.state != state) { + oldstate = RF.state; + + if((RF.state >= RFtx) && (state < RFtx)) { + RF.nextstate = state; + } + else { + switch (state) { + case RFpwrdown: + RF.state = RFpwrdown; + break; + case RFwor: + RF.state = RFwor; + RF.flags |= WORenabled; + break; + case RFidle: + RF.state = RFidle; + break; + case RFrx: + RF.state = RFrx; + break; + case RFtx: + if(RF.state < RFtx) + RF.state = RFtx; + if(oldstate == RFrx) + RF.nextstate = RFrx; + else if(RF.flags & WORenabled) + RF.nextstate = RFwor; + else + RF.nextstate = RFidle; + break; + case RFsendwor: + break; + } + } + if(oldstate != RF.state) { + VICSoftInt = INT_EINT0; + } + } + VICIntEnable = INT_EINT0; +} + +void RF_timed_rx(unsigned short timeout) { + if (RF.timeout_cb != 0xff) + setCBIntervall(RF.timeout_cb,timeout); + else { + RF.timeout_cb = addTimerCB(RF_timed_rx_timeout, timeout); + startCB(RF.timeout_cb); + RF_changestate(RFrx); + } +} + +void startRFIRQ(void) { + + PINSEL1 |= 1; //GDO0 as EINT0 + EXTMODE |= 1; //edge sensitive + EXTPOLAR |= 0; //falling edge + EXTWAKE |= 1; + EXTINT |= 1; + + VICVectAddr2 = (unsigned long)&(cc1100IRQ); + VICVectCntl2 = VIC_SLOT_EN | INT_SRC_EINT0; + VICIntEnable = INT_EINT0; +} + +inline void stopRFIRQ(void) { + VICIntEnClr = INT_EINT0; +} + + +struct RFendpoint_* openEP(void* buffer, unsigned short buffersize, unsigned char type) { + + int i; + struct RFendpoint_* cur_ep; + + if(!type) + return 0; + + for(i=0; itype)) { + cur_ep->buffer = buffer; + cur_ep->buffersize = buffersize; + cur_ep->type = type; + cur_ep->bufferlen = 0; + cur_ep->dest = 0; + cur_ep->flags = 0; + if(!(buffer)) + cur_ep->flags |= EPtypedata; + return cur_ep; + } + } + return 0; + +} + +void closeEP(struct RFendpoint_ *cur_ep) { + if(cur_ep) { + cur_ep->flags = 0; + cur_ep->buffer = 0; + cur_ep->type = 0; + } +} + +void RF_setRegister(unsigned char reg, unsigned char data) { + + unsigned long VICInt; + + VICInt = VICIntEnable & INT_EINT0; + VICIntEnClr = INT_EINT0; + + cc1100_write1(reg,data); + + VICIntEnable |= VICInt; +} + +void load_RF_setting(void) { + struct RFsettings_ RFsettings; + + if(BFS_LoadFile(BFS_ID_RFsettings, sizeof(struct RFsettings_), (unsigned char*) &RFsettings) != sizeof(struct RFsettings_)) { + RFsettings = default_RFsettings; + BFS_SaveFile(BFS_ID_RFsettings, sizeof(struct RFsettings_), (unsigned char*) &RFsettings); + draw_string(0, 50, "default RF load", 3, DRAW_PUT); + } + + RF_setRegister(0x09, RFsettings.address); + RF_setRegister(0x0a, RFsettings.channel); + RF.addr = RFsettings.address; +} + + +void RFasyncmode(unsigned char on) { + + if(on) { + RF_changestate(RFidle); + while(RF.state != RFidle); + stopRFIRQ(); + cc1100_write((0x00 | BURST ),(unsigned char*)confasync,0x2f); + cc1100_write1(PATABLE,0xf0); + PINSEL1 &= 0xfffffffc; // GDO0 as GPIO + FIODIR0 |= GDO0; // output + } + else { + PINSEL1 |= 1; // GDO0 as EINT0 + cc1100_write((0x00 | BURST ),(unsigned char*)conf,0x2f); + cc1100_write1(PATABLE,0xC0); + cc1100_strobe(SIDLE); + load_RF_setting(); + startRFIRQ(); + RF_changestate(RFwor); + } +} diff --git a/boop/trunk/cc1100/rf.h b/boop/trunk/cc1100/rf.h new file mode 100644 index 0000000..31ff0c6 --- /dev/null +++ b/boop/trunk/cc1100/rf.h @@ -0,0 +1,110 @@ +/* + rf.h - + Copyright (C) 2008 + + 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 3 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 RF_H +#define RF_H + +#define WORrx_time 200 + +#define packet_test 0x01 +#define packet_ping 0x02 +#define packet_time 0x03 +#define packet_RFenc 0x04 +#define packet_redirDAT 0x05 +#define packet_redirCMD 0x06 + +#define MAX_ENDPOINTS 0x0F + +struct cc1100frame_ { + unsigned char len; + unsigned char destAddr; + unsigned char srcAddr; + unsigned char packetType; + unsigned char data[]; +}; + +struct RFendpoint_ { + union { + unsigned char* buffer; + struct cBuffer_* cbuffer; + unsigned char data[4]; + }; + unsigned short buffersize; + unsigned short bufferlen; + volatile unsigned short flags; + unsigned char dest; + unsigned char type; +}; +//RFendpoints_.flags +#define EPenabled (1<<0) +#define EPoutput (1<<1) +#define EPinput 0 +#define EPtypedata (1<<2) +#define EPtypebuffer 0 +#define EPtypecbuffer (1<<3) +#define EPtypemask (1<<2 | 1<<3) +#define EPnewdata (1<<4) +#define EPoverwritten (1<<5) +#define EPoverflow (1<<6) +#define EPonce (1<<7) +#define EPsendwor (1<<8) + + +struct RFsettings_ { + unsigned char address; + unsigned char channel; +}__attribute__((aligned(0x4))); + +const struct RFsettings_ default_RFsettings; + +struct RF_ { + unsigned char addr; + volatile unsigned char flags; + volatile unsigned char state; + volatile unsigned char timeout_cb; + volatile unsigned char wortimeout_cb; + volatile unsigned char nextstate; + volatile unsigned char tag; +}__attribute__((aligned(0x4))); +struct RF_ RF; + +//RF_.state +#define RFpwrdown 0x00 +#define RFwor 0x01 +#define RFidle 0x02 +#define RFrx 0x03 +#define RFtx 0x04 +#define RFsendwor 0x05 +#define RFsendworend 0x06 + +//RF.flags +#define PingACK (1<<0) +#define WORenabled (1<<1) +#define RXueop (1<<2) //MCSM2 RX_TIME: Until end of packet + +void startRFIRQ(void); +void RF_init (void); +void RF_timed_rx(unsigned short timeout); +void RF_changestate (unsigned char state); +unsigned char RF_sendping(unsigned char dest); +struct RFendpoint_* openEP(void* buffer, unsigned short buffersize, unsigned char type); +void closeEP(struct RFendpoint_ *cur_ep); +void RF_setRegister(unsigned char reg, unsigned char data); +void load_RF_setting(void); +void RFasyncmode(unsigned char on); +#endif diff --git a/boop/trunk/cc1100/scan.c b/boop/trunk/cc1100/scan.c new file mode 100644 index 0000000..3ad2d71 --- /dev/null +++ b/boop/trunk/cc1100/scan.c @@ -0,0 +1,151 @@ +//~ DN508 - Frequency Scanning using CC430Fx, CC110x, and CC111xFx + +void scanFreqBands_autocal(void) { + UINT8 subBand; + UINT8 i; + UINT16 channel; + // 1) Loop through all sub bands + for (subBand = 0; subBand < NUMBER_OF_SUB_BANDS; subBand++) + { + // 1.1) Set the base freq. for the current sub band. The values for FREQ2, FREQ1, and FREQ0 can be found in + // freqSettings[subBand][n], where n = 0, 1, or 2 + // 1.2) Set TEST0 register = 0x0B + // 1.3) Loop through all channels + for (channel = 0; channel <= lastChannel[subBand]; channel++ ) + { + UINT8 pktStatus; + // 1.3.1) Set CHANNR register = channel + // 1.3.2) Change TEST0 register settings to 0x09 if freq is above 861 MHz + if (channel == limitTest0Reg[subBand]) + { + // 1.3.2.1) Set TEST0 register = 0x09 + } + // 1.3.3) Enter RX mode by issuing an SRX strobe command + // 1.3.4) Wait for radio to enter RX state (can be done by polling the MARCSTATE register) + // 1.3.5) Wait for RSSI to be valid (See DN505 [7] on how long to wait) + // 1.3.6) Read the PKTSTATUS register while the radio is in RX state (store it in pktStatus) + // 1.3.7) Enter IDLE state by issuing an SIDLE strobe command + // 1.3.8) Check if CS is asserted (use the value obtained in 1.3.6) + if (pktStatus & 0x40) + { + // CS is asserted + // 1.3.8.1) Read RSSI value and store it in rssi_dec + // 1.3.8.2) Calculate RSSI in dBm (rssi_dBm)(offset value found in rssi_offset[subBand]) + // 1.3.8.3) Store the RSSI value and the corresponding channel number + rssiTable[carrierSenseCounter] = rssi_dBm; + channelNumber[carrierSenseCounter] = channel; + carrierSenseCounter++; + } + } // End Channel Loop + // 1.4) Before moving on to the next sub band, scan through the rssiTable to find the highest RSSI value. Store + // the RSSI value in highRSSI[subBand] and the corresponding channel number in selectedChannel[subBand] + for (i = 0; i < carrierSenseCounter; i++) + { + if (rssiTable[i] > highRSSI[subBand]) + { + highRSSI[subBand] = rssiTable[i]; + selectedChannel[subBand] = channelNumber[i]; + } + } + // 1.5) Reset carrierSenseCounter + carrierSenseCounter = 0; + } // End Band Loop + // 2) When all sub bands have been scanned, find which sub band has the highest RSSI (Scan the highRSSI[subBand] + // table). Store the subBand (0, 1, or 2) and the corresponding channel in the global variables activeBand and + // activeChannel respectively + //~ { + INT16 tempRssi = -150; + for (subBand = 0; subBand < NUMBER_OF_SUB_BANDS; subBand++) + { + if (highRSSI[subBand] >= tempRssi) + { + tempRssi = highRSSI[subBand]; + activeChannel = selectedChannel[subBand]; + activeBand = subBand; + } + } +} + + +void scanFreqBands_noautocal(void) { + UINT8 subBand; + UINT8 i; + UINT16 channel; + // 1) Loop through all sub bands + for (subBand = 0; subBand < NUMBER_OF_SUB_BANDS; subBand++) + { + // 1.1) Set the base freq. for the current sub band. The values for FREQ2, FREQ1, and FREQ0 can be found in + // freqSettings[subBand][n], where n = 0, 1, or 2 + // 1.2) Set TEST0 register = 0x0B + // 1.3) Reset Calibration Counter (calibration performed when counter is 0) + calCounter = 0; + // 1.4) Loop through all channels + for (channel = 0; channel <= lastChannel[subBand]; channel++ ) + { + UINT8 pktStatus; + // 1.4.1) Set CHANNR register = channel + // 1.4.2) Change TEST0 register settings to 0x09 if freq is above 861 MHz. When TEST0 is changed to 0x09, it + // is important that FSCAL2 is set to 0x2A and that a new calibration is performed + if (channel == limitTest0Reg[subBand]) + { + // 1.4.2.1) Set TEST0 register = 0x09 + // 1.4.2.2) Set FSCAL2 register = 0x2A + // 1.4.2.3) Calibration is needed when TEST0 is changed + calCounter = 0; + } + // 1.4.3) Calibrate for every 5th ch. + at start of every sub band and every time the TEST0 reg. is changed + if (calCounter++ == 0) + { + // 1.4.3.1) Perform a manual calibration by issuing an SCAL strobe command + } + // 1.4.4)) Reset Calibration Counter (if calCounter = 5, we are 1 MHz away from the frequency where a + // calibration was performed) + if (calCounter == 5) + { + // 1.4.4.1) Calibration is performed if calCounter = 0 + calCounter = 0; + } + // 1.4.5) Enter RX mode by issuing an SRX strobe command + // 1.4.6) Wait for radio to enter RX state (can be done by polling the MARCSTATE register) + // 1.4.7) Wait for RSSI to be valid (See DN505 [7] on how long to wait) + // 1.4.8) Read the PKTSTATUS register while the radio is in RX state (store it in pktStatus) + // 1.4.9) Enter IDLE state by issuing an SIDLE strobe command + // 1.4.10) Check if CS is asserted (use the value obtained in 1.4.8) + if (pktStatus & 0x40) + { // CS is asserted + // 1.4.10.1) Read RSSI value and store it in rssi_dec + // 1.4.10.2) Calculate RSSI in dBm (rssi_dBm)(offset value found in rssi_offset[subBand]) + // 1.4.10.3) Store the RSSI value and the corresponding channel number + rssiTable[carrierSenseCounter] = rssi_dBm; + channelNumber[carrierSenseCounter] = channel; + carrierSenseCounter++; + } + } // End Channel Loop + // 1.5) Before moving on to the next sub band, scan through the rssiTable to find the highest RSSI value. Store + // the RSSI value in highRSSI[subBand] and the corresponding channel number in selectedChannel[subBand] + for (i = 0; i < carrierSenseCounter; i++) + { + if (rssiTable[i] > highRSSI[subBand]) + { + highRSSI[subBand] = rssiTable[i]; + selectedChannel[subBand] = channelNumber[i]; + } + } + // 1.6) Reset carrierSenseCounter + carrierSenseCounter = 0; + } // End Band Loop + // 2) When all sub bands have been scanned, find which sub band has the highest RSSI (Scan the highRSSI[subBand] + // table). Store the subBand (0, 1, or 2) and the corresponding channel in the global variables activeBand and + // activeChannel respectively + //~ { + INT16 tempRssi = -150; + for (subBand = 0; subBand < NUMBER_OF_SUB_BANDS; subBand++) + { + if (highRSSI[subBand] >= tempRssi) + { + tempRssi = highRSSI[subBand]; + activeChannel = selectedChannel[subBand]; + activeBand = subBand; + } + } +} diff --git a/boop/trunk/cc1100/scan.h b/boop/trunk/cc1100/scan.h new file mode 100644 index 0000000..f3f30f8 --- /dev/null +++ b/boop/trunk/cc1100/scan.h @@ -0,0 +1,39 @@ +//~ DN508 - Frequency Scanning using CC430Fx, CC110x, and CC111xFx + + +#define NUMBER_OF_SUB_BANDS 3 + +// Variables used to calculate RSSI +UINT8 rssi_dec; +INT16 rssi_dBm; +UINT8 rssi_offset[NUMBER_OF_SUB_BANDS] = {77, 77, 77}; +// Freq. Band Range Channel +// 0 779.009766 - 829.997314 0 - 255 All 0x0B +// 1 830.196869 - 881.184418 0 - 255 <- 154 = 0x0B, 155 -> = 0x09 +// 2 881.384369 - 927.972992 0 - 233 All 0x09 +INT16 rssiTable[256]; +UINT16 channelNumber[256]; +UINT8 carrierSenseCounter = 0; // Counter used to keep track on how many time CS has been asserted in one sub band + //(i.e. how many RSSI values are stored for each band) + +// Stop Channel in each of the sub bands +UINT8 lastChannel[NUMBER_OF_SUB_BANDS] = { 255, 255, 233}; + +// Channel number for each of the sub bands where one should change from TEST0 = 0x0B to TEST0 = 0x09 +UINT16 limitTest0Reg[NUMBER_OF_SUB_BANDS] = { 256, 155, 0 }; + +// Initialized to a value lower than the RSSI threshold +INT16 highRSSI[NUMBER_OF_SUB_BANDS] = { -150, -150, -150}; + +// Initialized to a value greater than the highest channel number +UINT16 selectedChannel[NUMBER_OF_SUB_BANDS] = { 300, 300, 300}; + // {FREQ2, FREQ1, FREQ0} +UINT8 freqSettings[NUMBER_OF_SUB_BANDS][3] = { {0x1D, 0xF6, 0x40}, + {0x1F, 0xEE, 0x3F}, + {0x21, 0xE6, 0x3F}}; + +UINT8 activeBand; // After the scanFreqBands() function has run, this variable will contain the sub band where + // the strongest signal was found +UINT16 activeChannel; // After the scanFreqBands() function has run, this variable will contain the channel number + // where the strongest signal was found +UINT8 calCounter = 0; // This variable is only used when running the code shown in Figure 3 diff --git a/boop/trunk/crt.s b/boop/trunk/crt.s new file mode 100644 index 0000000..27636b6 --- /dev/null +++ b/boop/trunk/crt.s @@ -0,0 +1,268 @@ +/* + crt.s - startup code + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ +.global main + +.global _etext +.global _data +.global _edata +.global __bss_start +.global __bss_end__ +.global _stack + +/* Stack Sizes */ +.set UND_STACK_SIZE, 0x00000004 /* stack for "undefined instruction" interrupts is 4 bytes */ +.set ABT_STACK_SIZE, 0x00000004 /* stack for "abort" interrupts is 4 bytes */ +.set FIQ_STACK_SIZE, 0x00000104 /* stack for "FIQ" interrupts is 4 bytes */ +.set IRQ_STACK_SIZE, 0X000003F0 /* stack for "IRQ" normal interrupts is 4 bytes */ +.set SVC_STACK_SIZE, 0x00000004 /* stack for "SVC" supervisor mode is 4 bytes */ + +/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs */ +.set MODE_USR, 0x10 /* Normal User Mode */ +.set MODE_FIQ, 0x11 /* FIQ Processing Fast Interrupts Mode */ +.set MODE_IRQ, 0x12 /* IRQ Processing Standard Interrupts Mode */ +.set MODE_SVC, 0x13 /* Supervisor Processing Software Interrupts Mode */ +.set MODE_ABT, 0x17 /* Abort Processing memory Faults Mode */ +.set MODE_UND, 0x1B /* Undefined Processing Undefined Instructions Mode */ +.set MODE_SYS, 0x1F /* System Running Priviledged Operating System Tasks Mode */ +.set I_BIT, 0x80 /* when I bit is set, IRQ is disabled (program status registers) */ +.set F_BIT, 0x40 /* when F bit is set, FIQ is disabled (program status registers) */ + + +.text +.arm + +.global Reset_Handler +.global _startup + +.section .text.fastcode + +.global ramvectors +.func ramvectors +ramvectors: + ldr PC, Ram_Reset_Addr + ldr PC, Ram_Undef_Addr + ldr PC, Ram_SWI_Addr + ldr PC, Ram_PAbt_Addr + ldr PC, Ram_DAbt_Addr + nop /* Reserved Vector (holds Philips ISP checksum) */ + ldr PC, do_vic_addr /* Route IRQ to VIC */ + ldr PC, Ram_FIQ_Addr + +Ram_Reset_Addr: .word Reset_Handler /* defined in this module below */ +Ram_Undef_Addr: .word UNDEF_Routine /* defined in main.c */ +Ram_SWI_Addr: .word SWI_Routine /* defined in main.c */ +Ram_PAbt_Addr: .word UNDEF_Routine /* defined in main.c */ +Ram_DAbt_Addr: .word UNDEF_Routine /* defined in main.c */ +do_vic_addr: .word do_vic +Ram_FIQ_Addr: .word do_fiq /* defined in main.c */ + .word 0 /* rounds vectors to 64 bytes total */ +.endfunc + +.global do_vic +.func do_vic +do_vic: + + stmfd sp!, { r0-r5, r12, lr } /* save work regs & spsr on stack */ + ldr r4, =VICVectAddr /* get the ISR address from VIC */ + ldr r5, [r4] + mov lr, pc /* set return to common exit of ISR */ + bx r5 /* go handle the interrupt */ +/* mov pc, r5 /* go handle the interrupt */ + str lr, [r4] /* update VICVectAddr */ + ldmfd sp!, { r0-r5, r12, lr } /* restore work regs and spsr_irq */ + subs pc, lr, #0x4 /* return, restoring CPSR from SPSR */ +/* +stmfd sp!, { lr } +mrs lr, spsr +stmfd sp!, { r4-r5, lr } + +ldr r4, =VICVectAddr +ldr r5, [r4] + +msr cpsr_c, #0x13 + +stmfd sp!, { r0-r3, r12, lr } +mov lr, pc +bx r5 +ldmfd sp!, { r0-r3, r12, lr } + +msr cpsr_c, #0x92 + +str lr, [r4] + +ldmfd sp!, { r4-r5, lr } +msr spsr_cxsf, lr +ldmfd sp!, { lr } + +subs pc, lr, #0x4 +*/ + +.endfunc + +.global do_fiq +.func do_fiq +do_fiq: + + stmfd sp!, { r0-r7, lr } + ldr r8, =FIQ_Routine + mov lr, pc + bx r8 + ldmfd sp!, { r0-r7, lr } + subs pc, lr, #0x4 +.endfunc + + +.section .text + +.func _startup +_startup: + +# Exception Vectors + +_vectors: + ldr PC, Reset_Addr + +Reset_Addr: .word Reset_Handler + +# Reset Handler + +Reset_Handler: + +/* Setup a stack for each mode - note that this only sets up a usable stack + for User mode. Also each mode is setup with interrupts initially disabled. */ + + ldr r0, =_stack_end + msr CPSR_c, #MODE_UND|I_BIT|F_BIT /* Undefined Instruction Mode */ + mov sp, r0 + + sub r0, r0, #UND_STACK_SIZE + msr CPSR_c, #MODE_ABT|I_BIT|F_BIT /* Abort Mode */ + mov sp, r0 + + sub r0, r0, #ABT_STACK_SIZE + msr CPSR_c, #MODE_FIQ|I_BIT|F_BIT /* FIQ Mode */ + mov sp, r0 + + sub r0, r0, #FIQ_STACK_SIZE + msr CPSR_c, #MODE_IRQ|I_BIT|F_BIT /* IRQ Mode */ + mov sp, r0 + + sub r0, r0, #IRQ_STACK_SIZE + msr CPSR_c, #MODE_SVC|I_BIT|F_BIT /* Supervisor Mode */ + mov sp, r0 + + sub r0, r0, #SVC_STACK_SIZE + msr CPSR_c, #MODE_SYS|I_BIT|F_BIT /* User Mode */ + mov sp, r0 + +/* Setup Pins and Memory */ + ldr r0,=BCFG0 + /* W B R */ + /* P S B */ + /* B W E E L */ + /* AT|MW|M|P|R|R|reserved|WST2 |E|WST1 |r|IDCY */ + /* --+--+-+-+-+-+--------+-----+-------+-+---- */ + /* 3 | 2| | | |2| 2 1| 1 | | 0 |0| 0 */ + /* 1 | 8| | | |4| 0 6| 2 | | 8 |4| 0 */ + /* --+--+-+-+-+-+--------+-----+-------+-+---- */ +/* ldr r1, =0x10000400 /* 00|01|0|0|0|0|00000000|00000|1|00000|0|0000 16bit, rble, 3wst - 10 mhz*/ +/* ldr r1, =0x10000420 /* 00|01|0|0|0|0|00000000|00000|1|00001|0|0000 16bit, rble, 4wst - 30 mhz*/ + ldr r1, =0x100004A0 /* 00|01|0|0|0|0|00000000|00000|1|00101|0|0000 16bit, rble, 6wst - 60 mhz*/ + + str r1,[r0] /* set bcfg0 (flash) */ + str r1,[r0,#0x08] /* set bcfg2 (flash) */ + + ldr r0, =BCFG1 +/* ldr r1, =0x00000422 /* 00|00|0|0|0|0|00000000|00000|1|00001|0|0010 8 bit, 3 sram wst, rble, 5 wst 3 idcy*/ + ldr r1, =0x00000C42 /* 00|00|0|0|0|0|00000000|00001|1|00010|0|0010 8 bit, 3 sram wst, rble, 5 wst 3 idcy*/ + str r1, [r0] /* set bcfg1 (lcd) */ + + ldr r0, =PINSEL0 + ldr r1, =0x00008005 + str r1, [r0] + + ldr r0, =PINSEL1 + ldr r1, =0x00000000 /* gpio 0.30 */ + str r1, [r0] + + ldr r0, =PINSEL2 + ldr r1, =0x0de049d4 + str r1, [r0] + + ldr r0, = IO2SET + ldr r1, =0x1FC0000 + str r1, [r0] + str r1, [r0,#0x04] + + ldr r0, = IO0DIR + ldr r1, =0x002018D0 + str r1, [r0] + +/* Setup PLL */ + ldr r0, =0xe01fc000 + ldr r2, =0xaa + ldr r3, =0x55 + ldr r1, =0x03 + str r1, [r0,#0x80] /* set pllcon to 0x03 = pll enable (0x01) + pll connect (0x02) */ + ldr r1, =0x0 + str r1, [r0,#0x100] /* set vbpdiv to 0x00 = 1/4th; 0x01 = 1/1, 0x02 = 1/2*/ +/* ldr r1, =0x42 */ + ldr r1, =0x45 + str r1,[r0,#0x84] /* set pllcfg to 0x42 = psel = 10 (4) = msel= 00010 (3) = 240 mhz Fcco*/ + str r2, [r0,#0x8c] + str r3, [r0,#0x8c] + +/* Copy .fastcode & .data section (Copy from ROM to RAM) */ + ldr R0, =__fastcode_load /*_etext*/ + ldr r3, entry_mask /* this and the next instruction are an workaround */ + and r0, r0, r3 /* for some ugly bug in winarm to force msb to 0x80 */ + ldr R1, =__fastcode_start /*_data*/ + ldr R2, =_edata +1: + cmp r1,r2 + ldmltia r0!,{r3} + stmltia r1!,{r3} + blt 1b + +/* Clear .bss section (Zero init) */ + mov R0, #0 + ldr R1, =_bss_start + ldr R2, =_bss_end +2: + cmp R1, R2 + strlo R0, [R1], #4 + blo 2b + + ldr r0, =MEMMAP + ldr r1, =0x02 /* irq vectors in ram */ + str r1, [r0] + + mov r0,#0 + mov r1,r0 + mov r2,r0 + mov fp,r0 + mov r7,r0 + ldr r10,=main + mov lr,pc + bx r10 + +.endfunc + +entry_mask: .word 0x8FFFFFFF /* defined in this module below */ + +.end diff --git a/boop/trunk/display/GrayScaler.exe b/boop/trunk/display/GrayScaler.exe new file mode 100644 index 0000000000000000000000000000000000000000..ac8260d482dcd28f56ddc51429e16a43cb7cbc94 GIT binary patch literal 380928 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%0Aq*=5<=e2og9-Q1(BOEGp3yh=1^O)4@8sbVMyU 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

BEEMV0KZ#UZMbs_kHE0+JY9NQJnd43l`|4s@%V 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 + + 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 3 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 "lpc2220.h" +#include "timerfuncs.h" +#include "backlight.h" + +// backlight PWM is done in soundirq +// backlight timing is done by timer functions + +extern volatile unsigned char bl_val; + +unsigned char bl_max; +unsigned int bl_cb; +unsigned char direction; + +unsigned char bl_speed; // n*5 ms between two steps of brightness +unsigned int bl_timeout; + +void autoBL(unsigned int cb) +{ + switch(direction) + { + case 0: + if(bl_val < bl_max) + { + bl_val++; + } + else + { + direction = 1; + setCBIntervall(bl_cb, bl_timeout); + } + break; + + case 1: + direction = 2; + setCBIntervall(bl_cb, bl_speed); + break; + + case 2: + if(bl_val > 0x00) + { + bl_val--; + } + else + { + direction = 0; + stopCB(bl_cb); + } + break; + } +} + + +// adds function autoBL to timer +// initialises parameters // TODO: vgl. load_setting (settingsmenu.c) +void initBacklight(void) +{ + direction = 1; + bl_speed = 2; + bl_timeout = 5000; + bl_max = 63; + bl_cb = addTimerCB(autoBL, bl_timeout); + startCB(bl_cb); +} + +// set new brightness and set up fading and timout +void setBacklight(unsigned char level) +{ + if(level == BL_AUTO) + { + stopCB(bl_cb); + direction = 0; + setCBIntervall(bl_cb, bl_speed); + startCB(bl_cb); + } + else if(level < BL_AUTO) + { + stopCB(bl_cb); + bl_val = level; + direction = 1; + setCBIntervall(bl_cb, bl_timeout); + startCB(bl_cb); + } +} + +void setBLSpeed(unsigned char s) +{ + if(s > 0) + bl_speed = s; +} + +void setBLTimeout(unsigned int t) +{ + if(t > 0) + bl_timeout = t; +} diff --git a/boop/trunk/display/backlight.h b/boop/trunk/display/backlight.h new file mode 100644 index 0000000..4b3574a --- /dev/null +++ b/boop/trunk/display/backlight.h @@ -0,0 +1,29 @@ +/* + backlight.h - lcd backlight control + Copyright (C) 2007 Ch. Klippel + + 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 3 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 BACKLIGHT_H +#define BACKLIGHT_H + +#define BL_OFF 0x00 +#define BL_AUTO 0x40 +#define BL_ON 0x80 + +void initBacklight(void); +void setBacklight(unsigned char level); + +#endif diff --git a/boop/trunk/display/boop_logo b/boop/trunk/display/boop_logo new file mode 100644 index 0000000..aaa5389 --- /dev/null +++ b/boop/trunk/display/boop_logo @@ -0,0 +1,2592 @@ +#ifndef DEBUGMODE +const unsigned char b_w = 128; +const unsigned char b_h = 160; +const char b_data[] = { + // Bit 0 is the upper most pixel + // of the page, which is 8 pixel high + //--- Page 0 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x80, + 0x80, 0x80, + 0xc0, 0x80, + 0xc0, 0xc0, + 0xc0, 0xc0, + 0xc0, 0xe0, + 0xc0, 0xe0, + 0xe8, 0xd0, + 0xf8, 0xf8, + 0xf8, 0xf8, + 0xf0, 0xf8, + 0xe0, 0xc0, + 0xe0, 0xc0, + 0xc0, 0xe0, + 0xc0, 0xc0, + 0xc0, 0xc0, + 0xc0, 0x80, + 0x80, 0xc0, + 0x80, 0xc0, + 0xe0, 0xf0, + 0xe0, 0xc0, + 0xc0, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 1 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0xc0, + 0xe0, 0xc0, + 0xe0, 0xf0, + 0xf0, 0xa0, + 0xc0, 0xc0, + 0xe0, 0xc0, + 0xe0, 0xe0, + 0xe0, 0xf0, + 0xf0, 0xe0, + 0xf0, 0xf0, + 0xf0, 0xf0, + 0xf0, 0xf0, + 0xf0, 0xe0, + 0x20, 0xc0, + 0xf0, 0x08, + 0xfc, 0xf8, + 0xfe, 0xfc, + 0xff, 0xfe, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0x7f, + 0x7f, 0xff, + 0x7f, 0xbf, + 0x7f, 0xbf, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0x7f, 0xff, + 0x7f, 0xff, + 0xff, 0x7f, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xf8, 0xfd, + 0xe0, 0x90, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 2 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xc0, 0x20, + 0xf8, 0xf4, + 0xfe, 0xfc, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xbf, + 0xdf, 0xbf, + 0xdf, 0x2f, + 0x1f, 0xef, + 0x1f, 0xef, + 0x1f, 0xef, + 0x1f, 0xec, + 0x1f, 0xe0, + 0x0f, 0xf7, + 0x07, 0xfb, + 0x03, 0xfd, + 0x01, 0xff, + 0x01, 0xfe, + 0x00, 0xff, + 0x00, 0xff, + 0x83, 0x7c, + 0xe3, 0xde, + 0x77, 0xab, + 0x1b, 0xe7, + 0x0b, 0xf4, + 0x0c, 0xf3, + 0x08, 0xf7, + 0x0c, 0xf3, + 0x1d, 0xee, + 0x1f, 0xef, + 0xef, 0x17, + 0xe7, 0xdf, + 0xcf, 0xbf, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0x3e, 0x5c, + 0x1e, 0x1d, + 0x0f, 0x0e, + 0x00, 0x06, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 3 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0x0a, + 0x0e, 0x0f, + 0x1e, 0x0f, + 0x7f, 0xbf, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0x7f, 0xbf, + 0x7f, 0xb3, + 0x3d, 0xda, + 0x01, 0xfe, + 0x01, 0xff, + 0xc1, 0x3f, + 0x71, 0x8e, + 0x30, 0xcf, + 0x18, 0xe7, + 0x18, 0xf7, + 0x18, 0xf7, + 0x18, 0xef, + 0x08, 0xf7, + 0x00, 0xff, + 0x00, 0xff, + 0x00, 0xff, + 0x00, 0xff, + 0x00, 0xff, + 0x00, 0xff, + 0x06, 0xfb, + 0x07, 0xfb, + 0xc1, 0x3e, + 0xf0, 0x0f, + 0x78, 0x87, + 0xf8, 0x67, + 0x78, 0xe7, + 0xf8, 0xe7, + 0xf8, 0xe7, + 0xf0, 0xef, + 0xf8, 0x47, + 0x63, 0x9c, + 0xf7, 0xeb, + 0xff, 0xe3, + 0xf3, 0xef, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xef, 0xf7, + 0xe1, 0xf2, + 0x70, 0xb0, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 4 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x88, + 0x99, 0x73, + 0xff, 0x3b, + 0xff, 0x3f, + 0xfe, 0x7d, + 0xff, 0x7e, + 0x6e, 0x97, + 0x40, 0xff, + 0xe1, 0x7e, + 0xe1, 0x9e, + 0xf8, 0xe7, + 0xfe, 0xb9, + 0x9e, 0x8d, + 0x8e, 0xd9, + 0xff, 0x0c, + 0x7c, 0xfb, + 0x7c, 0xfb, + 0xfc, 0x7b, + 0x60, 0xdf, + 0xc0, 0xff, + 0xe0, 0x7f, + 0xf0, 0x2f, + 0xb0, 0x7f, + 0x30, 0xff, + 0x78, 0xff, + 0xff, 0x4c, + 0xce, 0xf5, + 0xce, 0xf4, + 0xcf, 0xf2, + 0xcb, 0x77, + 0xeb, 0x57, + 0x67, 0xeb, + 0xf7, 0xab, + 0xff, 0x1e, + 0xdf, 0x6e, + 0xcf, 0x73, + 0xe3, 0xdd, + 0x9f, 0x21, + 0x1f, 0x81, + 0x15, 0x0b, + 0x17, 0x09, + 0x09, 0x16, + 0x07, 0x08, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x18, 0x08, + 0xf8, 0x78, + 0x98, 0xf8, + 0x38, 0x10, + 0x30, 0x18, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x70, + 0x70, 0x20, + 0x60, 0x30, + 0x60, 0x60, + 0x60, 0x60, + 0x60, 0x60, + 0xf8, 0xe4, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 5 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xe0, 0x10, + 0xf8, 0x14, + 0x0e, 0xf0, + 0x03, 0xfc, + 0xff, 0x00, + 0xff, 0x02, + 0x87, 0x7b, + 0x83, 0xff, + 0xcf, 0x3f, + 0x6f, 0x1f, + 0x6f, 0xbf, + 0xbf, 0x46, + 0xff, 0x1f, + 0x7f, 0x3f, + 0x3f, 0xdf, + 0xf9, 0xde, + 0x7b, 0xd8, + 0x7b, 0xc0, + 0xf9, 0xce, + 0xed, 0xf8, + 0xec, 0xf7, + 0xf6, 0x8b, + 0x93, 0xef, + 0x98, 0xe7, + 0x8e, 0xf1, + 0x8e, 0xff, + 0xcf, 0xbe, + 0xce, 0xb7, + 0xe6, 0xd9, + 0xf6, 0xe9, + 0xfe, 0xb1, + 0x3e, 0xdf, + 0x1e, 0xef, + 0x07, 0xfa, + 0x03, 0xfd, + 0x01, 0xfe, + 0x00, 0xff, + 0x80, 0x7f, + 0x80, 0x7c, + 0x80, 0x7d, + 0x01, 0xfe, + 0x03, 0xf5, + 0x02, 0xef, + 0x06, 0xe8, + 0x0c, 0xd0, + 0x18, 0xe0, + 0x30, 0xc0, + 0x60, 0xa0, + 0xc0, 0x60, + 0x80, 0xc0, + 0x00, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x01, + 0x01, 0x01, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x40, 0x00, + 0xe0, 0xc0, + 0xc3, 0xc1, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 6 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xf0, 0xcc, + 0x7f, 0x88, + 0x01, 0xfe, + 0x00, 0xff, + 0x00, 0xff, + 0xff, 0x02, + 0x01, 0x83, + 0x01, 0x00, + 0x00, 0x01, + 0x00, 0x00, + 0x80, 0x40, + 0xc0, 0x20, + 0x30, 0x48, + 0x1c, 0xa0, + 0x66, 0x91, + 0xfb, 0xf4, + 0x8d, 0x58, + 0x0e, 0x0d, + 0x0f, 0x06, + 0x0f, 0x07, + 0x0f, 0x07, + 0x8f, 0x07, + 0x0f, 0x87, + 0x0f, 0x07, + 0x0f, 0x07, + 0x0f, 0x07, + 0x1f, 0x2f, + 0xff, 0x7f, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xfe, + 0xfe, 0xff, + 0xfc, 0xff, + 0xfc, 0xfb, + 0xf8, 0xf7, + 0xf0, 0xff, + 0x7d, 0x32, + 0x1f, 0x04, + 0x03, 0x05, + 0x03, 0x04, + 0x06, 0x01, + 0x0c, 0x03, + 0x1c, 0x0b, + 0x30, 0x1f, + 0xf0, 0x2f, + 0xe0, 0xdf, + 0x60, 0x9f, + 0x60, 0x1f, + 0x01, 0xfe, + 0x03, 0xfd, + 0x06, 0xfb, + 0x0c, 0xf6, + 0xb8, 0x5c, + 0xe0, 0x50, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xf8, 0xf0, + 0x98, 0x1c, + 0x0c, 0x1c, + 0x0c, 0x0c, + 0x0c, 0x0c, + 0x0c, 0x0c, + 0x1c, 0x0c, + 0x1c, 0x3c, + 0xec, 0xd8, + 0x18, 0x1c, + 0x18, 0x18, + 0x30, 0x18, + 0x30, 0x20, + 0x60, 0xc0, + 0x80, 0xc0, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 7 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xfc, 0x03, + 0xff, 0x01, + 0x00, 0xff, + 0x00, 0xff, + 0x00, 0xff, + 0x00, 0xfe, + 0x03, 0xfc, + 0xff, 0x0c, + 0xfc, 0x08, + 0x06, 0xfc, + 0x03, 0xfc, + 0x01, 0xfe, + 0x80, 0x7e, + 0xc0, 0x7f, + 0x60, 0x3f, + 0x18, 0x37, + 0x0d, 0x12, + 0xc7, 0x23, + 0xff, 0x7e, + 0x00, 0xf6, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x01, 0x80, + 0x01, 0x82, + 0x02, 0x81, + 0x02, 0x80, + 0x80, 0x02, + 0x80, 0x01, + 0x03, 0xc1, + 0x47, 0x87, + 0x07, 0x4f, + 0xef, 0x37, + 0x9f, 0x6f, + 0xff, 0x07, + 0x1f, 0x6f, + 0x07, 0x0f, + 0x03, 0x01, + 0x01, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x80, 0x00, + 0xc0, 0x20, + 0x60, 0xb0, + 0x18, 0xb0, + 0x0c, 0xf2, + 0x06, 0xf3, + 0x03, 0xf9, + 0x80, 0x79, + 0xc0, 0xbe, + 0x60, 0xdf, + 0x30, 0x6f, + 0x18, 0x37, + 0x0c, 0x1b, + 0x07, 0x06, + 0x03, 0x01, + 0x00, 0x01, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x01, 0x03, + 0x03, 0x03, + 0x06, 0x03, + 0x06, 0x06, + 0x06, 0x06, + 0x06, 0x07, + 0x07, 0x03, + 0x03, 0x01, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x88, 0x00, + 0xcc, 0x86, + 0x87, 0x87, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 8 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x01, + 0x07, 0x03, + 0x0e, 0x19, + 0x18, 0x07, + 0x30, 0x0f, + 0x20, 0x5f, + 0x60, 0x1f, + 0x30, 0x0f, + 0x18, 0x17, + 0x0c, 0x13, + 0x06, 0x01, + 0x03, 0x00, + 0x01, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x04, + 0x0f, 0x06, + 0xfc, 0xff, + 0x0c, 0xf6, + 0x0c, 0xf6, + 0x0c, 0xf6, + 0x0c, 0xfc, + 0x0c, 0xfc, + 0x0c, 0x7c, + 0x6c, 0xbc, + 0xfc, 0x28, + 0xfc, 0x18, + 0xf8, 0x0c, + 0x68, 0x98, + 0xe8, 0x13, + 0x0b, 0xf0, + 0x0f, 0xf8, + 0x0f, 0xfe, + 0x09, 0xf0, + 0x08, 0xf0, + 0x08, 0xf8, + 0x08, 0xf8, + 0x0c, 0xf8, + 0x84, 0xfe, + 0xc6, 0x3b, + 0x63, 0x3c, + 0x30, 0x0f, + 0x18, 0x07, + 0x0c, 0x03, + 0x06, 0x0d, + 0x06, 0x03, + 0x03, 0x01, + 0x01, 0x03, + 0x00, 0x01, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xf0, 0xf0, + 0x18, 0x98, + 0x0c, 0x18, + 0x0c, 0x0c, + 0x0c, 0x0c, + 0x0c, 0x0c, + 0x0c, 0x1c, + 0x0c, 0x1c, + 0x1c, 0x08, + 0x18, 0x1c, + 0x18, 0x18, + 0x18, 0x30, + 0x30, 0x30, + 0x61, 0x31, + 0xc1, 0xe1, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 9 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xf8, 0xe4, + 0xfe, 0xcd, + 0xff, 0xe8, + 0xf8, 0xd7, + 0xfb, 0xc4, + 0xfb, 0xc4, + 0xf8, 0x9f, + 0xf8, 0xcf, + 0xf8, 0xef, + 0xff, 0xe9, + 0xff, 0x58, + 0xfd, 0xfe, + 0xff, 0xf0, + 0xff, 0xb8, + 0xfd, 0x73, + 0xbe, 0x79, + 0xfc, 0x1f, + 0xfe, 0x1d, + 0xfe, 0x3f, + 0xfe, 0x7f, + 0xff, 0xfe, + 0xf9, 0x1e, + 0xf9, 0x12, + 0xf1, 0x60, + 0xc0, 0xe0, + 0x00, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x01, + 0x03, 0x01, + 0x03, 0x06, + 0x06, 0x06, + 0x06, 0x06, + 0x0e, 0x06, + 0x0e, 0x0c, + 0x0c, 0x0e, + 0x0c, 0x0c, + 0x0c, 0x0c, + 0x0c, 0x0c, + 0x0c, 0x0c, + 0x0c, 0x0c, + 0x06, 0x0c, + 0x03, 0x07, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 10 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x01, 0x07, + 0xff, 0x0f, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xf7, + 0xff, 0x8f, + 0xff, 0x1f, + 0xff, 0x3f, + 0xff, 0x7e, + 0xff, 0x3c, + 0xff, 0x39, + 0xff, 0x21, + 0xff, 0xc9, + 0xff, 0xf2, + 0xff, 0x80, + 0xff, 0xa0, + 0xff, 0xc0, + 0xff, 0x80, + 0xf9, 0xc6, + 0xff, 0x78, + 0xff, 0x60, + 0xff, 0xee, + 0xff, 0xfc, + 0xff, 0xff, + 0xff, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xf0, 0x60, + 0xf0, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x70, + 0x60, 0x70, + 0x60, 0x60, + 0xc0, 0x40, + 0x80, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 11 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x01, 0x00, + 0xe7, 0xdb, + 0xff, 0xff, + 0xff, 0xf7, + 0xff, 0xff, + 0xff, 0x2f, + 0xff, 0x3e, + 0xff, 0xfc, + 0xff, 0xf8, + 0xff, 0xf3, + 0xff, 0xf7, + 0xff, 0x3f, + 0xff, 0x1f, + 0xff, 0x1b, + 0xff, 0x3b, + 0xff, 0x3b, + 0xff, 0x3f, + 0xff, 0x7f, + 0xff, 0x04, + 0xf6, 0x0d, + 0xff, 0x03, + 0xff, 0x7f, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xe0, + 0xc0, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0c, 0x1c, + 0xbd, 0x8d, + 0x8e, 0x8e, + 0x8c, 0x9c, + 0x9c, 0x88, + 0x98, 0x98, + 0x18, 0x98, + 0x18, 0x18, + 0x19, 0x18, + 0x1f, 0x3e, + 0x30, 0x10, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x30, + 0x30, 0x60, + 0x60, 0x30, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 12 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x01, 0xf2, + 0xff, 0xff, + 0xff, 0xfc, + 0xff, 0xf8, + 0xff, 0xc0, + 0xff, 0x00, + 0xff, 0x1f, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xfe, + 0xff, 0xf8, + 0xff, 0x80, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x80, + 0xff, 0xe0, + 0xff, 0x80, + 0xff, 0x00, + 0xff, 0x3f, + 0xff, 0x78, + 0xff, 0xe1, + 0xff, 0x36, + 0xfc, 0xe2, + 0x80, 0x40, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x1f, 0x0f, + 0x33, 0x31, + 0x61, 0x61, + 0x61, 0xe1, + 0xc1, 0xe1, + 0xc1, 0xc1, + 0xc3, 0xc1, + 0xc3, 0xc3, + 0xe6, 0x62, + 0x7c, 0x78, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 13 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x0f, + 0x0f, 0x1f, + 0xff, 0xf0, + 0xff, 0xff, + 0xff, 0x1f, + 0xff, 0xe0, + 0xff, 0xe0, + 0xff, 0xe3, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xfc, + 0xff, 0xf8, + 0xff, 0xe0, + 0xff, 0x81, + 0xff, 0x03, + 0xff, 0xdb, + 0xff, 0xe0, + 0xfe, 0x01, + 0xff, 0x00, + 0xff, 0x3f, + 0xff, 0xfc, + 0xff, 0xe0, + 0xff, 0x07, + 0xfe, 0x38, + 0xf0, 0xe8, + 0xc0, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x7c, 0x3c, + 0xce, 0xc6, + 0x86, 0x86, + 0x86, 0x86, + 0x06, 0x86, + 0x06, 0x06, + 0x0c, 0x06, + 0x0c, 0x0c, + 0x98, 0x88, + 0xf0, 0xe0, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 14 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xc7, 0x39, + 0xff, 0x7f, + 0xff, 0x78, + 0xff, 0x78, + 0xff, 0xc0, + 0xff, 0x81, + 0xff, 0x83, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0x7f, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xe7, + 0xff, 0x9f, + 0xff, 0x7f, + 0xff, 0xfc, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x0b, + 0xff, 0x3d, + 0xff, 0xf8, + 0xff, 0xd8, + 0xff, 0x00, + 0xff, 0xff, + 0xff, 0xfe, + 0xf8, 0xfc, + 0xf0, 0xe0, + 0xc0, 0x80, + 0x00, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xf0, 0xf0, + 0x38, 0x18, + 0x18, 0x18, + 0x18, 0x18, + 0x18, 0x18, + 0x30, 0x30, + 0x60, 0xf0, + 0xe1, 0xc1, + 0x71, 0x3b, + 0x1b, 0x3b, + 0x1b, 0x1b, + 0x1b, 0x1b, + 0x33, 0x3b, + 0x63, 0x71, + 0xc1, 0xc1, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 15 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xe0, 0x90, + 0xff, 0xff, + 0xdf, 0xe0, + 0xf1, 0x8e, + 0xf5, 0x8a, + 0xe1, 0x9e, + 0xeb, 0x94, + 0xfb, 0x04, + 0xff, 0x01, + 0xff, 0x03, + 0xff, 0x23, + 0xff, 0xb3, + 0xff, 0xa0, + 0xff, 0x80, + 0xff, 0x80, + 0xff, 0x81, + 0xff, 0xd0, + 0xff, 0xf3, + 0xff, 0xff, + 0xff, 0xfe, + 0xff, 0xf1, + 0xff, 0xc0, + 0xff, 0xc0, + 0xff, 0xc0, + 0xe7, 0x18, + 0xff, 0x03, + 0xff, 0x0f, + 0x7f, 0xbe, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xfb, + 0xff, 0xff, + 0xfe, 0xf6, + 0xfc, 0xfc, + 0xfc, 0xe8, + 0xf8, 0x90, + 0xf0, 0xb8, + 0xe0, 0x70, + 0xe0, 0x40, + 0xc0, 0x80, + 0x80, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x1f, 0x0f, + 0x06, 0x06, + 0x06, 0x06, + 0x06, 0x0e, + 0x0e, 0x04, + 0x0c, 0x06, + 0x0c, 0x0c, + 0x0f, 0x0f, + 0x0c, 0x0c, + 0x0c, 0x1c, + 0x1c, 0x08, + 0x18, 0x1c, + 0x18, 0x18, + 0x18, 0x18, + 0x3f, 0x3f, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 16 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xc0, 0x00, + 0xc0, 0xe0, + 0xe0, 0xc0, + 0xf0, 0x30, + 0xf8, 0x50, + 0xb8, 0x7c, + 0xfc, 0xf8, + 0xfc, 0xe8, + 0xfc, 0xcc, + 0xfc, 0x8c, + 0xfe, 0xf1, + 0xf3, 0xff, + 0xf3, 0xed, + 0xc3, 0xbd, + 0xcf, 0xf3, + 0xcf, 0xf3, + 0xc7, 0xff, + 0xcf, 0xf7, + 0xef, 0xdf, + 0xff, 0xf9, + 0xff, 0xff, + 0xff, 0x7f, + 0x3f, 0x1f, + 0x3f, 0x1f, + 0x1f, 0x3f, + 0x1f, 0x1f, + 0x1f, 0x1f, + 0x1f, 0x1f, + 0x1f, 0x0f, + 0x1f, 0x0f, + 0x1f, 0x0f, + 0x1f, 0x0f, + 0x7f, 0xbf, + 0xff, 0xff, + 0xf7, 0x89, + 0xfd, 0xe2, + 0xff, 0xf0, + 0xff, 0xf8, + 0xfe, 0x7d, + 0xff, 0x3e, + 0xff, 0x65, + 0xff, 0x7f, + 0x3f, 0xdf, + 0x7f, 0xbf, + 0xff, 0x3f, + 0xff, 0x7e, + 0xff, 0xfd, + 0xff, 0xfd, + 0xff, 0xff, + 0xff, 0xff, + 0x7f, 0x7e, + 0x3f, 0x3e, + 0x1f, 0x1d, + 0x0f, 0x07, + 0x02, 0x01, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 17 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0x08, + 0x1f, 0x0d, + 0x1f, 0x3f, + 0x3f, 0x1f, + 0x3f, 0x1f, + 0x3f, 0x3f, + 0x3f, 0x3f, + 0x3f, 0x1f, + 0x3f, 0x1f, + 0x3f, 0x1f, + 0x1f, 0x1f, + 0x1f, 0x1f, + 0x1f, 0x0f, + 0x0f, 0x1f, + 0x0f, 0x0f, + 0x0f, 0x0f, + 0x0f, 0x0f, + 0x0f, 0x0f, + 0x0f, 0x0f, + 0x0f, 0x0d, + 0x0f, 0x07, + 0x03, 0x04, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x0f, 0x17, + 0xbf, 0x5f, + 0xff, 0x7f, + 0x3f, 0xff, + 0x3f, 0xff, + 0x3f, 0xfe, + 0x7f, 0xb0, + 0xff, 0x71, + 0xff, 0x6e, + 0xfc, 0x73, + 0xc0, 0x80, + 0x01, 0x80, + 0x01, 0x03, + 0x07, 0x02, + 0x07, 0x03, + 0x01, 0x03, + 0x00, 0x01, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 18 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x80, + 0xe0, 0x80, + 0xf0, 0xf8, + 0xf8, 0x3c, + 0xfc, 0x7c, + 0xfc, 0x7c, + 0xfc, 0x7e, + 0xff, 0x7e, + 0xfd, 0xfa, + 0xfc, 0xfb, + 0xfc, 0xfb, + 0xf8, 0xff, + 0xf8, 0xf7, + 0xf8, 0xf7, + 0xf8, 0xff, + 0xfc, 0xfb, + 0xfc, 0xff, + 0xff, 0xff, + 0xff, 0x7f, + 0x7e, 0x01, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 19 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x07, 0x08, + 0x1f, 0x1f, + 0x3f, 0x1f, + 0x3f, 0x3f, + 0x3f, 0x3f, + 0x3f, 0x3f, + 0x3f, 0x3e, + 0x3f, 0x3e, + 0x3f, 0x1e, + 0x1f, 0x1f, + 0x1f, 0x0f, + 0x0f, 0x0f, + 0x07, 0x0f, + 0x07, 0x03, + 0x03, 0x03, + 0x01, 0x03, + 0x01, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00 +}; +#else +const unsigned char b_w = 1; +const unsigned char b_h = 8; +const char b_data[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; +#endif diff --git a/boop/trunk/display/drawDigit.c b/boop/trunk/display/drawDigit.c new file mode 100644 index 0000000..ff9f521 --- /dev/null +++ b/boop/trunk/display/drawDigit.c @@ -0,0 +1,127 @@ +/********************************************************************** +@file drawDigit.c + +@brief Draw a scalable 7-segment digit + +----------------------------------------------------------------------- +@author 2010 Roman Steiger + LeoTheLoewe [at] gmx [dot] de +----------------------------------------------------------------------- +Following compile flags are usable: + + +----------------------------------------------------------------------- + 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 3 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 . +----------------------------------------------------------------------- +@History + +1.00 10012010 RSt Creation + +@end +***********************************************************************/ +#include "global.h" +#include "lcd.h" +#include "drawDigit.h" + + +// |<- w ->| +// | | +// |d|1| w1|1|d| +// ___ ______ +// _ |_a_| _ _2_ ^ +// | | | | | +// d | | f h1 +// |_| ___ |_| ___ h +// _ |_b_| _ 1 +// | | | | +// e | | g | +// |_| ___ |_| v +// |_c_| _2____ +// + +#define DIGIT_SEG_A _BV (0) +#define DIGIT_SEG_B _BV (1) +#define DIGIT_SEG_C _BV (2) +#define DIGIT_SEG_D _BV (3) +#define DIGIT_SEG_E _BV (4) +#define DIGIT_SEG_F _BV (5) +#define DIGIT_SEG_G _BV (6) +#define DIGIT_SEG_H _BV (7) + +const unsigned char digitSegPattern [] = +{ +/* 0 */ DIGIT_SEG_A | DIGIT_SEG_C | DIGIT_SEG_D | DIGIT_SEG_E | DIGIT_SEG_F | DIGIT_SEG_G, +/* 1 */ DIGIT_SEG_F | DIGIT_SEG_G, +/* 2 */ DIGIT_SEG_A | DIGIT_SEG_B | DIGIT_SEG_C | DIGIT_SEG_E | DIGIT_SEG_F , +/* 3 */ DIGIT_SEG_A | DIGIT_SEG_B | DIGIT_SEG_C | DIGIT_SEG_F | DIGIT_SEG_G, +/* 4 */ DIGIT_SEG_B | DIGIT_SEG_D | DIGIT_SEG_F | DIGIT_SEG_G, +/* 5 */ DIGIT_SEG_A | DIGIT_SEG_B | DIGIT_SEG_C | DIGIT_SEG_D | DIGIT_SEG_G, +/* 6 */ DIGIT_SEG_A | DIGIT_SEG_B | DIGIT_SEG_C | DIGIT_SEG_D | DIGIT_SEG_E | DIGIT_SEG_G, +/* 7 */ DIGIT_SEG_A | DIGIT_SEG_F | DIGIT_SEG_G, +/* 8 */ DIGIT_SEG_A | DIGIT_SEG_B | DIGIT_SEG_C | DIGIT_SEG_D | DIGIT_SEG_E | DIGIT_SEG_F | DIGIT_SEG_G, +/* 9 */ DIGIT_SEG_A | DIGIT_SEG_B | DIGIT_SEG_C | DIGIT_SEG_D | DIGIT_SEG_F | DIGIT_SEG_G +}; +//----------------------------------------------------------------------------- + + + +//----------------------------------------------------------------------------- +void drawDigit (unsigned char x, unsigned char y, + unsigned char w, unsigned char h, + unsigned char digit, unsigned char d, unsigned char c, unsigned char m) +{ + char w1 = w - 2*d - 2; + char h1 = (h - 5) / 2; + unsigned char i, mode, pattern; + + pattern = 0; + if (digit <= 9) + pattern = digitSegPattern [digit]; + + w1 = max (w1, 3); + h1 = max (h1, 3); + if (!d) + d = DIGIT_BAR_WIDTH; + + for (i = 0; i < 3; i++) + { + mode = DRAW_ERASE; + if (pattern & _BV (i+0)) + mode = m; + draw_block (x + d+1, y + i*(h1+1), + w1, d, + c, mode); + } + for (i = 0; i < 2; i++) + { + mode = DRAW_ERASE; + if (pattern & _BV (i+3)) + mode = m; + draw_block (x, y + d-1 + i*(h1+1), + d, h1, + c, mode); + } + for (i = 0; i < 2; i++) + { + mode = DRAW_ERASE; + if (pattern & _BV (i+5)) + mode = m; + draw_block (x + d + 1 + w1 + 1, y + d-1 + i*(h1+1), + d, h1, + c, mode); + } +} // drawDigit +//----------------------------------------------------------------------------- + + diff --git a/boop/trunk/display/drawDigit.h b/boop/trunk/display/drawDigit.h new file mode 100644 index 0000000..5bd96e0 --- /dev/null +++ b/boop/trunk/display/drawDigit.h @@ -0,0 +1,68 @@ +/********************************************************************** +@file drawDigit.h + +@brief Draw a scalable 7-segment digit + +----------------------------------------------------------------------- +@author 2010 Roman Steiger + LeoTheLoewe [at] gmx [dot] de +----------------------------------------------------------------------- +Following compile flags are usable: + + +----------------------------------------------------------------------- + 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 3 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 . +----------------------------------------------------------------------- +@History + +1.00 10012010 RSt Creation + +@end +***********************************************************************/ +#ifndef __DRAW_DIGIT_H__ +#define __DRAW_DIGIT_H__ + +#include "global.h" +#include "lcd.h" + +#ifndef DIGIT_BAR_WIDTH +#define DIGIT_BAR_WIDTH 3 +#endif + +// |<- w ->| +// | | +// |d|1| w1|1|d| +// ___ ______ +// _ |_a_| _ _2_ ^ +// | | | | | +// d | | f h1 +// |_| ___ |_| ___ h +// _ |_b_| _ 1 +// | | | | +// e | | g | +// |_| ___ |_| v +// |_c_| _2____ +// + +//----------------------------------------------------------------------------- +void drawDigit (unsigned char x, unsigned char y, + unsigned char w, unsigned char h, + unsigned char digit, unsigned char d, unsigned char c, unsigned char m); +//----------------------------------------------------------------------------- + + +#endif // #ifndef __DRAW_DIGIT_H__ + + + diff --git a/boop/trunk/display/drawIcon.c b/boop/trunk/display/drawIcon.c new file mode 100644 index 0000000..4467bdb --- /dev/null +++ b/boop/trunk/display/drawIcon.c @@ -0,0 +1,363 @@ +/********************************************************************** +@file drawIcon.c + +@brief Draw Black/White and Gray scale icons with or without + Alpha channel (Transparency) + +----------------------------------------------------------------------- +@author 2010 Roman Steiger + LeoTheLoewe [at] gmx [dot] de +----------------------------------------------------------------------- +Following compile flags are usable: + + +----------------------------------------------------------------------- + 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 3 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 . +----------------------------------------------------------------------- +@History + +1.00 20012010 RSt Creation + +@end +***********************************************************************/ +#include "global.h" +#include "lcd.h" +#include "icon.h" + + +//----------------------------------------------------------------------------- +// Internally used functions + +static void _drawGray (unsigned char x, unsigned char y, + const unsigned char const *pData, + unsigned char width, unsigned char height, iconInfo_t iconInfo, + unsigned char m); + +static void _drawBlackWhite (unsigned char x, unsigned char y, + const unsigned char const *pData, + unsigned char width, unsigned char height, iconInfo_t iconInfo, + unsigned char c, unsigned char m); +//----------------------------------------------------------------------------- + + + +//----------------------------------------------------------------------------- +void drawIcon (unsigned char x, unsigned char y, + const icon_t const *pIcon, unsigned char c, unsigned char m) +{ + if (!pIcon) + return; + + drawIconExt (x, y, pIcon->data, + pIcon->width, pIcon->height, pIcon->info, + c, m); +} // drawIcon +//----------------------------------------------------------------------------- + + + +//----------------------------------------------------------------------------- +void drawIconExt (unsigned char x, unsigned char y, + const unsigned char const *pData, + unsigned char width, unsigned char height, iconInfo_t iconInfo, + unsigned char c, unsigned char m) +{ + switch (iconInfo) + { + case ICON_BLACK_WHITE_TRANSPARENT: /// 2 bpp + case ICON_BLACK_WHITE: /// 1 bpp + _drawBlackWhite (x, y, pData, + width, height, iconInfo, + c, m); + break; + + case ICON_GRAY_TRANSPARENT: /// 3 bpp + case ICON_GRAY: /// 2 bpp + _drawGray (x, y, pData, + width, height, iconInfo, + m); + break; + + default: + if (x + width > LCD_SIZE_X) + width = LCD_SIZE_X - x; + + if (y + height > LCD_SIZE_Y) + height = LCD_SIZE_Y - y; + + draw_rect (x, y, + width, height, + 1, LCD_COLOR_B, DRAW_XOR); + + break; + } // switch (iconInfo) +} // drawIconExt +//----------------------------------------------------------------------------- + + + +//----------------------------------------------------------------------------- +static void _drawGray (unsigned char x, unsigned char y, + const unsigned char const *pData, + unsigned char width, unsigned char height, iconInfo_t iconInfo, + unsigned char m) +{ + unsigned char alphaBuf [LCD_SIZE_X]; + unsigned short ix; + unsigned short iy; + unsigned char iconWidth = width; + unsigned char bpp; + unsigned char* alphaBuf_p; + + if(iconInfo==ICON_GRAY_TRANSPARENT) + { + alphaBuf_p = alphaBuf; + bpp=3; + } + else + { + alphaBuf_p = NULL; + bpp=2; + } + + + if (x + width > LCD_SIZE_X) + width = LCD_SIZE_X - x; + + if (y + height > LCD_SIZE_Y) + height = LCD_SIZE_Y - y; + + unsigned short idx = (width * bpp); // 3 byte per pixel + unsigned char s = y & 0x07; + is_drawing++; + if (s) + { + for (ix = 0; ix < width; ix++) + { + alphaBuf [ix] = 0; + drawbuf [1][ix] = 0; + drawbuf [0][ix] = 0; + } // for (ix = 0; ix < width; ix++) + + for (iy = 0; iy < height; iy += 8) + { + // Need to process two icon lines for one drawbuf line + if (iy) + { + for (ix = 0; ix < width; ix++) + { + idx -= bpp; + alphaBuf [ix] = pData [idx+2] >> (8-s); + drawbuf [1][ix] = pData [idx+1] >> (8-s); + drawbuf [0][ix] = pData [idx] >> (8-s); + } // for (ix = 0; ix < width; ix++) + + // go back to end of this page + idx += (width * bpp); // 3bpp + // goto next page + idx += (iconWidth * bpp); // 3bpp + } + for (ix = 0; ix < width; ix++) + { + idx -= bpp; + alphaBuf [ix] |= pData [idx+2] << s; + drawbuf [1][ix] |= pData [idx+1] << s; + drawbuf [0][ix] |= pData [idx] << s; + } + do_rcuAlpha (x, y+iy, width, m, alphaBuf_p); + + // go back to end of this page + idx += (width * bpp); // 3bpp + } // for (iy = 0; iy < height; iy += 8) + + /* Pixel in the last page: height & 0x07 + (i.e. 13 hight => 5 pixel in last page) */ + if (((height & 0x07) == 0) || + ((height & 0x07) > (8 - s))) + { + for (ix = 0; ix < width; ix++) + { + idx -= bpp; + alphaBuf [ix] = pData [idx+2] >> (8-s); + drawbuf [1][ix] = pData [idx+1] >> (8-s); + drawbuf [0][ix] = pData [idx] >> (8-s); + } // for (ix = 0; ix < width; ix++) + do_rcuAlpha (x, y+iy, width, m, alphaBuf_p); + + } + } + else + { + for (iy = 0; iy < height; iy += 8) + { + for (ix = 0; ix < width; ix++) + { + idx -= bpp; + alphaBuf [ix] = pData [idx+2]; + drawbuf [1][ix] = pData [idx+1]; + drawbuf [0][ix] = pData [idx]; + } + do_rcuAlpha (x, y+iy, width, m, alphaBuf_p); + + // go back to end of this page + idx += (width * bpp); // 3bpp + // goto next page + idx += (iconWidth * bpp); // 3bpp + } // for (iy = 0; iy < height; iy += 8) + } // else if (s) + is_drawing--; +} // _drawGrayAlpha +//----------------------------------------------------------------------------- + + +//----------------------------------------------------------------------------- +static void _drawBlackWhite (unsigned char x, unsigned char y, + const unsigned char const *pData, + unsigned char width, unsigned char height, iconInfo_t iconInfo, + unsigned char c, unsigned char m) +{ + unsigned char alphaBuf [LCD_SIZE_X]; + unsigned short ix; + unsigned short iy; + unsigned char iconWidth = width; + unsigned char bpp; + unsigned char* alphaBuf_p; + + if(iconInfo==ICON_BLACK_WHITE_TRANSPARENT) + { + alphaBuf_p = alphaBuf; + bpp=2; + } + else + { + alphaBuf_p = NULL; + bpp=1; + } + + if (x + width > LCD_SIZE_X) + width = LCD_SIZE_X - x; + + if (y + height > LCD_SIZE_Y) + height = LCD_SIZE_Y - y; + + unsigned short idx = width * bpp; // 1 byte per pixel + unsigned char s = y & 0x07; + is_drawing++; + if (s) + { + for (ix = 0; ix < width; ix++) + { + alphaBuf [ix] = 0; + drawbuf [1][ix] = 0; + drawbuf [0][ix] = 0; + } // for (ix = 0; ix < width; ix++) + + for (iy = 0; iy < height; iy += 8) + { + // Need to process two icon lines for one drawbuf line + if (iy) + { + for (ix = 0; ix < width; ix++) + { + idx -= bpp; + alphaBuf [ix] = pData [idx+1] >> (8-s); + if (c & 0x02) + drawbuf [0][ix] = pData [idx] >> (8-s); + else + drawbuf [0][ix] = 0; + + if (c & 0x01) + drawbuf [1][ix] = pData [idx] >> (8-s); + else + drawbuf [1][ix] = 0; + } // for (ix = 0; ix < width; ix++) + do_rcuAlpha (x, y+iy, width, m, alphaBuf_p); + + // go back to end of this page + idx += width * bpp; // 1bpp + // goto next page + idx += iconWidth * bpp; // 1bpp + } + for (ix = 0; ix < width; ix++) + { + idx -=bpp; + alphaBuf [ix] = pData [idx+1] << s; + if (c & 0x02) + drawbuf [0][ix] |= pData [idx] << s; + + if (c & 0x01) + drawbuf [1][ix] |= pData [idx] << s; + } + do_rcuAlpha (x, y+iy, width, m, alphaBuf_p); + + // go back to end of this page + idx += width * bpp; // 1bpp + } // for (iy = 0; iy < height; iy += 8) + + /* Pixel in the last page: height & 0x07 + (i.e. 13 hight => 5 pixel in last page) */ + if (((height & 0x07) == 0) || + ((height & 0x07) > (8 - s))) + { + for (ix = 0; ix < width; ix++) + { + idx -= bpp; + alphaBuf [ix] = pData [idx+1] >> (8-s); + if (c & 0x02) + drawbuf [0][ix] = pData [idx] >> (8-s); + else + drawbuf [0][ix] = 0; + + if (c & 0x01) + drawbuf [1][ix] = pData [idx] >> (8-s); + else + drawbuf [1][ix] = 0; + } // for (ix = 0; ix < width; ix++) + + do_rcuAlpha (x, y+iy, width, m, alphaBuf_p); + } + } + else + { + for (iy = 0; iy < height; iy += 8) + { + for (ix = 0; ix < width; ix++) + { + idx -= bpp; + alphaBuf [ix] = pData [idx+1]; + if (c & 0x02) + drawbuf [0][ix] = pData [idx]; + else + drawbuf [0][ix] = 0; + + if (c & 0x01) + drawbuf [1][ix] = pData [idx]; + else + drawbuf [1][ix] = 0; + } + do_rcuAlpha (x, y+iy, width, m, alphaBuf); + + // go back to end of this page + idx += width * bpp; // 1bpp + // goto next page + idx += iconWidth * bpp; // 1bpp + } // for (iy = 0; iy < height; iy += 8) + } // else if (s) + is_drawing--; +} // _drawBlackWhiteAlpha +//----------------------------------------------------------------------------- + + + + diff --git a/boop/trunk/display/fonts/charset.bits b/boop/trunk/display/fonts/charset.bits new file mode 100644 index 0000000..307a269 --- /dev/null +++ b/boop/trunk/display/fonts/charset.bits @@ -0,0 +1,118 @@ +const unsigned char charset_bits[] = { + 0x80, 0xc0, 0x80, 0xe0, 0x80, 0xc0, 0x80, 0xf0, 0x01, 0x03, 0x01, 0x07, + 0x01, 0x03, 0x01, 0x0f, 0x80, 0x88, 0xaa, 0xff, 0xff, 0xaa, 0x88, 0x80, + 0x00, 0xc0, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xf0, 0x00, 0x03, 0x00, 0x07, + 0x00, 0x03, 0x00, 0x0f, 0x80, 0x88, 0xaa, 0xab, 0xab, 0xaa, 0x88, 0x80, + 0x80, 0x80, 0x80, 0x70, 0x01, 0x01, 0x01, 0x0e, 0x0e, 0x01, 0x01, 0x01, + 0x70, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x24, + 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x92, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x81, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xaa, 0x02, 0x05, 0x02, 0x00, + 0x3e, 0x41, 0x41, 0x22, 0x02, 0x05, 0x02, 0x00, 0x7f, 0x09, 0x09, 0x01, + 0x1c, 0x22, 0x41, 0x4f, 0x41, 0x22, 0x1c, 0x1c, 0x22, 0x41, 0x4f, 0x47, + 0x22, 0x1c, 0x1c, 0x22, 0x41, 0x4f, 0x4f, 0x2e, 0x1c, 0x1c, 0x22, 0x41, + 0x4f, 0x5f, 0x3e, 0x1c, 0x1c, 0x22, 0x41, 0x7f, 0x7f, 0x3e, 0x1c, 0x1c, + 0x22, 0x71, 0x7f, 0x7f, 0x3e, 0x1c, 0x1c, 0x3a, 0x79, 0x7f, 0x7f, 0x3e, + 0x1c, 0x1c, 0x3e, 0x7d, 0x7f, 0x7f, 0x3e, 0x1c, 0x1c, 0x3e, 0x7f, 0x7f, + 0x7f, 0x3e, 0x1c, 0x00, 0x00, 0x5f, 0x03, 0x00, 0x03, 0x14, 0x7f, 0x14, + 0x7f, 0x14, 0x24, 0x4a, 0xff, 0x4a, 0x32, 0x63, 0x13, 0x08, 0x64, 0x63, + 0x36, 0x49, 0x55, 0x22, 0x50, 0x03, 0x1c, 0x22, 0x41, 0x41, 0x22, 0x1c, + 0x14, 0x08, 0x3e, 0x08, 0x14, 0x08, 0x08, 0x3e, 0x08, 0x08, 0x80, 0x60, + 0x60, 0x08, 0x08, 0x08, 0x08, 0x08, 0x60, 0x60, 0xc0, 0x30, 0x0c, 0x03, + 0x3e, 0x51, 0x49, 0x45, 0x3e, 0x00, 0x42, 0x7f, 0x40, 0x00, 0x42, 0x61, + 0x51, 0x49, 0x46, 0x22, 0x41, 0x49, 0x49, 0x36, 0x18, 0x14, 0x12, 0x7f, + 0x10, 0x27, 0x45, 0x45, 0x45, 0x39, 0x3e, 0x49, 0x49, 0x49, 0x32, 0x61, + 0x11, 0x09, 0x05, 0x03, 0x36, 0x49, 0x49, 0x49, 0x36, 0x26, 0x49, 0x49, + 0x49, 0x3e, 0x6c, 0x6c, 0x80, 0x6c, 0x6c, 0x08, 0x14, 0x22, 0x41, 0x14, + 0x14, 0x14, 0x14, 0x41, 0x22, 0x14, 0x08, 0x02, 0x01, 0x51, 0x09, 0x06, + 0x3e, 0x41, 0x59, 0x55, 0x5e, 0x7e, 0x09, 0x09, 0x09, 0x7e, 0x7f, 0x49, + 0x49, 0x49, 0x36, 0x3e, 0x41, 0x41, 0x41, 0x22, 0x7f, 0x41, 0x41, 0x41, + 0x3e, 0x7f, 0x49, 0x49, 0x41, 0x41, 0x7f, 0x09, 0x09, 0x01, 0x01, 0x3e, + 0x41, 0x41, 0x49, 0x3a, 0x7f, 0x08, 0x08, 0x08, 0x7f, 0x41, 0x7f, 0x41, + 0x30, 0x41, 0x41, 0x41, 0x3f, 0x7f, 0x08, 0x14, 0x22, 0x41, 0x7f, 0x40, + 0x40, 0x40, 0x40, 0x7f, 0x02, 0x0c, 0x02, 0x7f, 0x7f, 0x02, 0x04, 0x08, + 0x7f, 0x3e, 0x41, 0x41, 0x41, 0x3e, 0x7f, 0x09, 0x09, 0x09, 0x06, 0x3e, + 0x41, 0x41, 0x41, 0xbe, 0x7f, 0x09, 0x09, 0x09, 0x76, 0x26, 0x49, 0x49, + 0x49, 0x32, 0x01, 0x01, 0x7f, 0x01, 0x01, 0x3f, 0x40, 0x40, 0x40, 0x3f, + 0x1f, 0x20, 0x40, 0x20, 0x1f, 0x7f, 0x20, 0x10, 0x20, 0x7f, 0x41, 0x22, + 0x1c, 0x22, 0x41, 0x07, 0x08, 0x70, 0x08, 0x07, 0x61, 0x51, 0x49, 0x45, + 0x43, 0x7f, 0x41, 0x41, 0x03, 0x0c, 0x30, 0xc0, 0x41, 0x41, 0x7f, 0x02, + 0x01, 0x02, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01, 0x02, 0x20, 0x54, 0x54, + 0x78, 0x7f, 0x48, 0x48, 0x30, 0x38, 0x44, 0x44, 0x24, 0x30, 0x48, 0x48, + 0x7f, 0x38, 0x54, 0x54, 0x18, 0x08, 0x7e, 0x09, 0x02, 0x98, 0xa4, 0xa4, + 0x78, 0x7f, 0x08, 0x08, 0x70, 0x44, 0x7d, 0x40, 0x44, 0x84, 0x7d, 0x7f, + 0x10, 0x28, 0x44, 0x41, 0x7f, 0x40, 0x7c, 0x04, 0x18, 0x04, 0x78, 0x7c, + 0x08, 0x04, 0x78, 0x38, 0x44, 0x44, 0x38, 0xfc, 0x24, 0x24, 0x18, 0x18, + 0x24, 0x24, 0xfc, 0x7c, 0x08, 0x04, 0x08, 0x48, 0x54, 0x54, 0x24, 0x04, + 0x3f, 0x44, 0x3c, 0x40, 0x20, 0x7c, 0x1c, 0x20, 0x40, 0x20, 0x1c, 0x3c, + 0x40, 0x30, 0x40, 0x3c, 0x44, 0x28, 0x10, 0x28, 0x44, 0x9c, 0xa0, 0xa0, + 0x7c, 0x64, 0x54, 0x54, 0x4c, 0x08, 0x36, 0x41, 0x77, 0x41, 0x36, 0x08, + 0x08, 0x08, 0x2a, 0x1c, 0x08, 0x08, 0x1c, 0x2a, 0x08, 0x08, 0x00, 0x00, + 0x00, 0xdf, 0xdf, 0x07, 0x07, 0x00, 0x07, 0x07, 0x14, 0x3e, 0x14, 0x3e, + 0x14, 0x24, 0x4a, 0xff, 0x4a, 0x32, 0xf3, 0xfb, 0x18, 0xdf, 0xc7, 0x36, + 0x49, 0x55, 0x22, 0x50, 0x04, 0x07, 0x03, 0x3c, 0x7e, 0xc3, 0x81, 0x81, + 0xc3, 0x7e, 0x3c, 0x14, 0x08, 0x3e, 0x08, 0x14, 0x18, 0x7e, 0x7e, 0x18, + 0x80, 0x60, 0x60, 0x18, 0x18, 0x18, 0x18, 0x18, 0x60, 0x60, 0xc0, 0xf0, + 0x3c, 0x0f, 0x03, 0x7e, 0xff, 0xc3, 0xff, 0x7e, 0x04, 0xc6, 0xff, 0xff, + 0xc0, 0xe6, 0xf7, 0xd3, 0xdf, 0xce, 0x42, 0xc3, 0xdb, 0xff, 0x76, 0x38, + 0x3c, 0x36, 0xff, 0xff, 0x5f, 0xdf, 0xdb, 0xfb, 0x73, 0x7e, 0xff, 0xdb, + 0xfb, 0x72, 0x03, 0xf3, 0xfb, 0x0f, 0x07, 0x76, 0xff, 0xdb, 0xff, 0x76, + 0x4e, 0xdf, 0xdb, 0xff, 0x7e, 0x6c, 0x6c, 0x80, 0x6c, 0x6c, 0x18, 0x3c, + 0x66, 0xc3, 0x81, 0x36, 0x36, 0x36, 0x36, 0x81, 0xc3, 0x66, 0x3c, 0x18, + 0x06, 0xd3, 0xd9, 0x0f, 0x06, 0x7e, 0xc3, 0xdb, 0xd7, 0xde, 0xfe, 0xff, + 0x33, 0xff, 0xfe, 0xff, 0xff, 0xdb, 0xff, 0x66, 0x7e, 0xff, 0xc3, 0xe7, + 0x66, 0xff, 0xff, 0xc3, 0xff, 0x7e, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xff, + 0xff, 0x1b, 0x1b, 0x03, 0x7e, 0xff, 0xc3, 0xfb, 0x7a, 0xff, 0xff, 0x18, + 0xff, 0xff, 0xc3, 0xff, 0xff, 0xc3, 0x60, 0xe3, 0xc3, 0xff, 0x7f, 0xff, + 0xff, 0x1c, 0xf7, 0xe3, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xff, 0xfe, 0x0c, + 0xfe, 0xff, 0xff, 0xfe, 0x18, 0x7f, 0xff, 0x7e, 0xff, 0xc3, 0xff, 0x7e, + 0xff, 0xff, 0x1b, 0x1f, 0x0e, 0x7e, 0xff, 0xc3, 0x7f, 0xde, 0xff, 0xff, + 0x1b, 0xff, 0xee, 0x4e, 0xdf, 0xdb, 0xfb, 0x72, 0x03, 0xff, 0xff, 0x03, + 0x03, 0x7f, 0xff, 0xc0, 0xff, 0x7f, 0x3f, 0x7f, 0xc0, 0x7f, 0x3f, 0xff, + 0x7f, 0x30, 0x7f, 0xff, 0xe7, 0xe7, 0x18, 0x18, 0xe7, 0xe7, 0x0f, 0x1f, + 0xf0, 0x1f, 0x0f, 0xe3, 0xf3, 0xdb, 0xcf, 0xc7, 0xff, 0xff, 0xc3, 0xc3, + 0x03, 0x0f, 0x3c, 0xf0, 0xc0, 0xc3, 0xc3, 0xff, 0xff, 0x04, 0x06, 0x03, + 0x06, 0x04, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x03, 0x07, 0x60, 0xf4, 0xd4, + 0xf4, 0xf8, 0xff, 0xff, 0xcc, 0xfc, 0x78, 0x78, 0xfc, 0xcc, 0xcc, 0x48, + 0x78, 0xfc, 0xcc, 0xff, 0xff, 0x78, 0xfc, 0xac, 0xbc, 0xb8, 0x18, 0xfe, + 0xff, 0x1b, 0x1b, 0xb8, 0xbc, 0xac, 0xfc, 0x78, 0xff, 0xff, 0x18, 0xf8, + 0xf0, 0xcc, 0xfd, 0xfd, 0xc0, 0xc0, 0xcc, 0xfd, 0x7d, 0xff, 0xff, 0x10, + 0xfc, 0xec, 0x7f, 0xff, 0xc0, 0xc0, 0xfc, 0xfc, 0x0c, 0xfc, 0x0c, 0xfc, + 0xf8, 0xfc, 0xf8, 0x0c, 0xfc, 0xf8, 0x78, 0xfc, 0xcc, 0xfc, 0x78, 0xfc, + 0xfc, 0x6c, 0x7c, 0x38, 0x38, 0x7c, 0x6c, 0xfc, 0xf8, 0xfc, 0xf8, 0x0c, + 0x1c, 0x18, 0xd8, 0xdc, 0xfc, 0xec, 0x6c, 0x0c, 0x7f, 0xff, 0xcc, 0xcc, + 0x7c, 0xfc, 0xc0, 0x7c, 0xfc, 0x3c, 0x7c, 0xc0, 0x7c, 0x3c, 0x7c, 0xfc, + 0xc0, 0x60, 0xc0, 0xfc, 0x7c, 0xcc, 0xfc, 0x30, 0xfc, 0xdc, 0x9c, 0xbc, + 0xb0, 0xfc, 0x7c, 0xcc, 0xec, 0xfc, 0xdc, 0xcc, 0x10, 0x56, 0xef, 0x81, + 0xef, 0xef, 0x81, 0xee, 0x56, 0x10, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x18, + 0x3c, 0x7e, 0x18, 0x18, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, 0x3e, 0x1f, + 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, 0x3e, 0x1f, 0x8f, 0xe3, 0xf1, 0xf8, 0x7c, + 0x3e, 0x1f, 0x8f, 0xc7, 0xf1, 0xf8, 0x7c, 0x3e, 0x1f, 0x8f, 0xc7, 0xe3, + 0xf8, 0x7c, 0x3e, 0x1f, 0x8f, 0xc7, 0xe3, 0xf1, 0x7c, 0x3e, 0x1f, 0x8f, + 0xc7, 0xe3, 0xf1, 0xf8, 0x3e, 0x1f, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, + 0x1f, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, 0x3e, 0xff, 0xff, 0xe7, 0xc3, + 0xc3, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xc3, 0xc3, 0xe7, 0xff, 0xff, + 0xff, 0xf8, 0xe0, 0xc0, 0xc0, 0xe0, 0xf8, 0xff, 0xff, 0x1f, 0x07, 0x03, + 0x03, 0x07, 0x1f, 0xff, 0x1c, 0x3e, 0x77, 0x63, 0x77, 0x3e, 0x1c, 0x1c, + 0x36, 0x63, 0x41, 0x63, 0x36, 0x1c, 0x1c, 0x08, 0x41, 0x63, 0x41, 0x08, + 0x1c, 0x08, 0x14, 0x22, 0x49, 0x22, 0x14, 0x08, 0x55, 0xaa, 0x55, 0xaa, + 0x55, 0xaa, 0x55, 0xaa, 0x33, 0x33, 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, + 0x33, 0x33, 0x0e, 0x11, 0x0e, 0x12, 0x1f, 0x10, 0x19, 0x15, 0x12, 0x11, + 0x15, 0x0a, 0x07, 0x04, 0x1e, 0x17, 0x15, 0x09, 0x0e, 0x15, 0x09, 0x01, + 0x1d, 0x03, 0x0a, 0x15, 0x0a, 0x12, 0x15, 0x0e, 0x0a, 0x10, 0x0a, 0x04, + 0x0a, 0x11, 0x0a, 0x0a, 0x0a, 0x11, 0x0a, 0x04, 0x01, 0x15, 0x02, 0x01, + 0x03, 0x07, 0x03, 0x01, 0x04, 0x06, 0x07, 0x06, 0x04, 0x04, 0x0e, 0x1f, + 0x1f, 0x0e, 0x04, 0x18, 0x3c, 0x7e, 0x7e, 0x3c, 0x18, 0x3c, 0x42, 0x81, + 0x81, 0x81, 0x81, 0x42, 0x3c, 0x3c, 0x42, 0x99, 0xbd, 0xbd, 0x99, 0x42, + 0x3c, 0x7f, 0x49, 0x41, 0x6b, 0x41, 0x49, 0x7f, 0x80, 0x40, 0x20, 0x10, + 0x0f, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x3e, 0x01, 0x01, 0x01, + 0x01, 0x02, 0x04, 0x38, 0x08, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, + 0x15, 0x0a, 0x15, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/boop/trunk/display/fonts/charset.info b/boop/trunk/display/fonts/charset.info new file mode 100644 index 0000000..5c205b8 --- /dev/null +++ b/boop/trunk/display/fonts/charset.info @@ -0,0 +1,22 @@ +const unsigned char charset_info[] = { +0x08, 0x84, 0x48, 0x84, 0x44, 0x44, 0x48, 0x88, // 0- 15 graticule & borders +0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, // 16- 31 graticule & symbols +0x21, 0x35, 0x55, 0x51, 0x33, 0x55, 0x35, 0x24, // 32- 47 ascii, font 1 +0x55, 0x55, 0x55, 0x55, 0x55, 0x23, 0x44, 0x45, // 48- 63 ascii, font 1 +0x55, 0x55, 0x55, 0x55, 0x53, 0x55, 0x55, 0x55, // 64- 80 ascii, font 1 +0x55, 0x55, 0x55, 0x55, 0x55, 0x53, 0x43, 0x35, // 80- 95 ascii, font 1 +0x24, 0x44, 0x44, 0x44, 0x43, 0x34, 0x35, 0x44, // 96-112 ascii, font 1 +0x44, 0x44, 0x34, 0x55, 0x54, 0x43, 0x13, 0x55, // 112-127 ascii, font 1 +0x32, 0x55, 0x55, 0x53, 0x44, 0x54, 0x35, 0x25, // 128-143 ascii, bold font +0x55, 0x55, 0x55, 0x55, 0x55, 0x23, 0x54, 0x55, // 144-159 ascii, bold font +0x55, 0x55, 0x55, 0x55, 0x54, 0x55, 0x55, 0x55, // 160-175 ascii, bold font +0x55, 0x55, 0x55, 0x55, 0x65, 0x54, 0x54, 0x55, // 176-191 ascii, bold font +0x25, 0x55, 0x55, 0x55, 0x54, 0x45, 0x47, 0x55, // 192-207 ascii, bold font +0x55, 0x55, 0x55, 0x57, 0x55, 0x54, 0x24, 0x55, // 208-223 ascii, bold font +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, // 224-239 symbols +0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 240-255 symbols +0x33, 0x33, 0x33, 0x33, 0x33, 0x12, 0x33, 0x33, // 256-271 small numbers +0x55, 0x33, 0x68, 0x87, 0x84, 0x44, 0x44, 0x44 // 272-288 symbols +}; + +const unsigned char charset_dlines = 1; diff --git a/boop/trunk/display/fonts/smooth.bits b/boop/trunk/display/fonts/smooth.bits new file mode 100644 index 0000000..5bda21c --- /dev/null +++ b/boop/trunk/display/fonts/smooth.bits @@ -0,0 +1,279 @@ +const unsigned char smooth_mt_bits[] = { + 0x00, 0x00, 0x00, 0xfc, 0xfc, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x20, 0x20, + 0xe0, 0x3c, 0x20, 0xe0, 0x3c, 0x20, 0x20, 0xe0, 0xf0, 0x10, 0xfc, 0x10, + 0x30, 0x60, 0x78, 0xfc, 0x84, 0xfc, 0x78, 0x00, 0x80, 0x20, 0x18, 0x84, + 0x80, 0x80, 0x00, 0x80, 0xc0, 0x7c, 0x64, 0xc4, 0x84, 0x0c, 0x00, 0x40, + 0xc0, 0x40, 0x00, 0x3c, 0x3c, 0xe0, 0xf8, 0x0c, 0x04, 0x04, 0x08, 0xf0, + 0x80, 0x00, 0x50, 0x60, 0xfc, 0x60, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x78, 0x0c, 0xf0, 0xf8, 0x04, 0x04, 0x04, + 0x0c, 0xf8, 0xc0, 0x08, 0x08, 0xfc, 0xfc, 0x00, 0x00, 0x18, 0x04, 0x04, + 0x04, 0x8c, 0xf8, 0x30, 0x08, 0x04, 0x44, 0x44, 0x44, 0xbc, 0x98, 0x00, + 0x00, 0x80, 0x40, 0x30, 0x08, 0xfc, 0xfc, 0x00, 0x7c, 0x44, 0x44, 0x44, + 0x44, 0x84, 0x00, 0xe0, 0xf8, 0x4c, 0x44, 0x44, 0xc4, 0x8c, 0x00, 0x0c, + 0x04, 0x04, 0x04, 0xc4, 0x74, 0x0c, 0x00, 0x10, 0xb8, 0x44, 0x44, 0x44, + 0xfc, 0xb8, 0x00, 0x70, 0xf8, 0x04, 0x04, 0x04, 0x8c, 0xf8, 0xc0, 0xc0, + 0x00, 0x00, 0xc0, 0x00, 0x80, 0x80, 0x80, 0xc0, 0x40, 0x40, 0x20, 0x20, + 0x30, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x30, 0x20, + 0x20, 0x40, 0x40, 0xc0, 0x80, 0x80, 0x80, 0x08, 0x04, 0x84, 0x84, 0xc4, + 0x78, 0x10, 0x80, 0xc0, 0x20, 0x10, 0x80, 0xc8, 0x48, 0x08, 0x88, 0x90, + 0x10, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x18, 0x1c, 0xf8, 0xc0, + 0x00, 0x00, 0x00, 0x04, 0xfc, 0xfc, 0x84, 0x84, 0x84, 0xc4, 0x78, 0x30, + 0xe0, 0xf0, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x18, 0x00, 0x04, 0xfc, + 0xfc, 0x04, 0x04, 0x04, 0x04, 0x08, 0xf0, 0xe0, 0x04, 0x04, 0xfc, 0xfc, + 0x84, 0x84, 0x84, 0xe4, 0x0c, 0x04, 0xfc, 0xfc, 0x84, 0x84, 0x84, 0x84, + 0xe4, 0x0c, 0xe0, 0xf0, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x00, + 0x04, 0xfc, 0xfc, 0x84, 0x80, 0x80, 0x80, 0x84, 0xfc, 0xfc, 0x04, 0x04, + 0xfc, 0xfc, 0x04, 0x00, 0x00, 0x04, 0x04, 0xfc, 0xfc, 0x04, 0x04, 0xfc, + 0xfc, 0xc4, 0x20, 0x20, 0x14, 0x0c, 0x04, 0x04, 0x00, 0x04, 0xfc, 0xfc, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfc, 0x1c, 0x38, 0xf0, 0xc0, + 0x00, 0x00, 0x80, 0x60, 0x18, 0xfc, 0xfc, 0x04, 0x04, 0xfc, 0x1c, 0x38, + 0x60, 0xc0, 0x80, 0x00, 0x04, 0xfc, 0x04, 0x04, 0xe0, 0xf0, 0x08, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x18, 0xf0, 0x80, 0x04, 0xfc, 0xfc, 0x84, 0x84, + 0x84, 0xc4, 0x78, 0x30, 0xe0, 0xf0, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x18, 0xf0, 0x80, 0x04, 0xfc, 0xfc, 0x84, 0x84, 0x84, 0x84, 0x7c, 0x38, + 0x00, 0x00, 0x38, 0x7c, 0xc4, 0x84, 0x84, 0x84, 0x1c, 0x18, 0x0c, 0x04, + 0x04, 0x04, 0xfc, 0xfc, 0x04, 0x04, 0x04, 0x0c, 0x04, 0xfc, 0xfc, 0x04, + 0x00, 0x00, 0x00, 0x04, 0xfc, 0xfc, 0x04, 0x04, 0x0c, 0x3c, 0xe4, 0x80, + 0x00, 0x00, 0x80, 0x64, 0x0c, 0x04, 0x04, 0x0c, 0xfc, 0xc4, 0x00, 0x00, + 0xe0, 0x1c, 0x7c, 0xc0, 0x00, 0x00, 0xe4, 0x1c, 0x04, 0x04, 0x04, 0x1c, + 0x7c, 0xe0, 0xc0, 0x34, 0x0c, 0x04, 0x04, 0x04, 0x0c, 0x1c, 0x74, 0xe0, + 0x80, 0x40, 0x14, 0x0c, 0x04, 0x0c, 0x04, 0x04, 0x84, 0xc4, 0x74, 0x3c, + 0x0c, 0x04, 0xfc, 0xfc, 0x04, 0x00, 0x0c, 0x78, 0xc0, 0x00, 0x00, 0x04, + 0x04, 0xfc, 0xfc, 0x20, 0x10, 0x18, 0x0c, 0x04, 0x0c, 0x10, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x40, + 0x60, 0x20, 0x20, 0x20, 0xc0, 0x80, 0x00, 0x00, 0x04, 0xfc, 0xfc, 0x20, + 0x20, 0x20, 0xc0, 0x80, 0x80, 0xc0, 0x20, 0x20, 0x20, 0x20, 0x40, 0x80, + 0xc0, 0x20, 0x20, 0x24, 0xfc, 0xfc, 0x00, 0x00, 0x80, 0xc0, 0x20, 0x20, + 0x20, 0x20, 0xc0, 0x00, 0x20, 0xf8, 0xfc, 0x24, 0x24, 0x04, 0x00, 0x80, + 0xc0, 0x20, 0x20, 0x20, 0xe0, 0xe0, 0x20, 0x04, 0xfc, 0xfc, 0x20, 0x20, + 0x20, 0xe0, 0x80, 0x00, 0x20, 0xec, 0xe0, 0x00, 0x00, 0x00, 0x20, 0xec, + 0xec, 0x04, 0xfc, 0xfc, 0x00, 0xa0, 0x60, 0x20, 0x20, 0x04, 0xfc, 0xfc, + 0x00, 0x20, 0xe0, 0xe0, 0x20, 0x20, 0x20, 0xe0, 0xc0, 0x20, 0x20, 0x20, + 0xe0, 0x80, 0x00, 0x20, 0xe0, 0xe0, 0x20, 0x20, 0x20, 0xe0, 0x80, 0x00, + 0x80, 0xc0, 0x20, 0x20, 0x20, 0x60, 0xc0, 0x00, 0x20, 0xe0, 0xe0, 0x20, + 0x20, 0x20, 0x60, 0xc0, 0x00, 0x80, 0xc0, 0x20, 0x20, 0x20, 0xe0, 0xe0, + 0x20, 0x20, 0xe0, 0xe0, 0x20, 0x20, 0x60, 0x60, 0xc0, 0xe0, 0x20, 0x20, + 0x60, 0x60, 0x20, 0xf8, 0xf8, 0x20, 0x20, 0x00, 0x20, 0xe0, 0xe0, 0x00, + 0x00, 0x20, 0xe0, 0xe0, 0x00, 0x20, 0x60, 0xe0, 0x20, 0x00, 0x00, 0xa0, + 0x60, 0x20, 0x20, 0x60, 0xe0, 0x20, 0x00, 0x80, 0xe0, 0x80, 0x00, 0x20, + 0xe0, 0x20, 0x20, 0x60, 0xe0, 0x00, 0x80, 0xe0, 0x20, 0x20, 0x20, 0x20, + 0xe0, 0xa0, 0x00, 0x00, 0xa0, 0x60, 0x20, 0x60, 0x60, 0x20, 0x20, 0xe0, + 0xe0, 0x20, 0x00, 0x00, 0xf8, 0x7c, 0x04, 0x04, 0xfc, 0xfc, 0x04, 0x04, + 0xfc, 0xf0, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x40, 0x6c, 0x20, 0x20, 0x2c, 0xc0, 0x80, 0x00, 0x80, 0xc0, 0x2c, + 0x20, 0x20, 0x6c, 0xc0, 0x00, 0x20, 0xe0, 0xec, 0x00, 0x00, 0x2c, 0xe0, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x39, 0x1c, 0xf9, 0xc0, 0x00, 0x00, + 0x00, 0xe0, 0xf0, 0x08, 0x05, 0x04, 0x04, 0x05, 0x04, 0x18, 0xf0, 0x80, + 0x04, 0xfc, 0xfc, 0x04, 0x01, 0x00, 0x00, 0x05, 0xfc, 0xfc, 0x04, 0x00, + 0x00, 0xf8, 0xfc, 0x04, 0x64, 0xf4, 0x8c, 0x00, 0x00 }; + +const unsigned char smooth_lt_bits[] = { + 0x00, 0x00, 0x00, 0xfc, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0xf8, 0x6c, 0x00, 0xf0, 0x7c, 0x04, 0x00, 0xc0, 0xa0, 0x10, 0xfc, 0x10, + 0x60, 0x10, 0x30, 0x4c, 0x84, 0x4c, 0x30, 0x00, 0x40, 0x70, 0x80, 0x8c, + 0x80, 0x00, 0x00, 0x00, 0xd8, 0x38, 0x4c, 0x84, 0x04, 0x00, 0x0c, 0x00, + 0x40, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x30, 0x00, 0x00, 0x00, 0x3c, 0xf8, + 0x40, 0xd8, 0x50, 0x10, 0xfc, 0x10, 0x50, 0xd8, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0x14, 0xe0, 0x18, 0x08, 0x04, 0x04, + 0x18, 0xf0, 0x20, 0x10, 0x04, 0xfc, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, + 0x04, 0xc4, 0x7c, 0x78, 0x04, 0x08, 0x00, 0x44, 0xe4, 0xe8, 0x38, 0x00, + 0x00, 0x80, 0xe0, 0x00, 0x1c, 0xfc, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x40, + 0x80, 0xc0, 0x80, 0xd0, 0x90, 0x80, 0x04, 0x44, 0x04, 0x88, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x80, 0xac, 0x1c, 0x04, 0xa8, 0xfc, 0xec, 0x44, 0x44, + 0x28, 0x98, 0x00, 0xf8, 0x8c, 0x8c, 0x04, 0x04, 0x00, 0xf0, 0x20, 0xc0, + 0xc0, 0x00, 0xc0, 0xc0, 0x00, 0x80, 0xc0, 0x00, 0xc0, 0x60, 0x60, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x60, 0x60, 0xc0, 0x00, 0xc0, 0x80, 0x00, 0x04, 0x08, 0x04, 0x84, 0x0c, + 0x7c, 0x28, 0x00, 0xe0, 0x70, 0x10, 0xd8, 0x00, 0x00, 0x48, 0x80, 0x88, + 0x30, 0x30, 0xe0, 0x80, 0x00, 0x00, 0x80, 0x40, 0x2c, 0x2c, 0x70, 0xa0, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x84, 0x00, 0x00, 0x84, 0x8c, 0xfc, 0x08, + 0xd0, 0x38, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x08, 0x0c, 0x18, 0x00, 0xfc, + 0x04, 0x00, 0x04, 0x04, 0x08, 0x1c, 0x38, 0xd0, 0x00, 0x00, 0xfc, 0x84, + 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x00, 0x04, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x1c, 0xd0, 0x38, 0x0c, 0x00, 0x04, 0x00, 0x04, 0x08, 0x1c, 0x18, + 0x00, 0x04, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xfc, 0x00, 0x00, + 0x04, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x04, 0x00, 0x00, 0x04, + 0xfc, 0x80, 0xc0, 0x10, 0x08, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0c, 0x7c, 0x60, 0x80, + 0x80, 0x00, 0x00, 0x10, 0x04, 0xfc, 0x04, 0x00, 0x00, 0xfc, 0x0c, 0x30, + 0xf0, 0xc0, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xd0, 0x38, 0x1c, 0x00, + 0x04, 0x00, 0x04, 0x08, 0x28, 0xf0, 0x60, 0x00, 0x04, 0xfc, 0x00, 0x00, + 0x84, 0x0c, 0xfc, 0x08, 0xd0, 0x38, 0x1c, 0x00, 0x04, 0x00, 0x04, 0x08, + 0x28, 0xf0, 0x60, 0x00, 0x04, 0xfc, 0x00, 0x80, 0x84, 0x84, 0xc8, 0x70, + 0x00, 0x00, 0x70, 0xe8, 0xc4, 0xc0, 0x84, 0x84, 0x88, 0x04, 0x1c, 0x00, + 0x00, 0x00, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0xfc, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0xfc, 0x00, 0x00, 0x14, 0x7c, 0xf0, 0x40, + 0x00, 0x00, 0x40, 0xb0, 0x14, 0x00, 0x00, 0x14, 0x7c, 0xa0, 0x00, 0x00, + 0x50, 0x2c, 0xb8, 0xa0, 0x00, 0x00, 0x10, 0x24, 0x00, 0x00, 0x0c, 0x0c, + 0x3c, 0xf0, 0xe0, 0x00, 0x1c, 0x04, 0x00, 0x00, 0x04, 0x3c, 0x38, 0xc0, + 0xc0, 0xe0, 0x3c, 0x04, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xe0, 0x60, 0x1c, + 0x1c, 0x00, 0xfc, 0x04, 0x00, 0x04, 0x14, 0xb4, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0x00, 0x20, 0x30, 0x08, 0x0c, 0x0c, 0x18, 0x18, 0x10, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x08, 0x20, + 0x20, 0x20, 0x20, 0x60, 0xe0, 0x40, 0x00, 0x04, 0x00, 0xfc, 0x40, 0x00, + 0x00, 0x20, 0x60, 0xc0, 0xc0, 0x60, 0x60, 0x20, 0x20, 0x40, 0x20, 0xc0, + 0x60, 0x20, 0x00, 0x00, 0x44, 0xfc, 0x00, 0x00, 0xc0, 0x60, 0x60, 0x20, + 0x20, 0x40, 0xc0, 0x80, 0x00, 0xfc, 0x24, 0x04, 0x04, 0x04, 0x04, 0xc0, + 0x60, 0x20, 0x00, 0x00, 0x40, 0xe0, 0x00, 0x00, 0xfc, 0x40, 0x00, 0x00, + 0x60, 0xc0, 0x40, 0x00, 0x00, 0xe4, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x24, + 0xe4, 0x00, 0xfc, 0x00, 0x80, 0x40, 0x20, 0x20, 0x00, 0x00, 0xfc, 0x00, + 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x60, 0xc0, 0x40, 0x00, 0x00, 0x60, + 0xc0, 0x40, 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x60, 0xc0, 0x40, 0x00, + 0xc0, 0x60, 0x60, 0x20, 0x20, 0x00, 0xc0, 0x80, 0x00, 0xe0, 0x40, 0x40, + 0x00, 0x20, 0x00, 0xc0, 0x80, 0xc0, 0x60, 0x20, 0x00, 0x00, 0x40, 0xe0, + 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x20, 0x60, 0xc0, 0x80, 0x20, 0x20, + 0x20, 0x40, 0x00, 0xfc, 0x24, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xa0, 0xe0, 0x80, 0x00, 0x00, 0x00, + 0xa0, 0x00, 0x00, 0xa0, 0xe0, 0x00, 0x00, 0x40, 0x60, 0x40, 0x00, 0x80, + 0x60, 0x20, 0x20, 0x20, 0xe0, 0x80, 0x00, 0x20, 0x60, 0x00, 0x00, 0x60, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x60, 0x20, 0x00, 0x80, 0xa0, + 0x60, 0x60, 0x00, 0x80, 0xfc, 0x84, 0x04, 0x00, 0xfc, 0x00, 0x00, 0x04, + 0x78, 0x88, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x24, 0x2c, 0x20, 0x64, 0xec, 0x40, 0x00, 0xc0, 0x6c, 0x64, + 0x20, 0x2c, 0x04, 0xc0, 0x80, 0x00, 0xec, 0x04, 0x00, 0x0c, 0x04, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x55, 0x2c, 0x75, 0xa1, 0x00, 0x00, + 0x00, 0xd0, 0x38, 0x1c, 0x00, 0x05, 0x00, 0x04, 0x09, 0x28, 0xf0, 0x60, + 0x00, 0x04, 0xfc, 0x01, 0x00, 0x00, 0x01, 0x00, 0x04, 0xfc, 0x00, 0x00, + 0x00, 0xf8, 0x00, 0x04, 0xf4, 0x9c, 0x08, 0x08, 0x00 }; + +const unsigned char smooth_mb_bits[] = { + 0x00, 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x1e, + 0x03, 0x02, 0x1e, 0x03, 0x02, 0x02, 0x00, 0x08, 0x19, 0x11, 0xff, 0x12, + 0x1e, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x04, 0x01, 0x00, 0x06, 0x0f, 0x10, + 0x10, 0x1f, 0x0f, 0x07, 0x0c, 0x10, 0x10, 0x10, 0x11, 0x13, 0x0e, 0x1e, + 0x11, 0x10, 0x10, 0x00, 0x00, 0x0f, 0x1f, 0x20, 0x40, 0x40, 0x30, 0x1f, + 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x1f, 0x1f, 0x01, 0x01, 0x01, 0x20, 0x38, 0x08, 0x01, 0x01, 0x01, 0x01, + 0x18, 0x00, 0x30, 0x1e, 0x03, 0x00, 0x00, 0x07, 0x0f, 0x10, 0x10, 0x10, + 0x18, 0x0f, 0x01, 0x10, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x18, 0x1c, 0x16, + 0x13, 0x11, 0x10, 0x18, 0x0c, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x02, + 0x03, 0x02, 0x02, 0x12, 0x12, 0x1f, 0x1f, 0x12, 0x0c, 0x10, 0x10, 0x10, + 0x10, 0x0f, 0x07, 0x07, 0x0f, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x02, 0x00, + 0x00, 0x18, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x07, 0x0f, 0x10, 0x10, 0x10, + 0x18, 0x0f, 0x02, 0x00, 0x18, 0x11, 0x11, 0x11, 0x08, 0x07, 0x00, 0x18, + 0x00, 0x00, 0x38, 0x08, 0x01, 0x01, 0x02, 0x02, 0x06, 0x04, 0x04, 0x0c, + 0x08, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x08, 0x0c, + 0x04, 0x04, 0x06, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x3f, 0x20, 0x42, 0x8f, 0x98, 0x90, 0x90, 0x9f, 0x1f, + 0x10, 0x08, 0x07, 0x01, 0x10, 0x18, 0x13, 0x02, 0x02, 0x02, 0x02, 0x13, + 0x1e, 0x18, 0x10, 0x10, 0x1f, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x0e, + 0x03, 0x07, 0x08, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0c, 0x00, 0x10, 0x1f, + 0x1f, 0x10, 0x10, 0x10, 0x10, 0x08, 0x07, 0x03, 0x10, 0x10, 0x1f, 0x1f, + 0x10, 0x10, 0x10, 0x11, 0x18, 0x10, 0x1f, 0x1f, 0x10, 0x10, 0x00, 0x00, + 0x01, 0x00, 0x03, 0x07, 0x08, 0x10, 0x10, 0x10, 0x10, 0x11, 0x1f, 0x0f, + 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x10, + 0x1f, 0x1f, 0x10, 0xc0, 0x80, 0x80, 0x80, 0x7f, 0x3f, 0x00, 0x10, 0x1f, + 0x1f, 0x10, 0x01, 0x02, 0x0c, 0x1c, 0x18, 0x10, 0x00, 0x10, 0x1f, 0x1f, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x1c, 0x10, 0x1f, 0x10, 0x10, 0x00, 0x01, + 0x07, 0x06, 0x01, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x10, 0x1f, 0x10, 0x10, + 0x00, 0x00, 0x03, 0x06, 0x0c, 0x1f, 0x00, 0x00, 0x03, 0x07, 0x08, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x0c, 0x07, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x08, 0x10, 0x10, 0x10, 0x30, 0x50, + 0x4c, 0x07, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x00, 0x01, 0x07, 0x1c, + 0x10, 0x00, 0x0c, 0x1c, 0x10, 0x10, 0x10, 0x11, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x18, + 0x10, 0x10, 0x10, 0x10, 0x0f, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, + 0x1c, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1e, 0x0e, + 0x00, 0x00, 0x00, 0x07, 0x1e, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x10, 0x1c, + 0x12, 0x01, 0x03, 0x17, 0x1c, 0x18, 0x10, 0x00, 0x00, 0x00, 0x10, 0x1f, + 0x1f, 0x10, 0x00, 0x00, 0x00, 0x18, 0x1c, 0x16, 0x13, 0x10, 0x10, 0x10, + 0x10, 0x18, 0x7f, 0x7f, 0x40, 0x00, 0x00, 0x00, 0x03, 0x1e, 0x30, 0x40, + 0x40, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0x1f, 0x11, 0x11, 0x11, 0x1f, 0x1f, 0x10, 0x00, 0x10, 0x1f, 0x1f, 0x10, + 0x10, 0x10, 0x0f, 0x07, 0x07, 0x0f, 0x10, 0x10, 0x10, 0x08, 0x04, 0x07, + 0x0f, 0x10, 0x10, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x07, 0x0f, 0x11, 0x11, + 0x11, 0x11, 0x0d, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x47, + 0xcf, 0x90, 0x90, 0x90, 0xff, 0x7f, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x00, + 0x10, 0x1f, 0x1f, 0x10, 0x10, 0x1f, 0x1f, 0x10, 0xc0, 0x80, 0x80, 0xff, + 0x7f, 0x10, 0x1f, 0x1f, 0x11, 0x12, 0x1c, 0x18, 0x10, 0x10, 0x1f, 0x1f, + 0x10, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x10, + 0x1f, 0x1f, 0x00, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x10, 0x1f, 0x1f, 0x10, + 0x07, 0x0f, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x03, 0x80, 0xff, 0xff, 0x90, + 0x10, 0x10, 0x18, 0x0f, 0x03, 0x07, 0x0f, 0x10, 0x10, 0x90, 0xff, 0xff, + 0x80, 0x10, 0x1f, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x18, 0x19, 0x13, 0x13, + 0x1e, 0x0e, 0x00, 0x0f, 0x1f, 0x10, 0x18, 0x08, 0x00, 0x0f, 0x1f, 0x10, + 0x10, 0x00, 0x1f, 0x1f, 0x10, 0x00, 0x00, 0x01, 0x07, 0x1c, 0x0c, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x1e, 0x1c, 0x03, 0x00, 0x0f, 0x1c, 0x07, + 0x00, 0x00, 0x10, 0x18, 0x14, 0x03, 0x17, 0x1c, 0x18, 0x10, 0x00, 0xc0, + 0x80, 0xc7, 0x3c, 0x0c, 0x01, 0x00, 0x00, 0x10, 0x1c, 0x1e, 0x13, 0x11, + 0x10, 0x18, 0x01, 0x01, 0x7e, 0xfc, 0x80, 0x80, 0xff, 0xff, 0x80, 0x80, + 0xfe, 0x3f, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x00, 0x0e, 0x1f, 0x11, 0x11, 0x11, 0x1f, 0x1f, 0x10, 0x07, 0x0f, 0x10, + 0x10, 0x10, 0x18, 0x0f, 0x03, 0x00, 0x0f, 0x1f, 0x10, 0x10, 0x00, 0x1f, + 0x1f, 0x10, 0x10, 0x18, 0x17, 0x03, 0x02, 0x02, 0x02, 0x17, 0x1e, 0x18, + 0x10, 0x03, 0x07, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0c, 0x07, 0x00, + 0x00, 0x03, 0x0f, 0x18, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x07, 0x00, 0x00, + 0x10, 0x1f, 0x1f, 0x18, 0x10, 0x10, 0x11, 0x1b, 0x0e }; + +const unsigned char smooth_lb_bits[] = { + 0x00, 0x00, 0x00, 0x1b, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1f, + 0x07, 0x00, 0x1b, 0x0f, 0x00, 0x00, 0x00, 0x19, 0x11, 0x13, 0xff, 0x13, + 0x06, 0x0e, 0x00, 0x00, 0x10, 0x10, 0x02, 0x02, 0x00, 0x09, 0x1f, 0x19, + 0x10, 0x09, 0x06, 0x0f, 0x1b, 0x08, 0x10, 0x01, 0x13, 0x0e, 0x0c, 0x0c, + 0x1a, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38, 0x40, 0x00, 0x00, 0x68, 0x3f, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x01, 0x00, 0x00, 0x00, 0x50, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x28, 0x2d, 0x05, 0x00, 0x00, 0x03, 0x0c, 0x08, 0x10, 0x10, + 0x0c, 0x07, 0x02, 0x10, 0x10, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x18, + 0x18, 0x18, 0x18, 0x1c, 0x1c, 0x08, 0x10, 0x00, 0x10, 0x01, 0x0f, 0x05, + 0x02, 0x03, 0x00, 0x10, 0x10, 0x1f, 0x12, 0x10, 0x1c, 0x18, 0x10, 0x10, + 0x18, 0x18, 0x0f, 0x03, 0x18, 0x08, 0x00, 0x10, 0x00, 0x0f, 0x05, 0x00, + 0x00, 0x10, 0x15, 0x03, 0x00, 0x00, 0x00, 0x0f, 0x18, 0x18, 0x10, 0x10, + 0x00, 0x1f, 0x05, 0x00, 0x01, 0x11, 0x11, 0x10, 0x1d, 0x0f, 0x03, 0x18, + 0x18, 0x60, 0x38, 0x10, 0x01, 0x03, 0x03, 0x06, 0x00, 0x06, 0x0c, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x0c, 0x06, 0x00, 0x06, 0x03, 0x03, 0x01, 0x00, 0x00, 0x1f, 0x18, 0x00, + 0x00, 0x00, 0x17, 0x18, 0x60, 0x45, 0x5f, 0x00, 0x90, 0x00, 0x08, 0xdf, + 0x40, 0x0c, 0x0f, 0x02, 0x00, 0x1c, 0x06, 0x03, 0x02, 0x02, 0x03, 0x07, + 0x1f, 0x14, 0x00, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x10, 0x11, 0x09, 0x07, + 0x05, 0x0e, 0x18, 0x00, 0x00, 0x10, 0x10, 0x00, 0x0c, 0x04, 0x00, 0x1f, + 0x10, 0x00, 0x10, 0x10, 0x08, 0x1c, 0x0e, 0x05, 0x00, 0x10, 0x1f, 0x10, + 0x10, 0x10, 0x10, 0x11, 0x1c, 0x00, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x05, 0x0e, 0x1c, 0x08, 0x10, 0x00, 0x11, 0x10, 0x01, 0x0f, + 0x00, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1f, 0x00, 0x00, + 0x10, 0x1f, 0x00, 0x40, 0x80, 0x80, 0xc0, 0xff, 0x40, 0x00, 0x00, 0x10, + 0x1f, 0x01, 0x03, 0x07, 0x06, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x18, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x03, + 0x07, 0x06, 0x02, 0x00, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x07, 0x1c, 0x1f, 0x00, 0x00, 0x05, 0x0e, 0x1c, 0x00, + 0x10, 0x00, 0x10, 0x08, 0x0a, 0x07, 0x03, 0x00, 0x10, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x1c, 0x00, 0x10, 0x30, 0x30, 0x08, + 0x0a, 0x07, 0x03, 0x00, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x1a, + 0x10, 0x10, 0x1c, 0x08, 0x10, 0x10, 0x01, 0x11, 0x1b, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0f, 0x04, + 0x10, 0x00, 0x10, 0x18, 0x1c, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x17, + 0x1a, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0b, 0x1d, 0x15, + 0x01, 0x00, 0x00, 0x0b, 0x1d, 0x15, 0x01, 0x00, 0x00, 0x00, 0x18, 0x18, + 0x07, 0x00, 0x01, 0x0e, 0x1e, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1c, 0x1f, 0x11, 0x11, 0x10, 0x10, + 0x10, 0x1c, 0x7f, 0x40, 0x00, 0x40, 0x00, 0x00, 0x05, 0x2d, 0x28, 0x00, + 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x1a, 0x11, 0x01, 0x08, 0x1f, 0x10, 0x00, 0x10, 0x00, 0x1f, 0x08, 0x00, + 0x00, 0x10, 0x18, 0x0f, 0x0f, 0x18, 0x18, 0x10, 0x10, 0x14, 0x0c, 0x0f, + 0x18, 0x10, 0x00, 0x00, 0x08, 0x1f, 0x00, 0x10, 0x0b, 0x1d, 0x18, 0x10, + 0x10, 0x08, 0x09, 0x05, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x8f, + 0x98, 0x90, 0x80, 0x80, 0x48, 0x3f, 0x00, 0x00, 0x1f, 0x10, 0x00, 0x00, + 0x00, 0x1f, 0x10, 0x00, 0x00, 0x1f, 0x10, 0x00, 0x40, 0x80, 0x80, 0x40, + 0x7f, 0x00, 0x1f, 0x12, 0x03, 0x07, 0x1c, 0x10, 0x10, 0x00, 0x1f, 0x10, + 0x00, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x1f, 0x10, 0x00, 0x10, 0x00, + 0x1f, 0x10, 0x10, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x1f, 0x10, 0x00, + 0x0f, 0x1c, 0x18, 0x10, 0x10, 0x00, 0x0f, 0x04, 0x00, 0xff, 0x88, 0x08, + 0x00, 0x10, 0x00, 0x0f, 0x04, 0x0f, 0x18, 0x10, 0x00, 0x00, 0x88, 0xff, + 0x00, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x09, 0x11, 0x11, 0x12, + 0x07, 0x0c, 0x00, 0x1f, 0x10, 0x10, 0x18, 0x00, 0x00, 0x1f, 0x18, 0x10, + 0x00, 0x18, 0x1f, 0x10, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x1a, 0x1a, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0x18, 0x04, 0x01, 0x17, 0x18, 0x0a, + 0x01, 0x00, 0x00, 0x10, 0x0b, 0x03, 0x07, 0x1c, 0x10, 0x10, 0x00, 0xc0, + 0x81, 0x0b, 0x5e, 0x06, 0x03, 0x00, 0x00, 0x18, 0x18, 0x16, 0x17, 0x13, + 0x10, 0x18, 0x01, 0x03, 0x7f, 0x42, 0x80, 0x00, 0xff, 0x00, 0x00, 0xc0, + 0x7c, 0x42, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x0c, 0x1a, 0x11, 0x01, 0x08, 0x1f, 0x10, 0x00, 0x0f, 0x1c, 0x18, + 0x10, 0x10, 0x00, 0x0f, 0x04, 0x00, 0x1f, 0x18, 0x10, 0x00, 0x18, 0x1f, + 0x10, 0x00, 0x00, 0x14, 0x1e, 0x12, 0x02, 0x02, 0x03, 0x03, 0x1f, 0x14, + 0x00, 0x05, 0x0e, 0x1c, 0x00, 0x10, 0x00, 0x10, 0x08, 0x0a, 0x07, 0x03, + 0x00, 0x04, 0x0f, 0x04, 0x10, 0x00, 0x10, 0x18, 0x1c, 0x0f, 0x00, 0x10, + 0x00, 0x1f, 0x00, 0x08, 0x10, 0x11, 0x11, 0x07, 0x0f }; diff --git a/boop/trunk/display/fonts/smooth.info b/boop/trunk/display/fonts/smooth.info new file mode 100644 index 0000000..75389f2 --- /dev/null +++ b/boop/trunk/display/fonts/smooth.info @@ -0,0 +1,17 @@ +const unsigned char smooth_info[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 3, 2, 4,10, 7,13,12, 2, 4, 4, 7, 9, 3, 4, 2, 5, + 8, 5, 8, 8, 8, 7, 8, 8, 8, 8, 2, 3, 9, 9, 9, 7, + +14,11, 9,10,10, 9, 9,10,11, 4, 7,10,10,14,12,11, + 9,11,11, 8,10,11,11,15,10,10, 9, 4, 5, 4, 9, 7, + + 4, 8, 9, 7, 9, 8, 7, 8, 9, 4, 5, 8, 4,14, 9, 8, + 9, 8, 7, 6, 6, 9, 9,12, 8, 9, 7, 6, 2, 6, 9, 0, + + 8, 8, 9,11, 11, 11, 10 +}; + +const unsigned char smooth_dlines = 2; diff --git a/boop/trunk/display/fonty.c b/boop/trunk/display/fonty.c new file mode 100644 index 0000000..1700988 --- /dev/null +++ b/boop/trunk/display/fonty.c @@ -0,0 +1,636 @@ +/* + fonty.c - drawing text & font handling + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lcd.h" +#include "fonty.h" +#include "global.h" + +#include "fonts/charset.info" +#include "fonts/charset.bits" + +#include "fonts/smooth.info" +#include "fonts/smooth.bits" + +extern unsigned char drawbuf[2][128]; +extern unsigned int is_drawing; + +static unsigned char tx, ty, coff, dbl; +unsigned char *font_bits, *font_info, font_dlines; +unsigned char *font_bitsUM, *font_bitsUL, *font_bitsMM, *font_bitsML, *font_bitsLM, *font_bitsLL; +unsigned char activefont; + +void set_font(unsigned char f) +{ + activefont = f; + switch(f) + { + case SMOOTHFONT: + coff = 0; + dbl = 16; + font_info = (unsigned char*) smooth_info; + font_bitsUM = (unsigned char*) smooth_mt_bits; + font_bitsUL = (unsigned char*) smooth_lt_bits; + font_bitsLM = (unsigned char*) smooth_mb_bits; + font_bitsLL = (unsigned char*) smooth_lb_bits; + font_dlines = smooth_dlines; + break; + case BOLDDOUBLEFONT: + coff = 96; + dbl = 1; + font_bits = (unsigned char*) charset_bits; + font_info = (unsigned char*) charset_info; + font_dlines = charset_dlines; + break; + case BOLDFONT: + coff = 96; + dbl = 0; + font_bits = (unsigned char*) charset_bits; + font_info = (unsigned char*) charset_info; + font_dlines = charset_dlines; + break; + case DOUBLEFONT: + coff = 0; + dbl = 1; + font_bits = (unsigned char*) charset_bits; + font_info = (unsigned char*) charset_info; + font_dlines = charset_dlines; + break; + default: + coff = 0; + dbl = 0; + font_bits = (unsigned char*) charset_bits; + font_info = (unsigned char*) charset_info; + font_dlines = charset_dlines; + break; + } +} + +void _draw_char(unsigned int ch, unsigned char c, unsigned char m) +{ + unsigned char p,q,r,s,t; + unsigned int cpos, cnt; + is_drawing++; + + cpos = 0; + + for(cnt=0; cnt>1] & 0x0F); + } + else + { + cpos += (font_info[cnt>>1] >> 4); + } + } + + p = font_info[ch>>1]; + if(ch & 0x01) + { + p &= 0x0F; + } + else + { + p >>= 4; + } + + if(dbl == 1) + { + if(ty & 0x07) + { + t = ty & 0x07; + p <<= 1; + + for(cnt=0;cnt>1)]; + q = 0x00; + + if(s & 0x01) + q += 0x03;; + if(s & 0x02) + q += 0x0C;; + if(s & 0x04) + q += 0x30;; + if(s & 0x08) + q += 0xC0;; + + if(c & 0x02) + s = q << t; + else + s = 0x00; + drawbuf[0][r] = s; + drawbuf[0][r-1] = s; + + if(c & 0x01) + s = q << t; + else + s = 0x00; + drawbuf[1][r] = s; + drawbuf[1][r-1] = s; + } + do_rcu(tx,ty,p,m); + + for(cnt=0;cnt>1)]; + q = 0x00; + + if(s & 0x01) + q += 0x03;; + if(s & 0x02) + q += 0x0C;; + if(s & 0x04) + q += 0x30;; + if(s & 0x08) + q += 0xC0;; + + if(c & 0x02) + s = q >> (8-t); + else + s = 0x00; + drawbuf[0][r] = s; + drawbuf[0][r-1] = s; + + if(c & 0x01) + s = q >> (8-t); + else + s = 0x00; + drawbuf[1][r] = s; + drawbuf[1][r-1] = s; + } + do_rcu(tx,ty+8,p,m); + + for(cnt=0;cnt>1)]; + q = 0x00; + + if(s & 0x10) + q += 0x03;; + if(s & 0x20) + q += 0x0C;; + if(s & 0x40) + q += 0x30;; + if(s & 0x80) + q += 0xC0;; + + if(c & 0x02) + s = q << t; + else + s = 0x00; + drawbuf[0][r] = s; + drawbuf[0][r-1] = s; + + if(c & 0x01) + s = q << t; + else + s = 0x00; + drawbuf[1][r] = s; + drawbuf[1][r-1] = s; + } + do_rcu(tx,ty+8,p,m); + + for(cnt=0;cnt>1)]; + q = 0x00; + + if(s & 0x10) + q += 0x03;; + if(s & 0x20) + q += 0x0C;; + if(s & 0x40) + q += 0x30;; + if(s & 0x80) + q += 0xC0;; + + if(c & 0x02) + s = q >> (8-t); + else + s = 0x00; + drawbuf[0][r] = s; + drawbuf[0][r-1] = s; + + if(c & 0x01) + s = q >> (8-t); + else + s = 0x00; + drawbuf[1][r] = s; + drawbuf[1][r-1] = s; + } + do_rcu(tx,ty+16,p,m); + + } // if (ty & 0x07) + else + { + p <<= 1; + for(cnt=0;cnt>1)]; + q = 0x00; + + if(s & 0x01) + q += 0x03;; + if(s & 0x02) + q += 0x0C;; + if(s & 0x04) + q += 0x30;; + if(s & 0x08) + q += 0xC0;; + + if(c & 0x02) + s = q; + else + s = 0x00; + drawbuf[0][r] = s; + drawbuf[0][r-1] = s; + + if(c & 0x01) + s = q; + else + s = 0x00; + drawbuf[1][r] = s; + drawbuf[1][r-1] = s; + } + do_rcu(tx,ty,p,m); + for(cnt=0;cnt>1)]; + q = 0x00; + + if(s & 0x10) + q += 0x03;; + if(s & 0x20) + q += 0x0C;; + if(s & 0x40) + q += 0x30;; + if(s & 0x80) + q += 0xC0;; + + if(c & 0x02) + s = q; + else + s = 0x00; + drawbuf[0][r] = s; + drawbuf[0][r-1] = s; + + if(c & 0x01) + s = q; + else + s = 0x00; + drawbuf[1][r] = s; + drawbuf[1][r-1] = s; + } + do_rcu(tx,ty+8,p,m); + } // else if (ty & 0x07) + tx += p+2; + } // if (dbl == 1) + else + { + if(ty & 0x07) + { + s = ty & 0x07; + + for(cnt=0;cnt> (8-s); + else + drawbuf[0][p-cnt-1] = 0x00; + + if(c & 0x01) + drawbuf[1][p-cnt-1] = font_bits[cpos+cnt] >> (8-s); + else + drawbuf[1][p-cnt-1] = 0x00; + } + do_rcu(tx,ty+8,p,m); + } // if (ty & 0x07) + else + { + for(cnt=0;cnt> (8-s); + drawbuf[1][p-cnt-1] = font_bitsUL[cpos+cnt] >> (8-s); + } + do_rcu (tx,ty+8,p,m); + for (cnt=0;cnt> (8-s); + drawbuf[1][p-cnt-1] = font_bitsLL[cpos+cnt] >> (8-s); + } + do_rcu (tx,ty+16,p,m); + } // if (ty & 0x07) + else + { + for(cnt=0;cnt>1]; + if((st[cp]+coff) & 0x01) + { + p &= 0x0F; + } + else + { + p >>= 4; + } + p +=1; + if(dbl == 1) + p <<= 1; + } + else + { + p = font_info[(unsigned char)(st[cp]+coff)]; + p+=1; + } + } + width += p; + cp++; + } + width=max(width,prevwidth); + if (width) + width--; + return width; +} + +unsigned short get_stringheight (const char *st) +{ + unsigned char cp; + unsigned short height; + + if(!dbl) + height = 8; + else + height = 16; + + cp = 0; + + while(st[cp] != 0) + { + if(st[cp] == '\n') + { + if(!dbl) + height += 9; + else + height += 18; + } + cp++; + } + + return height; +} + +extern char hval[16]; + +void draw_hexC(unsigned char x, unsigned char y, const unsigned char v, unsigned char c, unsigned char m) +{ + is_drawing++; + tx = x; + ty = y; + _draw_char(hval[v>>4]+coff, c, m); + _draw_char(hval[v & 0x0F]+coff, c, m); + is_drawing--; +} + +void draw_hexS(unsigned char x, unsigned char y, const unsigned short v, unsigned char c, unsigned char m) +{ + is_drawing++; + tx = x; + ty = y; + draw_hexC(x, y, v >> 8, c, m); + draw_hexC(tx, ty, v & 0xFF, c, m); + is_drawing--; +} + +void draw_hexW(unsigned char x, unsigned char y, const unsigned long v, unsigned char c, unsigned char m) +{ + is_drawing++; + draw_hexS(x, y, v >> 16, c, m); + draw_hexS(tx, ty, v & 0xFFFF, c, m); + is_drawing--; +} + +static unsigned long u_longval; +static unsigned char pos, inc; +static unsigned char num[12]; + +void get_digit(unsigned long tval) +{ + unsigned char count; + count = 0; + while(u_longval >= tval) + { + count++; + u_longval -= tval; + } + + num[pos] = '0' + count; + if(count) + inc = 1; + pos += inc; +} + +void draw_numU(unsigned char x, unsigned char y, const unsigned long v, unsigned char z, unsigned char c, unsigned char m) +{ + is_drawing++; + pos = 0; + u_longval = v; + + if(z) + inc = 1; + else + inc = 0; + + get_digit(1000000000); + get_digit(100000000); + get_digit(10000000); + get_digit(1000000); + get_digit(100000); + get_digit(10000); + get_digit(1000); + get_digit(100); + get_digit(10); + inc = 1; + get_digit(1); + num[pos] = 0x00; + draw_string(x, y, (char*)num, c, m); + is_drawing--; +} diff --git a/boop/trunk/display/fonty.h b/boop/trunk/display/fonty.h new file mode 100644 index 0000000..7e35b30 --- /dev/null +++ b/boop/trunk/display/fonty.h @@ -0,0 +1,49 @@ +/* + fonty.h - drawing text & font handling + Copyright (C) 2007 Ch. Klippel + + 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 3 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 FONTY_H +#define FONTY_H + +#define SMALLFONT 0 +#define DOUBLEFONT 1 +#define BOLDFONT 2 +#define BOLDDOUBLEFONT 3 +#define SMOOTHFONT 4 + +#define SMALLFONT_HEIGHT 8 +#define DOUBLEFONT_HEIGHT 16 +#define BOLDFONT_HEIGHT 8 +#define BOLDDOUBLEFONT_HEIGHT 16 +#define SMOOTHFONT_HEIGHT 16 + +#define tabstep 24 + +unsigned char activefont; + +void set_font(unsigned char f); +void draw_char(unsigned char x, unsigned char y, unsigned char ch, unsigned char c, unsigned char m); +void draw_string(unsigned char x, unsigned char y, char *st, unsigned char c, unsigned char m); +void draw_hexC(unsigned char x, unsigned char y, const unsigned char v, unsigned char c, unsigned char m); +void draw_hexS(unsigned char x, unsigned char y, const unsigned short v, unsigned char c, unsigned char m); +void draw_hexW(unsigned char x, unsigned char y, const unsigned long v, unsigned char c, unsigned char m); + +void draw_numU(unsigned char x, unsigned char y, const unsigned long v, unsigned char z, unsigned char c, unsigned char m); +unsigned short get_stringwidth (const char *st); +unsigned short get_stringheight (const char *st); + +#endif diff --git a/boop/trunk/display/icon.h b/boop/trunk/display/icon.h new file mode 100644 index 0000000..02e3da6 --- /dev/null +++ b/boop/trunk/display/icon.h @@ -0,0 +1,113 @@ +/********************************************************************** +@file icon.c + +@brief Definition of icon structure and appropriate functions + +----------------------------------------------------------------------- +@author 2010 Roman Steiger + LeoTheLoewe [at] gmx [dot] de +----------------------------------------------------------------------- +Following compile flags are usable: + + +----------------------------------------------------------------------- + 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 3 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 . +----------------------------------------------------------------------- +@History + +1.00 20012010 RSt Creation + +@end +***********************************************************************/ +#ifndef __ICON_H__ +#define __ICON_H__ + + +/////////////////////////////////////////////////////////////////// +// ICON can be defined in the appropriate C file before +// including that header or the related icon files to define the +// actual type of the icon structure: +// +// >> #define ICON iconElement_t +// +/////////////////////////////////////////////////////////////////// +#ifndef ICON +#define ICON icon_t +#endif + +/////////////////////////////////////////////////////////////////// +// ICON_INFO can be defined in the appropriate C file before +// including that header to save one byte in the icon structure: +// +// >> #define ICON_INFO(i) +// +/////////////////////////////////////////////////////////////////// +#ifndef ICON_INFO +#define ICON_INFO(i) /* info = */ i, +#define ICON_INFO_ELEMENT unsigned char info; // additional one byte (iconType_t might be larger) +#endif + +#ifndef ICON_INFO_ELEMENT +#define ICON_INFO_ELEMENT +//#define ICON_IS_GRAY(i) 0 +#define ICON_IS_GRAY(i) (sizeof(i.data) > (i.height/8 + (i.height%8 ? 1 : 0)) * i.width + 2); +#else +#define ICON_IS_GRAY(i) ((i)->info >= ICON_GRAY) +#endif + +typedef enum iconInfo_e +{ + ICON_BLACK_WHITE, /// 1 bpp + ICON_BLACK_WHITE_TRANSPARENT, /// 2 bpp + ICON_GRAY, /// 2 bpp + ICON_GRAY_TRANSPARENT, /// 3 bpp + + ICON_MAX +} iconInfo_t; + +typedef struct icon_s +{ + unsigned char width; + unsigned char height; + ICON_INFO_ELEMENT + unsigned char data []; +} icon_t, *icon_p; + +typedef struct iconElement_s +{ + unsigned char width; + unsigned char height; + unsigned char data []; +} iconElement_t, *iconElement_p; + +#ifdef __cplusplus +extern "C" { +#endif +//----------------------------------------------------------------------------- + +extern void drawIcon (unsigned char x, unsigned char y, + const icon_t const *pIcon, + unsigned char c, unsigned char m); + +extern void drawIconExt (unsigned char x, unsigned char y, + const unsigned char const *pData, + unsigned char width, unsigned char height, iconInfo_t iconInfo, + unsigned char c, unsigned char m); + +//----------------------------------------------------------------------------- +#ifdef __cplusplus +} +#endif + +#endif // #ifndef __ICON_H__ diff --git a/boop/trunk/display/iconHourglas.h b/boop/trunk/display/iconHourglas.h new file mode 100644 index 0000000..6e99e15 --- /dev/null +++ b/boop/trunk/display/iconHourglas.h @@ -0,0 +1,173 @@ +//////////////////////////////////////////////////// +// This file was generated by the tool GrayScaler. +// Source bitmap: R:\Project\GrayScaler\Icons\Hourglas.bmp +// +// ICON_GRAY - 2 bpp (Bit per Pixel) +// sizeof (iconHourglas.data) == 280 +// +//////////////////////////////////////////////////// +#include "icon.h" + +#ifndef ICON_INFO +#define ICON_INFO(i) i, +#endif + + +const ICON iconHourglas = +{ + /* width = */ 28, + /* height = */ 40, + /* info = */ ICON_INFO (ICON_GRAY) + /* data [] = */ + { + // Bit 0 is the upper most pixel + // of the page, which is 8 pixel high + //--- Page 0 --- + 0x0e, 0x11, + 0x3f, 0x1e, + 0x7f, 0x3a, + 0xff, 0x6a, + 0xff, 0xca, + 0xff, 0xca, + 0x3f, 0x0a, + 0x3b, 0x0e, + 0x3b, 0x0e, + 0x3b, 0x0e, + 0x3b, 0x0e, + 0x3b, 0x0e, + 0x3b, 0x0e, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0xff, 0xca, + 0xff, 0xca, + 0xff, 0x6a, + 0x7f, 0x3a, + 0x3f, 0x1e, + 0x0e, 0x11, + //--- Page 1 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0xff, + 0xff, 0xff, + 0xff, 0x0f, + 0xfe, 0xfd, + 0x70, 0xb8, + 0xe0, 0x70, + 0xc0, 0xa0, + 0x80, 0x50, + 0x30, 0x80, + 0xf0, 0x00, + 0xf0, 0x00, + 0xf0, 0x00, + 0xf0, 0x08, + 0x70, 0x88, + 0xb0, 0xc8, + 0xd8, 0x64, + 0x78, 0xe4, + 0x36, 0xf8, + 0xfe, 0xfd, + 0xff, 0x0f, + 0xff, 0xff, + 0x00, 0xff, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 2 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0xff, + 0xff, 0xff, + 0xff, 0x00, + 0xff, 0xff, + 0x00, 0xff, + 0x80, 0x80, + 0xc1, 0xc0, + 0x61, 0xb3, + 0x3f, 0x12, + 0x1c, 0x0f, + 0x07, 0x00, + 0x1d, 0x0e, + 0x3f, 0x12, + 0x63, 0xb5, + 0xc1, 0xe2, + 0x80, 0xc1, + 0x00, 0x00, + 0x00, 0xff, + 0xff, 0xff, + 0xff, 0x00, + 0xff, 0xff, + 0x00, 0xff, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 3 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0xff, + 0xff, 0xff, + 0xff, 0xfc, + 0xff, 0x0f, + 0x07, 0x0b, + 0x81, 0x03, + 0xc0, 0x01, + 0xc0, 0x20, + 0xe0, 0x10, + 0xf0, 0x00, + 0xf8, 0x00, + 0xf0, 0x00, + 0xe0, 0x10, + 0xc0, 0x20, + 0xc0, 0x01, + 0x81, 0x03, + 0x03, 0x87, + 0x0e, 0x17, + 0xff, 0x1f, + 0xff, 0xf8, + 0xff, 0xff, + 0x00, 0xff, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 4 --- + 0x70, 0x88, + 0xfc, 0x78, + 0xfe, 0x7c, + 0xff, 0x76, + 0xff, 0x77, + 0xff, 0x77, + 0xff, 0x74, + 0xfe, 0x75, + 0xff, 0x74, + 0xff, 0x74, + 0xf7, 0x7c, + 0xf7, 0x7c, + 0xf7, 0x7c, + 0xf7, 0x7c, + 0xf7, 0x7c, + 0xff, 0x74, + 0xff, 0x74, + 0xff, 0x74, + 0xff, 0x74, + 0xff, 0x74, + 0xfe, 0x75, + 0xff, 0x74, + 0xff, 0x77, + 0xff, 0x77, + 0xff, 0x76, + 0xfe, 0x7c, + 0xfc, 0x78, + 0x70, 0x88 + } +}; + + diff --git a/boop/trunk/display/iconHourglas2.h b/boop/trunk/display/iconHourglas2.h new file mode 100644 index 0000000..2ed6f1a --- /dev/null +++ b/boop/trunk/display/iconHourglas2.h @@ -0,0 +1,173 @@ +//////////////////////////////////////////////////// +// This file was generated by the tool GrayScaler. +// Source bitmap: L:\Betty\Sourcecode\SVN\Betty_sourceforge\boop\trunk\display\Hourglas_2bpp.bmp +// +// ICON_BLACK_WHITE - 1 bpp (Bit per Pixel) +// sizeof (iconHourglas2.data) == 140 +// +//////////////////////////////////////////////////// +#include "icon.h" + +#ifndef ICON_INFO +#define ICON_INFO(i) i, +#endif + + +const ICON iconHourglas2 = +{ + /* width = */ 28, + /* height = */ 40, + /* info = */ ICON_INFO (ICON_BLACK_WHITE) + /* data [] = */ + { + // Bit 0 is the upper most pixel + // of the page, which is 8 pixel high + //--- Page 0 --- + 0x0e, + 0x3f, + 0x7f, + 0xff, + 0xff, + 0xff, + 0x3f, + 0x3b, + 0x3b, + 0x3b, + 0x3b, + 0x3b, + 0x3b, + 0x3f, + 0x3f, + 0x3f, + 0x3f, + 0x3f, + 0x3f, + 0x3f, + 0x3f, + 0x3f, + 0xff, + 0xff, + 0xff, + 0x7f, + 0x3f, + 0x0e, + //--- Page 1 --- + 0x00, + 0x00, + 0x00, + 0x00, + 0xff, + 0xff, + 0xfe, + 0x70, + 0xe0, + 0xc0, + 0x80, + 0x30, + 0xf0, + 0xf0, + 0xf0, + 0xf0, + 0x70, + 0xb0, + 0xd8, + 0x78, + 0x36, + 0xfe, + 0xff, + 0xff, + 0x00, + 0x00, + 0x00, + 0x00, + //--- Page 2 --- + 0x00, + 0x00, + 0x00, + 0x00, + 0xff, + 0xff, + 0xff, + 0x00, + 0x80, + 0xc1, + 0x61, + 0x3f, + 0x1c, + 0x07, + 0x1d, + 0x3f, + 0x63, + 0xc1, + 0x80, + 0x00, + 0x00, + 0xff, + 0xff, + 0xff, + 0x00, + 0x00, + 0x00, + 0x00, + //--- Page 3 --- + 0x00, + 0x00, + 0x00, + 0x00, + 0xff, + 0xff, + 0xff, + 0x07, + 0x81, + 0xc0, + 0xc0, + 0xe0, + 0xf0, + 0xf8, + 0xf0, + 0xe0, + 0xc0, + 0xc0, + 0x81, + 0x03, + 0x0e, + 0xff, + 0xff, + 0xff, + 0x00, + 0x00, + 0x00, + 0x00, + //--- Page 4 --- + 0x70, + 0xfc, + 0xfe, + 0xff, + 0xff, + 0xff, + 0xff, + 0xfe, + 0xff, + 0xff, + 0xf7, + 0xf7, + 0xf7, + 0xf7, + 0xf7, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xfe, + 0xff, + 0xff, + 0xff, + 0xff, + 0xfe, + 0xfc, + 0x70 + } +}; + + diff --git a/boop/trunk/display/iconHourglas2_t.h b/boop/trunk/display/iconHourglas2_t.h new file mode 100644 index 0000000..75a97ea --- /dev/null +++ b/boop/trunk/display/iconHourglas2_t.h @@ -0,0 +1,178 @@ +//////////////////////////////////////////////////// +// This file was generated by the tool GrayScaler. +// Source bitmap: L:\Betty\Sourcecode\SVN\Betty_sourceforge\boop\trunk\display\Hourglas_t_3bpp_t.bmp +// +// ICON_BLACK_WHITE_TRANSPARENT - 2 bpp (Bit per Pixel) +// sizeof (iconHourglas2_t.data) == 280 +// +//////////////////////////////////////////////////// +#include "icon.h" + +#ifndef ICON_INFO +#define ICON_INFO(i) i, +#endif + + +const ICON iconHourglas2_t = +{ + /* width = */ 28, + /* height = */ 40, + /* info = */ ICON_INFO (ICON_BLACK_WHITE_TRANSPARENT) + /* data [] = */ + { + // Bit 0 is the upper most pixel + // of the page, which is 8 pixel high + //--- Page 0 --- + // v--- Alpha Channel + 0x1f, 0x1f, + 0x3f, 0x3f, + 0x7f, 0x7f, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0x3f, 0xff, + 0x3f, 0xff, + 0x3f, 0xff, + 0x3f, 0xff, + 0x3f, 0xff, + 0x3f, 0xff, + 0x3f, 0xff, + 0x3f, 0xff, + 0x3f, 0xff, + 0x3f, 0xff, + 0x3f, 0xff, + 0x3f, 0xff, + 0x3f, 0xff, + 0x3f, 0xff, + 0x3f, 0xff, + 0x3f, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0x7f, 0x7f, + 0x3f, 0x3f, + 0x1f, 0x1f, + //--- Page 1 --- + // v--- Alpha Channel + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xf8, 0xff, + 0xf0, 0xff, + 0xe0, 0xff, + 0xd0, 0xff, + 0xb0, 0xff, + 0xf0, 0xff, + 0xf0, 0xff, + 0xf0, 0xff, + 0xf8, 0xff, + 0xf8, 0xff, + 0xf8, 0xff, + 0xfc, 0xff, + 0xfc, 0xff, + 0xfe, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 2 --- + // v--- Alpha Channel + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0x80, 0x80, + 0xc1, 0xc1, + 0xf3, 0xf3, + 0x3f, 0xff, + 0x1f, 0xff, + 0x07, 0xff, + 0x1f, 0xff, + 0x3f, 0xff, + 0xf7, 0xf7, + 0xe3, 0xe3, + 0xc1, 0xc1, + 0x00, 0x00, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 3 --- + // v--- Alpha Channel + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0x0f, 0xff, + 0x83, 0xff, + 0xc1, 0xff, + 0xe0, 0xff, + 0xf0, 0xff, + 0xf0, 0xff, + 0xf8, 0xff, + 0xf0, 0xff, + 0xf0, 0xff, + 0xe0, 0xff, + 0xc1, 0xff, + 0x83, 0xff, + 0x87, 0xff, + 0x1f, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 4 --- + // v--- Alpha Channel + 0xf8, 0xf8, + 0xfc, 0xfc, + 0xfe, 0xfe, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xfe, 0xfe, + 0xfc, 0xfc, + 0xf8, 0xf8 + } +}; + + diff --git a/boop/trunk/display/iconHourglas_t.h b/boop/trunk/display/iconHourglas_t.h new file mode 100644 index 0000000..d46a555 --- /dev/null +++ b/boop/trunk/display/iconHourglas_t.h @@ -0,0 +1,178 @@ +//////////////////////////////////////////////////// +// This file was generated by the tool GrayScaler. +// Source bitmap: R:\Project\GrayScaler\Icons\Hourglas_t.bmp +// +// ICON_GRAY_TRANSPARENT - 3 bpp (Bit per Pixel) +// sizeof (iconHourglas_t.data) == 420 +// +//////////////////////////////////////////////////// +#include "icon.h" + +#ifndef ICON_INFO +#define ICON_INFO(i) i, +#endif + + +const ICON iconHourglas_t = +{ + /* width = */ 28, + /* height = */ 40, + /* info = */ ICON_INFO (ICON_GRAY_TRANSPARENT) + /* data [] = */ + { + // Bit 0 is the upper most pixel + // of the page, which is 8 pixel high + //--- Page 0 --- + // v--- Alpha Channel + 0x0e, 0x11, 0x1f, + 0x3f, 0x1e, 0x3f, + 0x7f, 0x3a, 0x7f, + 0xff, 0x6a, 0xff, + 0xff, 0xca, 0xff, + 0xff, 0xca, 0xff, + 0x3f, 0x0a, 0xff, + 0x3b, 0x0e, 0xff, + 0x3b, 0x0e, 0xff, + 0x3b, 0x0e, 0xff, + 0x3b, 0x0e, 0xff, + 0x3b, 0x0e, 0xff, + 0x3b, 0x0e, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0xff, 0xca, 0xff, + 0xff, 0xca, 0xff, + 0xff, 0x6a, 0xff, + 0x7f, 0x3a, 0x7f, + 0x3f, 0x1e, 0x3f, + 0x0e, 0x11, 0x1f, + //--- Page 1 --- + // v--- Alpha Channel + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, + 0xff, 0x0f, 0xff, + 0xfe, 0xfd, 0xff, + 0x70, 0xb8, 0xff, + 0xe0, 0x70, 0xff, + 0xc0, 0xa0, 0xff, + 0x80, 0x50, 0xff, + 0x30, 0x80, 0xff, + 0xf0, 0x00, 0xff, + 0xf0, 0x00, 0xff, + 0xf0, 0x00, 0xff, + 0xf0, 0x08, 0xff, + 0x70, 0x88, 0xff, + 0xb0, 0xc8, 0xff, + 0xd8, 0x64, 0xff, + 0x78, 0xe4, 0xff, + 0x36, 0xf8, 0xff, + 0xfe, 0xfd, 0xff, + 0xff, 0x0f, 0xff, + 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + //--- Page 2 --- + // v--- Alpha Channel + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, + 0xff, 0x00, 0xff, + 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, + 0x80, 0x80, 0x80, + 0xc1, 0xc0, 0xc1, + 0x61, 0xb3, 0xf3, + 0x3f, 0x12, 0xff, + 0x1c, 0x0f, 0xff, + 0x07, 0x00, 0xff, + 0x1d, 0x0e, 0xff, + 0x3f, 0x12, 0xff, + 0x63, 0xb5, 0xf7, + 0xc1, 0xe2, 0xe3, + 0x80, 0xc1, 0xc1, + 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, + 0xff, 0x00, 0xff, + 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + //--- Page 3 --- + // v--- Alpha Channel + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, + 0xff, 0x0f, 0xff, + 0x07, 0x0b, 0xff, + 0x81, 0x03, 0xff, + 0xc0, 0x01, 0xff, + 0xc0, 0x20, 0xff, + 0xe0, 0x10, 0xff, + 0xf0, 0x00, 0xff, + 0xf8, 0x00, 0xff, + 0xf0, 0x00, 0xff, + 0xe0, 0x10, 0xff, + 0xc0, 0x20, 0xff, + 0xc0, 0x01, 0xff, + 0x81, 0x03, 0xff, + 0x03, 0x87, 0xff, + 0x0e, 0x17, 0xff, + 0xff, 0x1f, 0xff, + 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + //--- Page 4 --- + // v--- Alpha Channel + 0x70, 0x88, 0xf8, + 0xfc, 0x78, 0xfc, + 0xfe, 0x7c, 0xfe, + 0xff, 0x76, 0xff, + 0xff, 0x77, 0xff, + 0xff, 0x77, 0xff, + 0xff, 0x74, 0xff, + 0xfe, 0x75, 0xff, + 0xff, 0x74, 0xff, + 0xff, 0x74, 0xff, + 0xf7, 0x7c, 0xff, + 0xf7, 0x7c, 0xff, + 0xf7, 0x7c, 0xff, + 0xf7, 0x7c, 0xff, + 0xf7, 0x7c, 0xff, + 0xff, 0x74, 0xff, + 0xff, 0x74, 0xff, + 0xff, 0x74, 0xff, + 0xff, 0x74, 0xff, + 0xff, 0x74, 0xff, + 0xfe, 0x75, 0xff, + 0xff, 0x74, 0xff, + 0xff, 0x77, 0xff, + 0xff, 0x77, 0xff, + 0xff, 0x76, 0xff, + 0xfe, 0x7c, 0xfe, + 0xfc, 0x78, 0xfc, + 0x70, 0x88, 0xf8 + } +}; + + diff --git a/boop/trunk/display/lcd.c b/boop/trunk/display/lcd.c new file mode 100644 index 0000000..0b1a02c --- /dev/null +++ b/boop/trunk/display/lcd.c @@ -0,0 +1,1242 @@ +/* + lcd.c - lcd control & graphics primitives + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "global.h" +#include "lpc2220.h" +#include "lcd.h" +#include "fonty.h" +#include "boop_logo" +#include "adc.h" +#include "timerfuncs.h" + +unsigned int is_drawing; +volatile unsigned char symbols; +volatile unsigned char oldsymbols; + +void _do_rcu(unsigned char x, unsigned char y, unsigned char l, unsigned char m); +void _do_rcuAlpha (unsigned char x, unsigned char y, unsigned char l, unsigned char m, + unsigned char* alphaBuf); +void _do_rcuS(unsigned char x, unsigned char y, unsigned char m); +void _draw_block(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char c, unsigned char m); +void _draw_hline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m); +void _draw_vline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m); + +// Function pointer to section (".text.fastcode") +rcu_fn do_rcu; + +rcuAlpha_fn do_rcuAlpha; + +rcus_fn do_rcuS; +bl_fn draw_block; +ln_fn draw_hline; +ln_fn draw_vline; + + +void pause(unsigned int ptime) +{ + unsigned long xx; + xx = ptime * 1500; + while(xx) + { + xx--; + }; +} + + +void lcd_set(unsigned char s) +{ + is_drawing++; + if(s == 0) + { + LCD_CMD = 0xA0; // set segment remap (00H mapped to seg0) + LCD_CMD = 0xC8; // set com output scan direction (remapped mode) + } + else + { + LCD_CMD = 0xA1; // set segment remap (7FH mapped to seg0) + LCD_CMD = 0xC0; // set com output scan direction (normal mode) + } + is_drawing--; +} + + +// initialise LCD controller SSD1854 +// +// sequence and values disassembled from original firmware +// see http://bettyhacks.com/wiki/index.php/Betty_init +void lcd_init(unsigned char s) +{ + is_drawing = 1; + LCD_CMD = LCD_WAKEUP; // exit power save mode + LCD_CMD = LCD_RESET; // software reset + pause(0x32); + LCD_CMD = LCD_OSC_START; // start internal oscillator + LCD_CMD = LCD_IRRR_8; // set internal regulator resistor ratio (8.1) + LCD_CMD = 0x81; // volume cmd + LCD_CMD = LCD_CONTRAST; // volume cmd value original 0x3F + LCD_CMD = LCD_DCDCx4; // set DC-DC converter factor (4x) + + LCD_CMD = 0x60; // set upper window corner ax cmd + LCD_CMD = 0x1C; // set upper window corner ax value + LCD_CMD = 0x61; // set upper window corner ay cmd + LCD_CMD = 0x0A; // set upper window corner ay value + LCD_CMD = 0x62; // set lower window corner bx cmd + LCD_CMD = 0x75; // set lower window corner bx value + LCD_CMD = 0x63; // set lower window corner by cmd + LCD_CMD = 0x81; // set lower window corner by value + LCD_CMD = 0x90; // set PWM and FRC (4-frames) + + LCD_CMD = 0x88; // set white mode frame 2nd and 1st cmd + LCD_CMD = LCD_GRAYMODE_88; // set white mode frame 2nd and 1st value + LCD_CMD = 0x89; // set white mode frame 4th and 3rd cmd + LCD_CMD = LCD_GRAYMODE_89; // set white mode frame 4th and 3rd value + LCD_CMD = 0x8A; // set light gray mode frame 2nd and 1st cmd + LCD_CMD = LCD_GRAYMODE_8A; // set light gray mode frame 2nd and 1st value // originally 33 + LCD_CMD = 0x8B; // set light gray mode frame 4th and 3rd cmd + LCD_CMD = LCD_GRAYMODE_8B; // set light gray mode frame 4th and 3rd value // originally 33 + LCD_CMD = 0x8C; // set dark gray mode frame 2nd and 1st cmd + LCD_CMD = LCD_GRAYMODE_8C; // set dark gray mode frame 2nd and 1st value // originally 66 + LCD_CMD = 0x8D; // set dark gray mode frame 4th and 3rd cmd + LCD_CMD = LCD_GRAYMODE_8D; // set dark gray mode frame 4th and 3rd vakue // originally 66 + LCD_CMD = 0x8E; // set black mode frame 2nd and 1st cmd + LCD_CMD = LCD_GRAYMODE_8E; // set black mode frame 2nd and 1st value // originally 99 + LCD_CMD = 0x8F; // set black mode frame 4th and 3rd cmd + LCD_CMD = LCD_GRAYMODE_8F; // set black mode frame 4th and 3rd value // originally 99 + + LCD_CMD = LCD_DCDCx5; // set DC-DC converter factor (5x) + + lcd_set(s); + + //~ LCD_CMD = 0x2E; // set power control register (boost on, reg on, buffer off) // original + + //~ pause(0x32); // original + + LCD_CMD = 0x2F; // set power control register (boost on, reg on, buffer on) + LCD_CMD = LCD_ALLON; // all black + LCD_CMD = LCD_NORMAL; // set normal display mode, inverse = 0xA7 + + // Function pointer to section (".text.fastcode") + do_rcu = _do_rcu; + do_rcuAlpha = _do_rcuAlpha; + do_rcuS = _do_rcuS; + draw_block = _draw_block; + draw_hline = _draw_hline; + draw_vline = _draw_vline; + + lcd_fill (LCD_COLOR_W); // blank display + + LCD_CMD = LCD_ON; // turn display on + + set_font(SMALLFONT); + + is_drawing--; +} // lcd_init + + +void lcd_enable(unsigned char e) +{ + is_drawing++; + if(e) + LCD_CMD = LCD_ON; // set display on + else + LCD_CMD = LCD_OFF; // set display off + is_drawing--; +} + + +/// \brief set lcd contrast +/// +/// SSD1854 datasheet p.33 +/// Set Contrast Control Register [81] +/// This command adjusts the contrast of the LCD panel by changing VL7 of the LCD drive voltage +/// provided by the On-Chip power circuits. VL7 is set with 64 steps (6-bit) contrast control register. +/// Default value after software reset [E2]: 20H = 32 +void lcd_set_contrast(unsigned char c) +{ + if (c < 64) + { + is_drawing++; + LCD_CMD = 0x81; // volume cmd + LCD_CMD = c; // volume cmd value + is_drawing--; + } +} + + +// set all pixels +// show symbols TODO: those should not be here! +void lcd_fill(unsigned char f) +{ + unsigned char x,y; + + is_drawing++; + //~ + //~ if (f == 0xFF) + //~ { + //~ LCD_CMD = LCD_ALLOFF; + //~ } + //~ else if (f == 0) + //~ { + //~ LCD_CMD = LCD_ALLON; + //~ } + //~ else + //~ { + for(y=0;y<20;y++) + { + LCD_CMD = 0xB0; // Set Page Address + LCD_CMD = y; + LCD_CMD = 0x10; // Set Higher Column Address + LCD_CMD = 0x00; + for(x=0;x<128;x++) + { + LCD_DATA = f; // 4 pixels + LCD_DATA = f; // 4 pixels + } + } + //~ } + is_drawing--; + + showBat(0xff); + refresh_symbols(0xff); +} + +//----------------------------------------------------------------------------- +/** Draw pixel data from boop_logo. + (use bmp2b to generate from 24 bit BMP) + New tool display/GrayScaler.exe for WinXP/Win7 + generate icon files. The data array has the same + format and can be copied in the file boop_logo. + You can also use the new icons instead of the logo. +*/ +void draw_logo(void) +{ + unsigned short f; + unsigned char x,y; + is_drawing++; + f=0; + for(y=0; y>3; y++) + { + LCD_CMD = 0xB0; + LCD_CMD = y; + LCD_CMD = 0x10; + LCD_CMD = 0x00; + for(x=0;x BORDER_RIGHT))// || (x+l < BORDER_LEFT)) + return; + + if (x+l > BORDER_RIGHT + 1) { + unsigned char i; + unsigned char cut; + + cut = x + l - (BORDER_RIGHT + 1); + for(i=0;i> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + q = LCD_DATA; + q = l; + + while(q--) + { + rcubuf[0][q] = LCD_DATA; + rcubuf[1][q] = LCD_DATA; + } + + q = LCD_DATA; + } + + LCD_CMD = 0xB0; + LCD_CMD = (y >> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + if(alphaBuf) + { + q = l; + while(q--) + { + drawbuf[0][q] &= alphaBuf[q]; + drawbuf[1][q] &= alphaBuf[q]; + } + if(m==DRAW_ALPHA) + { + q = l; + while(q--) + { + rcubuf[0][q] &= ~alphaBuf[q]; + rcubuf[1][q] &= ~alphaBuf[q]; + } + } + } + + q = l; + + switch(m) + { + case DRAW_ALPHA: // draw with alpha buffer + case DRAW_PUT: // draw put + while(q--) + { + LCD_DATA = rcubuf[0][q] | drawbuf[0][q]; + LCD_DATA = rcubuf[1][q] | drawbuf[1][q]; + } + break; + case DRAW_XOR: // draw xor + while(q--) + { + LCD_DATA = rcubuf[0][q] ^ drawbuf[0][q]; + LCD_DATA = rcubuf[1][q] ^ drawbuf[1][q]; + } + break; + case DRAW_ERASE: // draw erase + while(q--) + { + LCD_DATA = rcubuf[0][q] & ~drawbuf[0][q]; + LCD_DATA = rcubuf[1][q] & ~drawbuf[1][q]; + } + break; + case DRAW_NORCU: // draw without rcu + while(q--) + { + LCD_DATA = drawbuf[0][q]; + LCD_DATA = drawbuf[1][q]; + } + break; + } + is_drawing--; +} // _do_rcu +//----------------------------------------------------------------------------- + + + +//----------------------------------------------------------------------------- +void __attribute__ ((section (".text.fastcode"))) _do_rcuS ( + unsigned char x, unsigned char y, unsigned char m) +{ + unsigned char q; + + + if((x > BORDER_RIGHT))// | (x < BORDER_LEFT)) + return; + + is_drawing++; + + if(m != DRAW_NORCU) + { + LCD_CMD = 0xB0; + LCD_CMD = (y >> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + q = LCD_DATA; + rcubuf[0][0] = LCD_DATA; + rcubuf[1][0] = LCD_DATA; + + q = LCD_DATA; + } + + LCD_CMD = 0xB0; + LCD_CMD = (y >> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + switch(m) + { + case DRAW_ALPHA: + case DRAW_PUT: // draw put + LCD_DATA = rcubuf[0][0] | drawbuf[0][0]; + LCD_DATA = rcubuf[1][0] | drawbuf[1][0]; + break; + case DRAW_XOR: // draw xor + LCD_DATA = rcubuf[0][0] ^ drawbuf[0][0]; + LCD_DATA = rcubuf[1][0] ^ drawbuf[1][0]; + break; + case DRAW_ERASE: // draw erase + LCD_DATA = rcubuf[0][0] & ~drawbuf[0][0]; + LCD_DATA = rcubuf[1][0] & ~drawbuf[1][0]; + break; + case DRAW_NORCU: // draw erase + LCD_DATA = drawbuf[0][0]; + LCD_DATA = drawbuf[1][0]; + break; + } + is_drawing--; +} // _do_rcuS +//----------------------------------------------------------------------------- + + + +//----------------------------------------------------------------------------- +void __attribute__ ((section(".text.fastcode"))) _draw_block(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char c, unsigned char m) +{ + unsigned char q,s; + unsigned char yy,ss,vv,ww,xx; + unsigned char segm; + is_drawing++; + + if (x + w > LCD_SIZE_X) + w = LCD_SIZE_X - x; + + s = y; + + if(h) + { + yy = h; + ss = y >> 3; + vv = y & 0x07; + + ww = yy & 0x07; + + segm = 0xFF; + + xx = 8; + if(yy < 8) + { + segm >>= (8-ww); + xx -= (8-ww); + if(vv > (8-xx)) + { + xx = yy -(vv-(8-xx)); + } + else + { + xx = yy; + } + } + else + { + xx -= vv; + } + + segm <<= vv; + + q = w; + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = segm; + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = segm; + else + drawbuf[1][q] = 0; + } + do_rcu(x,s,w,m); + + yy -= xx; + + while(yy > 8) + { + s += 8; + yy -= 8; + q = w; + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = 0xFF; + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = 0xFF; + else + drawbuf[1][q] = 0; + } + do_rcu(x,s,w,m); + } + + if(yy) + { + s += 8; + q = w; + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = 0xFF >> (8-yy); + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = 0xFF >> (8-yy); + else + drawbuf[1][q] = 0; + } + do_rcu(x,s,w,m); + } + } + is_drawing--; +} + +void __attribute__ ((section(".text.fastcode"))) _draw_hline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m) +{ + unsigned char p,q; + is_drawing++; + + q = l; + p = 0x01 << (y & 0x07); + + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = p; + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = p; + else + drawbuf[1][q] = 0; + } + do_rcu(x,y,l,m); + is_drawing--; +} + +void __attribute__ ((section(".text.fastcode"))) _draw_vline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m) +{ + unsigned char s; + unsigned char yy,ss,vv,ww,xx; + unsigned char segm; + is_drawing++; + + s = y; + + if(l) + { + + + + yy = l; + ss = y >> 3; + vv = y & 0x07; + + ww = yy & 0x07; + + segm = 0xFF; + + xx = 8; + if(yy < 8) + { + segm >>= (8-ww); + xx -= (8-ww); + if(vv > (8-xx)) + { + xx = yy -(vv-(8-xx)); + } + else + { + xx = yy; + } + } + else + { + xx -= vv; + } + + segm <<= vv; + + if(c & 0x02) + drawbuf[0][0] = segm; + else + drawbuf[0][0] = 0; + + if(c & 0x01) + drawbuf[1][0] = segm; + else + drawbuf[1][0] = 0; + + do_rcuS(x,s,m); + + yy -= xx; + + while(yy > 8) + { + s += 8; + yy -= 8; + if(c & 0x02) + drawbuf[0][0] = 0xFF; + else + drawbuf[0][0] = 0; + + if(c & 0x01) + drawbuf[1][0] = 0xFF; + else + drawbuf[1][0] = 0; + do_rcuS(x,s,m); + } + + if(yy) + { + s += 8; + if(c & 0x02) + drawbuf[0][0] = 0xFF >> (8-yy); + else + drawbuf[0][0] = 0; + + if(c & 0x01) + drawbuf[1][0] = 0xFF >> (8-yy); + else + drawbuf[1][0] = 0; + do_rcuS(x,s,m); + } + } + is_drawing--; +} + +void draw_rect(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char lw, unsigned char c, unsigned char m) +{ + is_drawing++; + if(lw) + { + if(lw == 1) + { + draw_hline(x, y, w, c, m); + draw_hline(x, y+h-1, w, c, m); + + draw_vline(x, y+1, h-2, c, m); + draw_vline(x+w-1, y+1, h-2, c, m); + } + else + { + draw_block(x, y, w, lw, c, m); + draw_block(x, y+h-lw, w, lw, c, m); + draw_block(x, y+lw, lw, h-(2*lw), c, m); + draw_block(x+w-lw, y+lw, lw, h-(2*lw), c, m); + } + } + is_drawing--; +} + +void draw_pixel(unsigned char x, unsigned char y, unsigned char c, unsigned char m) +{ + unsigned char p; + is_drawing++; + + p = 0x01 << (y & 0x07); + + if(c & 0x02) + drawbuf[0][0] = p; + else + drawbuf[0][0] = 0; + + if(c & 0x01) + drawbuf[1][0] = p; + else + drawbuf[1][0] = 0; + + do_rcuS(x,y,m); + is_drawing--; +} + +void draw_line(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char c, unsigned char m) +{ + unsigned char i,dx,dy,px,py; + unsigned int x,y; + is_drawing++; + + if (y2 > y1) // incl. POSITIVE + { + dx=x2-x1; + dy=y2-y1; + px=x1; + py=y1; + draw_pixel(x1, y1, c, m); // first pixel + if (dx>=dy) // incl. is more horizontal than vertical + { + y = y1; + for(i=0;i=dx) + { + y-=dx; + py+=1; + } + px+=1; + draw_pixel(px, py, c, m); + } + } + else // incl. is more vertical than horizontal + { + x = x1; + for(i=0;i=dy) + { + x-=dy; + px+=1; + } + py+=1; + draw_pixel(px, py, c, m); //?????? + } + }; + } + else if (y2 < y1) // incl. NEGATIVE + { + dx=x2-x1; + dy=y1-y2; // inverted to produce a positive value + dx=dx; + dy=dy; + px=x1; + py=y2; // Note: due to inverted "dy", + draw_pixel(x2, y2, c, m); // the first pixel became the last one + if (dx>=dy) // incl. is more horizontal than vertical + { + y = y1; + py=y1; + for(i=0;i=dx) + { + y-=dx; + py-=1; + } + px+=1; + draw_pixel(px, py, c, m); + } + } + else // incl. is more vertical than horizontal + { + x = x1; + px=x2; + for(i=0;i=dy) + { + x-=dy; + px-=1; + } + py+=1; + draw_pixel(px, py, c, m); + } + }; + } + is_drawing--; +} + +void draw_circle(unsigned char cx, unsigned char cy, unsigned char radius, unsigned char c, unsigned char m) +{ + signed int tswitch; + unsigned char y, x = 0; + unsigned char d; + is_drawing++; + + d = cy - cx; + y = radius; + tswitch = 3 - 2 * radius; + while (x <= y) + { + if(x != 0) + { + draw_pixel(cx + x, cy + y, c, m); + draw_pixel(cx + x, cy - y, c, m); + } + draw_pixel(cx - x, cy + y, c, m); + draw_pixel(cx - x, cy - y, c, m); + + if(x != y) + { + if(x != 0) + { + draw_pixel(cy + y - d, cy + x, c, m); + draw_pixel(cy - y - d, cy + x, c, m); + } + draw_pixel(cy + y - d, cy - x, c, m); + draw_pixel(cy - y - d, cy - x, c, m); + } + + if (tswitch < 0) + { + tswitch += (4 * x + 6); + } + else + { + tswitch += (4 * (x - y) + 10); + y--; + } + x++; + } + is_drawing--; +} + +void draw_qcircle(unsigned char cx, unsigned char cy, unsigned char radius, unsigned char quarter, unsigned char c, unsigned char m) +{ + signed int tswitch; + unsigned char y, x = 0; + unsigned char d; + is_drawing++; + + d = cy - cx; + y = radius; + tswitch = 3 - 2 * radius; + + switch(quarter) + { + case TOP_LEFT: + while (x <= y) + { + draw_pixel(cx - x, cy - y, c, m); + + if(x != y) + { + draw_pixel(cy - y - d, cy - x, c, m); + } + + if (tswitch < 0) + { + tswitch += (4 * x + 6); + } + else + { + tswitch += (4 * (x - y) + 10); + y--; + } + x++; + } + break; + + case TOP_RIGHT: + while (x <= y) + { + draw_pixel(cx + x, cy - y, c, m); + + if(x != y) + { + draw_pixel(cy + y - d, cy - x, c, m); + } + + if (tswitch < 0) + { + tswitch += (4 * x + 6); + } + else + { + tswitch += (4 * (x - y) + 10); + y--; + } + x++; + } + break; + + case BOTTOM_LEFT: + while (x <= y) + { + draw_pixel(cx - x, cy + y, c, m); + + if(x != y) + { + draw_pixel(cy - y - d, cy + x, c, m); + } + + if (tswitch < 0) + { + tswitch += (4 * x + 6); + } + else + { + tswitch += (4 * (x - y) + 10); + y--; + } + x++; + } + break; + + case BOTTOM_RIGHT: + while (x <= y) + { + draw_pixel(cx + x, cy + y, c, m); + + if(x != y) + { + draw_pixel(cy + y - d, cy + x, c, m); + } + + if (tswitch < 0) + { + tswitch += (4 * x + 6); + } + else + { + tswitch += (4 * (x - y) + 10); + y--; + } + x++; + } + break; + } + is_drawing--; +} + +void draw_disc(unsigned char cx, unsigned char cy, unsigned char radius, unsigned char c, unsigned char m) +{ + signed int tswitch; + unsigned char y, x = 0; + unsigned char d; + is_drawing++; + + d = cy - cx; + y = radius; + tswitch = 3 - 2 * radius; + while (x <= y) + { + if(x != y) + { + if(x != 0) + { + draw_hline(cy - y - d, cy + x, (y<<1)+1, c, m); + } + draw_hline(cy - y - d, cy - x, (y<<1)+1, c, m); + } + + if (tswitch < 0) + { + tswitch += (4 * x + 6); + } + else + { + draw_hline(cx-x, cy + y, (x<<1)+1, c, m); + draw_hline(cx-x, cy - y, (x<<1)+1, c, m); + tswitch += (4 * (x - y) + 10); + y--; + } + x++; + } + is_drawing--; +} + +void draw_qdisc(unsigned char cx, unsigned char cy, unsigned char radius, unsigned char quarter, unsigned char c, unsigned char m) +{ + signed int tswitch; + unsigned char y, x = 0; + unsigned char d; + is_drawing++; + + d = cy - cx; + y = radius; + tswitch = 3 - 2 * radius; + switch(quarter) + { + case TOP_LEFT: + while (x <= y) + { + if(x != y) + { + draw_hline(cy - y - d, cy - x, y+1, c, m); + } + + if (tswitch < 0) + { + tswitch += (4 * x + 6); + } + else + { + draw_hline(cx-x, cy - y, x+1, c, m); + tswitch += (4 * (x - y) + 10); + y--; + } + x++; + } + break; + + case TOP_RIGHT: + while (x <= y) + { + if(x != y) + { + draw_hline(cx, cy - x, y+1, c, m); + } + + if (tswitch < 0) + { + tswitch += (4 * x + 6); + } + else + { + draw_hline(cx, cy - y, x+1, c, m); + tswitch += (4 * (x - y) + 10); + y--; + } + x++; + } + break; + + case BOTTOM_LEFT: + while (x <= y) + { + if(x != y) + { + draw_hline(cy - y - d, cy + x, y+1, c, m); + } + + if (tswitch < 0) + { + tswitch += (4 * x + 6); + } + else + { + draw_hline(cx-x, cy + y, x+1, c, m); + tswitch += (4 * (x - y) + 10); + y--; + } + x++; + } + break; + + case BOTTOM_RIGHT: + while (x <= y) + { + if(x != y) + { + draw_hline(cx, cy + x, y+1, c, m); + } + + if (tswitch < 0) + { + tswitch += (4 * x + 6); + } + else + { + draw_hline(cx, cy + y, x+1, c, m); + tswitch += (4 * (x - y) + 10); + y--; + } + x++; + } + break; + } + is_drawing--; +} + + +unsigned char draw_arrow(int x, int y, unsigned char ArrowDir, int ArrowLen, unsigned char Color, unsigned char Mode) +{ + int i; + int Len; + is_drawing++; + + switch(ArrowDir) + { + case ARROW_UP: + for(i=0; i r) + { + draw_block(x, y+r+1, r+1, h-(r<<1)-2,c,m); + draw_block(x+r+1, y+t, t-r-1, h-(t<<1),c,m); + draw_block(x+w-r-1, y+r+1, r+1, h-(r<<1)-2,c,m); + draw_block(x+w-t, y+t, t-r-1, h-(t<<1),c,m); + } + else + { + if(r > t) + { + draw_qdisc(x+r, y+r, r-t, TOP_LEFT, c, DRAW_XOR); + draw_qdisc(x+w-r-1, y+r, r-t, TOP_RIGHT, c, DRAW_XOR); + draw_qdisc(x+r, y+h-r-1, r-t, BOTTOM_LEFT, c, DRAW_XOR); + draw_qdisc(x+w-r-1, y+h-r-1, r-t, BOTTOM_RIGHT, c, DRAW_XOR); + } + draw_block(x, y+r+1, t, h-(r<<1)-2,c,m); + draw_block(x+w-t, y+r+1, t, h-(r<<1)-2,c,m); + } + draw_block(x+r+1, y, w-(r<<1)-2, t, c, m); + draw_block(x+r+1, y+h-t, w-(r<<1)-2, t, c, m); + } + } + is_drawing--; +} + +void draw_symbol (unsigned char x, unsigned char y, unsigned char l, unsigned char* data, unsigned char c, unsigned char m) +{ + unsigned char p; + unsigned int cnt; + is_drawing++; + + + for(cnt=0;cnt + + 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 3 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 LCD_H +#define LCD_H + +// the lcd data & command ports +#define LCD_CMD (*((volatile unsigned char *) 0x81000000)) +#define LCD_DATA (*((volatile unsigned char *) 0x81000001)) + +// LCD commands +#define LCD_CONTRAST 0x3A // original 0x3F (0..63) + +#define LCD_GRAYMODE_88 0x00 // original 0x3F +#define LCD_GRAYMODE_89 0x00 // original 0x3F +#define LCD_GRAYMODE_8A 0x36 // original 0x33 +#define LCD_GRAYMODE_8B 0x63 // original 0x33 +#define LCD_GRAYMODE_8C 0x67 // original 0x66 +#define LCD_GRAYMODE_8D 0x76 // original 0x66 +#define LCD_GRAYMODE_8E 0xAC // original 0x99 +#define LCD_GRAYMODE_8F 0xCA // original 0x99 + +#define LCD_DCDCx3 0x64 // +#define LCD_DCDCx4 0x65 // +#define LCD_DCDCx5 0x66 // +//~ #define LCD_DCDCx? 0x67 // ? datasheet p. 33 + +#define LCD_IRRR_1 0x20 // +#define LCD_IRRR_2 0x21 // +#define LCD_IRRR_3 0x22 // +#define LCD_IRRR_4 0x23 // +#define LCD_IRRR_5 0x24 // +#define LCD_IRRR_6 0x25 // +#define LCD_IRRR_7 0x26 // +#define LCD_IRRR_8 0x27 // + +#define LCD_ALLON 0xA4 // black +#define LCD_ALLOFF 0xA5 // white +#define LCD_NORMAL 0xA6 // +#define LCD_REVERSE 0xA7 // + +#define LCD_SLEEP 0xA9 // enter Sleep Mode. internal oscillator and LCD powersupply off + +#define LCD_OSC_START 0xAB // + +#define LCD_OFF 0xAE // +#define LCD_ON 0xAF // + +#define LCD_WAKEUP 0xE1 // +#define LCD_RESET 0xE2 // + + +// drawmodes +#define DRAW_PUT 0 +#define DRAW_XOR 1 +#define DRAW_ERASE 2 +#define DRAW_ALPHA 3 +#define DRAW_NORCU 4 + +#define LCD_COLOR_W 0 +#define LCD_COLOR_LG 1 +#define LCD_COLOR_DG 2 +#define LCD_COLOR_B 3 + +#define LCD_SIZE_X 128 +#define LCD_SIZE_Y 160 + +#define ARROW_UP 1 +#define ARROW_DOWN 2 +#define ARROW_LEFT 3 +#define ARROW_RIGHT 4 +#define ARROW_LEN 4 + +#define TOP_LEFT 0 +#define TOP_RIGHT 1 +#define BOTTOM_LEFT 2 +#define BOTTOM_RIGHT 3 + +#define BORDER_LEFT 0 +#define BORDER_RIGHT 127 + +extern unsigned char drawbuf[2][LCD_SIZE_X]; +extern unsigned int is_drawing; + +extern volatile unsigned char symbols; +extern volatile unsigned char oldsymbols; +#define symbolRF (1<<0) +extern const unsigned char symIR[]; + +typedef void(*rcu_fn)(unsigned char x, unsigned char y, unsigned char l, unsigned char m); +typedef void (*rcuAlpha_fn) (unsigned char x, unsigned char y, unsigned char l, unsigned char m, + unsigned char* alphaBuf); +typedef void(*rcus_fn)(unsigned char x, unsigned char y, unsigned char m); +typedef void(*bl_fn)(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char c, unsigned char m); +typedef void(*ln_fn)(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m); + +// Function pointer to section (".text.fastcode") +extern rcu_fn do_rcu; +extern rcuAlpha_fn do_rcuAlpha; +extern rcus_fn do_rcuS; +extern bl_fn draw_block; +extern ln_fn draw_hline; +extern ln_fn draw_vline; + + +extern void lcd_set (unsigned char s); + +extern void lcd_init (unsigned char s); +extern void lcd_enable (unsigned char e); +//extern void do_rcu(unsigned char x, unsigned char y, unsigned char l, unsigned char m); +//extern void do_rcuAlpha (unsigned char x, unsigned char y, unsigned char l, unsigned char m, +// unsigned char* alphaBuf); +//extern void do_rcuS(unsigned char x, unsigned char y, unsigned char m); +extern void lcd_set_contrast(unsigned char c); + +extern void lcd_fill (unsigned char f); +extern void draw_logo (void); +//extern void draw_block (unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char c, unsigned char m); +//extern void draw_hline (unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m); +//extern void draw_vline (unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m); +extern void draw_rect (unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char lw, unsigned char c, unsigned char m); +extern void draw_pixel (unsigned char x, unsigned char y, unsigned char c, unsigned char m); +extern void draw_line (unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char c, unsigned char m); +extern void draw_circle (unsigned char cx, unsigned char cy, unsigned char radius, unsigned char c, unsigned char m); +extern void draw_qcircle (unsigned char cx, unsigned char cy, unsigned char radius, unsigned char quarter, unsigned char c, unsigned char m); +extern void draw_disc (unsigned char cx, unsigned char cy, unsigned char radius, unsigned char c, unsigned char m); +extern void draw_qdisc (unsigned char cx, unsigned char cy, unsigned char radius, unsigned char quarter, unsigned char c, unsigned char m); + +extern unsigned char draw_arrow (int x, int y, unsigned char ArrowDir, int ArrowLen, unsigned char Color, unsigned char Mode); + +extern void draw_frame(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char t, unsigned char r, unsigned char c, unsigned char m); +extern void draw_symbol(unsigned char x, unsigned char y, unsigned char l,unsigned char* data, unsigned char c, unsigned char m); +extern void refresh_symbols(unsigned int cb); +extern void redraw_symbols(void); + +extern void update_active_ind (void); + +#endif diff --git a/boop/trunk/flash/Make.conf b/boop/trunk/flash/Make.conf new file mode 100644 index 0000000..9560103 --- /dev/null +++ b/boop/trunk/flash/Make.conf @@ -0,0 +1 @@ +THUMBSRCS := flash.c bfs.c diff --git a/boop/trunk/flash/bfs.c b/boop/trunk/flash/bfs.c new file mode 100644 index 0000000..92e75fd --- /dev/null +++ b/boop/trunk/flash/bfs.c @@ -0,0 +1,730 @@ +/* + bfs.c - Betty File System + Copyright (C) 2007 Colibri + + 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 3 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 "bfs.h" +#include "flash.h" +#include "lcd.h" +#include "fonty.h" +#include "global.h" + +extern const unsigned long secaddr[19]; + +//Public functions +unsigned char BFS_Mount() +{ + //Return true=ok + unsigned char BfsSector; + unsigned long Offset; + unsigned long FileHeaderAddress; + unsigned char RecordInfo; + unsigned long Id; + unsigned short Len; + unsigned long FileBodyAddress; + unsigned char IsFree; + unsigned char IsActive; + const unsigned long BfsVersion = BFS_VERSION; + + //Format + for(BfsSector=0; BfsSector BFS_SECTOR_HEADER_LEN) + { + //No free sector + //ASSERT(false); + return false;//Error + } + + return true;//OK +} + +unsigned short BFS_LoadFile(unsigned long Id, unsigned short MaxLen, unsigned char *Buffer) +{ + //Return: ReadLen + unsigned long FileHeaderAddress; + unsigned char RecordInfo; + unsigned long TempId; + unsigned short FileBodyLen; + unsigned long FileBodyAddress; + unsigned char IsFree; + unsigned char IsActive; + + if(!BFS_GetFileHeaderAddress(Id, &FileHeaderAddress)) + { + return 0;//File not found + } + BFS_GetFileHeaderInfo(FileHeaderAddress, &RecordInfo, &TempId, &FileBodyLen, &FileBodyAddress, &IsFree, &IsActive); + memcpy(Buffer, (unsigned char*)FileBodyAddress, min(FileBodyLen, MaxLen)); + + return min(FileBodyLen, MaxLen);//Error +} + +unsigned char BFS_CmpFile(unsigned long Id, unsigned short MaxLen, unsigned char *Buffer) +{ + //Return: ReadLen + unsigned long FileHeaderAddress; + unsigned char RecordInfo; + unsigned long TempId; + unsigned short FileBodyLen; + unsigned long FileBodyAddress; + unsigned char IsFree; + unsigned char IsActive; + int x; + + if(!BFS_GetFileHeaderAddress(Id, &FileHeaderAddress)) + { + return 0;//File not found + } + BFS_GetFileHeaderInfo(FileHeaderAddress, &RecordInfo, &TempId, &FileBodyLen, &FileBodyAddress, &IsFree, &IsActive); + x=memcmp(Buffer, (unsigned char*)FileBodyAddress, min(FileBodyLen, MaxLen)); + + if (x) + return 0;//not equal + return 1; +} + +void* BFS_LoadFileAddr(unsigned long Id) +{ + //Return: ReadLen + unsigned long FileHeaderAddress; + unsigned char RecordInfo; + unsigned long TempId; + unsigned short FileBodyLen; + unsigned long FileBodyAddress; + unsigned char IsFree; + unsigned char IsActive; + + if(!BFS_GetFileHeaderAddress(Id, &FileHeaderAddress)) + { + return 0;//File not found + } + BFS_GetFileHeaderInfo(FileHeaderAddress, &RecordInfo, &TempId, &FileBodyLen, &FileBodyAddress, &IsFree, &IsActive); + + return (void*)FileBodyAddress; + +} + +unsigned char BFS_SaveFile(unsigned long Id, unsigned short Len, unsigned char *Buffer) +{ + //Return true=OK + unsigned char BfsSector; + unsigned char RecordInfo; + int i; + unsigned long TempId; + unsigned short FileBodyLen; + unsigned long FileBodyAddress; + unsigned char IsFree; + unsigned char IsActive; + unsigned char OverridePossible; + unsigned char CreateNewFile; + unsigned char Byte; + unsigned long FileHeaderAddress; + unsigned char HeaderSize; + + CreateNewFile = false; + if(BFS_GetFileHeaderAddress(Id, &FileHeaderAddress)) + { + //File is already present + BFS_GetFileHeaderInfo(FileHeaderAddress, &RecordInfo, &TempId, &FileBodyLen, &FileBodyAddress, &IsFree, &IsActive); + //Same len? + OverridePossible = false; + if(Len == FileBodyLen) + { + //Is override possible (no change from 0 to 1)? + OverridePossible = true; + for(i=0; i1 error + OverridePossible = false; + } + } + } + if(OverridePossible) + { + if(writeBuffer(FileBodyAddress, Buffer, Len) != 0) + { + return false;//Error + } + } + else + { + //Delete existing file + Byte = (RecordInfo & 0x3F) | (BFS_TYPE_DELETED << 6); + writeBuffer(FileHeaderAddress, &Byte, 1); + glBfsDeletedBytes[BFS_ByteAddressToBfsSector(FileHeaderAddress)] += (FileBodyAddress - FileHeaderAddress) + FileBodyLen; + + CreateNewFile = true; + } + } + else + { + //File not present + CreateNewFile = true; + } + + while(CreateNewFile) + { + //Check free space + //Start with the fullest, ignore the last empty one + for(i=0; (i<(BFS_SECTORS-1)) && CreateNewFile; i++) + { + BfsSector = glBfsFillOrder[i]; + FileHeaderAddress = glBfsOffsetToFreeRecord[BfsSector]; + if((FileHeaderAddress + BFS_MAX_RECORD_HEADER_LEN + Len) < BFS_SECTOR_SIZE) + { + //Enough space free + BFS_WriteAtAddress(BFS_GetPhyByteAddrFromBfsSector(BfsSector) + FileHeaderAddress, Id, Len, Buffer, &HeaderSize); + + glBfsOffsetToFreeRecord[BfsSector] += HeaderSize + Len; + BFS_SortArray(); + + CreateNewFile = false; + } + } + + if(CreateNewFile) + { + //No space free + //copy only active files (not the files markes as deleted) to the empty sector and erase the source sector + if(!BFS_MakeSpace(Len)) + { + //Still not enough space free + return false;//Error + } + } + } + + return true;//OK +} + +unsigned char BFS_DeleteFile(unsigned long Id) +{ + //Return true=OK + //Return false=File not found/File was already deleted + + unsigned char RecordInfo; + unsigned long TempId; + unsigned short FileBodyLen; + unsigned long FileBodyAddress; + unsigned char IsFree; + unsigned char IsActive; + unsigned char Byte; + unsigned long FileHeaderAddress; + + if(BFS_GetFileHeaderAddress(Id, &FileHeaderAddress)) + { + //File is present + BFS_GetFileHeaderInfo(FileHeaderAddress, &RecordInfo, &TempId, &FileBodyLen, &FileBodyAddress, &IsFree, &IsActive); + + //Delete existing file + Byte = (RecordInfo & 0x3F) | (BFS_TYPE_DELETED << 6); + writeBuffer(FileHeaderAddress, &Byte, 1); + + glBfsDeletedBytes[BFS_ByteAddressToBfsSector(FileHeaderAddress)] += (FileBodyAddress - FileHeaderAddress) + FileBodyLen; + return true;//OK + } + + return false;//File not found/File was already deleted +} + +unsigned char BFS_DeleteAllFiles() +{ + //Return true=ok + unsigned char BfsSector; + unsigned long Offset; + const unsigned long BfsVersion = BFS_VERSION; + + //Format + for(BfsSector=0; BfsSector glBfsDeletedBytes[BfsSectorWithMostDelFiles]) + { + BfsSectorWithMostDelFiles = BfsSector; + } + } + if(glBfsDeletedBytes[BfsSectorWithMostDelFiles] == 0) + { + //No sector has files marked as deleted -> nothing to free + return false;//Not enough space free + } + + //Copy active files to the empty bfs sector + BfsSector = glBfsFillOrder[BFS_SECTORS - 1];//The empty destination sector + DstAddress = BFS_GetPhyByteAddrFromBfsSector(BfsSector) + BFS_SECTOR_HEADER_LEN; + + FileHeaderAddress = BFS_GetPhyByteAddrFromBfsSector(BfsSectorWithMostDelFiles) + BFS_SECTOR_HEADER_LEN;//Source + do + { + BFS_GetFileHeaderInfo(FileHeaderAddress, &RecordInfo, &Id, &FileBodyLen, &FileBodyAddress, &IsFree, &IsActive); + if(IsActive) + { + //Copy the active file to the destination sector + BFS_FlashToFlashCopy(DstAddress, FileHeaderAddress, (FileBodyAddress - FileHeaderAddress) + FileBodyLen); + DstAddress += (FileBodyAddress - FileHeaderAddress) + FileBodyLen; + + glBfsOffsetToFreeRecord[BfsSector] += (FileBodyAddress - FileHeaderAddress) + FileBodyLen; + } + FileHeaderAddress = FileBodyAddress + FileBodyLen; + }while(!IsFree); + + //Erase the source sector + if(eraseSector(BFS_CHIP, BFS_FIRST_SECTOR + BfsSectorWithMostDelFiles) != 0) + { + return false;//Error + } + //Write sector header + Offset = BFS_GetPhyByteAddrFromBfsSector(BfsSectorWithMostDelFiles); + writeBuffer(Offset, (unsigned char*)BFS_MAGIC, 4); + writeBuffer(Offset + 4, (unsigned char*)&BfsVersion, 4); + + glBfsDeletedBytes[BfsSectorWithMostDelFiles] = 0; + glBfsOffsetToFreeRecord[BfsSectorWithMostDelFiles] = BFS_SECTOR_HEADER_LEN; + + BFS_SortArray(); + }while(1); + + return false;//Not enough space free +} + +void BFS_SortArray() +{ + //Sort the glBfsFillOrder array + unsigned char RepeatSort; + unsigned char BfsSector; + unsigned char Byte; + + do + { + RepeatSort = false; + for(BfsSector=0; BfsSector<(BFS_SECTORS-1); BfsSector++) + { + if(glBfsOffsetToFreeRecord[glBfsFillOrder[BfsSector]] < glBfsOffsetToFreeRecord[glBfsFillOrder[BfsSector+1]]) + { + //Swap + Byte = glBfsFillOrder[BfsSector]; + glBfsFillOrder[BfsSector] = glBfsFillOrder[BfsSector+1]; + glBfsFillOrder[BfsSector+1] = Byte; + RepeatSort = true; + } + } + }while(RepeatSort); +} + +unsigned long BFS_GetPhyByteAddrFromBfsSector(unsigned char BfsSector) +{ + //BFS_FIRST_SECTOR + BfsSector = PhyFlashSector + + //ASSERT((BFS_FIRST_SECTOR + BfsSector) < FLASH_SECTORS); + + return BFS_FLASH_BASE + (secaddr[BfsSector + BFS_FIRST_SECTOR] * 2); +} + +unsigned char BFS_IsSectorFormated(unsigned char BfsSector) +{ + //Is the sector formated and is the version valid + + unsigned long Offset; + unsigned long Version; + + Offset = BFS_GetPhyByteAddrFromBfsSector(BfsSector); + + if(memcmp((unsigned char*)Offset, BFS_MAGIC, 4) != 0) + { + return false;//Magic not found -> not formated + } + + Version = *((unsigned long*) (Offset + 4)); + if(Version != BFS_VERSION) + { + return false;//Magic found but wrong version + } + + return true;//Formated +} + +void BFS_GetFileHeaderInfo(unsigned long FileHeaderAddress, unsigned char *pRecordInfo, unsigned long *pId, unsigned short *pLen, unsigned long *pFileBodyAddress, unsigned char *pIsFree, unsigned char *pIsActive) +{ + unsigned char State; + unsigned char IdByteCount; + unsigned char LenByteCount; + unsigned long Offset; + + Offset = FileHeaderAddress; + *pRecordInfo = readByte(Offset++); + State = ((*pRecordInfo) >> 6) & 0x03; + IdByteCount = 1 + (((*pRecordInfo) >> 1) & 0x03); + LenByteCount = 1 + ((*pRecordInfo) & 0x01); + + if(State == BFS_TYPE_FREE) + { + //Free + *pIsFree = true; + *pIsActive = false; + *pId = 0; + *pLen = 0; + *pFileBodyAddress = 0; + } + else + { + //Active or deleted + *pIsFree = false; + *pIsActive = (State == BFS_TYPE_ACTIVE) ? true : false; + + *pId = readByte(Offset++); + if(IdByteCount > 1) + { + *pId |= readByte(Offset++) << 8; + } + if(IdByteCount > 2) + { + *pId |= readByte(Offset++) << 16; + } + if(IdByteCount > 3) + { + *pId |= readByte(Offset++) << 24; + } + + *pLen = readByte(Offset++); + if(LenByteCount > 1) + { + *pLen |= readByte(Offset++) << 8; + } + + *pFileBodyAddress = Offset; + } +} + +unsigned char BFS_GetFileHeaderAddress(unsigned long Id, unsigned long *pFileHeaderAddress) +{ + //Return true = File is present, pFileHeaderAddress is valid + //Return false = File not found (e.g. deleted), pFileHeaderAddress is invalid + unsigned char BfsSector; + unsigned long PhyAddr; + unsigned char RecordInfo; + unsigned long TempId; + unsigned short FileBodyLen; + unsigned long FileBodyAddress; + unsigned char IsFree; + unsigned char IsActive; + + *pFileHeaderAddress = 0; + + for(BfsSector=0; BfsSector= ByteAddress) && (FileHeaderAddress < (ByteAddress + BFS_SECTOR_SIZE))) + { + return BfsSector; + } + } + + //ASSERT(false); + BfsSector = 0xFF;//Error + return BfsSector; +} + +unsigned char BFS_WriteAtAddress(unsigned long FileHeaderAddress, unsigned long Id, unsigned short Len, unsigned char *Buffer, unsigned char *pHeaderSize) +{ + //Return true=OK + unsigned char RecordHeaderPos; + unsigned char RecordInfo; + unsigned char RecordHeader[BFS_MAX_RECORD_HEADER_LEN]; + unsigned char IdByteCount; + unsigned char LenByteCount; + + //IdByteCount + if(Id & 0xFF000000) + { + IdByteCount = BFS_ID_4BYTES; + } + else + { + if(Id & 0xFF0000) + { + IdByteCount = BFS_ID_3BYTES; + } + else + { + if(Id & 0xFF00) + { + IdByteCount = BFS_ID_2BYTES; + } + else + { + IdByteCount = BFS_ID_1BYTE; + } + } + } + + //LenByteCount + LenByteCount = (Len < 0x100) ? BFS_ONE_LEN_BYTE : BFS_TWO_LEN_BYTES; + + //RecordInfo + RecordInfo = (BFS_TYPE_ACTIVE << 6) | (IdByteCount << 1) | LenByteCount; + RecordHeaderPos = 0; + RecordHeader[RecordHeaderPos++] = RecordInfo; + + //Id + RecordHeader[RecordHeaderPos++] = Id & 0xFF; + if(Id >= 0x100) + { + RecordHeader[RecordHeaderPos++] = (Id >> 8) & 0xFF; + if(Id >= 0x10000) + { + RecordHeader[RecordHeaderPos++] = (Id >> 16) & 0xFF; + if(Id >= 0x1000000) + { + RecordHeader[RecordHeaderPos++] = (Id >> 24) & 0xFF; + } + } + } + + //Len + RecordHeader[RecordHeaderPos++] = Len & 0xFF; + if(Len >= 0x100) + { + RecordHeader[RecordHeaderPos++] = (Len >> 8) & 0xFF; + } + + //Write record header + writeBuffer(FileHeaderAddress, RecordHeader, RecordHeaderPos); + //Write record data + writeBuffer(FileHeaderAddress + RecordHeaderPos, Buffer, Len); + + *pHeaderSize = RecordHeaderPos; + + return true;//OK +} + +unsigned char readByte(unsigned long ByteAddr) +{ + unsigned char Byte; + Byte = ((unsigned char*) ByteAddr)[0]; + + return Byte; +} + +unsigned short readWord(unsigned long WordAddr) +{ + //addr = unsigned short address + int Offset; + unsigned short Word; + + //ASSERT((WordAddr * 2) >= FLASH1_BASE); + //ASSERT((WordAddr * 2) < (FLASH1_BASE + FLASH_SIZE)); + + Offset = (WordAddr * 2) - FLASH1_BASE; + + Word = *((unsigned short *)(WordAddr<<1)); + + return Word; +} + + +int writeBuffer(unsigned long ByteAddr, unsigned char *buffer, unsigned short len) +{ + //Return 0=OK + int Offset; + unsigned short Word; + + Offset = 0; + + if(ByteAddr & 1) + { + //Not word boundary + Word = readWord(ByteAddr / 2); + Word &= (buffer[Offset] << 8) | 0xFF; + writeWord(ByteAddr & 0xFFFFFFFE, Word); + Offset++; + ByteAddr++; + len--; + } + + while(len >= 2) + { + Word = readWord(ByteAddr / 2); + Word &= buffer[Offset] | (buffer[Offset + 1] << 8); + writeWord(ByteAddr, Word); + Offset += 2; + ByteAddr += 2; + len -= 2; + } + + if(len == 1) + { + Word = readWord(ByteAddr / 2); + Word &= 0xFF00 | buffer[Offset]; + writeWord(ByteAddr, Word); + Offset++; + ByteAddr++; + len--; + } + + return 0;//OK +} + diff --git a/boop/trunk/flash/bfs.h b/boop/trunk/flash/bfs.h new file mode 100644 index 0000000..ded16ba --- /dev/null +++ b/boop/trunk/flash/bfs.h @@ -0,0 +1,86 @@ +/* + bfs.h - Betty File System + Copyright (C) 2007 Colibri + + 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 3 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 BFS_H +#define BFS_H + +//Define here your file ids (range 1 - 0xFFFFFFFF) +#define BFS_ID_remotes 1 +#define BFS_ID_settings 2 +#define BFS_ID_RFsettings 3 +#define BFS_ID_RAWslot0 4 +#define BFS_ID_RAWslot1 5 +#define BFS_ID_RAWslot2 6 +#define BFS_ID_RAWslot3 7 + + +//Use last 3 64 KByte sectors (16..18) of the second chip for BFS +#define BFS_FIRST_SECTOR 16 +#define BFS_SECTORS 3 +#define BFS_SECTOR_SIZE 0x10000 + +#define BFS_SECTOR_HEADER_LEN 0x10 +#define BFS_MAGIC "BFS" +#define BFS_VERSION 1 +#define BFS_CHIP 1 + +#define BFS_TYPE_DELETED 0 +#define BFS_TYPE_ACTIVE 1 +#define BFS_TYPE_FREE 3 +#define BFS_ID_1BYTE 0 +#define BFS_ID_2BYTES 1 +#define BFS_ID_3BYTES 2 +#define BFS_ID_4BYTES 3 +#define BFS_ONE_LEN_BYTE 0 +#define BFS_TWO_LEN_BYTES 1 + +//Max. 1 info byte, 4 ID bytes, 2 length bytes +#define BFS_MAX_RECORD_HEADER_LEN (1+4+2) + +#define BFS_FLASH_BASE FLASH1_BASE + +unsigned long glBfsOffsetToFreeRecord[BFS_SECTORS];//Based on sector start +unsigned short glBfsDeletedBytes[BFS_SECTORS];//FileHeader + FileBody +unsigned char glBfsFillOrder[BFS_SECTORS];//[0]=Fullest + +//Public +unsigned char BFS_Mount();//Call this before calling other BFS functions +unsigned short BFS_LoadFile(unsigned long Id, unsigned short MaxLen, unsigned char *Buffer); +unsigned char BFS_CmpFile(unsigned long Id, unsigned short MaxLen, unsigned char *Buffer); +void* BFS_LoadFileAddr(unsigned long Id); +unsigned char BFS_SaveFile(unsigned long Id, unsigned short Len, unsigned char *Buffer); +unsigned char BFS_DeleteFile(unsigned long Id); +unsigned char BFS_DeleteAllFiles(); + +//Internal +unsigned char BFS_FlashToFlashCopy(unsigned long DstByteAddr, unsigned long SrcByteAddr, unsigned short ByteLen); +unsigned char BFS_MakeSpace(unsigned short RequiredFileBodySize); +void BFS_SortArray(); +unsigned long BFS_GetPhyByteAddrFromBfsSector(unsigned char BfsSector); +unsigned char BFS_IsSectorFormated(unsigned char BfsSector); +void BFS_GetFileHeaderInfo(unsigned long FileHeaderAddress, unsigned char *pRecordInfo, unsigned long *pId, unsigned short *pLen, unsigned long *pFileBodyAddress, unsigned char *pIsFree, unsigned char *pIsActive); +unsigned char BFS_GetFileHeaderAddress(unsigned long Id, unsigned long *pFileHeaderAddress); +unsigned char BFS_ByteAddressToBfsSector(unsigned long FileHeaderAddress); +unsigned char BFS_WriteAtAddress(unsigned long FileHeaderAddress, unsigned long Id, unsigned short Len, unsigned char *Buffer, unsigned char *pHeaderSize); + +unsigned char readByte(unsigned long ByteAddr); +unsigned short readWord(unsigned long WordAddr); + +int writeBuffer(unsigned long ByteAddr, unsigned char *buffer, unsigned short len); + +#endif diff --git a/boop/trunk/flash/flash.c b/boop/trunk/flash/flash.c new file mode 100644 index 0000000..4b31794 --- /dev/null +++ b/boop/trunk/flash/flash.c @@ -0,0 +1,195 @@ +/* + flash.c - writing/erasing flash + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "flash.h" +#include "serial.h" +#include "lcd.h" + +const unsigned long secaddr[19] = +{ 0x00000, + 0x02000, + 0x03000, + 0x04000, + 0x08000, + 0x10000, + 0x18000, + 0x20000, + 0x28000, + 0x30000, + 0x38000, + 0x40000, + 0x48000, + 0x50000, + 0x58000, + 0x60000, + 0x68000, + 0x70000, + 0x78000 }; + +unsigned long flash_base; + +int eraseSector(unsigned char chip, unsigned char secnum) +{ + + if(chip == 0) + flash_base = FLASH0_BASE; + else + flash_base = FLASH1_BASE; + + serial_puts("Erasing Sector: 0x"); + putHexW(flash_base + (secaddr[secnum]<<1)); + + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x80; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base + (secaddr[secnum]<<1))) = 0x30; + + if((*((volatile unsigned short *)(flash_base)) & 0x44) == (*((volatile unsigned short *)(flash_base)) & 0x44)) + { + serial_puts(" -- ERROR\n"); + *((volatile unsigned short *)(flash_base)) = 0xF0; + return -1; + } + + + while ((*((volatile unsigned short *)(flash_base)) & 0x44) != (*((volatile unsigned short *)(flash_base)) & 0x44)) + {} + serial_puts(" +> OK\n"); + return 0; +} + +int eraseFlash(unsigned char chip) +{ + if(chip == 0) + flash_base = FLASH0_BASE; + else + flash_base = FLASH1_BASE; + + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x80; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x10; + + if((*((volatile unsigned short *)(flash_base)) & 0x44) == (*((volatile unsigned short *)(flash_base)) & 0x44)) + { + *((volatile unsigned short *)(flash_base)) = 0xF0; + return -1; + } + + + while ((*((volatile unsigned short *)(flash_base)) & 0x44) != (*((volatile unsigned short *)(flash_base)) & 0x44)) + {} + return 0; +} + +int writeWord(unsigned long addr, unsigned short data) +{ + flash_base = addr & 0xFF000000; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xA0; + *((volatile unsigned short *)(addr)) = data; + + if(*((volatile unsigned short *)(addr)) == *((volatile unsigned short *)(addr))) + { + serial_puts("NACK"); + *((volatile unsigned short *)(flash_base)) = 0xF0; + return -1; + } + + while(*((volatile unsigned short *)(addr)) != *((volatile unsigned short *)(addr))) + {} + return 0; +} + +void prepareBulk(unsigned long dst) +{ + flash_base = dst & 0xFF000000; + + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x20; +} + +void endBulk(unsigned long dst) +{ + flash_base = dst & 0xFF000000; + + *((volatile unsigned short *)(flash_base)) = 0x90; + *((volatile unsigned short *)(flash_base)) = 0x00; +} + +int writeBulk(unsigned long src, unsigned long dst, unsigned long cnt) +{ + unsigned short check1, check2; + while(cnt--) + { + *((volatile unsigned short *)dst) = 0xA0; + *((volatile unsigned short *)dst) = *((volatile unsigned short *)src); + +retry: + check1 = *((volatile unsigned short *)dst); + check2 = *((volatile unsigned short *)dst); + if((check1 & 0x40) == (check2 & 0x40)) + goto done; + if(!(check2 & 0x20)) + goto retry; + check1 = *((volatile unsigned short *)dst); + check2 = *((volatile unsigned short *)dst); + if((check1 & 0x40) == (check2 & 0x40)) + goto done; + *((volatile unsigned short *)dst) = 0xF0; + return -1; + +done: + check1 = *((volatile unsigned short *)dst); + check2 = *((volatile unsigned short *)dst); + if(check1 != check2) + goto retry; + + src+=2; + dst+=2; + } + + return 0; +} + +unsigned short getFlashID(void) { + + unsigned short manufactor = 0; + unsigned short device = 0; + + *((volatile unsigned short *) FLASH1_BASE + 0x555) = 0xAA; + *((volatile unsigned short *) FLASH1_BASE + 0x2AA) = 0x55; + *((volatile unsigned short *) FLASH1_BASE + 0x555) = 0x90; + manufactor = *((volatile unsigned short *) FLASH1_BASE + 0x100); + (*((volatile unsigned short *) FLASH1_BASE)) = 0xF0; + + *((volatile unsigned short *) FLASH1_BASE + 0x555) = 0xAA; + *((volatile unsigned short *) FLASH1_BASE + 0x2AA) = 0x55; + *((volatile unsigned short *) FLASH1_BASE + 0x555) = 0x90; + device = *((volatile unsigned short *) FLASH1_BASE + 0x01); + (*((volatile unsigned short *) FLASH1_BASE)) = 0xF0; + + return(((manufactor << 8) & 0xFF00) | (device & 0x00FF)); + +} diff --git a/boop/trunk/flash/flash.h b/boop/trunk/flash/flash.h new file mode 100644 index 0000000..ffffc81 --- /dev/null +++ b/boop/trunk/flash/flash.h @@ -0,0 +1,36 @@ +/* + flash.h - writing/erasing flash + Copyright (C) 2007 Ch. Klippel + + 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 3 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 FLASH_H +#define FLASH_H + +#define FLASH0_BASE 0x80000000 +#define FLASH1_BASE 0x82000000 + +const unsigned long secaddr[19]; + +void prepareBulk(unsigned long dst); +void endBulk(unsigned long dst); +int eraseSector(unsigned char chip, unsigned char secnum); +int eraseFlash(unsigned char chip); +int writeWord(unsigned long addr, unsigned short data); +int writeBulk(unsigned long src, unsigned long dst, unsigned long cnt); +void lcd_set(unsigned char s); +unsigned short getFlashID(void); + +#endif diff --git a/boop/trunk/games/Make.conf b/boop/trunk/games/Make.conf new file mode 100644 index 0000000..5777587 --- /dev/null +++ b/boop/trunk/games/Make.conf @@ -0,0 +1 @@ +THUMBSRCS := gamesmenu.c tic_tac_toe.c sokoban.c connect4.c diff --git a/boop/trunk/games/c4_map.h b/boop/trunk/games/c4_map.h new file mode 100644 index 0000000..1996802 --- /dev/null +++ b/boop/trunk/games/c4_map.h @@ -0,0 +1,64 @@ +const signed char map[7][6][14] = +{ + { + { 0, 24, 45, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 24, 25, 49, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 8, 24, 25, 26, 53, -1, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 12, 24, 25, 26, 60, -1, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 16, 25, 26, 64, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 20, 26, 68, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0, 1, 27, 46, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 5, 27, 28, 45, 50, -1, 0, 0, 0, 0, 0, 0, 0 }, + { 8, 9, 27, 28, 29, 49, 54, 60, -1, 0, 0, 0, 0, 0 }, + { 12, 13, 27, 28, 29, 53, 59, 64, -1, 0, 0, 0, 0, 0 }, + { 16, 17, 28, 29, 63, 68, -1, 0, 0, 0, 0, 0, 0, 0 }, + { 20, 21, 29, 67, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0, 1, 2, 30, 47, -1, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 5, 6, 30, 31, 46, 51, 60, -1, 0, 0, 0, 0, 0 }, + { 8, 9, 10, 30, 31, 32, 45, 50, 55, 59, 64, -1, 0, 0 }, + { 12, 13, 14, 30, 31, 32, 49, 54, 58, 63, 68, -1, 0, 0 }, + { 16, 17, 18, 31, 32, 53, 62, 67, -1, 0, 0, 0, 0, 0 }, + { 20, 21, 22, 32, 66, -1, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 0, 1, 2, 3, 33, 48, 60, -1, 0, 0, 0, 0, 0, 0 }, + { 4, 5, 6, 7, 33, 34, 47, 52, 59, 64, -1, 0, 0, 0 }, + { 8, 9, 10, 11, 33, 34, 35, 46, 51, 56, 58, 63, 68, -1 }, + { 12, 13, 14, 15, 33, 34, 35, 45, 50, 55, 57, 62, 67, -1 }, + { 16, 17, 18, 19, 34, 35, 49, 54, 61, 66, -1, 0, 0, 0 }, + { 20, 21, 22, 23, 35, 53, 65, -1, 0, 0, 0, 0, 0, 0 }, + }, + { + { 1, 2, 3, 36, 59, -1, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 5, 6, 7, 36, 37, 48, 58, 63, -1, 0, 0, 0, 0, 0 }, + { 9, 10, 11, 36, 37, 38, 47, 52, 57, 62, 67, -1, 0, 0 }, + { 13, 14, 15, 36, 37, 38, 46, 51, 56, 61, 66, -1, 0, 0 }, + { 17, 18, 19, 37, 38, 50, 55, 65, -1, 0, 0, 0, 0, 0 }, + { 21, 22, 23, 38, 54, -1, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 2, 3, 39, 58, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 7, 39, 40, 57, 62, -1, 0, 0, 0, 0, 0, 0, 0 }, + { 10, 11, 39, 40, 41, 48, 61, 66, -1, 0, 0, 0, 0, 0 }, + { 14, 15, 39, 40, 41, 47, 52, 65, -1, 0, 0, 0, 0, 0 }, + { 18, 19, 40, 41, 51, 56, -1, 0, 0, 0, 0, 0, 0, 0 }, + { 22, 23, 41, 55, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + { + { 3, 42, 57, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 7, 42, 43, 61, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 11, 42, 43, 44, 65, -1, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 15, 42, 43, 44, 48, -1, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 19, 43, 44, 52, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 23, 44, 56, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + } +}; + +const signed char drop_order[7] = +{ + 3, 4, 2, 5, 1, 6, 0 +}; diff --git a/boop/trunk/games/connect4.c b/boop/trunk/games/connect4.c new file mode 100644 index 0000000..8f98a55 --- /dev/null +++ b/boop/trunk/games/connect4.c @@ -0,0 +1,965 @@ +/* + connect4.c - game + + the bulk of this file is code reused from: + * Connect-4 Algorithm + * Version 3.10 + * By Keith Pomakis + * (pomakis@pobox.com) + *April, 2005 + + modifications & adoption to boop: + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lcd.h" +#include "fonty.h" +#include "keyboard.h" +#include "timerfuncs.h" +#include "backlight.h" +#include "connect4.h" + +extern unsigned char autorepeat; + +unsigned int seed; + +unsigned char c4_abort; + +#define other(x) ((x) ^ 1) +#define real_player(x) ((x) & 1) + +#define pop_state() \ + (current_state = &state_stack[--depth]) + +/* The "goodness" of the current state with respect to a player is the */ +/* score of that player minus the score of the player's opponent. A */ +/* positive value will result if the specified player is in a better */ +/* situation than his/her opponent. */ + +#define goodness_of(player) \ + (current_state->score[player] - current_state->score[other(player)]) + +/* A local struct which defines the state of a game. */ + +#define C4_SIZEX 7 +#define C4_SIZEY 6 +#define C4_TOTALSIZE (C4_SIZEX*C4_SIZEY) + +#define C4_MAGICWIN (1 << 4) + +#define C4_WINPLACES 69 + +typedef int(*ev_fn)(int player, int level, int alpha, int beta); +typedef void(*ps_fn)(void); +typedef int(*dp_fn)(int player, int column); +typedef void(*mc_fn)(char *d, char *s, unsigned int cnt); + +static ev_fn evaluate; +static ps_fn push_state; +static dp_fn drop_piece; +static mc_fn mcpy; + +typedef struct { + + char board[C4_SIZEX][C4_SIZEY]; /* The board configuration of the game state. */ + /* board[x][y] specifies the position of the */ + /* xth column and the yth row of the board, */ + /* where column and row numbering starts at 0. */ + /* (The 0th row is the bottom row.) */ + /* A value of 0 specifies that the position is */ + /* occupied by a piece owned by player 0, a */ + /* value of 1 specifies that the position is */ + /* occupied by a piece owned by player 1, and */ + /* a value of C4_NONE specifies that the */ + /* position is unoccupied. */ + + int score_array[2][C4_WINPLACES]; /* An array specifying statistics on both */ + /* players. score_array[0] specifies the */ + /* statistics for player 0, while */ + /* score_array[1] specifies the statistics for */ + /* player 1. */ + + int score[2]; /* The actual scores of each player, deducible */ + /* from score_array, but kept separately for */ + /* efficiency. The score of player x is the */ + /* sum of score_array[x]. A score is */ + /* basically a function of how many winning */ + /* positions are still available to the */ + /* and how close he/she is to achieving each */ + /* of these positions. */ + + short int winner; /* The winner of the game - either 0, 1 or */ + /* C4_NONE. Deducible from score_array, but */ + /* kept separately for efficiency. */ + + int num_of_pieces; /* The number of pieces currently occupying */ + /* board spaces. Deducible from board, but */ + /* kept separately for efficiency. */ + +} Game_state; + +/* Static global variables. */ + +#include "c4_map.h" + +static Game_state *state_stack; //[C4_MAX_LEVEL+1]; +static Game_state *current_state; +static int depth; +static int states_allocated = 0; +//static int drop_order[7]; + + +unsigned long int rand31(void) +{ + unsigned long int hi, lo; + lo = 16807 * (seed & 0xFFFF); + hi = 16807 * (seed >> 16); + lo += (hi & 0x7FFF) << 16; + lo += hi >> 15; + if(lo > 0x7FFFFFFF) lo -= 0x7FFFFFFF; + return(seed = (long)lo); +} + +/****************************************************************************/ +/** **/ +/** This function sets up a new game. This must be called exactly once **/ +/** before each game is started. Before it can be called a second time, **/ +/** end_game() must be called to destroy the previous game. **/ +/** **/ +/** width and height are the desired dimensions of the game board, while **/ +/** num is the number of pieces required to connect in a row in order to **/ +/** win the game. **/ +/** **/ +/****************************************************************************/ + +void +c4_new_game(int width, int height, int num) +{ + register int i, j; + + depth = 0; + current_state = &state_stack[0]; + + for (i=0; iboard[i][j] = C4_NONE; + } + + for (i=0; iscore_array[0][i] = 1; + current_state->score_array[1][i] = 1; + } + + current_state->score[0] = current_state->score[1] = C4_WINPLACES; + current_state->winner = C4_NONE; + current_state->num_of_pieces = 0; + + states_allocated = 1; +} + +/****************************************************************************/ +/** **/ +/** This function updates the score of the specified player in the **/ +/** context of the current state, given that the player has just placed **/ +/** a game piece in column x, row y. **/ +/** **/ +/****************************************************************************/ + +static void +update_score(int player, int x, int y) +{ + register int i; + int win_index; + int this_difference = 0, other_difference = 0; + int other_player = other(player); + + for (i=0; map[x][y][i] != -1; i++) { + win_index = map[x][y][i]; + this_difference += current_state->score_array[player][win_index]; + other_difference += current_state->score_array[other_player][win_index]; + + current_state->score_array[player][win_index] <<= 1; + current_state->score_array[other_player][win_index] = 0; + + if (current_state->score_array[player][win_index] == C4_MAGICWIN) + if (current_state->winner == C4_NONE) + current_state->winner = player; + } + + current_state->score[player] += this_difference; + current_state->score[other_player] -= other_difference; +} + +/****************************************************************************/ +/** **/ +/** This function drops a piece of the specified player into the **/ +/** specified column. The row where the piece ended up is returned, or **/ +/** -1 if the drop was unsuccessful (i.e., the specified column is full). **/ +/** **/ +/****************************************************************************/ + +static int +_drop_piece(int player, int column) +{ + int y = 0; + + while (current_state->board[column][y] != C4_NONE && ++y < C4_SIZEY) + ; + + if (y == C4_SIZEY) + return -1; + + current_state->board[column][y] = player; + current_state->num_of_pieces++; + update_score(player, column, y); + + return y; +} + +/****************************************************************************/ +/** **/ +/** This function drops a piece of the specified player into the **/ +/** specified column. A value of TRUE is returned if the drop is **/ +/** successful, or FALSE otherwise. A drop is unsuccessful if the **/ +/** specified column number is invalid or full. If the drop is **/ +/** successful and row is a non-NULL pointer, the row where the piece **/ +/** ended up is returned through the row pointer. Note that column and **/ +/** row numbering start at 0. **/ +/** **/ +/****************************************************************************/ + +Boolean +c4_make_move(int player, int column, int *row) +{ + int result; + + if (column >= C4_SIZEX || column < 0) + return FALSE; + + result = drop_piece(real_player(player), column); + if (row && result >= 0) + *row = result; + return (result >= 0); +} + +void __attribute__ ((section(".text.fastcode"))) +_mcpy(char *d, char *s, unsigned int cnt) +{ + unsigned int c = cnt; + do + { + d[c] = s[c]; + } while(c--); +} + +/****************************************************************************/ +/** **/ +/** This function pushes the current state onto a stack. pop_state() **/ +/** is used to pop from this stack. **/ +/** **/ +/** Technically what it does, since the current state is considered to **/ +/** be the top of the stack, is push a copy of the current state onto **/ +/** the stack right above it. The stack pointer (depth) is then **/ +/** incremented so that the new copy is considered to be the current **/ +/** state. That way, all pop_state() has to do is decrement the stack **/ +/** pointer. **/ +/** **/ +/** For efficiency, memory for each stack state used is only allocated **/ +/** once per game, and reused for the remainder of the game. **/ +/** **/ +/****************************************************************************/ + +static void __attribute__ ((section(".text.fastcode"))) +_push_state(void) +{ + register int i; + Game_state *old_state, *new_state; + old_state = &state_stack[depth++]; + new_state = &state_stack[depth]; + + /* Copy the board */ + + for (i=0; iboard[i], (char*)old_state->board[i], C4_SIZEY); + + /* Copy the score array */ + + + mcpy((char*)new_state->score_array[0], (char*)old_state->score_array[0], + C4_WINPLACES*4); + mcpy((char*)new_state->score_array[1], (char*)old_state->score_array[1], + C4_WINPLACES*4); + + new_state->score[0] = old_state->score[0]; + new_state->score[1] = old_state->score[1]; + new_state->winner = old_state->winner; + new_state->num_of_pieces = old_state->num_of_pieces; + + current_state = new_state; +} + +/****************************************************************************/ +/** **/ +/** This recursive function determines how good the current state may **/ +/** turn out to be for the specified player. It does this by looking **/ +/** ahead level moves. It is assumed that both the specified player and **/ +/** the opponent may make the best move possible. alpha and beta are **/ +/** used for alpha-beta cutoff so that the game tree can be pruned to **/ +/** avoid searching unneccessary paths. **/ +/** **/ +/** The specified poll function (if any) is called at the appropriate **/ +/** intervals. **/ +/** **/ +/** The worst goodness that the current state can produce in the number **/ +/** of moves (levels) searched is returned. This is the best the **/ +/** specified player can hope to achieve with this state (since it is **/ +/** assumed that the opponent will make the best moves possible). **/ +/** **/ +/****************************************************************************/ + +static int __attribute__ ((section(".text.fastcode"))) +_evaluate(int player, int level, int alpha, int beta) +{ + int i, goodness, best, maxab; + + if (current_state->winner == player) + return 0x7FFFFFFF - depth; + else if (current_state->winner == other(player)) + return -(0x7FFFFFFF - depth); + else if (current_state->num_of_pieces == C4_TOTALSIZE) + return 0; /* a tie */ + else if (level == depth) + return goodness_of(player); + else { + /* Assume it is the other player's turn. */ + best = -(0x7FFFFFFF); + maxab = alpha; + for(i=0; iboard[drop_order[i]][C4_SIZEY-1] != C4_NONE) + continue; /* The column is full. */ + push_state(); + drop_piece(other(player), drop_order[i]); + goodness = evaluate(other(player), level, -beta, -maxab); + if (goodness > best) { + best = goodness; + if (best > maxab) + maxab = best; + } + pop_state(); + if (best > beta) + break; + } + + /* What's good for the other player is bad for this one. */ + return -best; + } +} + +/****************************************************************************/ +/** **/ +/** This function instructs the computer to make a move for the specified **/ +/** player. level specifies the number of levels deep the computer **/ +/** should search the game tree in order to make its decision. This **/ +/** corresponds to the number of "moves" in the game, where each player's **/ +/** turn is considered a move. A value of TRUE is returned if a move was **/ +/** made, or FALSE otherwise (i.e. if the board is full). If a move was **/ +/** made, the column and row where the piece ended up is returned through **/ +/** the column and row pointers (unless a pointer is NULL, in which case **/ +/** it won't be used to return any information). Note that column and **/ +/** row numbering start at 0. Also note that for a standard 7x6 game of **/ +/** Connect-4, the computer is brain-dead at levels of three or less, **/ +/** while at levels of four or more the computer provides a challenge. **/ +/** **/ +/****************************************************************************/ + +Boolean +c4_auto_move(int player, int level, int *column, int *row) +{ + int i, best_column = -1, goodness = 0, best_worst = -(0x7FFFFFFF); + int num_of_equal = 0, real_player, current_column, result; + + real_player = real_player(player); + + /* It has been proven that the best first move for a standard 7x6 game */ + /* of connect-4 is the center column. See Victor Allis' masters thesis */ + /* ("ftp://ftp.cs.vu.nl/pub/victor/connect4.ps") for this proof. */ + + if (current_state->num_of_pieces < 2 && (current_state->num_of_pieces == 0 || + current_state->board[3][0] != C4_NONE)) { + if (column) + *column = 3; + if (row) + *row = current_state->num_of_pieces; + drop_piece(real_player, 3); + return TRUE; + } + + /* Simulate a drop in each of the columns and see what the results are. */ + + for (i=0; iwinner == real_player) { + best_column = current_column; + pop_state(); + break; + } + + /* Otherwise, look ahead to see how good this move may turn out */ + /* to be (assuming the opponent makes the best moves possible). */ + else { +// next_poll = clock() + poll_interval; + goodness = evaluate(real_player, level, -(0x7FFFFFFF), -best_worst); + } + + /* If this move looks better than the ones previously considered, */ + /* remember it. */ + if (goodness > best_worst) { + best_worst = goodness; + best_column = current_column; + num_of_equal = 1; + } + + /* If two moves are equally as good, make a random decision. */ + else if (goodness == best_worst) { + num_of_equal++; + if ((rand31()>>4) % num_of_equal == 0) + best_column = current_column; + } + + pop_state(); + if(c4_abort) + return 0; + } + + /* Drop the piece in the column decided upon. */ + + if (best_column >= 0) { + result = drop_piece(real_player, best_column); + if (column) + *column = best_column; + if (row) + *row = result; + return TRUE; + } + else + return FALSE; +} + +/****************************************************************************/ +/** **/ +/** This function returns the "score" of the specified player. This **/ +/** score is a function of how many winning positions are still available **/ +/** to the player and how close he/she is to achieving each of these **/ +/** positions. The scores of both players can be compared to observe how **/ +/** well they are doing relative to each other. **/ +/** **/ +/****************************************************************************/ + +int +c4_score_of_player(int player) +{ + return current_state->score[real_player(player)]; +} + + +/****************************************************************************/ +/** **/ +/** This function returns TRUE if the specified player has won the game, **/ +/** and FALSE otherwise. **/ +/** **/ +/****************************************************************************/ + +Boolean +c4_is_winner(int player) +{ + return (current_state->winner == real_player(player)); +} + + +/****************************************************************************/ +/** **/ +/** This function returns TRUE if the board is completely full without a **/ +/** winner, and FALSE otherwise. **/ +/** **/ +/****************************************************************************/ + +Boolean +c4_is_tie(void) +{ + return (current_state->num_of_pieces == C4_TOTALSIZE && + current_state->winner == C4_NONE); +} + + +/****************************************************************************/ +/** **/ +/** This function returns the coordinates of the winning connections of **/ +/** the winning player. It is assumed that a player has indeed won the **/ +/** game. The coordinates are returned in x1, y1, x2, y2, where (x1, y1) **/ +/** specifies the lower-left piece of the winning connection, and **/ +/** (x2, y2) specifies the upper-right piece of the winning connection. **/ +/** If more than one winning connection exists, only one will be **/ +/** returned. **/ +/** **/ +/****************************************************************************/ + + +void +c4_win_coords(int *x1, int *y1, int *x2, int *y2) +{ + register int i, j, k; + int winner, win_pos = 0; + Boolean found; + + winner = current_state->winner; + + while (current_state->score_array[winner][win_pos] != C4_MAGICWIN) + win_pos++; + + found = FALSE; + for (j=0; j=0 && !found; j--) + for (i=C4_SIZEX-1; i>=0 && !found; i--) + for (k=0; map[i][j][k] != -1; k++) + if (map[i][j][k] == win_pos) { + *x2 = i; + *y2 = j; + found = TRUE; + break; + } +} + + +/****************************************************************************/ +/** **/ +/** This function ends the current game. It is assumed that a game is **/ +/** in progress. It is illegal to call any other game function **/ +/** immediately after this one except for c4_new_game(), c4_poll() and **/ +/** c4_reset(). **/ +/** **/ +/****************************************************************************/ + +void +c4_end_game(void) +{ + states_allocated = 0; +} + + +/****************************************************************************/ +/** **/ +/** This function resets the state of the algorithm to the starting state **/ +/** (i.e., no game in progress and a NULL poll function). There should **/ +/** no reason to call this function unless for some reason the calling **/ +/** algorithm loses track of the game state. It is illegal to call any **/ +/** other game function immediately after this one except for **/ +/** c4_new_game(), c4_poll() and c4_reset(). **/ +/** **/ +/****************************************************************************/ + +void +c4_reset(void) +{ + c4_end_game(); +} + +int row, col, ccol; +unsigned int c4_cb, c4_wcb; +unsigned char c4_player, c4_moves, c4_level; + +void draw_stone(unsigned char x, unsigned char y, unsigned char p) +{ + + unsigned char xx, yy; + xx = 10+(x*18); + yy = 46+(y*18); + + switch(p) + { + case 0: + draw_disc(xx, yy, 7, 2, DRAW_PUT); + draw_disc(xx, yy, 5, 3, DRAW_XOR); + draw_disc(xx, yy, 2, 3, DRAW_XOR); + break; + + case 1: + draw_disc(xx, yy, 7, 3, DRAW_PUT); + draw_disc(xx, yy, 5, 1, DRAW_ERASE); + draw_disc(xx, yy, 2, 1, DRAW_PUT); + break; + + case 2: + draw_disc(xx, yy, 8, 3, DRAW_ERASE); + break; + + case 3: + draw_disc(x, y, 7, 2, DRAW_PUT); + draw_disc(x, y, 5, 3, DRAW_XOR); + draw_disc(x, y, 2, 3, DRAW_XOR); + break; + + case 4: + draw_disc(x, y, 7, 3, DRAW_PUT); + draw_disc(x, y, 5, 1, DRAW_ERASE); + draw_disc(x, y, 2, 1, DRAW_PUT); + break; + + case 5: + draw_disc(xx, yy, 7, 3, DRAW_XOR); + break; + } +} + +void progress_callback(unsigned int cb) +{ + static unsigned char step = 0; + unsigned char x; + if(keys[0] || keys[1]) + { + setBacklight(BL_AUTO); + if(KEY_Exit) + c4_abort = 1; + } + + for(x=0;x<6;x++) + { + draw_char(40+(x<<3),24,224+step,3,DRAW_NORCU); + } + draw_hline(40,24,48,3,DRAW_PUT); + step--; + step &= 0x07; +} + +void win_callback(unsigned int cb) +{ + int x1, y1, x2, y2; + + c4_win_coords(&x1, &y1, &x2, &y2); + + if(x1 > x2) + x1 = 1; + else if(x1 < x2) + x1 = -1; + else + x1 = 0; + + if(y1 > y2) + y1 = 1; + else if(y1 < y2) + y1 = -1; + else + y1 = 0; + + draw_stone(x2,5-y2,5); + x2+=x1; + y2+=y1; + draw_stone(x2,5-y2,5); + x2+=x1; + y2+=y1; + draw_stone(x2,5-y2,5); + x2+=x1; + y2+=y1; + draw_stone(x2,5-y2,5); + x2+=x1; + y2+=y1; +} + +void draw_marker(void) +{ + draw_stone(10+(col*18), 22,c4_player+3); + draw_arrow(7+(col*18), 31, ARROW_DOWN, ARROW_LEN, 3, DRAW_PUT); + draw_arrow( 0, 152, ARROW_LEFT, ARROW_LEN, 3, DRAW_PUT); + draw_arrow( 6, 152, ARROW_RIGHT, ARROW_LEN, 3, DRAW_PUT); + draw_string(12,152,"Select",3,DRAW_PUT); + draw_arrow( 75, 153, ARROW_DOWN, ARROW_LEN, 3, DRAW_PUT); + draw_string(84,152,"Play move",3,DRAW_PUT); +} + +void delete_marker(void) +{ + draw_disc(10+(col*18), 22, 7, 3, DRAW_ERASE); + draw_arrow(7+(col*18), 31, ARROW_DOWN, ARROW_LEN, 3, DRAW_ERASE); + draw_block(0, 152, 128, 8, 3, DRAW_ERASE); +} + +int checkwin(void) +{ + if(c4_is_winner(0) || c4_is_winner(1) || c4_is_tie()) + { + if(!c4_is_tie()) + { + startCB(c4_wcb); + } + draw_block(0, 152, 128, 8, 3, DRAW_ERASE); + delete_marker(); + set_font(BOLDFONT); + if(c4_is_winner(c4_player)) + draw_string(19,14,"Spieler gewinnt!",3,DRAW_PUT); + else if(c4_is_tie()) + draw_string(24,14,"Unentschieden!",3,DRAW_PUT); + else + draw_string(13,14,"Computer gewinnt!",3,DRAW_PUT); + + draw_string(2,25,"OK: Nochmal Exit: Ende",3,DRAW_PUT); + return 1; + } + return 0; +} + +void move(unsigned char p) +{ + unsigned char pp; + if(p) + { + p = 1; + pp = 0; + } + else + pp = 1; + + if(c4_make_move(p, col, &row)) + { + draw_stone(col, 5-row, p); + draw_disc(10+(col*18), 23, 7, 3, DRAW_ERASE); + delete_marker(); + if(!checkwin()) + { + set_font(BOLDFONT); + draw_frame(35,13,57,22,5,5,3,DRAW_PUT); + draw_block(40,18,47,12,3,DRAW_PUT); + draw_string(40, 15, "Berechne", 3, DRAW_ERASE); + draw_string(0, 152, "Exit: Spiel abbrechen", 3, DRAW_PUT); + set_font(SMALLFONT); + progress_callback(0xff); + startCB(c4_cb); + c4_abort = 0; + c4_auto_move(~p, c4_level, &ccol, &row); + setBacklight(BL_AUTO); + stopCB(c4_cb); + draw_block(0,13,128,22,3,DRAW_ERASE); + draw_block(0, 152, 128, 8, 3, DRAW_ERASE); + draw_stone(ccol, 5-row, pp); + } + draw_marker(); + c4_moves++; + checkwin(); + } +} + +void c4_selplayer(unsigned char p) +{ + draw_string(30, 15, "Chooose Your", 3, DRAW_PUT); + draw_string(25, 26, "Colour & Level", 3, DRAW_PUT); + draw_arrow( 0, 154, ARROW_UP, ARROW_LEN, 3, DRAW_PUT); + draw_arrow(1 * 6, 154, ARROW_DOWN, ARROW_LEN, 3, DRAW_PUT); + draw_string(15,152,"Level",3,DRAW_PUT); + + draw_arrow( 82, 153, ARROW_LEFT, ARROW_LEN, 3, DRAW_PUT); + draw_arrow( 88, 153, ARROW_RIGHT, ARROW_LEN, 3, DRAW_PUT); + draw_string(94,152,"Colour",3,DRAW_PUT); + + draw_frame(1, 15, 19, 19, 1, 3, 3, DRAW_PUT); + draw_frame(108,15, 19, 19, 1, 3, 3, DRAW_PUT); + + draw_disc(10, 24, 7, 3, DRAW_ERASE); + draw_stone(10, 24, p+3); + draw_disc(117, 24, 7, 3, DRAW_ERASE); + draw_stone(117,24, p+3); +} + +void start_connect4(void) +{ + unsigned char x,y; + + Game_state s_stk[C4_MAX_LEVEL+1]; + state_stack = s_stk; + + evaluate = _evaluate; + push_state = _push_state; + drop_piece = _drop_piece; + mcpy = _mcpy; + + seed = 0x86f2a981; + + c4_cb = addTimerCB(progress_callback, 35); + c4_wcb = addTimerCB(win_callback, 100); + + row = 0; ccol = 0; + c4_player = 0; + c4_level = 3; + lcd_fill(0);//Clr screen + + set_font(BOLDFONT); + draw_string(0, 0, "Connect4", 3, DRAW_PUT); + + draw_block(0,10,128,2,3,DRAW_PUT); + draw_block(0,149,128,2,3,DRAW_PUT); + + draw_frame(1,37,127,109,9,9,3,DRAW_PUT); + draw_block(10,46,109,91,3,DRAW_PUT); + +restart: + stopCB(c4_wcb); + col = 3; + draw_block(0,14,128,20,3,DRAW_ERASE); + draw_block(0, 152, 128, 8, 3, DRAW_ERASE); + c4_selplayer(c4_player); + draw_numU(48,152,c4_level,0,3,DRAW_PUT); + + c4_moves = 0; + + for(x=0;x<7;x++) + { + for(y=0;y<6;y++) + { + draw_disc(10+(x*18), 46+(y*18),8,3,DRAW_ERASE); + } + } + + c4_reset(); + c4_new_game(C4_SIZEX, C4_SIZEY, 4); + + while(1) + { +wait4c: + waitKeyUpDown(); + + if((KEY_OK || KEY_0) && (c4_is_winner(0) || c4_is_winner(1) || c4_is_tie()) && (c4_moves != 0)) goto restart; + else if(KEY_0) + goto restart; + if(KEY_Exit) + { + stopCB(c4_cb); + stopCB(c4_wcb); + removeTimerCB(c4_cb); + removeTimerCB(c4_wcb); + return; + } + else if(c4_moves == 0) + { + if(KEY_Left || KEY_Right) + { + if(c4_player) c4_player=0; else c4_player = 1; + c4_selplayer(c4_player); + } + else if(KEY_OK && c4_player == 1) + { + delete_marker(); + c4_auto_move(0, c4_level, &ccol, &row); + draw_stone(ccol, 5-row, 0); + draw_marker(); + } + else if(KEY_Up) + { + draw_numU(48,152,c4_level,0,3,DRAW_ERASE); + c4_level++; + if(c4_level > C4_MAX_LEVEL) + c4_level = 1; + draw_numU(48,152,c4_level,0,3,DRAW_PUT); + } + else if(KEY_Down) + { + draw_numU(48,152,c4_level,0,3,DRAW_ERASE); + c4_level--; + if(c4_level < 1) + c4_level = C4_MAX_LEVEL; + draw_numU(48,152,c4_level,0,3,DRAW_PUT); + } + if(KEY_OK) + { + c4_moves++; + draw_block(0, 152, 128, 8, 3, DRAW_ERASE); + delete_marker(); + draw_block(0,13,128,22,3,DRAW_ERASE); + set_font(SMALLFONT); + draw_marker(); + } + goto wait4c; + } + else if(!c4_is_winner(0) && !c4_is_winner(1) && !c4_is_tie()) + { + if(KEY_1 || KEY_2 || KEY_3 || KEY_4 || KEY_5 || KEY_6 || KEY_7) + { + delete_marker(); + if(KEY_1) + col = 0; + else if(KEY_2) + col = 1; + else if(KEY_3) + col = 2; + else if(KEY_4) + col = 3; + else if(KEY_5) + col = 4; + else if(KEY_6) + col = 5; + else if(KEY_7) + col = 6; + draw_marker(); + + move(c4_player); + } + else if(KEY_Left || KEY_Right) + { + delete_marker(); + if(KEY_Left) + col--; + else if(KEY_Right) + col++; + + if(col > 6) + col = 0; + else if(col < 0) + col = 6; + draw_marker(); + } + else if(KEY_Down || KEY_OK) + { + move(c4_player); + if(c4_abort) + { + c4_abort = 0; + goto restart; + } + } + } + } +} + diff --git a/boop/trunk/games/connect4.h b/boop/trunk/games/connect4.h new file mode 100644 index 0000000..5962d9d --- /dev/null +++ b/boop/trunk/games/connect4.h @@ -0,0 +1,39 @@ +/* + connect4.c - game + Copyright (C) 2007 Ch. Klippel + + 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 3 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 CONNECT4_H +#define CONNECT4_H + +#ifndef Boolean +#define Boolean char +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#define C4_NONE 2 +#define C4_MAX_LEVEL 20 + +void start_connect4(void); + +#endif diff --git a/boop/trunk/games/gamesmenu.c b/boop/trunk/games/gamesmenu.c new file mode 100644 index 0000000..230db87 --- /dev/null +++ b/boop/trunk/games/gamesmenu.c @@ -0,0 +1,35 @@ +/* + testmenu.c - testmenu for menuing system + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "menu.h" +#include "tic_tac_toe.h" +#include "sokoban.h" +#include "connect4.h" + +const struct MENU_ENTRY gamesMenuEntries[] = +{ + { &GameTicTacToe, 0, FUNCENTRY, "TicTacToe", "Play TicTacToe" }, + { &GameSokoban, 0, FUNCENTRY, "Sokoban", "Play Sokoban" }, + { &start_connect4, 0, FUNCENTRY, "Connect4", "Play Connect4" } +}; + + +const struct MENU gamesMenu = +{ + 3, (MENU_ENTRY*)&gamesMenuEntries, "Games" +}; diff --git a/boop/trunk/games/gamesmenu.h b/boop/trunk/games/gamesmenu.h new file mode 100644 index 0000000..d84df17 --- /dev/null +++ b/boop/trunk/games/gamesmenu.h @@ -0,0 +1,24 @@ +/* + mainmenu.h - the main menu for boop + Copyright (C) 2007 Ch. Klippel + + 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 3 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 MAINMENU_H +#define MAINMENU_H + +extern const struct MENU gamesMenu; + +#endif diff --git a/boop/trunk/games/sokoban.c b/boop/trunk/games/sokoban.c new file mode 100644 index 0000000..db0305b --- /dev/null +++ b/boop/trunk/games/sokoban.c @@ -0,0 +1,614 @@ +/* + sokoban.c - game + Copyright (C) 2007 Colibri + + 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 3 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 "lcd.h" +#include "fonty.h" +#include "keyboard.h" + +#include "sokoban.h" +#include "sokoban_levels.h" + +//#include "stdio.h" + +void GameSokoban_InitGameField(struct _SokobanGameInfo *pGI) +{ + int SizeX; + int SizeY; + int x; + int y; + int Pos; + int i; + + if((pGI->Level < 1) || (pGI->Level > SOKOBAN_LEVELS)) + { + //Invalid level + pGI->Level = 1; + } + + //Empty the game field + for(x=0; xG[x][y] = SPACE; + } + } + + //Find the position to searched level + Pos = 0; + i = 1; + while(iLevel) + { + SizeX = Sokoban_Levels[Pos++]; + SizeY = Sokoban_Levels[Pos++]; + Pos += SizeY * ((SizeX+1)/2); + i++; + } + + //Copy the (may be smaller) level to the center of the game field + SizeX = Sokoban_Levels[Pos++]; + SizeY = Sokoban_Levels[Pos++]; + for(y=0; y lo nibble + pGI->G[x+((SOKOBAN_CELLS_X-SizeX)/2)][y+((SOKOBAN_CELLS_Y-SizeY)/2)] = Sokoban_Levels[Pos + (y * ((SizeX+1)/2)) + (x/2)] & 0x0F; + } + else + { + //Even x -> hi nibble + pGI->G[x+((SOKOBAN_CELLS_X-SizeX)/2)][y+((SOKOBAN_CELLS_Y-SizeY)/2)] = (Sokoban_Levels[Pos + (y * ((SizeX+1)/2)) + (x/2)] >> 4) & 0x0F; + } + } + } +} + + +BOOL GameSokoban_IsSolved(BYTE G[SOKOBAN_CELLS_X][SOKOBAN_CELLS_Y]) +{ + //Return true=Solved + int x; + int y; + + for(x=0; xMoves = 0; + pGI->UndoCount = 0; + + GameSokoban_InitGameField(pGI); + + //Game field to display + for(x=0; xG[x][y]); + if(pGI->G[x][y] & PUSHER) + { + pGI->PusherX = x; + pGI->PusherY = y; + } + } + } +} + +void GameSokoban_Move(struct _SokobanGameInfo *pGI) +{ + if(KEY_Up) + { + if(!(pGI->G[pGI->PusherX][pGI->PusherY - 1] & WALL)) + { + //No wall + if(!(pGI->G[pGI->PusherX][pGI->PusherY - 1] & PACKET)) + { + //No wall and no packet + GameSokoban_SaveUndo(pGI, 2, SOKOBAN_UNDO_DIR_UP); + + //Move pusher + pGI->G[pGI->PusherX][pGI->PusherY] ^= PUSHER; + pGI->G[pGI->PusherX][pGI->PusherY-1] ^= PUSHER; + + //Draw changed cells + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY, pGI->G[pGI->PusherX][pGI->PusherY]); + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY-1, pGI->G[pGI->PusherX][pGI->PusherY-1]); + + pGI->PusherY--; + pGI->Moves++; + } + else + { + //Packet -> check if it is space behind the packet + if(!(pGI->G[pGI->PusherX][pGI->PusherY - 2] & (PACKET | WALL))) + { + //No packet or wall behind the packet + GameSokoban_SaveUndo(pGI, 3, SOKOBAN_UNDO_DIR_UP); + //Move pusher + pGI->G[pGI->PusherX][pGI->PusherY] ^= PUSHER; + pGI->G[pGI->PusherX][pGI->PusherY - 1] ^= PUSHER; + + //Move packet + pGI->G[pGI->PusherX][pGI->PusherY-1] ^= PACKET; + pGI->G[pGI->PusherX][pGI->PusherY-2] ^= PACKET; + + //Draw changed cells + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY, pGI->G[pGI->PusherX][pGI->PusherY]); + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY-1, pGI->G[pGI->PusherX][pGI->PusherY-1]); + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY-2, pGI->G[pGI->PusherX][pGI->PusherY-2]); + + pGI->PusherY--; + pGI->Moves++; + } + } + } + } + if(KEY_Down) + { + if(!(pGI->G[pGI->PusherX][pGI->PusherY + 1] & WALL)) + { + //No wall + if(!(pGI->G[pGI->PusherX][pGI->PusherY + 1] & PACKET)) + { + //No wall and no packet + GameSokoban_SaveUndo(pGI, 2, SOKOBAN_UNDO_DIR_DOWN); + //Move pusher + pGI->G[pGI->PusherX][pGI->PusherY] ^= PUSHER; + pGI->G[pGI->PusherX][pGI->PusherY+1] ^= PUSHER; + + //Draw changed cells + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY, pGI->G[pGI->PusherX][pGI->PusherY]); + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY+1, pGI->G[pGI->PusherX][pGI->PusherY+1]); + + pGI->PusherY++; + pGI->Moves++; + } + else + { + //Packet -> check if it is space behind the packet + if(!(pGI->G[pGI->PusherX][pGI->PusherY + 2] & (PACKET | WALL))) + { + //No packet or wall behind the packet + GameSokoban_SaveUndo(pGI, 3, SOKOBAN_UNDO_DIR_DOWN); + //Move pusher + pGI->G[pGI->PusherX][pGI->PusherY] ^= PUSHER; + pGI->G[pGI->PusherX][pGI->PusherY + 1] ^= PUSHER; + + //Move packet + pGI->G[pGI->PusherX][pGI->PusherY+1] ^= PACKET; + pGI->G[pGI->PusherX][pGI->PusherY+2] ^= PACKET; + + //Draw changed cells + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY, pGI->G[pGI->PusherX][pGI->PusherY]); + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY+1, pGI->G[pGI->PusherX][pGI->PusherY+1]); + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY+2, pGI->G[pGI->PusherX][pGI->PusherY+2]); + + pGI->PusherY++; + pGI->Moves++; + } + } + } + } + if(KEY_Left) + { + if(!(pGI->G[pGI->PusherX - 1][pGI->PusherY] & WALL)) + { + //No wall + if(!(pGI->G[pGI->PusherX - 1][pGI->PusherY] & PACKET)) + { + //No wall and no packet + GameSokoban_SaveUndo(pGI, 2, SOKOBAN_UNDO_DIR_LEFT); + //Move pusher + pGI->G[pGI->PusherX][pGI->PusherY] ^= PUSHER; + pGI->G[pGI->PusherX - 1][pGI->PusherY] ^= PUSHER; + + //Draw changed cells + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY, pGI->G[pGI->PusherX][pGI->PusherY]); + GameSokoban_DrawCell(pGI->PusherX - 1, pGI->PusherY, pGI->G[pGI->PusherX - 1][pGI->PusherY]); + + pGI->PusherX--; + pGI->Moves++; + } + else + { + //Packet -> check if it is space behind the packet + if(!(pGI->G[pGI->PusherX - 2][pGI->PusherY] & (PACKET | WALL))) + { + //No packet or wall behind the packet + GameSokoban_SaveUndo(pGI, 3, SOKOBAN_UNDO_DIR_LEFT); + //Move pusher + pGI->G[pGI->PusherX][pGI->PusherY] ^= PUSHER; + pGI->G[pGI->PusherX - 1][pGI->PusherY] ^= PUSHER; + + //Move packet + pGI->G[pGI->PusherX - 1][pGI->PusherY] ^= PACKET; + pGI->G[pGI->PusherX - 2][pGI->PusherY] ^= PACKET; + + //Draw changed cells + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY, pGI->G[pGI->PusherX][pGI->PusherY]); + GameSokoban_DrawCell(pGI->PusherX - 1, pGI->PusherY, pGI->G[pGI->PusherX - 1][pGI->PusherY]); + GameSokoban_DrawCell(pGI->PusherX - 2, pGI->PusherY, pGI->G[pGI->PusherX - 2][pGI->PusherY]); + + pGI->PusherX--; + pGI->Moves++; + } + } + } + } + if(KEY_Right) + { + if(!(pGI->G[pGI->PusherX + 1][pGI->PusherY] & WALL)) + { + //No wall + if(!(pGI->G[pGI->PusherX + 1][pGI->PusherY] & PACKET)) + { + //No wall and no packet + GameSokoban_SaveUndo(pGI, 2, SOKOBAN_UNDO_DIR_RIGHT); + //Move pusher + pGI->G[pGI->PusherX][pGI->PusherY] ^= PUSHER; + pGI->G[pGI->PusherX + 1][pGI->PusherY] ^= PUSHER; + + //Draw changed cells + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY, pGI->G[pGI->PusherX][pGI->PusherY]); + GameSokoban_DrawCell(pGI->PusherX + 1, pGI->PusherY, pGI->G[pGI->PusherX + 1][pGI->PusherY]); + + pGI->PusherX++; + pGI->Moves++; + } + else + { + //Packet -> check if it is space behind the packet + if(!(pGI->G[pGI->PusherX + 2][pGI->PusherY] & (PACKET | WALL))) + { + //No packet or wall behind the packet + GameSokoban_SaveUndo(pGI, 3, SOKOBAN_UNDO_DIR_RIGHT); + //Move pusher + pGI->G[pGI->PusherX][pGI->PusherY] ^= PUSHER; + pGI->G[pGI->PusherX + 1][pGI->PusherY] ^= PUSHER; + + //Move packet + pGI->G[pGI->PusherX + 1][pGI->PusherY] ^= PACKET; + pGI->G[pGI->PusherX + 2][pGI->PusherY] ^= PACKET; + + //Draw changed cells + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY, pGI->G[pGI->PusherX][pGI->PusherY]); + GameSokoban_DrawCell(pGI->PusherX + 1, pGI->PusherY, pGI->G[pGI->PusherX + 1][pGI->PusherY]); + GameSokoban_DrawCell(pGI->PusherX + 2, pGI->PusherY, pGI->G[pGI->PusherX + 2][pGI->PusherY]); + + pGI->PusherX++; + pGI->Moves++; + } + } + } + } + +} + +void GameSokoban_UndoAMove(struct _SokobanGameInfo *pGI) +{ + //3 Byte UndoBuffer: + //[ 0 ][ 1 ][ 2 ] + //765432107654321076543210 + //\-x-/\-y-/\/\o0/\o1/\o2/ + + BYTE Object[3]; + BYTE Dir; + int i; + int Count; + + if(pGI->UndoCount <= 0) + { + return;//No more undos available + } + + pGI->UndoCount--; + + pGI->PusherX = (pGI->UndoBuffer[pGI->UndoCount][0] >> 3) & 0x1F; + pGI->PusherY = (pGI->UndoBuffer[pGI->UndoCount][0] << 2) & 0x1F; + pGI->PusherY |= (pGI->UndoBuffer[pGI->UndoCount][1] >> 6) & 0x03; + Dir = (pGI->UndoBuffer[pGI->UndoCount][1] >> 4) & 0x03; + Object[0] = pGI->UndoBuffer[pGI->UndoCount][1] & 0x0F; + Object[1] = (pGI->UndoBuffer[pGI->UndoCount][2] >> 4) & 0x0F; + Object[2] = pGI->UndoBuffer[pGI->UndoCount][2] & 0x0F; + + Count = (Object[2] == 0x0F) ? 2 : 3; + + for(i=0; iG[pGI->PusherX - i][pGI->PusherY] = Object[i]; + GameSokoban_DrawCell(pGI->PusherX - i, pGI->PusherY, pGI->G[pGI->PusherX - i][pGI->PusherY]); + break; + case SOKOBAN_UNDO_DIR_RIGHT: + pGI->G[pGI->PusherX + i][pGI->PusherY] = Object[i]; + GameSokoban_DrawCell(pGI->PusherX + i, pGI->PusherY, pGI->G[pGI->PusherX + i][pGI->PusherY]); + break; + case SOKOBAN_UNDO_DIR_UP: + pGI->G[pGI->PusherX][pGI->PusherY - i] = Object[i]; + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY - i, pGI->G[pGI->PusherX][pGI->PusherY - i]); + break; + case SOKOBAN_UNDO_DIR_DOWN: + pGI->G[pGI->PusherX][pGI->PusherY + i] = Object[i]; + GameSokoban_DrawCell(pGI->PusherX, pGI->PusherY + i, pGI->G[pGI->PusherX][pGI->PusherY + i]); + break; + } + } + + pGI->Moves--; +} + +void GameSokoban_SaveUndo(struct _SokobanGameInfo *pGI, BYTE Count, BYTE Dir) +{ + //3 Byte UndoBuffer: + //[ 0 ][ 1 ][ 2 ] + //765432107654321076543210 + //\-x-/\-y-/\/\o0/\o1/\o2/ + + BYTE Object[3]; + int i; + +// ASSERT((Count == 2) || (Count == 3)); + + Object[2] = 0x0F;//Default value for not used + + for(i=0; iG[pGI->PusherX - i][pGI->PusherY]; + break; + case SOKOBAN_UNDO_DIR_RIGHT: + Object[i] = pGI->G[pGI->PusherX + i][pGI->PusherY]; + break; + case SOKOBAN_UNDO_DIR_UP: + Object[i] = pGI->G[pGI->PusherX][pGI->PusherY - i]; + break; + case SOKOBAN_UNDO_DIR_DOWN: + Object[i] = pGI->G[pGI->PusherX][pGI->PusherY + i]; + break; + } + } + + if(pGI->UndoCount >= SOKOBAN_MAX_UNDOS) + { + //Undo buffer is full -> free oldest + for(i=0; i<(SOKOBAN_MAX_UNDOS-1); i++) + { + pGI->UndoBuffer[i][0] = pGI->UndoBuffer[i+1][0]; + pGI->UndoBuffer[i][1] = pGI->UndoBuffer[i+1][1]; + pGI->UndoBuffer[i][2] = pGI->UndoBuffer[i+1][2]; + } + pGI->UndoCount--; + } + + pGI->UndoBuffer[pGI->UndoCount][0] = (pGI->PusherX & 0x1F) << 3; + pGI->UndoBuffer[pGI->UndoCount][0] |= ((pGI->PusherY & 0x1F) >> 2) & 0x07; + + pGI->UndoBuffer[pGI->UndoCount][1] = (pGI->PusherY & 0x1F) << 6; + pGI->UndoBuffer[pGI->UndoCount][1] |= (Dir & 3) << 4; + pGI->UndoBuffer[pGI->UndoCount][1] |= Object[0] & 0x0F; + + pGI->UndoBuffer[pGI->UndoCount][2] = (Object[1] & 0x0F) << 4; + pGI->UndoBuffer[pGI->UndoCount][2] |= Object[2] & 0x0F; + + pGI->UndoCount++; +} + +void GameSokoban() +{ + struct _SokobanGameInfo GI; + int i; + + GI.Level = 1; +restart: + //Init the display + lcd_fill(0);//Clr screen + + //Title + draw_string(0, 0, "Sokoban", LCD_COLOR_B, DRAW_PUT); + + //Grid + for(i=0; i<=SOKOBAN_CELLS_X; i++) + { + draw_vline(i*(SOKOBAN_CELL_SIZE+1),16,SOKOBAN_CELLS_Y*(SOKOBAN_CELL_SIZE+1)+1, LCD_COLOR_LG, DRAW_PUT); + } + for(i=0; i<=SOKOBAN_CELLS_Y; i++) + { + draw_hline(0, 16 + i*(SOKOBAN_CELL_SIZE+1),SOKOBAN_CELLS_X*(SOKOBAN_CELL_SIZE+1)+1, LCD_COLOR_LG, DRAW_PUT); + } + + draw_string(0, 8, "Level: Moves:", LCD_COLOR_B, DRAW_PUT); + draw_char(98,8,'0',LCD_COLOR_B,DRAW_PUT); + draw_string(0, LCD_SIZE_Y - (8*3), "Program +/-:", LCD_COLOR_B, DRAW_PUT); + draw_string(65, LCD_SIZE_Y - (8*3), "Level +/- 1", LCD_COLOR_B, DRAW_PUT); + draw_string(0, LCD_SIZE_Y - (8*2), "Volume +/-:", LCD_COLOR_B, DRAW_PUT); + draw_string(65, LCD_SIZE_Y - (8*2), "Level +/- 20", LCD_COLOR_B, DRAW_PUT); + draw_arrow( 0, LCD_SIZE_Y - 8, ARROW_UP, ARROW_LEN, LCD_COLOR_B, DRAW_PUT); + draw_arrow(1 * 6, LCD_SIZE_Y - 8, ARROW_DOWN, ARROW_LEN, LCD_COLOR_B, DRAW_PUT); + draw_arrow(2 * 6, LCD_SIZE_Y - 8, ARROW_LEFT, ARROW_LEN, LCD_COLOR_B, DRAW_PUT); + draw_arrow(3 * 6, LCD_SIZE_Y - 8, ARROW_RIGHT, ARROW_LEN, LCD_COLOR_B, DRAW_PUT); + draw_string(32, LCD_SIZE_Y - 8, "Bewegen", LCD_COLOR_B, DRAW_PUT); + +again: + GameSokoban_InitDisplayForNewGame(&GI); + draw_block(32, 8, 30, 8, LCD_COLOR_B, DRAW_ERASE); + draw_numU(32,8,GI.Level,0,LCD_COLOR_B,DRAW_PUT); + + while(1) + { + if(KEY_Up || KEY_Down || KEY_Left || KEY_Right || KEY_8) + { + draw_block(98, 8, 30, 8, LCD_COLOR_B, DRAW_ERASE); + if(KEY_8) + GameSokoban_UndoAMove(&GI); + else + GameSokoban_Move(&GI); + + if(GameSokoban_IsSolved(GI.G) && !KEY_8) + { + //Solved + GI.Level++;//Next level + if(GI.Level > SOKOBAN_LEVELS) + { + GI.Level = 1; + } + waitKeyUp(); + goto restart; + } + draw_numU(98,8,GI.Moves,0,LCD_COLOR_B,DRAW_PUT); + } + + + //Footer + if(GI.Moves == 1) + { + draw_block(0, LCD_SIZE_Y - (8*3), LCD_SIZE_X, 16, LCD_COLOR_B, DRAW_ERASE); + draw_string(0, LCD_SIZE_Y - (8*3), "0", LCD_COLOR_B, DRAW_PUT); + draw_string(32, LCD_SIZE_Y - (8*3), "Neues Spiel", LCD_COLOR_B, DRAW_PUT); + draw_string(0, LCD_SIZE_Y - (8*2), "Exit", LCD_COLOR_B, DRAW_PUT); + draw_string(32, LCD_SIZE_Y - (8*2), "Spiel beenden", LCD_COLOR_B, DRAW_PUT); + } + + waitKeyUpDown(); + + if(GI.Moves == 0) + { + if(KEY_Pplus || KEY_Pminus || KEY_Vplus || KEY_Vminus) + { + //Change level + //Program keys +/- 1 + if(KEY_Pplus) + { + GI.Level++; + } + if(KEY_Pminus) + { + GI.Level--; + } + //Volume keys +/- 20 + if(KEY_Vplus) + { + GI.Level += 20; + } + if(KEY_Vminus) + { + GI.Level -= 20; + } + //Wrap around if necessary + if(GI.Level < 1) + { + GI.Level += SOKOBAN_LEVELS; + } + if(GI.Level > SOKOBAN_LEVELS) + { + GI.Level -= SOKOBAN_LEVELS; + } + //New game + goto again; + } + } + if(KEY_0) goto restart; + if(KEY_Exit) return; + } +} + diff --git a/boop/trunk/games/sokoban.h b/boop/trunk/games/sokoban.h new file mode 100644 index 0000000..fe5621a --- /dev/null +++ b/boop/trunk/games/sokoban.h @@ -0,0 +1,64 @@ +/* + sokoban.h - game + Copyright (C) 2007 Colibri + + 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 3 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 SOKOBAN_H +#define SOKOBAN_H + +#include "../global.h" + +#define SOKOBAN_MAX_UNDOS 100 +#define SOKOBAN_UNDO_DIR_LEFT 0 +#define SOKOBAN_UNDO_DIR_RIGHT 1 +#define SOKOBAN_UNDO_DIR_UP 2 +#define SOKOBAN_UNDO_DIR_DOWN 3 + +#define SPACE 0 +#define GOAL 1 +#define PUSHER 2 +#define PACKET 4 +#define WALL 8 +#define PUSHER_ON_GOAL (PUSHER | GOAL) +#define PACKET_ON_GOAL (PACKET | GOAL) + +#define SOKOBAN_CELLS_X 21 +#define SOKOBAN_CELLS_Y 19 +//Size without grid +#define SOKOBAN_CELL_SIZE 5 + +struct _SokobanGameInfo +{ + BYTE G[SOKOBAN_CELLS_X][SOKOBAN_CELLS_Y]; + short Level; + int PusherX; + int PusherY; + WORD Moves; + WORD UndoCount; + BYTE UndoBuffer[SOKOBAN_MAX_UNDOS][3]; +}; + +void GameSokoban(void); +void GameSokoban_InitGameField(struct _SokobanGameInfo *pGI); +void GameSokoban_DrawCell(int x, int y, BYTE Object); +BOOL GameSokoban_IsSolved(BYTE G[SOKOBAN_CELLS_X][SOKOBAN_CELLS_Y]); +void GameSokoban_InitDisplayForNewGame(struct _SokobanGameInfo *pGI); +void GameSokoban_Move(struct _SokobanGameInfo *pGI); +void GameSokoban_SaveUndo(struct _SokobanGameInfo *pGI, BYTE Count, BYTE Dir); +void GameSokoban_UndoAMove(struct _SokobanGameInfo *pGI); + + +#endif diff --git a/boop/trunk/games/sokoban_levels.h b/boop/trunk/games/sokoban_levels.h new file mode 100644 index 0000000..437c9e1 --- /dev/null +++ b/boop/trunk/games/sokoban_levels.h @@ -0,0 +1,4968 @@ +/* + sokoban.h - game + Copyright (C) 2007 Colibri + + 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 3 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 SOKOBAN_LEVELS_H +#define SOKOBAN_LEVELS_H + +#ifndef DEBUGMODE +#define SOKOBAN_LEVELS 375 +const unsigned char Sokoban_Levels[] = { +//Level: 1 +0x13, 0x0B,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // ##### +0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // # # +0x00, 0x00, 0x84, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // #$ # +0x00, 0x88, 0x80, 0x04, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, // ### $## +0x00, 0x80, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, // # $ $ # +0x88, 0x80, 0x80, 0x88, 0x08, 0x00, 0x08, 0x88, 0x88, 0x80, //### # ## # ###### +0x80, 0x00, 0x80, 0x88, 0x08, 0x88, 0x88, 0x00, 0x11, 0x80, //# # ## ##### ..# +0x80, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x80, //# $ $ ..# +0x88, 0x88, 0x80, 0x88, 0x80, 0x82, 0x88, 0x00, 0x11, 0x80, //##### ### #@## ..# +0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x80, // # ######### +0x00, 0x00, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, // ####### +//Level: 2 +0x0E, 0x0A,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, //############ +0x81, 0x10, 0x08, 0x00, 0x00, 0x08, 0x88, //#.. # ### +0x81, 0x10, 0x08, 0x04, 0x00, 0x40, 0x08, //#.. # $ $ # +0x81, 0x10, 0x08, 0x48, 0x88, 0x80, 0x08, //#.. #$#### # +0x81, 0x10, 0x00, 0x02, 0x08, 0x80, 0x08, //#.. @ ## # +0x81, 0x10, 0x08, 0x08, 0x00, 0x40, 0x88, //#.. # # $ ## +0x88, 0x88, 0x88, 0x08, 0x84, 0x04, 0x08, //###### ##$ $ # +0x00, 0x80, 0x40, 0x04, 0x04, 0x04, 0x08, // # $ $ $ $ # +0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, // # # # +0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, // ############ +//Level: 3 +0x11, 0x0A,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x00, // ######## +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x28, 0x00, // # @# +0x00, 0x00, 0x00, 0x00, 0x80, 0x48, 0x40, 0x88, 0x00, // # $#$ ## +0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x04, 0x80, 0x00, // # $ $# +0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x40, 0x80, 0x00, // ##$ $ # +0x88, 0x88, 0x88, 0x88, 0x80, 0x40, 0x80, 0x88, 0x80, //######### $ # ### +0x81, 0x11, 0x10, 0x08, 0x80, 0x40, 0x04, 0x00, 0x80, //#.... ## $ $ # +0x88, 0x11, 0x10, 0x00, 0x04, 0x00, 0x40, 0x00, 0x80, //##... $ $ # +0x81, 0x11, 0x10, 0x08, 0x88, 0x88, 0x88, 0x88, 0x80, //#.... ########## +0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, //######## +//Level: 4 +0x0B, 0x0A,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //########### +0x80, 0x00, 0x08, 0x00, 0x00, 0x80, //# # # +0x80, 0x42, 0x44, 0x44, 0x40, 0x80, //# $@$$$$$ # +0x80, 0x00, 0x00, 0x00, 0x00, 0x80, //# # +0x88, 0x88, 0x80, 0x88, 0x88, 0x80, //##### ##### +0x00, 0x08, 0x10, 0x08, 0x00, 0x00, // #. # +0x00, 0x08, 0x10, 0x08, 0x00, 0x00, // #. # +0x00, 0x08, 0x11, 0x18, 0x00, 0x00, // #...# +0x00, 0x08, 0x10, 0x08, 0x00, 0x00, // #. # +0x00, 0x08, 0x88, 0x88, 0x00, 0x00, // ##### +//Level: 5 +0x0E, 0x0D,//Size x and y +0x88, 0x88, 0x88, 0x00, 0x88, 0x88, 0x80, //###### ##### +0x80, 0x00, 0x08, 0x00, 0x80, 0x00, 0x80, //# # # # +0x80, 0x40, 0x08, 0x88, 0x80, 0x40, 0x80, //# $ #### $ # +0x80, 0x40, 0x00, 0x00, 0x04, 0x00, 0x80, //# $ $ # +0x80, 0x08, 0x88, 0x28, 0x88, 0x40, 0x80, //# ###@###$ # +0x88, 0x88, 0x88, 0x88, 0x88, 0x08, 0x88, //########## ### +0x81, 0x10, 0x00, 0x88, 0x00, 0x00, 0x08, //#.. ## # +0x81, 0x10, 0x00, 0x88, 0x40, 0x00, 0x08, //#.. ##$ # +0x81, 0x10, 0x00, 0x88, 0x04, 0x00, 0x08, //#.. ## $ # +0x81, 0x10, 0x00, 0x88, 0x04, 0x00, 0x08, //#.. ## $ # +0x81, 0x10, 0x00, 0x00, 0x40, 0x40, 0x08, //#.. $ $ # +0x88, 0x80, 0x08, 0x88, 0x88, 0x88, 0x88, //### ######### +0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // #### +//Level: 6 +0x0B, 0x10,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //########### +0x80, 0x00, 0x00, 0x80, 0x00, 0x80, //# # # +0x80, 0x00, 0x40, 0x04, 0x00, 0x80, //# $ $ # +0x88, 0x88, 0x80, 0x80, 0x00, 0x80, //##### # # +0x88, 0x88, 0x80, 0x88, 0x81, 0x80, //##### ###.# +0x80, 0x08, 0x00, 0x00, 0x81, 0x80, //# # #.# +0x80, 0x40, 0x00, 0x40, 0x81, 0x80, //# $ $ #.# +0x80, 0x08, 0x88, 0x08, 0x81, 0x80, //# ### ##.# +0x88, 0x08, 0x88, 0x00, 0x81, 0x80, //## ### #.# +0x80, 0x40, 0x00, 0x40, 0x81, 0x80, //# $ $ #.# +0x80, 0x00, 0x88, 0x00, 0x81, 0x80, //# ## #.# +0x88, 0x80, 0x88, 0x88, 0x81, 0x80, //### #####.# +0x88, 0x80, 0x80, 0x00, 0x20, 0x80, //### # @ # +0x80, 0x04, 0x00, 0x00, 0x40, 0x80, //# $ $ # +0x80, 0x00, 0x08, 0x80, 0x00, 0x80, //# ## # +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //########### +//Level: 7 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x88, 0x02, 0x88, //#### @## +0x88, 0x88, 0x00, 0x08, //#### # +0x81, 0x08, 0x44, 0x08, //#. #$$ # +0x80, 0x00, 0x00, 0x88, //# ## +0x81, 0x00, 0x48, 0x88, //#. $### +0x88, 0x10, 0x08, 0x88, //##. ### +0x88, 0x88, 0x88, 0x88, //######## +//Level: 8 +0x0C, 0x06,//Size x and y +0x08, 0x88, 0x80, 0x08, 0x88, 0x88, // #### ##### +0x88, 0x00, 0x80, 0x08, 0x00, 0x08, //## # # # +0x80, 0x40, 0x88, 0x88, 0x40, 0x08, //# $ ####$ # +0x80, 0x04, 0x11, 0x11, 0x04, 0x08, //# $.... $ # +0x88, 0x00, 0x00, 0x80, 0x20, 0x88, //## # @ ## +0x08, 0x88, 0x88, 0x88, 0x88, 0x80, // ########## +//Level: 9 +0x07, 0x06,//Size x and y +0x88, 0x88, 0x88, 0x80, //####### +0x80, 0x04, 0x01, 0x80, //# $ .# +0x80, 0x02, 0x40, 0x80, //# @$ # +0x80, 0x08, 0x41, 0x80, //# #$.# +0x80, 0x01, 0x08, 0x80, //# . ## +0x88, 0x88, 0x88, 0x00, //###### +//Level: 10 +0x07, 0x08,//Size x and y +0x00, 0x88, 0x88, 0x00, // #### +0x88, 0x80, 0x08, 0x80, //### ## +0x80, 0x00, 0x40, 0x80, //# $ # +0x80, 0x81, 0x82, 0x80, //# #.#@# +0x80, 0x84, 0x01, 0x80, //# #$ .# +0x80, 0x01, 0x40, 0x80, //# .$ # +0x88, 0x00, 0x08, 0x80, //## ## +0x08, 0x88, 0x88, 0x00, // ##### +//Level: 11 +0x09, 0x09,//Size x and y +0x88, 0x88, 0x00, 0x00, 0x00, //#### +0x80, 0x08, 0x88, 0x80, 0x00, //# #### +0x80, 0x00, 0x00, 0x88, 0x80, //# ### +0x80, 0x08, 0x40, 0x10, 0x80, //# #$ . # +0x88, 0x08, 0x18, 0x40, 0x80, //## #.#$ # +0x80, 0x08, 0x02, 0x50, 0x80, //# # @* # +0x80, 0x00, 0x50, 0x08, 0x80, //# * ## +0x88, 0x88, 0x00, 0x88, 0x00, //#### ## +0x00, 0x08, 0x88, 0x80, 0x00, // #### +//Level: 12 +0x09, 0x08,//Size x and y +0x00, 0x88, 0x88, 0x00, 0x00, // #### +0x00, 0x82, 0x08, 0x00, 0x00, // #@ # +0x88, 0x80, 0x08, 0x88, 0x80, //### #### +0x80, 0x01, 0x50, 0x00, 0x80, //# .* # +0x80, 0x41, 0x10, 0x40, 0x80, //# $.. $ # +0x88, 0x80, 0x48, 0x88, 0x80, //### $#### +0x00, 0x80, 0x08, 0x00, 0x00, // # # +0x00, 0x88, 0x88, 0x00, 0x00, // #### +//Level: 13 +0x0D, 0x11,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x00, 0x00, 0x00, // ### +0x00, 0x00, 0x88, 0x18, 0x80, 0x00, 0x00, // ##.## +0x00, 0x00, 0x81, 0x11, 0x80, 0x00, 0x00, // #...# +0x00, 0x88, 0x81, 0x12, 0x88, 0x80, 0x00, // ###..@### +0x00, 0x80, 0x01, 0x11, 0x00, 0x80, 0x00, // # ... # +0x88, 0x80, 0x88, 0x18, 0x80, 0x88, 0x80, //### ##.## ### +0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, //# $ # +0x80, 0x08, 0x00, 0x40, 0x08, 0x00, 0x80, //# # $ # # +0x88, 0x48, 0x48, 0x88, 0x48, 0x48, 0x80, //##$#$###$#$## +0x80, 0x08, 0x00, 0x40, 0x08, 0x00, 0x80, //# # $ # # +0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, //# $ # +0x88, 0x80, 0x08, 0x08, 0x00, 0x88, 0x80, //### # # ### +0x00, 0x80, 0x88, 0x08, 0x80, 0x80, 0x00, // # ## ## # +0x00, 0x80, 0x04, 0x04, 0x00, 0x80, 0x00, // # $ $ # +0x00, 0x80, 0x88, 0x08, 0x80, 0x80, 0x00, // # ## ## # +0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, // # # +0x00, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, // ######### +//Level: 14 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x80, 0x21, 0x80, 0x08, //# @.# # +0x80, 0x14, 0x01, 0x08, //# .$ . # +0x80, 0x08, 0x40, 0x08, //# #$ # +0x80, 0x04, 0x00, 0x88, //# $ ## +0x88, 0x80, 0x08, 0x80, //### ## +0x00, 0x80, 0x08, 0x00, // # # +0x00, 0x88, 0x88, 0x00, // #### +//Level: 15 +0x09, 0x09,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x00, //######## +0x80, 0x00, 0x00, 0x08, 0x00, //# # +0x80, 0x84, 0x40, 0x08, 0x00, //# #$$ # +0x80, 0x11, 0x18, 0x08, 0x00, //# ...# # +0x88, 0x11, 0x14, 0x08, 0x80, //##...$ ## +0x08, 0x08, 0x80, 0x40, 0x80, // # ## $ # +0x08, 0x40, 0x04, 0x00, 0x80, // #$ $ # +0x08, 0x00, 0x80, 0x02, 0x80, // # # @# +0x08, 0x88, 0x88, 0x88, 0x80, // ######## +//Level: 16 +0x0B, 0x09,//Size x and y +0x00, 0x88, 0x88, 0x80, 0x00, 0x00, // ##### +0x00, 0x80, 0x00, 0x80, 0x00, 0x00, // # # +0x88, 0x84, 0x14, 0x88, 0x88, 0x80, //###$.$##### +0x80, 0x00, 0x10, 0x40, 0x00, 0x80, //# . $ # +0x80, 0x88, 0x48, 0x80, 0x20, 0x80, //# ##$## @ # +0x80, 0x00, 0x10, 0x88, 0x88, 0x80, //# . ##### +0x88, 0x80, 0x10, 0x80, 0x00, 0x00, //### . # +0x00, 0x80, 0x00, 0x80, 0x00, 0x00, // # # +0x00, 0x88, 0x88, 0x80, 0x00, 0x00, // ##### +//Level: 17 +0x0C, 0x0B,//Size x and y +0x88, 0x88, 0x88, 0x00, 0x88, 0x80, //###### ### +0x81, 0x10, 0x08, 0x08, 0x82, 0x88, //#.. # ##@## +0x81, 0x10, 0x08, 0x88, 0x00, 0x08, //#.. ### # +0x81, 0x10, 0x00, 0x00, 0x44, 0x08, //#.. $$ # +0x81, 0x10, 0x08, 0x08, 0x04, 0x08, //#.. # # $ # +0x81, 0x18, 0x88, 0x08, 0x04, 0x08, //#..### # $ # +0x88, 0x88, 0x04, 0x08, 0x40, 0x08, //#### $ #$ # +0x00, 0x08, 0x00, 0x48, 0x04, 0x08, // # $# $ # +0x00, 0x08, 0x04, 0x00, 0x40, 0x08, // # $ $ # +0x00, 0x08, 0x00, 0x88, 0x00, 0x08, // # ## # +0x00, 0x08, 0x88, 0x88, 0x88, 0x88, // ######### +//Level: 18 +0x10, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, //####### +0x80, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, //# ########## +0x80, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x88, //# # # ## +0x80, 0x40, 0x00, 0x80, 0x00, 0x40, 0x40, 0x08, //# $ # $ $ # +0x80, 0x04, 0x00, 0x80, 0x04, 0x08, 0x80, 0x08, //# $ # $ ## # +0x80, 0x44, 0x00, 0x88, 0x40, 0x40, 0x00, 0x08, //# $$ ##$ $ # +0x88, 0x08, 0x00, 0x88, 0x08, 0x88, 0x88, 0x88, //## # ## ####### +0x88, 0x08, 0x00, 0x88, 0x00, 0x00, 0x11, 0x18, //## # ## ...# +0x80, 0x08, 0x40, 0x00, 0x00, 0x00, 0x11, 0x18, //# #$ ...# +0x80, 0x00, 0x44, 0x00, 0x00, 0x00, 0x11, 0x18, //# $$ ...# +0x80, 0x00, 0x00, 0x88, 0x28, 0x00, 0x11, 0x18, //# ##@# ...# +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //################ +//Level: 19 +0x0D, 0x0C,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, // ############ +0x08, 0x00, 0x00, 0x10, 0x80, 0x00, 0x80, // # . # # +0x08, 0x00, 0x04, 0x50, 0x80, 0x40, 0x80, // # $* # $ # +0x08, 0x00, 0x08, 0x10, 0x80, 0x88, 0x80, // # #. # ### +0x08, 0x00, 0x88, 0x18, 0x00, 0x08, 0x00, // # ##.# # +0x88, 0x00, 0x88, 0x18, 0x04, 0x08, 0x80, //## ##.# $ ## +0x80, 0x00, 0x80, 0x18, 0x48, 0x00, 0x80, //# # .#$# # +0x80, 0x20, 0x80, 0x10, 0x00, 0x40, 0x80, //# @ # . $ # +0x80, 0x08, 0x80, 0x54, 0x48, 0x00, 0x80, //# ## *$$# # +0x80, 0x00, 0x80, 0x10, 0x00, 0x08, 0x80, //# # . ## +0x80, 0x00, 0x88, 0x88, 0x88, 0x88, 0x00, //# ######## +0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, //##### +//Level: 20 +0x0D, 0x0C,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x00, // ####### +0x00, 0x00, 0x08, 0x00, 0x80, 0x08, 0x00, // # # # +0x00, 0x00, 0x08, 0x00, 0x44, 0x08, 0x00, // # $$ # +0x88, 0x88, 0x88, 0x04, 0x80, 0x08, 0x00, //###### $# # +0x81, 0x11, 0x88, 0x80, 0x80, 0x08, 0x80, //#...### # ## +0x81, 0x00, 0x80, 0x04, 0x08, 0x00, 0x80, //#. # $ # # +0x81, 0x00, 0x00, 0x40, 0x40, 0x40, 0x80, //#. $ $ $ # +0x81, 0x00, 0x80, 0x04, 0x08, 0x00, 0x80, //#. # $ # # +0x81, 0x11, 0x88, 0x80, 0x80, 0x08, 0x80, //#...### # ## +0x88, 0x88, 0x88, 0x04, 0x00, 0x08, 0x00, //###### $ # +0x00, 0x00, 0x08, 0x20, 0x80, 0x08, 0x00, // #@ # # +0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x00, // ####### +//Level: 21 +0x08, 0x08,//Size x and y +0x00, 0x88, 0x88, 0x00, // #### +0x00, 0x81, 0x18, 0x00, // #..# +0x08, 0x80, 0x18, 0x80, // ## .## +0x08, 0x00, 0x41, 0x80, // # $.# +0x88, 0x04, 0x00, 0x88, //## $ ## +0x80, 0x08, 0x44, 0x08, //# #$$ # +0x80, 0x02, 0x00, 0x08, //# @ # +0x88, 0x88, 0x88, 0x88, //######## +//Level: 22 +0x09, 0x09,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x80, //######### +0x88, 0x00, 0x00, 0x08, 0x80, //## ## +0x80, 0x81, 0x40, 0x40, 0x80, //# #.$ $ # +0x80, 0x15, 0x14, 0x00, 0x80, //# .*.$ # +0x80, 0x41, 0x81, 0x40, 0x80, //# $.#.$ # +0x80, 0x04, 0x18, 0x10, 0x80, //# $.#. # +0x80, 0x40, 0x41, 0x80, 0x80, //# $ $.# # +0x88, 0x00, 0x20, 0x08, 0x80, //## @ ## +0x88, 0x88, 0x88, 0x88, 0x80, //######### +//Level: 23 +0x10, 0x0C,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x88, // ######### +0x88, 0x88, 0x88, 0x88, 0x28, 0x80, 0x01, 0x18, //########@## ..# +0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x18, //# $ ..# +0x80, 0x40, 0x84, 0x08, 0x48, 0x80, 0x01, 0x18, //# $ #$ #$## ..# +0x88, 0x08, 0x80, 0x00, 0x08, 0x88, 0x81, 0x18, //## ## ####..# +0x08, 0x04, 0x04, 0x88, 0x08, 0x00, 0x88, 0x88, // # $ $## # #### +0x08, 0x08, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00, // # ## # # +0x88, 0x08, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, //## # ## +0x80, 0x04, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, //# $ ## +0x80, 0x08, 0x84, 0x08, 0x00, 0x00, 0x00, 0x00, //# ##$ # +0x80, 0x08, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, //# ## # +0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, //######## +//Level: 24 +0x0F, 0x09,//Size x and y +0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, // ##### +0x00, 0x80, 0x00, 0x88, 0x88, 0x88, 0x88, 0x80, // # ######### +0x00, 0x80, 0x40, 0x40, 0x00, 0x00, 0x00, 0x80, // # $ $ # +0x88, 0x88, 0x80, 0x04, 0x08, 0x44, 0x00, 0x80, //##### $ #$$ # +0x80, 0x00, 0x80, 0x88, 0x00, 0x00, 0x88, 0x80, //# # ## ### +0x81, 0x11, 0x00, 0x08, 0x80, 0x04, 0x80, 0x00, //#... ## $# +0x81, 0x11, 0x84, 0x40, 0x04, 0x00, 0x80, 0x00, //#...#$$ $ # +0x81, 0x11, 0x80, 0x02, 0x80, 0x08, 0x80, 0x00, //#...# @# ## +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, //############ +//Level: 25 +0x09, 0x08,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x00, // ####### +0x08, 0x02, 0x11, 0x18, 0x00, // # @...# +0x08, 0x00, 0x08, 0x88, 0x80, // # #### +0x88, 0x84, 0x00, 0x00, 0x80, //###$ # +0x80, 0x00, 0x84, 0x80, 0x80, //# #$# # +0x80, 0x40, 0x80, 0x00, 0x80, //# $ # # +0x80, 0x00, 0x88, 0x88, 0x80, //# ##### +0x88, 0x88, 0x80, 0x00, 0x00, //##### +//Level: 26 +0x0F, 0x0D,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############### +0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, //# # # # +0x80, 0x44, 0x00, 0x40, 0x00, 0x40, 0x40, 0x80, //# $$ $ $ $ # +0x80, 0x04, 0x08, 0x88, 0x88, 0x80, 0x80, 0x80, //# $ ###### # # +0x80, 0x44, 0x08, 0x20, 0x08, 0x00, 0x40, 0x80, //# $$ #@ # $ # +0x80, 0x00, 0x08, 0x00, 0x40, 0x00, 0x08, 0x80, //# # $ ## +0x88, 0x88, 0x88, 0x48, 0x80, 0x08, 0x81, 0x80, //######$## ##.# +0x08, 0x00, 0x08, 0x04, 0x00, 0x08, 0x11, 0x80, // # # $ #..# +0x08, 0x00, 0x00, 0x40, 0x00, 0x81, 0x11, 0x80, // # $ #...# +0x08, 0x80, 0x88, 0x88, 0x08, 0x01, 0x11, 0x80, // ## #### # ...# +0x08, 0x00, 0x40, 0x00, 0x45, 0x11, 0x11, 0x80, // # $ $*....# +0x08, 0x00, 0x08, 0x00, 0x08, 0x10, 0x01, 0x80, // # # #. .# +0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, // ############## +//Level: 27 +0x09, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x00, 0x00, //###### +0x80, 0x00, 0x08, 0x00, 0x00, //# # +0x80, 0x44, 0x48, 0x80, 0x00, //# $$$## +0x80, 0x08, 0x11, 0x88, 0x80, //# #..### +0x88, 0x00, 0x11, 0x40, 0x80, //## ..$ # +0x08, 0x02, 0x00, 0x00, 0x80, // # @ # +0x08, 0x88, 0x88, 0x88, 0x80, // ######## +//Level: 28 +0x0E, 0x09,//Size x and y +0x88, 0x88, 0x88, 0x00, 0x08, 0x88, 0x88, //###### ##### +0x80, 0x00, 0x08, 0x88, 0x08, 0x00, 0x18, //# ### # .# +0x80, 0x04, 0x04, 0x08, 0x08, 0x11, 0x18, //# $ $ # #...# +0x80, 0x80, 0x04, 0x08, 0x88, 0x00, 0x18, //# # $ ### .# +0x80, 0x04, 0x44, 0x00, 0x04, 0x02, 0x18, //# $$$ $ @.# +0x88, 0x80, 0x04, 0x00, 0x48, 0x00, 0x18, //### $ $# .# +0x00, 0x80, 0x04, 0x84, 0x08, 0x11, 0x18, // # $#$ #...# +0x00, 0x88, 0x00, 0x00, 0x08, 0x00, 0x18, // ## # .# +0x00, 0x08, 0x88, 0x88, 0x88, 0x88, 0x88, // ########### +//Level: 29 +0x09, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x80, 0x00, //####### +0x80, 0x01, 0x40, 0x88, 0x80, //# .$ ### +0x80, 0x14, 0x14, 0x00, 0x80, //# .$.$ # +0x85, 0x41, 0x41, 0x20, 0x80, //#*$.$.@ # +0x80, 0x14, 0x14, 0x08, 0x80, //# .$.$ ## +0x80, 0x01, 0x40, 0x08, 0x00, //# .$ # +0x88, 0x88, 0x88, 0x88, 0x00, //######## +//Level: 30 +0x0A, 0x09,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x80, //######### +0x81, 0x11, 0x88, 0x00, 0x80, //#...## # +0x81, 0x51, 0x00, 0x42, 0x80, //#.*. $@# +0x80, 0x04, 0x80, 0x08, 0x80, //# $# ## +0x88, 0x80, 0x88, 0x08, 0x88, //### ## ### +0x80, 0x00, 0x40, 0x00, 0x08, //# $ # +0x80, 0x04, 0x88, 0x48, 0x08, //# $##$# # +0x80, 0x00, 0x04, 0x00, 0x18, //# $ .# +0x88, 0x88, 0x88, 0x88, 0x88, //########## +//Level: 31 +0x08, 0x07,//Size x and y +0x00, 0x88, 0x88, 0x80, // ##### +0x88, 0x80, 0x02, 0x80, //### @# +0x80, 0x04, 0x10, 0x88, //# $. ## +0x80, 0x01, 0x41, 0x08, //# .$. # +0x88, 0x80, 0x54, 0x08, //### *$ # +0x00, 0x80, 0x00, 0x88, // # ## +0x00, 0x88, 0x88, 0x80, // ##### +//Level: 32 +0x0E, 0x0D,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x80, 0x00, // #### +0x88, 0x88, 0x88, 0x88, 0x00, 0x88, 0x88, //######## #### +0x80, 0x00, 0x88, 0x11, 0x11, 0x10, 0x08, //# ##..... # +0x80, 0x04, 0x00, 0x88, 0x11, 0x18, 0x08, //# $ ##...# # +0x88, 0x00, 0x40, 0x08, 0x88, 0x08, 0x08, //## $ ### # # +0x08, 0x08, 0x04, 0x00, 0x80, 0x00, 0x08, // # # $ # # +0x08, 0x00, 0x80, 0x40, 0x08, 0x00, 0x08, // # # $ # # +0x08, 0x00, 0x08, 0x04, 0x00, 0x80, 0x08, // # # $ # # +0x08, 0x00, 0x00, 0x80, 0x40, 0x80, 0x88, // # # $ # ## +0x08, 0x88, 0x80, 0x08, 0x04, 0x00, 0x80, // #### # $ # +0x00, 0x00, 0x88, 0x00, 0x80, 0x40, 0x80, // ## # $ # +0x00, 0x00, 0x08, 0x82, 0x80, 0x00, 0x80, // ##@# # +0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x80, // ####### +//Level: 33 +0x0A, 0x08,//Size x and y +0x00, 0x88, 0x88, 0x80, 0x00, // ##### +0x88, 0x80, 0x00, 0x88, 0x88, //### #### +0x80, 0x00, 0x40, 0x40, 0x08, //# $ $ # +0x80, 0x40, 0x00, 0x40, 0x28, //# $ $ @# +0x88, 0x84, 0x48, 0x88, 0x88, //###$$##### +0x00, 0x80, 0x01, 0x18, 0x00, // # ..# +0x00, 0x81, 0x11, 0x18, 0x00, // #....# +0x00, 0x88, 0x88, 0x88, 0x00, // ###### +//Level: 34 +0x09, 0x0C,//Size x and y +0x88, 0x88, 0x08, 0x88, 0x80, //#### #### +0x80, 0x08, 0x88, 0x00, 0x80, //# ### # +0x80, 0x00, 0x04, 0x00, 0x80, //# $ # +0x80, 0x08, 0x08, 0x00, 0x80, //# # # # +0x88, 0x08, 0x08, 0x48, 0x80, //## # #$## +0x80, 0x08, 0x18, 0x00, 0x80, //# #.# # +0x80, 0x05, 0x15, 0x02, 0x80, //# *.* @# +0x80, 0x08, 0x18, 0x08, 0x80, //# #.# ## +0x88, 0x88, 0x00, 0x08, 0x00, //#### # +0x00, 0x08, 0x08, 0x48, 0x00, // # #$# +0x00, 0x08, 0x00, 0x08, 0x00, // # # +0x00, 0x08, 0x88, 0x88, 0x00, // ##### +//Level: 35 +0x0A, 0x06,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x80, //######### +0x80, 0x40, 0x11, 0x00, 0x80, //# $ .. # +0x82, 0x44, 0x11, 0x04, 0x88, //#@$$.. $## +0x80, 0x40, 0x11, 0x04, 0x08, //# $ .. $ # +0x88, 0x88, 0x88, 0x00, 0x08, //###### # +0x00, 0x00, 0x08, 0x88, 0x88, // ##### +//Level: 36 +0x0F, 0x07,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, // ###### +0x88, 0x88, 0x80, 0x00, 0x08, 0x88, 0x88, 0x80, //##### ###### +0x80, 0x00, 0x80, 0x00, 0x20, 0x08, 0x00, 0x80, //# # @ # # +0x80, 0x04, 0x15, 0x55, 0x55, 0x51, 0x40, 0x80, //# $.******.$ # +0x88, 0x88, 0x00, 0x00, 0x80, 0x08, 0x00, 0x80, //#### # # # +0x00, 0x08, 0x80, 0x00, 0x80, 0x00, 0x08, 0x80, // ## # ## +0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, // ########## +//Level: 37 +0x09, 0x09,//Size x and y +0x00, 0x88, 0x88, 0x80, 0x00, // ##### +0x88, 0x80, 0x20, 0x88, 0x80, //### @ ### +0x80, 0x04, 0x04, 0x00, 0x80, //# $ $ # +0x80, 0x51, 0x51, 0x50, 0x80, //# *.*.* # +0x80, 0x14, 0x04, 0x10, 0x80, //# .$ $. # +0x80, 0x51, 0x51, 0x50, 0x80, //# *.*.* # +0x80, 0x04, 0x04, 0x00, 0x80, //# $ $ # +0x88, 0x88, 0x88, 0x00, 0x80, //###### # +0x00, 0x00, 0x08, 0x88, 0x80, // #### +//Level: 38 +0x11, 0x0E,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x80, // ####### +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x11, 0x80, // # ...# +0x00, 0x00, 0x00, 0x88, 0x88, 0x80, 0x01, 0x11, 0x80, // ##### ...# +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x01, 0x80, // # . .# +0x00, 0x00, 0x00, 0x80, 0x08, 0x80, 0x01, 0x11, 0x80, // # ## ...# +0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x01, 0x11, 0x80, // ## ## ...# +0x00, 0x00, 0x08, 0x88, 0x08, 0x88, 0x88, 0x88, 0x80, // ### ######## +0x00, 0x00, 0x08, 0x04, 0x44, 0x08, 0x80, 0x00, 0x00, // # $$$ ## +0x08, 0x88, 0x88, 0x00, 0x40, 0x40, 0x88, 0x88, 0x80, // ##### $ $ ##### +0x88, 0x00, 0x08, 0x40, 0x40, 0x00, 0x80, 0x00, 0x80, //## #$ $ # # +0x82, 0x04, 0x00, 0x40, 0x00, 0x04, 0x00, 0x40, 0x80, //#@ $ $ $ $ # +0x88, 0x88, 0x88, 0x04, 0x40, 0x40, 0x88, 0x88, 0x80, //###### $$ $ ##### +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, // # # +0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, // ######## +//Level: 39 +0x0A, 0x07,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x80, // ###### +0x08, 0x88, 0x00, 0x00, 0x80, // ### # +0x88, 0x10, 0x48, 0x80, 0x88, //##. $## ## +0x81, 0x14, 0x04, 0x00, 0x28, //#..$ $ @# +0x81, 0x10, 0x40, 0x40, 0x88, //#.. $ $ ## +0x88, 0x88, 0x80, 0x00, 0x80, //##### # +0x00, 0x00, 0x88, 0x88, 0x80, // ##### +//Level: 40 +0x11, 0x0D,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x00, // ######## +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x00, // # # +0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x04, 0x08, 0x00, // # $ $ # +0x08, 0x88, 0x88, 0x88, 0x80, 0x40, 0x40, 0x08, 0x00, // ######## $ $ # +0x88, 0x11, 0x10, 0x08, 0x88, 0x80, 0x88, 0x08, 0x00, //##... #### ## # +0x81, 0x11, 0x10, 0x00, 0x00, 0x00, 0x88, 0x08, 0x00, //#.... ## # +0x88, 0x11, 0x10, 0x08, 0x80, 0x44, 0x88, 0x08, 0x80, //##... ## $$## ## +0x08, 0x88, 0x88, 0x88, 0x80, 0x40, 0x00, 0x02, 0x80, // ######## $ @# +0x00, 0x00, 0x00, 0x88, 0x80, 0x88, 0x88, 0x08, 0x80, // ### #### ## +0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x00, 0x08, 0x00, // # $ $ # +0x00, 0x00, 0x00, 0x80, 0x04, 0x08, 0x88, 0x88, 0x00, // # $ ##### +0x00, 0x00, 0x00, 0x88, 0x00, 0x08, 0x00, 0x00, 0x00, // ## # +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, 0x00, // ##### +//Level: 41 +0x07, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x80, //####### +0x80, 0x00, 0x00, 0x80, //# # +0x80, 0x00, 0x00, 0x80, //# # +0x80, 0x08, 0x00, 0x80, //# # # +0x84, 0x44, 0x44, 0x80, //#$$$$$# +0x81, 0x13, 0x11, 0x80, //#..+..# +0x88, 0x88, 0x88, 0x80, //####### +//Level: 42 +0x0E, 0x0C,//Size x and y +0x08, 0x88, 0x88, 0x80, 0x88, 0x88, 0x80, // ###### ##### +0x88, 0x28, 0x00, 0x88, 0x80, 0x00, 0x88, //##@# ### ## +0x80, 0x00, 0x04, 0x00, 0x80, 0x40, 0x08, //# $ # $ # +0x80, 0x04, 0x00, 0x80, 0x00, 0x04, 0x08, //# $ # $ # +0x88, 0x80, 0x88, 0x88, 0x88, 0x00, 0x08, //### ###### # +0x88, 0x80, 0x88, 0x00, 0x88, 0x48, 0x88, //### ## ##$### +0x80, 0x40, 0x08, 0x88, 0x80, 0x11, 0x80, //# $ #### ..# +0x80, 0x40, 0x40, 0x40, 0x01, 0x11, 0x80, //# $ $ $ ...# +0x80, 0x00, 0x08, 0x88, 0x81, 0x11, 0x80, //# ####...# +0x80, 0x44, 0x08, 0x00, 0x81, 0x11, 0x80, //# $$ # #...# +0x80, 0x08, 0x88, 0x00, 0x88, 0x88, 0x80, //# ### ##### +0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, //#### +//Level: 43 +0x07, 0x09,//Size x and y +0x88, 0x88, 0x88, 0x80, //####### +0x80, 0x05, 0x02, 0x80, //# * @# +0x80, 0x45, 0x40, 0x80, //# $*$ # +0x80, 0x01, 0x00, 0x80, //# . # +0x80, 0x45, 0x40, 0x80, //# $*$ # +0x84, 0x15, 0x10, 0x80, //#$.*. # +0x81, 0x01, 0x41, 0x80, //#. .$.# +0x80, 0x41, 0x00, 0x80, //# $. # +0x88, 0x88, 0x88, 0x80, //####### +//Level: 44 +0x13, 0x0C,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, // ########### +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, // # # +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x40, 0x40, 0x08, 0x00, // # $ $ # +0x88, 0x88, 0x88, 0x08, 0x04, 0x08, 0x88, 0x88, 0x08, 0x00, //###### # $ ##### # +0x80, 0x00, 0x08, 0x88, 0x88, 0x04, 0x00, 0x88, 0x48, 0x00, //# ##### $ ##$# +0x80, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x08, 0x00, //# $ $ # +0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x88, 0x08, 0x00, //# ## ## # +0x80, 0x00, 0x08, 0x82, 0x88, 0x88, 0x80, 0x88, 0x08, 0x00, //# ##@##### ## # +0x80, 0x00, 0x08, 0x88, 0x80, 0x00, 0x80, 0x88, 0x08, 0x80, //# #### # ## ## +0x81, 0x11, 0x18, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x80, //#....# # $ # +0x81, 0x11, 0x18, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, //#....# # # +0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x80, //###### ####### +//Level: 45 +0x12, 0x0C,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x88, 0x88, // ##### #### +0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x88, 0x80, 0x08, // # #### # +0x08, 0x88, 0x88, 0x88, 0x08, 0x00, 0x04, 0x04, 0x08, // ####### # $ $ # +0x08, 0x00, 0x08, 0x80, 0x04, 0x08, 0x80, 0x80, 0x08, // # ## $ ## # # +0x08, 0x04, 0x00, 0x01, 0x18, 0x18, 0x80, 0x40, 0x88, // # $ ..#.## $ ## +0x08, 0x04, 0x08, 0x81, 0x11, 0x10, 0x40, 0x80, 0x80, // # $ ##.... $ # # +0x08, 0x08, 0x00, 0x41, 0x11, 0x18, 0x80, 0x40, 0x80, // # # $....## $ # +0x88, 0x44, 0x08, 0x81, 0x81, 0x10, 0x00, 0x40, 0x80, //##$$ ##.#.. $ # +0x80, 0x08, 0x08, 0x80, 0x40, 0x08, 0x80, 0x20, 0x80, //# # ## $ ## @ # +0x80, 0x00, 0x00, 0x40, 0x80, 0x88, 0x88, 0x88, 0x80, //# $ # ####### +0x80, 0x08, 0x88, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, //# #### # +0x88, 0x88, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, //#### ##### +//Level: 46 +0x0A, 0x07,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x00, // ####### +0x08, 0x00, 0x00, 0x08, 0x88, // # ### +0x88, 0x48, 0x88, 0x00, 0x08, //##$### # +0x80, 0x20, 0x40, 0x04, 0x08, //# @ $ $ # +0x80, 0x11, 0x80, 0x40, 0x88, //# ..# $ ## +0x88, 0x11, 0x80, 0x00, 0x80, //##..# # +0x08, 0x88, 0x88, 0x88, 0x80, // ######## +//Level: 47 +0x11, 0x0C,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // ######## +0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, // # # +0x00, 0x80, 0x04, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, // # $ ##### +0x00, 0x88, 0x88, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, // #### $ # +0x00, 0x80, 0x08, 0x84, 0x80, 0x40, 0x08, 0x00, 0x00, // # ##$# $ # +0x00, 0x80, 0x00, 0x02, 0x80, 0x80, 0x88, 0x88, 0x80, // # @# # ##### +0x08, 0x80, 0x88, 0x04, 0x04, 0x04, 0x40, 0x00, 0x80, // ## ## $ $ $$ # +0x08, 0x00, 0x08, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, // # # # # # +0x88, 0x00, 0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //## ############ +0x81, 0x11, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //#....# +0x81, 0x11, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //#....# +0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //###### +//Level: 48 +0x0F, 0x0D,//Size x and y +0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x80, // ######### +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, // # # +0x00, 0x00, 0x00, 0x84, 0x04, 0x44, 0x00, 0x80, // #$ $$$ # +0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x40, 0x80, // # # $ # +0x00, 0x00, 0x00, 0x80, 0x00, 0x42, 0x40, 0x80, // # $@$ # +0x00, 0x00, 0x88, 0x84, 0x04, 0x08, 0x08, 0x80, // ###$ $ # ## +0x00, 0x00, 0x80, 0x00, 0x48, 0x48, 0x08, 0x00, // # $#$# # +0x88, 0x88, 0x80, 0x80, 0x08, 0x00, 0x08, 0x00, //##### # # # +0x81, 0x11, 0x00, 0x80, 0x48, 0x08, 0x88, 0x00, //#... # $# ### +0x81, 0x11, 0x11, 0x00, 0x08, 0x08, 0x00, 0x00, //#..... # # +0x81, 0x11, 0x11, 0x80, 0x48, 0x08, 0x00, 0x00, //#.....# $# # +0x88, 0x88, 0x88, 0x88, 0x00, 0x08, 0x00, 0x00, //######## # +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, // ##### +//Level: 49 +0x0C, 0x07,//Size x and y +0x00, 0x88, 0x88, 0x80, 0x00, 0x00, // ##### +0x00, 0x80, 0x00, 0x88, 0x88, 0x88, // # ###### +0x88, 0x84, 0x81, 0x00, 0x00, 0x08, //###$#. # +0x80, 0x40, 0x11, 0x18, 0x04, 0x08, //# $ ...# $ # +0x82, 0x04, 0x18, 0x54, 0x00, 0x08, //#@ $.#*$ # +0x88, 0x88, 0x00, 0x00, 0x88, 0x88, //#### #### +0x00, 0x08, 0x88, 0x88, 0x80, 0x00, // ###### +//Level: 50 +0x07, 0x07,//Size x and y +0x08, 0x88, 0x88, 0x80, // ###### +0x88, 0x01, 0x02, 0x80, //## . @# +0x80, 0x40, 0x40, 0x80, //# $ $ # +0x81, 0x05, 0x01, 0x80, //#. * .# +0x80, 0x40, 0x40, 0x80, //# $ $ # +0x80, 0x01, 0x08, 0x80, //# . ## +0x88, 0x88, 0x88, 0x00, //###### +//Level: 51 +0x08, 0x07,//Size x and y +0x00, 0x00, 0x88, 0x88, // #### +0x00, 0x00, 0x82, 0x08, // #@ # +0x88, 0x88, 0x80, 0x18, //##### .# +0x80, 0x40, 0x40, 0x48, //# $ $ $# +0x80, 0x00, 0x10, 0x08, //# . # +0x88, 0x80, 0x10, 0x08, //### . # +0x00, 0x88, 0x88, 0x88, // ###### +//Level: 52 +0x13, 0x0D,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, // ################# +0x88, 0x82, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x80, //###@## ...# +0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x80, //# # ...# +0x80, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x80, //# $ # ...# +0x80, 0x44, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x80, //# $$ # ...# +0x88, 0x04, 0x08, 0x88, 0x48, 0x88, 0x88, 0x88, 0x88, 0x80, //## $ ###$########## +0x08, 0x08, 0x88, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, // # ### $ # +0x88, 0x00, 0x04, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, //## $ $ # +0x80, 0x04, 0x08, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, //# $ # $ # +0x80, 0x40, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, //# $ # # +0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, //# $ # # +0x80, 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, //# # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, //########### +//Level: 53 +0x10, 0x0C,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, // ###### +0x00, 0x08, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, // # ## +0x00, 0x08, 0x04, 0x04, 0x08, 0x80, 0x00, 0x00, // # $ $ ## +0x88, 0x88, 0x08, 0x48, 0x00, 0x88, 0x88, 0x00, //#### #$# #### +0x80, 0x40, 0x00, 0x04, 0x00, 0x80, 0x08, 0x88, //# $ $ # ### +0x80, 0x00, 0x04, 0x08, 0x04, 0x11, 0x11, 0x18, //# $ # $.....# +0x88, 0x80, 0x80, 0x88, 0x88, 0x11, 0x11, 0x18, //### # ####.....# +0x08, 0x80, 0x84, 0x04, 0x00, 0x11, 0x88, 0x88, // ## #$ $ ..#### +0x08, 0x00, 0x80, 0x00, 0x48, 0x00, 0x80, 0x00, // # # $# # +0x08, 0x24, 0x00, 0x40, 0x08, 0x88, 0x80, 0x00, // #@$ $ #### +0x08, 0x00, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, // # ###### +0x08, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // #### +//Level: 54 +0x0C, 0x06,//Size x and y +0x00, 0x00, 0x00, 0x88, 0x88, 0x00, // #### +0x00, 0x00, 0x00, 0x80, 0x08, 0x88, // # ### +0x88, 0x88, 0x88, 0x80, 0x00, 0x08, //####### # +0x80, 0x40, 0x51, 0x05, 0x14, 0x28, //# $ *. *.$@# +0x80, 0x00, 0x00, 0x80, 0x00, 0x08, //# # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //############ +//Level: 55 +0x0D, 0x0C,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x00, // ##### +0x08, 0x88, 0x88, 0x88, 0x00, 0x08, 0x80, // ####### ## +0x88, 0x08, 0x02, 0x88, 0x04, 0x40, 0x80, //## # @## $$ # +0x80, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, //# $ # +0x80, 0x04, 0x00, 0x88, 0x80, 0x00, 0x80, //# $ ### # +0x88, 0x80, 0x88, 0x88, 0x84, 0x88, 0x80, //### #####$### +0x80, 0x40, 0x08, 0x88, 0x01, 0x18, 0x00, //# $ ### ..# +0x80, 0x40, 0x40, 0x40, 0x11, 0x18, 0x00, //# $ $ $ ...# +0x80, 0x00, 0x08, 0x88, 0x11, 0x18, 0x00, //# ###...# +0x80, 0x44, 0x08, 0x08, 0x11, 0x18, 0x00, //# $$ # #...# +0x80, 0x08, 0x88, 0x08, 0x88, 0x88, 0x00, //# ### ##### +0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, //#### +//Level: 56 +0x0D, 0x0F,//Size x and y +0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, // #### +0x00, 0x88, 0x88, 0x80, 0x08, 0x00, 0x00, // ##### # +0x08, 0x80, 0x00, 0x00, 0x48, 0x00, 0x00, // ## $# +0x88, 0x04, 0x00, 0x88, 0x08, 0x88, 0x00, //## $ ## ### +0x82, 0x40, 0x40, 0x80, 0x40, 0x08, 0x00, //#@$ $ # $ # +0x88, 0x88, 0x08, 0x80, 0x00, 0x48, 0x00, //#### ## $# +0x08, 0x11, 0x11, 0x84, 0x04, 0x08, 0x00, // #....#$ $ # +0x08, 0x11, 0x11, 0x80, 0x00, 0x48, 0x00, // #....# $# +0x08, 0x11, 0x11, 0x00, 0x44, 0x08, 0x80, // #.... $$ ## +0x08, 0x11, 0x10, 0x80, 0x40, 0x00, 0x80, // #... # $ # +0x08, 0x88, 0x88, 0x84, 0x04, 0x00, 0x80, // ######$ $ # +0x00, 0x00, 0x00, 0x80, 0x00, 0x88, 0x80, // # ### +0x00, 0x00, 0x00, 0x84, 0x08, 0x88, 0x00, // #$ ### +0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, // # # +0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, // #### +//Level: 57 +0x0A, 0x08,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x00, // ####### +0x08, 0x11, 0x11, 0x08, 0x00, // #.... # +0x88, 0x81, 0x11, 0x48, 0x88, //###...$### +0x80, 0x04, 0x84, 0x04, 0x08, //# $#$ $ # +0x80, 0x44, 0x00, 0x84, 0x08, //# $$ #$ # +0x80, 0x00, 0x08, 0x00, 0x08, //# # # +0x88, 0x88, 0x02, 0x08, 0x88, //#### @ ### +0x00, 0x08, 0x88, 0x88, 0x00, // ##### +//Level: 58 +0x0D, 0x0A,//Size x and y +0x88, 0x88, 0x88, 0x00, 0x88, 0x88, 0x80, //###### ##### +0x80, 0x00, 0x08, 0x88, 0x80, 0x00, 0x80, //# #### # +0x80, 0x40, 0x00, 0x40, 0x00, 0x80, 0x80, //# $ $ # # +0x88, 0x00, 0x80, 0x88, 0x80, 0x40, 0x80, //## # ### $ # +0x08, 0x44, 0x00, 0x88, 0x84, 0x80, 0x80, // #$$ ###$# # +0x88, 0x00, 0x08, 0x00, 0x11, 0x10, 0x80, //## # ... # +0x80, 0x08, 0x04, 0x00, 0x41, 0x11, 0x80, //# # $ $...# +0x80, 0x08, 0x88, 0x88, 0x11, 0x88, 0x80, //# #####..### +0x80, 0x28, 0x00, 0x08, 0x88, 0x80, 0x00, //# @# #### +0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, //#### +//Level: 59 +0x0E, 0x0C,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x88, // ####### +0x00, 0x00, 0x88, 0x88, 0x11, 0x11, 0x18, // ####.....# +0x88, 0x88, 0x80, 0x00, 0x11, 0x11, 0x18, //##### .....# +0x80, 0x00, 0x80, 0x08, 0x10, 0x11, 0x18, //# # #. ...# +0x80, 0x42, 0x88, 0x08, 0x88, 0x08, 0x88, //# $@## ### ### +0x80, 0x04, 0x00, 0x04, 0x00, 0x44, 0x08, //# $ $ $$ # +0x80, 0x00, 0x84, 0x00, 0x04, 0x00, 0x08, //# #$ $ # +0x80, 0x40, 0x80, 0x88, 0x40, 0x04, 0x08, //# $ # ##$ $ # +0x88, 0x80, 0x00, 0x04, 0x08, 0x80, 0x08, //### $ ## # +0x00, 0x80, 0x40, 0x40, 0x40, 0x00, 0x88, // # $ $ $ ## +0x00, 0x88, 0x80, 0x00, 0x08, 0x88, 0x80, // ### #### +0x00, 0x00, 0x88, 0x88, 0x88, 0x00, 0x00, // ###### +//Level: 60 +0x0B, 0x0A,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x80, 0x00, // ###### +0x88, 0x88, 0x80, 0x00, 0x80, 0x00, //##### # +0x80, 0x40, 0x01, 0x00, 0x80, 0x00, //# $ . # +0x80, 0x40, 0x11, 0x88, 0x80, 0x00, //# $ ..### +0x82, 0x40, 0x44, 0x88, 0x80, 0x00, //#@$ $$### +0x88, 0x80, 0x14, 0x10, 0x88, 0x80, //### .$. ### +0x08, 0x84, 0x11, 0x14, 0x00, 0x80, // ##$...$ # +0x08, 0x04, 0x18, 0x80, 0x00, 0x80, // # $.## # +0x08, 0x00, 0x08, 0x88, 0x88, 0x80, // # ###### +0x08, 0x88, 0x88, 0x00, 0x00, 0x00, // ##### +//Level: 61 +0x07, 0x08,//Size x and y +0x88, 0x88, 0x80, 0x00, //##### +0x80, 0x00, 0x88, 0x80, //# ### +0x80, 0x04, 0x00, 0x80, //# $ # +0x88, 0x44, 0x01, 0x80, //##$$ .# +0x08, 0x20, 0x10, 0x80, // #@ . # +0x08, 0x80, 0x80, 0x80, // ## # # +0x00, 0x80, 0x01, 0x80, // # .# +0x00, 0x88, 0x88, 0x80, // ##### +//Level: 62 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x80, 0x00, 0x80, 0x08, //# # # +0x80, 0x81, 0x40, 0x48, //# #.$ $# +0x80, 0x00, 0x40, 0x08, //# $ # +0x88, 0x88, 0x81, 0x08, //#####. # +0x00, 0x80, 0x00, 0x28, // # @# +0x00, 0x80, 0x00, 0x18, // # .# +0x00, 0x88, 0x88, 0x88, // ###### +//Level: 63 +0x08, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x80, 0x08, 0x00, 0x08, //# # # +0x80, 0x41, 0x14, 0x08, //# $..$ # +0x82, 0x41, 0x50, 0x88, //#@$.* ## +0x80, 0x41, 0x14, 0x08, //# $..$ # +0x80, 0x08, 0x00, 0x08, //# # # +0x88, 0x88, 0x88, 0x88, //######## +//Level: 64 +0x0F, 0x0E,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, 0x00, // ##### +0x00, 0x08, 0x88, 0x00, 0x08, 0x00, 0x00, 0x00, // ### # +0x00, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, // # # # +0x08, 0x88, 0x00, 0x40, 0x08, 0x88, 0x88, 0x80, // ### $ ###### +0x08, 0x00, 0x84, 0x80, 0x08, 0x00, 0x00, 0x80, // # #$# # # +0x08, 0x40, 0x40, 0x88, 0x00, 0x04, 0x00, 0x80, // #$ $ ## $ # +0x88, 0x00, 0x80, 0x00, 0x04, 0x44, 0x88, 0x80, //## # $$$### +0x80, 0x00, 0x08, 0x88, 0x40, 0x00, 0x80, 0x00, //# ###$ # +0x80, 0x48, 0x44, 0x11, 0x18, 0x88, 0x80, 0x00, //# $#$$...#### +0x80, 0x00, 0x08, 0x11, 0x11, 0x80, 0x00, 0x00, //# #....# +0x80, 0x80, 0x20, 0x81, 0x11, 0x80, 0x00, 0x00, //# # @ #...# +0x80, 0x00, 0x00, 0x41, 0x11, 0x80, 0x00, 0x00, //# $...# +0x88, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, //## # # +0x08, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, // ########## +//Level: 65 +0x0B, 0x0A,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x80, 0x00, //######### +0x80, 0x00, 0x00, 0x00, 0x80, 0x00, //# # +0x80, 0x04, 0x04, 0x04, 0x80, 0x00, //# $ $ $# +0x88, 0x08, 0x48, 0x80, 0x80, 0x00, //## #$## # +0x08, 0x01, 0x10, 0x11, 0x88, 0x00, // # .. ..## +0x08, 0x81, 0x10, 0x11, 0x08, 0x00, // ##.. .. # +0x00, 0x80, 0x88, 0x48, 0x08, 0x80, // # ##$# ## +0x00, 0x84, 0x04, 0x04, 0x00, 0x80, // #$ $ $ # +0x00, 0x80, 0x00, 0x00, 0x02, 0x80, // # @# +0x00, 0x88, 0x88, 0x88, 0x88, 0x80, // ######### +//Level: 66 +0x09, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x00, //######## +0x81, 0x11, 0x11, 0x18, 0x00, //#......# +0x80, 0x04, 0x08, 0x08, 0x80, //# $ # ## +0x80, 0x40, 0x80, 0x40, 0x80, //# $ # $ # +0x88, 0x40, 0x40, 0x40, 0x80, //##$ $ $ # +0x08, 0x00, 0x20, 0x00, 0x80, // # @ # +0x08, 0x88, 0x88, 0x88, 0x80, // ######## +//Level: 67 +0x0A, 0x08,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x88, // ##### +0x88, 0x88, 0x88, 0x11, 0x18, //######...# +0x80, 0x00, 0x42, 0x04, 0x88, //# $@ $## +0x80, 0x04, 0x08, 0x04, 0x08, //# $ # $ # +0x81, 0x04, 0x08, 0x40, 0x08, //#. $ #$ # +0x80, 0x88, 0x88, 0x08, 0x18, //# #### #.# +0x81, 0x00, 0x00, 0x04, 0x18, //#. $.# +0x88, 0x88, 0x88, 0x88, 0x88, //########## +//Level: 68 +0x0B, 0x07,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x88, 0x80, // ######## +0x88, 0x88, 0x20, 0x00, 0x10, 0x80, //####@ . # +0x80, 0x04, 0x04, 0x04, 0x10, 0x80, //# $ $ $. # +0x80, 0x01, 0x88, 0x80, 0x18, 0x80, //# .### .## +0x80, 0x41, 0x40, 0x40, 0x08, 0x00, //# $.$ $ # +0x80, 0x01, 0x00, 0x88, 0x88, 0x00, //# . #### +0x88, 0x88, 0x88, 0x80, 0x00, 0x00, //####### +//Level: 69 +0x08, 0x08,//Size x and y +0x00, 0x08, 0x88, 0x88, // ##### +0x00, 0x08, 0x02, 0x08, // # @ # +0x08, 0x88, 0x00, 0x08, // ### # +0x08, 0x04, 0x04, 0x88, // # $ $## +0x88, 0x04, 0x00, 0x80, //## $ # +0x81, 0x00, 0x80, 0x80, //#. # # +0x81, 0x10, 0x00, 0x80, //#.. # +0x88, 0x88, 0x88, 0x80, //####### +//Level: 70 +0x10, 0x0E,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, // ########## +0x00, 0x08, 0x11, 0x00, 0x80, 0x00, 0x80, 0x00, // #.. # # +0x00, 0x08, 0x11, 0x00, 0x00, 0x00, 0x80, 0x00, // #.. # +0x00, 0x08, 0x11, 0x00, 0x80, 0x08, 0x88, 0x80, // #.. # #### +0x00, 0x88, 0x88, 0x88, 0x80, 0x08, 0x00, 0x88, // ####### # ## +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, // # # +0x00, 0x80, 0x08, 0x00, 0x88, 0x00, 0x80, 0x08, // # # ## # # +0x88, 0x88, 0x08, 0x80, 0x08, 0x88, 0x80, 0x88, //#### ## #### ## +0x80, 0x04, 0x00, 0x88, 0x88, 0x80, 0x80, 0x08, //# $ ##### # # +0x80, 0x80, 0x40, 0x04, 0x00, 0x80, 0x40, 0x08, //# # $ $ # $ # +0x80, 0x24, 0x00, 0x40, 0x00, 0x80, 0x00, 0x88, //# @$ $ # ## +0x88, 0x88, 0x08, 0x80, 0x88, 0x88, 0x88, 0x80, //#### ## ####### +0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, // # # +0x00, 0x08, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, // ###### +//Level: 71 +0x0A, 0x09,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x88, // ######## +0x00, 0x80, 0x00, 0x81, 0x08, // # #. # +0x08, 0x80, 0x04, 0x11, 0x18, // ## $...# +0x08, 0x00, 0x40, 0x85, 0x18, // # $ #*.# +0x88, 0x08, 0x84, 0x80, 0x88, //## ##$# ## +0x80, 0x00, 0x40, 0x04, 0x08, //# $ $ # +0x80, 0x00, 0x80, 0x00, 0x08, //# # # +0x88, 0x88, 0x88, 0x82, 0x08, //#######@ # +0x00, 0x00, 0x00, 0x88, 0x88, // #### +//Level: 72 +0x13, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, //############# +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, //# # +0x80, 0x88, 0x80, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, //# ### $$ # +0x80, 0x00, 0x80, 0x40, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, //# # $ $ # +0x80, 0x04, 0x88, 0x88, 0x48, 0x88, 0x88, 0x80, 0x00, 0x00, //# $####$###### +0x80, 0x40, 0x88, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x80, //# $ ## ##### +0x80, 0x04, 0x40, 0x40, 0x00, 0x00, 0x00, 0x01, 0x11, 0x80, //# $$ $ ...# +0x88, 0x80, 0x88, 0x04, 0x48, 0x00, 0x00, 0x01, 0x11, 0x80, //### ## $$# ...# +0x00, 0x80, 0x88, 0x00, 0x08, 0x00, 0x00, 0x01, 0x11, 0x80, // # ## # ...# +0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x11, 0x80, // # # ...# +0x00, 0x88, 0x82, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, // ###@############# +0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ### +//Level: 73 +0x11, 0x0D,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // ###### +0x08, 0x88, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, // #### # +0x08, 0x00, 0x00, 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, // # ## # +0x08, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, // # $ # +0x88, 0x80, 0x88, 0x88, 0x08, 0x88, 0x88, 0x88, 0x80, //### #### ######## +0x80, 0x04, 0x00, 0x04, 0x08, 0x80, 0x01, 0x11, 0x80, //# $ $ ## ...# +0x80, 0x00, 0x44, 0x04, 0x40, 0x00, 0x01, 0x11, 0x80, //# $$ $$ ...# +0x80, 0x00, 0x04, 0x00, 0x48, 0x80, 0x01, 0x11, 0x80, //# $ $## ...# +0x88, 0x28, 0x80, 0x88, 0x08, 0x80, 0x01, 0x11, 0x80, //##@## ## ## ...# +0x08, 0x88, 0x00, 0x40, 0x08, 0x88, 0x88, 0x88, 0x80, // ### $ ######## +0x08, 0x00, 0x04, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, // # $$ # +0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, // # # # +0x08, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // ######### +//Level: 74 +0x0F, 0x0F,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############### +0x80, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x80, //# ##### # +0x80, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x80, //# . . # +0x81, 0x81, 0x88, 0x08, 0x81, 0x88, 0x80, 0x80, //#.#.## ##.### # +0x81, 0x11, 0x00, 0x40, 0x01, 0x11, 0x10, 0x80, //#... $ .... # +0x88, 0x11, 0x08, 0x08, 0x01, 0x18, 0x80, 0x80, //##.. # # ..## # +0x88, 0x88, 0x88, 0x08, 0x88, 0x88, 0x80, 0x80, //###### ###### # +0x80, 0x00, 0x08, 0x08, 0x00, 0x00, 0x80, 0x80, //# # # # # +0x80, 0x44, 0x08, 0x48, 0x04, 0x40, 0x80, 0x80, //# $$ #$# $$ # # +0x80, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, //# $ $ $ $ $ # # +0x80, 0x44, 0x08, 0x48, 0x04, 0x40, 0x80, 0x80, //# $$ #$# $$ # # +0x80, 0x00, 0x08, 0x28, 0x00, 0x00, 0x80, 0x80, //# #@# # # +0x80, 0x88, 0x88, 0x08, 0x88, 0x08, 0x80, 0x80, //# #### ### ## # +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, //# # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############### +//Level: 75 +0x09, 0x09,//Size x and y +0x88, 0x88, 0x80, 0x00, 0x00, //##### +0x82, 0x00, 0x80, 0x00, 0x00, //#@ # +0x80, 0x44, 0x80, 0x88, 0x80, //# $$# ### +0x80, 0x40, 0x80, 0x81, 0x80, //# $ # #.# +0x88, 0x80, 0x88, 0x81, 0x80, //### ###.# +0x08, 0x80, 0x00, 0x01, 0x80, // ## .# +0x08, 0x00, 0x08, 0x00, 0x80, // # # # +0x08, 0x00, 0x08, 0x88, 0x80, // # #### +0x08, 0x88, 0x88, 0x00, 0x00, // ##### +//Level: 76 +0x0A, 0x09,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, //########## +0x81, 0x10, 0x00, 0x00, 0x08, //#.. # +0x81, 0x14, 0x00, 0x80, 0x08, //#..$ # # +0x80, 0x08, 0x48, 0x80, 0x88, //# #$## ## +0x80, 0x40, 0x00, 0x00, 0x80, //# $ # +0x88, 0x88, 0x80, 0x80, 0x80, //##### # # +0x00, 0x80, 0x40, 0x20, 0x80, // # $ @ # +0x00, 0x80, 0x00, 0x00, 0x80, // # # +0x00, 0x88, 0x88, 0x88, 0x80, // ####### +//Level: 77 +0x0C, 0x0D,//Size x and y +0x08, 0x88, 0x80, 0x00, 0x00, 0x00, // #### +0x08, 0x00, 0x88, 0x88, 0x88, 0x00, // # ###### +0x08, 0x00, 0x00, 0x04, 0x28, 0x00, // # $@# +0x88, 0x08, 0x81, 0x88, 0x48, 0x00, //## ##.##$# +0x80, 0x08, 0x01, 0x08, 0x08, 0x88, //# # . # ### +0x80, 0x00, 0x51, 0x18, 0x00, 0x08, //# *..# # +0x88, 0x08, 0x01, 0x04, 0x08, 0x08, //## # . $ # # +0x88, 0x08, 0x81, 0x80, 0x04, 0x08, //## ##.# $ # +0x80, 0x08, 0x81, 0x80, 0x88, 0x88, //# ##.# #### +0x80, 0x44, 0x04, 0x80, 0x08, 0x00, //# $$ $# # +0x80, 0x08, 0x00, 0x00, 0x08, 0x00, //# # # +0x88, 0x88, 0x88, 0x80, 0x08, 0x00, //####### # +0x00, 0x00, 0x00, 0x88, 0x88, 0x00, // #### +//Level: 78 +0x0D, 0x0A,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, // ##### +0x00, 0x88, 0x80, 0x00, 0x88, 0x80, 0x00, // ### ### +0x08, 0x81, 0x40, 0x00, 0x00, 0x88, 0x00, // ##.$ ## +0x08, 0x10, 0x44, 0x44, 0x40, 0x08, 0x00, // #. $$$$$ # +0x88, 0x00, 0x80, 0x00, 0x80, 0x08, 0x80, //## # # ## +0x80, 0x08, 0x58, 0x28, 0x58, 0x00, 0x80, //# #*#@#*# # +0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, //# # # # +0x88, 0x01, 0x44, 0x44, 0x41, 0x08, 0x80, //## .$$$$$. ## +0x08, 0x81, 0x11, 0x11, 0x11, 0x88, 0x00, // ##.......## +0x00, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, // ######### +//Level: 79 +0x10, 0x09,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x00, // ##### +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, // # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x05, 0x08, 0x88, //########## * ### +0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, //# . # +0x80, 0x44, 0x44, 0x55, 0x55, 0x41, 0x11, 0x28, //# $$$$****$...@# +0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, //# . # +0x88, 0x88, 0x88, 0x88, 0x88, 0x05, 0x08, 0x88, //########## * ### +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, // # # +0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x00, // ##### +//Level: 80 +0x11, 0x0D,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, //################ +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, //# # +0x80, 0x80, 0x88, 0x88, 0x88, 0x00, 0x00, 0x08, 0x00, //# # ###### # +0x80, 0x80, 0x04, 0x04, 0x04, 0x04, 0x80, 0x08, 0x00, //# # $ $ $ $# # +0x80, 0x80, 0x00, 0x42, 0x40, 0x00, 0x88, 0x08, 0x80, //# # $@$ ## ## +0x80, 0x80, 0x04, 0x04, 0x04, 0x88, 0x81, 0x11, 0x80, //# # $ $ $###...# +0x80, 0x80, 0x00, 0x40, 0x40, 0x08, 0x81, 0x11, 0x80, //# # $ $ ##...# +0x80, 0x88, 0x84, 0x44, 0x04, 0x08, 0x81, 0x11, 0x80, //# ###$$$ $ ##...# +0x80, 0x00, 0x00, 0x80, 0x88, 0x08, 0x81, 0x11, 0x80, //# # ## ##...# +0x88, 0x88, 0x80, 0x00, 0x88, 0x08, 0x81, 0x11, 0x80, //##### ## ##...# +0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x88, 0x80, // ##### ### +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, // # # +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x80, 0x00, // ####### +//Level: 81 +0x06, 0x08,//Size x and y +0x08, 0x88, 0x80, // #### +0x88, 0x00, 0x80, //## # +0x82, 0x40, 0x80, //#@$ # +0x88, 0x40, 0x88, //##$ ## +0x88, 0x04, 0x08, //## $ # +0x81, 0x40, 0x08, //#.$ # +0x81, 0x15, 0x18, //#..*.# +0x88, 0x88, 0x88, //###### +//Level: 82 +0x0E, 0x0C,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x88, 0x00, 0x00, // ###### +0x00, 0x88, 0x80, 0x00, 0x08, 0x88, 0x00, // ### ### +0x00, 0x80, 0x00, 0x84, 0x00, 0x08, 0x88, // # #$ ### +0x00, 0x80, 0x00, 0x40, 0x00, 0x44, 0x08, // # $ $$ # +0x00, 0x80, 0x44, 0x08, 0x40, 0x00, 0x08, // # $$ #$ # +0x00, 0x88, 0x00, 0x04, 0x00, 0x04, 0x08, // ## $ $ # +0x88, 0x88, 0x88, 0x08, 0x48, 0x88, 0x88, //###### #$##### +0x81, 0x12, 0x08, 0x40, 0x08, 0x00, 0x00, //#..@ #$ # +0x81, 0x81, 0x10, 0x04, 0x88, 0x00, 0x00, //#.#.. $## +0x81, 0x11, 0x14, 0x80, 0x80, 0x00, 0x00, //#....$# # +0x81, 0x11, 0x10, 0x00, 0x80, 0x00, 0x00, //#.... # +0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, //######### +//Level: 83 +0x0D, 0x0A,//Size x and y +0x00, 0x08, 0x88, 0x80, 0x00, 0x00, 0x00, // #### +0x88, 0x88, 0x00, 0x88, 0x88, 0x88, 0x00, //#### ###### +0x80, 0x00, 0x00, 0x88, 0x00, 0x08, 0x00, //# ## # +0x80, 0x48, 0x04, 0x00, 0x00, 0x48, 0x00, //# $# $ $# +0x88, 0x08, 0x88, 0x04, 0x80, 0x08, 0x00, //## ### $# # +0x08, 0x04, 0x04, 0x00, 0x88, 0x08, 0x00, // # $ $ ## # +0x08, 0x00, 0x04, 0x08, 0x80, 0x08, 0x80, // # $ ## ## +0x08, 0x40, 0x81, 0x11, 0x50, 0x40, 0x80, // #$ #...* $ # +0x08, 0x02, 0x80, 0x11, 0x11, 0x11, 0x80, // # @# ......# +0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, // ############ +//Level: 84 +0x08, 0x08,//Size x and y +0x00, 0x88, 0x88, 0x00, // #### +0x00, 0x80, 0x08, 0x00, // # # +0x00, 0x80, 0x08, 0x88, // # ### +0x88, 0x80, 0x11, 0x08, //### .. # +0x80, 0x04, 0x80, 0x08, //# $# # +0x80, 0x01, 0x44, 0x08, //# .$$ # +0x88, 0x88, 0x02, 0x08, //#### @ # +0x00, 0x08, 0x88, 0x88, // ##### +//Level: 85 +0x08, 0x08,//Size x and y +0x08, 0x88, 0x88, 0x80, // ###### +0x08, 0x20, 0x00, 0x88, // #@ ## +0x08, 0x84, 0x00, 0x08, // ##$ # +0x88, 0x80, 0x10, 0x08, //### . # +0x80, 0x40, 0x84, 0x88, //# $ #$## +0x80, 0x10, 0x01, 0x80, //# . .# +0x88, 0x88, 0x00, 0x80, //#### # +0x00, 0x08, 0x88, 0x80, // #### +//Level: 86 +0x0F, 0x0F,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, //######### +0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, //# # +0x80, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, //# #### +0x88, 0x08, 0x88, 0x80, 0x80, 0x08, 0x00, 0x00, //## #### # # +0x88, 0x08, 0x28, 0x80, 0x00, 0x08, 0x00, 0x00, //## #@## # +0x80, 0x44, 0x40, 0x40, 0x04, 0x48, 0x00, 0x00, //# $$$ $ $$# +0x80, 0x08, 0x08, 0x80, 0x40, 0x08, 0x00, 0x00, //# # ## $ # +0x80, 0x08, 0x08, 0x80, 0x04, 0x08, 0x88, 0x80, //# # ## $ #### +0x88, 0x88, 0x00, 0x44, 0x40, 0x48, 0x00, 0x80, //#### $$$ $# # +0x08, 0x00, 0x08, 0x80, 0x00, 0x11, 0x11, 0x80, // # ## ....# +0x08, 0x08, 0x00, 0x08, 0x08, 0x11, 0x01, 0x80, // # # # #.. .# +0x08, 0x00, 0x08, 0x08, 0x08, 0x81, 0x11, 0x80, // # # # ##...# +0x08, 0x88, 0x88, 0x04, 0x00, 0x81, 0x11, 0x80, // ##### $ #...# +0x00, 0x00, 0x08, 0x80, 0x00, 0x88, 0x88, 0x80, // ## ##### +0x00, 0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, // ##### +//Level: 87 +0x13, 0x0F,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, // ##### +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x08, 0x80, 0x00, // ## ## +0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x80, 0x00, // ## # +0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x44, 0x00, 0x80, 0x00, // ## $$ # +0x00, 0x00, 0x00, 0x08, 0x80, 0x44, 0x00, 0x40, 0x80, 0x00, // ## $$ $ # +0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x40, 0x80, 0x00, // # $ $ # +0x88, 0x88, 0x00, 0x08, 0x00, 0x04, 0x40, 0x88, 0x88, 0x80, //#### # $$ ##### +0x80, 0x08, 0x88, 0x88, 0x88, 0x80, 0x88, 0x00, 0x00, 0x80, //# ######## ## # +0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x42, 0x80, //#. $$$@# +0x81, 0x80, 0x88, 0x88, 0x88, 0x80, 0x88, 0x00, 0x08, 0x80, //#.# ####### ## ## +0x81, 0x80, 0x88, 0x88, 0x88, 0x81, 0x08, 0x40, 0x48, 0x80, //#.# #######. #$ $## +0x81, 0x11, 0x11, 0x11, 0x11, 0x11, 0x08, 0x00, 0x00, 0x80, //#........... # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, 0x40, 0x80, //############## $ # +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x08, 0x80, // ## ## +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, // #### +//Level: 88 +0x0D, 0x0D,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############# +0x80, 0x01, 0x01, 0x01, 0x01, 0x00, 0x80, //# . . . . # +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, //# # # # # # # +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, //# # # # # # # +0x81, 0x40, 0x80, 0x40, 0x80, 0x41, 0x80, //#.$ # $ # $.# +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, //# # # # # # # +0x80, 0x84, 0x44, 0x84, 0x44, 0x80, 0x80, //# #$$$#$$$# # +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, //# # # # # # # +0x81, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, //#.$ # $ # $ # +0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, //# # # # # #.# +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, //# # # # # # # +0x80, 0x01, 0x01, 0x21, 0x01, 0x00, 0x80, //# . .@. . # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############# +//Level: 89 +0x0A, 0x06,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x88, // ######### +0x88, 0x20, 0x00, 0x00, 0x08, //##@ # +0x80, 0x00, 0x84, 0x84, 0x08, //# #$#$ # +0x80, 0x44, 0x00, 0x14, 0x18, //# $$ .$.# +0x80, 0x08, 0x88, 0x11, 0x18, //# ###...# +0x88, 0x88, 0x08, 0x88, 0x88, //#### ##### +//Level: 90 +0x11, 0x0D,//Size x and y +0x88, 0x88, 0x88, 0x80, 0x88, 0x88, 0x88, 0x88, 0x80, //####### ######### +0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x88, 0x00, 0x80, //# # # ## # +0x80, 0x88, 0x80, 0x80, 0x80, 0x00, 0x40, 0x00, 0x80, //# ### # # $ # +0x80, 0x80, 0x40, 0x88, 0x80, 0x00, 0x40, 0x00, 0x80, //# # $ ### $ # +0x80, 0x00, 0x44, 0x00, 0x00, 0x00, 0x88, 0x40, 0x80, //# $$ ##$ # +0x80, 0x00, 0x08, 0x88, 0x80, 0x00, 0x88, 0x00, 0x80, //# #### ## # +0x82, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x08, 0x80, //#@############ ## +0x88, 0x81, 0x10, 0x00, 0x08, 0x88, 0x88, 0x40, 0x80, //###.. #####$ # +0x00, 0x81, 0x10, 0x00, 0x08, 0x88, 0x80, 0x00, 0x80, // #.. #### # +0x00, 0x81, 0x10, 0x00, 0x00, 0x00, 0x44, 0x00, 0x80, // #.. $$ # +0x00, 0x81, 0x10, 0x00, 0x08, 0x88, 0x80, 0x40, 0x80, // #.. #### $ # +0x00, 0x81, 0x10, 0x00, 0x08, 0x00, 0x80, 0x00, 0x80, // #.. # # # +0x00, 0x88, 0x88, 0x88, 0x88, 0x00, 0x88, 0x88, 0x80, // ######## ##### +//Level: 91 +0x10, 0x0D,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x88, // ######### +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, // # # +0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, // # # # # # +0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x48, 0x08, // # $ $# # +0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, // # $ # +0x00, 0x00, 0x00, 0x08, 0x80, 0x40, 0x48, 0x08, // ## $ $# # +0x08, 0x88, 0x00, 0x00, 0x80, 0x40, 0x40, 0x08, // ### # $ $ # +0x88, 0x18, 0x88, 0x88, 0x80, 0x88, 0x88, 0x88, //##.###### ###### +0x81, 0x11, 0x00, 0x80, 0x40, 0x40, 0x80, 0x00, //#... # $ $ # +0x88, 0x11, 0x00, 0x00, 0x04, 0x00, 0x80, 0x00, //##.. $ # +0x81, 0x11, 0x00, 0x80, 0x02, 0x88, 0x80, 0x00, //#... # @### +0x88, 0x18, 0x88, 0x80, 0x08, 0x80, 0x00, 0x00, //##.#### ## +0x08, 0x88, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, // ### #### +//Level: 92 +0x12, 0x0F,//Size x and y +0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, // ########### +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x88, // # # ## +0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x01, 0x18, // # $ ..# +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x81, 0x18, // # #$#..# +0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x01, 0x18, // ########### ..# +0x00, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x18, // # $ ..# +0x00, 0x80, 0x80, 0x80, 0x48, 0x80, 0x80, 0x81, 0x18, // # # # $## # #..# +0x00, 0x80, 0x00, 0x84, 0x00, 0x00, 0x80, 0x01, 0x18, // # #$ # ..# +0x08, 0x84, 0x80, 0x40, 0x88, 0x88, 0x88, 0x80, 0x08, // ##$# $ ####### # +0x88, 0x00, 0x04, 0x00, 0x80, 0x00, 0x08, 0x04, 0x08, //## $ # # $ # +0x80, 0x00, 0x48, 0x00, 0x80, 0x00, 0x08, 0x00, 0x08, //# $# # # # +0x80, 0x04, 0x00, 0x08, 0x80, 0x00, 0x08, 0x88, 0x88, //# $ ## ##### +0x80, 0x48, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, //# $##### +0x80, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //# @# +0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //#### +//Level: 93 +0x12, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //################## +0x80, 0x00, 0x00, 0x00, 0x00, 0x88, 0x08, 0x11, 0x18, //# ## #...# +0x80, 0x40, 0x44, 0x80, 0x00, 0x04, 0x08, 0x11, 0x18, //# $ $$# $ #...# +0x80, 0x40, 0x00, 0x84, 0x88, 0x44, 0x08, 0x11, 0x18, //# $ #$##$$ #...# +0x80, 0x44, 0x84, 0x00, 0x00, 0x00, 0x02, 0x11, 0x18, //# $$#$ @...# +0x80, 0x40, 0x40, 0x48, 0x40, 0x88, 0x88, 0x00, 0x18, //# $ $ $#$ #### .# +0x80, 0x00, 0x88, 0x00, 0x00, 0x00, 0x04, 0x11, 0x18, //# ## $...# +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //################## +//Level: 94 +0x0A, 0x0A,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x80, //######### +0x80, 0x00, 0x88, 0x00, 0x80, //# ## # +0x80, 0x80, 0x40, 0x40, 0x80, //# # $ $ # +0x80, 0x05, 0x18, 0x00, 0x80, //# *.# # +0x88, 0x08, 0x12, 0x18, 0x80, //## #.@.## +0x88, 0x48, 0x88, 0x58, 0x88, //##$###*### +0x80, 0x00, 0x00, 0x00, 0x08, //# # +0x80, 0x00, 0x88, 0x08, 0x08, //# ## # # +0x88, 0x88, 0x88, 0x00, 0x08, //###### # +0x00, 0x00, 0x08, 0x88, 0x88, // ##### +//Level: 95 +0x0E, 0x0D,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, // ######## +0x00, 0x80, 0x00, 0x80, 0x08, 0x88, 0x00, // # # ### +0x88, 0x80, 0x80, 0x40, 0x04, 0x08, 0x88, //### # $ $ ### +0x80, 0x00, 0x08, 0x44, 0x08, 0x00, 0x08, //# #$$ # # +0x80, 0x88, 0x48, 0x00, 0x20, 0x04, 0x08, //# ##$# @ $ # +0x80, 0x00, 0x04, 0x48, 0x88, 0x40, 0x88, //# $$###$ ## +0x80, 0x00, 0x48, 0x08, 0x80, 0x08, 0x80, //# $# ## ## +0x80, 0x84, 0x08, 0x01, 0x11, 0x88, 0x00, //# #$ # ...## +0x80, 0x40, 0x81, 0x11, 0x11, 0x80, 0x00, //# $ #.....# +0x88, 0x00, 0x11, 0x11, 0x18, 0x80, 0x00, //## .....## +0x08, 0x04, 0x80, 0x88, 0x88, 0x00, 0x00, // # $# #### +0x08, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, // ## # +0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, // ##### +//Level: 96 +0x0C, 0x08,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, // ##### +0x88, 0x88, 0x88, 0x88, 0x00, 0x08, //######## # +0x80, 0x11, 0x11, 0x11, 0x40, 0x08, //# ......$ # +0x80, 0x08, 0x48, 0x88, 0x00, 0x08, //# #$### # +0x88, 0x04, 0x24, 0x08, 0x00, 0x08, //## $@$ # # +0x08, 0x04, 0x04, 0x08, 0x00, 0x08, // # $ $ # # +0x08, 0x00, 0x00, 0x08, 0x88, 0x88, // # ##### +0x08, 0x88, 0x88, 0x88, 0x00, 0x00, // ####### +//Level: 97 +0x14, 0x09,//Size x and y +0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //###### +0x80, 0x00, 0x08, 0x88, 0x00, 0x00, 0x08, 0x88, 0x88, 0x80, //# ### ###### +0x80, 0x80, 0x04, 0x08, 0x00, 0x88, 0x88, 0x00, 0x11, 0x80, //# # $ # #### ..# +0x80, 0x80, 0x04, 0x08, 0x88, 0x82, 0x88, 0x00, 0x11, 0x88, //# # $ ####@## ..## +0x80, 0x04, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x18, //# $$$ $ ...# +0x88, 0x80, 0x04, 0x00, 0x48, 0x88, 0x88, 0x00, 0x11, 0x88, //### $ $##### ..## +0x00, 0x84, 0x04, 0x04, 0x08, 0x00, 0x08, 0x00, 0x11, 0x80, // #$ $ $ # # ..# +0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x08, 0x88, 0x88, 0x80, // # # ###### +0x00, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, // ######## +//Level: 98 +0x0F, 0x0E,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, // ##### +0x88, 0x88, 0x80, 0x00, 0x88, 0x88, 0x88, 0x00, //##### ###### +0x80, 0x00, 0x00, 0x80, 0x08, 0x80, 0x08, 0x80, //# # ## ## +0x80, 0x80, 0x44, 0x00, 0x04, 0x00, 0x00, 0x80, //# # $$ $ # +0x80, 0x08, 0x00, 0x08, 0x80, 0x80, 0x80, 0x80, //# # ## # # # +0x80, 0x40, 0x80, 0x88, 0x00, 0x04, 0x00, 0x80, //# $ # ## $ # +0x80, 0x00, 0x04, 0x04, 0x00, 0x08, 0x08, 0x80, //# $ $ # ## +0x88, 0x04, 0x08, 0x00, 0x84, 0x88, 0x08, 0x00, //## $ # #$## # +0x08, 0x88, 0x00, 0x80, 0x80, 0x80, 0x48, 0x00, // ### # # # $# +0x00, 0x08, 0x04, 0x00, 0x20, 0x11, 0x18, 0x00, // # $ @ ...# +0x00, 0x08, 0x04, 0x88, 0x48, 0x11, 0x18, 0x00, // # $##$#...# +0x00, 0x08, 0x80, 0x00, 0x11, 0x11, 0x88, 0x00, // ## ....## +0x00, 0x00, 0x88, 0x80, 0x11, 0x18, 0x80, 0x00, // ### ...## +0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x00, 0x00, // ###### +//Level: 99 +0x0B, 0x0A,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x88, 0x00, // ######### +0x08, 0x00, 0x00, 0x00, 0x08, 0x80, // # ## +0x08, 0x40, 0x88, 0x88, 0x00, 0x80, // #$ #### # +0x88, 0x08, 0x01, 0x50, 0x80, 0x80, //## # .* # # +0x80, 0x00, 0x45, 0x10, 0x80, 0x80, //# $*. # # +0x80, 0x84, 0x21, 0x50, 0x80, 0x80, //# #$@.* # # +0x80, 0x00, 0x04, 0x00, 0x00, 0x80, //# $ # +0x88, 0x88, 0x48, 0x84, 0x08, 0x80, //####$##$ ## +0x00, 0x08, 0x01, 0x11, 0x08, 0x00, // # ... # +0x00, 0x08, 0x88, 0x88, 0x88, 0x00, // ####### +//Level: 100 +0x09, 0x0C,//Size x and y +0x00, 0x88, 0x88, 0x80, 0x00, // ##### +0x00, 0x80, 0x20, 0x80, 0x00, // # @ # +0x00, 0x80, 0x40, 0x80, 0x00, // # $ # +0x88, 0x80, 0x10, 0x88, 0x80, //### . ### +0x80, 0x00, 0x50, 0x00, 0x80, //# * # +0x80, 0x55, 0x55, 0x50, 0x80, //# ***** # +0x80, 0x00, 0x50, 0x00, 0x80, //# * # +0x88, 0x84, 0x54, 0x88, 0x80, //###$*$### +0x00, 0x80, 0x10, 0x80, 0x00, // # . # +0x00, 0x80, 0x50, 0x80, 0x00, // # * # +0x00, 0x80, 0x10, 0x80, 0x00, // # . # +0x00, 0x88, 0x88, 0x80, 0x00, // ##### +//Level: 101 +0x11, 0x0D,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, // ##### +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x88, 0x88, 0x80, // # ##### +0x00, 0x00, 0x00, 0x00, 0x80, 0x84, 0x88, 0x00, 0x80, // # #$## # +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, // # $ # +0x88, 0x88, 0x88, 0x88, 0x80, 0x88, 0x80, 0x00, 0x80, //######### ### # +0x81, 0x11, 0x10, 0x08, 0x80, 0x40, 0x04, 0x88, 0x80, //#.... ## $ $### +0x81, 0x11, 0x10, 0x00, 0x04, 0x04, 0x40, 0x88, 0x00, //#.... $ $$ ## +0x81, 0x11, 0x10, 0x08, 0x84, 0x00, 0x40, 0x28, 0x00, //#.... ##$ $ @# +0x88, 0x88, 0x88, 0x88, 0x80, 0x04, 0x00, 0x88, 0x00, //######### $ ## +0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x08, 0x00, // # $ $ # +0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x88, 0x08, 0x00, // ### ## # +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, // # # +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x00, // ###### +//Level: 102 +0x13, 0x0F,//Size x and y +0x08, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ##### +0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // # # +0x08, 0x08, 0x08, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // # # ####### +0x08, 0x00, 0x00, 0x00, 0x42, 0x88, 0x88, 0x88, 0x00, 0x00, // # $@###### +0x08, 0x04, 0x08, 0x84, 0x08, 0x88, 0x00, 0x08, 0x00, 0x00, // # $ ##$ ### # +0x08, 0x08, 0x88, 0x80, 0x40, 0x00, 0x04, 0x08, 0x00, 0x00, // # #### $ $ # +0x08, 0x08, 0x88, 0x88, 0x08, 0x00, 0x84, 0x08, 0x88, 0x80, // # ##### # #$ #### +0x88, 0x00, 0x88, 0x88, 0x08, 0x84, 0x00, 0x00, 0x00, 0x80, //## #### ##$ # +0x80, 0x04, 0x80, 0x04, 0x00, 0x80, 0x88, 0x08, 0x80, 0x80, //# $# $ # ## ## # +0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x81, 0x11, 0x80, 0x80, //# # #...# # +0x88, 0x88, 0x88, 0x00, 0x88, 0x80, 0x01, 0x11, 0x00, 0x80, //###### ### ... # +0x00, 0x00, 0x08, 0x88, 0x80, 0x80, 0x81, 0x11, 0x80, 0x80, // #### # #...# # +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x88, 0x80, 0x80, 0x80, // # ### # # +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, // # # +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x80, // ######### +//Level: 103 +0x08, 0x07,//Size x and y +0x00, 0x88, 0x88, 0x88, // ###### +0x00, 0x80, 0x00, 0x08, // # # +0x88, 0x84, 0x44, 0x08, //###$$$ # +0x82, 0x04, 0x11, 0x08, //#@ $.. # +0x80, 0x41, 0x11, 0x88, //# $...## +0x88, 0x88, 0x00, 0x80, //#### # +0x00, 0x08, 0x88, 0x80, // #### +//Level: 104 +0x0C, 0x10,//Size x and y +0x88, 0x88, 0x88, 0x80, 0x00, 0x00, //####### +0x80, 0x11, 0x11, 0x80, 0x00, 0x00, //# ....# +0x80, 0x11, 0x11, 0x80, 0x00, 0x00, //# ....# +0x80, 0x11, 0x11, 0x80, 0x00, 0x00, //# ....# +0x88, 0x48, 0x88, 0x88, 0x88, 0x88, //##$######### +0x80, 0x40, 0x40, 0x00, 0x00, 0x08, //# $ $ # +0x80, 0x00, 0x80, 0x00, 0x00, 0x08, //# # # +0x88, 0x80, 0x80, 0x44, 0x04, 0x08, //### # $$ $ # +0x00, 0x80, 0x80, 0x00, 0x84, 0x08, // # # #$ # +0x00, 0x80, 0x80, 0x44, 0x00, 0x08, // # # $$ # +0x00, 0x80, 0x80, 0x80, 0x44, 0x08, // # # # $$ # +0x00, 0x80, 0x80, 0x04, 0x08, 0x88, // # # $ ### +0x00, 0x80, 0x88, 0x80, 0x08, 0x00, // # ### # +0x00, 0x80, 0x00, 0x08, 0x28, 0x00, // # #@# +0x00, 0x88, 0x88, 0x00, 0x08, 0x00, // #### # +0x00, 0x00, 0x08, 0x88, 0x88, 0x00, // ##### +//Level: 105 +0x0E, 0x0D,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x88, 0x80, 0x00, // ###### +0x00, 0x08, 0x88, 0x00, 0x00, 0x88, 0x00, // ### ## +0x00, 0x08, 0x00, 0x08, 0x80, 0x08, 0x00, // # ## # +0x08, 0x88, 0x48, 0x80, 0x08, 0x08, 0x00, // ###$## # # +0x88, 0x00, 0x00, 0x01, 0x18, 0x08, 0x00, //## ..# # +0x80, 0x04, 0x84, 0x85, 0x18, 0x08, 0x00, //# $#$#*.# # +0x80, 0x44, 0x20, 0x81, 0x58, 0x08, 0x88, //# $$@ #.*# ### +0x80, 0x04, 0x40, 0x81, 0x18, 0x00, 0x08, //# $$ #..# # +0x88, 0x00, 0x00, 0x81, 0x14, 0x00, 0x08, //## #..$ # +0x08, 0x88, 0x48, 0x81, 0x08, 0x08, 0x88, // ###$##. # ### +0x00, 0x08, 0x00, 0x88, 0x80, 0x08, 0x00, // # ### # +0x00, 0x08, 0x80, 0x00, 0x00, 0x88, 0x00, // ## ## +0x00, 0x00, 0x88, 0x88, 0x88, 0x80, 0x00, // ####### +//Level: 106 +0x0D, 0x0B,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x80, // ##### +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, // # # +0x88, 0x88, 0x88, 0x88, 0x80, 0x80, 0x80, //######### # # +0x80, 0x40, 0x40, 0x40, 0x40, 0x00, 0x80, //# $ $ $ $ # +0x80, 0x81, 0x81, 0x81, 0x82, 0x48, 0x80, //# #.#.#.#@$## +0x81, 0x11, 0x11, 0x11, 0x00, 0x08, 0x00, //#....... # +0x80, 0x80, 0x80, 0x80, 0x84, 0x88, 0x80, //# # # # #$### +0x80, 0x40, 0x40, 0x40, 0x40, 0x00, 0x80, //# $ $ $ $ # +0x88, 0x88, 0x88, 0x88, 0x80, 0x80, 0x80, //######### # # +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, // # # +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x80, // ##### +//Level: 107 +0x08, 0x08,//Size x and y +0x08, 0x88, 0x80, 0x00, // #### +0x08, 0x20, 0x88, 0x80, // #@ ### +0x08, 0x04, 0x00, 0x80, // # $ # +0x88, 0x80, 0x80, 0x88, //### # ## +0x81, 0x80, 0x80, 0x08, //#.# # # +0x81, 0x40, 0x08, 0x08, //#.$ # # +0x81, 0x00, 0x04, 0x08, //#. $ # +0x88, 0x88, 0x88, 0x88, //######## +//Level: 108 +0x0B, 0x0D,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x80, // #### +0x00, 0x00, 0x00, 0x08, 0x20, 0x80, // #@ # +0x00, 0x08, 0x88, 0x88, 0x00, 0x80, // ##### # +0x88, 0x88, 0x00, 0x00, 0x00, 0x80, //#### # +0x80, 0x00, 0x18, 0x88, 0x08, 0x80, //# .### ## +0x80, 0x80, 0x80, 0x00, 0x08, 0x80, //# # # ## +0x80, 0x80, 0x40, 0x48, 0x10, 0x80, //# # $ $#. # +0x80, 0x80, 0x05, 0x00, 0x80, 0x80, //# # * # # +0x80, 0x18, 0x40, 0x40, 0x80, 0x80, //# .#$ $ # # +0x88, 0x00, 0x00, 0x80, 0x80, 0x80, //## # # # +0x08, 0x08, 0x88, 0x10, 0x00, 0x80, // # ###. # +0x08, 0x00, 0x00, 0x08, 0x88, 0x80, // # #### +0x08, 0x88, 0x88, 0x88, 0x00, 0x00, // ####### +//Level: 109 +0x11, 0x0D,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, // ######### +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, // # # +0x00, 0x00, 0x84, 0x40, 0x44, 0x80, 0x88, 0x88, 0x00, // #$$ $$# #### +0x88, 0x88, 0x80, 0x08, 0x00, 0x40, 0x80, 0x08, 0x00, //##### # $ # # +0x81, 0x18, 0x00, 0x88, 0x04, 0x00, 0x40, 0x08, 0x00, //#..# ## $ $ # +0x81, 0x18, 0x04, 0x40, 0x00, 0x00, 0x80, 0x08, 0x00, //#..# $$ # # +0x81, 0x18, 0x00, 0x88, 0x48, 0x88, 0x80, 0x88, 0x00, //#..# ##$#### ## +0x81, 0x18, 0x80, 0x88, 0x00, 0x00, 0x80, 0x80, 0x00, //#..## ## # # +0x81, 0x11, 0x00, 0x08, 0x80, 0x88, 0x80, 0x88, 0x80, //#... ## ### ### +0x80, 0x00, 0x88, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, //# ## $ # +0x88, 0x88, 0x88, 0x28, 0x00, 0x08, 0x80, 0x80, 0x80, //######@# ## # # +0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x80, 0x00, 0x80, // ######## # +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x80, // ##### +//Level: 110 +0x0F, 0x0D,//Size x and y +0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, // ##### +0x88, 0x80, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, //### ## +0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, //# # +0x80, 0x44, 0x08, 0x48, 0x88, 0x88, 0x88, 0x80, //# $$ #$######## +0x88, 0x08, 0x40, 0x40, 0x40, 0x80, 0x00, 0x80, //## #$ $ $ # # +0x81, 0x11, 0x18, 0x00, 0x04, 0x00, 0x00, 0x80, //#....# $ # +0x81, 0x11, 0x12, 0x80, 0x08, 0x88, 0x48, 0x80, //#....@# ###$## +0x81, 0x11, 0x14, 0x80, 0x00, 0x40, 0x40, 0x80, //#....$# $ $ # +0x81, 0x11, 0x14, 0x04, 0x80, 0x00, 0x00, 0x80, //#....$ $# # +0x88, 0x88, 0x80, 0x00, 0x80, 0x48, 0x48, 0x80, //##### # $#$## +0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x40, 0x80, // ##### $ # +0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x80, // ### # +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x80, // ##### +//Level: 111 +0x0A, 0x08,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x88, // ##### +0x08, 0x88, 0x88, 0x00, 0x08, // ##### # +0x08, 0x01, 0x10, 0x48, 0x08, // # .. $# # +0x08, 0x08, 0x15, 0x00, 0x08, // # #.* # +0x88, 0x05, 0x18, 0x40, 0x88, //## *.#$ ## +0x80, 0x40, 0x04, 0x00, 0x80, //# $ $ # +0x80, 0x00, 0x88, 0x02, 0x80, //# ## @# +0x88, 0x88, 0x88, 0x88, 0x80, //######### +//Level: 112 +0x0E, 0x0F,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, // ######### +0x08, 0x11, 0x11, 0x00, 0x08, 0x80, 0x00, // #.... ## +0x08, 0x18, 0x18, 0x00, 0x40, 0x88, 0x00, // #.#.# $ ## +0x88, 0x11, 0x11, 0x80, 0x80, 0x28, 0x80, //##....# # @## +0x80, 0x11, 0x11, 0x80, 0x08, 0x00, 0x88, //# ....# # ## +0x80, 0x00, 0x00, 0x84, 0x08, 0x84, 0x08, //# #$ ##$ # +0x88, 0x08, 0x88, 0x00, 0x40, 0x00, 0x08, //## ### $ # +0x08, 0x40, 0x04, 0x04, 0x04, 0x80, 0x08, // #$ $ $ $# # +0x08, 0x08, 0x00, 0x40, 0x40, 0x88, 0x08, // # # $ $ ## # +0x08, 0x00, 0x88, 0x80, 0x08, 0x80, 0x08, // # ### ## # +0x08, 0x00, 0x00, 0x88, 0x08, 0x80, 0x88, // # ## ## ## +0x08, 0x00, 0x40, 0x80, 0x04, 0x00, 0x80, // # $ # $ # +0x08, 0x88, 0x40, 0x40, 0x00, 0x88, 0x80, // ###$ $ ### +0x00, 0x08, 0x00, 0x88, 0x88, 0x80, 0x00, // # ##### +0x00, 0x08, 0x88, 0x80, 0x00, 0x00, 0x00, // #### +//Level: 113 +0x0E, 0x0C,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, // ######### +0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, // # # +0x08, 0x04, 0x04, 0x40, 0x48, 0x00, 0x00, // # $ $$ $# +0x88, 0x80, 0x80, 0x04, 0x08, 0x00, 0x00, //### # $ # +0x81, 0x80, 0x00, 0x44, 0x08, 0x80, 0x00, //#.# $$ ## +0x81, 0x88, 0x80, 0x00, 0x40, 0x80, 0x00, //#.### $ # +0x81, 0x81, 0x04, 0x08, 0x80, 0x88, 0x88, //#.#. $ ## #### +0x81, 0x11, 0x00, 0x48, 0x80, 0x40, 0x08, //#... $## $ # +0x81, 0x11, 0x40, 0x00, 0x40, 0x00, 0x08, //#...$ $ # +0x81, 0x18, 0x88, 0x48, 0x88, 0x08, 0x28, //#..###$### #@# +0x81, 0x18, 0x08, 0x00, 0x00, 0x08, 0x88, //#..# # ### +0x88, 0x88, 0x08, 0x88, 0x88, 0x88, 0x00, //#### ####### +//Level: 114 +0x07, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x80, //####### +0x81, 0x14, 0x11, 0x80, //#..$..# +0x81, 0x18, 0x11, 0x80, //#..#..# +0x80, 0x44, 0x40, 0x80, //# $$$ # +0x80, 0x04, 0x00, 0x80, //# $ # +0x80, 0x44, 0x40, 0x80, //# $$$ # +0x80, 0x08, 0x20, 0x80, //# #@ # +0x88, 0x88, 0x88, 0x80, //####### +//Level: 115 +0x08, 0x0B,//Size x and y +0x00, 0x08, 0x88, 0x88, // ##### +0x00, 0x08, 0x00, 0x08, // # # +0x88, 0x88, 0x40, 0x08, //####$ # +0x81, 0x10, 0x40, 0x08, //#.. $ # +0x81, 0x14, 0x00, 0x88, //#..$ ## +0x81, 0x18, 0x04, 0x80, //#..# $# +0x80, 0x18, 0x40, 0x88, //# .#$ ## +0x88, 0x88, 0x04, 0x08, //#### $ # +0x00, 0x80, 0x40, 0x08, // # $ # +0x00, 0x80, 0x02, 0x08, // # @ # +0x00, 0x88, 0x88, 0x88, // ###### +//Level: 116 +0x0C, 0x05,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //############ +0x80, 0x00, 0x01, 0x11, 0x04, 0x08, //# ... $ # +0x80, 0x44, 0x45, 0x55, 0x04, 0x28, //# $$$*** $@# +0x80, 0x00, 0x01, 0x11, 0x04, 0x08, //# ... $ # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //############ +//Level: 117 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x80, 0x02, 0x00, 0x08, //# @ # +0x80, 0x88, 0x48, 0x08, //# ##$# # +0x80, 0x40, 0x04, 0x08, //# $ $ # +0x88, 0x40, 0x08, 0x88, //##$ ### +0x08, 0x14, 0x01, 0x80, // #.$ .# +0x08, 0x11, 0x01, 0x80, // #.. .# +0x08, 0x88, 0x88, 0x80, // ###### +//Level: 118 +0x08, 0x08,//Size x and y +0x08, 0x88, 0x88, 0x88, // ####### +0x88, 0x00, 0x01, 0x08, //## . # +0x80, 0x40, 0x04, 0x28, //# $ $@# +0x81, 0x41, 0x88, 0x88, //#.$.#### +0x80, 0x08, 0x80, 0x00, //# ## +0x80, 0x08, 0x00, 0x00, //# # +0x80, 0x08, 0x00, 0x00, //# # +0x88, 0x88, 0x00, 0x00, //#### +//Level: 119 +0x13, 0x0D,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x80, // ##### +0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x80, // ########## # +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, // # # # +0x00, 0x00, 0x08, 0x00, 0x40, 0x40, 0x00, 0x04, 0x40, 0x80, // # $ $ $$ # +0x00, 0x00, 0x08, 0x08, 0x88, 0x88, 0x08, 0x80, 0x40, 0x80, // # ##### ## $ # +0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x48, 0x80, 0x40, 0x80, // #$$ #$## $ # +0x00, 0x00, 0x08, 0x08, 0x88, 0x08, 0x08, 0x84, 0x00, 0x80, // # ### # ##$ # +0x88, 0x88, 0x88, 0x08, 0x88, 0x04, 0x04, 0x00, 0x00, 0x80, //###### ### $ $ # +0x81, 0x11, 0x10, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x80, //#.... ## # +0x81, 0x11, 0x10, 0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x80, //#.... ###### +0x81, 0x11, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, //#.... # +0x88, 0x88, 0x88, 0x88, 0x88, 0x82, 0x88, 0x00, 0x00, 0x00, //###########@## +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, // ### +//Level: 120 +0x10, 0x0D,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, //############## +0x80, 0x00, 0x08, 0x88, 0x00, 0x08, 0x18, 0x00, //# ### #.# +0x80, 0x40, 0x00, 0x00, 0x40, 0x08, 0x18, 0x00, //# $ $ #.# +0x80, 0x40, 0x08, 0x08, 0x00, 0x08, 0x18, 0x80, //# $ # # #.## +0x88, 0x08, 0x88, 0x08, 0x84, 0x88, 0x11, 0x88, //## ### ##$##..## +0x80, 0x40, 0x08, 0x48, 0x00, 0x08, 0x02, 0x18, //# $ #$# # @.# +0x80, 0x04, 0x04, 0x00, 0x04, 0x00, 0x11, 0x18, //# $ $ $ ...# +0x80, 0x40, 0x08, 0x48, 0x00, 0x08, 0x11, 0x08, //# $ #$# #.. # +0x88, 0x08, 0x88, 0x08, 0x80, 0x88, 0x11, 0x88, //## ### ## ##..## +0x80, 0x04, 0x08, 0x08, 0x04, 0x08, 0x18, 0x80, //# $ # # $ #.## +0x80, 0x44, 0x00, 0x00, 0x04, 0x08, 0x18, 0x00, //# $$ $ #.# +0x80, 0x00, 0x08, 0x88, 0x00, 0x08, 0x18, 0x00, //# ### #.# +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, //############## +//Level: 121 +0x0F, 0x0C,//Size x and y +0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x80, // ######### +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, // # # +0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, // # # # # # +0x00, 0x00, 0x00, 0x80, 0x04, 0x04, 0x80, 0x80, // # $ $# # +0x88, 0x88, 0x88, 0x80, 0x00, 0x40, 0x00, 0x80, //####### $ # +0x81, 0x18, 0x00, 0x88, 0x04, 0x04, 0x80, 0x80, //#..# ## $ $# # +0x81, 0x10, 0x00, 0x88, 0x04, 0x04, 0x00, 0x80, //#.. ## $ $ # +0x81, 0x18, 0x00, 0x88, 0x08, 0x88, 0x88, 0x80, //#..# ## ###### +0x81, 0x18, 0x08, 0x04, 0x04, 0x08, 0x00, 0x00, //#..# # $ $ # +0x81, 0x10, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, //#.. $ # +0x80, 0x08, 0x88, 0x02, 0x08, 0x88, 0x00, 0x00, //# ### @ ### +0x88, 0x88, 0x08, 0x88, 0x88, 0x00, 0x00, 0x00, //#### ##### +//Level: 122 +0x0E, 0x0D,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x88, // ######### +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, // # # +0x00, 0x00, 0x08, 0x00, 0x48, 0x48, 0x08, // # $#$# # +0x08, 0x88, 0x88, 0x80, 0x08, 0x04, 0x08, // ###### # $ # +0x08, 0x00, 0x08, 0x04, 0x00, 0x40, 0x08, // # # $ $ # +0x88, 0x04, 0x00, 0x00, 0x08, 0x88, 0x08, //## $ ### # +0x80, 0x00, 0x84, 0x88, 0x88, 0x00, 0x08, //# #$#### # +0x80, 0x00, 0x04, 0x08, 0x88, 0x08, 0x88, //# $ ### ### +0x88, 0x88, 0x81, 0x10, 0x28, 0x08, 0x80, //#####.. @# ## +0x00, 0x08, 0x11, 0x14, 0x04, 0x40, 0x80, // #...$ $$ # +0x00, 0x08, 0x11, 0x18, 0x00, 0x00, 0x80, // #...# # +0x00, 0x08, 0x11, 0x18, 0x88, 0x88, 0x80, // #...###### +0x00, 0x08, 0x88, 0x88, 0x00, 0x00, 0x00, // ##### +//Level: 123 +0x0D, 0x0A,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, // #### +0x88, 0x88, 0x88, 0x00, 0x88, 0x88, 0x80, //###### ##### +0x82, 0x40, 0x00, 0x04, 0x00, 0x40, 0x80, //#@$ $ $ # +0x84, 0x88, 0x80, 0x40, 0x80, 0x80, 0x80, //#$### $ # # # +0x80, 0x08, 0x00, 0x80, 0x40, 0x00, 0x80, //# # # $ # +0x80, 0x48, 0x00, 0x00, 0x80, 0x88, 0x80, //# $# # ### +0x80, 0x04, 0x08, 0x48, 0x00, 0x08, 0x00, //# $ #$# # +0x81, 0x11, 0x11, 0x11, 0x11, 0x08, 0x00, //#......... # +0x88, 0x88, 0x88, 0x88, 0x00, 0x08, 0x00, //######## # +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x00, // ##### +//Level: 124 +0x09, 0x09,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x80, //######### +0x82, 0x00, 0x00, 0x00, 0x80, //#@ # +0x80, 0x41, 0x41, 0x40, 0x80, //# $.$.$ # +0x80, 0x14, 0x14, 0x10, 0x80, //# .$.$. # +0x80, 0x41, 0x51, 0x40, 0x80, //# $.*.$ # +0x80, 0x14, 0x14, 0x10, 0x80, //# .$.$. # +0x80, 0x41, 0x41, 0x40, 0x80, //# $.$.$ # +0x80, 0x00, 0x00, 0x00, 0x80, //# # +0x88, 0x88, 0x88, 0x88, 0x80, //######### +//Level: 125 +0x09, 0x08,//Size x and y +0x08, 0x88, 0x88, 0x80, 0x00, // ###### +0x88, 0x00, 0x12, 0x88, 0x00, //## .@## +0x80, 0x50, 0x80, 0x08, 0x80, //# * # ## +0x80, 0x00, 0x80, 0x00, 0x80, //# # # +0x80, 0x48, 0x80, 0x80, 0x80, //# $## # # +0x80, 0x04, 0x04, 0x51, 0x80, //# $ $*.# +0x80, 0x01, 0x80, 0x00, 0x80, //# .# # +0x88, 0x88, 0x88, 0x88, 0x80, //######### +//Level: 126 +0x13, 0x06,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //################### +0x80, 0x00, 0x11, 0x10, 0x02, 0x00, 0x11, 0x10, 0x00, 0x80, //# ... @ ... # +0x80, 0x44, 0x40, 0x08, 0x88, 0x88, 0x00, 0x44, 0x40, 0x80, //# $$$ ##### $$$ # +0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x80, //## ### ### ## +0x08, 0x80, 0x08, 0x00, 0x00, 0x00, 0x08, 0x80, 0x08, 0x00, // ## # ## # +0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, // #### #### +//Level: 127 +0x10, 0x10,//Size x and y +0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, // #### +0x00, 0x80, 0x08, 0x88, 0x88, 0x88, 0x88, 0x88, // # ########### +0x00, 0x80, 0x00, 0x04, 0x00, 0x04, 0x04, 0x08, // # $ $ $ # +0x00, 0x80, 0x48, 0x04, 0x08, 0x00, 0x40, 0x08, // # $# $ # $ # +0x00, 0x80, 0x04, 0x04, 0x00, 0x80, 0x00, 0x08, // # $ $ # # +0x88, 0x80, 0x48, 0x08, 0x00, 0x88, 0x88, 0x08, //### $# # #### # +0x82, 0x84, 0x04, 0x04, 0x00, 0x88, 0x00, 0x08, //#@#$ $ $ ## # +0x80, 0x00, 0x04, 0x08, 0x48, 0x00, 0x08, 0x08, //# $ #$# # # +0x80, 0x00, 0x40, 0x00, 0x04, 0x04, 0x04, 0x08, //# $ $ $ $ # +0x88, 0x88, 0x80, 0x08, 0x88, 0x88, 0x88, 0x88, //##### ######### +0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // # # +0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // # # +0x00, 0x81, 0x11, 0x11, 0x18, 0x00, 0x00, 0x00, // #......# +0x00, 0x81, 0x11, 0x11, 0x18, 0x00, 0x00, 0x00, // #......# +0x00, 0x81, 0x11, 0x11, 0x18, 0x00, 0x00, 0x00, // #......# +0x00, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, // ######## +//Level: 128 +0x0B, 0x0B,//Size x and y +0x00, 0x00, 0x00, 0x88, 0x88, 0x00, // #### +0x88, 0x88, 0x88, 0x80, 0x28, 0x00, //####### @# +0x80, 0x00, 0x00, 0x40, 0x08, 0x00, //# $ # +0x80, 0x00, 0x48, 0x80, 0x48, 0x00, //# $## $# +0x88, 0x48, 0x11, 0x18, 0x08, 0x00, //##$#...# # +0x08, 0x04, 0x11, 0x10, 0x08, 0x00, // # $... # +0x08, 0x08, 0x10, 0x18, 0x08, 0x80, // # #. .# ## +0x08, 0x00, 0x08, 0x08, 0x40, 0x80, // # # #$ # +0x08, 0x40, 0x04, 0x00, 0x00, 0x80, // #$ $ # +0x08, 0x00, 0x88, 0x88, 0x88, 0x80, // # ####### +0x08, 0x88, 0x80, 0x00, 0x00, 0x00, // #### +//Level: 129 +0x11, 0x10,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, // ############ +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, // # ## +0x00, 0x00, 0x80, 0x08, 0x08, 0x44, 0x04, 0x00, 0x80, // # # #$$ $ # +0x00, 0x00, 0x84, 0x08, 0x48, 0x00, 0x88, 0x02, 0x80, // #$ #$# ## @# +0x00, 0x08, 0x80, 0x88, 0x08, 0x04, 0x08, 0x08, 0x80, // ## ## # $ # ## +0x00, 0x08, 0x00, 0x04, 0x08, 0x40, 0x08, 0x08, 0x00, // # $ #$ # # +0x00, 0x08, 0x00, 0x08, 0x04, 0x00, 0x08, 0x08, 0x00, // # # $ # # +0x00, 0x08, 0x80, 0x40, 0x40, 0x00, 0x88, 0x08, 0x00, // ## $ $ ## # +0x00, 0x08, 0x00, 0x80, 0x08, 0x80, 0x04, 0x08, 0x00, // # # ## $ # +0x00, 0x08, 0x00, 0x00, 0x88, 0x04, 0x48, 0x08, 0x00, // # ## $$# # +0x88, 0x88, 0x88, 0x44, 0x00, 0x08, 0x00, 0x08, 0x00, //######$$ # # +0x81, 0x11, 0x18, 0x00, 0x88, 0x88, 0x88, 0x88, 0x00, //#....# ######## +0x81, 0x81, 0x11, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, //#.#... ## +0x81, 0x11, 0x10, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, //#.... # +0x81, 0x11, 0x10, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, //#.... # +0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, //######### +//Level: 130 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x88, //# ### +0x80, 0x48, 0x00, 0x04, 0x08, 0x80, 0x04, 0x00, 0x00, 0x88, //# $# $ ## $ ## +0x80, 0x00, 0x04, 0x88, 0x80, 0x00, 0x08, 0x04, 0x40, 0x88, //# $### # $$ ## +0x81, 0x88, 0x80, 0x00, 0x00, 0x40, 0x40, 0x88, 0x00, 0x88, //#.### $ $ ## ## +0x81, 0x11, 0x80, 0x08, 0x00, 0x80, 0x00, 0x08, 0x40, 0x08, //#...# # # #$ # +0x81, 0x18, 0x84, 0x48, 0x88, 0x80, 0x40, 0x08, 0x00, 0x08, //#..##$$#### $ # # +0x81, 0x11, 0x80, 0x00, 0x00, 0x04, 0x08, 0x80, 0x08, 0x88, //#...# $ ## ### +0x81, 0x11, 0x40, 0x08, 0x88, 0x00, 0x80, 0x00, 0x08, 0x08, //#...$ ### # # # +0x88, 0x11, 0x00, 0x48, 0x00, 0x88, 0x00, 0x08, 0x82, 0x08, //##.. $# ## ##@ # +0x88, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, //###.# # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 131 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x81, 0x11, 0x18, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, //#....### # +0x81, 0x11, 0x18, 0x88, 0x88, 0x08, 0x00, 0x84, 0x80, 0x88, //#....##### # #$# ## +0x81, 0x11, 0x18, 0x88, 0x00, 0x08, 0x40, 0x04, 0x00, 0x08, //#....### #$ $ # +0x81, 0x11, 0x18, 0x88, 0x00, 0x00, 0x40, 0x08, 0x44, 0x88, //#....### $ #$$## +0x88, 0x00, 0x88, 0x88, 0x04, 0x80, 0x08, 0x40, 0x40, 0x08, //## #### $# #$ $ # +0x88, 0x00, 0x88, 0x88, 0x00, 0x40, 0x04, 0x00, 0x80, 0x08, //## #### $ $ # # +0x82, 0x00, 0x88, 0x88, 0x48, 0x88, 0x48, 0x80, 0x40, 0x08, //#@ ####$###$## $ # +0x88, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x40, 0x08, //## # # $ # +0x88, 0x00, 0x08, 0x88, 0x00, 0x80, 0x04, 0x00, 0x88, 0x88, //## ### # $ #### +0x88, 0x88, 0x88, 0x88, 0x00, 0x80, 0x08, 0x00, 0x00, 0x08, //######## # # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 132 +0x0C, 0x07,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x88, 0x88, // ########## +0x88, 0x82, 0x00, 0x10, 0x00, 0x08, //###@ . # +0x80, 0x00, 0x88, 0x48, 0x80, 0x08, //# ##$## # +0x80, 0x04, 0x10, 0x10, 0x14, 0x88, //# $. . .$## +0x88, 0x04, 0x88, 0x48, 0x80, 0x80, //## $##$## # +0x08, 0x00, 0x00, 0x10, 0x00, 0x80, // # . # +0x08, 0x88, 0x88, 0x88, 0x88, 0x80, // ########## +//Level: 133 +0x08, 0x07,//Size x and y +0x00, 0x88, 0x88, 0x80, // ##### +0x88, 0x80, 0x00, 0x80, //### # +0x80, 0x40, 0x80, 0x88, //# $ # ## +0x80, 0x41, 0x41, 0x08, //# $.$. # +0x80, 0x88, 0x10, 0x08, //# ##. # +0x80, 0x02, 0x08, 0x88, //# @ ### +0x88, 0x88, 0x88, 0x00, //###### +//Level: 134 +0x0A, 0x09,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x00, // ###### +0x00, 0x80, 0x00, 0x08, 0x88, // # ### +0x00, 0x80, 0x40, 0x00, 0x08, // # $ # +0x88, 0x80, 0x40, 0x88, 0x08, //### $ ## # +0x81, 0x11, 0x04, 0x00, 0x08, //#... $ # +0x81, 0x11, 0x48, 0x40, 0x88, //#...$#$ ## +0x88, 0x88, 0x08, 0x04, 0x08, //#### # $ # +0x00, 0x08, 0x00, 0x20, 0x08, // # @ # +0x00, 0x08, 0x88, 0x88, 0x88, // ####### +//Level: 135 +0x13, 0x0F,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // #### +0x88, 0x88, 0x88, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, //###### # +0x80, 0x00, 0x04, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //# $ ########### +0x80, 0x88, 0x04, 0x00, 0x88, 0x00, 0x80, 0x11, 0x11, 0x80, //# ## $ ## # ....# +0x80, 0x40, 0x40, 0x04, 0x00, 0x00, 0x80, 0x11, 0x11, 0x80, //# $ $ $ # ....# +0x80, 0x80, 0x04, 0x40, 0x88, 0x80, 0x80, 0x11, 0x11, 0x80, //# # $$ ### # ....# +0x80, 0x24, 0x40, 0x00, 0x08, 0x80, 0x80, 0x11, 0x11, 0x80, //# @$$ ## # ....# +0x88, 0x88, 0x00, 0x80, 0x08, 0x00, 0x88, 0x08, 0x88, 0x80, //#### # # ## #### +0x00, 0x08, 0x04, 0x88, 0x88, 0x00, 0x00, 0x08, 0x00, 0x00, // # $#### # +0x00, 0x08, 0x40, 0x40, 0x88, 0x88, 0x48, 0x08, 0x00, 0x00, // #$ $ ####$# # +0x00, 0x88, 0x08, 0x00, 0x80, 0x08, 0x08, 0x08, 0x00, 0x00, // ## # # # # # +0x00, 0x80, 0x04, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, // # $$$ # +0x00, 0x80, 0x00, 0x00, 0x88, 0x88, 0x80, 0x08, 0x00, 0x00, // # ##### # +0x00, 0x80, 0x08, 0x88, 0x80, 0x00, 0x88, 0x88, 0x00, 0x00, // # #### #### +0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // #### +//Level: 136 +0x0B, 0x09,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x88, 0x00, // ######### +0x08, 0x00, 0x08, 0x00, 0x08, 0x00, // # # # +0x08, 0x04, 0x44, 0x44, 0x08, 0x00, // # $$$$$ # +0x88, 0x04, 0x04, 0x04, 0x08, 0x00, //## $ $ $ # +0x80, 0x40, 0x02, 0x00, 0x08, 0x00, //# $ @ # +0x80, 0x40, 0x88, 0x88, 0x08, 0x80, //# $ #### ## +0x80, 0x08, 0x11, 0x11, 0x10, 0x80, //# #..... # +0x88, 0x00, 0x11, 0x11, 0x10, 0x80, //## ..... # +0x08, 0x88, 0x88, 0x88, 0x88, 0x80, // ########## +//Level: 137 +0x0E, 0x0B,//Size x and y +0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x80, // ####### +0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x88, // ## ## +0x00, 0x00, 0x88, 0x00, 0x48, 0x80, 0x08, // ## $## # +0x00, 0x00, 0x80, 0x08, 0x00, 0x04, 0x08, // # # $ # +0x00, 0x00, 0x80, 0x80, 0x08, 0x08, 0x08, // # # # # # +0x00, 0x00, 0x80, 0x40, 0x40, 0x04, 0x08, // # $ $ $ # +0x88, 0x88, 0x88, 0x80, 0x84, 0x80, 0x08, //####### #$# # +0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x88, //# $ $ ## +0x82, 0x11, 0x40, 0x55, 0x18, 0x88, 0x80, //#@..$ **.#### +0x88, 0x11, 0x11, 0x11, 0x88, 0x00, 0x00, //##......## +0x08, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, // ######## +//Level: 138 +0x0D, 0x0B,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, // ##### +0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, // # # +0x08, 0x88, 0x80, 0x80, 0x88, 0x88, 0x80, // #### # ##### +0x88, 0x00, 0x04, 0x04, 0x00, 0x00, 0x80, //## $ $ # +0x80, 0x48, 0x08, 0x11, 0x18, 0x40, 0x80, //# $# #...#$ # +0x82, 0x40, 0x01, 0x11, 0x80, 0x08, 0x80, //#@$ ...# ## +0x80, 0x48, 0x01, 0x18, 0x04, 0x00, 0x80, //# $# ..# $ # +0x88, 0x00, 0x01, 0x80, 0x00, 0x00, 0x80, //## .# # +0x08, 0x88, 0x04, 0x04, 0x08, 0x00, 0x80, // ### $ $ # # +0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x80, // ### #### +0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, // ##### +//Level: 139 +0x09, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x00, 0x00, //###### +0x80, 0x00, 0x28, 0x00, 0x00, //# @# +0x80, 0x40, 0x08, 0x88, 0x80, //# $ #### +0x80, 0x45, 0x11, 0x50, 0x80, //# $*..* # +0x80, 0x51, 0x15, 0x40, 0x80, //# *..*$ # +0x88, 0x88, 0x00, 0x40, 0x80, //#### $ # +0x00, 0x08, 0x00, 0x00, 0x80, // # # +0x00, 0x08, 0x88, 0x88, 0x80, // ###### +//Level: 140 +0x09, 0x09,//Size x and y +0x08, 0x88, 0x88, 0x80, 0x00, // ###### +0x88, 0x00, 0x00, 0x88, 0x00, //## ## +0x80, 0x08, 0x80, 0x08, 0x00, //# ## # +0x80, 0x80, 0x08, 0x08, 0x00, //# # # # +0x81, 0x00, 0x18, 0x48, 0x80, //#. .#$## +0x80, 0x80, 0x50, 0x40, 0x80, //# # * $ # +0x80, 0x80, 0x50, 0x42, 0x80, //# # * $@# +0x80, 0x01, 0x10, 0x40, 0x80, //# .. $ # +0x88, 0x88, 0x88, 0x88, 0x80, //######### +//Level: 141 +0x0B, 0x09,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x88, 0x00, // ######### +0x08, 0x00, 0x88, 0x00, 0x08, 0x00, // # ## # +0x08, 0x00, 0x04, 0x00, 0x08, 0x00, // # $ # +0x08, 0x40, 0x88, 0x80, 0x48, 0x00, // #$ ### $# +0x08, 0x08, 0x11, 0x18, 0x08, 0x00, // # #...# # +0x88, 0x08, 0x11, 0x18, 0x08, 0x80, //## #...# ## +0x80, 0x40, 0x04, 0x00, 0x40, 0x80, //# $ $ $ # +0x80, 0x00, 0x00, 0x80, 0x20, 0x80, //# # @ # +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //########### +//Level: 142 +0x0E, 0x0D,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, // ##### +0x00, 0x00, 0x08, 0x20, 0x08, 0x88, 0x80, // #@ #### +0x00, 0x88, 0x88, 0x84, 0x00, 0x00, 0x80, // #####$ # +0x00, 0x81, 0x11, 0x80, 0x08, 0x04, 0x88, // #...# # $## +0x00, 0x81, 0x51, 0x84, 0x08, 0x40, 0x08, // #.*.#$ #$ # +0x88, 0x81, 0x11, 0x04, 0x08, 0x08, 0x08, //###... $ # # # +0x80, 0x01, 0x18, 0x84, 0x80, 0x00, 0x08, //# ..##$# # +0x80, 0x08, 0x88, 0x80, 0x08, 0x04, 0x08, //# #### # $ # +0x88, 0x00, 0x04, 0x00, 0x08, 0x44, 0x08, //## $ #$$ # +0x08, 0x00, 0x88, 0x08, 0x80, 0x00, 0x88, // # ## ## ## +0x08, 0x88, 0x88, 0x00, 0x00, 0x00, 0x80, // ##### # +0x00, 0x00, 0x08, 0x00, 0x88, 0x88, 0x80, // # ##### +0x00, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, // #### +//Level: 143 +0x11, 0x0F,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, // ##### +0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x08, 0x00, 0x00, // ##### # +0x00, 0x00, 0x88, 0x04, 0x00, 0x40, 0x08, 0x88, 0x80, // ## $ $ #### +0x88, 0x88, 0x80, 0x40, 0x04, 0x04, 0x08, 0x81, 0x80, //##### $ $ $ ##.# +0x80, 0x00, 0x00, 0x00, 0x44, 0x00, 0x88, 0x11, 0x80, //# $$ ##..# +0x80, 0x08, 0x88, 0x88, 0x80, 0x88, 0x81, 0x10, 0x80, //# ###### ###.. # +0x88, 0x08, 0x00, 0x80, 0x00, 0x08, 0x11, 0x10, 0x80, //## # # #... # +0x80, 0x40, 0x00, 0x80, 0x00, 0x08, 0x11, 0x10, 0x80, //# $ # #... # +0x82, 0x08, 0x40, 0x88, 0x08, 0x88, 0x81, 0x11, 0x80, //#@ #$ ## ####...# +0x88, 0x88, 0x00, 0x40, 0x44, 0x00, 0x88, 0x11, 0x80, //#### $ $$ ##..# +0x00, 0x08, 0x80, 0x04, 0x04, 0x00, 0x41, 0x11, 0x80, // ## $ $ $...# +0x00, 0x00, 0x80, 0x44, 0x00, 0x40, 0x80, 0x01, 0x80, // # $$ $ # .# +0x00, 0x00, 0x80, 0x00, 0x40, 0x40, 0x08, 0x88, 0x80, // # $ $ #### +0x00, 0x00, 0x88, 0x88, 0x88, 0x00, 0x08, 0x00, 0x00, // ###### # +0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, // ##### +//Level: 144 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x00, 0x00, 0x01, 0x11, 0x18, 0x00, 0x00, 0x88, 0x88, //# ....# #### +0x80, 0x00, 0x00, 0x01, 0x11, 0x10, 0x00, 0x00, 0x00, 0x08, //# .... # +0x80, 0x80, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x08, //# # ########## # +0x80, 0x84, 0x00, 0x08, 0x00, 0x00, 0x00, 0x88, 0x81, 0x18, //# #$ # ###..# +0x80, 0x04, 0x00, 0x08, 0x44, 0x88, 0x80, 0x00, 0x81, 0x18, //# $ #$$### #..# +0x80, 0x40, 0x88, 0x80, 0x40, 0x00, 0x40, 0x00, 0x81, 0x18, //# $ ### $ $ #..# +0x80, 0x40, 0x80, 0x00, 0x40, 0x40, 0x80, 0x08, 0x81, 0x18, //# $ # $ $ # ##..# +0x80, 0x08, 0x00, 0x44, 0x08, 0x04, 0x08, 0x80, 0x00, 0x88, //# # $$ # $ ## ## +0x82, 0x88, 0x04, 0x80, 0x04, 0x00, 0x40, 0x00, 0x00, 0x88, //#@## $# $ $ ## +0x88, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x80, 0x08, 0x88, //## ## # ### +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 145 +0x11, 0x0A,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, //################ +0x80, 0x00, 0x00, 0x00, 0x82, 0x08, 0x00, 0x08, 0x00, //# #@ # # +0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x04, 0x48, 0x00, //# # # # # $ $$# +0x80, 0x81, 0x11, 0x80, 0x84, 0x44, 0x00, 0x08, 0x00, //# #...# #$$$ # +0x80, 0x01, 0x11, 0x80, 0x80, 0x40, 0x04, 0x48, 0x80, //# ...# # $ $$## +0x80, 0x88, 0x18, 0x80, 0x80, 0x88, 0x00, 0x00, 0x80, //# ##.## # ## # +0x80, 0x81, 0x11, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, //# #... $ # +0x80, 0x88, 0x08, 0x88, 0x00, 0x88, 0x88, 0x88, 0x80, //# ## ### ####### +0x80, 0x00, 0x08, 0x08, 0x88, 0x80, 0x00, 0x00, 0x00, //# # #### +0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //###### +//Level: 146 +0x0A, 0x08,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x88, // ####### +0x00, 0x88, 0x00, 0x80, 0x28, // ## # @# +0x00, 0x80, 0x00, 0x80, 0x08, // # # # +0x00, 0x84, 0x04, 0x04, 0x08, // #$ $ $ # +0x00, 0x80, 0x48, 0x80, 0x08, // # $## # +0x88, 0x80, 0x40, 0x80, 0x88, //### $ # ## +0x81, 0x11, 0x11, 0x00, 0x80, //#..... # +0x88, 0x88, 0x88, 0x88, 0x80, //######### +//Level: 147 +0x11, 0x12,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x80, // ####### +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x11, 0x80, // # ...# +0x00, 0x00, 0x00, 0x88, 0x88, 0x80, 0x01, 0x11, 0x80, // ##### ...# +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x11, 0x80, // # ...# +0x00, 0x00, 0x00, 0x80, 0x08, 0x80, 0x01, 0x11, 0x80, // # ## ...# +0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x01, 0x11, 0x80, // ## ## ...# +0x00, 0x00, 0x08, 0x88, 0x08, 0x88, 0x88, 0x88, 0x80, // ### ######## +0x00, 0x00, 0x08, 0x04, 0x44, 0x08, 0x80, 0x00, 0x00, // # $$$ ## +0x08, 0x88, 0x88, 0x00, 0x40, 0x40, 0x88, 0x88, 0x80, // ##### $ $ ##### +0x88, 0x00, 0x08, 0x40, 0x40, 0x00, 0x80, 0x00, 0x80, //## #$ $ # # +0x82, 0x04, 0x00, 0x40, 0x00, 0x04, 0x00, 0x40, 0x80, //#@ $ $ $ $ # +0x88, 0x88, 0x88, 0x04, 0x40, 0x40, 0x88, 0x88, 0x80, //###### $$ $ ##### +0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, // # $ # +0x00, 0x00, 0x08, 0x88, 0x80, 0x88, 0x80, 0x00, 0x00, // #### ### +0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, // # # +0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, // # # +0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, // # # +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, // #### +//Level: 148 +0x11, 0x0D,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x80, // ######### +0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x80, 0x00, 0x80, // ### # # +0x00, 0x00, 0x00, 0x82, 0x40, 0x04, 0x04, 0x40, 0x80, // #@$ $ $$ # +0x88, 0x80, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x80, //### ###### # +0x81, 0x88, 0x80, 0x00, 0x88, 0x00, 0x88, 0x40, 0x80, //#.### ## ##$ # +0x81, 0x11, 0x11, 0x51, 0x00, 0x88, 0x04, 0x00, 0x80, //#.....*. ## $ # +0x80, 0x58, 0x80, 0x08, 0x40, 0x80, 0x04, 0x00, 0x80, //# *## #$ # $ # +0x80, 0x00, 0x80, 0x04, 0x00, 0x11, 0x11, 0x11, 0x80, //# # $ ......# +0x88, 0x04, 0x88, 0x00, 0x88, 0x88, 0x88, 0x88, 0x80, //## $## ######### +0x08, 0x04, 0x08, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, // # $ #### +0x08, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, // # $ $ # +0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, // # # +0x08, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, // ####### +//Level: 149 +0x0B, 0x0A,//Size x and y +0x08, 0x88, 0x88, 0x00, 0x00, 0x00, // ##### +0x08, 0x02, 0x08, 0x88, 0x88, 0x80, // # @ ###### +0x08, 0x08, 0x11, 0x50, 0x00, 0x80, // # #..* # +0x08, 0x01, 0x11, 0x80, 0x00, 0x80, // # ...# # +0x88, 0x48, 0x80, 0x40, 0x40, 0x80, //##$## $ $ # +0x80, 0x00, 0x84, 0x88, 0x88, 0x80, //# #$##### +0x80, 0x00, 0x40, 0x00, 0x80, 0x00, //# $ # +0x88, 0x88, 0x80, 0x80, 0x80, 0x00, //##### # # +0x00, 0x00, 0x80, 0x00, 0x80, 0x00, // # # +0x00, 0x00, 0x88, 0x88, 0x80, 0x00, // ##### +//Level: 150 +0x07, 0x09,//Size x and y +0x88, 0x88, 0x88, 0x80, //####### +0x80, 0x01, 0x02, 0x80, //# . @# +0x80, 0x41, 0x40, 0x80, //# $.$ # +0x80, 0x51, 0x40, 0x80, //# *.$ # +0x81, 0x45, 0x41, 0x80, //#.$*$.# +0x80, 0x41, 0x50, 0x80, //# $.* # +0x80, 0x41, 0x40, 0x80, //# $.$ # +0x80, 0x01, 0x00, 0x80, //# . # +0x88, 0x88, 0x88, 0x80, //####### +//Level: 151 +0x09, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x80, //######### +0x82, 0x00, 0x50, 0x00, 0x80, //#@ * # +0x80, 0x41, 0x41, 0x40, 0x80, //# $.$.$ # +0x80, 0x14, 0x14, 0x10, 0x80, //# .$.$. # +0x80, 0x01, 0x41, 0x40, 0x80, //# .$.$ # +0x80, 0x00, 0x50, 0x00, 0x80, //# * # +0x88, 0x88, 0x88, 0x88, 0x80, //######### +//Level: 152 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x88, 0x02, 0x88, //#### @## +0x80, 0x05, 0x40, 0x88, //# *$ ## +0x80, 0x00, 0x00, 0x88, //# ## +0x88, 0x01, 0x88, 0x88, //## .#### +0x88, 0x40, 0x88, 0x88, //##$ #### +0x88, 0x01, 0x88, 0x88, //## .#### +0x88, 0x88, 0x88, 0x88, //######## +//Level: 153 +0x09, 0x0C,//Size x and y +0x08, 0x88, 0x80, 0x00, 0x00, // #### +0x08, 0x00, 0x88, 0x88, 0x00, // # #### +0x08, 0x40, 0x20, 0x08, 0x00, // #$ @ # +0x88, 0x00, 0x88, 0x48, 0x80, //## ##$## +0x80, 0x58, 0x18, 0x00, 0x80, //# *#.# # +0x80, 0x11, 0x54, 0x40, 0x80, //# ..*$$ # +0x80, 0x18, 0x18, 0x00, 0x80, //# .#.# # +0x88, 0x00, 0x08, 0x08, 0x80, //## # ## +0x08, 0x88, 0x04, 0x00, 0x80, // ### $ # +0x00, 0x08, 0x08, 0x00, 0x80, // # # # +0x00, 0x08, 0x00, 0x08, 0x80, // # ## +0x00, 0x08, 0x88, 0x88, 0x00, // ##### +//Level: 154 +0x0C, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //############ +0x81, 0x11, 0x08, 0x00, 0x00, 0x08, //#... # # +0x81, 0x10, 0x08, 0x08, 0x80, 0x08, //#.. # ## # +0x81, 0x10, 0x00, 0x00, 0x80, 0x08, //#.. # # +0x81, 0x10, 0x08, 0x04, 0x88, 0x08, //#.. # $## # +0x81, 0x11, 0x08, 0x40, 0x40, 0x08, //#... #$ $ # +0x88, 0x88, 0x88, 0x00, 0x44, 0x08, //###### $$ # +0x08, 0x80, 0x04, 0x04, 0x40, 0x08, // ## $ $$ # +0x08, 0x20, 0x44, 0x40, 0x08, 0x08, // #@ $$$ # # +0x08, 0x80, 0x40, 0x88, 0x00, 0x08, // ## $ ## # +0x00, 0x80, 0x00, 0x00, 0x00, 0x08, // # # +0x00, 0x88, 0x88, 0x88, 0x88, 0x88, // ########## +//Level: 155 +0x0B, 0x0B,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x00, //########## +0x80, 0x00, 0x00, 0x80, 0x08, 0x00, //# # # +0x80, 0x04, 0x04, 0x80, 0x08, 0x80, //# $ $# ## +0x80, 0x08, 0x81, 0x80, 0x00, 0x80, //# ##.# # +0x88, 0x48, 0x81, 0x88, 0x40, 0x80, //##$##.##$ # +0x80, 0x41, 0x11, 0x11, 0x00, 0x80, //# $..... # +0x82, 0x48, 0x81, 0x88, 0x48, 0x80, //#@$##.##$## +0x88, 0x08, 0x81, 0x80, 0x00, 0x80, //## ##.# # +0x80, 0x00, 0x40, 0x40, 0x00, 0x80, //# $ $ # +0x80, 0x00, 0x80, 0x00, 0x88, 0x80, //# # ### +0x88, 0x88, 0x88, 0x88, 0x80, 0x00, //######### +//Level: 156 +0x0F, 0x0C,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, // ##### +0x88, 0x88, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, //##### # +0x80, 0x00, 0x40, 0x20, 0x80, 0x00, 0x00, 0x00, //# $ @ # +0x80, 0x04, 0x08, 0x18, 0x88, 0x88, 0x00, 0x00, //# $ #.##### +0x88, 0x40, 0x88, 0x18, 0x80, 0x08, 0x88, 0x80, //##$ ##.## #### +0x08, 0x00, 0x11, 0x11, 0x10, 0x48, 0x00, 0x80, // # ..... $# # +0x08, 0x04, 0x88, 0x18, 0x80, 0x08, 0x40, 0x80, // # $##.## #$ # +0x08, 0x00, 0x08, 0x18, 0x80, 0x00, 0x00, 0x80, // # #.## # +0x08, 0x88, 0x04, 0x08, 0x88, 0x88, 0x08, 0x80, // ### $ ##### ## +0x00, 0x08, 0x08, 0x40, 0x00, 0x00, 0x40, 0x80, // # #$ $ # +0x00, 0x08, 0x00, 0x00, 0x88, 0x80, 0x00, 0x80, // # ### # +0x00, 0x08, 0x88, 0x88, 0x80, 0x88, 0x88, 0x80, // ###### ##### +//Level: 157 +0x12, 0x10,//Size x and y +0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // #### +0x00, 0x80, 0x08, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, // # ######### +0x08, 0x80, 0x08, 0x80, 0x08, 0x00, 0x08, 0x00, 0x00, // ## ## # # +0x08, 0x00, 0x48, 0x04, 0x24, 0x00, 0x08, 0x88, 0x80, // # $# $@$ #### +0x08, 0x40, 0x04, 0x00, 0x80, 0x40, 0x48, 0x00, 0x88, // #$ $ # $ $# ## +0x88, 0x00, 0x48, 0x80, 0x84, 0x04, 0x00, 0x00, 0x08, //## $## #$ $ # +0x80, 0x08, 0x00, 0x80, 0x80, 0x00, 0x44, 0x40, 0x08, //# # # # $$$ # +0x80, 0x40, 0x00, 0x04, 0x00, 0x48, 0x80, 0x88, 0x88, //# $ $ $## #### +0x80, 0x40, 0x40, 0x84, 0x80, 0x08, 0x00, 0x80, 0x00, //# $ $ #$# # # +0x88, 0x00, 0x88, 0x80, 0x08, 0x88, 0x40, 0x80, 0x00, //## ### ###$ # +0x08, 0x00, 0x81, 0x11, 0x10, 0x00, 0x00, 0x80, 0x00, // # #.... # +0x08, 0x88, 0x81, 0x11, 0x11, 0x18, 0x88, 0x80, 0x00, // ####......#### +0x00, 0x08, 0x11, 0x11, 0x88, 0x88, 0x00, 0x00, 0x00, // #....#### +0x00, 0x08, 0x11, 0x18, 0x80, 0x00, 0x00, 0x00, 0x00, // #...## +0x00, 0x08, 0x11, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, // #...# +0x00, 0x08, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, // ##### +//Level: 158 +0x09, 0x0C,//Size x and y +0x08, 0x88, 0x80, 0x00, 0x00, // #### +0x08, 0x00, 0x80, 0x00, 0x00, // # # +0x08, 0x40, 0x88, 0x80, 0x00, // #$ ### +0x08, 0x00, 0x02, 0x80, 0x00, // # @# +0x88, 0x08, 0x10, 0x88, 0x80, //## #. ### +0x80, 0x08, 0x51, 0x40, 0x80, //# #*.$ # +0x80, 0x44, 0x11, 0x80, 0x80, //# $$..# # +0x88, 0x08, 0x81, 0x00, 0x80, //## ##. # +0x08, 0x04, 0x00, 0x88, 0x80, // # $ ### +0x08, 0x00, 0x88, 0x80, 0x00, // # ### +0x08, 0x00, 0x80, 0x00, 0x00, // # # +0x08, 0x88, 0x80, 0x00, 0x00, // #### +//Level: 159 +0x0F, 0x0D,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x80, // ####### +0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x80, // ##### # +0x08, 0x88, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, // #### $ $ $ $ # +0x08, 0x00, 0x80, 0x04, 0x08, 0x88, 0x00, 0x80, // # # $ ### # +0x08, 0x00, 0x00, 0x20, 0x00, 0x08, 0x40, 0x80, // # @ #$ # +0x08, 0x08, 0x88, 0x08, 0x88, 0x00, 0x00, 0x80, // # ### ### # +0x08, 0x08, 0x11, 0x11, 0x18, 0x04, 0x40, 0x80, // # #.....# $$ # +0x08, 0x08, 0x11, 0x11, 0x18, 0x00, 0x48, 0x80, // # #.....# $## +0x88, 0x48, 0x11, 0x11, 0x14, 0x00, 0x08, 0x00, //##$#.....$ # +0x80, 0x00, 0x08, 0x80, 0x80, 0x08, 0x88, 0x00, //# ## # ### +0x80, 0x40, 0x40, 0x00, 0x44, 0x08, 0x00, 0x00, //# $ $ $$ # +0x88, 0x00, 0x88, 0x88, 0x80, 0x08, 0x00, 0x00, //## ##### # +0x08, 0x88, 0x80, 0x00, 0x88, 0x88, 0x00, 0x00, // #### #### +//Level: 160 +0x10, 0x0C,//Size x and y +0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, //##### +0x81, 0x11, 0x80, 0x88, 0x88, 0x80, 0x00, 0x00, //#...# ##### +0x81, 0x11, 0x88, 0x80, 0x00, 0x80, 0x00, 0x00, //#...### # +0x81, 0x11, 0x10, 0x00, 0x44, 0x88, 0x88, 0x80, //#.... $$##### +0x81, 0x11, 0x10, 0x08, 0x00, 0x80, 0x00, 0x88, //#.... # # ## +0x81, 0x18, 0x48, 0x88, 0x80, 0x84, 0x80, 0x08, //#..#$#### #$# # +0x88, 0x04, 0x00, 0x80, 0x00, 0x00, 0x44, 0x08, //## $ # $$ # +0x80, 0x04, 0x80, 0x20, 0x40, 0x44, 0x80, 0x08, //# $# @ $ $$# # +0x80, 0x40, 0x40, 0x40, 0x80, 0x00, 0x40, 0x88, //# $ $ $ # $ ## +0x80, 0x00, 0x80, 0x04, 0x08, 0x80, 0x00, 0x80, //# # $ ## # +0x88, 0x88, 0x88, 0x00, 0x08, 0x88, 0x88, 0x80, //###### ###### +0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, 0x00, // ##### +//Level: 161 +0x13, 0x0E,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x80, // ######## +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x11, 0x11, 0x80, // # ....# +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, 0x11, 0x11, 0x80, //############ ....# +0x80, 0x00, 0x08, 0x00, 0x40, 0x40, 0x00, 0x11, 0x11, 0x80, //# # $ $ ....# +0x80, 0x44, 0x48, 0x40, 0x04, 0x08, 0x00, 0x11, 0x11, 0x80, //# $$$#$ $ # ....# +0x80, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x11, 0x11, 0x80, //# $ $ # ....# +0x80, 0x44, 0x08, 0x40, 0x40, 0x48, 0x88, 0x88, 0x88, 0x80, //# $$ #$ $ $######## +0x80, 0x04, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, //# $ # # +0x88, 0x08, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, //## ######### +0x80, 0x00, 0x08, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, //# # ## +0x80, 0x00, 0x00, 0x40, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, //# $ ## +0x80, 0x04, 0x48, 0x44, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, //# $$#$$ @# +0x80, 0x00, 0x08, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, //# # ## +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, //########### +//Level: 162 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x00, 0x00, 0x80, 0x00, 0x88, 0x88, 0x80, 0x00, 0x08, //# # ##### # +0x88, 0x04, 0x00, 0x80, 0x00, 0x88, 0x88, 0x00, 0x40, 0x08, //## $ # #### $ # +0x88, 0x88, 0x04, 0x40, 0x00, 0x81, 0x18, 0x00, 0x80, 0x08, //#### $$ #..# # # +0x80, 0x04, 0x00, 0x40, 0x08, 0x81, 0x18, 0x88, 0x80, 0x88, //# $ $ ##..#### ## +0x80, 0x40, 0x00, 0x88, 0x81, 0x11, 0x10, 0x00, 0x44, 0x08, //# $ ###.... $$ # +0x80, 0x08, 0x48, 0x00, 0x01, 0x11, 0x18, 0x08, 0x04, 0x08, //# #$# ....# # $ # +0x80, 0x80, 0x08, 0x04, 0x01, 0x18, 0x88, 0x48, 0x00, 0x08, //# # # $ ..###$# # +0x80, 0x80, 0x00, 0x40, 0x81, 0x18, 0x00, 0x08, 0x80, 0x08, //# # $ #..# ## # +0x80, 0x00, 0x48, 0x00, 0x88, 0x88, 0x00, 0x08, 0x04, 0x88, //# $# #### # $## +0x80, 0x80, 0x08, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x88, //# # # @# ## +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 163 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x18, 0x88, 0x18, //##.###.# +0x88, 0x08, 0x00, 0x18, //## # .# +0x88, 0x04, 0x40, 0x28, //## $$ @# +0x88, 0x00, 0x40, 0x08, //## $ # +0x88, 0x00, 0x80, 0x08, //## # # +0x88, 0x00, 0x88, 0x88, //## #### +0x88, 0x88, 0x88, 0x88, //######## +//Level: 164 +0x0E, 0x0D,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //############## +0x80, 0x00, 0x88, 0x01, 0x11, 0x11, 0x18, //# ## ......# +0x80, 0x08, 0x88, 0x01, 0x18, 0x18, 0x08, //# ### ..#.# # +0x80, 0x48, 0x00, 0x11, 0x88, 0x10, 0x18, //# $# ..##. .# +0x88, 0x08, 0x04, 0x80, 0x80, 0x00, 0x08, //## # $# # # +0x80, 0x40, 0x04, 0x00, 0x00, 0x80, 0x88, //# $ $ # ## +0x80, 0x48, 0x08, 0x04, 0x88, 0x84, 0x08, //# $# # $###$ # +0x82, 0x08, 0x08, 0x04, 0x00, 0x80, 0x08, //#@ # # $ # # +0x80, 0x48, 0x08, 0x84, 0x80, 0x84, 0x08, //# $# ##$# #$ # +0x80, 0x40, 0x00, 0x80, 0x00, 0x00, 0x08, //# $ # # +0x88, 0x80, 0x00, 0x80, 0x88, 0x40, 0x88, //### # ##$ ## +0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x80, // ##### # +0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x80, // ####### +//Level: 165 +0x0F, 0x09,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############### +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, //# # +0x80, 0x41, 0x41, 0x41, 0x41, 0x41, 0x80, 0x80, //# $.$.$.$.$.# # +0x80, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x80, //# .$.$.$.$.$ # +0x80, 0x41, 0x41, 0x41, 0x41, 0x41, 0x82, 0x80, //# $.$.$.$.$.#@# +0x80, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x80, //# .$.$.$.$.$ # +0x80, 0x41, 0x41, 0x41, 0x41, 0x41, 0x80, 0x80, //# $.$.$.$.$.# # +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, //# # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############### +//Level: 166 +0x0F, 0x0B,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, // ####### +0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // # # +0x00, 0x08, 0x04, 0x04, 0x08, 0x80, 0x00, 0x00, // # $ $ ## +0x00, 0x08, 0x88, 0x88, 0x11, 0x88, 0x88, 0x80, // #####..##### +0x88, 0x88, 0x88, 0x11, 0x51, 0x00, 0x40, 0x80, //######..*. $ # +0x80, 0x04, 0x24, 0x11, 0x11, 0x84, 0x40, 0x80, //# $@$....#$$ # +0x80, 0x00, 0x40, 0x84, 0x88, 0x80, 0x00, 0x80, //# $ #$### # +0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x88, 0x80, //##### ### +0x00, 0x00, 0x88, 0x80, 0x08, 0x88, 0x80, 0x00, // ### #### +0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, // # # +0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, // #### +//Level: 167 +0x09, 0x07,//Size x and y +0x00, 0x88, 0x88, 0x80, 0x00, // ##### +0x00, 0x80, 0x00, 0x88, 0x80, // # ### +0x88, 0x81, 0x80, 0x00, 0x80, //###.# # +0x80, 0x41, 0x40, 0x80, 0x80, //# $.$ # # +0x80, 0x85, 0x04, 0x00, 0x80, //# #* $ # +0x82, 0x01, 0x08, 0x88, 0x80, //#@ . #### +0x88, 0x88, 0x88, 0x00, 0x00, //###### +//Level: 168 +0x13, 0x0E,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, // ####### +0x00, 0x00, 0x80, 0x08, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, // # # #### +0x88, 0x88, 0x80, 0x48, 0x40, 0x80, 0x08, 0x80, 0x00, 0x00, //##### $#$ # ## +0x81, 0x10, 0x80, 0x08, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, //#.. # # # # +0x81, 0x10, 0x80, 0x48, 0x40, 0x80, 0x04, 0x88, 0x88, 0x00, //#.. # $#$ # $#### +0x81, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x80, 0x08, 0x00, //#. # #$ # # +0x81, 0x10, 0x00, 0x48, 0x00, 0x80, 0x40, 0x00, 0x08, 0x00, //#.. $# # $ # +0x81, 0x12, 0x80, 0x08, 0x40, 0x84, 0x00, 0x80, 0x08, 0x00, //#..@# #$ #$ # # +0x81, 0x10, 0x80, 0x48, 0x00, 0x00, 0x04, 0x80, 0x08, 0x00, //#.. # $# $# # +0x81, 0x10, 0x80, 0x08, 0x44, 0x84, 0x00, 0x80, 0x08, 0x80, //#.. # #$$#$ # ## +0x81, 0x10, 0x80, 0x48, 0x00, 0x80, 0x04, 0x84, 0x00, 0x80, //#.. # $# # $#$ # +0x81, 0x10, 0x80, 0x08, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, //#.. # # # # # +0x88, 0x10, 0x88, 0x88, 0x00, 0x88, 0x88, 0x80, 0x00, 0x80, //##. #### ##### # +0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x00, 0x88, 0x88, 0x80, // #### #### ##### +//Level: 169 +0x10, 0x0E,//Size x and y +0x88, 0x88, 0x80, 0x88, 0x88, 0x00, 0x00, 0x00, //##### #### +0x81, 0x11, 0x80, 0x80, 0x08, 0x88, 0x80, 0x00, //#...# # #### +0x81, 0x11, 0x88, 0x80, 0x04, 0x00, 0x80, 0x00, //#...### $ # +0x81, 0x11, 0x18, 0x80, 0x40, 0x04, 0x88, 0x80, //#....## $ $### +0x88, 0x11, 0x11, 0x88, 0x00, 0x04, 0x00, 0x80, //##....## $ # +0x88, 0x81, 0x11, 0x08, 0x80, 0x40, 0x40, 0x80, //###... ## $ $ # +0x80, 0x88, 0x00, 0x00, 0x80, 0x04, 0x00, 0x80, //# ## # $ # +0x80, 0x08, 0x80, 0x80, 0x88, 0x80, 0x88, 0x88, //# ## # ### #### +0x80, 0x40, 0x80, 0x84, 0x00, 0x40, 0x00, 0x08, //# $ # #$ $ # +0x80, 0x04, 0x02, 0x04, 0x00, 0x00, 0x40, 0x08, //# $ @ $ $ # +0x80, 0x00, 0x80, 0x40, 0x44, 0x04, 0x08, 0x88, //# # $ $$ $ ### +0x80, 0x08, 0x88, 0x88, 0x80, 0x08, 0x88, 0x00, //# ###### ### +0x80, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, //# ## #### +0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //### +//Level: 170 +0x0D, 0x0D,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, // ######### +0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, // # # +0x08, 0x84, 0x04, 0x04, 0x04, 0x88, 0x00, // ##$ $ $ $## +0x88, 0x00, 0x40, 0x40, 0x40, 0x08, 0x80, //## $ $ $ ## +0x80, 0x40, 0x08, 0x08, 0x00, 0x40, 0x80, //# $ # # $ # +0x80, 0x00, 0x81, 0x11, 0x80, 0x00, 0x80, //# #...# # +0x88, 0x08, 0x11, 0x11, 0x18, 0x08, 0x80, //## #.....# ## +0x08, 0x08, 0x11, 0x11, 0x18, 0x08, 0x00, // # #.....# # +0x08, 0x00, 0x81, 0x81, 0x80, 0x08, 0x00, // # #.#.# # +0x08, 0x40, 0x40, 0x44, 0x40, 0x48, 0x00, // #$ $ $$$ $# +0x08, 0x00, 0x80, 0x00, 0x80, 0x08, 0x00, // # # # # +0x08, 0x88, 0x80, 0x28, 0x88, 0x88, 0x00, // #### @##### +0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, // #### +//Level: 171 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x82, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x00, 0x80, 0x08, //#@ ### # # # +0x80, 0x80, 0x80, 0x08, 0x00, 0x40, 0x04, 0x00, 0x00, 0x08, //# # # # $ $ # +0x88, 0x88, 0x80, 0x00, 0x00, 0x80, 0x40, 0x48, 0x48, 0x08, //##### # $ $#$# # +0x81, 0x81, 0x18, 0x00, 0x00, 0x88, 0x40, 0x40, 0x00, 0x08, //#.#..# ##$ $ # +0x81, 0x11, 0x11, 0x00, 0x00, 0x40, 0x00, 0x80, 0x00, 0x88, //#..... $ # ## +0x81, 0x11, 0x11, 0x00, 0x00, 0x88, 0x84, 0x88, 0x48, 0x88, //#..... ###$##$### +0x81, 0x81, 0x18, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x08, //#.#..# $ # # +0x88, 0x88, 0x80, 0x00, 0x00, 0x80, 0x08, 0x40, 0x04, 0x08, //##### # #$ $ # +0x88, 0x88, 0x80, 0x08, 0x00, 0x40, 0x00, 0x04, 0x04, 0x08, //##### # $ $ $ # +0x88, 0x88, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, //##### # # # # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 172 +0x0E, 0x0E,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, // ########## +0x08, 0x80, 0x08, 0x00, 0x80, 0x08, 0x80, // ## # # ## +0x88, 0x00, 0x48, 0x00, 0x00, 0x00, 0x88, //## $# ## +0x80, 0x00, 0x00, 0x04, 0x80, 0x40, 0x08, //# $# $ # +0x80, 0x44, 0x08, 0x11, 0x80, 0x40, 0x08, //# $$ #..# $ # +0x88, 0x80, 0x83, 0x51, 0x18, 0x80, 0x88, //### #+*..## ## +0x80, 0x00, 0x15, 0x88, 0x11, 0x40, 0x08, //# .*##..$ # +0x80, 0x04, 0x11, 0x88, 0x51, 0x40, 0x08, //# $..##*.$ # +0x88, 0x08, 0x81, 0x15, 0x58, 0x08, 0x88, //## ##..**# ### +0x80, 0x44, 0x08, 0x11, 0x80, 0x04, 0x08, //# $$ #..# $ # +0x80, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, //# # $ # +0x88, 0x00, 0x00, 0x40, 0x84, 0x00, 0x88, //## $ #$ ## +0x08, 0x80, 0x08, 0x00, 0x80, 0x08, 0x80, // ## # # ## +0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, // ########## +//Level: 173 +0x0F, 0x10,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############### +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, //# # +0x80, 0x40, 0x08, 0x04, 0x08, 0x00, 0x00, 0x80, //# $ # $ # # +0x80, 0x40, 0x80, 0x48, 0x40, 0x80, 0x00, 0x80, //# $ # $#$ # # +0x80, 0x48, 0x04, 0x00, 0x04, 0x00, 0x00, 0x80, //# $# $ $ # +0x80, 0x00, 0x40, 0x00, 0x80, 0x48, 0x00, 0x80, //# $ # $# # +0x84, 0x80, 0x40, 0x08, 0x00, 0x40, 0x84, 0x80, //#$# $ # $ #$# +0x80, 0x08, 0x40, 0x80, 0x00, 0x40, 0x00, 0x80, //# #$ # $ # +0x80, 0x00, 0x04, 0x00, 0x04, 0x08, 0x40, 0x80, //# $ $ #$ # +0x80, 0x00, 0x80, 0x48, 0x40, 0x80, 0x40, 0x80, //# # $#$ # $ # +0x80, 0x00, 0x08, 0x04, 0x08, 0x00, 0x40, 0x80, //# # $ # $ # +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, //# # +0x80, 0x88, 0x88, 0x82, 0x88, 0x88, 0x80, 0x80, //# #####@##### # +0x81, 0x11, 0x11, 0x01, 0x11, 0x11, 0x11, 0x80, //#..... .......# +0x81, 0x11, 0x11, 0x01, 0x11, 0x11, 0x11, 0x80, //#..... .......# +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############### +//Level: 174 +0x0A, 0x0C,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x88, // ####### +0x08, 0x88, 0x00, 0x00, 0x08, // ### # +0x88, 0x00, 0x08, 0x08, 0x08, //## # # # +0x80, 0x08, 0x14, 0x44, 0x08, //# #.$$$ # +0x80, 0x81, 0x58, 0x08, 0x88, //# #.*# ### +0x80, 0x01, 0x18, 0x08, 0x00, //# ..# # +0x88, 0x81, 0x14, 0x08, 0x80, //###..$ ## +0x00, 0x81, 0x80, 0x40, 0x80, // #.# $ # +0x08, 0x80, 0x80, 0x82, 0x80, // ## # #@# +0x08, 0x04, 0x00, 0x40, 0x80, // # $ $ # +0x08, 0x00, 0x00, 0x08, 0x80, // # ## +0x08, 0x88, 0x88, 0x88, 0x00, // ####### +//Level: 175 +0x0A, 0x09,//Size x and y +0x08, 0x88, 0x80, 0x00, 0x00, // #### +0x08, 0x00, 0x88, 0x88, 0x80, // # ##### +0x88, 0x40, 0x88, 0x00, 0x80, //##$ ## # +0x80, 0x04, 0x24, 0x00, 0x80, //# $@$ # +0x80, 0x00, 0x88, 0x40, 0x80, //# ##$ # +0x88, 0x81, 0x88, 0x08, 0x88, //###.## ### +0x08, 0x11, 0x14, 0x04, 0x08, // #...$ $ # +0x08, 0x81, 0x10, 0x00, 0x08, // ##.. # +0x00, 0x88, 0x88, 0x88, 0x88, // ######## +//Level: 176 +0x0B, 0x09,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x00, 0x00, // ##### +0x00, 0x08, 0x02, 0x08, 0x00, 0x00, // # @ # +0x00, 0x08, 0x04, 0x08, 0x00, 0x00, // # $ # +0x00, 0x08, 0x41, 0x48, 0x00, 0x00, // #$.$# +0x00, 0x88, 0x14, 0x18, 0x80, 0x00, // ##.$.## +0x88, 0x81, 0x41, 0x41, 0x88, 0x80, //###.$.$.### +0x80, 0x04, 0x14, 0x14, 0x00, 0x80, //# $.$.$ # +0x80, 0x00, 0x01, 0x00, 0x00, 0x80, //# . # +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //########### +//Level: 177 +0x0B, 0x0B,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x00, 0x00, // ##### +0x00, 0x08, 0x00, 0x08, 0x00, 0x00, // # # +0x00, 0x08, 0x04, 0x48, 0x00, 0x00, // # $$# +0x88, 0x88, 0x01, 0x08, 0x88, 0x80, //#### . #### +0x80, 0x40, 0x51, 0x50, 0x00, 0x80, //# $ *.* # +0x80, 0x41, 0x11, 0x11, 0x40, 0x80, //# $.....$ # +0x80, 0x00, 0x51, 0x50, 0x40, 0x80, //# *.* $ # +0x88, 0x88, 0x01, 0x08, 0x88, 0x80, //#### . #### +0x00, 0x08, 0x44, 0x48, 0x00, 0x00, // #$$$# +0x00, 0x08, 0x02, 0x08, 0x00, 0x00, // # @ # +0x00, 0x08, 0x88, 0x88, 0x00, 0x00, // ##### +//Level: 178 +0x08, 0x08,//Size x and y +0x00, 0x88, 0x88, 0x80, // ##### +0x88, 0x80, 0x00, 0x88, //### ## +0x80, 0x01, 0x05, 0x08, //# . * # +0x80, 0x14, 0x18, 0x28, //# .$.#@# +0x88, 0x08, 0x04, 0x08, //## # $ # +0x08, 0x04, 0x08, 0x08, // # $ # # +0x08, 0x88, 0x00, 0x08, // ### # +0x00, 0x08, 0x88, 0x88, // ##### +//Level: 179 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x80, 0x00, //##### +0x80, 0x00, 0x88, 0x88, //# #### +0x80, 0x44, 0x00, 0x08, //# $$ # +0x80, 0x18, 0x10, 0x08, //# .#. # +0x80, 0x08, 0x80, 0x88, //# ## ## +0x80, 0x08, 0x84, 0x80, //# ##$# +0x80, 0x20, 0x01, 0x80, //# @ .# +0x88, 0x88, 0x88, 0x80, //####### +//Level: 180 +0x14, 0x0D,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, // #### +0x88, 0x88, 0x88, 0x88, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, //######## ##### +0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, //# # # +0x80, 0x00, 0x08, 0x08, 0x80, 0x08, 0x00, 0x88, 0x88, 0x00, //# # ## # #### +0x88, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x88, //## # # ### +0x08, 0x00, 0x08, 0x80, 0x00, 0x80, 0x44, 0x48, 0x00, 0x08, // # ## # $$$# # +0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x04, 0x08, // # # $ $ # +0x08, 0x00, 0x80, 0x08, 0x08, 0x08, 0x48, 0x02, 0x80, 0x88, // # # # # #$# @# ## +0x08, 0x88, 0x80, 0x04, 0x04, 0x08, 0x00, 0x04, 0x00, 0x80, // #### $ $ # $ # +0x00, 0x80, 0x40, 0x88, 0x88, 0x80, 0x88, 0x80, 0x48, 0x80, // # $ ##### ### $## +0x00, 0x80, 0x01, 0x11, 0x11, 0x11, 0x11, 0x11, 0x08, 0x00, // # ........... # +0x00, 0x88, 0x80, 0x08, 0x88, 0x88, 0x88, 0x00, 0x88, 0x00, // ### ####### ## +0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x08, 0x88, 0x80, 0x00, // #### #### +//Level: 181 +0x0A, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x00, 0x00, //###### +0x80, 0x00, 0x08, 0x00, 0x00, //# # +0x80, 0x04, 0x08, 0x88, 0x80, //# $ #### +0x80, 0x44, 0x08, 0x00, 0x88, //# $$ # ## +0x80, 0x80, 0x88, 0x40, 0x08, //# # ##$ # +0x81, 0x11, 0x00, 0x11, 0x08, //#... .. # +0x88, 0x88, 0x88, 0x80, 0x88, //####### ## +0x80, 0x00, 0x88, 0x00, 0x08, //# ## # +0x82, 0x40, 0x00, 0x14, 0x08, //#@$ .$ # +0x80, 0x00, 0x88, 0x00, 0x08, //# ## # +0x80, 0x00, 0x88, 0x88, 0x88, //# ###### +0x88, 0x88, 0x80, 0x00, 0x00, //##### +//Level: 182 +0x13, 0x0D,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // ######### +0x00, 0x88, 0x00, 0x08, 0x80, 0x08, 0x88, 0x88, 0x80, 0x00, // ## ## ###### +0x88, 0x80, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x88, 0x80, //### # # ### +0x80, 0x04, 0x08, 0x40, 0x80, 0x08, 0x00, 0x11, 0x10, 0x80, //# $ #$ # # ... # +0x80, 0x80, 0x48, 0x24, 0x88, 0x08, 0x08, 0x18, 0x10, 0x80, //# # $#@$## # #.#. # +0x80, 0x08, 0x08, 0x40, 0x08, 0x00, 0x00, 0x10, 0x10, 0x80, //# # #$ # . . # +0x80, 0x40, 0x00, 0x04, 0x08, 0x08, 0x08, 0x18, 0x10, 0x80, //# $ $ # # #.#. # +0x80, 0x00, 0x88, 0x00, 0x88, 0x40, 0x40, 0x10, 0x10, 0x80, //# ## ##$ $ . . # +0x80, 0x40, 0x80, 0x00, 0x80, 0x08, 0x48, 0x18, 0x10, 0x80, //# $ # # #$#.#. # +0x88, 0x04, 0x00, 0x40, 0x00, 0x40, 0x04, 0x11, 0x10, 0x80, //## $ $ $ $... # +0x08, 0x40, 0x88, 0x88, 0x88, 0x00, 0x00, 0x88, 0x00, 0x80, // #$ ###### ## # +0x08, 0x00, 0x80, 0x00, 0x08, 0x88, 0x88, 0x88, 0x88, 0x80, // # # ########## +0x08, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // #### +//Level: 183 +0x11, 0x0F,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //################# +0x80, 0x00, 0x00, 0x00, 0x81, 0x11, 0x11, 0x11, 0x80, //# #.......# +0x80, 0x44, 0x40, 0x80, 0x41, 0x81, 0x11, 0x11, 0x80, //# $$$ # $.#.....# +0x80, 0x08, 0x04, 0x01, 0x11, 0x11, 0x18, 0x11, 0x80, //# # $ ......#..# +0x80, 0x40, 0x08, 0x08, 0x88, 0x18, 0x11, 0x00, 0x80, //# $ # ###.#.. # +0x80, 0x04, 0x04, 0x40, 0x80, 0x00, 0x00, 0x00, 0x80, //# $ $$ # # +0x80, 0x08, 0x04, 0x00, 0x04, 0x40, 0x08, 0x00, 0x80, //# # $ $$ # # +0x80, 0x88, 0x00, 0x80, 0x80, 0x80, 0x08, 0x80, 0x80, //# ## # # # ## # +0x80, 0x40, 0x48, 0x80, 0x80, 0x88, 0x00, 0x00, 0x80, //# $ $## # ## # +0x80, 0x42, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x80, //# $@$ $ # # +0x80, 0x40, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, //# $ $ # # +0x80, 0x08, 0x84, 0x40, 0x80, 0x08, 0x80, 0x00, 0x80, //# ##$$ # ## # +0x80, 0x44, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x80, //# $$ $ # # +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, //# # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //################# +//Level: 184 +0x0F, 0x10,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, //############# +0x81, 0x11, 0x18, 0x00, 0x88, 0x00, 0x80, 0x00, //#....# ## # +0x81, 0x10, 0x18, 0x04, 0x04, 0x40, 0x80, 0x00, //#.. .# $ $$ # +0x81, 0x11, 0x11, 0x20, 0x88, 0x00, 0x80, 0x00, //#.....@ ## # +0x81, 0x11, 0x18, 0x80, 0x80, 0x08, 0x80, 0x00, //#....## # ## +0x88, 0x18, 0x88, 0x84, 0x80, 0x08, 0x00, 0x00, //##.####$# # +0x80, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, //# # # +0x80, 0x40, 0x04, 0x08, 0x88, 0x48, 0x88, 0x80, //# $ $ ###$#### +0x88, 0x08, 0x88, 0x00, 0x00, 0x40, 0x00, 0x80, //## ### $ # +0x80, 0x40, 0x80, 0x48, 0x08, 0x80, 0x40, 0x80, //# $ # $# ## $ # +0x80, 0x00, 0x04, 0x00, 0x40, 0x88, 0x08, 0x80, //# $ $ ## ## +0x88, 0x88, 0x88, 0x80, 0x04, 0x88, 0x08, 0x80, //####### $## ## +0x00, 0x00, 0x88, 0x84, 0x04, 0x00, 0x00, 0x80, // ###$ $ # +0x00, 0x00, 0x80, 0x00, 0x04, 0x80, 0x00, 0x80, // # $# # +0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x88, 0x80, // # ##### +0x00, 0x00, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, // ####### +//Level: 185 +0x0B, 0x0A,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x88, 0x80, // ###### +0x08, 0x88, 0x88, 0x10, 0x00, 0x80, // #####. # +0x08, 0x00, 0x81, 0x18, 0x80, 0x80, // # #..## # +0x08, 0x00, 0x41, 0x10, 0x00, 0x80, // # $.. # +0x08, 0x00, 0x80, 0x18, 0x08, 0x80, // # # .# ## +0x88, 0x80, 0x88, 0x48, 0x00, 0x80, //### ##$# # +0x80, 0x40, 0x00, 0x04, 0x40, 0x80, //# $ $$ # +0x80, 0x84, 0x80, 0x08, 0x00, 0x80, //# #$# # # +0x82, 0x00, 0x88, 0x88, 0x88, 0x80, //#@ ####### +0x88, 0x88, 0x80, 0x00, 0x00, 0x00, //##### +//Level: 186 +0x07, 0x09,//Size x and y +0x88, 0x88, 0x88, 0x80, //####### +0x82, 0x05, 0x00, 0x80, //#@ * # +0x80, 0x41, 0x04, 0x80, //# $. $# +0x84, 0x05, 0x00, 0x80, //#$ * # +0x81, 0x51, 0x51, 0x80, //#.*.*.# +0x80, 0x01, 0x40, 0x80, //# .$ # +0x80, 0x41, 0x40, 0x80, //# $.$ # +0x80, 0x05, 0x00, 0x80, //# * # +0x88, 0x88, 0x88, 0x80, //####### +//Level: 187 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x00, 0x80, 0x08, 0x28, 0x08, 0x80, 0x08, 0x88, 0x88, //# # #@# ## ##### +0x80, 0x80, 0x80, 0x04, 0x00, 0x00, 0x40, 0x08, 0x88, 0x88, //# # # $ $ ##### +0x80, 0x80, 0x00, 0x08, 0x88, 0x88, 0x80, 0x40, 0x08, 0x88, //# # ###### $ ### +0x80, 0x00, 0x80, 0x08, 0x11, 0x11, 0x80, 0x04, 0x40, 0x08, //# # #....# $$ # +0x88, 0x48, 0x84, 0x88, 0x11, 0x11, 0x80, 0x00, 0x00, 0x08, //##$##$##....# # +0x80, 0x00, 0x00, 0x08, 0x11, 0x11, 0x88, 0x48, 0x84, 0x88, //# #....##$##$## +0x80, 0x04, 0x40, 0x08, 0x11, 0x11, 0x80, 0x00, 0x00, 0x08, //# $$ #....# # +0x80, 0x40, 0x04, 0x00, 0x80, 0x08, 0x00, 0x88, 0x80, 0x08, //# $ $ # # ### # +0x88, 0x88, 0x80, 0x04, 0x00, 0x04, 0x00, 0x00, 0x40, 0x08, //##### $ $ $ # +0x88, 0x88, 0x80, 0x80, 0x00, 0x08, 0x00, 0x80, 0x00, 0x88, //##### # # # ## +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 188 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x08, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x88, //# # # # ## +0x80, 0x48, 0x04, 0x04, 0x08, 0x81, 0x11, 0x40, 0x04, 0x08, //# $# $ $ ##...$ $ # +0x80, 0x04, 0x00, 0x80, 0x88, 0x11, 0x11, 0x80, 0x40, 0x08, //# $ # ##....# $ # +0x80, 0x88, 0x04, 0x08, 0x81, 0x11, 0x18, 0x00, 0x04, 0x08, //# ## $ ##....# $ # +0x80, 0x40, 0x00, 0x08, 0x11, 0x11, 0x88, 0x04, 0x00, 0x08, //# $ #....## $ # +0x80, 0x48, 0x80, 0x08, 0x11, 0x18, 0x00, 0x00, 0x00, 0x08, //# $## #...# # +0x80, 0x00, 0x44, 0x48, 0x84, 0x88, 0x00, 0x88, 0x80, 0x88, //# $$$##$## ### ## +0x80, 0x80, 0x80, 0x08, 0x00, 0x08, 0x00, 0x80, 0x00, 0x08, //# # # # # # # +0x80, 0x40, 0x80, 0x04, 0x00, 0x88, 0x00, 0x00, 0x00, 0x08, //# $ # $ ## # +0x80, 0x00, 0x08, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x08, //# # #@ # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 189 +0x0F, 0x0E,//Size x and y +0x88, 0x88, 0x80, 0x00, 0x00, 0x08, 0x88, 0x80, //##### #### +0x82, 0x00, 0x88, 0x88, 0x88, 0x88, 0x00, 0x80, //#@ ######## # +0x88, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, //## $ $ # +0x08, 0x08, 0x08, 0x00, 0x88, 0x88, 0x00, 0x80, // # # # #### # +0x08, 0x00, 0x40, 0x00, 0x88, 0x88, 0x48, 0x80, // # $ ####$## +0x08, 0x40, 0x88, 0x08, 0x04, 0x04, 0x08, 0x00, // #$ ## # $ $ # +0x88, 0x04, 0x00, 0x48, 0x00, 0x00, 0x08, 0x00, //## $ $# # +0x80, 0x00, 0x80, 0x00, 0x00, 0x08, 0x08, 0x00, //# # # # +0x80, 0x00, 0x88, 0x88, 0x84, 0x88, 0x88, 0x00, //# #####$#### +0x88, 0x88, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, //##### # # +0x00, 0x00, 0x81, 0x11, 0x00, 0x40, 0x80, 0x00, // #... $ # +0x00, 0x00, 0x81, 0x11, 0x18, 0x00, 0x80, 0x00, // #....# # +0x00, 0x00, 0x81, 0x11, 0x18, 0x88, 0x80, 0x00, // #....#### +0x00, 0x00, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, // ###### +//Level: 190 +0x14, 0x10,//Size x and y +0x08, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // #### +0x88, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //## ### +0x82, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //#@$ # +0x88, 0x80, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //### $ # +0x08, 0x00, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, // # ####### +0x08, 0x00, 0x40, 0x11, 0x11, 0x88, 0x88, 0x00, 0x00, 0x00, // # $ ....#### +0x08, 0x00, 0x88, 0x81, 0x11, 0x00, 0x08, 0x88, 0x88, 0x80, // # ###... ###### +0x08, 0x80, 0x88, 0x01, 0x11, 0x80, 0x08, 0x00, 0x00, 0x88, // ## ## ...# # ## +0x08, 0x04, 0x88, 0x01, 0x11, 0x80, 0x88, 0x00, 0x40, 0x08, // # $## ...# ## $ # +0x08, 0x00, 0x00, 0x88, 0x88, 0x80, 0x88, 0x80, 0x84, 0x08, // # ##### ### #$ # +0x08, 0x00, 0x80, 0x08, 0x08, 0x80, 0x80, 0x00, 0x80, 0x08, // # # # ## # # # +0x08, 0x88, 0x88, 0x00, 0x00, 0x80, 0x84, 0x08, 0x04, 0x08, // ##### # #$ # $ # +0x00, 0x00, 0x08, 0x80, 0x80, 0x00, 0x00, 0x40, 0x40, 0x08, // ## # $ $ # +0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x84, 0x04, 0x04, 0x08, // ### #$ $ $ # +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x80, 0x08, // ##### # # +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, // ######## +//Level: 191 +0x0F, 0x0D,//Size x and y +0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //#### +0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //# # +0x80, 0x08, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, //# ########## +0x80, 0x00, 0x08, 0x80, 0x00, 0x00, 0x80, 0x00, //# ## # +0x81, 0x18, 0x00, 0x00, 0x44, 0x80, 0x80, 0x00, //#..# $$# # +0x81, 0x10, 0x08, 0x80, 0x00, 0x40, 0x88, 0x80, //#.. ## $ ### +0x81, 0x18, 0x00, 0x88, 0x48, 0x04, 0x00, 0x80, //#..# ##$# $ # +0x81, 0x10, 0x00, 0x80, 0x24, 0x04, 0x00, 0x80, //#.. # @$ $ # +0x81, 0x18, 0x00, 0x80, 0x40, 0x40, 0x00, 0x80, //#..# # $ $ # +0x80, 0x10, 0x00, 0x80, 0x40, 0x40, 0x88, 0x80, //# . # $ $ ### +0x80, 0x08, 0x00, 0x80, 0x00, 0x88, 0x80, 0x00, //# # # ### +0x80, 0x08, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, //# # ### +0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, //######### +//Level: 192 +0x08, 0x07,//Size x and y +0x00, 0x08, 0x88, 0x88, // ##### +0x88, 0x88, 0x01, 0x08, //#### . # +0x80, 0x52, 0x01, 0x08, //# *@ . # +0x80, 0x40, 0x80, 0x08, //# $ # # +0x80, 0x80, 0x04, 0x08, //# # $ # +0x80, 0x00, 0x88, 0x88, //# #### +0x88, 0x88, 0x80, 0x00, //##### +//Level: 193 +0x13, 0x0B,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, // ####### +0x00, 0x00, 0x88, 0x88, 0x80, 0x08, 0x00, 0x88, 0x88, 0x00, // ##### # #### +0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x08, 0x00, // # # $ # +0x08, 0x88, 0x80, 0x84, 0x40, 0x88, 0x08, 0x80, 0x08, 0x00, // #### #$$ ## ## # +0x88, 0x00, 0x00, 0x00, 0x80, 0x80, 0x08, 0x80, 0x88, 0x80, //## # # ## ### +0x80, 0x08, 0x88, 0x04, 0x84, 0x00, 0x40, 0x04, 0x00, 0x80, //# ### $#$ $ $ # +0x81, 0x11, 0x00, 0x00, 0x80, 0x88, 0x00, 0x80, 0x00, 0x80, //#... # ## # # +0x81, 0x11, 0x80, 0x00, 0x02, 0x08, 0x08, 0x88, 0x08, 0x80, //#...# @ # ### ## +0x81, 0x11, 0x80, 0x08, 0x88, 0x00, 0x40, 0x04, 0x00, 0x80, //#...# ### $ $ # +0x88, 0x88, 0x88, 0x88, 0x08, 0x80, 0x00, 0x80, 0x00, 0x80, //######## ## # # +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x80, // ######### +//Level: 194 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x80, 0x01, 0x88, //### .## +0x80, 0x40, 0x80, 0x88, //# $ # ## +0x80, 0x54, 0x00, 0x88, //# *$ ## +0x80, 0x18, 0x20, 0x88, //# .#@ ## +0x80, 0x00, 0x08, 0x88, //# ### +0x80, 0x00, 0x88, 0x88, //# #### +0x88, 0x88, 0x88, 0x88, //######## +//Level: 195 +0x10, 0x0F,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, // ###### +0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, // # # +0x00, 0x88, 0x80, 0x88, 0x08, 0x00, 0x00, 0x00, // ### ## # +0x88, 0x80, 0x04, 0x00, 0x48, 0x88, 0x88, 0x88, //### $ $####### +0x80, 0x00, 0x40, 0x40, 0x08, 0x00, 0x11, 0x18, //# $ $ # ...# +0x80, 0x84, 0x08, 0x00, 0x48, 0x00, 0x11, 0x18, //# #$ # $# ...# +0x80, 0x80, 0x08, 0x40, 0x00, 0x00, 0x11, 0x18, //# # #$ ...# +0x80, 0x84, 0x08, 0x00, 0x08, 0x00, 0x11, 0x18, //# #$ # # ...# +0x80, 0x80, 0x48, 0x04, 0x48, 0x00, 0x11, 0x18, //# # $# $$# ...# +0x80, 0x82, 0x08, 0x40, 0x08, 0x88, 0x88, 0x88, //# #@ #$ ####### +0x80, 0x80, 0x40, 0x40, 0x88, 0x00, 0x00, 0x00, //# # $ $ ## +0x80, 0x80, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, //# # $ # +0x80, 0x88, 0x80, 0x88, 0x80, 0x00, 0x00, 0x00, //# ### ### +0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, //# # +0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, //####### +//Level: 196 +0x0C, 0x0C,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, // ##### +0x00, 0x88, 0x88, 0x88, 0x00, 0x08, // ###### # +0x88, 0x80, 0x00, 0x01, 0x04, 0x08, //### . $ # +0x80, 0x40, 0x08, 0x41, 0x84, 0x88, //# $ #$.#$## +0x80, 0x08, 0x00, 0x21, 0x80, 0x08, //# # @.# # +0x88, 0x08, 0x88, 0x81, 0x00, 0x08, //## ####. # +0x08, 0x04, 0x00, 0x85, 0x88, 0x88, // # $ #*#### +0x08, 0x08, 0x80, 0x81, 0x00, 0x80, // # ## #. # +0x08, 0x00, 0x00, 0x01, 0x80, 0x80, // # .# # +0x08, 0x88, 0x40, 0x00, 0x00, 0x80, // ###$ # +0x00, 0x08, 0x00, 0x88, 0x88, 0x80, // # ##### +0x00, 0x08, 0x88, 0x80, 0x00, 0x00, // #### +//Level: 197 +0x0E, 0x0D,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x88, 0x88, 0x80, // ########## +0x88, 0x88, 0x11, 0x11, 0x11, 0x00, 0x80, //####...... # +0x80, 0x00, 0x11, 0x11, 0x18, 0x00, 0x80, //# .....# # +0x80, 0x08, 0x11, 0x11, 0x11, 0x08, 0x80, //# #...... ## +0x88, 0x08, 0x88, 0x84, 0x88, 0x48, 0x00, //## ####$##$# +0x82, 0x40, 0x04, 0x04, 0x00, 0x08, 0x88, //#@$ $ $ ### +0x80, 0x44, 0x00, 0x00, 0x88, 0x00, 0x08, //# $$ ## # +0x80, 0x80, 0x04, 0x48, 0x80, 0x08, 0x08, //# # $$## # # +0x80, 0x00, 0x40, 0x08, 0x04, 0x40, 0x08, //# $ # $$ # +0x80, 0x04, 0x00, 0x40, 0x00, 0x84, 0x08, //# $ $ #$ # +0x88, 0x88, 0x00, 0x08, 0x04, 0x04, 0x08, //#### # $ $ # +0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x08, // # # # +0x00, 0x08, 0x88, 0x88, 0x88, 0x88, 0x88, // ########### +//Level: 198 +0x0F, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, //######## +0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, //# # +0x80, 0x44, 0x00, 0x08, 0x88, 0x00, 0x00, 0x00, //# $$ ### +0x80, 0x04, 0x04, 0x44, 0x08, 0x88, 0x88, 0x00, //# $ $$$ ##### +0x88, 0x08, 0x80, 0x11, 0x10, 0x00, 0x08, 0x80, //## ## ... ## +0x08, 0x08, 0x28, 0x11, 0x18, 0x88, 0x40, 0x80, // # #@#...###$ # +0x08, 0x08, 0x04, 0x11, 0x10, 0x00, 0x00, 0x80, // # # $... # +0x88, 0x08, 0x04, 0x11, 0x14, 0x08, 0x08, 0x80, //## # $...$ # ## +0x80, 0x08, 0x88, 0x88, 0x08, 0x88, 0x08, 0x00, //# ##### ### # +0x80, 0x00, 0x00, 0x04, 0x00, 0x04, 0x08, 0x00, //# $ $ # +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x08, 0x00, //########### # +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, // #### +//Level: 199 +0x13, 0x0D,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, // ########### +0x00, 0x00, 0x08, 0x00, 0x10, 0x08, 0x00, 0x08, 0x00, 0x00, // # . # # +0x00, 0x00, 0x08, 0x08, 0x10, 0x00, 0x02, 0x08, 0x00, 0x00, // # #. @ # +0x08, 0x88, 0x88, 0x08, 0x81, 0x18, 0x08, 0x88, 0x80, 0x00, // ##### ##..# #### +0x88, 0x00, 0x80, 0x11, 0x88, 0x80, 0x00, 0x00, 0x88, 0x80, //## # ..### ### +0x80, 0x40, 0x81, 0x11, 0x00, 0x04, 0x08, 0x00, 0x40, 0x80, //# $ #... $ # $ # +0x80, 0x00, 0x01, 0x10, 0x88, 0x00, 0x88, 0x08, 0x80, 0x80, //# .. ## ## ## # +0x88, 0x88, 0x48, 0x84, 0x80, 0x40, 0x80, 0x00, 0x80, 0x80, //####$##$# $ # # # +0x00, 0x88, 0x08, 0x00, 0x00, 0x84, 0x04, 0x40, 0x80, 0x80, // ## # #$ $$ # # +0x00, 0x80, 0x04, 0x08, 0x08, 0x00, 0x80, 0x48, 0x80, 0x80, // # $ # # # $## # +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, // # # +0x00, 0x80, 0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, 0x80, // # ########### # +0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x80, // #### #### +//Level: 200 +0x0F, 0x0C,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // ####### +0x08, 0x00, 0x80, 0x08, 0x88, 0x88, 0x00, 0x00, // # # ##### +0x88, 0x00, 0x80, 0x08, 0x11, 0x18, 0x88, 0x00, //## # #...### +0x80, 0x04, 0x80, 0x08, 0x11, 0x10, 0x08, 0x00, //# $# #... # +0x80, 0x40, 0x84, 0x40, 0x11, 0x10, 0x08, 0x00, //# $ #$$ ... # +0x80, 0x04, 0x80, 0x08, 0x11, 0x10, 0x18, 0x00, //# $# #... .# +0x80, 0x00, 0x80, 0x48, 0x88, 0x88, 0x88, 0x80, //# # $######## +0x88, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, 0x80, //##$ $ $ # +0x88, 0x00, 0x80, 0x04, 0x40, 0x80, 0x00, 0x80, //## # $$ # # +0x08, 0x88, 0x88, 0x80, 0x08, 0x84, 0x42, 0x80, // ###### ##$$@# +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x80, // # ## +0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x00, // ######## +//Level: 201 +0x13, 0x0F,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, //########### +0x81, 0x11, 0x11, 0x10, 0x00, 0x88, 0x88, 0x88, 0x88, 0x80, //#...... ######### +0x81, 0x11, 0x11, 0x10, 0x00, 0x80, 0x08, 0x80, 0x00, 0x80, //#...... # ## # +0x81, 0x18, 0x88, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, //#..### $ $ # +0x81, 0x11, 0x04, 0x04, 0x08, 0x00, 0x08, 0x80, 0x00, 0x80, //#... $ $ # ## # +0x81, 0x11, 0x84, 0x88, 0x88, 0x80, 0x00, 0x08, 0x00, 0x80, //#...#$##### # # +0x88, 0x80, 0x00, 0x08, 0x00, 0x08, 0x40, 0x08, 0x40, 0x80, //### # #$ #$ # +0x00, 0x80, 0x04, 0x40, 0x40, 0x40, 0x04, 0x88, 0x00, 0x80, // # $$ $ $ $## # +0x00, 0x80, 0x04, 0x00, 0x08, 0x48, 0x40, 0x88, 0x40, 0x80, // # $ #$#$ ##$ # +0x00, 0x88, 0x80, 0x88, 0x08, 0x00, 0x00, 0x88, 0x00, 0x80, // ### ## # ## # +0x00, 0x08, 0x00, 0x40, 0x40, 0x88, 0x08, 0x88, 0x88, 0x80, // # $ $ ## ###### +0x00, 0x08, 0x00, 0x00, 0x40, 0x04, 0x00, 0x80, 0x00, 0x00, // # $ $ # +0x00, 0x08, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, // ## # # # +0x00, 0x00, 0x88, 0x88, 0x82, 0x88, 0x88, 0x80, 0x00, 0x00, // #####@##### +0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, // ### +//Level: 202 +0x10, 0x0C,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, // ######### +0x08, 0x00, 0x80, 0x00, 0x08, 0x88, 0x88, 0x88, // # # ####### +0x08, 0x00, 0x00, 0x40, 0x00, 0x80, 0x00, 0x08, // # $ # # +0x88, 0x18, 0x88, 0x80, 0x40, 0x42, 0x48, 0x08, //##.#### $ $@$# # +0x81, 0x11, 0x18, 0x88, 0x00, 0x88, 0x04, 0x08, //#....### ## $ # +0x81, 0x11, 0x18, 0x88, 0x84, 0x08, 0x00, 0x08, //#....####$ # # +0x81, 0x11, 0x10, 0x00, 0x00, 0x00, 0x04, 0x08, //#.... $ # +0x88, 0x80, 0x88, 0x88, 0x48, 0x04, 0x04, 0x08, //### ####$# $ $ # +0x80, 0x00, 0x00, 0x00, 0x08, 0x80, 0x08, 0x88, //# ## ### +0x80, 0x44, 0x04, 0x08, 0x88, 0x88, 0x88, 0x00, //# $$ $ ####### +0x80, 0x08, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, //# ##### +0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //#### +//Level: 203 +0x0E, 0x0C,//Size x and y +0x08, 0x88, 0x88, 0x08, 0x88, 0x88, 0x80, // ##### ###### +0x08, 0x00, 0x08, 0x88, 0x00, 0x00, 0x80, // # ### # +0x88, 0x04, 0x04, 0x08, 0x40, 0x84, 0x80, //## $ $ #$ #$# +0x80, 0x04, 0x02, 0x04, 0x00, 0x40, 0x88, //# $ @ $ $ ## +0x80, 0x80, 0x08, 0x80, 0x81, 0x11, 0x18, //# # ## #....# +0x80, 0x08, 0x80, 0x40, 0x81, 0x88, 0x18, //# ## $ #.##.# +0x88, 0x00, 0x40, 0x00, 0x01, 0x11, 0x18, //## $ ....# +0x08, 0x04, 0x40, 0x84, 0x81, 0x11, 0x18, // # $$ #$#....# +0x08, 0x00, 0x08, 0x00, 0x08, 0x40, 0x88, // # # #$ ## +0x08, 0x88, 0x88, 0x04, 0x00, 0x00, 0x80, // ##### $ # +0x00, 0x00, 0x08, 0x88, 0x80, 0x08, 0x80, // #### ## +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, // #### +//Level: 204 +0x0E, 0x0C,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x88, 0x80, 0x00, // ###### +0x08, 0x88, 0x88, 0x00, 0x00, 0x80, 0x00, // ##### # +0x08, 0x00, 0x80, 0x04, 0x04, 0x80, 0x00, // # # $ $# +0x08, 0x00, 0x40, 0x80, 0x40, 0x88, 0x80, // # $ # $ ### +0x88, 0x00, 0x80, 0x08, 0x00, 0x40, 0x88, //## # # $ ## +0x80, 0x48, 0x00, 0x20, 0x80, 0x00, 0x08, //# $# @ # # +0x80, 0x00, 0x04, 0x04, 0x80, 0x44, 0x08, //# $ $# $$ # +0x80, 0x04, 0x08, 0x41, 0x51, 0x08, 0x88, //# $ #$.*. ### +0x88, 0x00, 0x80, 0x41, 0x11, 0x88, 0x00, //## # $...## +0x08, 0x88, 0x80, 0x81, 0x11, 0x18, 0x00, // #### #....# +0x00, 0x00, 0x80, 0x01, 0x11, 0x18, 0x00, // # ....# +0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x00, // ######## +//Level: 205 +0x07, 0x09,//Size x and y +0x88, 0x88, 0x88, 0x80, //####### +0x80, 0x41, 0x02, 0x80, //# $. @# +0x80, 0x01, 0x00, 0x80, //# . # +0x84, 0x45, 0x40, 0x80, //#$$*$ # +0x81, 0x15, 0x11, 0x80, //#..*..# +0x80, 0x45, 0x40, 0x80, //# $*$ # +0x80, 0x41, 0x40, 0x80, //# $.$ # +0x80, 0x01, 0x00, 0x80, //# . # +0x88, 0x88, 0x88, 0x80, //####### +//Level: 206 +0x0B, 0x0A,//Size x and y +0x88, 0x88, 0x88, 0x80, 0x00, 0x00, //####### +0x80, 0x28, 0x00, 0x88, 0x88, 0x80, //# @# ##### +0x80, 0x44, 0x00, 0x40, 0x00, 0x80, //# $$ $ # +0x80, 0x08, 0x18, 0x84, 0x80, 0x80, //# #.##$# # +0x88, 0x48, 0x11, 0x10, 0x00, 0x80, //##$#... # +0x88, 0x01, 0x11, 0x88, 0x48, 0x80, //## ...##$## +0x80, 0x08, 0x81, 0x88, 0x00, 0x80, //# ##.## # +0x80, 0x04, 0x00, 0x40, 0x00, 0x80, //# $ $ # +0x80, 0x08, 0x00, 0x08, 0x00, 0x80, //# # # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //########### +//Level: 207 +0x13, 0x0D,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, // ################# +0x08, 0x11, 0x10, 0x00, 0x80, 0x00, 0x08, 0x00, 0x08, 0x80, // #... # # ## +0x88, 0x11, 0x11, 0x10, 0x04, 0x88, 0x08, 0x08, 0x40, 0x80, //##..... $## # #$ # +0x81, 0x11, 0x11, 0x18, 0x00, 0x40, 0x08, 0x00, 0x00, 0x80, //#......# $ # # +0x81, 0x11, 0x11, 0x18, 0x00, 0x80, 0x08, 0x08, 0x00, 0x80, //#......# # # # # +0x88, 0x88, 0x88, 0x88, 0x80, 0x40, 0x04, 0x04, 0x00, 0x80, //######### $ $ $ # +0x00, 0x80, 0x00, 0x00, 0x84, 0x88, 0x40, 0x88, 0x48, 0x80, // # #$##$ ##$## +0x08, 0x80, 0x00, 0x40, 0x00, 0x08, 0x04, 0x00, 0x00, 0x80, // ## $ # $ # +0x08, 0x00, 0x88, 0x08, 0x88, 0x08, 0x00, 0x88, 0x40, 0x80, // # ## ### # ##$ # +0x08, 0x04, 0x04, 0x40, 0x00, 0x00, 0x40, 0x04, 0x00, 0x80, // # $ $$ $ $ # +0x08, 0x04, 0x00, 0x00, 0x48, 0x84, 0x08, 0x88, 0x88, 0x80, // # $ $##$ ###### +0x08, 0x88, 0x88, 0x88, 0x00, 0x20, 0x88, 0x00, 0x00, 0x00, // ####### @ ## +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, // ###### +//Level: 208 +0x10, 0x0F,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, // #### +0x00, 0x00, 0x00, 0x08, 0x00, 0x88, 0x00, 0x00, // # ## +0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x80, 0x00, // # ## +0x00, 0x00, 0x00, 0x08, 0x04, 0x40, 0x88, 0x00, // # $$ ## +0x00, 0x00, 0x08, 0x88, 0x40, 0x04, 0x08, 0x80, // ###$ $ ## +0x00, 0x88, 0x88, 0x00, 0x00, 0x40, 0x00, 0x80, // #### $ # +0x88, 0x80, 0x08, 0x08, 0x88, 0x88, 0x00, 0x80, //### # ##### # +0x80, 0x00, 0x08, 0x08, 0x11, 0x11, 0x40, 0x80, //# # #....$ # +0x80, 0x80, 0x00, 0x40, 0x11, 0x11, 0x80, 0x80, //# # $ ....# # +0x80, 0x04, 0x08, 0x08, 0x15, 0x11, 0x80, 0x80, //# $ # #.*..# # +0x88, 0x80, 0x08, 0x88, 0x80, 0x88, 0x80, 0x80, //### #### ### # +0x00, 0x88, 0x88, 0x02, 0x40, 0x08, 0x84, 0x88, // #### @$ ##$## +0x00, 0x00, 0x08, 0x88, 0x04, 0x00, 0x00, 0x08, // ### $ # +0x00, 0x00, 0x00, 0x08, 0x00, 0x88, 0x00, 0x08, // # ## # +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x88, // ######### +//Level: 209 +0x13, 0x0D,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, // ###### +0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x08, 0x88, 0x88, 0x80, // # # ###### +0x00, 0x88, 0x88, 0x80, 0x80, 0x04, 0x08, 0x11, 0x11, 0x80, // ##### # $ #....# +0x08, 0x80, 0x00, 0x88, 0x80, 0x08, 0x08, 0x11, 0x11, 0x80, // ## ### # #....# +0x08, 0x04, 0x04, 0x08, 0x84, 0x88, 0x08, 0x11, 0x11, 0x80, // # $ $ ##$## #....# +0x08, 0x00, 0x80, 0x08, 0x00, 0x08, 0x08, 0x11, 0x11, 0x80, // # # # # #....# +0x08, 0x40, 0x40, 0x04, 0x24, 0x08, 0x08, 0x80, 0x08, 0x80, // #$ $ $@$ # ## ## +0x08, 0x04, 0x80, 0x08, 0x80, 0x88, 0x00, 0x80, 0x08, 0x00, // # $# ## ## # # +0x88, 0x00, 0x04, 0x48, 0x00, 0x88, 0x80, 0x80, 0x08, 0x00, //## $$# ### # # +0x80, 0x04, 0x00, 0x08, 0x04, 0x40, 0x00, 0x00, 0x08, 0x00, //# $ # $$ # +0x80, 0x40, 0x04, 0x08, 0x00, 0x88, 0x88, 0x00, 0x88, 0x00, //# $ $ # #### ## +0x80, 0x00, 0x08, 0x88, 0x88, 0x80, 0x08, 0x88, 0x80, 0x00, //# ###### #### +0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //###### +//Level: 210 +0x10, 0x12,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x88, // ######### +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, // # # +0x00, 0x00, 0x00, 0x08, 0x04, 0x44, 0x44, 0x08, // # $$$$$ # +0x00, 0x00, 0x00, 0x08, 0x04, 0x04, 0x00, 0x08, // # $ $ # +0x00, 0x08, 0x88, 0x88, 0x00, 0x40, 0x40, 0x08, // ##### $ $ # +0x00, 0x08, 0x00, 0x08, 0x88, 0x80, 0x88, 0x88, // # #### #### +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, // # # +0x00, 0x08, 0x88, 0x08, 0x88, 0x80, 0x08, 0x00, // ### #### # +0x00, 0x00, 0x81, 0x11, 0x18, 0x80, 0x88, 0x00, // #....## ## +0x00, 0x00, 0x81, 0x11, 0x18, 0x00, 0x80, 0x00, // #....# # +0x00, 0x00, 0x81, 0x11, 0x18, 0x00, 0x80, 0x00, // #....# # +0x88, 0x88, 0x81, 0x88, 0x80, 0x00, 0x80, 0x00, //#####.### # +0x80, 0x08, 0x80, 0x80, 0x80, 0x88, 0x80, 0x00, //# ## # # ### +0x80, 0x48, 0x84, 0x88, 0x80, 0x08, 0x80, 0x00, //# $##$### ## +0x80, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, //# $ # +0x80, 0x48, 0x00, 0x08, 0x80, 0x08, 0x00, 0x00, //# $# ## # +0x88, 0x28, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, //##@######### +0x08, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ### +//Level: 211 +0x0D, 0x09,//Size x and y +0x88, 0x88, 0x80, 0x88, 0x88, 0x88, 0x80, //##### ####### +0x80, 0x00, 0x88, 0x80, 0x08, 0x00, 0x80, //# ### # # +0x80, 0x40, 0x00, 0x00, 0x40, 0x20, 0x80, //# $ $ @ # +0x88, 0x08, 0x48, 0x81, 0x88, 0x00, 0x80, //## #$##.## # +0x08, 0x00, 0x11, 0x15, 0x10, 0x40, 0x80, // # ...*. $ # +0x08, 0x04, 0x80, 0x81, 0x80, 0x80, 0x80, // # $# #.# # # +0x08, 0x80, 0x00, 0x04, 0x00, 0x00, 0x80, // ## $ # +0x00, 0x80, 0x08, 0x88, 0x88, 0x88, 0x80, // # ######## +0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // #### +//Level: 212 +0x07, 0x09,//Size x and y +0x88, 0x88, 0x88, 0x80, //####### +0x80, 0x01, 0x00, 0x80, //# . # +0x80, 0x01, 0x40, 0x80, //# .$ # +0x80, 0x45, 0x10, 0x80, //# $*. # +0x85, 0x01, 0x45, 0x80, //#* .$*# +0x80, 0x55, 0x40, 0x80, //# **$ # +0x80, 0x01, 0x40, 0x80, //# .$ # +0x80, 0x41, 0x02, 0x80, //# $. @# +0x88, 0x88, 0x88, 0x80, //####### +//Level: 213 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x00, //###### +0x80, 0x00, 0x28, 0x00, //# @# +0x80, 0x48, 0x08, 0x88, //# $# ### +0x80, 0x50, 0x40, 0x08, //# * $ # +0x80, 0x00, 0x88, 0x08, //# ## # +0x88, 0x10, 0x01, 0x08, //##. . # +0x08, 0x80, 0x00, 0x88, // ## ## +0x00, 0x88, 0x88, 0x80, // ##### +//Level: 214 +0x10, 0x0E,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, // ##### +0x08, 0x88, 0x80, 0x00, 0x88, 0x08, 0x88, 0x88, // #### ## ##### +0x08, 0x00, 0x40, 0x00, 0x08, 0x88, 0x00, 0x08, // # $ ### # +0x08, 0x04, 0x24, 0x04, 0x00, 0x00, 0x40, 0x08, // # $@$ $ $ # +0x08, 0x08, 0x48, 0x88, 0x88, 0x88, 0x80, 0x88, // # #$######## ## +0x08, 0x08, 0x00, 0x40, 0x08, 0x00, 0x00, 0x08, // # # $ # # +0x08, 0x08, 0x04, 0x04, 0x08, 0x08, 0x00, 0x08, // # # $ $ # # # +0x88, 0x08, 0x00, 0x48, 0x08, 0x08, 0x88, 0x88, //## # $# # ##### +0x80, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, //# ## # # +0x80, 0x00, 0x04, 0x08, 0x08, 0x88, 0x00, 0x08, //# $ # ### # +0x88, 0x88, 0x80, 0x88, 0x00, 0x81, 0x11, 0x18, //##### ## #....# +0x80, 0x00, 0x04, 0x00, 0x00, 0x01, 0x11, 0x18, //# $ ....# +0x80, 0x00, 0x00, 0x00, 0x00, 0x81, 0x11, 0x18, //# #....# +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //################ +//Level: 215 +0x10, 0x0D,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, //######## +0x80, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, //# # # +0x80, 0x40, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, //# $ #### +0x88, 0x08, 0x84, 0x08, 0x20, 0x88, 0x88, 0x88, //## ##$ #@ ###### +0x08, 0x00, 0x40, 0x48, 0x84, 0x00, 0x80, 0x08, // # $ $##$ # # +0x08, 0x08, 0x00, 0x40, 0x80, 0x40, 0x11, 0x18, // # # $ # $ ...# +0x08, 0x04, 0x08, 0x40, 0x00, 0x08, 0x11, 0x18, // # $ #$ #...# +0x08, 0x00, 0x00, 0x08, 0x80, 0x48, 0x11, 0x18, // # ## $#...# +0x08, 0x88, 0x04, 0x08, 0x00, 0x40, 0x11, 0x18, // ### $ # $ ...# +0x00, 0x08, 0x88, 0x08, 0x00, 0x48, 0x11, 0x18, // ### # $#...# +0x00, 0x00, 0x80, 0x04, 0x40, 0x08, 0x88, 0x88, // # $$ ##### +0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x00, // # ## +0x00, 0x00, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, // ####### +//Level: 216 +0x0E, 0x0E,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //############## +0x80, 0x00, 0x00, 0x00, 0x88, 0x80, 0x08, //# ### # +0x80, 0x44, 0x04, 0x00, 0x00, 0x44, 0x08, //# $$ $ $$ # +0x80, 0x00, 0x00, 0x40, 0x88, 0x80, 0x08, //# $ ### # +0x88, 0x48, 0x88, 0x88, 0x00, 0x80, 0x88, //##$##### # ## +0x88, 0x08, 0x01, 0x11, 0x11, 0x80, 0x08, //## # .....# # +0x88, 0x08, 0x01, 0x11, 0x81, 0x80, 0x08, //## # ...#.# # +0x80, 0x00, 0x81, 0x11, 0x11, 0x84, 0x08, //# #.....#$ # +0x80, 0x00, 0x81, 0x51, 0x11, 0x42, 0x88, //# #.*...$@## +0x80, 0x40, 0x80, 0x08, 0x88, 0x08, 0x88, //# $ # ### ### +0x80, 0x40, 0x88, 0x80, 0x40, 0x40, 0x08, //# $ ### $ $ # +0x80, 0x44, 0x40, 0x00, 0x00, 0x44, 0x08, //# $$$ $$ # +0x80, 0x00, 0x88, 0x80, 0x00, 0x00, 0x08, //# ### # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //############## +//Level: 217 +0x0E, 0x0E,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, // #### +0x00, 0x88, 0x88, 0x88, 0x80, 0x08, 0x80, // ####### ## +0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x80, // # ## # +0x00, 0x80, 0x80, 0x00, 0x41, 0x80, 0x88, // # # $.# ## +0x00, 0x80, 0x00, 0x40, 0x81, 0x02, 0x08, // # $ #. @ # +0x00, 0x88, 0x00, 0x88, 0x11, 0x10, 0x08, // ## ##... # +0x00, 0x08, 0x84, 0x04, 0x11, 0x10, 0x88, // ##$ $... ## +0x00, 0x88, 0x00, 0x88, 0x15, 0x18, 0x80, // ## ##.*.## +0x88, 0x80, 0x40, 0x00, 0x08, 0x88, 0x00, //### $ ### +0x80, 0x44, 0x08, 0x48, 0x48, 0x80, 0x00, //# $$ #$#$## +0x80, 0x80, 0x00, 0x00, 0x40, 0x80, 0x00, //# # $ # +0x80, 0x00, 0x08, 0x80, 0x00, 0x80, 0x00, //# ## # +0x88, 0x80, 0x08, 0x88, 0x88, 0x80, 0x00, //### ###### +0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // #### +//Level: 218 +0x0E, 0x0D,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, // #### +0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x00, // #### #### +0x08, 0x00, 0x80, 0x00, 0x40, 0x88, 0x88, // # # $ #### +0x08, 0x11, 0x10, 0x48, 0x40, 0x80, 0x08, // #... $#$ # # +0x88, 0x18, 0x10, 0x08, 0x00, 0x04, 0x08, //##.#. # $ # +0x81, 0x11, 0x11, 0x08, 0x88, 0x40, 0x08, //#..... ###$ # +0x81, 0x11, 0x18, 0x48, 0x00, 0x40, 0x88, //#....#$# $ ## +0x88, 0x84, 0x88, 0x04, 0x40, 0x00, 0x80, //###$## $$ # +0x08, 0x00, 0x08, 0x00, 0x00, 0x40, 0x80, // # # $ # +0x08, 0x04, 0x00, 0x24, 0x00, 0x88, 0x80, // # $ @$ ### +0x08, 0x88, 0x84, 0x80, 0x88, 0x80, 0x00, // ####$# ### +0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, // # # +0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, // ##### +//Level: 219 +0x0E, 0x0E,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, // ############ +0x88, 0x00, 0x08, 0x00, 0x80, 0x00, 0x88, //## # # ## +0x80, 0x20, 0x48, 0x04, 0x04, 0x04, 0x08, //# @ $# $ $ $ # +0x80, 0x04, 0x00, 0x00, 0x80, 0x40, 0x08, //# $ # $ # +0x80, 0x44, 0x08, 0x11, 0x80, 0x04, 0x08, //# $$ #..# $ # +0x88, 0x80, 0x81, 0x11, 0x18, 0x80, 0x88, //### #....## ## +0x80, 0x00, 0x11, 0x88, 0x11, 0x04, 0x08, //# ..##.. $ # +0x80, 0x40, 0x11, 0x88, 0x11, 0x00, 0x08, //# $ ..##.. # +0x88, 0x08, 0x81, 0x11, 0x18, 0x08, 0x88, //## ##....# ### +0x80, 0x40, 0x08, 0x11, 0x80, 0x40, 0x08, //# $ #..# $ # +0x80, 0x04, 0x08, 0x00, 0x04, 0x04, 0x08, //# $ # $ $ # +0x80, 0x40, 0x40, 0x40, 0x80, 0x40, 0x08, //# $ $ $ # $ # +0x88, 0x00, 0x08, 0x00, 0x80, 0x00, 0x88, //## # # ## +0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, // ############ +//Level: 220 +0x10, 0x0D,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, // ########## +0x00, 0x80, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, // # # # +0x00, 0x80, 0x48, 0x00, 0x04, 0x08, 0x00, 0x00, // # $# $ # +0x00, 0x80, 0x40, 0x48, 0x48, 0x08, 0x00, 0x00, // # $ $#$# # +0x08, 0x88, 0x18, 0x11, 0x10, 0x08, 0x88, 0x88, // ###.#... ##### +0x88, 0x00, 0x11, 0x11, 0x84, 0x08, 0x00, 0x08, //## ....#$ # # +0x80, 0x48, 0x18, 0x85, 0x80, 0x04, 0x44, 0x08, //# $#.##*# $$$ # +0x80, 0x00, 0x11, 0x11, 0x12, 0x80, 0x40, 0x08, //# .....@# $ # +0x80, 0x08, 0x18, 0x11, 0x10, 0x04, 0x04, 0x08, //# #.#... $ $ # +0x80, 0x44, 0x00, 0x48, 0x48, 0x00, 0x40, 0x08, //# $$ $#$# $ # +0x80, 0x00, 0x80, 0x08, 0x00, 0x80, 0x00, 0x88, //# # # # ## +0x88, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x80, //###### ##### +0x00, 0x00, 0x08, 0x88, 0x88, 0x80, 0x00, 0x00, // ###### +//Level: 221 +0x09, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x00, //######## +0x80, 0x08, 0x11, 0x08, 0x80, //# #.. ## +0x80, 0x41, 0x24, 0x50, 0x80, //# $.@$* # +0x80, 0x04, 0x04, 0x00, 0x80, //# $ $ # +0x80, 0x54, 0x01, 0x40, 0x80, //# *$ .$ # +0x88, 0x01, 0x18, 0x00, 0x80, //## ..# # +0x08, 0x88, 0x88, 0x88, 0x80, // ######## +//Level: 222 +0x09, 0x08,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x00, // ##### +0x00, 0x08, 0x00, 0x08, 0x00, // # # +0x00, 0x08, 0x10, 0x48, 0x00, // #. $# +0x00, 0x08, 0x04, 0x08, 0x00, // # $ # +0x88, 0x88, 0x11, 0x08, 0x80, //####.. ## +0x80, 0x40, 0x55, 0x00, 0x80, //# $ ** # +0x80, 0x10, 0x02, 0x40, 0x80, //# . @$ # +0x88, 0x88, 0x88, 0x88, 0x80, //######### +//Level: 223 +0x0E, 0x0F,//Size x and y +0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, //##### +0x80, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, //# ## +0x80, 0x00, 0x08, 0x00, 0x88, 0x88, 0x00, //# # #### +0x80, 0x40, 0x08, 0x88, 0x80, 0x08, 0x00, //# $ #### # +0x80, 0x04, 0x40, 0x40, 0x00, 0x48, 0x00, //# $$ $ $# +0x88, 0x82, 0x08, 0x40, 0x00, 0x08, 0x80, //###@ #$ ## +0x08, 0x00, 0x88, 0x00, 0x40, 0x40, 0x88, // # ## $ $ ## +0x08, 0x04, 0x00, 0x88, 0x08, 0x80, 0x18, // # $ ## ## .# +0x08, 0x00, 0x84, 0x88, 0x40, 0x08, 0x18, // # #$##$ #.# +0x08, 0x88, 0x00, 0x04, 0x11, 0x88, 0x18, // ### $..##.# +0x00, 0x80, 0x00, 0x08, 0x15, 0x11, 0x18, // # #.*...# +0x00, 0x80, 0x44, 0x08, 0x11, 0x11, 0x18, // # $$ #.....# +0x00, 0x80, 0x08, 0x88, 0x88, 0x88, 0x88, // # ######### +0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, // # # +0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // #### +//Level: 224 +0x13, 0x10,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ###### +0x00, 0x80, 0x00, 0x28, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, // # @#### +0x88, 0x88, 0x80, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, //##### $ # +0x80, 0x00, 0x88, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, //# ## #### +0x80, 0x40, 0x80, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, //# $ # ## # +0x80, 0x40, 0x80, 0x08, 0x88, 0x88, 0x08, 0x00, 0x00, 0x00, //# $ # ##### # +0x88, 0x04, 0x00, 0x40, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, //## $ $ # # +0x88, 0x04, 0x04, 0x08, 0x88, 0x08, 0x08, 0x00, 0x00, 0x00, //## $ $ ### # # +0x88, 0x08, 0x00, 0x40, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, //## # $ # # # +0x88, 0x08, 0x08, 0x48, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, //## # #$# # # +0x88, 0x08, 0x88, 0x00, 0x08, 0x08, 0x08, 0x88, 0x88, 0x80, //## ### # # ###### +0x80, 0x04, 0x00, 0x88, 0x88, 0x08, 0x08, 0x11, 0x11, 0x80, //# $ #### # #....# +0x80, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x11, 0x81, 0x80, //# $ $ ..#.# +0x88, 0x88, 0x40, 0x04, 0x80, 0x40, 0x00, 0x11, 0x11, 0x80, //####$ $# $ ....# +0x80, 0x00, 0x00, 0x00, 0x80, 0x08, 0x80, 0x11, 0x11, 0x80, //# # ## ....# +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //################### +//Level: 225 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x20, 0x80, 0x08, //# # #@ # # +0x80, 0x44, 0x00, 0x84, 0x48, 0x08, 0x08, 0x00, 0x88, 0x08, //# $$ #$$# # # ## # +0x80, 0x08, 0x04, 0x04, 0x08, 0x44, 0x08, 0x00, 0x00, 0x08, //# # $ $ #$$ # # +0x88, 0x08, 0x00, 0x80, 0x08, 0x08, 0x08, 0x00, 0x80, 0x08, //## # # # # # # # +0x80, 0x00, 0x88, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, //# ## # # +0x80, 0x00, 0x80, 0x40, 0x80, 0x00, 0x80, 0x00, 0x80, 0x08, //# # $ # # # # +0x80, 0x40, 0x84, 0x08, 0x00, 0x08, 0x00, 0x40, 0x81, 0x18, //# $ #$ # # $ #..# +0x88, 0x40, 0x80, 0x08, 0x88, 0x80, 0x00, 0x08, 0x11, 0x18, //##$ # #### #...# +0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x11, 0x18, //# $ #....# +0x80, 0x00, 0x80, 0x08, 0x00, 0x00, 0x08, 0x11, 0x11, 0x18, //# # # #.....# +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 226 +0x11, 0x10,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, //############# +0x81, 0x11, 0x11, 0x11, 0x18, 0x88, 0x80, 0x00, 0x00, //#........#### +0x81, 0x11, 0x88, 0x88, 0x08, 0x00, 0x88, 0x88, 0x80, //#...#### # ##### +0x81, 0x11, 0x80, 0x08, 0x88, 0x00, 0x00, 0x40, 0x80, //#...# ### $ # +0x81, 0x11, 0x44, 0x00, 0x00, 0x04, 0x04, 0x00, 0x80, //#...$$ $ $ # +0x80, 0x01, 0x80, 0x04, 0x04, 0x80, 0x40, 0x08, 0x80, //# .# $ $# $ ## +0x81, 0x11, 0x80, 0x84, 0x80, 0x00, 0x40, 0x08, 0x00, //#...# #$# $ # +0x81, 0x80, 0x80, 0x40, 0x00, 0x40, 0x00, 0x08, 0x00, //#.# # $ $ # +0x81, 0x00, 0x84, 0x88, 0x84, 0x88, 0x88, 0x48, 0x00, //#. #$###$####$# +0x88, 0x00, 0x80, 0x00, 0x40, 0x40, 0x00, 0x08, 0x00, //## # $ $ # +0x08, 0x00, 0x80, 0x04, 0x24, 0x00, 0x80, 0x08, 0x00, // # # $@$ # # +0x08, 0x00, 0x80, 0x88, 0x88, 0x04, 0x00, 0x48, 0x00, // # # #### $ $# +0x08, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x08, 0x00, // # # ### # +0x08, 0x00, 0x80, 0x44, 0x08, 0x08, 0x88, 0x88, 0x00, // # # $$ # ##### +0x08, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, // # # # +0x08, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // ######### +//Level: 227 +0x0F, 0x0E,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############### +0x80, 0x00, 0x00, 0x08, 0x11, 0x11, 0x11, 0x80, //# #......# +0x80, 0x44, 0x08, 0x04, 0x18, 0x11, 0x11, 0x80, //# $$ # $.#....# +0x80, 0x00, 0x80, 0x48, 0x20, 0x81, 0x11, 0x80, //# # $#@ #...# +0x80, 0x48, 0x04, 0x08, 0x04, 0x08, 0x11, 0x80, //# $# $ # $ #..# +0x80, 0x00, 0x40, 0x08, 0x44, 0x00, 0x11, 0x80, //# $ #$$ ..# +0x80, 0x40, 0x84, 0x08, 0x00, 0x81, 0x41, 0x80, //# $ #$ # #.$.# +0x80, 0x08, 0x00, 0x40, 0x40, 0x08, 0x11, 0x80, //# # $ $ #..# +0x80, 0x80, 0x40, 0x08, 0x00, 0x00, 0x80, 0x80, //# # $ # # # +0x80, 0x00, 0x08, 0x08, 0x48, 0x00, 0x44, 0x80, //# # #$# $$# +0x80, 0x00, 0x80, 0x48, 0x00, 0x80, 0x00, 0x80, //# # $# # # +0x80, 0x08, 0x00, 0x04, 0x40, 0x08, 0x00, 0x80, //# # $$ # # +0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, //# # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############### +//Level: 228 +0x0B, 0x0A,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x00, 0x00, // ##### +0x08, 0x88, 0x00, 0x08, 0x88, 0x00, // ### ### +0x88, 0x02, 0x04, 0x04, 0x08, 0x00, //## @ $ $ # +0x80, 0x08, 0x80, 0x88, 0x08, 0x80, //# ## ## ## +0x80, 0x41, 0x81, 0x40, 0x00, 0x80, //# $.#.$ # +0x80, 0x81, 0x85, 0x80, 0x00, 0x80, //# #.#*# # +0x80, 0x41, 0x11, 0x00, 0x88, 0x80, //# $... ### +0x88, 0x84, 0x80, 0x88, 0x80, 0x00, //###$# ### +0x00, 0x80, 0x00, 0x80, 0x00, 0x00, // # # +0x00, 0x88, 0x88, 0x80, 0x00, 0x00, // ##### +//Level: 229 +0x0F, 0x0F,//Size x and y +0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //#### +0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x88, 0x00, //# #### ##### +0x80, 0x40, 0x00, 0x88, 0x88, 0x00, 0x08, 0x00, //# $ #### # +0x80, 0x40, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, //# $ ## # +0x80, 0x88, 0x84, 0x04, 0x00, 0x40, 0x08, 0x80, //# ###$ $ $ ## +0x80, 0x80, 0x40, 0x04, 0x08, 0x80, 0x00, 0x80, //# # $ $ ## # +0x80, 0x04, 0x08, 0x44, 0x80, 0x00, 0x80, 0x80, //# $ #$$# # # +0x88, 0x00, 0x08, 0x00, 0x84, 0x00, 0x00, 0x80, //## # #$ # +0x08, 0x80, 0x08, 0x80, 0x04, 0x08, 0x08, 0x80, // ## ## $ # ## +0x88, 0x88, 0x18, 0x88, 0x00, 0x48, 0x08, 0x00, //####.### $# # +0x80, 0x08, 0x18, 0x11, 0x08, 0x00, 0x08, 0x00, //# #.#.. # # +0x80, 0x08, 0x11, 0x11, 0x02, 0x08, 0x88, 0x00, //# #.... @ ### +0x80, 0x40, 0x11, 0x11, 0x80, 0x88, 0x00, 0x00, //# $ ....# ## +0x80, 0x00, 0x88, 0x11, 0x00, 0x80, 0x00, 0x00, //# ##.. # +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, //########### +//Level: 230 +0x09, 0x08,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x00, // ##### +0x88, 0x88, 0x00, 0x28, 0x80, //#### @## +0x80, 0x40, 0x40, 0x00, 0x80, //# $ $ # +0x80, 0x81, 0x51, 0x80, 0x80, //# #.*.# # +0x80, 0x81, 0x51, 0x80, 0x80, //# #.*.# # +0x80, 0x00, 0x40, 0x40, 0x80, //# $ $ # +0x88, 0x00, 0x08, 0x88, 0x80, //## #### +0x08, 0x88, 0x88, 0x00, 0x00, // ##### +//Level: 231 +0x0A, 0x09,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x00, // ###### +0x88, 0x80, 0x00, 0x18, 0x00, //### .# +0x80, 0x04, 0x18, 0x88, 0x88, //# $.##### +0x80, 0x44, 0x18, 0x20, 0x08, //# $$.#@ # +0x80, 0x00, 0x88, 0x44, 0x08, //# ##$$ # +0x80, 0x01, 0x41, 0x00, 0x08, //# .$. # +0x88, 0x84, 0x08, 0x88, 0x18, //###$ ###.# +0x00, 0x81, 0x08, 0x08, 0x88, // #. # ### +0x00, 0x88, 0x88, 0x00, 0x00, // #### +//Level: 232 +0x08, 0x08,//Size x and y +0x08, 0x88, 0x88, 0x80, // ###### +0x88, 0x21, 0x00, 0x80, //##@. # +0x80, 0x44, 0x50, 0x80, //# $$* # +0x80, 0x08, 0x00, 0x88, //# # ## +0x80, 0x08, 0x00, 0x18, //# # .# +0x88, 0x88, 0x08, 0x08, //#### # # +0x00, 0x08, 0x00, 0x08, // # # +0x00, 0x08, 0x88, 0x88, // ##### +//Level: 233 +0x13, 0x0F,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, // #### +0x00, 0x00, 0x08, 0x88, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00, // #### # # +0x00, 0x08, 0x88, 0x02, 0x88, 0x84, 0x08, 0x00, 0x00, 0x00, // ### @###$ # +0x00, 0x88, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, // ## $ # +0x08, 0x80, 0x04, 0x04, 0x48, 0x80, 0x88, 0x00, 0x00, 0x00, // ## $ $$## ## +0x08, 0x00, 0x84, 0x88, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // # #$## # +0x08, 0x08, 0x04, 0x04, 0x40, 0x80, 0x88, 0x80, 0x00, 0x00, // # # $ $$ # ### +0x08, 0x00, 0x04, 0x08, 0x00, 0x80, 0x40, 0x88, 0x88, 0x80, // # $ # # $ ##### +0x88, 0x88, 0x00, 0x00, 0x80, 0x04, 0x40, 0x80, 0x00, 0x80, //#### # $$ # # +0x88, 0x88, 0x08, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, //#### ## $ # +0x81, 0x00, 0x00, 0x88, 0x80, 0x08, 0x88, 0x88, 0x88, 0x80, //#. ### ######## +0x81, 0x10, 0x11, 0x80, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, //#.. ..# #### +0x81, 0x11, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //#...#.# +0x81, 0x11, 0x11, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //#.....# +0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //####### +//Level: 234 +0x12, 0x0B,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, // #### +0x08, 0x88, 0x88, 0x88, 0x88, 0x00, 0x88, 0x00, 0x00, // ######### ## +0x88, 0x00, 0x40, 0x00, 0x00, 0x04, 0x08, 0x88, 0x88, //## $ $ ##### +0x80, 0x00, 0x88, 0x08, 0x80, 0x00, 0x88, 0x11, 0x18, //# ## ## ##...# +0x80, 0x84, 0x40, 0x40, 0x44, 0x84, 0x88, 0x11, 0x18, //# #$$ $ $$#$##...# +0x80, 0x80, 0x00, 0x20, 0x00, 0x80, 0x00, 0x11, 0x18, //# # @ # ...# +0x80, 0x04, 0x80, 0x88, 0x84, 0x40, 0x00, 0x11, 0x18, //# $# ###$$ ...# +0x80, 0x40, 0x04, 0x40, 0x04, 0x08, 0x81, 0x11, 0x18, //# $ $$ $ ##....# +0x88, 0x84, 0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x88, //###$ ####### +0x00, 0x80, 0x08, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, // # ####### +0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // #### +//Level: 235 +0x10, 0x10,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //################ +0x81, 0x11, 0x18, 0x00, 0x00, 0x00, 0x00, 0x08, //#....# # +0x81, 0x11, 0x18, 0x08, 0x08, 0x80, 0x08, 0x08, //#....# # ## # # +0x81, 0x11, 0x10, 0x04, 0x08, 0x00, 0x80, 0x08, //#.... $ # # # +0x88, 0x00, 0x80, 0x04, 0x00, 0x08, 0x00, 0x08, //## # $ # # +0x80, 0x00, 0x08, 0x44, 0x44, 0x80, 0x08, 0x08, //# #$$$$# # # +0x80, 0x88, 0x04, 0x00, 0x00, 0x40, 0x88, 0x08, //# ## $ $ ## # +0x80, 0x00, 0x04, 0x08, 0x80, 0x44, 0x40, 0x08, //# $ ## $$$ # +0x80, 0x84, 0x44, 0x08, 0x80, 0x40, 0x08, 0x08, //# #$$$ ## $ # # +0x80, 0x80, 0x04, 0x00, 0x00, 0x40, 0x00, 0x08, //# # $ $ # +0x80, 0x00, 0x88, 0x44, 0x44, 0x80, 0x08, 0x88, //# ##$$$$# ### +0x80, 0x08, 0x00, 0x00, 0x40, 0x08, 0x11, 0x18, //# # $ #...# +0x80, 0x00, 0x00, 0x80, 0x48, 0x00, 0x11, 0x18, //# # $# ...# +0x80, 0x88, 0x08, 0x08, 0x08, 0x00, 0x11, 0x18, //# ## # # # ...# +0x82, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x18, //#@ #...# +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //################ +//Level: 236 +0x14, 0x09,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, // ################## +0x00, 0x80, 0x00, 0x00, 0x00, 0x88, 0x11, 0x18, 0x00, 0x08, // # ##...# # +0x00, 0x80, 0x84, 0x84, 0x80, 0x88, 0x81, 0x11, 0x04, 0x08, // # #$#$# ###... $ # +0x00, 0x80, 0x02, 0x40, 0x04, 0x00, 0x01, 0x18, 0x04, 0x08, // # @$ $ ..# $ # +0x88, 0x88, 0x84, 0x84, 0x80, 0x80, 0x01, 0x10, 0x08, 0x88, //#####$#$# # .. ### +0x80, 0x00, 0x40, 0x40, 0x80, 0x88, 0x88, 0x88, 0x08, 0x80, //# $ $ # ###### ## +0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, //# # # # # # +0x80, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x80, 0x00, 0x80, //# ####### # +0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x88, 0x88, 0x80, //######### ##### +//Level: 237 +0x0E, 0x0D,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, //######### +0x80, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, //# ## +0x80, 0x84, 0x84, 0x82, 0x08, 0x88, 0x88, //# #$#$#@ ##### +0x80, 0x40, 0x00, 0x04, 0x08, 0x00, 0x08, //# $ $ # # +0x88, 0x08, 0x88, 0x80, 0x88, 0x08, 0x08, //## #### ## # # +0x80, 0x08, 0x00, 0x80, 0x00, 0x00, 0x08, //# # # # +0x80, 0x48, 0x00, 0x40, 0x08, 0x88, 0x88, //# $# $ ##### +0x81, 0x14, 0x00, 0x88, 0x08, 0x00, 0x08, //#..$ ## # # +0x81, 0x18, 0x00, 0x80, 0x00, 0x44, 0x08, //#..# # $$ # +0x81, 0x18, 0x88, 0x80, 0x04, 0x00, 0x08, //#..#### $ # +0x85, 0x11, 0x18, 0x04, 0x04, 0x04, 0x08, //#*...# $ $ $ # +0x81, 0x11, 0x18, 0x00, 0x00, 0x00, 0x08, //#....# # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //############## +//Level: 238 +0x0F, 0x0F,//Size x and y +0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, //####### +0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, //# # +0x80, 0x40, 0x44, 0x80, 0x00, 0x00, 0x00, 0x00, //# $ $$# +0x82, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, //#@ $ # +0x80, 0x40, 0x40, 0x88, 0x88, 0x80, 0x00, 0x00, //# $ $ ##### +0x80, 0x40, 0x05, 0x11, 0x11, 0x80, 0x00, 0x00, //# $ *....# +0x88, 0x88, 0x81, 0x88, 0x81, 0x80, 0x00, 0x00, //#####.###.# +0x00, 0x08, 0x81, 0x80, 0x81, 0x80, 0x00, 0x00, // ##.# #.# +0x00, 0x08, 0x01, 0x88, 0x81, 0x88, 0x88, 0x80, // # .###.##### +0x00, 0x08, 0x01, 0x11, 0x15, 0x00, 0x40, 0x80, // # ....* $ # +0x00, 0x08, 0x00, 0x08, 0x80, 0x40, 0x40, 0x80, // # ## $ $ # +0x00, 0x08, 0x88, 0x88, 0x80, 0x04, 0x00, 0x80, // ###### $ # +0x00, 0x00, 0x00, 0x00, 0x84, 0x40, 0x40, 0x80, // #$$ $ # +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, // # # +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x80, // ####### +//Level: 239 +0x09, 0x08,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x80, // ###### +0x88, 0x88, 0x10, 0x02, 0x80, //####. @# +0x80, 0x04, 0x44, 0x00, 0x80, //# $$$ # +0x81, 0x88, 0x18, 0x81, 0x80, //#.##.##.# +0x80, 0x00, 0x40, 0x00, 0x80, //# $ # +0x80, 0x04, 0x18, 0x08, 0x80, //# $.# ## +0x88, 0x80, 0x00, 0x08, 0x00, //### # +0x00, 0x88, 0x88, 0x88, 0x00, // ###### +//Level: 240 +0x0A, 0x08,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x80, // ######## +0x08, 0x00, 0x82, 0x00, 0x88, // # #@ ## +0x88, 0x04, 0x88, 0x80, 0x08, //## $### # +0x80, 0x00, 0x50, 0x50, 0x08, //# * * # +0x80, 0x05, 0x05, 0x05, 0x08, //# * * * # +0x80, 0x10, 0x50, 0x50, 0x08, //# . * * # +0x88, 0x88, 0x00, 0x08, 0x88, //#### ### +0x00, 0x08, 0x88, 0x88, 0x00, // ##### +//Level: 241 +0x06, 0x07,//Size x and y +0x88, 0x88, 0x00, //#### +0x82, 0x08, 0x88, //#@ ### +0x80, 0x44, 0x18, //# $$.# +0x80, 0x04, 0x18, //# $.# +0x80, 0x40, 0x18, //# $ .# +0x80, 0x80, 0x18, //# # .# +0x88, 0x88, 0x88, //###### +//Level: 242 +0x0C, 0x0F,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //############ +0x88, 0x00, 0x00, 0x08, 0x80, 0x08, //## ## # +0x88, 0x00, 0x04, 0x00, 0x04, 0x08, //## $ $ # +0x88, 0x88, 0x08, 0x80, 0x44, 0x08, //#### ## $$ # +0x80, 0x00, 0x40, 0x80, 0x00, 0x08, //# $ # # +0x80, 0x44, 0x40, 0x80, 0x88, 0x88, //# $$$ # #### +0x80, 0x00, 0x80, 0x80, 0x40, 0x88, //# # # $ ## +0x80, 0x08, 0x00, 0x80, 0x04, 0x08, //# # # $ # +0x80, 0x48, 0x04, 0x80, 0x00, 0x08, //# $# $# # +0x80, 0x00, 0x11, 0x80, 0x88, 0x88, //# ..# #### +0x88, 0x88, 0x11, 0x04, 0x08, 0x28, //####.. $ #@# +0x81, 0x11, 0x11, 0x80, 0x48, 0x08, //#.....# $# # +0x88, 0x11, 0x11, 0x80, 0x04, 0x08, //##....# $ # +0x88, 0x81, 0x18, 0x80, 0x00, 0x08, //###..## # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //############ +//Level: 243 +0x12, 0x0D,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, // ######## +0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, // #### ###### +0x00, 0x80, 0x00, 0x08, 0x80, 0x40, 0x40, 0x00, 0x28, // # ## $ $ @# +0x00, 0x80, 0x88, 0x08, 0x84, 0x84, 0x04, 0x04, 0x88, // # ## ##$#$ $ $## +0x88, 0x80, 0x11, 0x11, 0x11, 0x80, 0x04, 0x40, 0x88, //### ......# $$ ## +0x80, 0x00, 0x11, 0x11, 0x11, 0x80, 0x08, 0x00, 0x08, //# ......# # # +0x80, 0x80, 0x11, 0x11, 0x11, 0x84, 0x00, 0x40, 0x08, //# # ......#$ $ # +0x80, 0x84, 0x11, 0x11, 0x11, 0x04, 0x48, 0x04, 0x08, //# #$...... $$# $ # +0x80, 0x00, 0x88, 0x80, 0x88, 0x84, 0x00, 0x40, 0x88, //# ### ###$ $ ## +0x88, 0x80, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x80, //### $ $ $ $ # +0x00, 0x80, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x80, // # $ $ $ $ # +0x00, 0x88, 0x88, 0x88, 0x00, 0x08, 0x88, 0x88, 0x80, // ###### ###### +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, 0x00, // ##### +//Level: 244 +0x0E, 0x10,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, //########## +0x80, 0x00, 0x00, 0x00, 0x08, 0x88, 0x80, //# #### +0x80, 0x88, 0x88, 0x88, 0x08, 0x00, 0x88, //# ###### # ## +0x80, 0x80, 0x40, 0x40, 0x40, 0x04, 0x08, //# # $ $ $ $ # +0x80, 0x00, 0x00, 0x00, 0x84, 0x00, 0x08, //# #$ # +0x88, 0x84, 0x00, 0x44, 0x80, 0x08, 0x88, //###$ $$# ### +0x00, 0x80, 0x08, 0x80, 0x80, 0x48, 0x80, // # ## # $## +0x00, 0x88, 0x48, 0x00, 0x04, 0x02, 0x80, // ##$# $ @# +0x00, 0x08, 0x00, 0x40, 0x40, 0x88, 0x80, // # $ $ ### +0x00, 0x08, 0x08, 0x00, 0x04, 0x00, 0x80, // # # $ # +0x00, 0x08, 0x08, 0x80, 0x00, 0x80, 0x80, // # ## # # +0x00, 0x88, 0x00, 0x88, 0x88, 0x80, 0x80, // ## ##### # +0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, // # # +0x00, 0x81, 0x11, 0x11, 0x11, 0x88, 0x80, // #.......### +0x00, 0x81, 0x11, 0x11, 0x11, 0x80, 0x00, // #.......# +0x00, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, // ######### +//Level: 245 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x00, 0x12, 0x88, //## .@## +0x88, 0x00, 0x04, 0x18, //## $.# +0x88, 0x88, 0x58, 0x08, //####*# # +0x88, 0x00, 0x00, 0x08, //## # +0x80, 0x04, 0x00, 0x88, //# $ ## +0x80, 0x00, 0x88, 0x88, //# #### +0x88, 0x88, 0x88, 0x88, //######## +//Level: 246 +0x0F, 0x10,//Size x and y +0x08, 0x88, 0x80, 0x88, 0x88, 0x80, 0x00, 0x00, // #### ##### +0x08, 0x00, 0x88, 0x80, 0x00, 0x88, 0x00, 0x00, // # ### ## +0x08, 0x04, 0x00, 0x80, 0x80, 0x08, 0x80, 0x00, // # $ # # ## +0x08, 0x04, 0x80, 0x80, 0x88, 0x00, 0x88, 0x00, // # $# # ## ## +0x08, 0x00, 0x04, 0x00, 0x80, 0x40, 0x08, 0x80, // # $ # $ ## +0x08, 0x04, 0x00, 0x40, 0x84, 0x04, 0x00, 0x80, // # $ $ #$ $ # +0x88, 0x80, 0x80, 0x88, 0x80, 0x80, 0x40, 0x80, //### # ### # $ # +0x80, 0x00, 0x00, 0x81, 0x11, 0x18, 0x00, 0x80, //# #....# # +0x80, 0x80, 0x44, 0x01, 0x11, 0x18, 0x80, 0x80, //# # $$ ....## # +0x80, 0x80, 0x00, 0x81, 0x11, 0x10, 0x00, 0x80, //# # #.... # +0x80, 0x08, 0x84, 0x81, 0x11, 0x18, 0x28, 0x80, //# ##$#....#@## +0x80, 0x40, 0x40, 0x00, 0x80, 0x88, 0x88, 0x00, //# $ $ # #### +0x88, 0x00, 0x00, 0x80, 0x40, 0x80, 0x00, 0x00, //## # $ # +0x08, 0x88, 0x88, 0x80, 0x40, 0x80, 0x00, 0x00, // ###### $ # +0x00, 0x00, 0x00, 0x88, 0x00, 0x80, 0x00, 0x00, // ## # +0x00, 0x00, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, // #### +//Level: 247 +0x0E, 0x0F,//Size x and y +0x08, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // ##### +0x88, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, //## ## +0x80, 0x00, 0x00, 0x88, 0x88, 0x80, 0x00, //# ##### +0x80, 0x80, 0x00, 0x04, 0x00, 0x80, 0x00, //# # $ # +0x80, 0x08, 0x04, 0x08, 0x80, 0x80, 0x00, //# # $ ## # +0x88, 0x04, 0x48, 0x11, 0x10, 0x80, 0x00, //## $$#... # +0x08, 0x88, 0x00, 0x11, 0x10, 0x80, 0x00, // ### ... # +0x00, 0x08, 0x88, 0x81, 0x18, 0x88, 0x88, // ####..##### +0x88, 0x88, 0x88, 0x11, 0x18, 0x80, 0x08, //######...## # +0x80, 0x08, 0x88, 0x04, 0x20, 0x84, 0x08, //# ### $@ #$ # +0x80, 0x40, 0x80, 0x00, 0x80, 0x00, 0x08, //# $ # # # +0x80, 0x04, 0x00, 0x84, 0x00, 0x40, 0x88, //# $ #$ $ ## +0x88, 0x00, 0x00, 0x40, 0x08, 0x88, 0x80, //## $ #### +0x08, 0x88, 0x88, 0x00, 0x88, 0x00, 0x00, // ##### ## +0x00, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, // #### +//Level: 248 +0x08, 0x08,//Size x and y +0x00, 0x88, 0x88, 0x88, // ###### +0x88, 0x80, 0x10, 0x08, //### . # +0x80, 0x42, 0x81, 0x08, //# $@#. # +0x80, 0x04, 0x80, 0x88, //# $# ## +0x80, 0x05, 0x00, 0x80, //# * # +0x88, 0x00, 0x80, 0x80, //## # # +0x08, 0x80, 0x00, 0x80, // ## # +0x00, 0x88, 0x88, 0x80, // ##### +//Level: 249 +0x13, 0x0E,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, // ########### +0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, // # # # +0x88, 0x88, 0x80, 0x08, 0x00, 0x00, 0x04, 0x04, 0x08, 0x00, //##### # $ $ # +0x80, 0x00, 0x88, 0x88, 0x80, 0x48, 0x80, 0x80, 0x88, 0x00, //# ##### $## # ## +0x80, 0x40, 0x88, 0x00, 0x08, 0x08, 0x80, 0x40, 0x08, 0x00, //# $ ## # ## $ # +0x80, 0x40, 0x02, 0x44, 0x08, 0x08, 0x84, 0x44, 0x08, 0x00, //# $ @$$ # ##$$$ # +0x88, 0x08, 0x88, 0x00, 0x08, 0x08, 0x80, 0x00, 0x08, 0x00, //## ### # ## # +0x88, 0x08, 0x00, 0x08, 0x88, 0x08, 0x88, 0x88, 0x48, 0x00, //## # ### #####$# +0x88, 0x08, 0x00, 0x00, 0x04, 0x00, 0x81, 0x11, 0x18, 0x00, //## # $ #....# +0x80, 0x08, 0x88, 0x08, 0x80, 0x40, 0x81, 0x11, 0x18, 0x80, //# ### ## $ #....## +0x80, 0x40, 0x00, 0x40, 0x80, 0x00, 0x81, 0x14, 0x10, 0x80, //# $ $ # #..$. # +0x80, 0x08, 0x80, 0x40, 0x80, 0x08, 0x81, 0x11, 0x10, 0x80, //# ## $ # ##.... # +0x88, 0x88, 0x80, 0x00, 0x88, 0x88, 0x88, 0x11, 0x18, 0x80, //##### ######...## +0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x08, 0x88, 0x88, 0x00, // ##### ##### +//Level: 250 +0x13, 0x10,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x08, 0x88, 0x88, 0x80, //############ ###### +0x80, 0x00, 0x80, 0x00, 0x08, 0x08, 0x88, 0x11, 0x11, 0x80, //# # # ###....# +0x80, 0x00, 0x44, 0x80, 0x00, 0x20, 0x01, 0x11, 0x11, 0x80, //# $$# @ .....# +0x80, 0x00, 0x80, 0x88, 0x80, 0x00, 0x80, 0x11, 0x11, 0x80, //# # ### # ....# +0x88, 0x08, 0x80, 0x88, 0x80, 0x08, 0x00, 0x11, 0x11, 0x80, //## ## ### # ....# +0x08, 0x04, 0x04, 0x00, 0x00, 0x08, 0x08, 0x08, 0x88, 0x80, // # $ $ # # #### +0x08, 0x00, 0x40, 0x48, 0x80, 0x08, 0x00, 0x00, 0x00, 0x80, // # $ $## # # +0x88, 0x88, 0x08, 0x00, 0x88, 0x88, 0x08, 0x08, 0x80, 0x80, //#### # #### # ## # +0x80, 0x08, 0x08, 0x40, 0x00, 0x88, 0x08, 0x00, 0x00, 0x80, //# # #$ ## # # +0x80, 0x40, 0x04, 0x00, 0x80, 0x88, 0x08, 0x00, 0x08, 0x80, //# $ $ # ## # ## +0x80, 0x80, 0x40, 0x40, 0x00, 0x08, 0x08, 0x00, 0x08, 0x00, //# # $ $ # # # +0x80, 0x04, 0x08, 0x80, 0x88, 0x08, 0x08, 0x88, 0x88, 0x00, //# $ ## ## # ##### +0x80, 0x44, 0x00, 0x00, 0x04, 0x40, 0x08, 0x00, 0x00, 0x00, //# $$ $$ # +0x88, 0x08, 0x80, 0x88, 0x80, 0x40, 0x08, 0x00, 0x00, 0x00, //## ## ### $ # +0x08, 0x00, 0x00, 0x80, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, // # # # # +0x08, 0x88, 0x88, 0x80, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, // ###### ###### +//Level: 251 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x08, 0x00, 0x88, 0x00, 0x00, 0x80, 0x00, 0x28, 0x88, //# # ## # @### +0x88, 0x00, 0x00, 0x40, 0x00, 0x08, 0x04, 0x88, 0x80, 0x08, //## $ # $### # +0x88, 0x48, 0x04, 0x08, 0x84, 0x80, 0x40, 0x40, 0x00, 0x08, //##$# $ ##$# $ $ # +0x80, 0x00, 0x48, 0x00, 0x00, 0x40, 0x00, 0x00, 0x08, 0x88, //# $# $ ### +0x80, 0x88, 0x00, 0x04, 0x08, 0x88, 0x00, 0x81, 0x11, 0x18, //# ## $ ### #....# +0x80, 0x80, 0x48, 0x08, 0x08, 0x08, 0x08, 0x11, 0x11, 0x88, //# # $# # # # #....## +0x80, 0x00, 0x04, 0x04, 0x08, 0x00, 0x81, 0x11, 0x18, 0x88, //# $ $ # #....### +0x88, 0x40, 0x88, 0x80, 0x04, 0x08, 0x11, 0x11, 0x88, 0x88, //##$ ### $ #....#### +0x80, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, //# # $ ###### +0x80, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x88, 0x88, 0x88, //# # # ###### +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 252 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x88, 0x00, 0x00, 0x88, //# # # ## ## +0x80, 0x48, 0x00, 0x04, 0x08, 0x00, 0x00, 0x08, 0x80, 0x08, //# $# $ # ## # +0x80, 0x40, 0x04, 0x00, 0x81, 0x18, 0x00, 0x00, 0x04, 0x08, //# $ $ #..# $ # +0x80, 0x40, 0x40, 0x08, 0x11, 0x11, 0x80, 0x00, 0x80, 0x88, //# $ $ #....# # ## +0x80, 0x48, 0x00, 0x81, 0x11, 0x11, 0x18, 0x88, 0x04, 0x08, //# $# #......### $ # +0x80, 0x00, 0x80, 0x08, 0x11, 0x11, 0x80, 0x08, 0x40, 0x08, //# # #....# #$ # +0x80, 0x40, 0x08, 0x88, 0x81, 0x18, 0x00, 0x08, 0x00, 0x08, //# $ ####..# # # +0x88, 0x04, 0x00, 0x08, 0x80, 0x80, 0x80, 0x40, 0x04, 0x88, //## $ ## # # $ $## +0x88, 0x80, 0x40, 0x00, 0x04, 0x82, 0x40, 0x48, 0x00, 0x08, //### $ $#@$ $# # +0x88, 0x88, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, //#### # # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 253 +0x0F, 0x10,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, // ############## +0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, // # # # +0x88, 0x08, 0x80, 0x00, 0x08, 0x08, 0x80, 0x80, //## ## # ## # +0x81, 0x11, 0x11, 0x01, 0x11, 0x11, 0x80, 0x80, //#..... .....# # +0x81, 0x10, 0x18, 0x08, 0x10, 0x11, 0x80, 0x80, //#.. .# #. ..# # +0x88, 0x88, 0x88, 0x08, 0x88, 0x88, 0x80, 0x80, //###### ###### # +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, // # # +0x08, 0x88, 0x88, 0x04, 0x88, 0x88, 0x80, 0x80, // ##### $##### # +0x08, 0x00, 0x00, 0x82, 0x80, 0x00, 0x80, 0x80, // # #@# # # +0x88, 0x40, 0x40, 0x84, 0x80, 0x00, 0x80, 0x80, //##$ $ #$# # # +0x80, 0x40, 0x04, 0x04, 0x00, 0x44, 0x40, 0x80, //# $ $ $ $$$ # +0x80, 0x04, 0x00, 0x84, 0x80, 0x00, 0x80, 0x80, //# $ #$# # # +0x80, 0x00, 0x44, 0x80, 0x84, 0x40, 0x80, 0x80, //# $$# #$$ # # +0x88, 0x88, 0x00, 0x00, 0x00, 0x88, 0x80, 0x80, //#### ### # +0x00, 0x08, 0x88, 0x88, 0x80, 0x00, 0x00, 0x80, // ###### # +0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x80, // ####### +//Level: 254 +0x0F, 0x0D,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, //########### +0x80, 0x00, 0x88, 0x11, 0x11, 0x88, 0x88, 0x80, //# ##....##### +0x80, 0x04, 0x00, 0x11, 0x18, 0x80, 0x00, 0x80, //# $ ...## # +0x88, 0x84, 0x40, 0x11, 0x88, 0x80, 0x80, 0x80, //###$$ ..### # # +0x00, 0x80, 0x88, 0x11, 0x18, 0x84, 0x00, 0x80, // # ##...##$ # +0x00, 0x80, 0x80, 0x00, 0x88, 0x80, 0x08, 0x80, // # # ### ## +0x08, 0x80, 0x80, 0x40, 0x04, 0x04, 0x08, 0x00, // ## # $ $ $ # +0x08, 0x00, 0x80, 0x80, 0x80, 0x00, 0x08, 0x00, // # # # # # +0x08, 0x00, 0x00, 0x80, 0x40, 0x84, 0x08, 0x00, // # # $ #$ # +0x08, 0x04, 0x40, 0x80, 0x48, 0x00, 0x88, 0x00, // # $$ # $# ## +0x08, 0x88, 0x08, 0x80, 0x08, 0x08, 0x80, 0x00, // ### ## # ## +0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, // #@ # +0x00, 0x08, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, // ######### +//Level: 255 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x00, 0x80, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x28, //# # # # #@# +0x80, 0x40, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x08, //# $ $ $ # # +0x88, 0x08, 0x88, 0x11, 0x88, 0x08, 0x88, 0x00, 0x00, 0x08, //## ###..## ### # +0x80, 0x00, 0x81, 0x11, 0x18, 0x48, 0x00, 0x48, 0x88, 0x08, //# #....#$# $### # +0x80, 0x40, 0x81, 0x11, 0x18, 0x00, 0x40, 0x04, 0x04, 0x08, //# $ #....# $ $ $ # +0x80, 0x00, 0x81, 0x11, 0x18, 0x08, 0x08, 0x04, 0x04, 0x08, //# #....# # # $ $ # +0x80, 0x00, 0x88, 0x11, 0x88, 0x00, 0x08, 0x48, 0x00, 0x08, //# ##..## #$# # +0x88, 0x48, 0x80, 0x00, 0x08, 0x80, 0x08, 0x00, 0x84, 0x88, //##$## ## # #$## +0x80, 0x00, 0x40, 0x04, 0x00, 0x00, 0x08, 0x00, 0x80, 0x08, //# $ $ # # # +0x80, 0x00, 0x80, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x08, //# # # # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 256 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, //# # # # +0x80, 0x00, 0x00, 0x00, 0x40, 0x08, 0x80, 0x88, 0x80, 0x88, //# $ ## ### ## +0x88, 0x88, 0x80, 0x08, 0x80, 0x00, 0x40, 0x04, 0x00, 0x08, //##### ## $ $ # +0x88, 0x11, 0x88, 0x00, 0x80, 0x80, 0x40, 0x80, 0x80, 0x08, //##..## # # $ # # # +0x81, 0x11, 0x10, 0x04, 0x00, 0x00, 0x08, 0x84, 0x80, 0x88, //#.... $ ##$# ## +0x81, 0x11, 0x10, 0x04, 0x88, 0x88, 0x80, 0x00, 0x84, 0x88, //#.... $##### #$## +0x88, 0x11, 0x80, 0x80, 0x08, 0x00, 0x08, 0x00, 0x40, 0x08, //##..# # # # $ # +0x88, 0x81, 0x80, 0x80, 0x04, 0x00, 0x04, 0x00, 0x80, 0x28, //###.# # $ $ # @# +0x88, 0x00, 0x40, 0x04, 0x08, 0x00, 0x08, 0x00, 0x88, 0x88, //## $ $ # # #### +0x88, 0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x88, 0x88, //## ########### +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 257 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x08, 0x00, 0x80, 0x80, 0x00, 0x08, 0x00, 0x80, 0x08, //# # # # # # # +0x80, 0x00, 0x40, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, //# $ $ $ # +0x88, 0x08, 0x00, 0x84, 0x88, 0x84, 0x88, 0x00, 0x88, 0x08, //## # #$###$## ## # +0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x08, 0x00, 0x40, 0x08, //# $ $ # $ # +0x80, 0x88, 0x84, 0x88, 0x48, 0x00, 0x08, 0x04, 0x00, 0x08, //# ###$##$# # $ # +0x80, 0x80, 0x00, 0x40, 0x40, 0x08, 0x88, 0x88, 0x80, 0x48, //# # $ $ ###### $# +0x80, 0x40, 0x04, 0x40, 0x40, 0x08, 0x28, 0x18, 0x11, 0x18, //# $ $$ $ #@#.#...# +0x80, 0x80, 0x00, 0x00, 0x80, 0x08, 0x08, 0x18, 0x11, 0x18, //# # # # #.#...# +0x80, 0x88, 0x88, 0x88, 0x88, 0x88, 0x08, 0x11, 0x11, 0x18, //# ########## #.....# +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x11, 0x18, //# #.....# +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 258 +0x14, 0x0E,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, // #### +0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x20, 0x80, 0x00, 0x00, // ##########@ # +0x88, 0x80, 0x00, 0x80, 0x00, 0x88, 0x40, 0x88, 0x88, 0x88, //### # ##$ ###### +0x80, 0x04, 0x40, 0x80, 0x00, 0x00, 0x40, 0x80, 0x01, 0x18, //# $$ # $ # ..# +0x80, 0x80, 0x00, 0x80, 0x00, 0x88, 0x40, 0x00, 0x01, 0x18, //# # # ##$ ..# +0x80, 0x80, 0x00, 0x80, 0x44, 0x08, 0x00, 0x80, 0x01, 0x18, //# # # $$ # # ..# +0x80, 0x80, 0x88, 0x88, 0x08, 0x08, 0x88, 0x80, 0x11, 0x18, //# # #### # #### ...# +0x80, 0x84, 0x08, 0x88, 0x08, 0x00, 0x80, 0x88, 0x88, 0x88, //# #$ ### # # ###### +0x80, 0x80, 0x08, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, //# # # # # +0x80, 0x00, 0x00, 0x40, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, //# $ # # +0x80, 0x80, 0x08, 0x88, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, //# # ### ## # +0x80, 0x88, 0x88, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, //# #### # +0x80, 0x00, 0x00, 0x08, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, //# ###### +0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //######## +//Level: 259 +0x0F, 0x0C,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, // ####### +0x00, 0x08, 0x00, 0x00, 0x08, 0x88, 0x88, 0x80, // # ###### +0x00, 0x08, 0x00, 0x48, 0x00, 0x00, 0x00, 0x80, // # $# # +0x88, 0x88, 0x40, 0x04, 0x00, 0x84, 0x40, 0x80, //####$ $ #$$ # +0x80, 0x00, 0x04, 0x40, 0x40, 0x00, 0x40, 0x80, //# $$ $ $ # +0x80, 0x48, 0x00, 0x88, 0x08, 0x88, 0x08, 0x80, //# $# ## ### ## +0x80, 0x28, 0x84, 0x04, 0x00, 0x40, 0x08, 0x00, //# @##$ $ $ # +0x80, 0x00, 0x00, 0x40, 0x04, 0x04, 0x08, 0x00, //# $ $ $ # +0x88, 0x88, 0x88, 0x88, 0x88, 0x44, 0x08, 0x00, //##########$$ # +0x00, 0x81, 0x11, 0x11, 0x11, 0x11, 0x88, 0x00, // #.........## +0x00, 0x81, 0x11, 0x11, 0x11, 0x11, 0x80, 0x00, // #.........# +0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, // ########### +//Level: 260 +0x10, 0x0E,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, // ############## +0x08, 0x20, 0x05, 0x05, 0x05, 0x08, 0x00, 0x88, // #@ * * * # ## +0x08, 0x48, 0x00, 0x50, 0x50, 0x08, 0x00, 0x08, // #$# * * # # +0x08, 0x08, 0x05, 0x05, 0x05, 0x00, 0x00, 0x08, // # # * * * # +0x08, 0x08, 0x00, 0x50, 0x50, 0x08, 0x80, 0x88, // # # * * ## ## +0x08, 0x08, 0x05, 0x05, 0x05, 0x08, 0x80, 0x80, // # # * * * ## # +0x08, 0x08, 0x00, 0x50, 0x50, 0x08, 0x80, 0x80, // # # * * ## # +0x08, 0x08, 0x05, 0x05, 0x05, 0x08, 0x80, 0x80, // # # * * * ## # +0x08, 0x08, 0x00, 0x50, 0x50, 0x08, 0x80, 0x80, // # # * * ## # +0x08, 0x08, 0x05, 0x01, 0x05, 0x08, 0x80, 0x88, // # # * . * ## ## +0x88, 0x08, 0x88, 0x88, 0x88, 0x88, 0x80, 0x08, //## ########## # +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, //# # +0x80, 0x00, 0x88, 0x88, 0x88, 0x88, 0x80, 0x08, //# ######### # +0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x88, 0x88, //##### #### +//Level: 261 +0x08, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x81, 0x11, 0x11, 0x08, //#..... # +0x84, 0x08, 0x84, 0x08, //#$ ##$ # +0x80, 0x48, 0x80, 0x08, //# $## # +0x80, 0x04, 0x24, 0x08, //# $@$ # +0x80, 0x00, 0x00, 0x88, //# ## +0x88, 0x88, 0x88, 0x80, //####### +//Level: 262 +0x13, 0x0D,//Size x and y +0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //##### +0x80, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //# ## +0x80, 0x40, 0x08, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, //# $ ######### +0x88, 0x08, 0x08, 0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x80, //## # # ###### +0x88, 0x08, 0x00, 0x04, 0x84, 0x82, 0x00, 0x80, 0x00, 0x80, //## # $#$#@ # # +0x80, 0x08, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x40, 0x80, //# # $ # $ # +0x80, 0x08, 0x88, 0x08, 0x88, 0x88, 0x88, 0x88, 0x08, 0x80, //# ### ######### ## +0x80, 0x08, 0x80, 0x11, 0x51, 0x11, 0x11, 0x08, 0x08, 0x80, //# ## ..*..... # ## +0x88, 0x08, 0x80, 0x51, 0x51, 0x15, 0x15, 0x08, 0x08, 0x80, //## ## *.*..*.* # ## +0x80, 0x48, 0x88, 0x88, 0x88, 0x88, 0x80, 0x88, 0x40, 0x80, //# $########## ##$ # +0x80, 0x04, 0x00, 0x04, 0x00, 0x40, 0x00, 0x04, 0x00, 0x80, //# $ $ $ $ # +0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x80, //# # # # # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //################### +//Level: 263 +0x13, 0x10,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x80, // ###### +0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x11, 0x11, 0x80, // #############....# +0x88, 0x00, 0x08, 0x80, 0x00, 0x00, 0x88, 0x11, 0x11, 0x80, //## ## ##....# +0x80, 0x04, 0x48, 0x80, 0x04, 0x02, 0x88, 0x11, 0x11, 0x80, //# $$## $ @##....# +0x80, 0x00, 0x00, 0x04, 0x40, 0x48, 0x00, 0x11, 0x11, 0x80, //# $$ $# ....# +0x80, 0x04, 0x08, 0x80, 0x44, 0x08, 0x08, 0x01, 0x11, 0x80, //# $ ## $$ # # ...# +0x80, 0x04, 0x08, 0x80, 0x40, 0x08, 0x00, 0x11, 0x11, 0x80, //# $ ## $ # ....# +0x88, 0x08, 0x88, 0x88, 0x08, 0x88, 0x08, 0x81, 0x88, 0x80, //## ##### ### ##.### +0x88, 0x00, 0x04, 0x00, 0x40, 0x88, 0x00, 0x01, 0x00, 0x80, //## $ $ ## . # +0x80, 0x48, 0x88, 0x00, 0x80, 0x88, 0x88, 0x80, 0x88, 0x80, //# $### # ##### ### +0x80, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, //# $ # # +0x80, 0x04, 0x08, 0x40, 0x40, 0x48, 0x88, 0x00, 0x80, 0x00, //# $ #$ $ $### # +0x80, 0x44, 0x48, 0x04, 0x00, 0x08, 0x08, 0x88, 0x80, 0x00, //# $$$# $ # #### +0x80, 0x00, 0x08, 0x00, 0x44, 0x08, 0x00, 0x00, 0x00, 0x00, //# # $$ # +0x88, 0x88, 0x88, 0x00, 0x08, 0x88, 0x00, 0x00, 0x00, 0x00, //###### ### +0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, // ##### +//Level: 264 +0x10, 0x0E,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x08, 0x88, 0x88, 0x80, // ####### ###### +0x08, 0x00, 0x00, 0x08, 0x88, 0x00, 0x00, 0x80, // # ### # +0x08, 0x00, 0x88, 0x08, 0x00, 0x44, 0x80, 0x88, // # ## # $$# ## +0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x08, // #$ $ $ $ $ # +0x08, 0x04, 0x04, 0x08, 0x00, 0x08, 0x00, 0x08, // # $ $ # # # +0x88, 0x00, 0x44, 0x08, 0x88, 0x88, 0x81, 0x88, //## $$ ######.## +0x80, 0x40, 0x00, 0x08, 0x00, 0x08, 0x11, 0x18, //# $ # #...# +0x82, 0x84, 0x40, 0x88, 0x00, 0x08, 0x11, 0x18, //#@#$$ ## #...# +0x80, 0x04, 0x00, 0x08, 0x00, 0x08, 0x11, 0x18, //# $ # #...# +0x88, 0x00, 0x84, 0x08, 0x00, 0x08, 0x11, 0x18, //## #$ # #...# +0x08, 0x44, 0x80, 0x08, 0x88, 0x88, 0x11, 0x18, // #$$# #####...# +0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, 0x18, // # $ ...# +0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, 0x08, // ########### # +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x88, // ##### +//Level: 265 +0x14, 0x0E,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x80, 0x88, 0x88, 0x00, 0x00, // #### #### +0x00, 0x00, 0x08, 0x88, 0x00, 0x80, 0x80, 0x08, 0x00, 0x00, // ### # # # +0x00, 0x88, 0x88, 0x00, 0x40, 0x88, 0x80, 0x48, 0x00, 0x00, // #### $ ### $# +0x00, 0x80, 0x40, 0x00, 0x40, 0x00, 0x00, 0x08, 0x00, 0x00, // # $ $ # +0x88, 0x80, 0x08, 0x80, 0x40, 0x04, 0x00, 0x48, 0x00, 0x00, //### ## $ $ $# +0x80, 0x00, 0x00, 0x00, 0x80, 0x40, 0x88, 0x08, 0x00, 0x00, //# # $ ## # +0x80, 0x84, 0x44, 0x48, 0x04, 0x40, 0x40, 0x08, 0x00, 0x00, //# #$$$$# $$ $ # +0x80, 0x00, 0x04, 0x04, 0x40, 0x88, 0x88, 0x08, 0x88, 0x88, //# $ $$ #### ##### +0x88, 0x88, 0x00, 0x00, 0x40, 0x28, 0x80, 0x11, 0x11, 0x18, //#### $ @## .....# +0x08, 0x00, 0x44, 0x88, 0x08, 0x88, 0x80, 0x11, 0x11, 0x88, // # $$## #### ....## +0x08, 0x04, 0x00, 0x81, 0x11, 0x18, 0x80, 0x11, 0x88, 0x80, // # $ #....## ..### +0x08, 0x08, 0x00, 0x41, 0x11, 0x18, 0x88, 0x88, 0x80, 0x00, // # # $....###### +0x08, 0x88, 0x80, 0x01, 0x11, 0x18, 0x00, 0x00, 0x00, 0x00, // #### ....# +0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // ######## +//Level: 266 +0x0F, 0x0E,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, // ###### +0x08, 0x88, 0x80, 0x00, 0x08, 0x88, 0x88, 0x80, // #### ###### +0x08, 0x00, 0x80, 0x40, 0x00, 0x08, 0x00, 0x80, // # # $ # # +0x08, 0x04, 0x00, 0x84, 0x40, 0x04, 0x40, 0x80, // # $ #$$ $$ # +0x08, 0x00, 0x48, 0x00, 0x81, 0x18, 0x10, 0x80, // # $# #..#. # +0x88, 0x40, 0x08, 0x08, 0x11, 0x15, 0x18, 0x80, //##$ # #...*.## +0x80, 0x40, 0x80, 0x40, 0x11, 0x88, 0x10, 0x80, //# $ # $ ..##. # +0x80, 0x84, 0x04, 0x08, 0x11, 0x11, 0x10, 0x80, //# #$ $ #..... # +0x80, 0x00, 0x08, 0x00, 0x80, 0x08, 0x88, 0x80, //# # # #### +0x80, 0x48, 0x00, 0x80, 0x00, 0x28, 0x80, 0x00, //# $# # @## +0x80, 0x00, 0x04, 0x80, 0x80, 0x08, 0x00, 0x00, //# $# # # +0x88, 0x88, 0x00, 0x40, 0x88, 0x88, 0x00, 0x00, //#### $ #### +0x00, 0x08, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, // # ### +0x00, 0x08, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, // #### +//Level: 267 +0x0D, 0x0D,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, // #### +0x00, 0x00, 0x80, 0x28, 0x88, 0x00, 0x00, // # @### +0x00, 0x88, 0x80, 0x40, 0x08, 0x80, 0x00, // ### $ ## +0x08, 0x80, 0x04, 0x14, 0x00, 0x80, 0x00, // ## $.$ # +0x08, 0x00, 0x41, 0x51, 0x40, 0x88, 0x80, // # $.*.$ ### +0x88, 0x04, 0x15, 0x15, 0x14, 0x00, 0x80, //## $.*.*.$ # +0x80, 0x41, 0x51, 0x51, 0x51, 0x40, 0x80, //# $.*.*.*.$ # +0x80, 0x04, 0x15, 0x15, 0x14, 0x08, 0x80, //# $.*.*.$ ## +0x88, 0x80, 0x41, 0x51, 0x40, 0x08, 0x00, //### $.*.$ # +0x00, 0x80, 0x04, 0x14, 0x00, 0x88, 0x00, // # $.$ ## +0x00, 0x88, 0x00, 0x40, 0x88, 0x80, 0x00, // ## $ ### +0x00, 0x08, 0x88, 0x00, 0x80, 0x00, 0x00, // ### # +0x00, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, // #### +//Level: 268 +0x0D, 0x0B,//Size x and y +0x08, 0x88, 0x80, 0x08, 0x88, 0x88, 0x80, // #### ###### +0x08, 0x00, 0x88, 0x88, 0x00, 0x00, 0x80, // # #### # +0x88, 0x50, 0x00, 0x50, 0x55, 0x00, 0x80, //##* * ** # +0x80, 0x40, 0x50, 0x00, 0x05, 0x80, 0x80, //# $ * *# # +0x80, 0x10, 0x00, 0x88, 0x80, 0x00, 0x80, //# . ### # +0x88, 0x88, 0x88, 0x00, 0x08, 0x28, 0x80, //###### #@## +0x80, 0x50, 0x10, 0x50, 0x05, 0x50, 0x80, //# * . * ** # +0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, //# # # # +0x88, 0x50, 0x00, 0x50, 0x84, 0x80, 0x80, //##* * #$# # +0x08, 0x00, 0x88, 0x88, 0x80, 0x00, 0x80, // # ##### # +0x08, 0x88, 0x80, 0x00, 0x88, 0x88, 0x80, // #### ##### +//Level: 269 +0x09, 0x09,//Size x and y +0x00, 0x88, 0x88, 0x80, 0x00, // ##### +0x00, 0x80, 0x00, 0x88, 0x00, // # ## +0x88, 0x84, 0x00, 0x08, 0x80, //###$ ## +0x80, 0x01, 0x41, 0x40, 0x80, //# .$.$ # +0x80, 0x81, 0x81, 0x80, 0x80, //# #.#.# # +0x80, 0x05, 0x45, 0x00, 0x80, //# *$* # +0x88, 0x80, 0x00, 0x88, 0x80, //### ### +0x00, 0x80, 0x20, 0x80, 0x00, // # @ # +0x00, 0x88, 0x88, 0x80, 0x00, // ##### +//Level: 270 +0x08, 0x07,//Size x and y +0x88, 0x88, 0x80, 0x00, //##### +0x80, 0x00, 0x88, 0x80, //# ### +0x80, 0x80, 0x52, 0x88, //# # *@## +0x80, 0x05, 0x00, 0x08, //# * # +0x88, 0x84, 0x00, 0x08, //###$ # +0x00, 0x80, 0x00, 0x18, // # .# +0x00, 0x88, 0x88, 0x88, // ###### +//Level: 271 +0x11, 0x10,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, // ######## +0x00, 0x08, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, // # # # +0x00, 0x08, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, // # $ # +0x08, 0x88, 0x08, 0x40, 0x00, 0x88, 0x88, 0x00, 0x00, // ### #$ #### +0x08, 0x00, 0x40, 0x08, 0x84, 0x00, 0x08, 0x00, 0x00, // # $ ##$ # +0x08, 0x00, 0x80, 0x20, 0x40, 0x80, 0x48, 0x00, 0x00, // # # @ $ # $# +0x08, 0x00, 0x80, 0x00, 0x00, 0x04, 0x08, 0x88, 0x80, // # # $ #### +0x08, 0x80, 0x88, 0x88, 0x48, 0x80, 0x00, 0x00, 0x80, // ## ####$## # +0x08, 0x04, 0x81, 0x11, 0x11, 0x80, 0x80, 0x00, 0x80, // # $#.....# # # +0x08, 0x00, 0x41, 0x15, 0x51, 0x04, 0x80, 0x88, 0x80, // # $..**. $# ### +0x88, 0x00, 0x81, 0x11, 0x11, 0x80, 0x00, 0x80, 0x00, //## #.....# # +0x80, 0x00, 0x88, 0x80, 0x88, 0x88, 0x88, 0x80, 0x00, //# ### ####### +0x80, 0x44, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, //# $$ # # +0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, //# # # +0x88, 0x88, 0x88, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, //###### # +0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // ##### +//Level: 272 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x88, 0x11, 0x10, 0x00, 0x88, 0x08, 0x00, 0x00, 0x80, 0x08, //##... ## # # # +0x81, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x88, 0x08, //#.... $ ## # +0x81, 0x11, 0x18, 0x08, 0x08, 0x48, 0x88, 0x40, 0x00, 0x08, //#....# # #$###$ # +0x81, 0x11, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x08, //#...# # # # +0x88, 0x18, 0x00, 0x84, 0x08, 0x00, 0x00, 0x04, 0x88, 0x08, //##.# #$ # $## # +0x80, 0x08, 0x00, 0x80, 0x40, 0x40, 0x88, 0x80, 0x04, 0x08, //# # # $ $ ### $ # +0x80, 0x00, 0x00, 0x40, 0x04, 0x08, 0x00, 0x80, 0x88, 0x08, //# $ $ # # ## # +0x88, 0x08, 0x08, 0x80, 0x84, 0x48, 0x04, 0x80, 0x08, 0x08, //## # ## #$$# $# # # +0x80, 0x08, 0x00, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00, 0x88, //# # $ $ # ## +0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x80, 0x00, 0x28, //# # # # @# +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 273 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x00, 0x08, 0x00, 0x80, 0x80, 0x08, 0x00, 0x80, 0x08, //# # # # # # # +0x80, 0x28, 0x08, 0x08, 0x80, 0x40, 0x00, 0x40, 0x00, 0x88, //# @# # ## $ $ ## +0x88, 0x88, 0x08, 0x00, 0x00, 0x80, 0x08, 0x04, 0x00, 0x08, //#### # # # $ # +0x80, 0x00, 0x08, 0x08, 0x80, 0x84, 0x08, 0x80, 0x88, 0x08, //# # ## #$ ## ## # +0x80, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, //# $ $ $ # +0x81, 0x18, 0x88, 0x44, 0x88, 0x04, 0x88, 0x40, 0x88, 0x08, //#..###$$## $##$ ## # +0x81, 0x18, 0x18, 0x00, 0x80, 0x40, 0x00, 0x40, 0x80, 0x08, //#..#.# # $ $ # # +0x81, 0x11, 0x18, 0x04, 0x40, 0x00, 0x88, 0x40, 0x88, 0x88, //#....# $$ ##$ #### +0x81, 0x11, 0x18, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x08, //#....# ##### # +0x81, 0x11, 0x88, 0x80, 0x00, 0x00, 0x00, 0x08, 0x80, 0x08, //#...### ## # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 274 +0x12, 0x0D,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, // ######### +0x00, 0x00, 0x08, 0x00, 0x00, 0x11, 0x18, 0x00, 0x00, // # ...# +0x00, 0x00, 0x08, 0x08, 0x00, 0x11, 0x18, 0x00, 0x00, // # # ...# +0x00, 0x00, 0x08, 0x08, 0x80, 0x01, 0x18, 0x00, 0x00, // # ## ..# +0x88, 0x88, 0x88, 0x04, 0x04, 0x08, 0x88, 0x00, 0x00, //###### $ $ ### +0x81, 0x11, 0x40, 0x40, 0x42, 0x88, 0x00, 0x00, 0x00, //#...$ $ $@## +0x81, 0x18, 0x04, 0x04, 0x04, 0x88, 0x88, 0x88, 0x88, //#..# $ $ $######## +0x81, 0x11, 0x80, 0x40, 0x40, 0x00, 0x00, 0x00, 0x08, //#...# $ $ # +0x81, 0x11, 0x04, 0x04, 0x00, 0x84, 0x84, 0x88, 0x08, //#... $ $ #$#$## # +0x80, 0x08, 0x88, 0x80, 0x40, 0x40, 0x40, 0x80, 0x08, //# #### $ $ $ # # +0x80, 0x08, 0x00, 0x80, 0x04, 0x00, 0x04, 0x00, 0x08, //# # # $ $ # +0x88, 0x88, 0x00, 0x88, 0x00, 0x08, 0x88, 0x88, 0x88, //#### ## ####### +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, 0x00, // ##### +//Level: 275 +0x10, 0x0D,//Size x and y +0x08, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // #### +0x88, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //## ############ +0x80, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x28, //# $ $ $ $ $ $ @# +0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, //# # $ # +0x80, 0x80, 0x08, 0x88, 0x85, 0x88, 0x84, 0x88, //# # ####*###$## +0x80, 0x80, 0x08, 0x11, 0x11, 0x18, 0x00, 0x80, //# # #.....# # +0x80, 0x84, 0x08, 0x15, 0x55, 0x15, 0x00, 0x80, //# #$ #.***.* # +0x80, 0x80, 0x05, 0x11, 0x11, 0x18, 0x00, 0x80, //# # *.....# # +0x80, 0x80, 0x48, 0x88, 0x88, 0x88, 0x44, 0x80, //# # $#######$$# +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, //# # +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x80, 0x80, //########### # # +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, // # # +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x80, // ##### +//Level: 276 +0x0E, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //############## +0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, //#. # +0x81, 0x40, 0x40, 0x40, 0x40, 0x40, 0x08, //#.$ $ $ $ $ # +0x81, 0x88, 0x88, 0x88, 0x88, 0x80, 0x08, //#.######### # +0x81, 0x81, 0x50, 0x40, 0x11, 0x45, 0x88, //#.#.* $ ..$*## +0x81, 0x80, 0x40, 0x40, 0x51, 0x42, 0x80, //#.# $ $ *.$@# +0x81, 0x81, 0x00, 0x40, 0x11, 0x44, 0x80, //#.#. $ ..$$# +0x81, 0x88, 0x88, 0x88, 0x88, 0x81, 0x80, //#.#########.# +0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, //#. # +0x81, 0x84, 0x84, 0x84, 0x84, 0x84, 0x80, //#.#$#$#$#$#$# +0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, //#. # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############# +//Level: 277 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x00, 0x00, //#### +0x81, 0x08, 0x00, 0x00, //#. # +0x80, 0x48, 0x00, 0x00, //# $# +0x80, 0x08, 0x88, 0x88, //# ##### +0x80, 0x14, 0x02, 0x08, //# .$ @ # +0x80, 0x14, 0x08, 0x08, //# .$ # # +0x88, 0x80, 0x00, 0x08, //### # +0x00, 0x88, 0x88, 0x88, // ###### +//Level: 278 +0x08, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x80, 0x00, 0x00, 0x08, //# # +0x80, 0x84, 0x00, 0x08, //# #$ # +0x80, 0x40, 0x28, 0x18, //# $ @#.# +0x88, 0x48, 0x10, 0x08, //##$#. # +0x08, 0x00, 0x00, 0x18, // # .# +0x08, 0x88, 0x88, 0x88, // ####### +//Level: 279 +0x13, 0x11,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x80, // ######## +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x11, 0x11, 0x80, // #......# +0x00, 0x08, 0x88, 0x80, 0x00, 0x08, 0x11, 0x11, 0x11, 0x80, // #### #......# +0x00, 0x08, 0x00, 0x88, 0x88, 0x88, 0x88, 0x81, 0x11, 0x80, // # #########...# +0x00, 0x08, 0x04, 0x00, 0x04, 0x00, 0x00, 0x81, 0x11, 0x80, // # $ $ #...# +0x00, 0x08, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, // # # # # # # # +0x88, 0x88, 0x80, 0x80, 0x80, 0x82, 0x80, 0x80, 0x00, 0x80, //##### # # #@# # # +0x80, 0x00, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x08, 0x80, //# # ### ### ## ## +0x80, 0x00, 0x04, 0x08, 0x04, 0x04, 0x04, 0x08, 0x08, 0x00, //# $ # $ $ $ # # +0x80, 0x44, 0x40, 0x04, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, //# $$$ $ # # +0x80, 0x00, 0x80, 0x88, 0x84, 0x88, 0x84, 0x88, 0x08, 0x00, //# # ###$###$## # +0x88, 0x80, 0x80, 0x04, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, //### # $ # # +0x08, 0x80, 0x40, 0x08, 0x04, 0x04, 0x04, 0x08, 0x88, 0x00, // ## $ # $ $ $ ### +0x08, 0x00, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x00, 0x00, // # # ### ### ## +0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, // # $ # +0x08, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, // # ########### +0x08, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // #### +//Level: 280 +0x0F, 0x0E,//Size x and y +0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //#### +0x80, 0x08, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, //# ### +0x80, 0x40, 0x08, 0x88, 0x00, 0x00, 0x00, 0x00, //# $ ### +0x80, 0x40, 0x40, 0x08, 0x88, 0x00, 0x00, 0x00, //# $ $ ### +0x80, 0x40, 0x40, 0x40, 0x08, 0x88, 0x00, 0x00, //# $ $ $ ### +0x80, 0x40, 0x40, 0x40, 0x00, 0x08, 0x00, 0x00, //# $ $ $ # +0x80, 0x40, 0x40, 0x08, 0x00, 0x08, 0x80, 0x00, //# $ $ # ## +0x80, 0x40, 0x08, 0x80, 0x44, 0x40, 0x80, 0x00, //# $ ## $$$ # +0x82, 0x08, 0x88, 0x80, 0x00, 0x00, 0x88, 0x00, //#@ #### ## +0x88, 0x08, 0x08, 0x14, 0x44, 0x44, 0x18, 0x00, //## # #.$$$$$.# +0x08, 0x08, 0x88, 0x11, 0x11, 0x11, 0x18, 0x80, // # ###.......## +0x08, 0x00, 0x01, 0x55, 0x55, 0x55, 0x51, 0x80, // # .*******.# +0x08, 0x88, 0x81, 0x11, 0x11, 0x11, 0x11, 0x80, // ####.........# +0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, // ########### +//Level: 281 +0x10, 0x12,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, // ####### +0x00, 0x00, 0x80, 0x00, 0x82, 0x80, 0x00, 0x00, // # #@# +0x08, 0x88, 0x80, 0x80, 0x80, 0x88, 0x88, 0x80, // #### # # ##### +0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, // # # # +0x08, 0x04, 0x84, 0x88, 0x88, 0x88, 0x80, 0x80, // # $#$####### # +0x88, 0x40, 0x00, 0x81, 0x18, 0x11, 0x84, 0x88, //##$ #..#..#$## +0x80, 0x00, 0x04, 0x41, 0x11, 0x11, 0x80, 0x08, //# $$.....# # +0x80, 0x40, 0x40, 0x81, 0x11, 0x11, 0x44, 0x08, //# $ $ #.....$$ # +0x88, 0x00, 0x08, 0x81, 0x11, 0x81, 0x80, 0x08, //## ##...#.# # +0x08, 0x04, 0x00, 0x88, 0x11, 0x18, 0x84, 0x08, // # $ ##...##$ # +0x08, 0x08, 0x80, 0x88, 0x88, 0x88, 0x80, 0x08, // # ## ####### # +0x08, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x88, // # $ $ $ ## +0x08, 0x88, 0x88, 0x80, 0x00, 0x40, 0x80, 0x80, // ###### $ # # +0x00, 0x00, 0x00, 0x88, 0x08, 0x04, 0x00, 0x80, // ## # $ # +0x00, 0x00, 0x00, 0x80, 0x44, 0x04, 0x00, 0x80, // # $$ $ # +0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x80, // # $ # +0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x00, 0x80, // ###### # +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x80, // #### +//Level: 282 +0x0B, 0x07,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x88, 0x80, // ########## +0x88, 0x04, 0x00, 0x51, 0x50, 0x80, //## $ *.* # +0x80, 0x04, 0x00, 0x51, 0x50, 0x80, //# $ *.* # +0x80, 0x04, 0x00, 0x51, 0x52, 0x80, //# $ *.*@# +0x80, 0x04, 0x00, 0x51, 0x50, 0x80, //# $ *.* # +0x80, 0x04, 0x00, 0x51, 0x50, 0x80, //# $ *.* # +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //########### +//Level: 283 +0x0F, 0x0D,//Size x and y +0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, // #### +0x00, 0x00, 0x00, 0x80, 0x08, 0x88, 0x88, 0x80, // # ###### +0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x80, // # # # +0x00, 0x00, 0x00, 0x80, 0x44, 0x00, 0x00, 0x80, // # $$ # +0x88, 0x88, 0x88, 0x84, 0x80, 0x08, 0x00, 0x80, //#######$# # # +0x80, 0x08, 0x15, 0x11, 0x08, 0x88, 0x48, 0x80, //# #.*.. ###$## +0x80, 0x08, 0x18, 0x51, 0x40, 0x00, 0x00, 0x80, //# #.#*.$ # +0x80, 0x08, 0x18, 0x15, 0x80, 0x80, 0x00, 0x80, //# #.#.*# # # +0x80, 0x44, 0x11, 0x11, 0x80, 0x88, 0x88, 0x80, //# $$....# ##### +0x80, 0x24, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, //# @$ # # +0x80, 0x44, 0x48, 0x00, 0x00, 0x80, 0x00, 0x00, //# $$$# # +0x80, 0x00, 0x08, 0x88, 0x88, 0x80, 0x00, 0x00, //# ###### +0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, //###### +//Level: 284 +0x10, 0x0E,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // ####### +0x08, 0x00, 0x00, 0x08, 0x00, 0x08, 0x88, 0x88, // # # ##### +0x08, 0x00, 0x88, 0x08, 0x88, 0x88, 0x00, 0x08, // # ## ##### # +0x08, 0x40, 0x40, 0x40, 0x08, 0x00, 0x08, 0x08, // #$ $ $ # # # +0x08, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00, 0x08, // # $ $ # # +0x88, 0x00, 0x44, 0x08, 0x88, 0x48, 0x88, 0x08, //## $$ ###$### # +0x80, 0x40, 0x00, 0x08, 0x11, 0x11, 0x80, 0x08, //# $ #....# # +0x82, 0x84, 0x40, 0x88, 0x11, 0x11, 0x80, 0x08, //#@#$$ ##....# # +0x80, 0x04, 0x00, 0x08, 0x11, 0x11, 0x40, 0x08, //# $ #....$ # +0x88, 0x00, 0x88, 0x08, 0x11, 0x11, 0x80, 0x88, //## ## #....# ## +0x08, 0x44, 0x80, 0x08, 0x80, 0x88, 0x80, 0x08, // #$$# ## ### # +0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x08, // # $ # +0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x08, // ############ # +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, // #### +//Level: 285 +0x10, 0x0D,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, // ######### +0x00, 0x80, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, // # # # +0x88, 0x80, 0x84, 0x00, 0x40, 0x88, 0x88, 0x00, //### #$ $ #### +0x80, 0x04, 0x00, 0x88, 0x11, 0x80, 0x08, 0x88, //# $ ##..# ### +0x80, 0x80, 0x04, 0x08, 0x11, 0x40, 0x40, 0x08, //# # $ #..$ $ # +0x80, 0x44, 0x00, 0x48, 0x11, 0x00, 0x80, 0x08, //# $$ $#.. # # +0x88, 0x00, 0x80, 0x01, 0x11, 0x84, 0x00, 0x08, //## # ...#$ # +0x08, 0x40, 0x20, 0x81, 0x11, 0x80, 0x40, 0x88, // #$ @ #...# $ ## +0x08, 0x00, 0x00, 0x81, 0x11, 0x40, 0x08, 0x80, // # #...$ ## +0x08, 0x08, 0x84, 0x08, 0x88, 0x00, 0x08, 0x00, // # ##$ ### # +0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x88, 0x00, // # $ ### +0x08, 0x00, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, // # ######## +0x08, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // #### +//Level: 286 +0x09, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x80, //######### +0x82, 0x00, 0x50, 0x00, 0x80, //#@ * # +0x80, 0x44, 0x14, 0x00, 0x80, //# $$.$ # +0x81, 0x11, 0x15, 0x55, 0x80, //#....***# +0x80, 0x44, 0x14, 0x00, 0x80, //# $$.$ # +0x80, 0x00, 0x50, 0x00, 0x80, //# * # +0x88, 0x88, 0x88, 0x88, 0x80, //######### +//Level: 287 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x00, 0x02, 0x88, 0x00, 0x00, 0x00, 0x80, 0x00, 0x88, //# @## # ## +0x80, 0x00, 0x08, 0x80, 0x00, 0x04, 0x00, 0x00, 0x40, 0x88, //# ## $ $ ## +0x80, 0x08, 0x88, 0x11, 0x11, 0x80, 0x80, 0x80, 0x08, 0x88, //# ###....# # # ### +0x80, 0x00, 0x81, 0x11, 0x18, 0x08, 0x08, 0x04, 0x00, 0x08, //# #....# # # $ # +0x88, 0x80, 0x81, 0x11, 0x80, 0x08, 0x00, 0x00, 0x00, 0x08, //### #...# # # +0x88, 0x00, 0x88, 0x18, 0x00, 0x00, 0x04, 0x00, 0x04, 0x08, //## ##.# $ $ # +0x88, 0x00, 0x40, 0x40, 0x88, 0x80, 0x08, 0x08, 0x08, 0x88, //## $ $ ### # # ### +0x88, 0x04, 0x00, 0x00, 0x00, 0x08, 0x08, 0x04, 0x00, 0x08, //## $ # # $ # +0x88, 0x88, 0x04, 0x00, 0x48, 0x08, 0x08, 0x08, 0x04, 0x08, //#### $ $# # # # $ # +0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x88, //#### # # ## +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 288 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x02, 0x08, 0x88, //## @ ### +0x88, 0x01, 0x00, 0x08, //## . # +0x81, 0x04, 0x14, 0x08, //#. $.$ # +0x88, 0x48, 0x08, 0x88, //##$# ### +0x88, 0x00, 0x08, 0x88, //## ### +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x88, 0x88, 0x88, //######## +//Level: 289 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x20, 0x88, 0x88, //##@ #### +0x88, 0x00, 0x88, 0x88, //## #### +0x88, 0x10, 0x88, 0x88, //##. #### +0x80, 0x44, 0x10, 0x18, //# $$. .# +0x80, 0x04, 0x08, 0x88, //# $ ### +0x88, 0x80, 0x08, 0x88, //### ### +0x88, 0x88, 0x88, 0x88, //######## +//Level: 290 +0x0A, 0x12,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x80, // ######## +0x08, 0x11, 0x11, 0x11, 0x80, // #......# +0x08, 0x11, 0x88, 0x11, 0x80, // #..##..# +0x08, 0x11, 0x11, 0x11, 0x80, // #......# +0x08, 0x11, 0x55, 0x11, 0x80, // #..**..# +0x08, 0x88, 0x11, 0x88, 0x80, // ###..### +0x08, 0x00, 0x44, 0x00, 0x80, // # $$ # +0x08, 0x00, 0x00, 0x00, 0x80, // # # +0x08, 0x04, 0x44, 0x40, 0x80, // # $$$$ # +0x88, 0x80, 0x00, 0x08, 0x88, //### ### +0x80, 0x04, 0x44, 0x40, 0x08, //# $$$$ # +0x80, 0x00, 0x00, 0x00, 0x08, //# # +0x80, 0x44, 0x44, 0x44, 0x08, //# $$$$$$ # +0x88, 0x00, 0x00, 0x00, 0x88, //## ## +0x80, 0x44, 0x44, 0x44, 0x08, //# $$$$$$ # +0x80, 0x00, 0x20, 0x00, 0x08, //# @ # +0x80, 0x08, 0x88, 0x80, 0x08, //# #### # +0x88, 0x88, 0x00, 0x88, 0x88, //#### #### +//Level: 291 +0x0F, 0x0D,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############### +0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, //# # # +0x80, 0x40, 0x84, 0x08, 0x04, 0x88, 0x40, 0x80, //# $ #$ # $##$ # +0x80, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x80, //# # $ # # +0x80, 0x00, 0x88, 0x48, 0x48, 0x84, 0x40, 0x80, //# ##$#$##$$ # +0x80, 0x80, 0x80, 0x11, 0x10, 0x80, 0x00, 0x80, //# # # ... # # +0x80, 0x40, 0x01, 0x08, 0x01, 0x40, 0x80, 0x80, //# $ . # .$ # # +0x80, 0x48, 0x24, 0x11, 0x18, 0x08, 0x00, 0x80, //# $#@$...# # # +0x80, 0x00, 0x01, 0x08, 0x01, 0x00, 0x40, 0x80, //# . # . $ # +0x80, 0x88, 0x14, 0x88, 0x84, 0x10, 0x80, 0x80, //# ##.$###$. # # +0x80, 0x80, 0x41, 0x11, 0x11, 0x08, 0x80, 0x80, //# # $..... ## # +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, //# # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############### +//Level: 292 +0x0F, 0x0A,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, // ############# +0x08, 0x00, 0x00, 0x80, 0x08, 0x80, 0x08, 0x00, // # # ## # +0x08, 0x44, 0x40, 0x80, 0x44, 0x00, 0x48, 0x80, // #$$$ # $$ $## +0x08, 0x04, 0x00, 0x80, 0x01, 0x11, 0x10, 0x80, // # $ # .... # +0x08, 0x00, 0x40, 0x08, 0x41, 0x88, 0x10, 0x80, // # $ #$.##. # +0x08, 0x00, 0x80, 0x48, 0x01, 0x11, 0x18, 0x80, // # # $# ....## +0x88, 0x40, 0x40, 0x08, 0x41, 0x88, 0x10, 0x80, //##$ $ #$.##. # +0x80, 0x40, 0x04, 0x02, 0x41, 0x11, 0x10, 0x80, //# $ $ @$.... # +0x80, 0x00, 0x88, 0x80, 0x08, 0x88, 0x88, 0x80, //# ### ###### +0x88, 0x88, 0x80, 0x88, 0x88, 0x00, 0x00, 0x00, //##### #### +//Level: 293 +0x09, 0x07,//Size x and y +0x00, 0x88, 0x88, 0x80, 0x00, // ##### +0x88, 0x80, 0x00, 0x88, 0x80, //### ### +0x80, 0x10, 0x40, 0x10, 0x80, //# . $ . # +0x80, 0x81, 0x41, 0x80, 0x80, //# #.$.# # +0x80, 0x40, 0x80, 0x40, 0x80, //# $ # $ # +0x88, 0x80, 0x20, 0x88, 0x80, //### @ ### +0x00, 0x88, 0x88, 0x80, 0x00, // ##### +//Level: 294 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x82, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, //#@ # # # +0x88, 0x08, 0x88, 0x08, 0x80, 0x08, 0x88, 0x80, 0x80, 0x88, //## ### ## #### # ## +0x80, 0x00, 0x08, 0x08, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, //# # # $$ # +0x80, 0x08, 0x08, 0x08, 0x04, 0x08, 0x04, 0x08, 0x80, 0x88, //# # # # $ # $ ## ## +0x80, 0x00, 0x00, 0x40, 0x80, 0x08, 0x44, 0x08, 0x00, 0x08, //# $ # #$$ # # +0x80, 0x08, 0x88, 0x00, 0x80, 0x00, 0x00, 0x08, 0x80, 0x88, //# ### # ## ## +0x81, 0x18, 0x18, 0x04, 0x08, 0x00, 0x40, 0x80, 0x00, 0x08, //#..#.# $ # $ # # +0x81, 0x18, 0x18, 0x00, 0x40, 0x80, 0x88, 0x04, 0x40, 0x08, //#..#.# $ # ## $$ # +0x81, 0x11, 0x18, 0x80, 0x00, 0x44, 0x00, 0x40, 0x08, 0x08, //#....## $$ $ # # +0x81, 0x11, 0x11, 0x88, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, //#.....## # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 295 +0x0D, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############# +0x80, 0x04, 0x04, 0x04, 0x15, 0x11, 0x80, //# $ $ $.*..# +0x80, 0x40, 0x40, 0x40, 0x51, 0x11, 0x80, //# $ $ $ *...# +0x80, 0x04, 0x04, 0x04, 0x15, 0x11, 0x80, //# $ $ $.*..# +0x80, 0x40, 0x40, 0x40, 0x51, 0x11, 0x80, //# $ $ $ *...# +0x80, 0x04, 0x04, 0x04, 0x15, 0x11, 0x80, //# $ $ $.*..# +0x80, 0x40, 0x40, 0x40, 0x51, 0x11, 0x80, //# $ $ $ *...# +0x80, 0x04, 0x04, 0x04, 0x15, 0x11, 0x80, //# $ $ $.*..# +0x80, 0x40, 0x40, 0x40, 0x51, 0x11, 0x80, //# $ $ $ *...# +0x80, 0x04, 0x04, 0x04, 0x15, 0x11, 0x80, //# $ $ $.*..# +0x82, 0x40, 0x40, 0x40, 0x51, 0x11, 0x80, //#@$ $ $ *...# +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############# +//Level: 296 +0x13, 0x10,//Size x and y +0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, // ############ +0x00, 0x00, 0x08, 0x81, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, // ##.. # # +0x00, 0x00, 0x88, 0x11, 0x50, 0x40, 0x00, 0x04, 0x08, 0x00, // ##..* $ $ # +0x00, 0x08, 0x81, 0x15, 0x18, 0x08, 0x08, 0x04, 0x88, 0x00, // ##..*.# # # $## +0x00, 0x08, 0x11, 0x51, 0x80, 0x80, 0x80, 0x40, 0x08, 0x00, // #..*.# # # $ # +0x88, 0x88, 0x11, 0x18, 0x00, 0x80, 0x00, 0x08, 0x08, 0x00, //####...# # # # +0x80, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, //# ## # # +0x80, 0x24, 0x04, 0x08, 0x88, 0x00, 0x80, 0x00, 0x88, 0x00, //# @$ $ ### # ## +0x80, 0x40, 0x00, 0x40, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, //# $ $ # # # +0x88, 0x84, 0x40, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, //###$$ # # # # # +0x00, 0x80, 0x00, 0x40, 0x00, 0x80, 0x80, 0x88, 0x88, 0x80, // # $ # # ##### +0x00, 0x80, 0x48, 0x08, 0x88, 0x88, 0x00, 0x00, 0x00, 0x80, // # $# ##### # +0x00, 0x84, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x80, 0x80, // #$ # # # # +0x00, 0x80, 0x08, 0x88, 0x00, 0x08, 0x80, 0x00, 0x00, 0x80, // # ### ## # +0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, // # # # ## +0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x00, // #### ###### +//Level: 297 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x00, 0x00, 0x80, 0x08, 0x11, 0x18, 0x20, 0x00, 0x08, //# # #...#@ # +0x80, 0x80, 0x00, 0x00, 0x00, 0x11, 0x11, 0x80, 0x00, 0x08, //# # ....# # +0x80, 0x04, 0x00, 0x80, 0x00, 0x81, 0x11, 0x18, 0x00, 0x08, //# $ # #....# # +0x80, 0x88, 0x48, 0x88, 0x80, 0x88, 0x11, 0x11, 0x80, 0x08, //# ##$#### ##....# # +0x80, 0x40, 0x00, 0x40, 0x08, 0x00, 0x81, 0x11, 0x80, 0x08, //# $ $ # #...# # +0x80, 0x44, 0x08, 0x00, 0x08, 0x00, 0x08, 0x04, 0x40, 0x08, //# $$ # # # $$ # +0x88, 0x80, 0x04, 0x44, 0x80, 0x00, 0x44, 0x00, 0x40, 0x08, //### $$$# $$ $ # +0x80, 0x40, 0x08, 0x00, 0x80, 0x00, 0x08, 0x04, 0x80, 0x08, //# $ # # # $# # +0x80, 0x00, 0x48, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x08, //# $# # $ # +0x80, 0x08, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x80, 0x08, //# # # # # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 298 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x80, 0x08, 0x80, 0x08, //# ## # +0x80, 0x10, 0x01, 0x48, //# . .$# +0x80, 0x48, 0x04, 0x18, //# $# $.# +0x88, 0x02, 0x08, 0x08, //## @ # # +0x88, 0x88, 0x00, 0x08, //#### # +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x88, 0x88, 0x88, //######## +//Level: 299 +0x08, 0x08,//Size x and y +0x00, 0x00, 0x88, 0x88, // #### +0x00, 0x00, 0x80, 0x08, // # # +0x00, 0x88, 0x84, 0x18, // ###$.# +0x00, 0x80, 0x01, 0x08, // # . # +0x88, 0x80, 0x08, 0x18, //### #.# +0x80, 0x40, 0x04, 0x08, //# $ $ # +0x80, 0x00, 0x82, 0x08, //# #@ # +0x88, 0x88, 0x88, 0x88, //######## +//Level: 300 +0x08, 0x06,//Size x and y +0x00, 0x88, 0x88, 0x00, // #### +0x88, 0x80, 0x08, 0x88, //### ### +0x80, 0x11, 0x04, 0x18, //# .. $.# +0x80, 0x04, 0x40, 0x28, //# $$ @# +0x88, 0x88, 0x00, 0x08, //#### # +0x00, 0x08, 0x88, 0x88, // ##### +//Level: 301 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x00, //###### +0x80, 0x01, 0x08, 0x00, //# . # +0x80, 0x00, 0x08, 0x88, //# ### +0x80, 0x84, 0x41, 0x08, //# #$$. # +0x81, 0x00, 0x88, 0x08, //#. ## # +0x82, 0x40, 0x88, 0x08, //#@$ ## # +0x88, 0x80, 0x00, 0x08, //### # +0x00, 0x88, 0x88, 0x88, // ###### +//Level: 302 +0x11, 0x12,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x80, // #### +0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x00, 0x80, // ######## # +0x00, 0x00, 0x08, 0x80, 0x40, 0x40, 0x00, 0x40, 0x80, // ## $ $ $ # +0x00, 0x00, 0x08, 0x00, 0x02, 0x84, 0x00, 0x40, 0x80, // # @#$ $ # +0x00, 0x00, 0x08, 0x00, 0x40, 0x80, 0x08, 0x00, 0x80, // # $ # # # +0x88, 0x88, 0x88, 0x88, 0x04, 0x80, 0x00, 0x00, 0x80, //######## $# # +0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x88, 0x80, //# $ $ $ ### +0x80, 0x00, 0x88, 0x88, 0x84, 0x88, 0x48, 0x80, 0x00, //# #####$##$## +0x88, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, //## $$ # +0x08, 0x00, 0x88, 0x04, 0x04, 0x04, 0x00, 0x80, 0x00, // # ## $ $ $ # +0x08, 0x88, 0x88, 0x80, 0x80, 0x80, 0x88, 0x80, 0x00, // ###### # # ### +0x00, 0x00, 0x08, 0x04, 0x04, 0x00, 0x80, 0x00, 0x00, // # $ $ # +0x00, 0x00, 0x08, 0x00, 0x40, 0x08, 0x80, 0x00, 0x00, // # $ ## +0x00, 0x00, 0x88, 0x88, 0x04, 0x88, 0x80, 0x00, 0x00, // #### $### +0x00, 0x00, 0x81, 0x11, 0x11, 0x11, 0x80, 0x00, 0x00, // #.......# +0x00, 0x00, 0x81, 0x11, 0x11, 0x11, 0x80, 0x00, 0x00, // #.......# +0x00, 0x00, 0x81, 0x11, 0x11, 0x11, 0x80, 0x00, 0x00, // #.......# +0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, // ######### +//Level: 303 +0x10, 0x0D,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, 0x00, // ##### +0x88, 0x88, 0x88, 0x80, 0x00, 0x80, 0x00, 0x00, //####### # +0x80, 0x00, 0x88, 0x10, 0x00, 0x80, 0x00, 0x00, //# ##. # +0x80, 0x04, 0x81, 0x10, 0x08, 0x88, 0x00, 0x00, //# $#.. ### +0x88, 0x00, 0x11, 0x18, 0x44, 0x08, 0x88, 0x88, //## ...#$$ ##### +0x08, 0x04, 0x18, 0x14, 0x00, 0x00, 0x00, 0x08, // # $.#.$ # +0x08, 0x04, 0x88, 0x84, 0x88, 0x08, 0x04, 0x08, // # $###$## # $ # +0x08, 0x00, 0x08, 0x00, 0x00, 0x04, 0x48, 0x08, // # # $$# # +0x08, 0x84, 0x48, 0x08, 0x84, 0x84, 0x00, 0x08, // ##$$# ##$#$ # +0x08, 0x11, 0x10, 0x42, 0x04, 0x00, 0x08, 0x88, // #... $@ $ ### +0x08, 0x11, 0x18, 0x48, 0x00, 0x08, 0x88, 0x00, // #...#$# ### +0x08, 0x11, 0x10, 0x08, 0x88, 0x88, 0x00, 0x00, // #... ##### +0x08, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // ####### +//Level: 304 +0x10, 0x0F,//Size x and y +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, // ###### +0x00, 0x08, 0x88, 0x88, 0x88, 0x80, 0x00, 0x08, // ######## # +0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x04, 0x08, // # $ $ $ # +0x00, 0x08, 0x08, 0x08, 0x08, 0x04, 0x88, 0x08, // # # # # $## # +0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x04, 0x08, // # $ $ # +0x00, 0x08, 0x88, 0x88, 0x88, 0x84, 0x08, 0x08, // ########$ # # +0x00, 0x88, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, // ## # # +0x00, 0x82, 0x40, 0x04, 0x00, 0x80, 0x40, 0x08, // #@$ $ # $ # +0x88, 0x88, 0x88, 0x08, 0x40, 0x84, 0x84, 0x08, //###### #$ #$#$ # +0x81, 0x11, 0x18, 0x04, 0x00, 0x80, 0x00, 0x08, //#....# $ # # +0x81, 0x51, 0x18, 0x88, 0x08, 0x80, 0x88, 0x88, //#.*..### ## #### +0x81, 0x15, 0x10, 0x40, 0x00, 0x80, 0x08, 0x00, //#..*. $ # # +0x81, 0x11, 0x14, 0x04, 0x00, 0x00, 0x08, 0x00, //#....$ $ # +0x81, 0x11, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, //#...########## +0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, //##### +//Level: 305 +0x07, 0x06,//Size x and y +0x88, 0x88, 0x80, 0x00, //##### +0x80, 0x00, 0x88, 0x80, //# ### +0x81, 0x14, 0x41, 0x80, //#..$$.# +0x80, 0x44, 0x20, 0x80, //# $$@ # +0x88, 0x00, 0x18, 0x80, //## .## +0x08, 0x88, 0x88, 0x00, // ##### +//Level: 306 +0x08, 0x06,//Size x and y +0x88, 0x88, 0x88, 0x00, //###### +0x80, 0x10, 0x08, 0x00, //# . # +0x80, 0x18, 0x08, 0x88, //# .# ### +0x80, 0x24, 0x40, 0x08, //# @$$ # +0x80, 0x41, 0x00, 0x08, //# $. # +0x88, 0x88, 0x88, 0x88, //######## +//Level: 307 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x00, //###### +0x80, 0x00, 0x28, 0x00, //# @# +0x80, 0x44, 0x88, 0x88, //# $$#### +0x80, 0x40, 0x10, 0x08, //# $ . # +0x88, 0x08, 0x18, 0x08, //## #.# # +0x81, 0x00, 0x08, 0x08, //#. # # +0x80, 0x00, 0x00, 0x08, //# # +0x88, 0x88, 0x88, 0x88, //######## +//Level: 308 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x80, 0x00, 0x88, //### ## +0x88, 0x80, 0x81, 0x88, //### #.## +0x88, 0x80, 0x01, 0x88, //### .## +0x82, 0x04, 0x40, 0x88, //#@ $$ ## +0x80, 0x01, 0x40, 0x88, //# .$ ## +0x88, 0x88, 0x88, 0x88, //######## +//Level: 309 +0x08, 0x06,//Size x and y +0x08, 0x88, 0x80, 0x00, // #### +0x88, 0x00, 0x88, 0x80, //## ### +0x80, 0x00, 0x00, 0x88, //# ## +0x80, 0x08, 0x44, 0x28, //# #$$@# +0x80, 0x01, 0x05, 0x18, //# . *.# +0x88, 0x88, 0x88, 0x88, //######## +//Level: 310 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x00, 0x88, 0x88, //## #### +0x81, 0x14, 0x00, 0x18, //#..$ .# +0x80, 0x84, 0x04, 0x08, //# #$ $ # +0x82, 0x00, 0x80, 0x08, //#@ # # +0x88, 0x88, 0x80, 0x08, //##### # +0x88, 0x88, 0x88, 0x88, //######## +//Level: 311 +0x11, 0x0D,//Size x and y +0x00, 0x00, 0x08, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // ##### +0x00, 0x00, 0x08, 0x20, 0x08, 0x88, 0x88, 0x88, 0x00, // #@ ####### +0x00, 0x08, 0x88, 0x80, 0x40, 0x04, 0x00, 0x08, 0x00, // #### $ $ # +0x08, 0x88, 0x00, 0x04, 0x40, 0x40, 0x40, 0x08, 0x00, // ### $$ $ $ # +0x08, 0x00, 0x08, 0x00, 0x48, 0x08, 0x88, 0x88, 0x00, // # # $# ##### +0x08, 0x48, 0x88, 0x80, 0x04, 0x00, 0x04, 0x08, 0x00, // #$#### $ $ # +0x08, 0x04, 0x00, 0x40, 0x04, 0x00, 0x04, 0x08, 0x00, // # $ $ $ $ # +0x08, 0x00, 0x40, 0x08, 0x88, 0x48, 0x88, 0x08, 0x80, // # $ ###$### ## +0x88, 0x00, 0x88, 0x08, 0x11, 0x11, 0x18, 0x00, 0x80, //## ## #.....# # +0x80, 0x04, 0x04, 0x08, 0x11, 0x11, 0x10, 0x00, 0x80, //# $ $ #..... # +0x80, 0x40, 0x00, 0x40, 0x11, 0x11, 0x18, 0x88, 0x80, //# $ $ .....#### +0x88, 0x88, 0x88, 0x88, 0x11, 0x11, 0x18, 0x00, 0x00, //########.....# +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x00, 0x00, // ####### +//Level: 312 +0x12, 0x0E,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, //######## +0x81, 0x11, 0x00, 0x08, 0x88, 0x88, 0x88, 0x80, 0x00, //#... ######## +0x81, 0x11, 0x10, 0x00, 0x00, 0x40, 0x00, 0x88, 0x00, //#.... $ ## +0x81, 0x11, 0x11, 0x88, 0x04, 0x08, 0x40, 0x08, 0x00, //#.....## $ #$ # +0x81, 0x11, 0x11, 0x80, 0x08, 0x00, 0x40, 0x08, 0x00, //#.....# # $ # +0x88, 0x88, 0x88, 0x84, 0x08, 0x80, 0x04, 0x08, 0x88, //#######$ ## $ ### +0x08, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x40, 0x08, // # ### $ # +0x08, 0x00, 0x40, 0x80, 0x40, 0x08, 0x00, 0x40, 0x08, // # $ # $ # $ # +0x08, 0x00, 0x88, 0x80, 0x88, 0x00, 0x80, 0x88, 0x88, // # ### ## # #### +0x08, 0x00, 0x80, 0x04, 0x00, 0x40, 0x80, 0x00, 0x80, // # # $ $ # # +0x08, 0x88, 0x80, 0x84, 0x80, 0x08, 0x84, 0x00, 0x80, // #### #$# ##$ # +0x00, 0x82, 0x40, 0x00, 0x04, 0x00, 0x04, 0x00, 0x80, // #@$ $ $ # +0x00, 0x88, 0x88, 0x80, 0x00, 0x88, 0x88, 0x88, 0x80, // ##### ####### +0x00, 0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, // ##### +//Level: 313 +0x0B, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x80, 0x00, 0x00, //####### +0x82, 0x00, 0x00, 0x88, 0x88, 0x80, //#@ ##### +0x80, 0x40, 0x15, 0x10, 0x40, 0x80, //# $ .*. $ # +0x80, 0x41, 0x50, 0x51, 0x40, 0x80, //# $.* *.$ # +0x80, 0x40, 0x15, 0x10, 0x40, 0x80, //# $ .*. $ # +0x88, 0x88, 0x88, 0x00, 0x00, 0x80, //###### # +0x00, 0x00, 0x08, 0x88, 0x88, 0x80, // ###### +//Level: 314 +0x09, 0x08,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x00, // ##### +0x00, 0x08, 0x02, 0x08, 0x00, // # @ # +0x00, 0x08, 0x44, 0x48, 0x00, // #$$$# +0x88, 0x88, 0x00, 0x08, 0x00, //#### # +0x80, 0x00, 0x18, 0x48, 0x80, //# .#$## +0x80, 0x41, 0x41, 0x01, 0x80, //# $.$. .# +0x80, 0x08, 0x18, 0x18, 0x80, //# #.#.## +0x88, 0x88, 0x88, 0x88, 0x00, //######## +//Level: 315 +0x09, 0x09,//Size x and y +0x00, 0x88, 0x88, 0x80, 0x00, // ##### +0x00, 0x80, 0x00, 0x80, 0x00, // # # +0x88, 0x80, 0x84, 0x80, 0x00, //### #$# +0x80, 0x01, 0x41, 0x88, 0x80, //# .$.### +0x80, 0x84, 0x34, 0x00, 0x80, //# #$+$ # +0x80, 0x01, 0x40, 0x80, 0x80, //# .$ # # +0x88, 0x80, 0x81, 0x00, 0x80, //### #. # +0x00, 0x80, 0x00, 0x88, 0x80, // # ### +0x00, 0x88, 0x88, 0x80, 0x00, // ##### +//Level: 316 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x80, 0x00, 0x00, 0x08, //# # +0x80, 0x80, 0x88, 0x58, //# # ##*# +0x80, 0x82, 0x04, 0x08, //# #@ $ # +0x81, 0x40, 0x10, 0x08, //#.$ . # +0x88, 0x88, 0x80, 0x08, //##### # +0x00, 0x00, 0x80, 0x08, // # # +0x00, 0x00, 0x88, 0x88, // #### +//Level: 317 +0x08, 0x07,//Size x and y +0x00, 0x08, 0x88, 0x88, // ##### +0x88, 0x88, 0x10, 0x28, //####. @# +0x80, 0x01, 0x40, 0x08, //# .$ # +0x80, 0x80, 0x08, 0x88, //# # ### +0x80, 0x40, 0x40, 0x18, //# $ $ .# +0x88, 0x88, 0x00, 0x08, //#### # +0x00, 0x08, 0x88, 0x88, // ##### +//Level: 318 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x08, 0x00, 0x08, 0x28, //# # # # #@# +0x80, 0x00, 0x40, 0x04, 0x00, 0x00, 0x08, 0x04, 0x08, 0x08, //# $ $ # $ # # +0x88, 0x48, 0x04, 0x88, 0x80, 0x80, 0x00, 0x04, 0x48, 0x08, //##$# $### # $$# # +0x80, 0x08, 0x00, 0x81, 0x88, 0x80, 0x08, 0x40, 0x40, 0x08, //# # #.### #$ $ # +0x80, 0x08, 0x48, 0x11, 0x11, 0x80, 0x08, 0x08, 0x88, 0x08, //# #$#....# # ### # +0x80, 0x40, 0x08, 0x11, 0x11, 0x18, 0x80, 0x00, 0x08, 0x08, //# $ #.....## # # +0x88, 0x40, 0x08, 0x18, 0x11, 0x11, 0x84, 0x40, 0x40, 0x08, //##$ #.#....#$$ $ # +0x80, 0x08, 0x88, 0x88, 0x81, 0x18, 0x80, 0x80, 0x08, 0x08, //# ######..## # # # +0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x88, 0x08, //# $ $ ### # +0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x08, 0x08, //# # # # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 319 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x10, 0x08, 0x88, //##. ### +0x88, 0x08, 0x08, 0x88, //## # ### +0x88, 0x05, 0x40, 0x08, //## *$ # +0x88, 0x00, 0x41, 0x08, //## $. # +0x88, 0x00, 0x28, 0x88, //## @### +0x88, 0x88, 0x88, 0x88, //######## +//Level: 320 +0x08, 0x08,//Size x and y +0x00, 0x08, 0x88, 0x80, // #### +0x00, 0x88, 0x20, 0x88, // ##@ ## +0x08, 0x80, 0x01, 0x18, // ## ..# +0x88, 0x04, 0x84, 0x88, //## $#$## +0x80, 0x00, 0x41, 0x08, //# $. # +0x80, 0x08, 0x00, 0x08, //# # # +0x80, 0x00, 0x08, 0x88, //# ### +0x88, 0x88, 0x88, 0x00, //###### +//Level: 321 +0x13, 0x10,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, //############### +0x81, 0x11, 0x11, 0x11, 0x11, 0x10, 0x01, 0x88, 0x88, 0x00, //#.......... .#### +0x81, 0x11, 0x11, 0x11, 0x11, 0x14, 0x41, 0x80, 0x08, 0x00, //#..........$$.# # +0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x08, 0x00, 0x08, 0x80, //###########$ # ## +0x80, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x40, 0x80, //# $ $ $ # +0x88, 0x08, 0x88, 0x80, 0x00, 0x80, 0x04, 0x08, 0x00, 0x80, //## #### # $ # # +0x80, 0x00, 0x00, 0x08, 0x00, 0x08, 0x80, 0x08, 0x08, 0x80, //# # ## # ## +0x80, 0x04, 0x80, 0x08, 0x08, 0x80, 0x08, 0x88, 0x08, 0x80, //# $# # ## ### ## +0x80, 0x40, 0x84, 0x88, 0x80, 0x00, 0x08, 0x88, 0x08, 0x80, //# $ #$### ### ## +0x88, 0x80, 0x04, 0x08, 0x00, 0x80, 0x08, 0x88, 0x08, 0x80, //### $ # # ### ## +0x88, 0x80, 0x00, 0x04, 0x08, 0x80, 0x80, 0x08, 0x08, 0x80, //### $ ## # # ## +0x08, 0x04, 0x00, 0x80, 0x04, 0x00, 0x40, 0x40, 0x00, 0x80, // # $ # $ $ $ # +0x08, 0x00, 0x40, 0x04, 0x84, 0x44, 0x00, 0x80, 0x00, 0x80, // # $ $#$$$ # # +0x08, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x88, 0x88, 0x80, // # # $ ##### +0x08, 0x02, 0x88, 0x00, 0x80, 0x08, 0x00, 0x80, 0x00, 0x00, // # @## # # # +0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, // ############## +//Level: 322 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x80, 0x00, //##### +0x80, 0x01, 0x88, 0x80, //# .### +0x80, 0x41, 0x10, 0x80, //# $.. # +0x80, 0x08, 0x84, 0x88, //# ##$## +0x88, 0x00, 0x80, 0x08, //## # # +0x08, 0x40, 0x00, 0x28, // #$ @# +0x08, 0x00, 0x88, 0x88, // # #### +0x08, 0x88, 0x80, 0x00, // #### +//Level: 323 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x81, 0x11, 0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x80, 0x08, //#....# # # # +0x81, 0x11, 0x18, 0x08, 0x04, 0x00, 0x40, 0x00, 0x00, 0x08, //#....# # $ $ # +0x81, 0x11, 0x10, 0x88, 0x00, 0x48, 0x08, 0x04, 0x84, 0x08, //#.... ## $# # $#$ # +0x81, 0x11, 0x80, 0x00, 0x40, 0x00, 0x48, 0x00, 0x40, 0x08, //#...# $ $# $ # +0x81, 0x18, 0x88, 0x80, 0x08, 0x04, 0x00, 0x04, 0x40, 0x08, //#..#### # $ $$ # +0x80, 0x00, 0x00, 0x08, 0x88, 0x80, 0x88, 0x88, 0x08, 0x88, //# #### #### ### +0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x08, //# # # # +0x80, 0x88, 0x00, 0x08, 0x00, 0x04, 0x08, 0x04, 0x04, 0x08, //# ## # $ # $ $ # +0x80, 0x88, 0x00, 0x00, 0x40, 0x88, 0x04, 0x00, 0x40, 0x08, //# ## $ ## $ $ # +0x80, 0x00, 0x00, 0x28, 0x00, 0x00, 0x08, 0x00, 0x08, 0x08, //# @# # # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 324 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x28, 0x11, 0x18, 0x88, //# # @#...### +0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, 0x81, 0x11, 0x88, //# # ##...## +0x80, 0x80, 0x80, 0x88, 0x48, 0x80, 0x88, 0x01, 0x11, 0x18, //# # # ##$## ## ....# +0x80, 0x00, 0x40, 0x80, 0x00, 0x44, 0x40, 0x01, 0x11, 0x18, //# $ # $$$ ....# +0x88, 0x84, 0x88, 0x80, 0x44, 0x00, 0x88, 0x80, 0x88, 0x18, //###$### $$ ### ##.# +0x80, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, 0x80, 0x88, 0x88, //# $ # # #### +0x80, 0x04, 0x00, 0x80, 0x08, 0x88, 0x00, 0x80, 0x80, 0x08, //# $ # ### # # # +0x88, 0x08, 0x48, 0x80, 0x00, 0x04, 0x00, 0x44, 0x00, 0x08, //## #$## $ $$ # +0x80, 0x00, 0x40, 0x88, 0x00, 0x08, 0x00, 0x80, 0x80, 0x08, //# $ ## # # # # +0x80, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x80, 0x00, 0x08, //# # # # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 325 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x88, 0x88, 0x82, 0x88, 0x81, 0x88, 0x11, 0x18, 0x80, 0x08, //#####@###.##...## # +0x88, 0x88, 0x84, 0x00, 0x11, 0x81, 0x11, 0x80, 0x00, 0x08, //#####$ ..#...# # +0x88, 0x88, 0x00, 0x00, 0x11, 0x11, 0x11, 0x80, 0x04, 0x08, //#### ......# $ # +0x88, 0x80, 0x04, 0x08, 0x11, 0x11, 0x18, 0x80, 0x80, 0x88, //### $ #.....## # ## +0x88, 0x00, 0x44, 0x80, 0x88, 0x88, 0x80, 0x04, 0x04, 0x08, //## $$# ##### $ $ # +0x88, 0x04, 0x80, 0x40, 0x00, 0x08, 0x80, 0x04, 0x40, 0x08, //## $# $ ## $$ # +0x88, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x40, 0x04, 0x08, //## # # # $ $ # +0x88, 0x00, 0x04, 0x40, 0x88, 0x80, 0x84, 0x88, 0x00, 0x08, //## $$ ### #$## # +0x88, 0x04, 0x80, 0x00, 0x00, 0x04, 0x04, 0x00, 0x40, 0x88, //## $# $ $ $ ## +0x88, 0x80, 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x08, 0x88, //### # # ### +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 326 +0x0B, 0x0B,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //########### +0x80, 0x41, 0x04, 0x01, 0x00, 0x80, //# $. $ . # +0x80, 0x08, 0x00, 0x41, 0x00, 0x80, //# # $. # +0x81, 0x15, 0x11, 0x85, 0x81, 0x80, //#..*..#*#.# +0x84, 0x48, 0x44, 0x41, 0x04, 0x80, //#$$#$$$. $# +0x80, 0x01, 0x42, 0x41, 0x00, 0x80, //# .$@$. # +0x84, 0x01, 0x44, 0x48, 0x44, 0x80, //#$ .$$$#$$# +0x81, 0x85, 0x81, 0x15, 0x11, 0x80, //#.#*#..*..# +0x80, 0x01, 0x40, 0x08, 0x00, 0x80, //# .$ # # +0x80, 0x01, 0x40, 0x41, 0x00, 0x80, //# .$ $. # +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //########### +//Level: 327 +0x12, 0x10,//Size x and y +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x00, 0x00, // ####### +0x08, 0x88, 0x88, 0x88, 0x00, 0x00, 0x08, 0x00, 0x00, // ####### # +0x08, 0x00, 0x00, 0x08, 0x04, 0x24, 0x08, 0x00, 0x00, // # # $@$ # +0x08, 0x44, 0x08, 0x00, 0x08, 0x88, 0x88, 0x88, 0x88, // #$$ # ######### +0x08, 0x08, 0x88, 0x11, 0x11, 0x11, 0x88, 0x00, 0x08, // # ###......## # +0x08, 0x00, 0x04, 0x11, 0x11, 0x11, 0x88, 0x08, 0x08, // # $......## # # +0x08, 0x08, 0x88, 0x11, 0x11, 0x11, 0x00, 0x00, 0x08, // # ###...... # +0x88, 0x00, 0x08, 0x88, 0x80, 0x88, 0x80, 0x84, 0x88, //## #### ### #$## +0x80, 0x08, 0x40, 0x00, 0x80, 0x04, 0x00, 0x80, 0x80, //# #$ # $ # # +0x80, 0x04, 0x04, 0x44, 0x00, 0x80, 0x48, 0x80, 0x80, //# $ $$$ # $## # +0x80, 0x00, 0x40, 0x40, 0x88, 0x84, 0x40, 0x80, 0x80, //# $ $ ###$$ # # +0x88, 0x88, 0x80, 0x00, 0x00, 0x40, 0x00, 0x80, 0x80, //##### $ # # +0x00, 0x00, 0x88, 0x80, 0x88, 0x80, 0x00, 0x80, 0x80, // ### ### # # +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, // # # # +0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x00, 0x80, // ######## # +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x80, // #### +//Level: 328 +0x09, 0x07,//Size x and y +0x08, 0x88, 0x88, 0x00, 0x00, // ##### +0x08, 0x00, 0x08, 0x88, 0x80, // # #### +0x88, 0x08, 0x42, 0x00, 0x80, //## #$@ # +0x80, 0x40, 0x04, 0x40, 0x80, //# $ $$ # +0x80, 0x84, 0x81, 0x51, 0x80, //# #$#.*.# +0x80, 0x00, 0x01, 0x11, 0x80, //# ...# +0x88, 0x88, 0x88, 0x88, 0x80, //######### +//Level: 329 +0x08, 0x06,//Size x and y +0x00, 0x88, 0x88, 0x00, // #### +0x88, 0x81, 0x08, 0x00, //###. # +0x80, 0x10, 0x08, 0x88, //# . ### +0x80, 0x00, 0x44, 0x08, //# $$ # +0x88, 0x01, 0x04, 0x28, //## . $@# +0x08, 0x88, 0x88, 0x88, // ####### +//Level: 330 +0x08, 0x07,//Size x and y +0x08, 0x88, 0x88, 0x88, // ####### +0x88, 0x20, 0x00, 0x08, //##@ # +0x81, 0x08, 0x00, 0x08, //#. # # +0x80, 0x44, 0x41, 0x88, //# $$$.## +0x80, 0x18, 0x00, 0x80, //# .# # +0x80, 0x08, 0x88, 0x80, //# #### +0x88, 0x88, 0x00, 0x00, //#### +//Level: 331 +0x09, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x80, //######### +0x80, 0x00, 0x20, 0x00, 0x80, //# @ # +0x84, 0x44, 0x44, 0x44, 0x80, //#$$$$$$$# +0x81, 0x11, 0x81, 0x11, 0x80, //#...#...# +0x81, 0x11, 0x11, 0x11, 0x80, //#.......# +0x84, 0x44, 0x04, 0x44, 0x80, //#$$$ $$$# +0x80, 0x00, 0x00, 0x00, 0x80, //# # +0x88, 0x88, 0x88, 0x88, 0x80, //######### +//Level: 332 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x00, 0x08, 0x88, //## ### +0x80, 0x48, 0x08, 0x88, //# $# ### +0x80, 0x10, 0x28, 0x88, //# . @### +0x80, 0x50, 0x00, 0x88, //# * ## +0x88, 0x08, 0x40, 0x88, //## #$ ## +0x88, 0x10, 0x08, 0x88, //##. ### +0x88, 0x88, 0x88, 0x88, //######## +//Level: 333 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x80, 0x80, 0x80, 0x00, 0x82, 0x88, 0x00, 0x08, 0x08, //# # # # #@## # # +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, //# $ # +0x80, 0x08, 0x84, 0x80, 0x88, 0x88, 0x80, 0x40, 0x80, 0x88, //# ##$# ##### $ # ## +0x88, 0x00, 0x00, 0x88, 0x11, 0x11, 0x18, 0x00, 0x80, 0x08, //## ##.....# # # +0x88, 0x48, 0x84, 0x81, 0x11, 0x11, 0x88, 0x84, 0x84, 0x08, //##$##$#.....###$#$ # +0x80, 0x00, 0x80, 0x88, 0x11, 0x11, 0x18, 0x00, 0x80, 0x88, //# # ##.....# # ## +0x80, 0x04, 0x00, 0x00, 0x88, 0x11, 0x88, 0x00, 0x80, 0x08, //# $ ##..## # # +0x80, 0x40, 0x80, 0x00, 0x40, 0x00, 0x40, 0x04, 0x44, 0x08, //# $ # $ $ $$$ # +0x88, 0x04, 0x00, 0x48, 0x08, 0x00, 0x80, 0x04, 0x00, 0x08, //## $ $# # # $ # +0x80, 0x00, 0x88, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x08, //# ## # # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 334 +0x12, 0x0F,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //################## +0x81, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, //#..# # +0x81, 0x18, 0x00, 0x80, 0x40, 0x40, 0x40, 0x88, 0x08, //#..# # $ $ $ ## # +0x81, 0x18, 0x08, 0x88, 0x08, 0x08, 0x00, 0x80, 0x08, //#..# ### # # # # +0x81, 0x18, 0x08, 0x04, 0x48, 0x88, 0x48, 0x84, 0x08, //#..# # $$###$##$ # +0x81, 0x18, 0x00, 0x00, 0x00, 0x04, 0x24, 0x04, 0x08, //#..# $@$ $ # +0x81, 0x10, 0x04, 0x80, 0x40, 0x80, 0x44, 0x08, 0x08, //#.. $# $ # $$ # # +0x80, 0x08, 0x00, 0x80, 0x08, 0x88, 0x00, 0x08, 0x08, //# # # ### # # +0x80, 0x00, 0x08, 0x88, 0x00, 0x80, 0x08, 0x88, 0x08, //# ### # ### # +0x81, 0x18, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x08, //#..# $ $ # +0x81, 0x18, 0x08, 0x84, 0x00, 0x80, 0x08, 0x04, 0x08, //#..# ##$ # # $ # +0x81, 0x18, 0x00, 0x80, 0x08, 0x88, 0x08, 0x80, 0x08, //#..# # ### ## # +0x81, 0x18, 0x00, 0x88, 0x44, 0x08, 0x48, 0x84, 0x08, //#..# ##$$ #$##$ # +0x81, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, //#..# # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //################## +//Level: 335 +0x13, 0x10,//Size x and y +0x08, 0x88, 0x88, 0x80, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, // ###### #### +0x08, 0x00, 0x00, 0x88, 0x88, 0x88, 0x00, 0x80, 0x00, 0x00, // # ###### # +0x08, 0x28, 0x04, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, // #@# $ ## +0x88, 0x88, 0x84, 0x04, 0x08, 0x88, 0x80, 0x08, 0x80, 0x00, //#####$ $ #### ## +0x80, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x88, 0x00, //# $ # ## +0x80, 0x04, 0x40, 0x80, 0x88, 0x48, 0x88, 0x44, 0x08, 0x00, //# $$ # ##$###$$ # +0x80, 0x00, 0x00, 0x45, 0x15, 0x11, 0x80, 0x00, 0x08, 0x00, //# $*.*..# # +0x88, 0x88, 0x88, 0x81, 0x11, 0x15, 0x80, 0x40, 0x08, 0x00, //#######....*# $ # +0x00, 0x00, 0x00, 0x85, 0x11, 0x51, 0x80, 0x84, 0x88, 0x00, // #*..*.# #$## +0x00, 0x00, 0x00, 0x81, 0x11, 0x15, 0x04, 0x00, 0x08, 0x00, // #....* $ # +0x00, 0x00, 0x00, 0x81, 0x11, 0x11, 0x80, 0x44, 0x48, 0x00, // #.....# $$$# +0x00, 0x00, 0x00, 0x88, 0x88, 0x80, 0x80, 0x80, 0x08, 0x80, // ##### # # ## +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x80, // # # $ $ # +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x80, // # $ # +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x88, 0x00, 0x80, // # ### # +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x08, 0x88, 0x80, // #### #### +//Level: 336 +0x09, 0x08,//Size x and y +0x00, 0x08, 0x88, 0x88, 0x00, // ##### +0x88, 0x88, 0x10, 0x08, 0x80, //####. ## +0x80, 0x41, 0x41, 0x00, 0x80, //# $.$. # +0x82, 0x48, 0x08, 0x40, 0x80, //#@$# #$ # +0x80, 0x41, 0x01, 0x00, 0x80, //# $. . # +0x88, 0x88, 0x48, 0x40, 0x80, //####$#$ # +0x00, 0x81, 0x01, 0x00, 0x80, // #. . # +0x00, 0x88, 0x88, 0x88, 0x80, // ####### +//Level: 337 +0x07, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x80, //####### +0x80, 0x00, 0x00, 0x80, //# # +0x81, 0x88, 0x01, 0x80, //#.## .# +0x85, 0x00, 0x42, 0x80, //#* $@# +0x80, 0x08, 0x40, 0x80, //# #$ # +0x80, 0x08, 0x00, 0x80, //# # # +0x88, 0x88, 0x88, 0x80, //####### +//Level: 338 +0x13, 0x10,//Size x and y +0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //#### +0x80, 0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, //# ############## +0x80, 0x08, 0x00, 0x01, 0x18, 0x11, 0x11, 0x11, 0x80, 0x00, //# # ..#......# +0x80, 0x08, 0x08, 0x08, 0x88, 0x88, 0x01, 0x11, 0x80, 0x00, //# # # ##### ...# +0x88, 0x48, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x80, 0x00, //##$# ........# +0x80, 0x00, 0x88, 0x48, 0x88, 0x88, 0x80, 0x08, 0x88, 0x80, //# ##$###### #### +0x80, 0x40, 0x80, 0x00, 0x00, 0x88, 0x88, 0x88, 0x20, 0x80, //# $ # ######@ # +0x88, 0x40, 0x80, 0x40, 0x00, 0x88, 0x88, 0x88, 0x00, 0x80, //##$ # $ ###### # +0x80, 0x04, 0x08, 0x44, 0x48, 0x80, 0x00, 0x00, 0x00, 0x80, //# $ #$$$## # +0x80, 0x00, 0x00, 0x08, 0x00, 0x00, 0x84, 0x84, 0x88, 0x80, //# # #$#$### +0x80, 0x88, 0x88, 0x08, 0x44, 0x44, 0x40, 0x00, 0x08, 0x00, //# #### #$$$$$ # +0x80, 0x80, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, //# # $ # # +0x80, 0x80, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, //# # ## ### +0x80, 0x88, 0x88, 0x88, 0x48, 0x88, 0x88, 0x80, 0x40, 0x80, //# ######$###### $ # +0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x80, //# # # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x80, //########## ##### +//Level: 339 +0x14, 0x10,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, //############ +0x80, 0x00, 0x00, 0x08, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, //# # ## +0x80, 0x40, 0x04, 0x00, 0x08, 0x00, 0x88, 0x88, 0x88, 0x00, //# $ $ # ###### +0x88, 0x88, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x08, 0x00, //#### ##### # +0x08, 0x11, 0x00, 0x80, 0x00, 0x00, 0x88, 0x88, 0x08, 0x00, // #.. # #### # +0x08, 0x18, 0x88, 0x80, 0x08, 0x88, 0x80, 0x00, 0x08, 0x00, // #.#### #### # +0x08, 0x11, 0x11, 0x00, 0x00, 0x80, 0x04, 0x08, 0x88, 0x80, // #.... # $ #### +0x08, 0x01, 0x11, 0x80, 0x00, 0x80, 0x44, 0x48, 0x00, 0x88, // # ...# # $$$# ## +0x88, 0x81, 0x88, 0x88, 0x08, 0x80, 0x04, 0x24, 0x00, 0x08, //###.#### ## $@$ # +0x80, 0x00, 0x00, 0x88, 0x88, 0x80, 0x40, 0x80, 0x00, 0x08, //# ##### $ # # +0x80, 0x81, 0x80, 0x40, 0x00, 0x00, 0x04, 0x88, 0x84, 0x08, //# #.# $ $###$ # +0x80, 0x81, 0x88, 0x88, 0x88, 0x88, 0x00, 0x80, 0x04, 0x08, //# #.######## # $ # +0x80, 0x81, 0x10, 0x00, 0x00, 0x00, 0x08, 0x80, 0x04, 0x08, //# #.. ## $ # +0x80, 0x80, 0x88, 0x88, 0x88, 0x80, 0x40, 0x80, 0x80, 0x08, //# # ####### $ # # # +0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x88, //# # # ## +0x88, 0x88, 0x80, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, //##### ########## +//Level: 340 +0x09, 0x09,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x00, // ####### +0x88, 0x00, 0x50, 0x08, 0x80, //## * ## +0x80, 0x12, 0x10, 0x10, 0x80, //# .@. . # +0x80, 0x40, 0x50, 0x00, 0x80, //# $ * # +0x85, 0x44, 0x54, 0x45, 0x80, //#*$$*$$*# +0x80, 0x00, 0x50, 0x40, 0x80, //# * $ # +0x80, 0x10, 0x10, 0x10, 0x80, //# . . . # +0x88, 0x00, 0x50, 0x08, 0x80, //## * ## +0x08, 0x88, 0x88, 0x88, 0x00, // ####### +//Level: 341 +0x14, 0x0C,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x00, 0x00, 0x88, 0x81, 0x18, 0x88, 0x00, 0x00, 0x08, //# ###..### # +0x80, 0x44, 0x00, 0x88, 0x81, 0x18, 0x88, 0x00, 0x42, 0x08, //# $$ ###..### $@ # +0x80, 0x08, 0x08, 0x81, 0x11, 0x11, 0x18, 0x00, 0x40, 0x08, //# # ##......# $ # +0x80, 0x00, 0x00, 0x81, 0x11, 0x11, 0x18, 0x00, 0x40, 0x08, //# #......# $ # +0x88, 0x88, 0x00, 0x88, 0x81, 0x18, 0x88, 0x88, 0x84, 0x08, //#### ###..######$ # +0x80, 0x00, 0x44, 0x40, 0x81, 0x18, 0x00, 0x00, 0x80, 0x08, //# $$$ #..# # # +0x80, 0x48, 0x00, 0x04, 0x00, 0x40, 0x04, 0x40, 0x84, 0x08, //# $# $ $ $$ #$ # +0x80, 0x08, 0x00, 0x88, 0x04, 0x00, 0x88, 0x00, 0x80, 0x08, //# # ## $ ## # # +0x80, 0x40, 0x00, 0x04, 0x08, 0x80, 0x40, 0x00, 0x04, 0x08, //# $ $ ## $ $ # +0x80, 0x08, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x80, 0x08, //# # ## ## # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 342 +0x07, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x00, //###### +0x80, 0x00, 0x28, 0x80, //# @## +0x80, 0x08, 0x00, 0x80, //# # # +0x81, 0x00, 0x40, 0x80, //#. $ # +0x80, 0x44, 0x81, 0x80, //# $$#.# +0x88, 0x80, 0x01, 0x80, //### .# +0x00, 0x88, 0x88, 0x80, // ##### +//Level: 343 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x88, 0x88, 0x88, //######## +0x81, 0x00, 0x01, 0x08, //#. . # +0x80, 0x80, 0x80, 0x08, //# # # # +0x82, 0x40, 0x04, 0x18, //#@$ $.# +0x88, 0x88, 0x80, 0x48, //##### $# +0x88, 0x88, 0x80, 0x08, //##### # +0x88, 0x88, 0x88, 0x88, //######## +//Level: 344 +0x0E, 0x0A,//Size x and y +0x88, 0x88, 0x00, 0x00, 0x00, 0x88, 0x88, //#### #### +0x81, 0x18, 0x88, 0x88, 0x88, 0x81, 0x18, //#..########..# +0x85, 0x15, 0x11, 0x11, 0x15, 0x15, 0x18, //#*.*.....*.*.# +0x80, 0x40, 0x40, 0x40, 0x40, 0x40, 0x48, //# $ $ $ $ $ $# +0x84, 0x04, 0x04, 0x24, 0x04, 0x04, 0x08, //#$ $ $@$ $ $ # +0x80, 0x40, 0x40, 0x40, 0x40, 0x40, 0x48, //# $ $ $ $ $ $# +0x84, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, //#$ $ $ $ $ $ # +0x81, 0x51, 0x51, 0x11, 0x11, 0x51, 0x58, //#.*.*.....*.*# +0x81, 0x18, 0x88, 0x88, 0x88, 0x81, 0x18, //#..########..# +0x88, 0x88, 0x00, 0x00, 0x00, 0x88, 0x88, //#### #### +//Level: 345 +0x08, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x80, 0x01, 0x80, 0x28, //# .# @# +0x80, 0x80, 0x40, 0x08, //# # $ # +0x80, 0x41, 0x84, 0x08, //# $.#$ # +0x88, 0x01, 0x00, 0x08, //## . # +0x08, 0x00, 0x88, 0x88, // # #### +0x08, 0x88, 0x80, 0x00, // #### +//Level: 346 +0x13, 0x10,//Size x and y +0x08, 0x88, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, // ### ############# +0x88, 0x28, 0x88, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, //##@#### # # +0x80, 0x44, 0x00, 0x04, 0x40, 0x04, 0x04, 0x01, 0x11, 0x80, //# $$ $$ $ $ ...# +0x80, 0x04, 0x44, 0x80, 0x00, 0x04, 0x00, 0x81, 0x11, 0x80, //# $$$# $ #...# +0x80, 0x40, 0x00, 0x80, 0x44, 0x04, 0x40, 0x81, 0x11, 0x80, //# $ # $$ $$ #...# +0x88, 0x80, 0x00, 0x80, 0x04, 0x00, 0x00, 0x81, 0x11, 0x80, //### # $ #...# +0x80, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x81, 0x11, 0x80, //# # $ $ $ #...# +0x80, 0x00, 0x08, 0x88, 0x88, 0x80, 0x88, 0x81, 0x11, 0x80, //# ###### ###...# +0x88, 0x08, 0x00, 0x80, 0x04, 0x04, 0x00, 0x81, 0x11, 0x80, //## # # $ $ #...# +0x80, 0x08, 0x80, 0x80, 0x44, 0x04, 0x04, 0x88, 0x11, 0x80, //# ## # $$ $ $##..# +0x80, 0x11, 0x80, 0x80, 0x04, 0x00, 0x00, 0x00, 0x81, 0x80, //# ..# # $ #.# +0x80, 0x11, 0x80, 0x80, 0x44, 0x40, 0x44, 0x40, 0x81, 0x80, //# ..# # $$$ $$$ #.# +0x88, 0x88, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x81, 0x80, //##### # # #.# +0x00, 0x00, 0x80, 0x88, 0x88, 0x88, 0x88, 0x80, 0x81, 0x80, // # ######### #.# +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x80, // # #.# +0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, // ############### +//Level: 347 +0x13, 0x10,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, // ########## +0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x08, 0x88, 0x80, 0x00, //##### #### +0x80, 0x00, 0x00, 0x80, 0x00, 0x40, 0x08, 0x20, 0x80, 0x00, //# # $ #@ # +0x80, 0x88, 0x88, 0x88, 0x84, 0x88, 0x88, 0x00, 0x88, 0x80, //# #######$#### ### +0x80, 0x80, 0x00, 0x08, 0x80, 0x80, 0x08, 0x40, 0x11, 0x80, //# # ## # #$ ..# +0x80, 0x80, 0x40, 0x00, 0x00, 0x80, 0x08, 0x00, 0x81, 0x80, //# # $ # # #.# +0x80, 0x80, 0x40, 0x08, 0x00, 0x00, 0x08, 0x40, 0x11, 0x80, //# # $ # #$ ..# +0x80, 0x80, 0x08, 0x88, 0x08, 0x80, 0x00, 0x00, 0x81, 0x80, //# # ### ## #.# +0x80, 0x88, 0x80, 0x08, 0x00, 0x80, 0x08, 0x40, 0x11, 0x80, //# ### # # #$ ..# +0x80, 0x80, 0x00, 0x08, 0x00, 0x88, 0x88, 0x00, 0x81, 0x80, //# # # #### #.# +0x80, 0x84, 0x00, 0x04, 0x00, 0x40, 0x08, 0x40, 0x11, 0x80, //# #$ $ $ #$ ..# +0x80, 0x00, 0x04, 0x08, 0x04, 0x04, 0x08, 0x00, 0x81, 0x80, //# $ # $ $ # #.# +0x88, 0x88, 0x04, 0x88, 0x80, 0x00, 0x08, 0x40, 0x11, 0x80, //#### $### #$ ..# +0x00, 0x08, 0x00, 0x00, 0x44, 0x08, 0x88, 0x11, 0x11, 0x80, // # $$ ###....# +0x00, 0x08, 0x00, 0x00, 0x00, 0x88, 0x08, 0x88, 0x88, 0x80, // # ## ###### +0x00, 0x08, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, // ######## +//Level: 348 +0x08, 0x08,//Size x and y +0x00, 0x08, 0x88, 0x80, // #### +0x00, 0x08, 0x00, 0x80, // # # +0x88, 0x88, 0x04, 0x88, //#### $## +0x80, 0x24, 0x10, 0x08, //# @$. # +0x80, 0x88, 0x00, 0x08, //# ## # +0x80, 0x00, 0x88, 0x08, //# ## # +0x80, 0x00, 0x50, 0x18, //# * .# +0x88, 0x88, 0x88, 0x88, //######## +//Level: 349 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x80, 0x08, 0x88, 0x88, //# ##### +0x80, 0x08, 0x88, 0x88, //# ##### +0x80, 0x15, 0x00, 0x08, //# .* # +0x88, 0x40, 0x00, 0x08, //##$ # +0x88, 0x08, 0x48, 0x88, //## #$### +0x88, 0x10, 0x28, 0x88, //##. @### +0x88, 0x88, 0x88, 0x88, //######## +//Level: 350 +0x09, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x80, //######### +0x82, 0x00, 0x40, 0x10, 0x80, //#@ $ . # +0x80, 0x40, 0x41, 0x40, 0x80, //# $ $.$ # +0x81, 0x51, 0x51, 0x51, 0x80, //#.*.*.*.# +0x80, 0x41, 0x40, 0x40, 0x80, //# $.$ $ # +0x80, 0x10, 0x40, 0x00, 0x80, //# . $ # +0x88, 0x88, 0x88, 0x88, 0x80, //######### +//Level: 351 +0x07, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x80, //####### +0x81, 0x01, 0x01, 0x80, //#. . .# +0x80, 0x44, 0x40, 0x80, //# $$$ # +0x81, 0x42, 0x41, 0x80, //#.$@$.# +0x80, 0x44, 0x40, 0x80, //# $$$ # +0x81, 0x01, 0x01, 0x80, //#. . .# +0x88, 0x88, 0x88, 0x80, //####### +//Level: 352 +0x09, 0x07,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x80, //######### +0x82, 0x01, 0x00, 0x00, 0x80, //#@ . # +0x80, 0x44, 0x14, 0x40, 0x80, //# $$.$$ # +0x81, 0x51, 0x11, 0x51, 0x80, //#.*...*.# +0x80, 0x44, 0x14, 0x40, 0x80, //# $$.$$ # +0x80, 0x41, 0x00, 0x00, 0x80, //# $. # +0x88, 0x88, 0x88, 0x88, 0x80, //######### +//Level: 353 +0x14, 0x0F,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x80, 0x00, 0x08, 0x80, 0x00, 0x80, 0x00, 0x08, 0x00, 0x08, //# ## # # # +0x80, 0x04, 0x00, 0x40, 0x00, 0x00, 0x88, 0x04, 0x00, 0x08, //# $ $ ## $ # +0x88, 0x08, 0x88, 0x88, 0x00, 0x18, 0x88, 0x88, 0x80, 0x88, //## ##### .###### ## +0x08, 0x08, 0x80, 0x08, 0x81, 0x11, 0x18, 0x88, 0x80, 0x88, // # ## ##....#### ## +0x88, 0x08, 0x84, 0x08, 0x88, 0x11, 0x88, 0x00, 0x00, 0x08, //## ##$ ###..## # +0x80, 0x00, 0x00, 0x08, 0x11, 0x10, 0x18, 0x04, 0x04, 0x08, //# #... .# $ $ # +0x80, 0x40, 0x88, 0x08, 0x80, 0x10, 0x88, 0x80, 0x88, 0x88, //# $ ## ## . ### #### +0x80, 0x80, 0x40, 0x00, 0x08, 0x18, 0x80, 0x80, 0x80, 0x00, //# # $ #.## # # +0x80, 0x40, 0x40, 0x80, 0x00, 0x18, 0x88, 0x80, 0x88, 0x00, //# $ $ # .#### ## +0x80, 0x80, 0x08, 0x80, 0x80, 0x88, 0x00, 0x80, 0x08, 0x80, //# # ## # ## # ## +0x88, 0x88, 0x88, 0x80, 0x04, 0x88, 0x40, 0x00, 0x40, 0x80, //####### $##$ $ # +0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x40, 0x82, 0x80, // ## $ #@# +0x00, 0x00, 0x00, 0x08, 0x00, 0x88, 0x08, 0x88, 0x88, 0x80, // # ## ###### +0x00, 0x00, 0x00, 0x08, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, // ####### +//Level: 354 +0x0D, 0x10,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, // ######### +0x00, 0x85, 0x15, 0x85, 0x15, 0x80, 0x00, // #*.*#*.*# +0x00, 0x81, 0x51, 0x51, 0x51, 0x80, 0x00, // #.*.*.*.# +0x00, 0x85, 0x15, 0x15, 0x15, 0x80, 0x00, // #*.*.*.*# +0x00, 0x81, 0x51, 0x51, 0x51, 0x80, 0x00, // #.*.*.*.# +0x00, 0x85, 0x15, 0x15, 0x15, 0x80, 0x00, // #*.*.*.*# +0x00, 0x88, 0x80, 0x00, 0x88, 0x80, 0x00, // ### ### +0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, // # # +0x88, 0x88, 0x88, 0x08, 0x88, 0x88, 0x80, //###### ###### +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, //# # +0x80, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, //# $ $ $ $ $ # +0x88, 0x04, 0x04, 0x04, 0x04, 0x08, 0x80, //## $ $ $ $ ## +0x08, 0x40, 0x40, 0x40, 0x40, 0x48, 0x00, // #$ $ $ $ $# +0x08, 0x00, 0x04, 0x24, 0x00, 0x08, 0x00, // # $@$ # +0x08, 0x00, 0x88, 0x88, 0x80, 0x08, 0x00, // # ##### # +0x08, 0x88, 0x80, 0x00, 0x88, 0x88, 0x00, // #### #### +//Level: 355 +0x05, 0x08,//Size x and y +0x88, 0x88, 0x00, //#### +0x80, 0x28, 0x00, //# @# +0x80, 0x48, 0x80, //# $## +0x80, 0x41, 0x80, //# $.# +0x80, 0x41, 0x80, //# $.# +0x80, 0x41, 0x80, //# $.# +0x88, 0x81, 0x80, //###.# +0x00, 0x88, 0x80, // ### +//Level: 356 +0x0D, 0x0A,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, //########### +0x82, 0x40, 0x00, 0x11, 0x11, 0x88, 0x00, //#@$ ....## +0x80, 0x44, 0x44, 0x81, 0x11, 0x18, 0x00, //# $$$$#....# +0x80, 0x40, 0x04, 0x11, 0x55, 0x58, 0x80, //# $ $..***## +0x88, 0x00, 0x08, 0x08, 0x81, 0x10, 0x80, //## # ##.. # +0x80, 0x44, 0x48, 0x00, 0x88, 0x00, 0x80, //# $$$# ## # +0x80, 0x00, 0x08, 0x80, 0x80, 0x08, 0x80, //# ## # ## +0x80, 0x04, 0x40, 0x80, 0x00, 0x08, 0x00, //# $$ # # +0x80, 0x00, 0x00, 0x88, 0x80, 0x08, 0x00, //# ### # +0x88, 0x88, 0x88, 0x80, 0x88, 0x88, 0x00, //####### #### +//Level: 357 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x81, 0x01, 0x88, 0x88, //#. .#### +0x81, 0x84, 0x40, 0x88, //#.#$$ ## +0x80, 0x00, 0x20, 0x88, //# @ ## +0x80, 0x48, 0x00, 0x88, //# $# ## +0x88, 0x00, 0x08, 0x88, //## ### +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x88, 0x88, 0x88, //######## +//Level: 358 +0x13, 0x13,//Size x and y +0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, // # # # # # # # # # +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, //# # # # # # # #.# # +0x08, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, 0x00, // #... $.# +0x80, 0x04, 0x84, 0x00, 0x80, 0x80, 0x80, 0x40, 0x00, 0x80, //# $#$ # # # $ # +0x08, 0x10, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x18, 0x00, // #. $ # # # # $.# +0x80, 0x80, 0x40, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, //# # $ # # # +0x08, 0x00, 0x08, 0x00, 0x88, 0x88, 0x80, 0x08, 0x08, 0x00, // # # ##### # # +0x80, 0x00, 0x80, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x80, //# # # # # # +0x08, 0x08, 0x00, 0x80, 0x08, 0x88, 0x08, 0x08, 0x08, 0x00, // # # # ### # # # +0x80, 0x01, 0x40, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, //# .$ . # # +0x08, 0x08, 0x40, 0x80, 0x80, 0x08, 0x08, 0x08, 0x08, 0x00, // # #$ # # # # # # +0x80, 0x08, 0x00, 0x80, 0x08, 0x48, 0x08, 0x08, 0x00, 0x80, //# # # #$# # # # +0x08, 0x01, 0x80, 0x08, 0x00, 0x08, 0x08, 0x08, 0x28, 0x00, // # .# # # # #@# +0x80, 0x00, 0x08, 0x00, 0x88, 0x80, 0x48, 0x08, 0x00, 0x80, //# # ### $# # # +0x08, 0x04, 0x40, 0x80, 0x00, 0x00, 0x41, 0x18, 0x48, 0x00, // # $$ # $..#$# +0x80, 0x81, 0x00, 0x08, 0x88, 0x88, 0x84, 0x88, 0x10, 0x80, //# #. ######$##. # +0x08, 0x08, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x18, 0x00, // # #.$ . .# +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, //# # # # # # # # # # +0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, // # # # # # # # # # +//Level: 359 +0x14, 0x11,//Size x and y +0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, // ################## +0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x11, 0x81, 0x88, // # $ ...#.## +0x08, 0x00, 0x00, 0x00, 0x08, 0x88, 0x81, 0x11, 0x11, 0x08, // # ####..... # +0x08, 0x08, 0x88, 0x88, 0x88, 0x00, 0x81, 0x11, 0x11, 0x08, // # ####### #..... # +0x08, 0x08, 0x00, 0x00, 0x40, 0x40, 0x88, 0x11, 0x11, 0x88, // # # $ $ ##....## +0x08, 0x08, 0x00, 0x40, 0x80, 0x80, 0x88, 0x81, 0x11, 0x80, // # # $ # # ###...# +0x08, 0x08, 0x04, 0x24, 0x04, 0x00, 0x88, 0x88, 0x80, 0x80, // # # $@$ $ ##### # +0x88, 0x08, 0x00, 0x40, 0x04, 0x04, 0x40, 0x00, 0x40, 0x80, //## # $ $ $$ $ # +0x80, 0x08, 0x48, 0x04, 0x80, 0x00, 0x80, 0x48, 0x80, 0x80, //# #$# $# # $## # +0x80, 0x88, 0x00, 0x00, 0x88, 0x08, 0x80, 0x40, 0x80, 0x80, //# ## ## ## $ # # +0x80, 0x80, 0x48, 0x04, 0x04, 0x00, 0x80, 0x00, 0x00, 0x80, //# # $# $ $ # # +0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x80, //# # ####### +0x80, 0x88, 0x88, 0x88, 0x88, 0x48, 0x80, 0x00, 0x80, 0x00, //# ########$## # +0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, 0x80, 0x00, //# # $ # +0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x88, 0x88, 0x80, 0x00, //######## ##### +0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x80, 0x00, 0x00, 0x00, // ### # +0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, 0x00, // #### +//Level: 360 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x81, 0x00, 0x88, 0x88, //#. #### +0x80, 0x80, 0x00, 0x88, //# # ## +0x80, 0x10, 0x80, 0x88, //# . # ## +0x80, 0x45, 0x40, 0x88, //# $*$ ## +0x88, 0x20, 0x88, 0x88, //##@ #### +0x88, 0x00, 0x88, 0x88, //## #### +0x88, 0x88, 0x88, 0x88, //######## +//Level: 361 +0x13, 0x11,//Size x and y +0x00, 0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, // ##### +0x00, 0x00, 0x08, 0x80, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, // ## ## +0x00, 0x00, 0x88, 0x00, 0x50, 0x08, 0x80, 0x00, 0x00, 0x00, // ## * ## +0x00, 0x08, 0x80, 0x05, 0x05, 0x00, 0x88, 0x00, 0x00, 0x00, // ## * * ## +0x00, 0x88, 0x00, 0x50, 0x50, 0x50, 0x08, 0x80, 0x00, 0x00, // ## * * * ## +0x08, 0x80, 0x05, 0x05, 0x05, 0x05, 0x00, 0x88, 0x88, 0x00, // ## * * * * #### +0x88, 0x00, 0x50, 0x50, 0x50, 0x50, 0x50, 0x08, 0x08, 0x80, //## * * * * * # ## +0x80, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x00, 0x80, //# * * * * * * # +0x80, 0x50, 0x50, 0x50, 0x10, 0x50, 0x50, 0x52, 0x40, 0x80, //# * * * . * * *@$ # +0x80, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x00, 0x80, //# * * * * * * # +0x88, 0x00, 0x50, 0x50, 0x50, 0x50, 0x50, 0x08, 0x08, 0x80, //## * * * * * # ## +0x08, 0x80, 0x05, 0x05, 0x05, 0x05, 0x00, 0x88, 0x88, 0x00, // ## * * * * #### +0x00, 0x88, 0x00, 0x50, 0x50, 0x50, 0x08, 0x80, 0x00, 0x00, // ## * * * ## +0x00, 0x08, 0x80, 0x05, 0x05, 0x00, 0x88, 0x00, 0x00, 0x00, // ## * * ## +0x00, 0x00, 0x88, 0x00, 0x50, 0x08, 0x80, 0x00, 0x00, 0x00, // ## * ## +0x00, 0x00, 0x08, 0x80, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, // ## ## +0x00, 0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, // ##### +//Level: 362 +0x07, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x00, //###### +0x80, 0x10, 0x08, 0x00, //# . # +0x80, 0x08, 0x28, 0x00, //# #@# +0x80, 0x04, 0x08, 0x80, //# $ ## +0x88, 0x48, 0x00, 0x80, //##$# # +0x80, 0x00, 0x80, 0x80, //# # # +0x81, 0x05, 0x00, 0x80, //#. * # +0x88, 0x88, 0x88, 0x80, //####### +//Level: 363 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x00, 0x12, 0x08, //## .@ # +0x88, 0x08, 0x18, 0x08, //## #.# # +0x88, 0x00, 0x04, 0x08, //## $ # +0x88, 0x14, 0x40, 0x88, //##.$$ ## +0x88, 0x00, 0x88, 0x88, //## #### +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x88, 0x88, 0x88, //######## +//Level: 364 +0x13, 0x10,//Size x and y +0x88, 0x88, 0x88, 0x00, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, //###### #### +0x80, 0x00, 0x08, 0x88, 0x88, 0x88, 0x00, 0x88, 0x88, 0x80, //# ####### ##### +0x80, 0x00, 0x48, 0x00, 0x80, 0x04, 0x00, 0x80, 0x00, 0x80, //# $# # $ # # +0x80, 0x04, 0x00, 0x40, 0x04, 0x08, 0x04, 0x04, 0x00, 0x80, //# $ $ $ # $ $ # +0x88, 0x40, 0x40, 0x00, 0x80, 0x28, 0x04, 0x00, 0x00, 0x80, //##$ $ # @# $ # +0x80, 0x04, 0x08, 0x88, 0x88, 0x88, 0x88, 0x88, 0x08, 0x80, //# $ ########### ## +0x80, 0x80, 0x00, 0x81, 0x11, 0x11, 0x11, 0x80, 0x48, 0x00, //# # #.......# $# +0x80, 0x88, 0x00, 0x80, 0x11, 0x11, 0x11, 0x80, 0x08, 0x00, //# ## # ......# # +0x80, 0x80, 0x00, 0x41, 0x11, 0x11, 0x11, 0x14, 0x08, 0x00, //# # $........$ # +0x80, 0x80, 0x40, 0x81, 0x11, 0x10, 0x11, 0x80, 0x08, 0x00, //# # $ #.... ..# # +0x80, 0x04, 0x04, 0x88, 0x88, 0x48, 0x88, 0x80, 0x48, 0x00, //# $ $####$#### $# +0x80, 0x40, 0x00, 0x88, 0x80, 0x40, 0x00, 0x40, 0x08, 0x80, //# $ ### $ $ ## +0x80, 0x40, 0x00, 0x00, 0x40, 0x40, 0x04, 0x00, 0x00, 0x80, //# $ $ $ $ # +0x88, 0x08, 0x88, 0x88, 0x80, 0x40, 0x88, 0x88, 0x80, 0x80, //## ###### $ ##### # +0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, //# # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //################### +//Level: 365 +0x14, 0x12,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x80, 0x88, 0x88, 0x88, 0x00, 0x00, // ####### ###### +0x08, 0x80, 0x00, 0x00, 0x88, 0x80, 0x00, 0x08, 0x00, 0x00, // ## ### # +0x08, 0x00, 0x88, 0x80, 0x00, 0x80, 0x44, 0x08, 0x88, 0x00, // # ### # $$ ### +0x08, 0x08, 0x02, 0x08, 0x00, 0x80, 0x04, 0x00, 0x08, 0x00, // # # @ # # $ # +0x08, 0x08, 0x44, 0x48, 0x08, 0x88, 0x84, 0x88, 0x08, 0x88, // # #$$$# ####$## ### +0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x11, 0x18, //## $ #...# +0x80, 0x08, 0x48, 0x48, 0x80, 0x08, 0x00, 0x08, 0x11, 0x18, //# #$#$## # #...# +0x80, 0x80, 0x04, 0x00, 0x80, 0x80, 0x88, 0x08, 0x11, 0x18, //# # $ # # ## #...# +0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x08, 0x11, 0x18, //# # # # #...# +0x80, 0x08, 0x44, 0x48, 0x80, 0x84, 0x00, 0x08, 0x11, 0x18, //# #$$$## #$ #...# +0x88, 0x00, 0x00, 0x00, 0x00, 0x04, 0x48, 0x88, 0x11, 0x18, //## $$###...# +0x08, 0x08, 0x48, 0x48, 0x80, 0x84, 0x00, 0x00, 0x11, 0x18, // # #$#$## #$ ...# +0x08, 0x08, 0x00, 0x00, 0x80, 0x80, 0x40, 0x00, 0x11, 0x18, // # # # # $ ...# +0x08, 0x08, 0x00, 0x00, 0x80, 0x80, 0x08, 0x88, 0x88, 0x88, // # # # # ####### +0x08, 0x08, 0x44, 0x48, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00, // # #$$$## # # +0x08, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, // # #### +0x08, 0x88, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, // ### ### +0x00, 0x08, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // ###### +//Level: 366 +0x0E, 0x10,//Size x and y +0x00, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, // ### +0x08, 0x88, 0x88, 0x82, 0x88, 0x88, 0x80, // ######@##### +0x08, 0x11, 0x11, 0x11, 0x11, 0x11, 0x80, // #..........# +0x88, 0x15, 0x55, 0x55, 0x55, 0x51, 0x88, //##.********.## +0x81, 0x15, 0x11, 0x11, 0x11, 0x51, 0x18, //#..*......*..# +0x81, 0x15, 0x15, 0x55, 0x51, 0x51, 0x18, //#..*.****.*..# +0x88, 0x88, 0x88, 0x11, 0x88, 0x88, 0x88, //######..###### +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, // # # +0x08, 0x04, 0x04, 0x44, 0x40, 0x40, 0x80, // # $ $$$$ $ # +0x08, 0x44, 0x40, 0x00, 0x04, 0x44, 0x80, // #$$$ $$$# +0x08, 0x00, 0x04, 0x44, 0x40, 0x00, 0x80, // # $$$$ # +0x08, 0x40, 0x40, 0x00, 0x04, 0x04, 0x80, // #$ $ $ $# +0x88, 0x00, 0x04, 0x44, 0x40, 0x00, 0x88, //## $$$$ ## +0x80, 0x44, 0x40, 0x00, 0x04, 0x44, 0x08, //# $$$ $$$ # +0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x08, //# # # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //############## +//Level: 367 +0x14, 0x10,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +0x81, 0x18, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, //#..# # # +0x81, 0x40, 0x04, 0x00, 0x84, 0x40, 0x04, 0x88, 0x04, 0x88, //#.$ $ #$$ $## $## +0x81, 0x48, 0x00, 0x88, 0x80, 0x08, 0x80, 0x88, 0x00, 0x08, //#.$# ### ## ## # +0x80, 0x08, 0x04, 0x08, 0x00, 0x44, 0x00, 0x04, 0x00, 0x08, //# # $ # $$ $ # +0x80, 0x88, 0x80, 0x08, 0x08, 0x00, 0x84, 0x00, 0x88, 0x88, //# ### # # #$ #### +0x80, 0x08, 0x80, 0x80, 0x40, 0x00, 0x82, 0x08, 0x00, 0x08, //# ## # $ #@ # # +0x80, 0x40, 0x00, 0x04, 0x00, 0x88, 0x18, 0x80, 0x04, 0x08, //# $ $ ##.## $ # +0x80, 0x08, 0x04, 0x80, 0x48, 0x04, 0x00, 0x00, 0x08, 0x88, //# # $# $# $ ### +0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, //# # # # ### # +0x80, 0x08, 0x88, 0x88, 0x88, 0x80, 0x80, 0x00, 0x00, 0x08, //# ######## # # +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x18, 0x18, //# # #.#.# +0x88, 0x48, 0x88, 0x88, 0x88, 0x84, 0x80, 0x00, 0x11, 0x18, //##$########$# ...# +0x80, 0x00, 0x01, 0x50, 0x08, 0x00, 0x00, 0x88, 0x18, 0x18, //# .* # ##.#.# +0x80, 0x15, 0x11, 0x15, 0x00, 0x04, 0x00, 0x11, 0x11, 0x18, //# .*...* $ .....# +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, //#################### +//Level: 368 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x88, 0x88, 0x88, //######## +0x81, 0x00, 0x21, 0x88, //#. @.## +0x80, 0x04, 0x80, 0x88, //# $# ## +0x80, 0x80, 0x41, 0x08, //# # $. # +0x80, 0x00, 0x48, 0x08, //# $# # +0x88, 0x88, 0x00, 0x08, //#### # +0x88, 0x88, 0x88, 0x88, //######## +//Level: 369 +0x0B, 0x09,//Size x and y +0x00, 0x88, 0x88, 0x88, 0x88, 0x80, // ######### +0x88, 0x80, 0x00, 0x80, 0x00, 0x80, //### # # +0x80, 0x04, 0x10, 0x50, 0x40, 0x80, //# $. * $ # +0x80, 0x81, 0x81, 0x81, 0x80, 0x80, //# #.#.#.# # +0x80, 0x40, 0x42, 0x40, 0x40, 0x80, //# $ $@$ $ # +0x80, 0x81, 0x81, 0x81, 0x80, 0x80, //# #.#.#.# # +0x80, 0x40, 0x50, 0x14, 0x00, 0x80, //# $ * .$ # +0x80, 0x00, 0x88, 0x88, 0x88, 0x80, //# ####### +0x88, 0x88, 0x80, 0x00, 0x00, 0x00, //##### +//Level: 370 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x80, 0x01, 0x08, //### . # +0x88, 0x05, 0x08, 0x08, //## * # # +0x88, 0x01, 0x40, 0x08, //## .$ # +0x88, 0x00, 0x84, 0x88, //## #$## +0x88, 0x80, 0x20, 0x88, //### @ ## +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x88, 0x88, 0x88, //######## +//Level: 371 +0x08, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, //######## +0x80, 0x11, 0x88, 0x88, //# ..#### +0x80, 0x40, 0x00, 0x08, //# $ # +0x80, 0x08, 0x48, 0x08, //# #$# # +0x80, 0x20, 0x14, 0x08, //# @ .$ # +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x88, 0x88, 0x88, //######## +0x88, 0x88, 0x88, 0x88, //######## +//Level: 372 +0x0B, 0x08,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x00, //########## +0x80, 0x00, 0x00, 0x00, 0x08, 0x80, //# ## +0x80, 0x48, 0x48, 0x48, 0x42, 0x80, //# $#$#$#$@# +0x81, 0x01, 0x41, 0x11, 0x41, 0x80, //#. .$...$.# +0x81, 0x01, 0x41, 0x11, 0x41, 0x80, //#. .$...$.# +0x80, 0x48, 0x48, 0x48, 0x48, 0x80, //# $#$#$#$## +0x80, 0x00, 0x00, 0x00, 0x08, 0x00, //# # +0x88, 0x88, 0x88, 0x88, 0x88, 0x00, //########## +//Level: 373 +0x0F, 0x0D,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############### +0x80, 0x01, 0x11, 0x11, 0x11, 0x11, 0x00, 0x80, //# ......... # +0x80, 0x44, 0x44, 0x44, 0x44, 0x41, 0x40, 0x80, //# $$$$$$$$$.$ # +0x80, 0x41, 0x11, 0x11, 0x11, 0x41, 0x40, 0x80, //# $.......$.$ # +0x80, 0x41, 0x44, 0x44, 0x41, 0x41, 0x40, 0x80, //# $.$$$$$.$.$ # +0x80, 0x41, 0x41, 0x11, 0x41, 0x41, 0x40, 0x80, //# $.$...$.$.$ # +0x80, 0x41, 0x41, 0x45, 0x41, 0x41, 0x42, 0x80, //# $.$.$*$.$.$@# +0x80, 0x41, 0x41, 0x41, 0x11, 0x41, 0x40, 0x80, //# $.$.$...$.$ # +0x80, 0x41, 0x41, 0x44, 0x44, 0x41, 0x40, 0x80, //# $.$.$$$$$.$ # +0x80, 0x41, 0x41, 0x11, 0x11, 0x11, 0x40, 0x80, //# $.$.......$ # +0x80, 0x41, 0x44, 0x44, 0x44, 0x44, 0x40, 0x80, //# $.$$$$$$$$$ # +0x80, 0x01, 0x11, 0x11, 0x11, 0x11, 0x00, 0x80, //# ......... # +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //############### +//Level: 374 +0x11, 0x12,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, // ######### +0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, // # # +0x00, 0x08, 0x80, 0x40, 0x40, 0x40, 0x88, 0x00, 0x00, // ## $ $ $ ## +0x88, 0x88, 0x00, 0x04, 0x04, 0x40, 0x08, 0x88, 0x80, //#### $ $$ #### +0x80, 0x00, 0x80, 0x40, 0x04, 0x00, 0x80, 0x00, 0x80, //# # $ $ # # +0x80, 0x44, 0x08, 0x04, 0x04, 0x08, 0x04, 0x40, 0x80, //# $$ # $ $ # $$ # +0x80, 0x00, 0x40, 0x84, 0x04, 0x80, 0x04, 0x00, 0x80, //# $ #$ $# $ # +0x80, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x40, 0x80, //# $ $ $ $ # +0x80, 0x40, 0x40, 0x80, 0x40, 0x80, 0x44, 0x00, 0x80, //# $ $ # $ # $$ # +0x80, 0x40, 0x08, 0x88, 0x08, 0x88, 0x00, 0x40, 0x80, //# $ ### ### $ # +0x80, 0x00, 0x88, 0x08, 0x08, 0x08, 0x80, 0x00, 0x80, //# ## # # ## # +0x88, 0x88, 0x80, 0x08, 0x28, 0x00, 0x88, 0x88, 0x80, //##### #@# ##### +0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, // # # +0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x00, 0x00, 0x00, // ## ## +0x88, 0x88, 0x88, 0x81, 0x01, 0x88, 0x88, 0x88, 0x80, //#######. .####### +0x81, 0x11, 0x11, 0x10, 0x10, 0x11, 0x11, 0x11, 0x80, //#...... . ......# +0x81, 0x11, 0x11, 0x11, 0x10, 0x11, 0x11, 0x11, 0x80, //#........ ......# +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //################# +//Level: 375 +0x15, 0x11,//Size x and y +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, //##################### +0x81, 0x00, 0x81, 0x00, 0x81, 0x41, 0x80, 0x01, 0x80, 0x01, 0x80, //#. #. #.$.# .# .# +0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, //# # # # # # # +0x80, 0x01, 0x80, 0x00, 0x10, 0x40, 0x10, 0x00, 0x81, 0x00, 0x80, //# .# . $ . #. # +0x80, 0x80, 0x01, 0x84, 0x40, 0x80, 0x44, 0x81, 0x00, 0x80, 0x80, //# # .#$$ # $$#. # # +0x80, 0x01, 0x80, 0x00, 0x80, 0x40, 0x80, 0x00, 0x81, 0x00, 0x80, //# .# # $ # #. # +0x80, 0x80, 0x00, 0x84, 0x40, 0x80, 0x44, 0x80, 0x00, 0x80, 0x80, //# # #$$ # $$# # # +0x80, 0x01, 0x80, 0x00, 0x80, 0x40, 0x80, 0x00, 0x81, 0x00, 0x80, //# .# # $ # #. # +0x82, 0x80, 0x00, 0x84, 0x44, 0x54, 0x44, 0x80, 0x00, 0x80, 0x80, //#@# #$$$*$$$# # # +0x80, 0x01, 0x10, 0x00, 0x80, 0x40, 0x80, 0x00, 0x11, 0x00, 0x80, //# .. # $ # .. # +0x80, 0x80, 0x00, 0x84, 0x40, 0x80, 0x44, 0x80, 0x00, 0x80, 0x80, //# # #$$ # $$# # # +0x80, 0x01, 0x80, 0x00, 0x80, 0x40, 0x80, 0x00, 0x81, 0x00, 0x80, //# .# # $ # #. # +0x80, 0x80, 0x01, 0x84, 0x40, 0x80, 0x44, 0x81, 0x00, 0x80, 0x80, //# # .#$$ # $$#. # # +0x80, 0x01, 0x80, 0x00, 0x80, 0x40, 0x80, 0x00, 0x81, 0x00, 0x80, //# .# # $ # #. # +0x80, 0x80, 0x00, 0x84, 0x00, 0x80, 0x04, 0x80, 0x00, 0x80, 0x80, //# # #$ # $# # # +0x81, 0x00, 0x81, 0x00, 0x81, 0x41, 0x80, 0x01, 0x80, 0x01, 0x80, //#. #. #.$.# .# .# +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80 //##################### +}; +#else +#define SOKOBAN_LEVELS 1 +const unsigned char Sokoban_Levels[] = { +//Level: 1 +0x13, 0x0B,//Size x and y +0x00, 0x00, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // ##### +0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // # # +0x00, 0x00, 0x84, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // #$ # +0x00, 0x88, 0x80, 0x04, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, // ### $## +0x00, 0x80, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, // # $ $ # +0x88, 0x80, 0x80, 0x88, 0x08, 0x00, 0x08, 0x88, 0x88, 0x80, //### # ## # ###### +0x80, 0x00, 0x80, 0x88, 0x08, 0x88, 0x88, 0x00, 0x11, 0x80, //# # ## ##### ..# +0x80, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x80, //# $ $ ..# +0x88, 0x88, 0x80, 0x88, 0x80, 0x82, 0x88, 0x00, 0x11, 0x80, //##### ### #@## ..# +0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x80, // # ######### +0x00, 0x00, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, // ####### +}; +#endif +#endif diff --git a/boop/trunk/games/tic_tac_toe.c b/boop/trunk/games/tic_tac_toe.c new file mode 100644 index 0000000..8d617ac --- /dev/null +++ b/boop/trunk/games/tic_tac_toe.c @@ -0,0 +1,375 @@ +/* + tic_tac_toe.c - game + Copyright (C) 2007 Colibri + + 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 3 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 "lcd.h" +#include "fonty.h" +#include "keyboard.h" +#include "tic_tac_toe.h" + +void GameTicTacToe(void) +{ + BYTE Color; + BYTE Mode; + int i; + int k; + BOOL ComputerWon; + BOOL PlayerWon; + BYTE G[2][9];//GameArray [0=Computer / 1=Player][Game fields] + BOOL GameIsRunning = false; + BYTE Moves = 0; + int Pos; + + Color = LCD_COLOR_B; + Mode = DRAW_PUT; + +again: + //New game + //Init the display + lcd_fill(0);//Clr screen + + //Title + set_font(SMALLFONT); + draw_string(0, 0, "TicTacToe", Color, Mode); + + //Grid + draw_block(16, 16+30, 96, 3, Color, Mode); + draw_block(16, 16+30+3+30, 96, 3, Color, Mode); + draw_block(16+30, 16, 3, 96, Color, Mode); + draw_block(16+30+3+30, 16, 3, 96, Color, Mode); + + //Reset game field + for(k=0; k<2; k++) + { + for(i=0; i<9; i++) + { + G[k][i] = 0; + } + } + + Moves = 0; + + GameIsRunning = true; + + while(1) + { + Pos = -1; + if(KEY_1){Pos = 0;} + if(KEY_2){Pos = 1;} + if(KEY_3){Pos = 2;} + if(KEY_4){Pos = 3;} + if(KEY_5){Pos = 4;} + if(KEY_6){Pos = 5;} + if(KEY_7){Pos = 6;} + if(KEY_8){Pos = 7;} + if(KEY_9){Pos = 8;} + + if((Pos >= 0) && (Pos <= 8)) + { + if(GameIsRunning) + { + if((G[0][Pos] + G[1][Pos]) == 0) + { + //field is empty + G[1][Pos] = 1; + Moves++; + + if(Moves < 9) + { + //Moves left + if(!GameTicTacToe_IsSolved(G, &ComputerWon, &PlayerWon)) + { + //Not solved -> computer move + GameTicTacToe_ComputerMove(G); + Moves++; + } + } + GameTicTacToe_DrawGameField(G); + } + } + } + + //Is solved? + GameTicTacToe_IsSolved(G, &ComputerWon, &PlayerWon); + if(ComputerWon) + { + draw_string(0, LCD_SIZE_Y - (8*4), "Computer hat gewonnen", Color, Mode); + GameIsRunning = false; + } + else + { + if(PlayerWon) + { + draw_string(0, LCD_SIZE_Y - (8*4), "Spieler hat gewonnen", Color, Mode); + GameIsRunning = false; + } + else + { + if(Moves == 9) + { + draw_string(0, LCD_SIZE_Y - (8*4), "Unentschieden", Color, Mode); + GameIsRunning = false; + } + } + } + + //Footer + if(Moves > 0) + { + draw_string(0, LCD_SIZE_Y - (8*3), "0", Color, Mode); + draw_string(32, LCD_SIZE_Y - (8*3), "Neues Spiel", Color, Mode); + draw_string(0, LCD_SIZE_Y - (8*2), "Exit", Color, Mode); + draw_string(32, LCD_SIZE_Y - (8*2), "Spiel beenden", Color, Mode); + } + else + { + draw_block(0, LCD_SIZE_Y - (8*2), LCD_SIZE_X, 8, Color, DRAW_ERASE); + } + + if(GameIsRunning) + { + draw_string(0, LCD_SIZE_Y - 8, "1-9", Color, Mode); + draw_string(32, LCD_SIZE_Y - 8, "Feld waehlen", Color, Mode); + } + else + { + draw_block(0, LCD_SIZE_Y - 8, LCD_SIZE_X, 8, Color, DRAW_ERASE); + } + waitKeyUpDown(); + if(KEY_0) goto again; + if(KEY_Exit) return; + } +} + +void GameTicTacToe_ComputerMove(BYTE G[2][9]) +{ + int Pos; + BYTE TempG[2][9]; + BOOL ComputerWon; + BOOL PlayerWon; + + for(Pos=0; Pos<9; Pos++) + { + TempG[0][Pos] = G[0][Pos]; + TempG[1][Pos] = G[1][Pos]; + } + + //1: Check if the computer can win the game with the next move + for(Pos=0; Pos<9; Pos++) + { + if((G[0][Pos] + G[1][Pos]) == 0) + { + //Free pos + TempG[0][Pos] = 1;//Try this move + GameTicTacToe_IsSolved(TempG, &ComputerWon, &PlayerWon); + if(ComputerWon) + { + G[0][Pos] = 1;//Do the move + return; + } + TempG[0][Pos] = 0;//Undo the try + } + } + + //2: Check if the computer can prohibit the player to win the game with the next move + for(Pos=0; Pos<9; Pos++) + { + if((G[0][Pos] + G[1][Pos]) == 0) + { + //Free pos + TempG[1][Pos] = 1;//Try this move + GameTicTacToe_IsSolved(TempG, &ComputerWon, &PlayerWon); + if(PlayerWon) + { + G[0][Pos] = 1;//Do the move + return; + } + TempG[1][Pos] = 0;//Undo the try + } + } + + //The following strategy is not implemented to allow the player to win: + //3: Fork: threaten a win with two possible completions in two ways + //4: Block Fork 1: if there is a configuration where the opponent can fork, create two in a row to force a block + //5: Block Fork 2: if there is a configuration where the opponent can fork, block that fork + + //6: Try to play the centre + if((G[0][4] + G[1][4]) == 0) + { + G[0][4] = 1; + return; + } + + //7: If the Player is in a corner then try to play the opposite corner + if(((G[0][0] + G[1][0]) == 0) && (G[1][8])) + { + //Corner 0 is free and player is in corner 8 + G[0][0] = 1; + return; + } + if(((G[0][2] + G[1][2]) == 0) && (G[1][6])) + { + //Corner 2 is free and player is in corner 6 + G[0][2] = 1; + return; + } + if(((G[0][6] + G[1][6]) == 0) && (G[1][2])) + { + //Corner 6 is free and player is in corner 2 + G[0][6] = 1; + return; + } + if(((G[0][8] + G[1][8]) == 0) && (G[1][0])) + { + //Corner 8 is free and player is in corner 0 + G[0][8] = 1; + return; + } + + //8: Try to play an free corner + Pos = 0; + if((G[0][Pos] + G[1][Pos]) == 0) + { + G[0][Pos] = 1; + return; + } + Pos = 2; + if((G[0][Pos] + G[1][Pos]) == 0) + { + G[0][Pos] = 1; + return; + } + Pos = 6; + if((G[0][Pos] + G[1][Pos]) == 0) + { + G[0][Pos] = 1; + return; + } + Pos = 8; + if((G[0][Pos] + G[1][Pos]) == 0) + { + G[0][Pos] = 1; + return; + } + + //9: Play on a free pos + for(Pos=0; Pos<9; Pos++) + { + if((G[0][Pos] + G[1][Pos]) == 0) + { + //Free pos + G[0][Pos] = 1;//Do the move + return; + } + } +} + +BOOL GameTicTacToe_IsSolved(BYTE G[2][9], BOOL *pComputerWon, BOOL *pPlayerWon) +{ + //Return true=GameIsSolved + int k; + BYTE Result[2]; + + *pComputerWon = false; + *pPlayerWon = false; + + //Is solved? + Result[0] = 0; + Result[1] = 0; + for(k=0; k<2; k++) + { + Result[k] |= 1 << (G[k][0] + G[k][1] + G[k][2]);//Row 1 + Result[k] |= 1 << (G[k][3] + G[k][4] + G[k][5]);//Row 2 + Result[k] |= 1 << (G[k][6] + G[k][7] + G[k][8]);//Row 3 + + Result[k] |= 1 << (G[k][0] + G[k][3] + G[k][6]);//Column 1 + Result[k] |= 1 << (G[k][1] + G[k][4] + G[k][7]);//Column 2 + Result[k] |= 1 << (G[k][2] + G[k][5] + G[k][8]);//Column 3 + + Result[k] |= 1 << (G[k][0] + G[k][4] + G[k][8]);//Diagonal + Result[k] |= 1 << (G[k][2] + G[k][4] + G[k][6]);//Diagonal + } + + if(Result[0] & (1 << 3)) + { + *pComputerWon = true; + return true;//Solved + } + if(Result[1] & (1 << 3)) + { + *pPlayerWon = true; + return true;//Solved + } + + return false;//Not solved +} + +void GameTicTacToe_DrawGameField(BYTE G[2][9]) +{ + int Pos; + int x; + int y; + BYTE Color; + BYTE Mode; + + Color = LCD_COLOR_B; + Mode = DRAW_PUT; + + for(Pos=0; Pos<9; Pos++) + { + +// x = Pos % 3; +// y = Pos / 3; + y = 0; + x = Pos; + while(x >= 3) + { + x -= 3; + y++; + } + + if(G[0][Pos]) + { + //Computer (O) + draw_disc(16+14 + (x*33), 16+14 + (y*33), 11, Color, Mode); + draw_disc(16+14 + (x*33), 16+14 + (y*33), 8, Color, DRAW_XOR); + + } + else + { + if(G[1][Pos]) + { + //Player (X) +draw_line(16+3 + (x*33), 16+3 + (y*33)+2, 16+3 + (x*33) + 23-2, 16+3 + (y*33) + 23, Color, Mode); +draw_line(16+3 + (x*33), 16+3 + (y*33)+1, 16+3 + (x*33) + 23-1, 16+3 + (y*33) + 23, Color, Mode); +draw_line(16+3 + (x*33), 16+3 + (y*33), 16+3 + (x*33) + 23, 16+3 + (y*33) + 23, Color, Mode); +draw_line(16+3 + (x*33)+1, 16+3 + (y*33), 16+3 + (x*33) + 23, 16+3 + (y*33) + 23-1, Color, Mode); +draw_line(16+3 + (x*33)+2, 16+3 + (y*33), 16+3 + (x*33) + 23, 16+3 + (y*33) + 23-2, Color, Mode); + + +draw_line(16+3-1+(x*33)+2, 16+3+(y*33)+23+1, 16+3+(x*33)+23, 16+3 + (y*33)+2, Color, Mode); +draw_line(16+3-1+(x*33)+1, 16+3+(y*33)+23+1, 16+3+(x*33)+23, 16+3 + (y*33)+1, Color, Mode); +draw_line(16+3-1+(x*33), 16+3+(y*33)+23+1, 16+3+(x*33)+23, 16+3 + (y*33), Color, Mode); +draw_line(16+3-1+(x*33), 16+3+(y*33)+23+1-1, 16+3+(x*33)+23-1, 16+3 + (y*33), Color, Mode); +draw_line(16+3-1+(x*33), 16+3+(y*33)+23+1-2, 16+3+(x*33)+23-2, 16+3 + (y*33), Color, Mode); + + } + } + } +} + + diff --git a/boop/trunk/games/tic_tac_toe.h b/boop/trunk/games/tic_tac_toe.h new file mode 100644 index 0000000..1d57f18 --- /dev/null +++ b/boop/trunk/games/tic_tac_toe.h @@ -0,0 +1,29 @@ +/* + tic_tac_toe.h - game + Copyright (C) 2007 Colibri + + 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 3 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 TIC_TAC_TOE_H +#define TIC_TAC_TOE_H + +#include "../global.h" + +void GameTicTacToe(void); +void GameTicTacToe_DrawGameField(BYTE G[2][9]); +void GameTicTacToe_ComputerMove(BYTE G[2][9]); +BOOL GameTicTacToe_IsSolved(BYTE G[2][9], BOOL *pComputerWon, BOOL *pPlayerWon); + +#endif diff --git a/boop/trunk/global.c b/boop/trunk/global.c new file mode 100644 index 0000000..7b218db --- /dev/null +++ b/boop/trunk/global.c @@ -0,0 +1,131 @@ +/* + global.c + Copyright (C) 2007 Colibri + + 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 3 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 "lpc2220.h" +#include "rf.h" +#include "global.h" + +#define debugbuffersize 50 +unsigned char debugoutbuf [debugbuffersize]; + +void *memcpy(void *dest,void *src,int count) +{ + char *tmp = (char *) dest, *s = (char *) src; + + while (count--) + *tmp++ = *s++; + + return dest; +} + +int memcmp(const void * cs,const void * ct,int count) +{ + const unsigned char *su1, *su2; + signed char res = 0; + + for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) + if ((res = *su1 - *su2) != 0) + break; + return res; +} + +unsigned char GetHWversion (void) +{ + if(((IOPIN2 >> 28) & 3) == 3) + return(((((IOPIN0 >> 5) & 1) << 4) | (((IOPIN2 >> 30) & 1) << 3) | (((IOPIN2 >> 16) & 1) << 2) | 3)); + return(((IOPIN2 >> 27) & 2) + ((IOPIN2 >> 29) & 1) + (((IOPIN1 >> 23) & 7) << 2)); +} + +int puts (const char* string) +{ + struct RFendpoint_* cur_ep; + volatile unsigned char i; + + cur_ep = openEP(debugoutbuf,0, packet_test); + + if (cur_ep) + { + for (i=0; (ibuffer[i] = string[i]; + } + + cur_ep->buffer[i] = 0; + cur_ep->bufferlen = i+1; + cur_ep->flags |= EPenabled | EPoutput | EPnewdata; + + + RF_changestate(RFtx); + // wait until all date are sent + while(cur_ep->flags & EPnewdata); + closeEP(cur_ep); + } + return 1; +} + +/* + * The width of the CRC calculation and result. + * Modify the typedef for a 16 or 32-bit CRC standard. + */ + +#define CRC_POLYNOMIAL 0x8005 +#define CRC_WIDTH (8 * sizeof(crc)) +#define CRC_TOPBIT (1 << (CRC_WIDTH - 1)) + +crc CRCs(char* message) +{ + crc remainder = 0; + int byte; + unsigned char bit; + + /* + * Perform modulo-2 division, a byte at a time. + */ + for (byte = 0; message[byte]; ++byte) + { + /* + * Bring the next byte into the remainder. + */ + remainder ^= (message[byte] << (CRC_WIDTH - 8)); + + /* + * Perform modulo-2 division, a bit at a time. + */ + for (bit = 8; bit > 0; --bit) + { + /* + * Try to divide the current data bit. + */ + if (remainder & CRC_TOPBIT) + { + remainder = (remainder << 1) ^ CRC_POLYNOMIAL; + } + else + { + remainder = (remainder << 1); + } + } + } + + /* + * The final remainder is the CRC result. + */ + return (remainder); + +} /* crcSlow() */ + diff --git a/boop/trunk/global.h b/boop/trunk/global.h new file mode 100644 index 0000000..665747c --- /dev/null +++ b/boop/trunk/global.h @@ -0,0 +1,94 @@ +/* + global.h + Copyright (C) 2007 Colibri + + 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 3 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 GLOBAL_H +#define GLOBAL_H + +//Uncomment if you want compile with demo sound +//#define WITH_SOUND + +// Set appropriate feature flags +#define FF_UART_REDIRECT 1 +#define FF_LARGE_IDLE_CLOCK 0 +#define FF_LARGE_MENU 1 +#define FF_ICON_TRANSPARENT 1 // enable 3 BitPerPixel icons support + +typedef unsigned char BOOL; +typedef unsigned char BYTE; +typedef unsigned short WORD; +typedef unsigned long DWORD; + +#define false 0 +#define true 1 + +#ifndef NULL +#define NULL 0 +#endif + +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#define min(a,b) (((a) < (b)) ? (a) : (b)) + +#ifndef _BV +#define _BV(bit) (1 << (bit)) +#endif + +#define NUM_OF_ELEMENTS(x) sizeof(x)/sizeof(x[0]) + +#define SPEED_30 0 +#define SPEED_60 1 + +// Execute code in locked sequence +#define INT_LOCK(x) {unsigned cpsr = disableIRQ (); {x;} restoreIRQ (cpsr);} + +/** Let the LPC2200 sleep until the next IRQ +* +* This function tries to enter the sleep mode and stays +* there until the next interrupt wakes up the CPU. +* If that is not possible, the function returns immediately. +*/ +extern void cpu_idle (void); + +#define SYS_NOIDLE 0x08 // No Idle Mode +#define SYS_NOPDOWN 0x10 // No Power Down +#define SYS_IR 0x20 +#define SYS_KEY 0x40 +#define SYS_TURBO 0x80 + +#include +#define printd(...) printf(__VA_ARGS__) +#define debugbuffersize 50 +extern unsigned char debugoutbuf [debugbuffersize]; + +#ifndef __MAIN_C__ +extern char sysInfo; +#endif /* __MAIN_C__ */ + +extern unsigned char debugoutbuf []; + +#define PCON_IDLE 0x01 +#define PCON_PDOWN 0x02 + +typedef unsigned short crc; + +void *memcpy(void *dest,void *src,int count); +int memcmp(const void * cs,const void * ct,int count); +unsigned char GetHWversion(void); +int puts(const char* string); +crc CRCs(char* message); + +#endif diff --git a/boop/trunk/gui/Cross_2bpp.bmp b/boop/trunk/gui/Cross_2bpp.bmp new file mode 100644 index 0000000000000000000000000000000000000000..96e496c8302d7b625942fbe6509572c5a18e1b28 GIT binary patch literal 2406 zcma)&u~9@Z3`CERgqVN=2#F|woRAhM?$<$I$FrBy?MSlup83A@YV|DN$LIIsWv+Mj zSH73O@8R-1{Wt1APx_|8c0IQgKbKvmj^p^6>vsA5S3ZGdb1Ber@BdE`E`V$}5FNuH zLerCCnPO)j%IqN%Q`JpgfwO~%ndePk?x9P`}U~TcJeYK<07ic zwEqnGRMo@lAEG2a9QF{j`=!!U@!9=Y2Oxu~HHZ_gW5wb-6U|CjlX1vIj)ApQN-fTD z9Wl%sVEiT~P8}mS5{aM|akMLzoN<}0K!vd4kobvEo!TNAj|~wIm+39yyF-`f6Q^a; z4ksXqsnUi?04(h_vtrgENn(N$M9erkSuyfdSrQdU3sq<8iZ)3&ssvaZ{nF62Du+EX zNq}0>NVe^ooYJasBKrv`i3uc4vd6BN8=&~{1Vp;AWp47`9@COXgHkmyQ_Kmi_PkHh aYQim~H5rUNtD@w`6WaDOrpRZKWPSno`4`Io literal 0 HcmV?d00001 diff --git a/boop/trunk/gui/Cross_t_3bpp_t.bmp b/boop/trunk/gui/Cross_t_3bpp_t.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7a8bffe072be5fec04f0193c5346d0346a7a4143 GIT binary patch literal 2406 zcmb7=u~oz{5JXK#LQFsbghUiTPDl$B=Q`-?_-J5m-ma`OdS~BgcJ^!KxA)KcZLC+` z&pc1R&)xPo{1@t94|;~d>#|+W{1iWvTx9lr{}}7<@aw;P0*m%iB7E(?rOuFCz&vjF0v_?mc447n%0VXK4ytFc-bPMLEmc>D^uJ?c`-TlfqSH zjxJKF`jY*FKqiR~hqnc09x6>$;oSBC$Y5#>D_9oYanC ziZ*3p_A$(nC1~n~BTtnj(Sfv3O{R{RCJDPrfW$bE;Z04NsK6+zD z!8`bUP#1v1d+(gH)}BCdgTtaRTrlJ$Rf7#06b~Y;L=dKEqIK68B#5xY5y#gEu5n$b pQjvutFDv>bMGF4)%Lm=QFDFtQ=gRtSmyAdSFaMz%ruXOnJpf%w4HEzW literal 0 HcmV?d00001 diff --git a/boop/trunk/gui/FR_2bpp.bmp b/boop/trunk/gui/FR_2bpp.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d088a4784cf2b65fe0c8a2aabf943f6da76d6ce0 GIT binary patch literal 574 zcmaKoF%m){5JT}-Hd_B9cmhicdrL0KIsU!yLDpr3na>PtHpvEt_vf{xzMh;9_RaPs z?VZ1(A9w9eaMW5$DLLmK@mJwd@gxcgJTpJec8gQWRvWQBB?=mo$s>l( z1*nJ>F?@!WGW%ji#IujyYcZeLL3+IPgbVFVNJxw1D@YzYQP% ze*OBD$h!>x>^U3r&xd&MgESvJA3rN!0sP>W-mP5yYeS@Y1&;4#%fsfyZC1D3$1g+t zI)J;hGq~u$;0d_OC*aS~)?+R9aHh+Ft+!}i;V8RQ4)N6A>fxxOudmZ}fMEWo8OPQK zN!wFgm|KdjSNV@B=oRuUWJnq{{R+r7<~K)IA_pUPcCFlv<8{lHezy43v zw>wK{UYk4z)W)r)n+{2DsyBoeInt+=`l(OA6a;s6dx-yyZ+S$YZm%|@l-kVI#Agxm z3509&L|EhT)2o}Xl$AmWj{DPu_#AWUYUb8UWtNI&Qs3@E$u%2Q`h81mMw;}&#;T;l+3I`Kd%`^Z6ACqjXEDhf6#OW2Jc)i^jLF8e!H-(yc<%!$2MdP?>_MeDEe5FVp z8%!>}H9=*$pSyy_nWr2zezh*++*X$qvHvz|i`k72{1@M{6;#3OGx;#{X#5nzDXL!q zeSR`foeSq&YE}Gz{#GrCn#->MBA_v{)u z_d1;m)hbG?DUXjVx;;o|>cKeqA_Lm=l^)bjAi(a1!PDYLCAt}XAshiU=*Spku9)K| z$SKm9aTVWYdKar7_FPUU2-fakg1bJD3pKqBj=pkk14JMQ&=sKTjDr)l*P>RdAjxho zgI96YJS3vJYUv)k^argr&eH=awUev`)*svA z+pQ`Z)3g<^RbtM6)M#cr`}!>LPS=2_h?f_AQPH1CY4`nyxS^`HL9ML!8G7uM||z-6rAhsV;@_KJa9m zsM}26!>9A^L=!>ErCrn5<_ma=L93p9uBb~GbZfbaXy-HH_QP!QB}WhTx1#w(S8*9X!caTL;Ke ztIkpzs1b5WTLGVkBqCr3l9RVvoxo|Xh*+%wbxb13X`~j9D5LL*y4AOWTc=SoCG#U?rr5}-02QF0`R0(wk_u03Am8@aVJ-S z5)bK0rK?n9k<5|jTvh(nNSzT)1f?u|RpeL#MVm3NIxoWE-O`4<^?-`V92HfoCd`4H z7d$6&RMv|BE$e*D6x|BD|FKI386?QXDng46#+ z|MBxC|9O;r0_86D@XqP${+~}U{r%`;zV-XBzXCiW!Ra>MHWAZU6aJHR{uNsPZ1l%R zU+?89Zrl6>=bxa7x6n6?bwhpoD~Xpt&jyc*M>4)TB>MmW literal 0 HcmV?d00001 diff --git a/boop/trunk/gui/Play_2bpp.bmp b/boop/trunk/gui/Play_2bpp.bmp new file mode 100644 index 0000000000000000000000000000000000000000..04a5dd2813086ce97a89c9fff3f18035fe16d134 GIT binary patch literal 574 zcmb`EI}*Y$3`7l88mKt}C!kD0pVF7~IdU)atQDXzvD2U#S@G`kPkAo$Iaxdy@8rev zly0U^`0G_^0z<8}l#+9P3!93L3zH}~%$e*4Zet(@kX8b;Q{pyS9TmPCL_}4J?)1?m t?r<0p9dUU7+bvoVBmpWFP?t|3e+-g!U+kcibEBE$F&NdI2|eLfrrW literal 0 HcmV?d00001 diff --git a/boop/trunk/gui/Stop_2bpp.bmp b/boop/trunk/gui/Stop_2bpp.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8661f98cda0ecbc2633d0fb57e4a94364b074e7c GIT binary patch literal 574 zcmchUyAgmO42IFlMr%iK0!s^fOO|8~_rfm(IL-O!%v}=yM-;=lEv-v2Qzx>|*|;(B z9r`|KCV~=U3?X>$3vuc2sCXO=1q`?iRPo?=G3g`*`O58U&ZL-#N-3<>@)j4P4& literal 0 HcmV?d00001 diff --git a/boop/trunk/gui/controls.c b/boop/trunk/gui/controls.c new file mode 100644 index 0000000..539d859 --- /dev/null +++ b/boop/trunk/gui/controls.c @@ -0,0 +1,1017 @@ +/* + controls.c - GUI controls + Copyright (C) 2008 + + 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 3 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 "rtc.h" +#include "controls.h" +#include "lcd.h" +#include "fonty.h" +#include "global.h" +#include "lpc2220.h" +#include "keyboard.h" +#include "backlight.h" +#include "timerfuncs.h" + +#define Cursor_timeout 150 + +FORM* currentform = 0; + +const char string_yes[] = "JA"; +const char string_no[] = "NEIN"; +const char string_ok[] = "OK"; + +const char TXTKey1[] = ".,-+_1@*;:'&"; +const char TXTKey2[] = "abc2ABC"; +const char TXTKey3[] = "def3DEF"; +const char TXTKey4[] = "ghi4GHI"; +const char TXTKey5[] = "jkl5JKL"; +const char TXTKey6[] = "mno6MNO"; +const char TXTKey7[] = "pqrs7PQRS"; +const char TXTKey8[] = "tuv8TUV"; +const char TXTKey9[] = "wxyz9WXYZ"; +const char TXTKey0[] = " 0"; + +const char* const TXTKeys[10] = {TXTKey1,TXTKey2,TXTKey3,TXTKey4,TXTKey5,TXTKey6,TXTKey7,TXTKey8,TXTKey9,TXTKey0}; + +unsigned char msgbox (unsigned char y,unsigned short flags, char *st) +{ + unsigned short textwidth; + unsigned short textheight; + unsigned char width; + unsigned char height; + unsigned char left; + unsigned char x; + unsigned char sel; + + struct bt_ + { + unsigned char cnt; + unsigned char left[3]; + unsigned char top; + unsigned char ret[3]; + char* text[3]; + unsigned char textHeight; + } button; + + textwidth = get_stringwidth(st); + textheight = get_stringheight(st); + + if(textwidth > 120) + width = 124; + else if(textwidth < 54) + width = 60; + else + width = (textwidth | 0x01) + 6; + + button.textHeight = get_stringheight (string_yes); + if ((flags & 0x03) == BC_YesNo) + { + button.cnt = 2; + button.left[0] = 38; + button.ret[0]=BC_Yes; + button.text[0] = (char*)string_yes; + button.left[1] = 65; + button.ret[1]=BC_No; + button.text[1] = (char*)string_no; + button.top = y + textheight +5; + } + else if ((flags & 0x03) == BC_nobuttons) + { + button.cnt = 0; + button.top = 0; + } + else + { + button.cnt = 1; + button.left[0] = 51; + button.ret[0]=BC_OK; + button.text[0] = (char*)string_ok; + button.top = y + textheight +5; + + } + + if(button.cnt) + height = textheight + button.textHeight + 12; + else + height = textheight + 6; + + left = (128-width)>>1; + + draw_block (left,y,width,height, LCD_COLOR_B, DRAW_ERASE); + draw_rect (left,y,width,height,1, LCD_COLOR_B, DRAW_PUT); + draw_rect (left+1,y+1,width-2,height-2,1, LCD_COLOR_DG, DRAW_PUT); + draw_string (left+3,y+3,st, LCD_COLOR_B, DRAW_PUT); + + for (x=0;x>1), button.top+2, + button.text[x], LCD_COLOR_B, DRAW_PUT); + } + + sel = 0; + if ((flags & 0x0C) == BC_DefaultButton2) + { + if(button.cnt>1) + sel=1; + } + else if ((flags & 0x0C) == BC_DefaultButton3) + { + if(button.cnt>2) + sel=2; + } + + setBacklight(BL_AUTO); + while(KEY_OK) {}; + while(!KEY_OK && button.cnt) + { + draw_block (button.left[sel]+1, button.top+1, 23, button.textHeight, LCD_COLOR_B, DRAW_XOR); + waitKeyUpDown(); + draw_block (button.left[sel]+1, button.top+1, 23, button.textHeight, LCD_COLOR_B, DRAW_XOR); + if(KEY_Left) + { + if(sel>0) + sel--; + } + if(KEY_Right) + { + if(selfont); + if(label->type & BC_Disabled) + c=2; + else + c=3; + + if(sel) { + draw_block (label->left,label->top,label->width,label->height, LCD_COLOR_B, DRAW_PUT); + m=DRAW_ERASE; + } + else + m=DRAW_PUT; + draw_string(label->left+1,label->top+1,label->caption, c, m); + +} + +void button_draw (BUTTON* button, unsigned char sel) +{ + unsigned char c; + unsigned char cleft; + unsigned char ctop; + + set_font (button->font); + if(button->type & BC_Disabled) + c=2; + else + c=3; + + draw_block(button->left,button->top,button->width,button->height,3,DRAW_ERASE); + draw_rect(button->left,button->top,button->width,button->height,1,c,DRAW_PUT); + draw_rect(button->left+1,button->top+1,button->width-2,button->height-2,1,c-1,DRAW_PUT); + + cleft = ((button->width - get_stringwidth(button->caption))>>1) +button->left; + ctop = ((button->height - get_stringheight(button->caption)+1)>>1) +button->top; + + if (sel == 2) + { + draw_block (button->left+2,button->top+2,button->width-4,button->height-4, LCD_COLOR_B, DRAW_PUT); + draw_string(cleft,ctop,button->caption, c, DRAW_ERASE); + } + else if (sel) + { + draw_block(button->left+2,button->top+2,button->width-4,button->height-4,1,DRAW_PUT); + draw_string(cleft,ctop,button->caption, c, DRAW_PUT); + } + else + draw_string(cleft,ctop,button->caption, c, DRAW_PUT); +} // button_draw + +void numbox_draw(NUMBOX* numbox, unsigned char sel) { + + unsigned char c; + unsigned char m; + + set_font (numbox->font); + if(numbox->type & BC_Disabled) + c=2; + else + c=3; + + if(sel) { + draw_block (numbox->left,numbox->top,numbox->width,numbox->height, LCD_COLOR_B, DRAW_PUT); + m=DRAW_ERASE; + } + else + m=DRAW_PUT; + draw_numU(numbox->left+1,numbox->top+1,numbox->value, 0, c, m); + + +} + +void txtbox_draw(TXTBOX* txtbox, unsigned char sel) { + + unsigned char c; + unsigned char m; + + set_font (txtbox->font); + if(txtbox->type & BC_Disabled) + c=2; + else + c=3; + + if(sel) { + draw_block (txtbox->left,txtbox->top,txtbox->width,txtbox->height, LCD_COLOR_B, DRAW_PUT); + m=DRAW_ERASE; + } + else + m=DRAW_PUT; + draw_string(txtbox->left+1,txtbox->top+1,txtbox->text, c, m); + +} + +void datebox_draw(DATEBOX* datebox, unsigned char sel) { + + unsigned char c; + unsigned char m; + unsigned char w1,w2; + + set_font (datebox->font); + if(datebox->type & BC_Disabled) + c=2; + else + c=3; + + if(sel) { + draw_block (datebox->left,datebox->top,datebox->width,datebox->height, LCD_COLOR_B, DRAW_PUT); + m=DRAW_ERASE; + } + else + m=DRAW_PUT; + + w1 = get_stringwidth("0")+1; + w2 = get_stringwidth(".")+1; + + draw_char(1+datebox->left ,datebox->top+1,days[datebox->date.weekday * 2], c, m); + draw_char(1+datebox->left+1*w1 ,datebox->top+1,days[(datebox->date.weekday * 2) + 1], c, m); + draw_hexC(1+datebox->left+2*w1+1*w2,datebox->top+1,datebox->date.day, c, m); + draw_char(1+datebox->left+4*w1+1*w2,datebox->top+1,'.', c, m); + draw_hexC(1+datebox->left+4*w1+2*w2,datebox->top+1,datebox->date.month, c, m); + draw_char(1+datebox->left+6*w1+2*w2,datebox->top+1,'.', c, m); + draw_hexC(1+datebox->left+6*w1+3*w2,datebox->top+1,datebox->date.year, c, m); + +} + +void timebox_draw(TIMEBOX* timebox, unsigned char sel) { + + unsigned char c; + unsigned char m; + unsigned char w1,w2; + + set_font (timebox->font); + if(timebox->type & BC_Disabled) + c=2; + else + c=3; + + if(sel) { + draw_block (timebox->left,timebox->top,timebox->width,timebox->height, LCD_COLOR_B, DRAW_PUT); + m=DRAW_ERASE; + } + else + m=DRAW_PUT; + + w1 = get_stringwidth("0")+1; + w2 = get_stringwidth(":")+1; + + draw_hexC(1+timebox->left ,timebox->top+1,timebox->time.hour, c, m); + draw_char(1+timebox->left+2*w1 ,timebox->top+1,':', c, m); + draw_hexC(1+timebox->left+2*w1+1*w2,timebox->top+1,timebox->time.minute, c, m); + draw_char(1+timebox->left+4*w1+1*w2,timebox->top+1,':', c, m); + draw_hexC(1+timebox->left+4*w1+2*w2,timebox->top+1,timebox->time.second, c, m); + +} + +void listbox_draw (LISTBOX* listbox, unsigned char sel) +{ + unsigned char c; + unsigned char m; + unsigned char arrow = (listbox->height - 6) / 2 + 1; + + set_font (listbox->font); + if(listbox->type & BC_Disabled) + c=2; + else + c=3; + + if (sel) + { + draw_block (listbox->left,listbox->top,listbox->width,listbox->height, + LCD_COLOR_B, DRAW_PUT); + m=DRAW_ERASE; + } + else + m=DRAW_PUT; + + if(listbox->listindex < listbox->listcount) + draw_string(listbox->left+1,listbox->top+1,listbox->list[listbox->listindex], c, m); + if (sel) + { + draw_block (listbox->left + listbox->width-((arrow+1)*2+1),listbox->top, + (arrow+1)*2+1,listbox->height, + LCD_COLOR_B, DRAW_PUT); + draw_arrow (listbox->left + listbox->width-(arrow+1)*2, listbox->top + (listbox->height/2)-arrow, + ARROW_LEFT, arrow, LCD_COLOR_B, DRAW_ERASE); + draw_arrow (listbox->left + listbox->width-arrow-1, listbox->top + (listbox->height/2)-arrow, + ARROW_RIGHT, arrow, LCD_COLOR_B, DRAW_ERASE); + } +} + +void control_draw (CONTROL* control, unsigned char select) +{ + draw_block (control->left,control->top,control->width,control->height,LCD_COLOR_B,DRAW_ERASE); + switch ((control->type) & 0x1F) + { + case BC_Label: + label_draw((LABEL*)control,select); + break; + case BC_Button: + button_draw((BUTTON*)control,select); + break; + case BC_Numbox: + numbox_draw((NUMBOX*)control,select); + break; + case BC_Txtbox: + txtbox_draw((TXTBOX*)control,select); + break; + case BC_Datebox: + datebox_draw((DATEBOX*)control,select); + break; + case BC_Timebox: + timebox_draw((TIMEBOX*)control,select); + break; + case BC_Listbox: + listbox_draw((LISTBOX*)control,select); + break; + } +} // control_draw + +void form_draw (FORM* form) +{ + unsigned char x; + + lcd_fill(0); + set_font(BOLDFONT); + draw_string (0, 0, form->caption, LCD_COLOR_B, DRAW_PUT); + draw_block (0,10,128,2, LCD_COLOR_B, DRAW_PUT); + + if (form->footer) + { + set_font(SMALLFONT); + draw_block (0,149,128,2, LCD_COLOR_B, DRAW_PUT); + draw_string (0,152, form->footer, LCD_COLOR_B, DRAW_PUT); + } + + for (x=0;xcontrolcount;x++) + { + control_draw(form->controls[x],(form->sel == x)); + } +} // form_draw + +unsigned char get_prev_control(FORM* form) { + + signed short x; + unsigned char type; + + for(x=form->sel-1;x>-1;x--) { + type = (form->controls[x])->type; + if(!(type & 0xe0)) + return x; + } + for(x=form->controlcount-1;x>form->sel;x--) { + type = (form->controls[x])->type; + if(!(type & 0xe0)) + return x; + } + return form->sel; +} + +unsigned char get_next_control(FORM* form) { + + unsigned char x; + unsigned char type; + + for(x=form->sel+1;xcontrolcount;x++) { + type = (form->controls[x])->type; + if(!(type & 0xe0)) + return x; + } + for(x=0;xsel;x++) { + type = (form->controls[x])->type; + if(!(type & 0xe0)) + return x; + } + return form->sel; +} + +extern void cpu_idle(); + +void waitFormKeyUp(void) +{ + while((keys[0] != 0) || (keys[1] != 0)) { + if(currentform->flags & BC_Timer_expired) { + currentform->flags &= ~BC_Timer_expired; + if(currentform->timer) + currentform->timer(currentform); + } + if(currentform->flags & BC_Form_redraw) { + form_draw(currentform); + currentform->flags &= ~BC_Form_redraw; + } + } +} + +void waitFormKeyDown(void) +{ + while((keys[0] == 0) && (keys[1] == 0)) { + if(currentform->flags & BC_Timer_expired) { + currentform->flags &= ~BC_Timer_expired; + if(currentform->timer) + currentform->timer(currentform); + } + if(currentform->flags & BC_Form_redraw) { + form_draw(currentform); + currentform->flags &= ~BC_Form_redraw; + } + cpu_idle(); + }; + setBacklight(BL_AUTO); // pwm value +} + +#define waitFormKeyUpDown() { waitFormKeyUp(); waitFormKeyDown(); } + +void numbox_entervalue(NUMBOX* numbox) { + + unsigned char digit[5]; + unsigned char len; + unsigned char maxlen; + unsigned char cpos; + unsigned char width; + unsigned char space; + unsigned char k; + unsigned short value; + unsigned short x; + unsigned char h; + + if((KEY_Left) || (KEY_Right)) { + if((KEY_Left) && (numbox->value > numbox->min)) + numbox->value--; + if((KEY_Right) && (numbox->value < numbox->max)) + numbox->value++; + return; + } + set_font(numbox->font); + width = get_stringwidth("0"); + space = get_stringwidth("00") - 2 * width; + h=get_stringheight("0"); + + cpos = 0; + len = 0; + x=numbox->max; + for(maxlen = 1;x > 9;maxlen++) + x /= 10; + + while(!(KEY_Exit || KEY_OK)) { + k=getKeynum(); + if((k > 15) && (k < 26)) { + digit[cpos] = k-15; + if(digit[cpos] > 9) + digit[cpos] = 0; + if(len < maxlen) + len++; + cpos++; + if(cpos == maxlen) + cpos--; + } + if(KEY_Left) { + if(len) + len--; + cpos = len; + } + draw_block(numbox->left,numbox->top,numbox->width,numbox->height,3,DRAW_ERASE); + for(x=0; xleft+1)+(width+space)*x ,numbox->top+1, digit[x] + 0x30,3, DRAW_PUT); + draw_hline ((numbox->left+1)+ (width+space)*cpos,numbox->top+h,width, LCD_COLOR_B, DRAW_PUT); + waitFormKeyUpDown(); + } + if((KEY_OK) && len) { + x=1; + value = 0; + for(k=len;k;k--) { + value += x*digit[k-1]; + x *=10; + } + if(value > numbox->max) + numbox->value = numbox->max; + else if(value < numbox->min) + numbox->value = numbox->min; + else + numbox->value = value; + } + waitFormKeyUp(); +} + +void txtbox_entervalue(TXTBOX* txtbox) { + + unsigned char k; + unsigned char kpos; + unsigned char kold; + unsigned char cpos; + unsigned char x; + unsigned char y; + unsigned char h; + char buffer[txtbox->maxlen]; + + memcpy(buffer,txtbox->text,txtbox->maxlen); + + if(KEY_Right) { + for(cpos=0;buffer[cpos] !=0;cpos++); + } + else { + cpos = 0; + buffer[cpos] = 0; + } + if(cpos == txtbox->maxlen-1) + cpos--; + kpos = 0; + + h=get_stringheight("0"); + kold = 10; + while(!(KEY_Exit || KEY_OK)) { + k=getKeynum(); + if((k > 15) && (k < 26)) { + k = k-16; + if(k != kold) { + kpos = 0; + if((cpos < txtbox->maxlen-2) && (buffer[cpos])) + cpos++; + } + else { + kpos++; + if(TXTKeys[k][kpos] == 0) + kpos = 0; + } + buffer[cpos] = TXTKeys[k][kpos]; + buffer[cpos+1] = 0; + kold = k; + } + if(KEY_Right) { + if((cpos < txtbox->maxlen-2) && (buffer[cpos])) { + cpos++; + kold = 10; + } + } + if(KEY_Left) { + if((cpos > 0) && (!buffer[cpos])) + cpos--; + buffer[cpos] = 0; + } + draw_block(txtbox->left,txtbox->top,txtbox->width,txtbox->height,3,DRAW_ERASE); + draw_string (txtbox->left+1,txtbox->top+1,buffer, LCD_COLOR_B, DRAW_PUT); + x=get_stringwidth(buffer); + y=get_stringwidth(&buffer[cpos]); + if(!y){ + y=get_stringwidth("A"); + x+=y+1; + } + + draw_block(txtbox->left+x-y,txtbox->top,y+2,h+2,3,DRAW_XOR); + + waitKeyUp(); + if((buffer[cpos]) && (cpos < txtbox->maxlen-2)) { + unsigned short cnt; + cnt = Cursor_timeout; + while(((keys[0] == 0) && (keys[1] == 0)) && --cnt) { + wait5ms(); + } + setBacklight(BL_AUTO); + if(!cnt) { + if((cpos < txtbox->maxlen-2) && (buffer[cpos])) + cpos++; + buffer[cpos] = 0; + kold = 10; + } + } + else + waitFormKeyDown(); + + } + if(KEY_OK) { + memcpy(txtbox->text,buffer,txtbox->maxlen); + } + waitFormKeyUp(); +} + +void datebox_entervalue(DATEBOX* datebox) { + unsigned char cursor; + signed char x; + signed char v; + char cpos[3]; + unsigned char w1, w2; + struct date_ dateold; + unsigned char exit = 0; + + if(KEY_Right) + cursor = 2; + else + cursor = 0; + + dateold = datebox->date; + + w1 = get_stringwidth("0")+1; + w2 = get_stringwidth(".")+1; + + cpos[0] = 2 * w1 + 1 * w2; + cpos[1] = 4 * w1 + 2 * w2; + cpos[2] = 6 * w1 + 3 * w2; + + draw_block(datebox->left,datebox->top,datebox->width,datebox->height,3,DRAW_ERASE); + datebox_draw(datebox,0); + draw_block(datebox->left+ cpos[cursor],datebox->top,2*w1+1,datebox->height,3,DRAW_XOR); + + while(!(KEY_Exit | KEY_OK)) { + + if(KEY_Left || KEY_Right) { + cursor += 3; + if (KEY_Left) + cursor--; + else + cursor++; + cursor %= 3; + } + + x = getNumKeyValue(); + if (x >= 0) { + v= x<<4; + draw_block(datebox->left+cpos[cursor],datebox->top,2*w1+1,datebox->height,3,DRAW_ERASE); + draw_char(datebox->left+1+cpos[cursor],datebox->top+1, x + 0x30,3, DRAW_PUT); + draw_char(datebox->left+w1+1+cpos[cursor],datebox->top+1, '_',3, DRAW_PUT); + waitKeyUpDown(); + x = getNumKeyValue(); + if (x >= 0) { + v |= x; + switch (cursor++) { + case 0: + datebox->date.day = checkBCD(v,31,1); + break; + case 1: + datebox->date.month = checkBCD(v,12,1); + break; + case 2: + datebox->date.year = checkBCD(v,99,0); + exit++; + break; + } + cursor %= 3; + } + } + + if(KEY_Down || KEY_Up) { + if (KEY_Up) + x=1; + else + x=-1; + switch (cursor) { + case 0: + calcBCD((unsigned char*)&datebox->date.day, x, 31, 1); + break; + case 1: + calcBCD((unsigned char*)&datebox->date.month, x, 12, 1); + break; + case 2: + calcBCD((unsigned char*)&datebox->date.year, x, 99, 0); + break; + } + } + calcweekday(&datebox->date); + + draw_block(datebox->left,datebox->top,datebox->width,datebox->height,3,DRAW_ERASE); + datebox_draw(datebox,0); + draw_block(datebox->left+ cpos[cursor],datebox->top,2*w1+1,datebox->height,3,DRAW_XOR); + + if(exit) + break; + + waitFormKeyUpDown(); + } + + if (KEY_OK | exit) { + switch (datebox->date.month) { + case 0x02: + x = (((datebox->date.year & 0xf0)>>4) * 10 + (datebox->date.year & 0x0f)) & 0x03; + if (x && (datebox->date.day > 0x28)) + datebox->date.day = 0x28; + else if (!x && (datebox->date.day > 0x29)) + datebox->date.day = 0x29; + break; + case 0x04: + case 0x06: + case 0x09: + case 0x11: + if (datebox->date.day > 0x30) + datebox->date.day = 0x30; + } + calcweekday(&datebox->date); + } + else + datebox->date = dateold; + + waitFormKeyUp(); +} + +void timebox_entervalue(TIMEBOX* timebox) { + unsigned char cursor; + signed char x; + signed char v; + char cpos[3]; + unsigned char w1, w2; + struct time_ timeold; + unsigned char exit = 0; + + if(KEY_Right) + cursor = 2; + else + cursor = 0; + + timeold = timebox->time; + + w1 = get_stringwidth("0")+1; + w2 = get_stringwidth(":")+1; + + cpos[0] = 0; + cpos[1] = 2 * w1 + 1 * w2; + cpos[2] = 4 * w1 + 2 * w2; + + draw_block(timebox->left,timebox->top,timebox->width,timebox->height,3,DRAW_ERASE); + timebox_draw(timebox,0); + draw_block(timebox->left+ cpos[cursor],timebox->top,2*w1+1,timebox->height,3,DRAW_XOR); + + while(!(KEY_Exit | KEY_OK)) { + + if(KEY_Left || KEY_Right) { + cursor += 3; + if (KEY_Left) + cursor--; + else + cursor++; + cursor %= 3; + } + + x = getNumKeyValue(); + if (x >= 0) { + v= x<<4; + draw_block(timebox->left+cpos[cursor],timebox->top,2*w1+1,timebox->height,3,DRAW_ERASE); + draw_char(timebox->left+1+cpos[cursor],timebox->top+1, x + 0x30,3, DRAW_PUT); + draw_char(timebox->left+w1+1+cpos[cursor],timebox->top+1, '_',3, DRAW_PUT); + waitKeyUpDown(); + x = getNumKeyValue(); + if (x >= 0) { + v |= x; + switch (cursor++) { + case 0: + timebox->time.hour = checkBCD(v,23,0); + break; + case 1: + timebox->time.minute = checkBCD(v,59,0); + break; + case 2: + timebox->time.second = checkBCD(v,59,0); + exit++; + break; + } + cursor %= 3; + } + } + + if(KEY_Down || KEY_Up) { + if (KEY_Up) + x=1; + else + x=-1; + switch (cursor) { + case 0: + calcBCD((unsigned char*)&timebox->time.hour, x, 23, 0); + break; + case 1: + calcBCD((unsigned char*)&timebox->time.minute, x, 59, 0); + break; + case 2: + calcBCD((unsigned char*)&timebox->time.second, x, 59, 0); + break; + } + } + + draw_block(timebox->left,timebox->top,timebox->width,timebox->height,3,DRAW_ERASE); + timebox_draw(timebox,0); + draw_block(timebox->left+ cpos[cursor],timebox->top,2*w1+1,timebox->height,3,DRAW_XOR); + + + if(exit) + break; + + waitFormKeyUpDown(); + } + + if (KEY_Exit) + timebox->time = timeold; + + waitFormKeyUp(); +} + +void listbox_changevalue (LISTBOX* listbox) +{ + if((KEY_Left) && listbox->listindex) + listbox->listindex--; + if((KEY_Right) && listbox->listindex < listbox->listcount - 1) + listbox->listindex++; +} + +void control_onkey(FORM* form, CONTROL* control) { + unsigned short x; + + if (KEY_OK) + { + switch ((control->type) & 0x1F) { + case BC_Label: + case BC_Txtbox: + case BC_Numbox: + case BC_Datebox: + case BC_Timebox: + case BC_Listbox: + if (control->ONclick) + control->ONclick(form,control); + waitFormKeyUp(); + break; + case BC_Button: + x=form->sel; + button_draw((BUTTON*)control,2); + if (control->ONclick) + control->ONclick(form,control); + waitFormKeyUp(); + if(x==form->sel) + x=1; + else + x=0; + button_draw((BUTTON*)control,x); + break; + } + return; + } + switch ((control->type) & 0x1F) { + case BC_Label: + case BC_Button: + break; + case BC_Numbox: + { + NUMBOX* numbox = (NUMBOX*)control; + x=numbox->value; + if(((getKeynum() > 15) && (getKeynum() < 26)) || (KEY_Left) || (KEY_Right)) + numbox_entervalue(numbox); + if((x!=numbox->value) && (numbox->ONchange)) + numbox->ONchange(form,control); + } + break; + case BC_Txtbox: + { + TXTBOX* txtbox = (TXTBOX*)control; + crc oldtext = CRCs(txtbox->text); + if(((getKeynum() > 15) && (getKeynum() < 26)) | KEY_Right) + txtbox_entervalue(txtbox); + if((oldtext != CRCs(txtbox->text)) && (txtbox->ONchange)) + txtbox->ONchange(form,control); + } + break; + case BC_Datebox: + { + DATEBOX* datebox = (DATEBOX*)control; + struct date_ olddate = datebox->date; + if(((getKeynum() > 15) && (getKeynum() < 26)) | KEY_Right) + datebox_entervalue(datebox); + if(memcmp(&olddate,&datebox->date,4) && (datebox->ONchange)) + datebox->ONchange(form,control); + } + break; + case BC_Timebox: + { + TIMEBOX* timebox = (TIMEBOX*)control; + struct time_ oldtime = timebox->time; + if(((getKeynum() > 15) && (getKeynum() < 26)) | KEY_Right) + timebox_entervalue(timebox); + if(memcmp(&oldtime,&timebox->time,4) && (timebox->ONchange)) + timebox->ONchange(form,control); + } + break; + case BC_Listbox: + { + LISTBOX* listbox = (LISTBOX*)control; + unsigned char oldvalue = listbox->listindex; + if(KEY_Left | KEY_Right) + listbox_changevalue((LISTBOX*) control); + if((oldvalue!=listbox->listindex) && (listbox->ONchange)) + listbox->ONchange(form,control); + } + break; + } + control_draw(control,1); +} + +void form_ontimer(unsigned int cb) { + currentform->flags |= BC_Timer_expired; + //currentform->timer(currentform); +} + + + +// displays a form and passes input to form element handlers +void form_exec(FORM* form) { + + unsigned char x; + FORM* oldform; + unsigned int form_cb = 0xff; + + oldform = currentform; + currentform = form; + + if(form->load) + form->load(form); + + if(form->controls[form->sel]->type & BC_NoTabStop) { + x = get_next_control(form); + form->sel = x; + } + + form_draw(form); + + if(form->timer) { + form_cb = addTimerCB(form_ontimer, form->intervall); + startCB(form_cb); + sysInfo |= SYS_NOPDOWN; + } + + while(KEY_Exit) {}; + while((!KEY_Exit) && (!(form->flags & BC_Form_exit))) + { + waitFormKeyUpDown(); + + if(KEY_Up | KEY_Down) { + if(KEY_Up) + x = get_prev_control(form); + else + x = get_next_control(form); + control_draw(form->controls[form->sel],0); + form->sel = x; + control_draw(form->controls[form->sel],1); + } + else + control_onkey(form,form->controls[form->sel]); + } + + if(form_cb != 0xff) { + sysInfo &= ~SYS_NOPDOWN; + stopCB(form_cb); + removeTimerCB(form_cb); + } + + if(form->close) + form->close(form); + + currentform = oldform; + + while(KEY_Exit); +} diff --git a/boop/trunk/gui/controls.h b/boop/trunk/gui/controls.h new file mode 100644 index 0000000..a13a70a --- /dev/null +++ b/boop/trunk/gui/controls.h @@ -0,0 +1,194 @@ +/* + controls.h - GUI controls + Copyright (C) 2008 + + 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 3 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 CONTROLS_H +#define CONTROLS_H + +#include "rtc.h" + +#define BC_OKOnly 0 +#define BC_YesNo 1 +#define BC_nobuttons 2 +#define BC_DefaultButton1 0 +#define BC_DefaultButton2 4 +#define BC_DefaultButton3 8 + +#define BC_OK 1 +#define BC_Yes 2 +#define BC_No 3 + +#define BC_NoTabStop 0x80 +#define BC_Disabled 0x40 + +#define BC_Label 1 +#define BC_Labelnotab (BC_Label | BC_NoTabStop) +#define BC_Button 2 +#define BC_Numbox 3 +#define BC_Txtbox 4 +#define BC_Datebox 5 +#define BC_Timebox 6 +#define BC_Listbox 7 + +extern struct FORM dummyform; +extern struct CONTROL dummycontrol; + +typedef void(*event)(struct FORM* form, struct CONTROL* control); +typedef void(*fevent)(struct FORM* form); + +typedef struct CONTROL +{ + unsigned char type; + unsigned char left; + unsigned char top; + unsigned char width; + unsigned char height; + unsigned char font; + unsigned char tag1; + unsigned char tag2; + char* caption; + event ONclick; + event ONchange; +} CONTROL; + +typedef struct FORM +{ + char* caption; + char* footer; + fevent load; + fevent close; + fevent timer; + unsigned long tag; + CONTROL* *controls; + unsigned char sel; + unsigned char controlcount; + unsigned char flags; + unsigned char intervall; +} FORM; + +//form.flags +#define BC_Form_exit (1<<0) +#define BC_Timer_expired (1<<1) +#define BC_Form_redraw (1<<2) + +typedef struct LABEL +{ + unsigned char type; + unsigned char left; + unsigned char top; + unsigned char width; + unsigned char height; + unsigned char font; + unsigned short tag; + char* caption; + event ONclick; +} LABEL; + +typedef struct BUTTON +{ + unsigned char type; + unsigned char left; + unsigned char top; + unsigned char width; + unsigned char height; + unsigned char font; + unsigned short tag; + char* caption; + event ONclick; +} BUTTON; + +typedef struct NUMBOX +{ + unsigned char type; + unsigned char left; + unsigned char top; + unsigned char width; + unsigned char height; + unsigned char font; + unsigned short value; + unsigned short min; + unsigned short max; + event ONclick; + event ONchange; +} NUMBOX; + +typedef struct TXTBOX +{ + unsigned char type; + unsigned char left; + unsigned char top; + unsigned char width; + unsigned char height; + unsigned char font; + unsigned char maxlen; + unsigned char tag; + char* text; + event ONclick; + event ONchange; +} TXTBOX; + +typedef struct DATEBOX +{ + unsigned char type; + unsigned char left; + unsigned char top; + unsigned char width; + unsigned char height; + unsigned char font; + unsigned short tag; + struct date_ date; + event ONclick; + event ONchange; +} DATEBOX; + +typedef struct TIMEBOX +{ + unsigned char type; + unsigned char left; + unsigned char top; + unsigned char width; + unsigned char height; + unsigned char font; + unsigned short tag; + struct time_ time; + event ONclick; + event ONchange; +} TIMEBOX; + +typedef struct LISTBOX +{ + unsigned char type; + unsigned char left; + unsigned char top; + unsigned char width; + unsigned char height; + unsigned char font; + unsigned char listindex; + unsigned char listcount; + char* *list; + event ONclick; + event ONchange; +} LISTBOX; + +unsigned char msgbox(unsigned char x,unsigned short flags, char *st); +void form_draw(FORM* form); +void control_draw(CONTROL* control, unsigned char select); +void form_exec(FORM* form); + +void listbox_changevalue (LISTBOX* listbox); + +#endif diff --git a/boop/trunk/gui/iconCross.h b/boop/trunk/gui/iconCross.h new file mode 100644 index 0000000..c93ba16 --- /dev/null +++ b/boop/trunk/gui/iconCross.h @@ -0,0 +1,144 @@ +//////////////////////////////////////////////////// +// This file was generated by the tool GrayScaler. +// Source bitmap: R:\Project\GrayScaler\Icons\Cross.bmp +// +// ICON_GRAY - 2 bpp (Bit per Pixel) +// sizeof (iconCross.data) == 224 +// +//////////////////////////////////////////////////// +#include "icon.h" + +#ifndef ICON_INFO +#define ICON_INFO(i) i, +#endif + + +const ICON iconCross = +{ + /* width = */ 28, + /* height = */ 28, + /* info = */ ICON_INFO (ICON_GRAY) + /* data [] = */ + { + // Bit 0 is the upper most pixel + // of the page, which is 8 pixel high + //--- Page 0 --- + 0x00, 0x00, + 0x00, 0x00, + 0xc0, 0x80, + 0xe0, 0xc0, + 0xf0, 0xf0, + 0x38, 0x70, + 0x1c, 0x38, + 0x1c, 0x1c, + 0x0c, 0x0e, + 0x0e, 0x04, + 0x06, 0x0c, + 0x06, 0x06, + 0x06, 0x06, + 0x07, 0xff, + 0x07, 0xff, + 0x06, 0x06, + 0x06, 0x06, + 0x06, 0x04, + 0x0e, 0x04, + 0x0c, 0x0e, + 0x1c, 0x1c, + 0x1c, 0x38, + 0x38, 0x70, + 0xf0, 0xf0, + 0xe0, 0xc0, + 0xc0, 0x80, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 1 --- + 0x60, 0x60, + 0xfe, 0xf9, + 0xff, 0xff, + 0x03, 0x65, + 0x00, 0x60, + 0x00, 0x60, + 0x00, 0x60, + 0x00, 0x60, + 0xf0, 0xf8, + 0x6c, 0x94, + 0x62, 0x9e, + 0x62, 0x9d, + 0x61, 0x9f, + 0xff, 0x61, + 0xff, 0x61, + 0x61, 0x9f, + 0x62, 0x9d, + 0x62, 0x9e, + 0x6c, 0x94, + 0xf0, 0xf8, + 0x00, 0x60, + 0x00, 0x60, + 0x00, 0x60, + 0x00, 0x60, + 0x03, 0x65, + 0xff, 0xff, + 0xfe, 0xf9, + 0x60, 0x60, + //--- Page 2 --- + 0x00, 0x00, + 0x07, 0x09, + 0x3f, 0x1f, + 0x7c, 0x3a, + 0xf0, 0xf0, + 0xc0, 0xe0, + 0x80, 0xc0, + 0x80, 0x80, + 0x00, 0x01, + 0x03, 0x02, + 0x04, 0x07, + 0x04, 0x0b, + 0x08, 0x0f, + 0x0f, 0xf8, + 0x0f, 0xf8, + 0x08, 0x0f, + 0x04, 0x0b, + 0x04, 0x07, + 0x03, 0x02, + 0x00, 0x01, + 0x80, 0x80, + 0x80, 0xc0, + 0xc0, 0xe0, + 0xf0, 0xf0, + 0x7c, 0x3a, + 0x3f, 0x1f, + 0x07, 0x09, + 0x00, 0x00, + //--- Page 3 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x01, 0x00, + 0x03, 0x01, + 0x03, 0x03, + 0x03, 0x07, + 0x07, 0x02, + 0x06, 0x03, + 0x06, 0x06, + 0x06, 0x06, + 0x0e, 0x0f, + 0x0e, 0x0f, + 0x06, 0x06, + 0x06, 0x06, + 0x06, 0x02, + 0x07, 0x02, + 0x03, 0x07, + 0x03, 0x03, + 0x03, 0x01, + 0x01, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00 + } +}; + + diff --git a/boop/trunk/gui/iconCross_t.h b/boop/trunk/gui/iconCross_t.h new file mode 100644 index 0000000..18fd07a --- /dev/null +++ b/boop/trunk/gui/iconCross_t.h @@ -0,0 +1,148 @@ +//////////////////////////////////////////////////// +// This file was generated by the tool GrayScaler. +// Source bitmap: R:\Project\GrayScaler\Icons\Cross_t.bmp +// +// ICON_GRAY_TRANSPARENT - 3 bpp (Bit per Pixel) +// sizeof (iconCross_t.data) == 336 +// +//////////////////////////////////////////////////// +#include "icon.h" + +#ifndef ICON_INFO +#define ICON_INFO(i) i, +#endif + + +const ICON iconCross_t = +{ + /* width = */ 28, + /* height = */ 28, + /* info = */ ICON_INFO (ICON_GRAY_TRANSPARENT) + /* data [] = */ + { + // Bit 0 is the upper most pixel + // of the page, which is 8 pixel high + //--- Page 0 --- + // v--- Alpha Channel + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x80, 0xc0, 0xc0, + 0xe0, 0xc0, 0xe0, + 0xf0, 0xf0, 0xf0, + 0x38, 0x70, 0x78, + 0x18, 0x3c, 0x3c, + 0x1c, 0x1c, 0x1c, + 0x0c, 0x0e, 0x0e, + 0x0e, 0x04, 0x0e, + 0x06, 0x0c, 0x0e, + 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, + 0x07, 0xff, 0xff, + 0x07, 0xff, 0xff, + 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, + 0x06, 0x0c, 0x0e, + 0x0e, 0x04, 0x0e, + 0x0c, 0x0e, 0x0e, + 0x1c, 0x1c, 0x1c, + 0x18, 0x3c, 0x3c, + 0x38, 0x70, 0x78, + 0xf0, 0xf0, 0xf0, + 0xe0, 0xc0, 0xe0, + 0x80, 0xc0, 0xc0, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + //--- Page 1 --- + // v--- Alpha Channel + 0x60, 0x60, 0x60, + 0xfe, 0xf9, 0xff, + 0xff, 0xff, 0xff, + 0x03, 0x65, 0x67, + 0x00, 0x60, 0x60, + 0x00, 0x60, 0x60, + 0x00, 0x60, 0x60, + 0x00, 0x60, 0x60, + 0xf0, 0xf8, 0xf8, + 0x6c, 0x94, 0xfc, + 0x62, 0x9e, 0xfe, + 0x62, 0x9d, 0xff, + 0x61, 0x9f, 0xff, + 0xff, 0x61, 0xff, + 0xff, 0x61, 0xff, + 0x61, 0x9f, 0xff, + 0x62, 0x9d, 0xff, + 0x62, 0x9e, 0xfe, + 0x6c, 0x94, 0xfc, + 0xf0, 0xf8, 0xf8, + 0x00, 0x60, 0x60, + 0x00, 0x60, 0x60, + 0x00, 0x60, 0x60, + 0x00, 0x60, 0x60, + 0x03, 0x65, 0x67, + 0xff, 0xff, 0xff, + 0xfe, 0xf9, 0xff, + 0x60, 0x60, 0x60, + //--- Page 2 --- + // v--- Alpha Channel + 0x00, 0x00, 0x00, + 0x07, 0x09, 0x0f, + 0x1f, 0x3f, 0x3f, + 0x7c, 0x3a, 0x7e, + 0xf0, 0xf0, 0xf0, + 0xc0, 0xe0, 0xe0, + 0x80, 0xc0, 0xc0, + 0x80, 0x80, 0x80, + 0x00, 0x01, 0x01, + 0x03, 0x02, 0x03, + 0x04, 0x07, 0x07, + 0x04, 0x0b, 0x0f, + 0x08, 0x0f, 0x0f, + 0x0f, 0xf8, 0xff, + 0x0f, 0xf8, 0xff, + 0x08, 0x0f, 0x0f, + 0x04, 0x0b, 0x0f, + 0x04, 0x07, 0x07, + 0x03, 0x02, 0x03, + 0x00, 0x01, 0x01, + 0x80, 0x80, 0x80, + 0x80, 0xc0, 0xc0, + 0xc0, 0xe0, 0xe0, + 0xf0, 0xf0, 0xf0, + 0x7c, 0x3a, 0x7e, + 0x1f, 0x3f, 0x3f, + 0x07, 0x09, 0x0f, + 0x00, 0x00, 0x00, + //--- Page 3 --- + // v--- Alpha Channel + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x01, 0x00, 0x01, + 0x01, 0x03, 0x03, + 0x03, 0x03, 0x03, + 0x03, 0x07, 0x07, + 0x07, 0x02, 0x07, + 0x06, 0x03, 0x07, + 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, + 0x0e, 0x0f, 0x0f, + 0x0e, 0x0f, 0x0f, + 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, + 0x06, 0x03, 0x07, + 0x07, 0x02, 0x07, + 0x03, 0x07, 0x07, + 0x03, 0x03, 0x03, + 0x01, 0x03, 0x03, + 0x01, 0x00, 0x01, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00 + } +}; + + diff --git a/boop/trunk/gui/iconFf.h b/boop/trunk/gui/iconFf.h new file mode 100644 index 0000000..3787757 --- /dev/null +++ b/boop/trunk/gui/iconFf.h @@ -0,0 +1,56 @@ +//////////////////////////////////////////////////// +// This file was generated by the tool GrayScaler. +// Source bitmap: R:\Project\GrayScaler\Icons\FF.bmp +// +// ICON_GRAY - 2 bpp (Bit per Pixel) +// sizeof (iconFf.data) == 52 +// +//////////////////////////////////////////////////// +#include "icon.h" + +#ifndef ICON_INFO +#define ICON_INFO(i) i, +#endif + + +const ICON iconFf = +{ + /* width = */ 13, + /* height = */ 13, + /* info = */ ICON_INFO (ICON_GRAY) + /* data [] = */ + { + // Bit 0 is the upper most pixel + // of the page, which is 8 pixel high + //--- Page 0 --- + 0xfc, 0xfa, + 0x06, 0x03, + 0x03, 0x00, + 0xf9, 0xf9, + 0xf1, 0xf9, + 0xe1, 0xf1, + 0x41, 0xe1, + 0xf9, 0xf9, + 0xf1, 0xf9, + 0xe1, 0xf1, + 0x43, 0xe0, + 0x06, 0x03, + 0xfc, 0xfa, + //--- Page 1 --- + 0x07, 0x0b, + 0x0c, 0x18, + 0x18, 0x00, + 0x13, 0x13, + 0x11, 0x13, + 0x10, 0x11, + 0x10, 0x10, + 0x13, 0x13, + 0x11, 0x13, + 0x10, 0x11, + 0x10, 0x00, + 0x08, 0x18, + 0x07, 0x0b + } +}; + + diff --git a/boop/trunk/gui/iconFr.h b/boop/trunk/gui/iconFr.h new file mode 100644 index 0000000..c022efd --- /dev/null +++ b/boop/trunk/gui/iconFr.h @@ -0,0 +1,56 @@ +//////////////////////////////////////////////////// +// This file was generated by the tool GrayScaler. +// Source bitmap: R:\Project\GrayScaler\Icons\FR.bmp +// +// ICON_GRAY - 2 bpp (Bit per Pixel) +// sizeof (iconFr.data) == 52 +// +//////////////////////////////////////////////////// +#include "icon.h" + +#ifndef ICON_INFO +#define ICON_INFO(i) i, +#endif + + +const ICON iconFr = +{ + /* width = */ 13, + /* height = */ 13, + /* info = */ ICON_INFO (ICON_GRAY) + /* data [] = */ + { + // Bit 0 is the upper most pixel + // of the page, which is 8 pixel high + //--- Page 0 --- + 0xfc, 0xfa, + 0x02, 0x03, + 0x41, 0xe0, + 0xe1, 0xf1, + 0xf1, 0xf9, + 0xf9, 0xf9, + 0x41, 0xe1, + 0xe1, 0xf1, + 0xf1, 0xf9, + 0xf9, 0xf9, + 0x03, 0x00, + 0x06, 0x03, + 0xfc, 0xfa, + //--- Page 1 --- + 0x07, 0x0b, + 0x0c, 0x18, + 0x18, 0x00, + 0x10, 0x11, + 0x11, 0x13, + 0x13, 0x13, + 0x10, 0x10, + 0x10, 0x11, + 0x11, 0x13, + 0x13, 0x13, + 0x18, 0x00, + 0x0c, 0x18, + 0x07, 0x0b + } +}; + + diff --git a/boop/trunk/gui/iconHourglas.h b/boop/trunk/gui/iconHourglas.h new file mode 100644 index 0000000..6e99e15 --- /dev/null +++ b/boop/trunk/gui/iconHourglas.h @@ -0,0 +1,173 @@ +//////////////////////////////////////////////////// +// This file was generated by the tool GrayScaler. +// Source bitmap: R:\Project\GrayScaler\Icons\Hourglas.bmp +// +// ICON_GRAY - 2 bpp (Bit per Pixel) +// sizeof (iconHourglas.data) == 280 +// +//////////////////////////////////////////////////// +#include "icon.h" + +#ifndef ICON_INFO +#define ICON_INFO(i) i, +#endif + + +const ICON iconHourglas = +{ + /* width = */ 28, + /* height = */ 40, + /* info = */ ICON_INFO (ICON_GRAY) + /* data [] = */ + { + // Bit 0 is the upper most pixel + // of the page, which is 8 pixel high + //--- Page 0 --- + 0x0e, 0x11, + 0x3f, 0x1e, + 0x7f, 0x3a, + 0xff, 0x6a, + 0xff, 0xca, + 0xff, 0xca, + 0x3f, 0x0a, + 0x3b, 0x0e, + 0x3b, 0x0e, + 0x3b, 0x0e, + 0x3b, 0x0e, + 0x3b, 0x0e, + 0x3b, 0x0e, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0x3f, 0x0a, + 0xff, 0xca, + 0xff, 0xca, + 0xff, 0x6a, + 0x7f, 0x3a, + 0x3f, 0x1e, + 0x0e, 0x11, + //--- Page 1 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0xff, + 0xff, 0xff, + 0xff, 0x0f, + 0xfe, 0xfd, + 0x70, 0xb8, + 0xe0, 0x70, + 0xc0, 0xa0, + 0x80, 0x50, + 0x30, 0x80, + 0xf0, 0x00, + 0xf0, 0x00, + 0xf0, 0x00, + 0xf0, 0x08, + 0x70, 0x88, + 0xb0, 0xc8, + 0xd8, 0x64, + 0x78, 0xe4, + 0x36, 0xf8, + 0xfe, 0xfd, + 0xff, 0x0f, + 0xff, 0xff, + 0x00, 0xff, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 2 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0xff, + 0xff, 0xff, + 0xff, 0x00, + 0xff, 0xff, + 0x00, 0xff, + 0x80, 0x80, + 0xc1, 0xc0, + 0x61, 0xb3, + 0x3f, 0x12, + 0x1c, 0x0f, + 0x07, 0x00, + 0x1d, 0x0e, + 0x3f, 0x12, + 0x63, 0xb5, + 0xc1, 0xe2, + 0x80, 0xc1, + 0x00, 0x00, + 0x00, 0xff, + 0xff, 0xff, + 0xff, 0x00, + 0xff, 0xff, + 0x00, 0xff, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 3 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0xff, + 0xff, 0xff, + 0xff, 0xfc, + 0xff, 0x0f, + 0x07, 0x0b, + 0x81, 0x03, + 0xc0, 0x01, + 0xc0, 0x20, + 0xe0, 0x10, + 0xf0, 0x00, + 0xf8, 0x00, + 0xf0, 0x00, + 0xe0, 0x10, + 0xc0, 0x20, + 0xc0, 0x01, + 0x81, 0x03, + 0x03, 0x87, + 0x0e, 0x17, + 0xff, 0x1f, + 0xff, 0xf8, + 0xff, 0xff, + 0x00, 0xff, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 4 --- + 0x70, 0x88, + 0xfc, 0x78, + 0xfe, 0x7c, + 0xff, 0x76, + 0xff, 0x77, + 0xff, 0x77, + 0xff, 0x74, + 0xfe, 0x75, + 0xff, 0x74, + 0xff, 0x74, + 0xf7, 0x7c, + 0xf7, 0x7c, + 0xf7, 0x7c, + 0xf7, 0x7c, + 0xf7, 0x7c, + 0xff, 0x74, + 0xff, 0x74, + 0xff, 0x74, + 0xff, 0x74, + 0xff, 0x74, + 0xfe, 0x75, + 0xff, 0x74, + 0xff, 0x77, + 0xff, 0x77, + 0xff, 0x76, + 0xfe, 0x7c, + 0xfc, 0x78, + 0x70, 0x88 + } +}; + + diff --git a/boop/trunk/gui/iconHourglas_t.h b/boop/trunk/gui/iconHourglas_t.h new file mode 100644 index 0000000..d46a555 --- /dev/null +++ b/boop/trunk/gui/iconHourglas_t.h @@ -0,0 +1,178 @@ +//////////////////////////////////////////////////// +// This file was generated by the tool GrayScaler. +// Source bitmap: R:\Project\GrayScaler\Icons\Hourglas_t.bmp +// +// ICON_GRAY_TRANSPARENT - 3 bpp (Bit per Pixel) +// sizeof (iconHourglas_t.data) == 420 +// +//////////////////////////////////////////////////// +#include "icon.h" + +#ifndef ICON_INFO +#define ICON_INFO(i) i, +#endif + + +const ICON iconHourglas_t = +{ + /* width = */ 28, + /* height = */ 40, + /* info = */ ICON_INFO (ICON_GRAY_TRANSPARENT) + /* data [] = */ + { + // Bit 0 is the upper most pixel + // of the page, which is 8 pixel high + //--- Page 0 --- + // v--- Alpha Channel + 0x0e, 0x11, 0x1f, + 0x3f, 0x1e, 0x3f, + 0x7f, 0x3a, 0x7f, + 0xff, 0x6a, 0xff, + 0xff, 0xca, 0xff, + 0xff, 0xca, 0xff, + 0x3f, 0x0a, 0xff, + 0x3b, 0x0e, 0xff, + 0x3b, 0x0e, 0xff, + 0x3b, 0x0e, 0xff, + 0x3b, 0x0e, 0xff, + 0x3b, 0x0e, 0xff, + 0x3b, 0x0e, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0x3f, 0x0a, 0xff, + 0xff, 0xca, 0xff, + 0xff, 0xca, 0xff, + 0xff, 0x6a, 0xff, + 0x7f, 0x3a, 0x7f, + 0x3f, 0x1e, 0x3f, + 0x0e, 0x11, 0x1f, + //--- Page 1 --- + // v--- Alpha Channel + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, + 0xff, 0x0f, 0xff, + 0xfe, 0xfd, 0xff, + 0x70, 0xb8, 0xff, + 0xe0, 0x70, 0xff, + 0xc0, 0xa0, 0xff, + 0x80, 0x50, 0xff, + 0x30, 0x80, 0xff, + 0xf0, 0x00, 0xff, + 0xf0, 0x00, 0xff, + 0xf0, 0x00, 0xff, + 0xf0, 0x08, 0xff, + 0x70, 0x88, 0xff, + 0xb0, 0xc8, 0xff, + 0xd8, 0x64, 0xff, + 0x78, 0xe4, 0xff, + 0x36, 0xf8, 0xff, + 0xfe, 0xfd, 0xff, + 0xff, 0x0f, 0xff, + 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + //--- Page 2 --- + // v--- Alpha Channel + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, + 0xff, 0x00, 0xff, + 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, + 0x80, 0x80, 0x80, + 0xc1, 0xc0, 0xc1, + 0x61, 0xb3, 0xf3, + 0x3f, 0x12, 0xff, + 0x1c, 0x0f, 0xff, + 0x07, 0x00, 0xff, + 0x1d, 0x0e, 0xff, + 0x3f, 0x12, 0xff, + 0x63, 0xb5, 0xf7, + 0xc1, 0xe2, 0xe3, + 0x80, 0xc1, 0xc1, + 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, + 0xff, 0x00, 0xff, + 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + //--- Page 3 --- + // v--- Alpha Channel + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, + 0xff, 0x0f, 0xff, + 0x07, 0x0b, 0xff, + 0x81, 0x03, 0xff, + 0xc0, 0x01, 0xff, + 0xc0, 0x20, 0xff, + 0xe0, 0x10, 0xff, + 0xf0, 0x00, 0xff, + 0xf8, 0x00, 0xff, + 0xf0, 0x00, 0xff, + 0xe0, 0x10, 0xff, + 0xc0, 0x20, 0xff, + 0xc0, 0x01, 0xff, + 0x81, 0x03, 0xff, + 0x03, 0x87, 0xff, + 0x0e, 0x17, 0xff, + 0xff, 0x1f, 0xff, + 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + //--- Page 4 --- + // v--- Alpha Channel + 0x70, 0x88, 0xf8, + 0xfc, 0x78, 0xfc, + 0xfe, 0x7c, 0xfe, + 0xff, 0x76, 0xff, + 0xff, 0x77, 0xff, + 0xff, 0x77, 0xff, + 0xff, 0x74, 0xff, + 0xfe, 0x75, 0xff, + 0xff, 0x74, 0xff, + 0xff, 0x74, 0xff, + 0xf7, 0x7c, 0xff, + 0xf7, 0x7c, 0xff, + 0xf7, 0x7c, 0xff, + 0xf7, 0x7c, 0xff, + 0xf7, 0x7c, 0xff, + 0xff, 0x74, 0xff, + 0xff, 0x74, 0xff, + 0xff, 0x74, 0xff, + 0xff, 0x74, 0xff, + 0xff, 0x74, 0xff, + 0xfe, 0x75, 0xff, + 0xff, 0x74, 0xff, + 0xff, 0x77, 0xff, + 0xff, 0x77, 0xff, + 0xff, 0x76, 0xff, + 0xfe, 0x7c, 0xfe, + 0xfc, 0x78, 0xfc, + 0x70, 0x88, 0xf8 + } +}; + + diff --git a/boop/trunk/gui/iconLeo_gray_128.h b/boop/trunk/gui/iconLeo_gray_128.h new file mode 100644 index 0000000..858328c --- /dev/null +++ b/boop/trunk/gui/iconLeo_gray_128.h @@ -0,0 +1,1189 @@ +//////////////////////////////////////////////////// +// This file was generated by the tool GrayScaler. +// Source bitmap: R:\Project\GrayScaler\Icons\Leo_Gray_128.bmp +// +// ICON_GRAY - 2 bpp (Bit per Pixel) +// sizeof (iconLeo_gray_128.data) == 2304 +// +//////////////////////////////////////////////////// +#include "icon.h" + +#ifndef ICON_INFO +#define ICON_INFO(i) i, +#endif + + +const ICON iconLeo_gray_128 = +{ + /* width = */ 128, + /* height = */ 65, + /* info = */ ICON_INFO (ICON_GRAY) + /* data [] = */ + { + // Bit 0 is the upper most pixel + // of the page, which is 8 pixel high + //--- Page 0 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x38, + 0x78, 0x9c, + 0x64, 0xf2, + 0xc2, 0x80, + 0x02, 0xc3, + 0x02, 0xc3, + 0x02, 0xe3, + 0x02, 0xe3, + 0x02, 0xe3, + 0x02, 0xe2, + 0x02, 0xe0, + 0x02, 0xf0, + 0x02, 0xf4, + 0x02, 0xf4, + 0x04, 0xf2, + 0x04, 0xf6, + 0x04, 0xf6, + 0x04, 0xf6, + 0x04, 0xf2, + 0x10, 0xe4, + 0x10, 0xec, + 0xb8, 0x54, + 0xf8, 0x20, + 0xf0, 0x28, + 0xe0, 0x30, + 0xc0, 0xe0, + 0x00, 0xc0, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 1 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x01, + 0xf7, 0xe8, + 0xff, 0x0f, + 0x00, 0xff, + 0x00, 0xff, + 0x00, 0xff, + 0x00, 0xff, + 0x00, 0xff, + 0x80, 0x7f, + 0x80, 0x7f, + 0x80, 0x7f, + 0x80, 0x7f, + 0x80, 0x7f, + 0x80, 0x7f, + 0xc0, 0x3f, + 0xe0, 0x1f, + 0xf0, 0x0f, + 0xf8, 0x07, + 0xfe, 0x01, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0xe0, + 0x3f, 0xfe, + 0x03, 0x07, + 0x01, 0x02, + 0x00, 0x01, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 2 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xe0, 0xc0, + 0xff, 0x3f, + 0x01, 0xfe, + 0x00, 0xff, + 0x80, 0x7f, + 0xe0, 0x1f, + 0xfe, 0x01, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0xfe, + 0x07, 0xfb, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0xc0, + 0x00, 0x30, + 0x00, 0x18, + 0x00, 0x88, + 0x00, 0x84, + 0x04, 0x80, + 0x00, 0xc6, + 0x00, 0xc2, + 0x00, 0xe2, + 0x80, 0x62, + 0x82, 0x6c, + 0x06, 0xf8, + 0x84, 0x7e, + 0x84, 0x7e, + 0x8c, 0xf2, + 0x8c, 0xf8, + 0x88, 0xfc, + 0x08, 0xf4, + 0x10, 0xf8, + 0x10, 0xf8, + 0x30, 0xd0, + 0x30, 0xe0, + 0xe0, 0x30, + 0xe0, 0x40, + 0x80, 0xc0, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0xc0, + 0x00, 0x20, + 0x00, 0x30, + 0x00, 0x10, + 0x00, 0x18, + 0x00, 0x08, + 0x08, 0x84, + 0xc8, 0x84, + 0xc8, 0x94, + 0xc8, 0xb4, + 0xe8, 0x9c, + 0xc8, 0xb0, + 0xd8, 0xa8, + 0xd8, 0xa8, + 0xf8, 0x88, + 0xf8, 0x10, + 0xf0, 0x10, + 0xf0, 0x10, + 0xf0, 0x30, + 0xe0, 0x30, + 0xe0, 0x30, + 0xe0, 0x60, + 0xc0, 0xe0, + 0xc0, 0xe0, + 0xc0, 0x80, + 0x80, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 3 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xff, 0xff, + 0xff, 0x00, + 0xfc, 0x03, + 0xf8, 0x07, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x07, + 0xfc, 0x0b, + 0xf8, 0x0c, + 0xe8, 0x1c, + 0x88, 0x7c, + 0x98, 0x68, + 0x98, 0x70, + 0x98, 0x70, + 0xd8, 0x30, + 0xf0, 0x38, + 0xf0, 0x20, + 0xe0, 0x30, + 0xc0, 0xe0, + 0xc0, 0xc0, + 0x00, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x30, 0x68, + 0xfe, 0xfc, + 0xe1, 0x1e, + 0xe0, 0x1e, + 0xf0, 0x0f, + 0xf8, 0x07, + 0xfc, 0x03, + 0xfe, 0x01, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x00, + 0xff, 0x80, + 0xff, 0x44, + 0x7f, 0x4e, + 0x79, 0x4d, + 0x78, 0x4c, + 0x7c, 0x4c, + 0x7e, 0x45, + 0x7f, 0x47, + 0x7e, 0x41, + 0x7e, 0x61, + 0x7e, 0xe1, + 0xff, 0xe0, + 0xff, 0xe0, + 0xff, 0xb0, + 0x3f, 0x30, + 0x1f, 0x3f, + 0x08, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xf8, 0xfb, + 0xe0, 0xf9, + 0xf0, 0xc8, + 0xf0, 0xec, + 0xf8, 0xe4, + 0xf0, 0xff, + 0xfb, 0xfc, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0x7f, 0x3f, + 0x0f, 0x07, + 0x07, 0x03, + 0x03, 0x01, + 0xc3, 0xe7, + 0xff, 0xff, + 0xff, 0xfc, + 0xff, 0xfa, + 0xff, 0xfc, + 0xff, 0xfa, + 0xff, 0xfc, + 0xff, 0xfe, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0x7f, + 0x00, 0x7c, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 4 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x02, 0x01, + 0x0f, 0x0f, + 0x0f, 0x0c, + 0x1f, 0x18, + 0x3f, 0x70, + 0x7f, 0x30, + 0x7f, 0x60, + 0xff, 0x60, + 0xff, 0x78, + 0xff, 0xe0, + 0xff, 0x70, + 0xff, 0xf0, + 0xff, 0x70, + 0x7f, 0xe8, + 0x7f, 0xe0, + 0x7f, 0xf0, + 0x7f, 0xf0, + 0x7f, 0xf0, + 0x7f, 0xf0, + 0x7f, 0xf0, + 0x7f, 0xf0, + 0x7f, 0xf8, + 0x7f, 0xf8, + 0x7f, 0xf8, + 0x7f, 0xf8, + 0x7f, 0xf8, + 0xff, 0x78, + 0x7f, 0xf8, + 0x7f, 0xf8, + 0x7f, 0xe0, + 0x7f, 0xf0, + 0x7f, 0x38, + 0x3f, 0x70, + 0x3f, 0x7e, + 0x3f, 0x9f, + 0x98, 0xc3, + 0xc0, 0x00, + 0x40, 0x00, + 0x00, 0xc0, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x40, + 0x01, 0xc1, + 0x43, 0xa7, + 0xc7, 0x46, + 0xc7, 0x8c, + 0xcf, 0x8c, + 0x8f, 0xcc, + 0x8f, 0xd8, + 0xdf, 0x9c, + 0xdf, 0x98, + 0xdf, 0x98, + 0xdf, 0x98, + 0xdf, 0x98, + 0xdf, 0x99, + 0xdf, 0x9b, + 0xdf, 0x9f, + 0xde, 0x9f, + 0xde, 0x9f, + 0xdf, 0x9e, + 0xdf, 0x9f, + 0xdf, 0x9f, + 0xdf, 0x9f, + 0xdf, 0x9f, + 0xdf, 0xdf, + 0xcf, 0x8f, + 0xcf, 0xcf, + 0xcf, 0x86, + 0xc0, 0x46, + 0x40, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x00, + 0x00, 0x00, + 0x01, 0xa0, + 0x33, 0xc1, + 0x1f, 0x7f, + 0xdf, 0x2f, + 0xff, 0x0f, + 0xdf, 0x2f, + 0x9f, 0x67, + 0x1f, 0xe7, + 0xff, 0x3f, + 0xff, 0xbf, + 0xff, 0xff, + 0xdf, 0xaf, + 0x1f, 0x9e, + 0x1e, 0x0b, + 0x1f, 0x9e, + 0x1f, 0x9f, + 0x1f, 0x9f, + 0x1f, 0x9f, + 0x9f, 0x1f, + 0x9f, 0x1f, + 0x9f, 0x1f, + 0x9f, 0x1f, + 0x8f, 0x1f, + 0x8f, 0x0f, + 0x87, 0x07, + 0x83, 0x03, + 0x81, 0x03, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x00, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x00, + 0x80, 0x80, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x80, + 0x80, 0x80, + 0x80, 0x80, + 0x00, 0x80, + 0x00, 0x00, + //--- Page 5 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0x80, 0x00, + 0xc0, 0x00, + 0x80, 0x40, + 0xc0, 0x00, + 0xc0, 0x00, + 0x80, 0x60, + 0xa0, 0x80, + 0x00, 0xf0, + 0x10, 0xe6, + 0x97, 0x63, + 0xb1, 0x47, + 0xb0, 0x43, + 0xf8, 0x07, + 0xf9, 0xc6, + 0xfe, 0xff, + 0xfe, 0xf9, + 0xf8, 0x17, + 0xf8, 0x07, + 0xfc, 0x03, + 0xfc, 0x03, + 0xfe, 0x00, + 0xff, 0x00, + 0x1e, 0xff, + 0xfd, 0xfc, + 0xf9, 0xff, + 0xff, 0xe1, + 0xff, 0x00, + 0xff, 0x01, + 0xff, 0x00, + 0xff, 0x01, + 0xfb, 0x05, + 0xfb, 0x84, + 0xf9, 0x86, + 0xc1, 0xbe, + 0x01, 0xfe, + 0x03, 0xf8, + 0xff, 0x6f, + 0xff, 0xff, + 0xff, 0xf8, + 0xff, 0xe0, + 0xff, 0x00, + 0xff, 0xa0, + 0xfc, 0xe3, + 0xfc, 0xf2, + 0xf8, 0x86, + 0xf8, 0xc7, + 0xf8, 0xc6, + 0xf8, 0xc6, + 0xfc, 0x82, + 0xfc, 0xc2, + 0xfc, 0x83, + 0x9e, 0xa1, + 0x9e, 0xa3, + 0x0c, 0x92, + 0x00, 0x00, + 0xdb, 0x24, + 0xff, 0x00, + 0xff, 0x00, + 0xfe, 0x01, + 0xff, 0x80, + 0xff, 0xe1, + 0xff, 0xff, + 0xff, 0xff, + 0xfd, 0x73, + 0x3d, 0x71, + 0x3f, 0x39, + 0x3d, 0x7b, + 0x3d, 0x79, + 0x39, 0x3d, + 0x39, 0x3d, + 0x39, 0x3d, + 0x3d, 0x19, + 0x7d, 0x39, + 0x7d, 0x39, + 0x7d, 0x31, + 0x7d, 0x31, + 0x7d, 0x31, + 0x7d, 0x31, + 0x7d, 0x71, + 0x7d, 0x71, + 0x78, 0x7d, + 0x78, 0x75, + 0x7c, 0x71, + 0x7d, 0x70, + 0x79, 0x7c, + 0x79, 0x7c, + 0x79, 0x7c, + 0x79, 0x7c, + 0x79, 0x74, + 0x78, 0x7d, + 0x78, 0x7d, + 0x79, 0x7c, + 0x39, 0x7e, + 0x3d, 0x38, + 0x3f, 0x1f, + 0x1e, 0x1f, + //--- Page 6 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x80, + 0x00, 0x80, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x40, + 0x00, 0x60, + 0x00, 0x20, + 0x00, 0xb0, + 0xc0, 0x90, + 0x80, 0xd8, + 0xc0, 0xe8, + 0xe0, 0xc0, + 0xf0, 0x40, + 0x70, 0x68, + 0x70, 0x38, + 0x38, 0x34, + 0x38, 0x3c, + 0x1c, 0x3a, + 0x1c, 0x1a, + 0x1d, 0x0e, + 0x0f, 0x0c, + 0x0f, 0x04, + 0x0f, 0x06, + 0x07, 0x0e, + 0x07, 0x02, + 0x07, 0x02, + 0x07, 0x03, + 0x03, 0x07, + 0x03, 0x03, + 0x03, 0x03, + 0x03, 0x01, + 0x03, 0x01, + 0x01, 0x07, + 0x3d, 0x4f, + 0x7d, 0x3f, + 0xff, 0x7d, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xff, + 0xff, 0xbf, + 0xff, 0xf8, + 0xff, 0xf8, + 0xff, 0xfc, + 0xff, 0xfe, + 0xff, 0xfe, + 0xff, 0x7e, + 0x7c, 0xfe, + 0x7f, 0x3f, + 0x7f, 0x3f, + 0x3f, 0x7f, + 0x3f, 0x3e, + 0x3f, 0x3f, + 0x3f, 0x36, + 0x37, 0x3e, + 0x3f, 0x3f, + 0x3f, 0x3e, + 0x37, 0x1f, + 0x3f, 0x13, + 0x1c, 0x3b, + 0x1e, 0x19, + 0x1f, 0x1f, + 0x1f, 0x1f, + 0x1f, 0x1f, + 0x1f, 0x1f, + 0x1f, 0x1f, + 0x1f, 0x0f, + 0x0f, 0x1f, + 0x0f, 0x0f, + 0x0f, 0x0f, + 0x0f, 0x0f, + 0x0f, 0x0f, + 0x0f, 0x0f, + 0x0f, 0x07, + 0x07, 0x0f, + 0x0f, 0x07, + 0x07, 0x0f, + 0x0f, 0x0f, + 0x0f, 0x0f, + 0x1f, 0x1f, + 0x1f, 0x37, + 0x3f, 0x2e, + 0x7f, 0x3e, + 0x7f, 0x7f, + 0x3f, 0x7f, + 0x3f, 0x3f, + 0x1f, 0x1f, + 0x0f, 0x07, + 0x00, 0x01, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 7 --- + 0x10, 0x30, + 0x30, 0x6c, + 0x60, 0xf6, + 0x60, 0xe2, + 0x60, 0xe0, + 0x70, 0xe0, + 0x70, 0xa1, + 0x30, 0xf9, + 0x38, 0x30, + 0x38, 0x18, + 0x1c, 0x38, + 0x1c, 0x1a, + 0x0e, 0x0c, + 0x0e, 0x06, + 0x07, 0x06, + 0x07, 0x03, + 0x03, 0x03, + 0x01, 0x03, + 0x01, 0x01, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x01, + 0x00, 0x01, + 0x01, 0x00, + 0x01, 0x00, + 0x01, 0x01, + 0x01, 0x01, + 0x01, 0x01, + 0x00, 0x01, + 0x00, 0x01, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + //--- Page 8 --- + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00 + } +}; + + diff --git a/boop/trunk/gui/iconPause.h b/boop/trunk/gui/iconPause.h new file mode 100644 index 0000000..087924c --- /dev/null +++ b/boop/trunk/gui/iconPause.h @@ -0,0 +1,56 @@ +//////////////////////////////////////////////////// +// This file was generated by the tool GrayScaler. +// Source bitmap: R:\Project\GrayScaler\Icons\Pause.bmp +// +// ICON_GRAY - 2 bpp (Bit per Pixel) +// sizeof (iconPause.data) == 52 +// +//////////////////////////////////////////////////// +#include "icon.h" + +#ifndef ICON_INFO +#define ICON_INFO(i) i, +#endif + + +const ICON iconPause = +{ + /* width = */ 13, + /* height = */ 13, + /* info = */ ICON_INFO (ICON_GRAY) + /* data [] = */ + { + // Bit 0 is the upper most pixel + // of the page, which is 8 pixel high + //--- Page 0 --- + 0xfc, 0xfa, + 0x06, 0x03, + 0x03, 0x00, + 0x01, 0x01, + 0xf9, 0xf9, + 0xf9, 0xf9, + 0x01, 0x01, + 0xf9, 0xf9, + 0xf9, 0xf9, + 0x01, 0x01, + 0x03, 0x00, + 0x06, 0x03, + 0xfc, 0xfa, + //--- Page 1 --- + 0x07, 0x0b, + 0x0c, 0x18, + 0x18, 0x00, + 0x10, 0x10, + 0x13, 0x13, + 0x13, 0x13, + 0x10, 0x10, + 0x13, 0x13, + 0x13, 0x13, + 0x10, 0x10, + 0x10, 0x00, + 0x08, 0x18, + 0x07, 0x0b + } +}; + + diff --git a/boop/trunk/gui/iconPlay.h b/boop/trunk/gui/iconPlay.h new file mode 100644 index 0000000..6224718 --- /dev/null +++ b/boop/trunk/gui/iconPlay.h @@ -0,0 +1,56 @@ +//////////////////////////////////////////////////// +// This file was generated by the tool GrayScaler. +// Source bitmap: R:\Project\GrayScaler\Icons\Play.bmp +// +// ICON_GRAY - 2 bpp (Bit per Pixel) +// sizeof (iconPlay.data) == 52 +// +//////////////////////////////////////////////////// +#include "icon.h" + +#ifndef ICON_INFO +#define ICON_INFO(i) i, +#endif + + +const ICON iconPlay = +{ + /* width = */ 13, + /* height = */ 13, + /* info = */ ICON_INFO (ICON_GRAY) + /* data [] = */ + { + // Bit 0 is the upper most pixel + // of the page, which is 8 pixel high + //--- Page 0 --- + 0xfc, 0xfa, + 0x06, 0x03, + 0x03, 0x00, + 0x01, 0x01, + 0x01, 0x01, + 0xf9, 0xf9, + 0xf1, 0xf9, + 0xe1, 0xf1, + 0x41, 0xe1, + 0x01, 0x01, + 0x03, 0x00, + 0x06, 0x03, + 0xfc, 0xfa, + //--- Page 1 --- + 0x07, 0x0b, + 0x0c, 0x18, + 0x18, 0x00, + 0x10, 0x10, + 0x10, 0x10, + 0x13, 0x13, + 0x11, 0x13, + 0x10, 0x11, + 0x10, 0x10, + 0x10, 0x10, + 0x10, 0x00, + 0x08, 0x18, + 0x07, 0x0b + } +}; + + diff --git a/boop/trunk/gui/iconStop.h b/boop/trunk/gui/iconStop.h new file mode 100644 index 0000000..ffaf217 --- /dev/null +++ b/boop/trunk/gui/iconStop.h @@ -0,0 +1,56 @@ +//////////////////////////////////////////////////// +// This file was generated by the tool GrayScaler. +// Source bitmap: R:\Project\GrayScaler\Icons\Stop.bmp +// +// ICON_GRAY - 2 bpp (Bit per Pixel) +// sizeof (iconStop.data) == 52 +// +//////////////////////////////////////////////////// +#include "icon.h" + +#ifndef ICON_INFO +#define ICON_INFO(i) i, +#endif + + +const ICON iconStop = +{ + /* width = */ 13, + /* height = */ 13, + /* info = */ ICON_INFO (ICON_GRAY) + /* data [] = */ + { + // Bit 0 is the upper most pixel + // of the page, which is 8 pixel high + //--- Page 0 --- + 0xfc, 0xfa, + 0x06, 0x03, + 0x03, 0x00, + 0x01, 0x01, + 0xf1, 0xf1, + 0xf1, 0xf1, + 0xf1, 0xf1, + 0xf1, 0xf1, + 0xf1, 0xf1, + 0x01, 0x01, + 0x03, 0x00, + 0x06, 0x03, + 0xfc, 0xfa, + //--- Page 1 --- + 0x07, 0x0b, + 0x0c, 0x18, + 0x18, 0x00, + 0x10, 0x10, + 0x11, 0x11, + 0x11, 0x11, + 0x11, 0x11, + 0x11, 0x11, + 0x11, 0x11, + 0x10, 0x10, + 0x10, 0x00, + 0x08, 0x18, + 0x07, 0x0b + } +}; + + diff --git a/boop/trunk/gui/mainmenu.c b/boop/trunk/gui/mainmenu.c new file mode 100644 index 0000000..406f7c0 --- /dev/null +++ b/boop/trunk/gui/mainmenu.c @@ -0,0 +1,124 @@ +/* + testmenu.c - testmenu for menuing system + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "menu.h" +#include "testmenu.h" +#include "gamesmenu.h" +#include "settingsmenu.h" +#include "toolsmenu.h" +#include "lcd.h" +#include "fonty.h" +#include "keyboard.h" +#include "global.h" +#include "flash.h" +#ifndef DEBUGMODE + #include "sounds.h" + #include "sound3.h" + #include "sound.h" +#endif +#include "version.h" + +unsigned int testdata1, testdata2; + + +void show_info(void) { + unsigned short flashID; + unsigned short hwID; + flashID = getFlashID(); + draw_hexC (0, 30, flashID, LCD_COLOR_B, DRAW_PUT); + + hwID = GetHWversion(); + draw_hexS (0, 38, hwID, LCD_COLOR_B, DRAW_PUT); + + lcd_fill(0); + set_font(BOLDFONT); + draw_string (0,0,"Info", LCD_COLOR_B, DRAW_PUT); + set_font(SMALLFONT); + draw_string(0,14,"Flash \n" + "Manuf. ID\n" + "Device ID\n" + "\n" + "Betty\n" + "HW Version\n", LCD_COLOR_B, DRAW_PUT); + draw_hexC (65, 23, (flashID>>8), LCD_COLOR_B, DRAW_PUT); + draw_hexC (65, 32, (flashID&0x00ff), LCD_COLOR_B, DRAW_PUT); + draw_hexC (65, 59, (unsigned char)hwID, LCD_COLOR_B, DRAW_PUT); + draw_string (0,77,"Boop", LCD_COLOR_B, DRAW_PUT); +#ifdef RELEASE + draw_numU (65,86,SVNVERSION+1,0, LCD_COLOR_B, DRAW_PUT); + draw_string (0,86,"SVN Release", LCD_COLOR_B, DRAW_PUT); +#else + draw_numU (65,86,SVNVERSION,0, LCD_COLOR_B, DRAW_PUT); + draw_string (0,86,"SVN Revision", LCD_COLOR_B, DRAW_PUT); +#endif + draw_string (0,95,__DATE__, LCD_COLOR_B, DRAW_PUT); + draw_string (0,104,__TIME__, LCD_COLOR_B, DRAW_PUT); + + set_font(SMALLFONT); + + waitKeyUpDown(); +} // show_info + + +void show_credits(void) +{ + lcd_fill(0); + set_font(BOLDFONT); + draw_string (0,0,"Credits", LCD_COLOR_B, DRAW_PUT); + set_font(SMALLFONT); + draw_string (0,14,"Netguy\tBasics\n" + "Telekatz\tBasics, IR/RF\n" + "Theborg\tFirst Steps, HW\n" + "Colibri\tFlash SW\n" + "Damaltor\tSupport\n" + "Pr0nbug\tFirst Steps\n" + "Asgart\tForum/Wiki\n" + "Spessi\tSurport, HW", LCD_COLOR_B, DRAW_PUT); + + draw_string(0,95,"Und alle Anderen\n" + "die vergessen wurden.", LCD_COLOR_B, DRAW_PUT); + + draw_string(0,120,"Thanks to Max Fleischer\n" + "for a great Cartoon!", LCD_COLOR_B, DRAW_PUT); + set_font(BOLDFONT); + draw_string (8,150,"www.bettyhacks.com", LCD_COLOR_B, DRAW_PUT); + set_font(SMALLFONT); +#ifndef DEBUGMODE + playSound((unsigned char*)sound1_data, sound1_len); + waitSound(); + playSound((unsigned char*)sound2_data, sound2_len); + waitSound(); +#endif + waitKeyUpDown(); +} // show_credits + +const struct MENU_ENTRY mainMenuEntries[] = +{ + { 0, (void*)&gamesMenu, MENUENTRY, "Games", "Play some games" }, + { 0, (void*)&testMenu, MENUENTRY, "TestStuff", "Various tests" }, + { enter_settings_menu, 0, FUNCENTRY, "Settings", "Change settings" }, + { 0, (void*)&toolsMenu, MENUENTRY, "Tools", "Tools" }, + { show_credits, 0, FUNCENTRY, "Credits", "Show Credits" }, + { show_info, 0, FUNCENTRY, "Info", "Show Info" } +}; + + +const struct MENU mainMenu = +{ + NUM_OF_ELEMENTS (mainMenuEntries), (MENU_ENTRY*)&mainMenuEntries, "Main Menu" +}; diff --git a/boop/trunk/gui/mainmenu.h b/boop/trunk/gui/mainmenu.h new file mode 100644 index 0000000..d53d3df --- /dev/null +++ b/boop/trunk/gui/mainmenu.h @@ -0,0 +1,24 @@ +/* + mainmenu.h - the main menu for boop + Copyright (C) 2007 Ch. Klippel + + 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 3 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 MAINMENU_H +#define MAINMENU_H + +extern struct MENU mainMenu; + +#endif diff --git a/boop/trunk/gui/menu.c b/boop/trunk/gui/menu.c new file mode 100644 index 0000000..7e5a484 --- /dev/null +++ b/boop/trunk/gui/menu.c @@ -0,0 +1,250 @@ +/* + menu.c - menuing system + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "global.h" +#include "menu.h" +#include "lcd.h" +#include "fonty.h" +#include "keyboard.h" +#include "lpc2220.h" + +//----------------------------------------------------------------------------- +#if FF_LARGE_MENU +#define MENU_FONT SMOOTHFONT +#define MENU_LINE_HEIGHT (SMOOTHFONT_HEIGHT+2) +#else +#define MENU_FONT SMALLFONT +#define MENU_LINE_HEIGHT SMALLFONT_HEIGHT+1 +#endif + +#define MENU_HEAD_LINE_HEIGHT (BOLDFONT_HEIGHT+2+2+2) +#define MENU_LINE_WIDTH (LCD_SIZE_X - 10) +#define MENU_BOTTOM_LINE_HEIGHT (SMALLFONT_HEIGHT+5) + +#define MENU_ARROW_SIZE (min(MENU_LINE_HEIGHT-6, (LCD_SIZE_X-MENU_LINE_WIDTH-1)/2+1)) + +#define MENU_START_Y MENU_HEAD_LINE_HEIGHT +#define MENU_LIST_LEN ((LCD_SIZE_Y - MENU_HEAD_LINE_HEIGHT - MENU_BOTTOM_LINE_HEIGHT) / MENU_LINE_HEIGHT) + +#define MENU_SCROLLBAR_HEIGHT (MENU_LINE_HEIGHT*MENU_LIST_LEN-10-10-3) // [px] +//----------------------------------------------------------------------------- + + + +//----------------------------------------------------------------------------- +int menu_execentry(struct MENU_ENTRY *entry) +{ + unsigned int *val; + struct MENU *m; + + draw_block (0, 100, LCD_SIZE_X, 8, LCD_COLOR_B, DRAW_ERASE); + switch(entry->type) + { + case INTENTRY: + val = (unsigned int*)entry->data; + draw_block (0, 50, LCD_SIZE_X, 8, LCD_COLOR_B, DRAW_ERASE); + draw_hexW (0, 50, *val, LCD_COLOR_B, DRAW_PUT); + break; + case FUNCENTRY: + entry->exec(); + return 1; + break; + case MENUENTRY: + m = (MENU*)entry->data; + if(m->num_entries != 0) + { + menu_exec((MENU*)entry->data); + return 1; + } + break; + default: + break; + } + return 0; +} // menu_execentry +//----------------------------------------------------------------------------- + + + +//----------------------------------------------------------------------------- +void menu_exec(struct MENU *menu) +{ + unsigned char total; // entries in menu + unsigned char csel; // selected entry + + unsigned char moff; // first entry displayed + unsigned char moffold; // only used to detect change + + unsigned char set; // iterator for visible entries + + csel = 0; + moff = 0; + +again: + lcd_fill(0); + + //----------------------------------------- + // Menu head line + set_font(BOLDFONT); + draw_string (0, 0, (char*)menu->name, LCD_COLOR_B, DRAW_PUT); + draw_block (0, BOLDFONT_HEIGHT+2, LCD_SIZE_X, 2, LCD_COLOR_B, DRAW_PUT); + // Menu bottom line + draw_block (0, LCD_SIZE_Y-SMALLFONT_HEIGHT-3, LCD_SIZE_X, 2, LCD_COLOR_B, DRAW_PUT); + //----------------------------------------- + + total = menu->num_entries; + moffold = total; + + while(KEY_Exit) {}; + while(!KEY_Exit) + { + // draw list: initially or when selection is on next 'page' and all entries 'move' + if (moff!=moffold) + { + // menu list + set_font (MENU_FONT); + draw_block (0, MENU_START_Y, LCD_SIZE_X, MENU_LINE_HEIGHT*MENU_LIST_LEN, LCD_COLOR_B, DRAW_ERASE); + for (set=moff; (setentry [set].name, LCD_COLOR_B, DRAW_PUT); + } + // scroll arrows + if (moff) // not the first page + { + draw_arrow (MENU_LINE_WIDTH+1, MENU_START_Y+3, + ARROW_UP, MENU_ARROW_SIZE, LCD_COLOR_B, DRAW_PUT); + } + if (total > moff+MENU_LIST_LEN) // not the last page + { + draw_arrow (MENU_LINE_WIDTH+1, MENU_LINE_HEIGHT*MENU_LIST_LEN+7, + ARROW_DOWN, MENU_ARROW_SIZE, LCD_COLOR_B, DRAW_PUT); + } + // scroll handle + if (total > MENU_LIST_LEN) + { + draw_block (MENU_LINE_WIDTH+1, MENU_START_Y + 10 + (MENU_SCROLLBAR_HEIGHT/(total-1))*(csel), + 9, MENU_SCROLLBAR_HEIGHT/(total-1), + LCD_COLOR_DG, DRAW_PUT); + } + // select entry (invert) + draw_block (0, MENU_START_Y + ((csel-moff) * MENU_LINE_HEIGHT), + MENU_LINE_WIDTH, MENU_LINE_HEIGHT, LCD_COLOR_B, DRAW_XOR); + } + moffold = moff; + + //----------------------------------------- + // Menu bottom line + set_font (SMALLFONT); + draw_block ( 0, LCD_SIZE_Y-SMALLFONT_HEIGHT, LCD_SIZE_X, SMALLFONT_HEIGHT, LCD_COLOR_B, DRAW_ERASE); + + // entry number + draw_char (0, LCD_SIZE_Y-SMALLFONT_HEIGHT, '0' + (csel+1)/10, LCD_COLOR_B, DRAW_PUT); + draw_char (6, LCD_SIZE_Y-SMALLFONT_HEIGHT, '0' + (csel+1)%10, LCD_COLOR_B, DRAW_PUT); + + // entry help text + draw_string (16, LCD_SIZE_Y-SMALLFONT_HEIGHT, (char*)menu->entry [csel].help, LCD_COLOR_B, DRAW_PUT); + //----------------------------------------- + + // wait for key press + waitKeyUpDown(); + + // deselect current entry + draw_block (0, MENU_START_Y + ((csel-moff) * MENU_LINE_HEIGHT), + MENU_LINE_WIDTH, MENU_LINE_HEIGHT, LCD_COLOR_B, DRAW_XOR); + + // clear scroll handle + if (total > MENU_LIST_LEN) + draw_block (MENU_LINE_WIDTH+1, MENU_START_Y + 10 + (MENU_SCROLLBAR_HEIGHT/(total-1))*(csel), + 9, MENU_SCROLLBAR_HEIGHT/(total-1), + LCD_COLOR_DG, DRAW_XOR); + + if(KEY_OK) + { + if(menu_execentry((MENU_ENTRY*)&menu->entry[csel])) + goto again; + } + if(KEY_Up) + { + csel--; + if(csel= total) + { + if (total > MENU_LIST_LEN) + moff = total - MENU_LIST_LEN; + csel = total-1; + } + } + if(KEY_Down) + { + csel++; + if (csel == MENU_LIST_LEN+moff) + moff++; + if (csel == total) + { + moff = 0; + csel = 0; + } + } + if(KEY_Left) + { + csel = 0; + moff = 0; + } + if(KEY_Right) + { + csel = total -1; + if (total > MENU_LIST_LEN) + moff = total - MENU_LIST_LEN; + } + unsigned char num = getKeynum(); + if (num >= 16 && num <= 25) + { + csel = num - 16; + if (csel >= total) + csel = total-1; + if(csel < moff) + moff = csel; + if (csel >= MENU_LIST_LEN-moff) + moff = csel - MENU_LIST_LEN+1; + if(menu_execentry((MENU_ENTRY*)&menu->entry[csel])) + goto again; + } + + // select new entry (invert) + draw_block (0, MENU_START_Y + ((csel-moff) * MENU_LINE_HEIGHT), + MENU_LINE_WIDTH, MENU_LINE_HEIGHT, LCD_COLOR_B, DRAW_XOR); + + // scroll handle moved + if (total > MENU_LIST_LEN) + draw_block (MENU_LINE_WIDTH+1, MENU_START_Y + 10 + (MENU_SCROLLBAR_HEIGHT/(total-1))*(csel), + 9, MENU_SCROLLBAR_HEIGHT/(total-1), + LCD_COLOR_DG, DRAW_PUT); + } // while (!KEY_Exit) +} // menu_exec +//----------------------------------------------------------------------------- + + + +//----------------------------------------------------------------------------- +void init_menu(void) +{ +} +//----------------------------------------------------------------------------- + diff --git a/boop/trunk/gui/menu.h b/boop/trunk/gui/menu.h new file mode 100644 index 0000000..30f04b6 --- /dev/null +++ b/boop/trunk/gui/menu.h @@ -0,0 +1,50 @@ +/* + menu.h - menuing system + Copyright (C) 2007 Ch. Klippel + + 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 3 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 MENU_H +#define MENU_H + +#define NONE 0 +#define INTENTRY 1 +#define FUNCENTRY 2 +#define MENUENTRY 3 + +typedef void(*menu_fn)(void); + +typedef struct MENU_ENTRY +{ + menu_fn exec; + void *data; + unsigned char type; + char *name; + char *help; +} MENU_ENTRY; + +typedef struct MENU +{ + unsigned int num_entries; + struct MENU_ENTRY *entry; + char *name; +} MENU; + +void init_menu(void); + +void menu_exec(struct MENU *menu); +int menu_execentry(struct MENU_ENTRY *entry); + +#endif diff --git a/boop/trunk/gui/settingsmenu.c b/boop/trunk/gui/settingsmenu.c new file mode 100644 index 0000000..5f3f469 --- /dev/null +++ b/boop/trunk/gui/settingsmenu.c @@ -0,0 +1,196 @@ +/* + settingsmenue.c + Copyright (C) 2008 + + 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 3 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 "menu.h" +#include "settingsmenu.h" +#include "lcd.h" +#include "fonty.h" +#include "keyboard.h" +#include "rtc.h" +#include "ir_selector.h" +#include "backlight.h" +#include "bfs.h" +#include "rf.h" +#include "ir_capture.h" +#include "controls.h" +#include "global.h" + +extern volatile unsigned char bl_val; +extern unsigned int bl_timeout; +extern unsigned char bl_max; +extern unsigned char bl_speed; +unsigned char lcd_contrast; + +const struct MENU_ENTRY settingsMenuEntries[] = +{ + { change_clock, 0, FUNCENTRY, "Clock", "set time/date" }, + { RC_setting, 0, FUNCENTRY, "RC keys", "assign RC keys" }, + { display_setting, 0, FUNCENTRY, "Display", "backlight, contrast" }, + { RF_setting, 0, FUNCENTRY, "RF", "ID, channel" }, + { RAW_learnmenue, 0, FUNCENTRY, "IR learn", "Learn IR commands" }, +}; + +const struct MENU settingsMenu = +{ + 5, (MENU_ENTRY*)&settingsMenuEntries, "Settings" +}; + +const struct settings_ default_settings = +{ + 0x02, // version change this when modifying the struct + 63, // bl_max hardware limit of LCD controller + LCD_CONTRAST, + 2, // bl_speed; + 1000 // bl_timeout +}; + +// change handlers + +void brightness_onchange(FORM* form, CONTROL* control) { + bl_max=((NUMBOX*)control)->value; + setBacklight(bl_max); +} + +void timeout_onchange(FORM* form, CONTROL* control) { + bl_timeout=((NUMBOX*)control)->value * 200; + setBacklight(bl_max); +} + +void contrast_onchange(FORM* form, CONTROL* control) +{ + lcd_contrast = ((NUMBOX*)control)->value; + //~ lcd_set_contrast(0x3A); + lcd_set_contrast(lcd_contrast); +} + +void speed_onchange(FORM* form, CONTROL* control) +{ + bl_speed=((NUMBOX*)control)->value; + //~ setBLSpeed(bl_speed); +} + +// the submenus + +void display_setting(void) { + + const LABEL label1 = {BC_Labelnotab, 0,15,100,10,BOLDFONT,0,"Brightness",0}; + NUMBOX numbox1 = {BC_Numbox, 0,25, 13, 9,SMALLFONT,bl_val,0,63,brightness_onchange,NULL}; + const LABEL label2 = {BC_Labelnotab, 0,37,100,10,BOLDFONT,0,"Contrast",0}; + NUMBOX numbox2 = {BC_Numbox, 0,47, 19, 9,SMALLFONT,lcd_contrast,0,63,contrast_onchange,NULL}; + const LABEL label3 = {BC_Labelnotab, 0,59,100,10,BOLDFONT,0,"Backlight timeout",0}; + NUMBOX numbox3 = {BC_Numbox, 0,69, 19, 9,SMALLFONT,bl_timeout/200,1,200,timeout_onchange,NULL}; + const LABEL label4 = {BC_Labelnotab, 0,81,100,10,BOLDFONT,0,"Backlight fade time",0}; + NUMBOX numbox4 = {BC_Numbox, 0,91, 19, 9,SMALLFONT,bl_speed,1,6,speed_onchange,NULL}; + + CONTROL* controls[8] = { (CONTROL*)&label1, + (CONTROL*)&label2, + (CONTROL*)&label3, + (CONTROL*)&label4, + (CONTROL*)&numbox1, + (CONTROL*)&numbox2, + (CONTROL*)&numbox3, + (CONTROL*)&numbox4}; + + FORM form = {"Display settings"," ",0,0,0,0,controls,4,8,0,0}; + form_exec(&form); // controls.c + + // grayscale staircase test pattern for calibration + // form_exec->form_draw clears the screen + // either add this as a control or + // clear screen manually before form_exec + //~ draw_block ( 0, 80, 20, 20, LCD_COLOR_B, DRAW_PUT); + //~ draw_block (21, 80, 20, 20, LCD_COLOR_DG, DRAW_PUT); + //~ draw_block (42, 80, 20, 20, LCD_COLOR_LG, DRAW_PUT); +} + +void RF_setting(void) { + struct RFsettings_ RFsettings; + + BFS_LoadFile(BFS_ID_RFsettings, sizeof(struct RFsettings_), (unsigned char*) &RFsettings); + + const LABEL label1 = {BC_Labelnotab, 0,15,100,10,BOLDFONT,0,"Device address",0}; + NUMBOX numbox1 = {BC_Numbox, 0,25, 19, 9,SMALLFONT,RFsettings.address,1,127,NULL,NULL}; + const LABEL label2 = {BC_Labelnotab, 0,37,100,10,BOLDFONT,0,"Channel",0}; + NUMBOX numbox2 = {BC_Numbox, 0,47, 19, 9,SMALLFONT,RFsettings.channel,0,255,NULL,NULL}; + + CONTROL* controls[4] = { (CONTROL*)&label1, + (CONTROL*)&label2, + (CONTROL*)&numbox1, + (CONTROL*)&numbox2}; + + FORM form = {"RF settings"," ",0,0,0,0,controls,2,4,0,0}; + + form_exec(&form); + + RFsettings.address = numbox1.value; + RFsettings.channel = numbox2.value; + + BFS_SaveFile(BFS_ID_RFsettings, sizeof(struct RFsettings_), (unsigned char*) &RFsettings); + load_RF_setting(); +} + +// learned remotes +void load_RC_setting(void) { + + if(BFS_LoadFile(BFS_ID_remotes, sizeof(struct irDeviceTable_), (unsigned char*) &irDevTab) != sizeof(struct irDeviceTable_)) { + irDevTab = default_irDevTab; + BFS_SaveFile(BFS_ID_remotes, sizeof(struct irDeviceTable_), (unsigned char*) &irDevTab); + draw_string(0, 30, "default RC load", 3, DRAW_PUT); + } +} + +// load values stored in flash to ram +// called by main() for init +void load_setting(void) { + struct settings_ settings; + + BFS_LoadFile(BFS_ID_settings, sizeof(struct settings_), (unsigned char*) &settings); + + // if neccessary, use hard-coded defaults + if(settings.version != default_settings.version) + { + settings = default_settings; + BFS_SaveFile(BFS_ID_settings, sizeof(struct settings_), (unsigned char*) &settings); + draw_string(0, 40, "default settings load", 3, DRAW_PUT); + } + // backlight // TODO: see void initBacklight(void) in backlight.c) + bl_timeout = settings.bl_timeout; + bl_max = settings.bl_max; + setBacklight(bl_max); + bl_speed = settings.bl_speed; + + // LCD contrast + lcd_contrast = settings.lcd_contrast ; + lcd_set_contrast(lcd_contrast); +} + +// called by the parent menu +void enter_settings_menu(void) { + struct settings_ settings; + + // run menu + menu_exec((struct MENU *)&settingsMenu); + + // save changes + settings = default_settings; + settings.bl_timeout = bl_timeout; + settings.bl_max = bl_max; + settings.lcd_contrast = lcd_contrast; + settings.bl_speed = bl_speed; + BFS_SaveFile(BFS_ID_settings, sizeof(struct settings_), (unsigned char*) &settings); +} diff --git a/boop/trunk/gui/settingsmenu.h b/boop/trunk/gui/settingsmenu.h new file mode 100644 index 0000000..fde3564 --- /dev/null +++ b/boop/trunk/gui/settingsmenu.h @@ -0,0 +1,38 @@ +/* + settingsmenue.h + Copyright (C) 2008 + + 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 3 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 SETTINGSMENU_H +#define SETTINGSMENU_H + +extern const struct MENU settingsMenu; + +struct settings_ { + unsigned char version; + unsigned char bl_max; + unsigned char lcd_contrast; + unsigned char bl_speed; + unsigned int bl_timeout; +}; + +void RF_setting(void); +void display_setting(void); +void load_RC_setting(void); +void load_setting(void); +void enter_settings_menu(void); + +#endif diff --git a/boop/trunk/gui/testmenu.c b/boop/trunk/gui/testmenu.c new file mode 100644 index 0000000..792d712 --- /dev/null +++ b/boop/trunk/gui/testmenu.c @@ -0,0 +1,1247 @@ +/* + testmenu.c - testmenu for menuing system + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "menu.h" +#include "lcd.h" +#include "fonty.h" +#include "keyboard.h" +#include "backlight.h" +#include "adc.h" +#include "rf.h" +#include "flash.h" +#include "ir_raw.h" +#include "ir_capture.h" +#include "ir_selector.h" +#include "infrared.h" +#include "sid.h" +#include "timerfuncs.h" +#include "sound.h" +#include "lpc2220.h" +#include "controls.h" +#include "global.h" +#include "cc1100.h" +#include "rf.h" +#include "irq.h" +#include "serial.h" +#include "rtctimer.h" + +#include "icon.h" +#include "iconLeo_gray_128.h" + +#define TRANSPARENT_CROSS 1 // 0/1 +#if TRANSPARENT_CROSS +# include "iconCross_t.h" +# define ICON_CROSS iconCross_t +#else +# include "iconCross.h" +# define ICON_CROSS iconCross +#endif + +#include "iconHourglas.h" +#include "iconHourglas_t.h" + +//#include "sidfiles.h" + +extern volatile unsigned char bat_state; + +unsigned int testdata1, testdata2; + +#define MAX_SOFTMENU 16 + +void test_circle(void) +{ + lcd_fill (LCD_COLOR_W); + draw_disc (20, 20, 18, LCD_COLOR_B, DRAW_PUT); + draw_disc (20, 20, 14, LCD_COLOR_B, DRAW_XOR); + + draw_qdisc (60, 20, 18, 0, LCD_COLOR_B, DRAW_PUT); + draw_qdisc (60, 40, 18, 1, LCD_COLOR_B, DRAW_PUT); + draw_qdisc (60, 60, 18, 2, LCD_COLOR_B, DRAW_PUT); + draw_qdisc (60, 80, 18, 3, LCD_COLOR_B, DRAW_PUT); + + draw_qcircle (100, 20, 18, 0, LCD_COLOR_B, DRAW_PUT); + draw_qcircle (100, 40, 18, 1, LCD_COLOR_B, DRAW_PUT); + draw_qcircle (100, 60, 18, 2, LCD_COLOR_B, DRAW_PUT); + draw_qcircle (100, 80, 18, 3, LCD_COLOR_B, DRAW_PUT); + + + draw_circle (30,120,20, LCD_COLOR_B, DRAW_PUT); + + waitKeyUpDown(); +} + +void test_movearound(void) +{ + int xpos=0; + int ypos=0; + int oldx=0; + int oldy=0; + + lcd_fill (LCD_COLOR_W); + draw_disc (xpos+5, ypos+5, 5, LCD_COLOR_B, DRAW_PUT); + while (!KEY_Exit) + { + waitKeyUpDown(); + oldx=xpos; + oldy=ypos; + if (KEY_Up) + ypos -= 3; + if (KEY_Down) + ypos += 3; + if (KEY_Left) + xpos -= 3; + if (KEY_Right) + xpos += 3; + + if (xpos > 117) + xpos = 117; + if (xpos < 0) + xpos = 0; + if (ypos > 149) + ypos = 149; + if (ypos < 0) + ypos = 0; + + draw_disc (oldx+5, oldy+5, 5, LCD_COLOR_B, DRAW_ERASE); + draw_disc (xpos+5, ypos+5, 5, LCD_COLOR_B, DRAW_PUT); + } +} + + +void test_frame(void) +{ + lcd_fill (LCD_COLOR_W); + + draw_frame (0,0,40,40,4,0, LCD_COLOR_B, DRAW_PUT); + draw_frame (42,0,40,40,3,16, LCD_COLOR_B, DRAW_PUT); + draw_frame (84,0,40,40,7,3, LCD_COLOR_B, DRAW_PUT); + + + draw_frame (0,42,40,40,4,7, LCD_COLOR_B, DRAW_PUT); + draw_frame (42,42,40,40,4,8, LCD_COLOR_B, DRAW_PUT); + draw_frame (84,42,40,40,1,7, LCD_COLOR_B, DRAW_PUT); + + waitKeyUpDown(); +} + +void test_frame2(void) +{ + + unsigned char t, r; + t = 1; + r = 0; +again: + lcd_fill (LCD_COLOR_W); + + draw_string(0, 152, "t:", LCD_COLOR_B, DRAW_PUT); + draw_numU(12,152,t,0,LCD_COLOR_B,DRAW_PUT); + draw_string(64, 152, "r:", LCD_COLOR_B, DRAW_PUT); + draw_numU(76,152,r,0,LCD_COLOR_B,DRAW_PUT); + + draw_frame (0,0,LCD_SIZE_X,128,t,r, LCD_COLOR_B, DRAW_PUT); + + while(!KEY_Exit) + { + waitKeyUpDown(); + if(KEY_Vplus) + { + t++; + if(t>64) + t = 1; + goto again; + } + if(KEY_Vminus) + { + if(t==1) + t = 64; + else + t--; + goto again; + } + if(KEY_Pplus) + { + r++; + if(r>63) + r = 0; + goto again; + } + if(KEY_Pminus) + { + if(r==0) + r = 63; + else + r--; + goto again; + } + } +} + +#define DRAW_FONTS_LINESPACE 1 +#define DRAW_FONTS_XSTART 15 +void draw_fonts () +{ + unsigned short y = 10; + unsigned short h; + + lcd_fill (LCD_COLOR_W); +#if 0 + set_font (SMOOTHFONT); + draw_string (0, y, "ÜJ", LCD_COLOR_B, DRAW_PUT); + draw_string (15, y+1, "ÜJ", LCD_COLOR_B, DRAW_PUT); + draw_string (30, y+2, "ÜJ", LCD_COLOR_B, DRAW_PUT); + draw_string (45, y+3, "ÜJ", LCD_COLOR_B, DRAW_PUT); + draw_string (60, y+5, "ÜJ", LCD_COLOR_B, DRAW_PUT); + draw_string (75, y+6, "ÜJ", LCD_COLOR_B, DRAW_PUT); + draw_string (90, y+7, "ÜJ", LCD_COLOR_B, DRAW_PUT); + draw_string (105, y+8, "ÜJ", LCD_COLOR_B, DRAW_PUT); + y += 8; + y += SMOOTHFONT_HEIGHT + DRAW_FONTS_LINESPACE; +#endif + + set_font (SMALLFONT); + h = get_stringheight ("gÜJ"); + draw_block (0, y, DRAW_FONTS_XSTART-1, SMALLFONT_HEIGHT, LCD_COLOR_B, DRAW_PUT); + set_font (SMALLFONT); + draw_numU (1, y, h, 0, LCD_COLOR_B, DRAW_XOR); + set_font(SMALLFONT); + draw_string (DRAW_FONTS_XSTART, y, "Small Font", LCD_COLOR_B, DRAW_PUT); + y += SMALLFONT_HEIGHT + DRAW_FONTS_LINESPACE; + + set_font (DOUBLEFONT); + h = get_stringheight ("gÜJ"); + draw_block (0, y, DRAW_FONTS_XSTART-1, DOUBLEFONT_HEIGHT, LCD_COLOR_B, DRAW_PUT); + set_font (SMALLFONT); + draw_numU (1, y+1, h, 0, LCD_COLOR_B, DRAW_XOR); + set_font(DOUBLEFONT); + draw_string (DRAW_FONTS_XSTART, y, "Double Font", LCD_COLOR_B, DRAW_PUT); + y += DOUBLEFONT_HEIGHT + DRAW_FONTS_LINESPACE; + + set_font(BOLDFONT); + h = get_stringheight ("gÜJ"); + draw_block (0, y, DRAW_FONTS_XSTART-1, BOLDFONT_HEIGHT, LCD_COLOR_B, DRAW_PUT); + set_font (SMALLFONT); + draw_numU (1, y+1, h, 0, LCD_COLOR_B, DRAW_XOR); + set_font (BOLDFONT); + draw_string (DRAW_FONTS_XSTART, y, "Bold Font", LCD_COLOR_B, DRAW_PUT); + y += BOLDFONT_HEIGHT + DRAW_FONTS_LINESPACE; + + set_font (BOLDDOUBLEFONT); + h = get_stringheight ("gÜJ"); + draw_block (0, y, DRAW_FONTS_XSTART-1, BOLDDOUBLEFONT_HEIGHT, LCD_COLOR_B, DRAW_PUT); + set_font (SMALLFONT); + draw_numU (1, y+1, h, 0, LCD_COLOR_B, DRAW_XOR); + set_font(BOLDDOUBLEFONT); + draw_string (DRAW_FONTS_XSTART, y, "B.Double", LCD_COLOR_B, DRAW_PUT); + y += BOLDDOUBLEFONT_HEIGHT + DRAW_FONTS_LINESPACE; + + set_font (SMALLFONT); + h = get_stringheight ("gÜJ"); + draw_block (0, y+1, DRAW_FONTS_XSTART-1, SMALLFONT_HEIGHT, LCD_COLOR_B, DRAW_PUT); + set_font (SMALLFONT); + draw_numU (1, y+1, h, 0, LCD_COLOR_B, DRAW_XOR); + set_font (SMALLFONT); + draw_string (DRAW_FONTS_XSTART+1, y + 1, "Invers Small Font", LCD_COLOR_B, DRAW_PUT); + draw_block (DRAW_FONTS_XSTART, y, LCD_SIZE_X, SMALLFONT_HEIGHT+2, LCD_COLOR_B, DRAW_XOR); + y += SMALLFONT_HEIGHT + 2 + DRAW_FONTS_LINESPACE; + + set_font (SMOOTHFONT); + h = get_stringheight ("gÜJ"); + draw_block (0, y, DRAW_FONTS_XSTART-1, SMOOTHFONT_HEIGHT, LCD_COLOR_B, DRAW_PUT); + set_font (SMALLFONT); + draw_numU (1, y+1, h, 0, LCD_COLOR_B, DRAW_XOR); + set_font(SMOOTHFONT); + draw_string (DRAW_FONTS_XSTART, y, "Smooth Font", LCD_COLOR_B, DRAW_PUT); + y += SMOOTHFONT_HEIGHT + DRAW_FONTS_LINESPACE; + + set_font (SMOOTHFONT); + h = get_stringheight ("gÜJ"); + draw_block (0, y+1, DRAW_FONTS_XSTART-1, SMOOTHFONT_HEIGHT, LCD_COLOR_B, DRAW_PUT); + set_font (SMALLFONT); + draw_numU (1, y+2, h, 0, LCD_COLOR_B, DRAW_XOR); + set_font (SMOOTHFONT); + draw_string (DRAW_FONTS_XSTART+1, y + 1, "Invers Smooth", LCD_COLOR_B, DRAW_PUT); + draw_block (DRAW_FONTS_XSTART, y, LCD_SIZE_X, SMOOTHFONT_HEIGHT+2, LCD_COLOR_B, DRAW_XOR); + y += SMOOTHFONT_HEIGHT + 2 + DRAW_FONTS_LINESPACE; + + set_font(BOLDFONT); + waitKeyUpDown(); +} + +void test_logo(void) +{ + lcd_fill (LCD_COLOR_W); + draw_logo(); + waitKeyUpDown(); +} + + + +//----------------------------------------------------------------------------- +#undef ICON_INFO +#define ICON_INFO(i) + +#undef ICON_INFO_ELEMENT +#define ICON_INFO_ELEMENT + +#undef ICON +#define ICON iconElement_t + +#include "iconFr.h" +#include "iconPlay.h" +#include "iconPause.h" +#include "iconStop.h" +#include "iconFf.h" + +static const ICON* const iconList [] = +{ + &iconFr, + &iconPlay, + &iconPause, + &iconStop, + &iconFf +}; + +//----------------------------------------------------------------------------- +#define HOURGLAS_CENTER 120 +void test_DrawIcon (int x, int y, int h, int w) +{ + int i; + int ix; + + lcd_fill (LCD_COLOR_W); + + draw_block (LCD_SIZE_X / 2, LCD_SIZE_Y / 2, + 32, HOURGLAS_CENTER - LCD_SIZE_Y / 2 + 2, + LCD_COLOR_LG, DRAW_NORCU); + draw_block (LCD_SIZE_X / 2, HOURGLAS_CENTER, + 32, LCD_SIZE_Y - HOURGLAS_CENTER, LCD_COLOR_DG, DRAW_NORCU); + + drawIcon (0, 10, &iconLeo_gray_128, LCD_COLOR_B, DRAW_PUT); + + drawIcon (LCD_SIZE_X / 2 - iconHourglas.width / 2, HOURGLAS_CENTER - iconHourglas.height / 2, + &iconHourglas, LCD_COLOR_B, DRAW_PUT); + drawIcon (LCD_SIZE_X / 2 + 32 - iconHourglas_t.width / 2, HOURGLAS_CENTER - iconHourglas.height / 2, + &iconHourglas_t, LCD_COLOR_B, DRAW_ALPHA); + +#if TRANSPARENT_CROSS + drawIcon (x, y, &ICON_CROSS, LCD_COLOR_B, DRAW_ALPHA); +#else + drawIcon (x, y, &ICON_CROSS, LCD_COLOR_B, DRAW_PUT); +#endif + + //------------------------------------------------------- + ix = w; + for (i = 0; i < NUM_OF_ELEMENTS (iconList); i++) + { + drawIconExt (ix, LCD_SIZE_Y-1 - h, + iconList [i]->data, + iconList [i]->width, iconList [i]->height, ICON_GRAY, + LCD_COLOR_B, DRAW_NORCU); + ix += w + iconList [i]->width; + } + //------------------------------------------------------- + draw_numU (0, 0, + x, 0, LCD_COLOR_B, DRAW_NORCU); + draw_numU (30, 0, + y, 0, LCD_COLOR_B, DRAW_NORCU); +} // test_DrawIcon +//----------------------------------------------------------------------------- + + + +//----------------------------------------------------------------------------- +void test_icon () +{ + int i; + int x, y; + int w = 0; + int h = 0; + + set_font (SMALLFONT); + + x = LCD_SIZE_X / 2 - ICON_CROSS.width / 2; + y = LCD_SIZE_Y / 2 - ICON_CROSS.height / 2; + + for (i = 0; i < NUM_OF_ELEMENTS (iconList); i++) + { + w += iconList [i]->width; + h = max (h, iconList [i]->height); + } + w = LCD_SIZE_X - w; + w /= NUM_OF_ELEMENTS (iconList) + 1; + + test_DrawIcon (x, y, h, w); + + //waitKeyUpDown (); + + setBacklight (BL_AUTO); + while (KEY_Exit) {}; + waitKeyUp (); + while (1) + { + if (isKeyPressed ()) + { + setBacklight (BL_AUTO); // pwm value + if (KEY_Exit) + return; + //--------------------------------------- + + if (KEY_Up) + y--; + else if (KEY_Down) + y++; + else if (KEY_Left) + x--; + else if (KEY_Right) + x++; + else if (KEY_OK) + { + x += 10; + y -= 10; + } + else + { + unsigned char num = getKeynum (); + if (num >= 16 && num <= 25) + { + if (num == 25) + num = 0; + else + num -= 15; + + x += num; + y -= num; + } + } + + if (x >= LCD_SIZE_X) + x = 0; + else if (x < 0) + x = LCD_SIZE_X-1 - ICON_CROSS.width; + + if (y >= LCD_SIZE_Y) + y = 0; + else if (y < 0) + y = LCD_SIZE_Y-1 - ICON_CROSS.height; + + test_DrawIcon (x, y, h, w); + + //--------------------------------------- + waitKeyUp (); + } // if (isKeyPressed ()) + } // while (1) +} // test_icon +//----------------------------------------------------------------------------- + + + +void fp1 () +{ + unsigned char x,y; + lcd_fill (LCD_COLOR_W); + set_font(SMALLFONT); + + for(x=0;x<16;x++) + { + for(y=0;y<16;y++) + { + draw_char (x*8, (y*8)+16,x*16+y, LCD_COLOR_B, DRAW_PUT); + } + } + waitKeyUpDown(); +} + +extern volatile unsigned char bl_val; + +void set_bl(void) +{ + lcd_fill (LCD_COLOR_W); + set_font(SMALLFONT); + + draw_string (0, 20, "Set Backlight:", LCD_COLOR_B, DRAW_PUT); + draw_string (0, 30, "Prog/Vol+: brighter", LCD_COLOR_B, DRAW_PUT); + draw_string (0, 40, "Prog/Vol-: darker", LCD_COLOR_B, DRAW_PUT); + draw_numU (0, 64, bl_val, 0, LCD_COLOR_B, DRAW_PUT); + + while(!KEY_Exit) + { + waitKeyUpDown(); + bl_val &= 0x3F; + if(KEY_Pplus || KEY_Pminus || KEY_Vplus || KEY_Vminus) + { + draw_block(0,64,32,8,3,DRAW_ERASE); + if(KEY_Pplus) + bl_val++; + if(KEY_Pminus) + bl_val--; + if(KEY_Vplus) + bl_val+=10; + if(KEY_Vminus) + bl_val-=10; + draw_numU (0, 64, bl_val, 0, LCD_COLOR_B, DRAW_PUT); + } + } + +} + +/* +void softfunc1(void) +{ + set_font(BOLDFONT); +draw_block (0, 80, LCD_SIZE_X, 20, LCD_COLOR_B, DRAW_ERASE); +draw_string (0, 80, "softfunc1 called", LCD_COLOR_B, DRAW_PUT); +while(!KEY_Exit) {}; +} +*/ + +void draw_itile(unsigned char x, unsigned char y, unsigned char type) +{ +again: + if(type < 0xF0) + { + if(type & 0x10) + draw_block(x+1, y+1, 2, 2, 3, DRAW_XOR); + if(type & 0x20) + draw_block(x+5, y+1, 2, 2, 3, DRAW_XOR); + if(type & 0x40) + draw_block(x+1, y+5, 2, 2, 3, DRAW_XOR); + if(type & 0x80) + draw_block(x+5, y+5, 2, 2, 3, DRAW_XOR); + } + + type <<= 4; + + if(type) + { + x += 8; + goto again; + } +} + +const char itilemap[7][7] = +{ + { 0x00, 0x00, 0x00, 0x6C, 0x90, 0x00, 0x00 }, + { 0x00, 0x00, 0x66, 0x6C, 0x99, 0x90, 0x00 }, + { 0x00, 0x06, 0x66, 0x6C, 0x99, 0x99, 0x00 }, + { 0x00, 0x66, 0x66, 0x6C, 0x99, 0x99, 0x90 }, + { 0x00, 0x66, 0x66, 0x6C, 0x99, 0x99, 0x90 }, + { 0x06, 0x66, 0x66, 0x6C, 0x99, 0x99, 0x99 }, + { 0x0A, 0xAA, 0xAA, 0xA0, 0x55, 0x55, 0x55 } +}; + +void illusion(void) +{ + int x,y,z; + + lcd_fill (LCD_COLOR_W); + z = 1; + for(x=0;x<15;x++) + { + for(y=0;y<15;y++) + { + if(z++ & 0x01) + { + draw_block (2+ (x*8), 16+ (y*8), 8, 8, LCD_COLOR_B, DRAW_PUT); + } + } + } + + for(y=0;y<7;y++) + { + for(x=0;x<7;x++) + { + draw_itile(2+(x*16), 24+(y*8), itilemap[y][x]); + } + } + + for(y=0;y<6;y++) + { + for(x=0;x<7;x++) + { + draw_itile(2+(x*16), 80+(y*8), ~itilemap[5-y][x]); + } + } + + + waitKeyUpDown(); +} + +void test_bl(void) +{ + setBacklight(BL_AUTO); +} + +void bat_dbg(void) +{ + bat_state ^= BAT_DEBUG; +} + +void tkey(void) +{ + while(1) + { + waitKeyUpDown(); + setBacklight(BL_AUTO); + lcd_fill (LCD_COLOR_W); + set_font(SMALLFONT); + draw_hexW (0, 16, keys[0], LCD_COLOR_B, DRAW_PUT); + draw_hexW (0, 24, keys[1], LCD_COLOR_B, DRAW_PUT); + } +} + +// plot a graph RSSI/t +void RSSI_monitor(void) { + unsigned char row = 0; + int rssi_dBm; + unsigned char rssi; + volatile unsigned long timer = 0; + unsigned char x; + lcd_fill (LCD_COLOR_W); + + // title + set_font(BOLDFONT); + draw_string (0, 0, "RF test", LCD_COLOR_B, DRAW_PUT); + draw_block (0,10,LCD_SIZE_X,2, LCD_COLOR_B, DRAW_PUT); + set_font(SMALLFONT); + + RF_changestate(RFrx); + + // coordinate system + // x (time) + draw_block (19,20,102,1, LCD_COLOR_B, DRAW_PUT); + + // y (RSSI) + draw_block (19,20,1,129, LCD_COLOR_B, DRAW_PUT); // axis + for(x=20;x<150;x+=10) // ticks + draw_pixel (18,x, LCD_COLOR_B, DRAW_PUT); + for(x=20;x<160;x+=20) // value + draw_numU (0, x-3, x-20, 0, LCD_COLOR_B, DRAW_PUT); + draw_string (0,152, "-dBm", LCD_COLOR_B, DRAW_PUT); // label + + + while(KEY_Exit) {}; + while (!KEY_Exit) + { + // wait + while (timer) + { + if(KEY_Exit) + timer = 0; + } + addTimeout(&timer,20); // next sample in n*5 ms (100 ms) + + // read RSSI + VICIntEnClr = INT_EINT0; + rssi = cc1100_read1(RSSI); + VICIntEnable = INT_EINT0; + + // scale + if(rssi & 0x80) + rssi_dBm = (rssi-256)/2-75; + else + rssi_dBm = rssi/2-75; + + if(rssi_dBm < 0) + rssi_dBm = ~rssi_dBm + 1; + else + rssi_dBm = 0; + + // plot + draw_block (row+20,21,1,128, LCD_COLOR_B, DRAW_ERASE); + draw_pixel(row+20, rssi_dBm+30, LCD_COLOR_B, DRAW_PUT); + draw_pixel (row+20,19, LCD_COLOR_B,DRAW_ERASE); + + // next time + row++; + if(row == 100) + row=0; + draw_pixel (row+20, 19, LCD_COLOR_B, DRAW_PUT); + //draw_block (row+20,30,1,100, LCD_COLOR_B, DRAW_PUT); + } + removeTimeout(&timer); + RF_changestate(RFwor); +} + + +// plot incoming radio data in single shot mode +// CC1100 datasheet section 31.1 Asynchronous Operation, p. 57 +// 1 px is 50 ys +void RF_viewer(void) { + unsigned char row = 0; + unsigned char col = 16; + + lcd_fill (LCD_COLOR_W); + set_font(BOLDFONT); + draw_string (0, 0, "RF viewer", LCD_COLOR_B, DRAW_PUT); + draw_block (0,10,LCD_SIZE_X,2, LCD_COLOR_B, DRAW_PUT); + set_font(SMALLFONT); + + RFasyncmode(true); + + //cc1100_write1(FREQ2,0x20); + //cc1100_write1(FREQ1,0x29); + //cc1100_write1(FREQ0,0x3E); + + //cc1100_write1(AGCCTRL2,0x07); + //cc1100_write1(AGCCTRL1,0x00); + //cc1100_write1(AGCCTRL0,0x91); + //~ cc1100_write1(AGCCTRL2,0x03); + //~ cc1100_write1(AGCCTRL1,0x00); + //~ cc1100_write1(AGCCTRL0,0x92); + +//~ #define RF2UART + +#ifdef RF2UART + unsigned char bits=0; + unsigned char bitno=7; + + // set uart baudrate + serial_setbrg(230400); // fastest + + // set frequency + //~ cc1100_write1(FREQ2,0x10); + //~ cc1100_write1(FREQ1,0x12); + //~ cc1100_write1(FREQ0,0xF6); + + // set gain // OOK/ASK optima. see TI DN022 + //~ cc1100_write1(AGCCTRL2,0x07); // A + cc1100_write1(AGCCTRL2,0x03); // B + cc1100_write1(AGCCTRL1,0x00); + //~ cc1100_write1(AGCCTRL0,0x92); // A + cc1100_write1(AGCCTRL0,0x91); // B +#endif + + cc1100_strobe(SFRX); + cc1100_strobe(SRX); + + while(KEY_Exit) {}; + while(!KEY_Exit) + { +#ifdef RF2UART + //~ waitus(100); // 1 byte -> 10 bits / 115200 baud = 86,8 ys + waitus(50); // 1 byte -> 10 bits / 230400 baud = 43,4 ys + + if (!(FIOPIN0 & GDO2)) // get rf state as bit + bits |= (1< uart + { + bitno = 7; + serial_putbyte(bits); + bits = 0; + } + else + bitno--; // advance + +#else + waitus(50); + + draw_block(row,col,2,8,3,DRAW_ERASE); + + // plot: get data from CC1100's GDO2 on P0.24 (fast IO) + if((FIOPIN0 & GDO2)) + draw_pixel (row,col+2, LCD_COLOR_B, DRAW_PUT); + else + draw_pixel (row,col, LCD_COLOR_B, DRAW_PUT); + + // advance plot position + row++; + if(row == 127) + { + col +=8; + row=0; + + // screen is full, wait for keypress + if(col >140) + { + wait5ms(); + col = 16; + while(!(keys[0] || keys[1]));// && !(FIOPIN0 & GDO2)); // this seems strange, alternatives: while(!ANYKEY) or isKeyPressed + } + } +#endif + } + RFasyncmode(false); +} + + +void test_RF(void) { + + unsigned char destAddr; + + lcd_fill (LCD_COLOR_W); + destAddr = 0x01; + + set_font(BOLDFONT); + draw_string (0, 0, "RF test", LCD_COLOR_B, DRAW_PUT); + draw_block (0,10,LCD_SIZE_X,2, LCD_COLOR_B, DRAW_PUT); + draw_block (0,149,LCD_SIZE_X,2, LCD_COLOR_B, DRAW_PUT); + draw_string (1, 15, "Destination address", LCD_COLOR_B, DRAW_PUT); + set_font(SMALLFONT); + + draw_string (0, 60, "TV/Power Key:", LCD_COLOR_B, DRAW_PUT); + draw_string (0, 69, "send something", LCD_COLOR_B, DRAW_PUT); + draw_string (0, 86, "OK Key: Ping", LCD_COLOR_B, DRAW_PUT); + + draw_numU (1, 25, destAddr, 0, LCD_COLOR_B, DRAW_PUT); + + while(KEY_Exit) {}; + while(!KEY_Exit) + { + waitKeyUpDown(); + + + draw_numU (1, 25, destAddr, 0, LCD_COLOR_B, DRAW_XOR); + if(KEY_Left) { + destAddr--; + } + if(KEY_Right) { + destAddr++; + } + draw_numU (1, 25, destAddr, 0, LCD_COLOR_B, DRAW_XOR); + + + if(KEY_OK) + { + unsigned char ping; + draw_block (0,40,LCD_SIZE_X,10,3,DRAW_ERASE); + draw_string (0, 40, "send ping", LCD_COLOR_B, DRAW_PUT); + + ping = RF_sendping(destAddr); + + draw_block (0,40,LCD_SIZE_X,10,3,DRAW_ERASE); + if (ping) { + draw_string (0, 40, "ping received", LCD_COLOR_B, DRAW_PUT); + } + else { + draw_string (0, 40, "ping timeout", LCD_COLOR_B, DRAW_PUT); + } + + } + else if(KEY_Power) + { + struct RFendpoint_* cur_ep; + + cur_ep = openEP(0,0, packet_test); + if(cur_ep) { + cur_ep->dest = destAddr; + cur_ep->data[0] = 'P'; + cur_ep->data[1] = 'W'; + cur_ep->data[2] = 0x00; + cur_ep->bufferlen = 3; + cur_ep->flags |= EPenabled | EPoutput | EPnewdata | EPonce | EPsendwor; + + RF_changestate(RFtx); + } + } + else if(KEY_TV) + { + struct RFendpoint_* cur_ep; + + cur_ep = openEP(0,0, packet_test); + cur_ep->dest = destAddr; + cur_ep->data[0] = 'T'; + cur_ep->data[1] = 'V'; + cur_ep->data[2] = 0x00; + cur_ep->bufferlen = 3; + cur_ep->flags |= EPenabled | EPoutput | EPnewdata | EPonce | EPsendwor; + + RF_changestate(RFtx); + } + } +} + + +void test_irrec(void) { + + struct RAWcmd_ test_cmd; + + test_cmd.tval = 0; + + lcd_fill (LCD_COLOR_W); + + set_font(BOLDFONT); + draw_string (0, 0, "IR receive test", LCD_COLOR_B, DRAW_PUT); + draw_block (0,10,LCD_SIZE_X,2, LCD_COLOR_B, DRAW_PUT); + draw_block (0,149,LCD_SIZE_X,2, LCD_COLOR_B, DRAW_PUT); + set_font(SMALLFONT); + + draw_string (0, 20, "OK Key:", LCD_COLOR_B, DRAW_PUT); + draw_string (0, 29, "receive IR command", LCD_COLOR_B, DRAW_PUT); + + draw_string (0, 40, "Mute Key:", LCD_COLOR_B, DRAW_PUT); + draw_string (0, 49, "send received command", LCD_COLOR_B, DRAW_PUT); + + while(KEY_Exit) {}; + while(!KEY_Exit) + { + waitKeyUpDown(); + if(KEY_OK) + { + getIR_test(&test_cmd); + } + if(KEY_Mute) + { + RAW_Send((unsigned long)&test_cmd); + while(KEY_Mute) + RAW_Repeat(); + RAW_Stop(); + } + } + setEncoder(irDevTab.device[irDevTab.active].encoder, irDevTab.device[irDevTab.active].set); +} + +void erase_flash1(void) +{ int x; + + x = eraseFlash(1); + +} + +void test_sid(void) { + unsigned char temp; + + lcd_fill (LCD_COLOR_W); + + set_font(BOLDFONT); + draw_string (0, 0, "SID", LCD_COLOR_B, DRAW_PUT); + draw_block (0,10,LCD_SIZE_X,2, LCD_COLOR_B, DRAW_PUT); + draw_block (0,149,LCD_SIZE_X,2, LCD_COLOR_B, DRAW_PUT); + set_font(SMALLFONT); + + draw_string (0, 20, "A B C D", LCD_COLOR_B, DRAW_PUT); + draw_string (0, 29, "set envelope", LCD_COLOR_B, DRAW_PUT); + + draw_string (0, 45, "OK", LCD_COLOR_B, DRAW_PUT); + draw_string (0, 54, "play a song", LCD_COLOR_B, DRAW_PUT); + + draw_string (0, 70, "1-7", LCD_COLOR_B, DRAW_PUT); + draw_string (0, 79, "play a note", LCD_COLOR_B, DRAW_PUT); + + draw_string (0, 95, "color keys", LCD_COLOR_B, DRAW_PUT); + draw_string (0, 104, "set waveform", LCD_COLOR_B, DRAW_PUT); + + sysInfo |= SYS_IR; + SID.noise = 0xaa; + playstate = 0x00; + playtone[0] = 0; + playtone[1] = 0; + playtone[2] = 0; + temp = 0; + PWMPR = 0; + switchSound(SOUND_ON); + SID.flags |= SIDenable; + SIDsetwave(0,TRIANGLE); + SIDsetadsr(0,8,8,10,8); + + while(KEY_Exit) {}; + do { + waitKeyUp(); + if (temp) + { + SID.reg[REG_Control] &= ~GATE; + temp = 0; + } + waitKeyDown(); + if (KEY_1) + { + SIDsetfrq(0,4455); + SID.reg[REG_Control] |= GATE; + temp =1; + } + else if (KEY_2) + { + SIDsetfrq(0,5001); + SID.reg[REG_Control] |= GATE; + temp =1; + } + else if (KEY_3) + { + SIDsetfrq(0,5613); + SID.reg[REG_Control] |= GATE; + temp =1; + } + else if (KEY_4) + { + SIDsetfrq(0,5947); + SID.reg[REG_Control] |= GATE; + temp =1; + } + else if (KEY_5) + { + SIDsetfrq(0,6676); + SID.reg[REG_Control] |= GATE; + temp =1; + } + else if (KEY_6) + { + SIDsetfrq(0,7493); + SID.reg[REG_Control] |= GATE; + temp =1; + } + else if (KEY_7) + { + SIDsetfrq(0,8411); + SID.reg[REG_Control] |= GATE; + temp =1; + } + else if (KEY_A) + { + SIDsetadsr(0,0,10,7,5); + } + else if (KEY_B) + { + SIDsetadsr(0,0,10,0,10); + } + else if (KEY_C) + { + SIDsetadsr(0,8,8,10,6); + } + else if (KEY_D) + { + SIDsetadsr(0,0,0,15,1); + } + else if (KEY_Red) + { + SIDsetwave(0,TRIANGLE); + } + else if (KEY_Green) + { + SIDsetwave(0,SAWTOOTH); + } + else if (KEY_Yellow) + { + SID.reg[REG_PWhi] = 0x08; + SIDsetwave(0,RECTANGLE); + } + else if (KEY_Blue) + { + SIDsetwave(0,NOISE); + } + else if (KEY_OK) + { + if (playstate == 0) + { + playstate = 1; + + SIDsetadsr(1,0,5,0,5); + SIDsetwave(1,SAWTOOTH); + SID.reg[7+REG_PWhi] = 0x06; + tonelen[1] = 0; + playtone[1] = (unsigned char*)&song3[0]; + + SIDsetadsr(2,0,9,0,9); + SIDsetwave(2,RECTANGLE); + SID.reg[14+REG_PWhi] = 0x08; + tonelen[2] = 0; + playtone[2] = (unsigned char*)&song2[0]; + + playtone_cb = addTimerCB(SIDplaytone, 4); + startCB(playtone_cb); + } + } + } while (!KEY_Exit); + sysInfo &= ~SYS_IR; + switchSound(SOUND_OFF); + SID.flags &= ~SIDenable; +} + +void test_click(FORM* form, CONTROL* control) { + unsigned char x; + x=msgbox(45,BC_OKOnly | BC_DefaultButton1,control->caption); + form_draw(form); +} + +void test2_click(FORM* form, CONTROL* control) { + beep(0); +} + +void test3_click(FORM* form, CONTROL* control) { + beep(1); +} + +void test_numbox(FORM* form, CONTROL* control) { + unsigned char x; + x=msgbox(30,BC_OKOnly | BC_DefaultButton1,"numbox click"); + form_draw(form); +} + +void test_numchange(FORM* form, CONTROL* control) { + unsigned short x; + x=((NUMBOX*)control)->value; + if(x==50) { + x=msgbox(30,BC_OKOnly | BC_DefaultButton1,"numbox =50"); + form_draw(form); + } +} + +void test_change(FORM* form, CONTROL* control) { + unsigned short x; + x=msgbox(30,BC_OKOnly | BC_DefaultButton1,"geaendert"); + form_draw(form); +} + +void formload (FORM* form) +{ + unsigned char x; + struct RFendpoint_* cur_ep; + + cur_ep = openEP(&(form->controls[7])->tag1, 1, packet_RFenc); + form->tag = (unsigned long) cur_ep; + if (cur_ep) + { + cur_ep->flags |= EPenabled; + RF.flags &= ~WORenabled; + RF_changestate(RFrx); + } + + x=msgbox(50,BC_OKOnly | BC_DefaultButton1,"Form open"); +} + +void formclose (FORM* form) +{ + unsigned char x; + + if (form->tag) + { + closeEP((struct RFendpoint_*)form->tag); + RF_changestate(RFwor); + } + + x=msgbox(50,BC_OKOnly | BC_DefaultButton1,"Form close"); + +} + +void test_timer (FORM* form) +{ + struct RFendpoint_* cur_ep; + + cur_ep = (struct RFendpoint_*)form->tag; + if (cur_ep->flags & EPnewdata) + { + cur_ep->flags &= ~EPnewdata; + control_draw(form->controls[7], (form->sel == 7)); + } +} + +void test_controls(void) { + + const char* listbox1items[5] = { "Listitem1", + "Listitem2", + "Listitem3", + "Listitem4", + "Listitem555"}; + + char txtbuffer[20]; + const LABEL label1 = {BC_Label,0,15,40,10,SMALLFONT,0,"label1",test_click}; + const LABEL label2 = {BC_Labelnotab,50,15,40,9,BOLDFONT,0,"label2",0}; + const LABEL label3 = {BC_Labelnotab,0,110,40,9,BOLDFONT,0,"Numbox:",0}; + const BUTTON button1 = {BC_Button,0,30,40,15,SMALLFONT,0,"Button1",test_click}; + const BUTTON button2 = {BC_Button,0,50,40,16,SMALLFONT,0,"Button2",test2_click}; + const BUTTON button3 = {BC_Button,0,70,40,16,SMALLFONT,0,"Button3",test3_click}; + const BUTTON button4 = {BC_Button | BC_Disabled,0,90,40,16,SMALLFONT,0,"Button4",test_click}; + NUMBOX numbox1 = {BC_Numbox,0,120,20,9,SMALLFONT,1,1,500,test_numbox,test_numchange}; + TXTBOX txtbox1 = {BC_Txtbox,0,135,120,10,SMALLFONT,20,0,txtbuffer,test_click,test_change}; + DATEBOX datebox1 = {BC_Datebox,50,30,58,9,SMALLFONT,0,{0x01, 0x02, 0x01, 0x08},NULL,test_change}; + TIMEBOX timebox1 = {BC_Timebox,50,50,58,9,SMALLFONT,0,{0x00, 0x00, 0x12, 0x00},NULL,test_change}; + LISTBOX listbox1 = {BC_Listbox,50,70,58,10,SMALLFONT,0,5,(char**)listbox1items,NULL,test_change}; + + CONTROL* controls[12] = { (CONTROL*)&label1, + (CONTROL*)&label2, + (CONTROL*)&label3, + (CONTROL*)&button1, + (CONTROL*)&button2, + (CONTROL*)&button3, + (CONTROL*)&button4, + (CONTROL*)&numbox1, + (CONTROL*)&txtbox1, + (CONTROL*)&datebox1, + (CONTROL*)&timebox1, + (CONTROL*)&listbox1}; + + FORM form = {"Controls","footer\tTab\tTab",formload,formclose,test_timer,0,controls,3,12,0,10}; + memcpy(txtbuffer,"Textbox",8); + + form_exec(&form); + +} + +/* +struct MENU_ENTRY softMenuEntries[16]; +struct MENU softMenu; +*/ + +const struct MENU_ENTRY testMenuEntries[] = +{ + {RTCtimer_edit, 0, FUNCENTRY, "Timer", "Timer" }, + {test_icon, 0, FUNCENTRY, "Icon Demo", "Draw icons" }, + {test_irrec, 0, FUNCENTRY, "Receive IR", "Receive IR" }, + {test_RF, 0, FUNCENTRY, "RF test", "Test RF" }, + {RSSI_monitor, 0, FUNCENTRY, "RSSI Monitor", "RSSI Monitor" }, + {RF_viewer, 0, FUNCENTRY, "RF viewer", "RF viewer" }, + {test_circle, 0, FUNCENTRY, "Circle", "Draw circles" }, + {test_controls, 0, FUNCENTRY, "Controls", "Control elements" }, + {test_frame, 0, FUNCENTRY, "Frame", "Draw frame" }, + {test_frame2, 0, FUNCENTRY, "Frame2", "Draw frame2" }, + {draw_fonts, 0, FUNCENTRY, "Fonts", "Draw fonts" }, + {test_logo, 0, FUNCENTRY, "Logo", "Draw logo" }, + {fp1, 0, FUNCENTRY, "Charset", "Draw charset" }, + {illusion, 0, FUNCENTRY, "Illusion", "Optical illusion" }, + {test_bl, 0, FUNCENTRY, "Auto backlight", "Test auto backlight" }, + {bat_dbg, 0, FUNCENTRY, "Bat debug", "Show/hide bat values"}, + {tkey, 0, FUNCENTRY, "Keytest", "Test keypad" }, + {erase_flash1, 0, FUNCENTRY, "Erase Flash1", "Erase Flash1" }, + {test_sid, 0, FUNCENTRY, "Sound", "Play music" }, + {test_movearound, 0, FUNCENTRY, "Move", "Slowly move a cursor"}, +// { 0, (void*)&softMenu, MENUENTRY, "Soft-Test", "access soft" } +}; + +const struct MENU testMenu = +{ + NUM_OF_ELEMENTS (testMenuEntries), (MENU_ENTRY*)&testMenuEntries, "Test Menu" +}; + +/* +void testmenu_init(void) +{ + testdata1 = 0; + testdata2 = 0; + + for(i=0;i<16;i++) + { + softMenuEntries[i].exec = 0; + softMenuEntries[i].data = 0; + softMenuEntries[i].type = 0; + softMenuEntries[i].name = 0; + softMenuEntries[i].help = 0; + } + + softMenuEntries[0].exec = softfunc1; + softMenuEntries[0].data = 0; + softMenuEntries[0].type = FUNCENTRY; + softMenuEntries[0].name = "softfunc test"; + softMenuEntries[0].help = "run softfunc test"; + + + softMenu.name = "Soft Menu"; + softMenu.num_entries = 1; + softMenu.entry = softMenuEntries; + +} +*/ + diff --git a/boop/trunk/gui/testmenu.h b/boop/trunk/gui/testmenu.h new file mode 100644 index 0000000..79f990e --- /dev/null +++ b/boop/trunk/gui/testmenu.h @@ -0,0 +1,26 @@ +/* + testmenu.h - testmenu for menuing system + Copyright (C) 2007 Ch. Klippel + + 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 3 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 TESTMENU_H +#define TESTMENU_H + +extern struct MENU testMenu; +//void testmenu_init(void); +void test_irrec(void); + +#endif diff --git a/boop/trunk/infrared/Make.conf b/boop/trunk/infrared/Make.conf new file mode 100644 index 0000000..2a1fa32 --- /dev/null +++ b/boop/trunk/infrared/Make.conf @@ -0,0 +1,5 @@ +THUMBSRCS := infrared.c codes.c encoders.c ir_capture.c ir_selector.c +SRCS := infraredirq.c +THUMBSRCSUNOPT := ir_itt.c ir_nrc17.c \ + ir_raw.c ir_rc5.c ir_rc6.c ir_rca.c ir_rcmm.c ir_rec80.c ir_recs80.c ir_rf.c \ + ir_sirc.c ir_spaceenc.c ir_lirc.c diff --git a/boop/trunk/infrared/codes.c b/boop/trunk/infrared/codes.c new file mode 100644 index 0000000..f30c7ad --- /dev/null +++ b/boop/trunk/infrared/codes.c @@ -0,0 +1,264 @@ +/* + codes.c - structs for accessing the infrared-codetables + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "codes.h" +#include "ir_lirc.h" + +const struct TABLES_S ITT = +{ + 4, + { + { + #include "ir_codes/itt/seleco_019" + "Seleco #19" + }, + { + #include "ir_codes/itt/seleco_049" + "Seleco #49" + }, + { + #include "ir_codes/itt/seleco_108" + "Seleco #108" + }, + { + #include "ir_codes/itt/seleco_131" + "Seleco #131" + }, + } +}; + +const struct TABLES_S NRC17 = +{ + 2, + { + { + #include "ir_codes/nrc17/dbox2" + "DBox 2" + }, + { + #include "ir_codes/nrc17/grundig_tp720" + "Grundig TP720" + } + } +}; + + +#define RC5_STD(cmd) 0x1000 | cmd +#define RC5X(cmd) cmd + +const struct TABLES_S RC5 = +{ + 3, + { + { + #include "ir_codes/rc5/tv" + "Generic TV" + }, + { + #include "ir_codes/rc5/HARMONY_655" + "Logitec Harmony" + }, + { + #include "ir_codes/rc5/technisat_satreceiver_103TS103" + "SAT(103TS103)" + } + } +}; + +const struct TABLES_I RC6 = +{ + 3, + { + { + #include "ir_codes/rc6/tv" + "RC6 TV" + }, + { + #include "ir_codes/rc6/dvd" + "RC6 DVD" + }, + { + #include "ir_codes/rc6/ufs922" + "UFS 922" + } + } +}; + +const struct TABLES_C RCA = +{ + 1, + { + { + #include "ir_codes/rca/xbox" + "X-Box" + } + } +}; + +const struct TABLES_I RCMM = +{ + 2, + { + { + #include "ir_codes/rcmm/galaxis" + "Galaxis Sat" + }, + { + #include "ir_codes/rcmm/ufs910" + "UFS 910" + } + } +}; + +const struct TABLES_I REC80 = +{ + 1, + { + { + #include "ir_codes/rec80/rak_sc957wk" + "RAK SC-957-WK" + } + } +}; + +const struct TABLES_S RECS80 = +{ + 2, + { + { + #include "ir_codes/recs80/seleco_020" + "seleco#20" + }, + { + #include "ir_codes/recs80/seleco_157" + "Seleco #157" + } + } +}; + +const struct TABLES_S SIRC = +{ + 3, + { + { + #include "ir_codes/sirc/rm-pp411" + "RM-PP411" + }, + { + #include "ir_codes/sirc/tv" + "Generic TV" + }, + { + #include "ir_codes/sirc/UFD400" + "Katrein UFD400" + } + } +}; + +const struct TABLES_C SPACEENC = +{ + 2, + { + { + #include "ir_codes/spaceenc/schneider_dtv3" + "Schneider DTV3" + }, + { + #include "ir_codes/spaceenc/seleco_027" + "Seleco #27" + } + } +}; + +const struct TABLES_S IRRF = +{ + 2, + { + { + #include "ir_codes/rf/cc1100_a0" + "RF 0" + }, + { + #include "ir_codes/rf/cc1100_a1" + "RF 1" + } + } +}; + +const struct TABLES_N RAW = +{ + 4, + { + { + "RAW Set 1" + }, + { + "RAW Set 2" + }, + { + "RAW Set 3" + }, + { + "RAW Set 4" + } + + } +}; + +const struct TABLES_L LIRC = +{ + 9, + { + { + #include "ir_codes/lirc/ufs922" + "UFS 922" + }, + { + #include "ir_codes/lirc/str_de545" + "STR-DE545" + }, + { + #include "ir_codes/lirc/ufs910" + "UFS 910" + }, + { + #include "ir_codes/lirc/fs20" + "FS20" + }, + { + #include "ir_codes/lirc/hx2262" + "HX2262" + }, + { + #include "ir_codes/lirc/rev008340" + "REV 008340" + }, + { + #include "ir_codes/lirc/olympus_rm-1" + "Olympus RM-1" + }, + { + #include "ir_codes/lirc/apple_remote1" + "Apple Remote 1st gen." + }, + { + #include "ir_codes/lirc/samsung_ue46b6000" + "Samsung TV" + } + } +}; diff --git a/boop/trunk/infrared/codes.h b/boop/trunk/infrared/codes.h new file mode 100644 index 0000000..8188a03 --- /dev/null +++ b/boop/trunk/infrared/codes.h @@ -0,0 +1,111 @@ +/* + codes.h - structs for accessing the infrared-codetables + Copyright (C) 2007 Ch. Klippel + + 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 3 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 CODES_H +#define CODES_H + +typedef struct CODE_TABLE_C +{ + const unsigned char codes[42]; + const char *name; +} CODE_TABLE_C; + +typedef struct CODE_TABLE_S +{ + const unsigned short codes[42]; + const char *name; +} CODE_TABLE_S; + +typedef struct CODE_TABLE_I +{ + const unsigned int codes[42]; + const char *name; +} CODE_TABLE_I; + +typedef struct CODE_TABLE_N +{ + const char *name; +} CODE_TABLE_N; + +typedef struct CODE_TABLE_L +{ + const unsigned long pre_data; // data which the remote sends before actual keycode + const unsigned long post_data; // data which the remote sends after actual keycode + const unsigned long long toggle_bit_mask; // toggle_bit + const unsigned long gap; // time between signals + const unsigned long repeat_gap; // time between two repeat codes + const unsigned char bits; // bits (length of code) + const unsigned char pre_data_bits; // length of pre_data + const unsigned char post_data_bits; // length of post_data + const unsigned char rc6_bit; // doubles signal length of this bit (only used for RC-6) + const unsigned long freq; // modulation frequency + const unsigned short flags; // flags + const unsigned short phead,shead; // header + const unsigned short pthree,sthree; // 3 (only used for RC-MM) + const unsigned short ptwo,stwo; // 2 (only used for RC-MM) + const unsigned short pone,sone; // 1 + const unsigned short pzero,szero; // 0 + const unsigned short plead; // leading pulse + const unsigned short ptrail; // trailing pulse + const unsigned short pfoot,sfoot; // foot + const unsigned short pre_p,pre_s; // signal between pre_data and keycode + const unsigned short post_p, post_s; // signal between keycode and post_code + const unsigned short prepeat,srepeat; // indicate repeating + const unsigned char min_repeat; // code is repeated at least x times code sent once -> min_repeat=0 + const unsigned char duty_cycle; // 0 + + 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 3 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 "ir_itt.h" +#include "ir_nrc17.h" +#include "ir_rc5.h" +#include "ir_rc6.h" +#include "ir_rca.h" +#include "ir_rcmm.h" +#include "ir_rec80.h" +#include "ir_recs80.h" +#include "ir_sirc.h" +#include "ir_spaceenc.h" +#include "ir_rf.h" +#include "ir_raw.h" +#include "ir_lirc.h" +#include "encoders.h" +#include "codes.h" + +const struct ENCODERS encoders = +{ + 13, + { + { ITT_Init, (void*)&ITT, 1, "ITT\0" }, + { NRC17_Init, (void*)&NRC17, 1, "NRC17\0" }, + { RC5_Init, (void*)&RC5, 1, "RC-5\0" }, + { RC6_Init, (void*)&RC6, 2, "RC-6\0" }, + { RCA_Init, (void*)&RCA, 0, "RCA\0" }, + { RCMM_Init, (void*)&RCMM, 2, "RC-MM\0" }, + { REC80_Init, (void*)&REC80, 2, "REC-80\0" }, + { RECS80_Init, (void*)&RECS80, 1, "RECS-80\0" }, + { SIRC_Init, (void*)&SIRC, 1, "SIRC\0" }, + { SPACEENC_Init,(void*)&SPACEENC, 0, "SPACEENC\0" }, + { IRRF_Init, (void*)&IRRF, 1, "RF\0" }, + { RAW_Init, (void*)&RAW, 3, "learn" }, + { LIRC_Init, (void*)&LIRC, 4, "LIRC" } + } +}; diff --git a/boop/trunk/infrared/encoders.h b/boop/trunk/infrared/encoders.h new file mode 100644 index 0000000..194a716 --- /dev/null +++ b/boop/trunk/infrared/encoders.h @@ -0,0 +1,65 @@ +/* + encoders.h - structs for accessing the infrared-encoders + Copyright (C) 2007 Ch. Klippel + + 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 3 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 ENCODERS_H +#define ENCODERS_H + +#define ENC_ITT 0 +#define ENC_NRC17 1 +#define ENC_RC5 2 +#define ENC_RCA 3 +#define ENC_RCMM 4 +#define ENC_REC80 5 +#define ENC_RECS80 6 +#define ENC_SIRC 7 +#define ENC_SPACEENC 8 +#define ENC_RF 9 +#define ENC_RAW 10 +#define ENC_LIRC 11 + +typedef void(*cfunc)(unsigned char); + +typedef struct IR_ENCODER +{ + const cfunc init; + const void* data; + const unsigned char type; + const char *name; +} IR_ENCODER; + +typedef struct ENCODERS +{ + const unsigned int num_encoders; + const struct IR_ENCODER encoder[]; +} ENCODERS; + +extern const struct TABLES_S ITT; +extern const struct TABLES_S NRC17; +extern const struct TABLES_S RC5; +extern const struct TABLES_I RC6; +extern const struct TABLES_C RCA; +extern const struct TABLES_I RCMM; +extern const struct TABLES_I REC80; +extern const struct TABLES_S RECS80; +extern const struct TABLES_S SIRC; +extern const struct TABLES_C SPACEENC; +extern const struct TABLES_S IRRF; +extern const struct TABLES_N RAW; +extern const struct TABLES_L LIRC; + +#endif diff --git a/boop/trunk/infrared/infrared.c b/boop/trunk/infrared/infrared.c new file mode 100644 index 0000000..e0ac240 --- /dev/null +++ b/boop/trunk/infrared/infrared.c @@ -0,0 +1,177 @@ +/* + infrared.c - ir carrier generation and encoding core + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "global.h" +#include "infrared.h" +#include "infraredirq.h" +#include "irq.h" +#include "lpc2220.h" +#include "keyboard.h" +#include "encoders.h" +#include "codes.h" +#include "ir_selector.h" + +volatile unsigned char mod_enable; +volatile unsigned char hi_border; +volatile unsigned char lo_border; +volatile unsigned int cycles; +volatile unsigned long keyMap[42]; + +ir_fn irEncoder; +ir_sfn irSend; +ir_fn irRepeat; +ir_fn irStop; + +unsigned char act_encoder, act_set; + +const struct irModule defModule = { defIR, defSender, defRepeater, defStopper, 50, 1, 4 }; +void dummy(void) +{ + irStop = RC_setting; //make compiler happy for select_ir in mainmenu +} + +void initIR(void) +{ +// irStop = select_ir; //make compiler happy for select_ir in mainmenu + setIR(defModule); +} + +void startIrIRQ(void) +{ + + T1TCR = 0x03; + T1TC = 0; + T1PC = 0; + T1PR = 0x00; +// T1PR = 0x01; + T1MCR = 0x03; + + //VICVectAddr1 = (unsigned long)&(irIRQ); + //VICVectCntl1 = VIC_SLOT_EN | INT_SRC_TIMER1; + VICIntSelect |= INT_TIMER1; + VICIntEnable = INT_TIMER1; +} + +void setIR(struct irModule module) +{ + T1TCR = 0x02; + irEncoder = module.encoder; + irSend = module.sender; + irRepeat = module.repeater; + irStop = module.stopper; +// setIRspeed(module); + T1MR0 = module.tval; + hi_border = module.hi_border; + lo_border = module.lo_border; + cycles = 100; + ir.state = 0x00; + ir.actcmd = 0; + ir.cmd = 0; + T1TCR = 0x03; +} +/* Stubs for various interrupts (may be replaced later) */ +/* ---------------------------------------------------- */ + +void __attribute__ ((section(".text.fastcode"))) defIR(void) +{ + return; +} + +void defSender(unsigned long cmd) +{ + return; +} + +void defRepeater(void) +{ + return; +} +void defStopper(void) +{ + return; +} + +void runIR(void) +{ + T1TCR = 0x01; +} + +void stopIR(void) +{ + T1TCR = 0x03; +} + +void copyMapC(unsigned char *map) +{ + int x; + for(x=0;x<42;x++) + { + keyMap[x] = map[x]; + } +} + +void copyMapPC(unsigned int pre, unsigned char *map) +{ + int x; + for(x=0;x<42;x++) + { + if(map[x] != 0) + keyMap[x] = pre | map[x]; + else + keyMap[x] = 0x00000000; + } +} + +void copyMapS(unsigned short *map) +{ + int x; + for(x=0;x<42;x++) + { + keyMap[x] = map[x]; + } +} + +void copyMapI(unsigned int *map) +{ + int x; + for(x=0;x<42;x++) + { + keyMap[x] = map[x]; + } +} + +unsigned long setEncoder( unsigned char x, unsigned char y ) +{ + if(EncIsValid(x,y)) { + act_encoder = x; + act_set = y; + encoders.encoder[act_encoder].init(act_set); + return(1); + } + return(0); +} + +unsigned long getCode(void) { + + int keynum = getKeynum(); + + if (keynum < 42) + return keyMap[keynum]; + else + return 0xFFFFFFFF; +} diff --git a/boop/trunk/infrared/infrared.h b/boop/trunk/infrared/infrared.h new file mode 100644 index 0000000..b10991e --- /dev/null +++ b/boop/trunk/infrared/infrared.h @@ -0,0 +1,123 @@ +/* + infrared.h - ir carrier generation and encoding core + Copyright (C) 2007 Ch. Klippel + + 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 3 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 INFRARED_H +#define INFRARED_H + +volatile unsigned char hi_border; +volatile unsigned char lo_border; + +typedef void(*ir_fn)(void); +typedef void(*ir_sfn)(unsigned long cmd); + +typedef struct irModule +{ + ir_fn encoder; + ir_sfn sender; + ir_fn repeater; + ir_fn stopper; + unsigned char tval; + unsigned char hi_border; + unsigned char lo_border; +} irModule; + +struct IR_VARS_ { + union { + struct IR_GENERAL_ { //63 Bytes + unsigned int header_cmd; + unsigned int startstop; + unsigned int bit; + unsigned int header_bit; + unsigned int numbits; + unsigned int wait; + unsigned int pause; + unsigned int leadtime; + unsigned int bittime0; + unsigned int bittime1; + unsigned int togglebit; + unsigned int len; + unsigned int trail; + unsigned int preamble; + unsigned int pre; + unsigned char prebits; + unsigned char waittime; + unsigned char bittime; + } general; + struct IR_LIRC_ { //61 Bytes + unsigned long pre_data; // data which the remote sends before actual keycode + unsigned long actpre_data; + unsigned long post_data; // data which the remote sends after actual keycode + unsigned long actpost_data; + unsigned short flags; // flags + unsigned short phead,shead; // header + unsigned short plead; // leading pulse + unsigned short ptrail; // trailing pulse + unsigned short pfoot,sfoot; // foot + unsigned short pre_p,pre_s; // signal between pre_data and keycode + unsigned short post_p,post_s; // signal between keycode and post_code + unsigned short gap; + unsigned short repeat_gap; + unsigned short prepeat,srepeat; + unsigned short cycles_counter; + unsigned char bits; // bits (length of code) + unsigned char pre_data_bits; // length of pre_data + unsigned char post_data_bits; // length of post_data + unsigned char rc6_bit; // doubles signal length of this bit (only used for RC-6) + unsigned char pthree,sthree; // 3 (only used for RC-MM) + unsigned char ptwo,stwo; // 2 (only used for RC-MM) + unsigned char pone,sone; // 1 + unsigned char pzero,szero; // 0 + unsigned char min_repeat; + unsigned char bit; + unsigned char map; + unsigned char stop; + unsigned char repeats; + } lirc; + }; + unsigned int cmd; + unsigned int actcmd; + unsigned char toggle; + unsigned char state; +} ir; + + +//#define setIRspeed( _m ) { if(sysInfo & 0x80) T1MR0 = _m.tval1; else T1MR0 = _m.tval; } +#define setIRspeed( _m ) { T1MR0 = _m.tval; } + +void __attribute__ ((section(".text.fastcode"))) defIR(void); +void defSender(unsigned long cmd); +void defRepeater(void); +void defStopper(void); + +void initIR(void); +void startIrIRQ(void); +void setIR(struct irModule module); +void runIR(void); +void stopIR(void); + +unsigned long setEncoder( unsigned char _x, unsigned char _y ); + +void copyMapC(unsigned char *map); +void copyMapPC(unsigned int pre, unsigned char *map); +void copyMapS(unsigned short *map); +void copyMapI(unsigned int *map); + +unsigned long getCode(void); + +#endif + diff --git a/boop/trunk/infrared/infrared_encoders.h b/boop/trunk/infrared/infrared_encoders.h new file mode 100644 index 0000000..54a4ce8 --- /dev/null +++ b/boop/trunk/infrared/infrared_encoders.h @@ -0,0 +1,34 @@ +/* + infraredirq.h - ir carrier generation and encoding core + Copyright (C) 2007 Ch. Klippel + + 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 3 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 INFRARED_ENCODERS_H +#define INFRARED_ENCODERS_H + +#include "ir_nrc17.h" +#include "ir_itt.h" +#include "ir_rc5.h" +#include "ir_rc6.h" +#include "ir_rca.h" +#include "ir_rcmm.h" +#include "ir_rec80.h" +#include "ir_recs80.h" +#include "ir_sirc.h" +#include "ir_spaceenc.h" + +#endif + diff --git a/boop/trunk/infrared/infraredirq.c b/boop/trunk/infrared/infraredirq.c new file mode 100644 index 0000000..5fa7314 --- /dev/null +++ b/boop/trunk/infrared/infraredirq.c @@ -0,0 +1,67 @@ +/* + infraredirq.c - ir interrupt + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "infrared.h" +#include "infraredirq.h" +#include "irq.h" +#include "lpc2220.h" +#include "keyboard.h" +#include "rf.h" +#include "cc1100.h" + +static unsigned int c_cnt = 0; +static unsigned int b_len = 0; +extern volatile unsigned char mod_enable; +extern volatile unsigned char hi_border; +extern volatile unsigned char lo_border; +extern volatile unsigned int cycles; + +extern ir_fn irEncoder; + +void __attribute__ ((section(".text.fastcode"))) irIRQ(void) +{ + c_cnt++; + if(c_cnt <= hi_border) + { + FIOSET0 = (mod_enable<<21); + } + else + { + FIOCLR0 = (1<<21); + if(c_cnt >= lo_border) + { + c_cnt = 0; + b_len++; + if(b_len >= cycles) + { + irEncoder(); + b_len = 0; + + if(!hi_border) { //RF mode + if(mod_enable) + FIOCLR0 = GDO0; + else + FIOSET0 = GDO0; + } + } + } + } + + T1IR = 1; +// VICVectAddr = 0; +} diff --git a/boop/trunk/infrared/infraredirq.h b/boop/trunk/infrared/infraredirq.h new file mode 100644 index 0000000..27f5a48 --- /dev/null +++ b/boop/trunk/infrared/infraredirq.h @@ -0,0 +1,25 @@ +/* + infraredirq.h - ir carrier generation and encoding core + Copyright (C) 2007 Ch. Klippel + + 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 3 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 INFRAREDIRQ_H +#define INFRAREDIRQ_H + +void irIRQ (void) __attribute__ ((section(".text.fastcode"))); + +#endif + diff --git a/boop/trunk/infrared/ir_capture.c b/boop/trunk/infrared/ir_capture.c new file mode 100644 index 0000000..0b07f4a --- /dev/null +++ b/boop/trunk/infrared/ir_capture.c @@ -0,0 +1,710 @@ +/* + ir_capture.c - + Copyright (C) 2008 + + 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 3 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 "lcd.h" +#include "fonty.h" +#include "keyboard.h" +#include "lpc2220.h" +#include "irq.h" +#include "backlight.h" +#include "ir_capture.h" +#include "global.h" +#include "ir_raw.h" +#include "infrared.h" +#include "ir_selector.h" +#include "flash.h" +#include "controls.h" +#include "bfs.h" +#include "serial.h" +#include "codes.h" +#include "encoders.h" + + +const char string_unknown[] = ""; +#define len_string_unknown 12 + +extern volatile unsigned char autorepeat; +extern void setSpeed(unsigned char sp); + + +unsigned long waitIrHi(unsigned short* onpulse, unsigned long* time, unsigned long start) { + + unsigned long lowpulse; + unsigned long l; + unsigned long x; + + *onpulse = 0; + lowpulse = 0; + while (1) { + T0CCR = (1<<9) | (1<<11); + while (!(T0IR)); + T0IR = 0xff; + T0CCR = (1<<9) | (1<<10) | (1<<11); + l = T0CR3; + *time = l-start + lowpulse; + (*onpulse)++; + x = start + *time + 30; + while (!(T0IR)) { + if (T0TC > x) + return (l + lowpulse); + } + T0IR = 0xff; + x = T0CR3; + lowpulse = x-l; + } +} + +unsigned char decodewide(unsigned long value, struct widetable_* wide) { + + unsigned char x; + unsigned long minvalue; + unsigned long maxvalue; + unsigned long dif; + + dif = (value / 10); + + if (dif < 1) + dif = 1; + if (value > 1) + minvalue = value - dif; + else + minvalue = 0; + + maxvalue = value + dif; + + for (x=0;x < (wide->count);x++) { + if ((wide->value[x] >= minvalue) && (wide->value[x] <= maxvalue)) { + return x; + } + } + if (wide->count < 15) { + wide->value[wide->count] = value; + wide->count++; + return (wide->count -1); + } + else { + return 0xff; + } +} + +//--------------------------------------------------------------------------- +// captureIR +//--------------------------------------------------------------------------- +/* Return Values: + 0 = OK + 1 = too manny pulse lengths + 2 = abort + 3 = too long +*/ +unsigned char captureIR(struct ir_raw_* capture) { + + unsigned long hightime, lowtime; + unsigned long T0count; + unsigned short highpulse, lowpulse; + unsigned long T1count; + unsigned long timeout; + unsigned char status; + unsigned char wide; + + while(ANYKEY); + + setSpeed(SPEED_60); + disableIRQ(); + T0MCR = 0x00; + + FIODIR0 &= ~(1<<4); + FIOCLR0 |= (1<<12); + PINSEL1 |= (1<<27); + + T0CCR = (1<<9) | (1<<10) | (1<<11); + + capture->widetable[0].count = 0; + capture->widetable[1].count = 0; + capture->count = 0; + status = 0; + + T0TC = 0; + while (T0TC < 5000); + + T0IR = 0xff; + while (!T0IR && !ANYKEY); + if(!ANYKEY) { + T0TC = 0; + T0IR = 0xff; + T0count = waitIrHi(&highpulse,&hightime,0); + capture->pulsetime = (hightime * 1000) / highpulse; + capture->data[0] = (decodewide(highpulse, &capture->widetable[1]) & 0x0F)<<4; + + while (!(T0IR)); + T0IR = 0xff; + T1count= T0CR3; + while ((capture->count < max_capture_data-1) && !status) { + lowtime = T1count-T0count; + T0count = waitIrHi(&highpulse,&hightime,T1count); + lowpulse = ((lowtime *1000)+(capture->pulsetime / 2)) / capture->pulsetime; + wide = decodewide(lowpulse, &capture->widetable[1]); + if(wide & 0xf0) + status = 2; + capture->data[capture->count] |= wide; + wide = decodewide(highpulse, &capture->widetable[1]); + if(wide & 0xf0) + status = 2; + capture->count++; + capture->data[capture->count] = wide<<4; + timeout = T0count + 500000; + while (!(T0IR) && !status) { + if (T0TC > timeout) + status =1; + } + T0IR = 0xff; + T1count= T0CR3; + } + } + else + status = 3; + if(capture->count == max_capture_data-1) + status = 4; + T0TC = 0; + T0MCR = 0x03; + FIOSET0 |= (1<<12); + T0CCR = 0; + T0IR = 0xff; + enableIRQ(); + setBacklight(BL_AUTO); + setSpeed(SPEED_30); + return status - 1; +} + +# define MAX_messages 25 + +unsigned char compare_message(unsigned char* message1, unsigned char* message2, unsigned char len) { + + unsigned char x; + + for(x=0; x < (len-1); x++) { + if(message1[x] != message2[x]) + return 1; + } + if((message1[len-1] & 0xf0) != (message2[len-1] & 0xf0)) + return 1; + return 0; + +} + +unsigned short get_signalfree(struct ir_raw_* capture,unsigned short signalmin) { + unsigned short signalfree; + unsigned char i; + + signalfree = 32000; + for (i=4; (i < capture->count);i++) { + unsigned short y; + unsigned short sum; + sum = 0; + for (y = i-4; y < i; y++) { + sum += capture->widetable[1].value[(capture->data[y]) & 0x0f]; + } + y = capture->widetable[1].value[(capture->data[i]) & 0x0f]; + if ((sum < y) && (y < signalfree) && (y > signalmin)) + signalfree=y; + } + + return(signalfree); + +} + + +//--------------------------------------------------------------------------- +// analyzeIR +//--------------------------------------------------------------------------- +/* Return Values: + 0 = OK + 1 = too manny messages + 2 = too few messages + 3 = repeat messages not equal + 4 = messages too long + 5 = unknown format +*/ +unsigned char analyzeIR1(struct ir_raw_* capture, struct RAWcmd_* cmd, unsigned char mode) { + + unsigned short signalfree; + unsigned char message[MAX_messages]; + unsigned char messagecount; + unsigned char x; + unsigned char first; + unsigned char middle; + unsigned char last; + + clear_cmd(cmd); + signalfree = get_signalfree(capture,1); + if(mode) + signalfree = get_signalfree(capture,signalfree); + + messagecount = 1; + message[0] = 0; + for(x = 0; (x < capture->count) && (messagecount < MAX_messages); x++) { + if(capture->widetable[1].value[capture->data[x] & 0x0f] >= signalfree) { + if(messagecount < MAX_messages) + message[messagecount++] = x+1; + else + return 1; + } + } + + if(messagecount < 2) + return 2; + + first = compare_message(&capture->data[message[0]], &capture->data[message[1]],message[1] - message[0]); + middle = 0; + for(x=1; x < messagecount-2; x++) { + middle += compare_message(&capture->data[message[x]], &capture->data[message[x+1]],message[x+1] - message[x]); + } + last = compare_message(&capture->data[message[messagecount-2]], &capture->data[message[messagecount-1]],message[messagecount-1] - message[messagecount-2]); + + if((first && last && (messagecount < 4)) || ((first + last) && (messagecount < 3))) + return 2; + + if(middle) + return 3; + + if(first + last == 0) { + for(x=0;x<3;x++) { + cmd->CMDstart[x] = 0; + cmd->CMDlen[x] = message[1]; + } + if(cmd->CMDlen[0] > max_CMD_data) return 4; + memcpy((unsigned char *)&cmd->data[cmd->CMDstart[0]],(unsigned char *)&capture->data[0],cmd->CMDlen[0]); + + } + else if(first + last == 2) { + cmd->CMDstart[0] = 0; + cmd->CMDlen[0] = message[1]; + + cmd->CMDstart[1] = cmd->CMDstart[0] + cmd->CMDlen[0]; + cmd->CMDlen[1] = message[2]-message[1]; + + cmd->CMDstart[2] = cmd->CMDstart[1] + cmd->CMDlen[1]; + cmd->CMDlen[2] = message[messagecount-1]-message[messagecount-2]; + + if(cmd->CMDlen[0]+cmd->CMDlen[1]+cmd->CMDlen[2] > max_CMD_data) return 4; + memcpy((unsigned char *)&cmd->data[cmd->CMDstart[0]],(unsigned char *)&capture->data[0],cmd->CMDlen[0]); + memcpy((unsigned char *)&cmd->data[cmd->CMDstart[1]],(unsigned char *)&capture->data[message[1]],cmd->CMDlen[1]); + memcpy((unsigned char *)&cmd->data[cmd->CMDstart[2]],(unsigned char *)&capture->data[message[messagecount-1]],cmd->CMDlen[2]); + } + else if((first == 1)&& !last) { + cmd->CMDstart[0] = 0; + cmd->CMDlen[0] = message[1]; + + cmd->CMDstart[1] = cmd->CMDstart[0] + cmd->CMDlen[0]; + cmd->CMDlen[1] = message[2]-message[1]; + + cmd->CMDstart[2] = cmd->CMDstart[1]; + cmd->CMDlen[2] = cmd->CMDlen[1]; + + if(cmd->CMDlen[0]+cmd->CMDlen[1] > max_CMD_data) return 4; + memcpy((unsigned char *)&cmd->data[cmd->CMDstart[1]],(unsigned char *)&capture->data[message[1]],cmd->CMDlen[1]); + memcpy((unsigned char *)&cmd->data[cmd->CMDstart[0]],(unsigned char *)&capture->data[0],cmd->CMDlen[0]); + + } + else { + return 5; + } + + cmd->borders = 0x13; + cmd->tval = (15 * capture->pulsetime) / ((cmd->borders & 0x0f) * 1000); + memcpy((unsigned char *)&cmd->pulselen[0],(unsigned char *)&capture->widetable[1].value[0],(capture->widetable[1].count) * sizeof(unsigned short)); + + return 0; +} + +unsigned char analyzeIR(struct ir_raw_* capture, struct RAWcmd_* cmd) { + unsigned char result; + + result = analyzeIR1(capture, cmd,0); + if(result) { + if(!(analyzeIR1(capture, cmd,1))) + return(0); + } + return(result); +} + +void debug_print_capture(struct ir_raw_* capture) { + + unsigned short signalfree; + unsigned char x; + unsigned char ro; + unsigned char co; + + signalfree = get_signalfree(capture,0); + + x= 0; + ro = 0; + co = 0; + while((x <= capture->count) && (ro < 20)) { + draw_hexC(co++ * 14,ro * 8,capture->data[x], 3, DRAW_PUT); + if((capture->widetable[1].value[capture->data[x++] & 0x0f] >= signalfree) || (co > 5)) { + ro++; + co = 0; + } + } + + draw_numU(90,8,capture->pulsetime,0, 3, DRAW_PUT); + + for (x = 0; x < capture->widetable[1].count; x++) { + draw_numU(90,36+(x*8),capture->widetable[1].value[x],0, 3, DRAW_PUT); + } +} + +void debug_print_cmd(struct RAWcmd_* cmd) { + + unsigned char x; + unsigned char ro; + unsigned char co; + + x= 0; + ro = 0; + co = 0; + + while((x < cmd->CMDlen[0]) && (ro < 20)) { + draw_hexC(co++ * 14,ro * 8,cmd->data[cmd->CMDstart[0]+ x++], 3, DRAW_PUT); + if(co > 4) { + ro++; + co = 0; + } + } + x=0; + co = 0; + ro++; + while((x < cmd->CMDlen[1]) && (ro < 20)) { + draw_hexC(co++ * 14,ro * 8,cmd->data[cmd->CMDstart[1]+ x++], 3, DRAW_PUT); + if(co > 4) { + ro++; + co = 0; + } + } + x=0; + co = 0; + ro++; + while((x < cmd->CMDlen[2]) && (ro < 20)) { + draw_hexC(co++ * 14,ro * 8,cmd->data[cmd->CMDstart[2]+ x++], 3, DRAW_PUT); + if(co > 4) { + ro++; + co = 0; + } + } + + draw_numU(90,8,cmd->tval,0, 3, DRAW_PUT); + + for (x = 0; x < 16; x++) { + draw_numU(75,20+(x*8),cmd->pulselen[x],0, 3, DRAW_PUT); + } +} + +void serialsend_ir_cmd(struct RAWcmd_* cmd) { + unsigned short i; + unsigned char *s; + + s=(unsigned char*)cmd; + + for(i=0;iRAWcmd[cmd])); + } + else { + RAW_Send((unsigned long)&(RAWset->RAWcmd[cmd])); + while(ANYKEY) + RAW_Repeat(); + RAW_Stop(); + } + } + } +} + +void RAW_learnset(FORM* form, CONTROL* control) { + RAW_learn((struct RAWset_*)(form->tag)); + form_draw(form); +} + +void RAW_keyerase(FORM* form, CONTROL* control) { + unsigned char x; + + x=msgbox(50,BC_nobuttons,"\nZu loeschende Taste\ndruecken.\n"); + waitKeyDown(); + x=getKeynum(); + if(x>3) { + clear_cmd(&(((struct RAWset_*)(form->tag))->RAWcmd[x-4])); + } + form_draw(form); +} + +void RAW_allkeyserase(FORM* form, CONTROL* control) { + unsigned char x; + + x=msgbox(50,BC_YesNo | BC_DefaultButton2,"Moechten Sie wirklich\nalle Tasten loeschen?\n"); + if(x == BC_Yes) { + for(x=0;x<38;x++) { + clear_cmd(&(((struct RAWset_*)(form->tag))->RAWcmd[x])); + + } + } + form_draw(form); +} + +void RAW_editset(FORM* form, CONTROL* control) { + + struct RAWset_ RAWset; + const BUTTON button1 = {BC_Button,0,15,120,15,SMALLFONT,0,"Anlernen/Testen",RAW_learnset}; + const BUTTON button2 = {BC_Button,0,35,120,15,SMALLFONT,0,"Taste loeschen",RAW_keyerase}; + const BUTTON button3 = {BC_Button,0,55,120,15,SMALLFONT,0,"Alle Tasten loeschen",RAW_allkeyserase}; + const LABEL label1 = {BC_Labelnotab,0,80,60,10,BOLDFONT,0,"Bezeichnung",0}; + TXTBOX txtbox1 = {BC_Txtbox,0,90,120,10,SMALLFONT,20,0,(char*)RAWset.name,NULL,NULL}; + + CONTROL* controls[5] = { (CONTROL*)&button1, + (CONTROL*)&button2, + (CONTROL*)&button3, + (CONTROL*)&label1, + (CONTROL*)&txtbox1}; + + FORM form2 = {"RAW Set bearbeiten",0,0,0,0,0,controls,0,5,0,0}; + unsigned long x; + + x = (unsigned long)BFS_LoadFileAddr(BFS_ID_RAWslot0 + ((LABEL*)control)->tag); + + if(x) + memcpy(&RAWset,(void *)x,sizeof(struct RAWset_)); + else + RAWset.id[0] = 0xff; + + x=memcmp(&RAWset,"RC01",4); + if(x) { + for(x=0;xtag, sizeof(struct RAWset_), (unsigned char*) &RAWset); + } + + if(RAWset.name[0]==0xff) + memcpy(&RAWset.name[0],(char*)string_unknown,len_string_unknown); + + form2.tag =(unsigned long)&RAWset; + + form_exec(&form2); + + if(!memcmp(&RAWset.name[0],string_unknown,len_string_unknown)) + for(x=0;xtag, sizeof(struct RAWset_), (unsigned char*) &RAWset) == 0) { + x=msgbox(50,BC_YesNo | BC_DefaultButton1,"Sollen die Aenderungen\ngespeichert werden?\n"); + if(x == BC_Yes) { + memcpy(&RAWset.id[0],"RC01",4); + BFS_SaveFile(BFS_ID_RAWslot0 + ((LABEL*)control)->tag, sizeof(struct RAWset_), (unsigned char*) &RAWset); + if(BFS_CmpFile(BFS_ID_RAWslot0 + ((LABEL*)control)->tag, sizeof(struct RAWset_), (unsigned char*) &RAWset) == 0) { + msgbox(50,BC_OKOnly | BC_DefaultButton1,"Fehler\n"); + } + } + } + + form_draw(form); +} + +void RAW_eraseall(FORM* form, CONTROL* control) { + + unsigned char x; + + x=msgbox(50,BC_YesNo | BC_DefaultButton2,"Moechten Sie wirklich\nalle gespeicherten\nCodes loeschen?\n"); + if(x == BC_Yes) { + for(x=0;x<4;x++) + BFS_DeleteFile(BFS_ID_RAWslot0 + x); + } + form_draw(form); +} +extern const struct TABLES_N RAW; + +void RAW_learnmenue(void) { + + const LABEL label5 = {BC_Labelnotab,0,15,100,10,BOLDFONT,0,"RAW Set bearbeiten:",0}; + const BUTTON button1 = {BC_Button,0,70,80,15,SMALLFONT,0,"Alles loeschen",RAW_eraseall}; + + CONTROL* controls[2 + MAX_slots]; + LABEL l_rawset[MAX_slots]; + controls[0] = (CONTROL*)&label5; + controls[1] = (CONTROL*)&button1; + + FORM form = {"IR-Codes anlernen",0,0,0,0,0,controls,2, 2 + MAX_slots,0,0}; + + int set; + /* load menu entries for four RAW sets from filesystem / default names */ + for (set = 0; set < MAX_slots; set++) { + l_rawset[set] = (LABEL){BC_Label,0,25 + 10*set,50,10,SMALLFONT,set,NULL,RAW_editset}; + struct RAWset_ *rs = (struct RAWset_*)BFS_LoadFileAddr(BFS_ID_RAWslot0 + set); + if(rs && (rs->name[0] != 0xff)) { + l_rawset[set].caption = (char*)rs->name; + } else + l_rawset[set].caption = (char*)RAW.table[set].name; + + controls[2 + set] = (CONTROL*)&l_rawset[set]; + } + + form_exec(&form); + setEncoder(irDevTab.device[irDevTab.active].encoder, irDevTab.device[irDevTab.active].set); + +} + diff --git a/boop/trunk/infrared/ir_capture.h b/boop/trunk/infrared/ir_capture.h new file mode 100644 index 0000000..cc9aa60 --- /dev/null +++ b/boop/trunk/infrared/ir_capture.h @@ -0,0 +1,62 @@ +/* + ir_capture.h - + Copyright (C) 2008 + + 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 3 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 IR_CAPTURE_H +#define IR_CAPTURE_H + +#define max_CMD_data 102 + +#define MAX_slots 4 +#define RAWnamelen 20 +struct RAWcmd_ { + unsigned char tval; + unsigned char borders; + unsigned char flags; + unsigned char toggle; + unsigned char CMDstart[3]; + unsigned char CMDlen[3]; + unsigned short pulselen[16]; + unsigned char data[max_CMD_data]; +}; + +struct RAWset_ { + unsigned char id[4]; + unsigned char name[RAWnamelen]; + struct RAWcmd_ RAWcmd[38]; +}; + +struct widetable_ { + unsigned short value[15]; + unsigned char count; +}; + +#define max_capture_data 200 + +struct ir_raw_ { + unsigned long pulsetime; + unsigned char data[max_capture_data]; + struct widetable_ widetable[2]; + unsigned char count; + +}; + +void getIR_test(struct RAWcmd_* cmd); +void RAW_learnmenue(void); +void clear_cmd(struct RAWcmd_* cmd); + +#endif diff --git a/boop/trunk/infrared/ir_codes/itt/seleco_019 b/boop/trunk/infrared/ir_codes/itt/seleco_019 new file mode 100644 index 0000000..ae2cf7c --- /dev/null +++ b/boop/trunk/infrared/ir_codes/itt/seleco_019 @@ -0,0 +1,62 @@ +/* + infrared codes for ITT seleco 019 + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +{ + 0x000, // A -> + 0x000, // B -> + 0x000, // C -> + 0x000, // D -> + 0x000, // Betty -> + 0x000, // Exit -> + 0x330, // Up -> Play + 0x340, // Down -> Stop + 0x020, // Left -> Rewind + 0x310, // Right -> Forward + 0x080, // OK -> Enter + 0x2E0, // Vol+ -> Vol+ + 0x2F0, // Vol- -> Vol- + 0x060, // Mute -> Muting + 0x070, // Prog+ -> Prog+ + 0x040, // Prog- -> Prog- + 0x100, // 1 -> 1 + 0x110, // 2 -> 2 + 0x120, // 3 -> 3 + 0x130, // 4 -> 4 + 0x140, // 5 -> 5 + 0x150, // 6 -> 6 + 0x160, // 7 -> 7 + 0x170, // 8 -> 8 + 0x180, // 9 -> 9 + 0x190, // 0 -> 0 + 0x3F0, // -/-- -> A/B + 0x000, // AV -> + 0x1D0, // Menu -> Info + 0x000, // PiP -> + 0x000, // A/B -> + 0x000, // 16:9 -> + 0x1C0, // Info -> VTX1 + 0x1E0, // VTX1 -> VTX2 + 0x3C0, // VTX2 -> VTX3 + 0x020, // VTX3 -> VTX4 + 0x000, // Blue -> + 0x000, // Yello -> + 0x000, // Green -> + 0x1E0, // Red -> Record + 0x000, // TV -> + 0x010 // Power -> Power +}, diff --git a/boop/trunk/infrared/ir_codes/itt/seleco_049 b/boop/trunk/infrared/ir_codes/itt/seleco_049 new file mode 100644 index 0000000..584144f --- /dev/null +++ b/boop/trunk/infrared/ir_codes/itt/seleco_049 @@ -0,0 +1,62 @@ +/* + infrared codes for ITT seleco 019 + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +{ + 0x000, // A -> + 0x000, // B -> + 0x000, // C -> + 0x000, // D -> + 0x000, // Betty -> + 0x000, // Exit -> + 0x360, // Up -> Play + 0x330, // Down -> Stop + 0x320, // Left -> Rewind + 0x350, // Right -> Forward + 0x050, // OK -> Enter + 0x2E0, // Vol+ -> Vol+ + 0x2F0, // Vol- -> Vol- + 0x060, // Mute -> Muting + 0x0D0, // Prog+ -> Prog+ + 0x0E0, // Prog- -> Prog- + 0x100, // 1 -> 1 + 0x110, // 2 -> 2 + 0x120, // 3 -> 3 + 0x130, // 4 -> 4 + 0x140, // 5 -> 5 + 0x150, // 6 -> 6 + 0x160, // 7 -> 7 + 0x170, // 8 -> 8 + 0x180, // 9 -> 9 + 0x190, // 0 -> 0 + 0x1F0, // -/-- -> A/B + 0x000, // AV -> + 0x3A0, // Menu -> Info + 0x000, // PiP -> + 0x000, // A/B -> + 0x000, // 16:9 -> + 0x1C0, // Info -> VTX1 + 0x1E0, // VTX1 -> VTX2 + 0x3C0, // VTX2 -> VTX3 + 0x020, // VTX3 -> VTX4 + 0x000, // Blue -> + 0x000, // Yello -> + 0x000, // Green -> + 0x1E0, // Red -> Record + 0x000, // TV -> + 0x010 // Power -> Power +}, diff --git a/boop/trunk/infrared/ir_codes/itt/seleco_108 b/boop/trunk/infrared/ir_codes/itt/seleco_108 new file mode 100644 index 0000000..883e336 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/itt/seleco_108 @@ -0,0 +1,62 @@ +/* + infrared codes for ITT seleco 108 + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +{ + 0x000, // A -> + 0x000, // B -> + 0x000, // C -> + 0x000, // D -> + 0x000, // Betty -> + 0x000, // Exit -> + 0x1C0, // Up -> Play + 0x330, // Down -> Stop + 0x210, // Left -> Rewind + 0x1F0, // Right -> Forward + 0x230, // OK -> Enter + 0x2E0, // Vol+ -> Vol+ + 0x2F0, // Vol- -> Vol- + 0x3F0, // Mute -> Muting + 0x070, // Prog+ -> Prog+ + 0x080, // Prog- -> Prog- + 0x100, // 1 -> 1 + 0x110, // 2 -> 2 + 0x120, // 3 -> 3 + 0x130, // 4 -> 4 + 0x140, // 5 -> 5 + 0x150, // 6 -> 6 + 0x160, // 7 -> 7 + 0x170, // 8 -> 8 + 0x180, // 9 -> 9 + 0x190, // 0 -> 0 + 0x1E0, // -/-- -> A/B + 0x000, // AV -> + 0x000, // Menu -> + 0x000, // PiP -> + 0x000, // A/B -> + 0x000, // 16:9 -> + 0x0F0, // Info -> VTX1 + 0x0D0, // VTX1 -> VTX2 + 0x200, // VTX2 -> VTX3 + 0x000, // VTX3 -> VTX4 + 0x000, // Blue -> + 0x000, // Yello -> + 0x000, // Green -> + 0x1D0, // Red -> Pause + 0x000, // TV -> + 0x010 // Power -> Power +}, diff --git a/boop/trunk/infrared/ir_codes/itt/seleco_131 b/boop/trunk/infrared/ir_codes/itt/seleco_131 new file mode 100644 index 0000000..7bd12ee --- /dev/null +++ b/boop/trunk/infrared/ir_codes/itt/seleco_131 @@ -0,0 +1,62 @@ +/* + infrared codes for ITT seleco 131 + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +{ + 0x000, // A -> + 0x000, // B -> + 0x000, // C -> + 0x000, // D -> + 0x000, // Betty -> + 0x000, // Exit -> + 0x020, // Up -> Play + 0x300, // Down -> Stop + 0x250, // Left -> Rewind + 0x050, // Right -> Forward + 0x390, // OK -> Enter + 0x2E0, // Vol+ -> Vol+ + 0x2F0, // Vol- -> Vol- + 0x060, // Mute -> Muting + 0x0D0, // Prog+ -> Prog+ + 0x040, // Prog- -> Prog- + 0x100, // 1 -> 1 + 0x110, // 2 -> 2 + 0x120, // 3 -> 3 + 0x130, // 4 -> 4 + 0x140, // 5 -> 5 + 0x150, // 6 -> 6 + 0x160, // 7 -> 7 + 0x170, // 8 -> 8 + 0x180, // 9 -> 9 + 0x190, // 0 -> 0 + 0x000, // -/-- -> + 0x000, // AV -> + 0x390, // Menu -> Info + 0x000, // PiP -> + 0x000, // A/B -> + 0x000, // 16:9 -> + 0x1C0, // Info -> VTX1 + 0x0A0, // VTX1 -> VTX2 + 0x380, // VTX2 -> VTX3 + 0x200, // VTX3 -> VTX4 + 0x000, // Blue -> + 0x000, // Yello -> + 0x000, // Green -> + 0x1D0, // Red -> Pause + 0x000, // TV -> + 0x010 // Power -> Power +}, diff --git a/boop/trunk/infrared/ir_codes/lirc/apple_remote1 b/boop/trunk/infrared/ir_codes/lirc/apple_remote1 new file mode 100644 index 0000000..e962faf --- /dev/null +++ b/boop/trunk/infrared/ir_codes/lirc/apple_remote1 @@ -0,0 +1 @@ +/* infrared codes for Apple Remote 1st generation (6 buttons) http://lirc.sourceforge.net/remotes/apple/A1156 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 3 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 . */ /*pre_data*/ 0x77E1, /*Apple's ID for NEC code*/ /*post_data*/ 0xC5, /*Remote's ID (which can be changed on the original remote)*/ /*toggle_bit_mask*/ 0x00, /*gap*/ 37600, /*repeat_gap*/ 0, /*bits*/ 8, /*pre_data_bits*/ 16, /*post_data_bits*/ 8, /*rc6_bit*/ 0, /*frequency*/ 38000, /*flags*/ LIRC_SPACE_ENC, /*header*/ 9000,4500, /*three*/ 0,0, /*two*/ 0,0, /*one*/ 560,1690, /*zero*/ 560,560, /*plead*/ 0, /*ptrail*/ 560, /*foot*/ 0,0, /*pre*/ 0,0, /*post*/ 0,0, /*repeat*/ 9000,2250, /*min_repeat*/ 1, /*duty cycle*/ 33, { 0x00, // A -> 0x00, // B -> 0x00, // C -> 0x00, // D -> 0x00, // Betty -> 0x00, // Exit -> 0xD0, // Up -> up, plus 0xB0, // Down -> down, minus 0x10, // Left -> << rev 0xE0, // Right -> >> ffwd 0x20, // OK -> play 0x00, // Vol+ -> 0x00, // Vol- -> 0x40, // Mute -> menu 0x00, // Prog+ -> 0x00, // Prog- -> 0x00, // 1 -> 0x00, // 2 -> 0x00, // 3 -> 0x00, // 4 -> 0x00, // 5 -> 0x00, // 6 -> 0x00, // 7 -> 0x00, // 8 -> 0x00, // 9 -> 0x00, // 0 -> 0x00, // -/-- -> 0x00, // AV -> 0x00, // Menu -> 0x00, // PiP -> 0x00, // A/B -> 0x00, // 16:9 -> 0x00, // Info -> 0x00, // VTX1 -> 0x00, // VTX2 -> 0x00, // VTX3 -> 0x00, // Blue -> 0x00, // Yello -> 0x00, // Green -> 0x00, // Red -> 0x00, // TV -> 0x00 // Power -> }, diff --git a/boop/trunk/infrared/ir_codes/lirc/fs20 b/boop/trunk/infrared/ir_codes/lirc/fs20 new file mode 100644 index 0000000..dcdd03e --- /dev/null +++ b/boop/trunk/infrared/ir_codes/lirc/fs20 @@ -0,0 +1 @@ +/* RF codes for FS20 Copyright (C) 2009 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 3 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 . */ /*pre_data*/ calcFS20pre(0x11,0,0x11,0), //Synchr + HC:12121212 /*post_data*/ 0x00000000, /*toggle_bit_mask*/ 0x00, /*gap*/ 10000, /*repeat_gap*/ 500000, //gap after min_repeats /*bits*/ 27, /*pre_data_bits*/ 32, /*post_data_bits*/ 0, /*rc6_bit*/ 0, /*frequency*/ 0x0020293E, //868.350174MHz /*flags*/ LIRC_RF, /*header*/ 0,0, /*three*/ 0,0, /*two*/ 0,0, /*one*/ 600,600, /*zero*/ 400,400, /*plead*/ 0, /*ptrail*/ 400, /*foot*/ 0,0, /*pre*/ 0,0, /*post*/ 0,0, /*repeat*/ 0,0, /*min_repeat*/ 2, /*duty cycle*/ 0, { 0x00000, // A -> 0x00000, // B -> 0x00000, // C -> 0x00000, // D -> 0x00000, // Betty -> 0x00000, // Exit -> 0x00000, // Up -> 0x00000, // Down -> 0x00000, // Left -> 0x00000, // Right -> 0x00000, // OK -> 0x00000, // Vol+ -> 0x00000, // Vol- -> 0x00000, // Mute -> 0x00000, // Prog+ -> 0x00000, // Prog- -> calcFS20code(0x01,1,0x00,0,0x29,1), // 1 -> Addr:1112 Cmd:0(Off) calcFS20code(0x01,1,0x12,0,0x3B,1), // 2 -> Addr:1112 Cmd:18(Toggle) calcFS20code(0x01,1,0x11,0,0x3A,0), // 3 -> Addr:1112 Cmd:17(On) 0x00000, // 4 -> 0x00000, // 5 -> 0x00000, // 6 -> 0x00000, // 7 -> 0x00000, // 8 -> 0x00000, // 9 -> 0x00000, // 0 -> 0x00000, // -/-- -> 0x00000, // AV -> 0x00000, // Menu -> 0x00000, // PiP -> 0x00000, // A/B -> 0x00000, // 16:9 -> 0x00000, // Info -> 0x00000, // VTX1 -> 0x00000, // VTX2 -> 0x00000, // VTX3 -> 0x00000, // Blue -> 0x00000, // Yello -> 0x00000, // Green -> 0x00000, // Red -> 0x00000, // TV -> 0x00000 // Power -> Power }, \ No newline at end of file diff --git a/boop/trunk/infrared/ir_codes/lirc/hx2262 b/boop/trunk/infrared/ir_codes/lirc/hx2262 new file mode 100644 index 0000000..06e220e --- /dev/null +++ b/boop/trunk/infrared/ir_codes/lirc/hx2262 @@ -0,0 +1 @@ +/* RF codes for HX2262 Copyright (C) 2009 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 3 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 . */ //Bit translation: //HX2262 LIRC_RF //0 00 //F (floating) 01 //1 11 /*pre_data*/ 0x00000000, //bit 0-4 = 00000 /*post_data*/ 0x00000000, /*toggle_bit_mask*/ 0x00, /*gap*/ 11160, /*repeat_gap*/ 11160, //gap after min_repeats /*bits*/ 14, /*pre_data_bits*/ 10, /*post_data_bits*/ 0, /*rc6_bit*/ 0, /*frequency*/ 0x00101234, //433,919861MHz /*flags*/ LIRC_RF, /*header*/ 0,0, /*three*/ 0,0, /*two*/ 0,0, /*one*/ 1080,360, /*zero*/ 360,1080, /*plead*/ 0, /*ptrail*/ 360, /*foot*/ 0,0, /*pre*/ 0,0, /*post*/ 0,0, /*repeat*/ 0,0, /*min_repeat*/ 10, /*duty cycle*/ 0, { 0x00000, // A -> 0x00000, // B -> 0x00000, // C -> 0x00000, // D -> 0x00000, // Betty -> 0x00000, // Exit -> 0x00000, // Up -> 0x00000, // Down -> 0x00000, // Left -> 0x00000, // Right -> 0x00000, // OK -> 0x00000, // Vol+ -> 0x00000, // Vol- -> 0x00000, // Mute -> 0x00000, // Prog+ -> 0x00000, // Prog- -> 0x00551, // 1 -> bit5-8(Device) 0FFF bit9-11(cmd) F0F ->ON 0x01151, // 2 -> bit5-8(Device) 0FFF bit9-11(cmd) FF0 ->OFF 0x01451, // 3 -> bit5-8(Device) F0FF bit9-11(cmd) F0F ->ON 0x00554, // 4 -> bit5-8(Device) F0FF bit9-11(cmd) FF0 ->OFF 0x01154, // 5 -> bit5-8(Device) FF0F bit9-11(cmd) F0F ->ON 0x01454, // 6 -> bit5-8(Device) FF0F bit9-11(cmd) FF0 ->OFF 0x00000, // 7 -> 0x00000, // 8 -> 0x00000, // 9 -> 0x00000, // 0 -> 0x00000, // -/-- -> 0x00000, // AV -> 0x00000, // Menu -> 0x00000, // PiP -> 0x00000, // A/B -> 0x00000, // 16:9 -> 0x00000, // Info -> 0x00000, // VTX1 -> 0x00000, // VTX2 -> 0x00000, // VTX3 -> 0x00000, // Blue -> 0x00000, // Yello -> 0x00000, // Green -> 0x00000, // Red -> 0x00000, // TV -> 0x00000 // Power -> Power }, \ No newline at end of file diff --git a/boop/trunk/infrared/ir_codes/lirc/olympus_rm-1 b/boop/trunk/infrared/ir_codes/lirc/olympus_rm-1 new file mode 100644 index 0000000..ab59b3c --- /dev/null +++ b/boop/trunk/infrared/ir_codes/lirc/olympus_rm-1 @@ -0,0 +1 @@ +/* infrared codes for Olympus RM-1 (digital camera remote) NEC Code http://lirc.sourceforge.net/remotes/olympus/RM-1 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 3 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 . */ /*pre_data*/ 0x61DC, /*post_data*/ 0x00000000, /*toggle_bit_mask*/ 0x0000000000000000, /*gap*/ 107013, /*repeat_gap*/ 0, /*bits*/ 16, /*pre_data_bits*/ 16, /*post_data_bits*/ 0, /*rc6_bit*/ 0, /*frequency*/ 38000, /*flags*/ LIRC_SPACE_ENC | LIRC_CONST_LENGTH, /*header*/ 9000,4500, /*three*/ 0,0, /*two*/ 0,0, /*one*/ 560,1690, /*zero*/ 560,560, /*plead*/ 0, /*ptrail*/ 560, /*foot*/ 0,0, /*pre*/ 0,0, /*post*/ 0,0, /*repeat*/ 9000,2250, /*min_repeat*/ 1, /*duty cycle*/ 33, { 0x0000, // A -> 0x0000, // B -> 0x0000, // C -> 0x0000, // D -> 0x0000, // Betty -> 0x0000, // Exit -> 0xC03F, // Up -> tele 0x40BF, // Down -> wide 0x20DF, // Left -> - 0xA05F, // Right -> + 0x807F, // OK -> capture 0x0000, // Vol+ -> 0x0000, // Vol- -> 0x0000, // Mute -> 0x0000, // Prog+ -> 0x0000, // Prog- -> 0x0000, // 1 -> 0x0000, // 2 -> 0x0000, // 3 -> 0x0000, // 4 -> 0x0000, // 5 -> 0x0000, // 6 -> 0x0000, // 7 -> 0x0000, // 8 -> 0x0000, // 9 -> 0x0000, // 0 -> 0x0000, // -/-- -> 0x0000, // AV -> 0x0000, // Menu -> 0x0000, // PiP -> 0x0000, // A/B -> 0x0000, // 16:9 -> 0x0000, // Info -> 0x0000, // VTX1 -> 0x0000, // VTX2 -> 0x0000, // VTX3 -> 0x0000, // Blue -> 0x0000, // Yello -> 0x0000, // Green -> 0x0000, // Red -> 0x0000, // TV -> 0x0000 // Power -> }, diff --git a/boop/trunk/infrared/ir_codes/lirc/rev008340 b/boop/trunk/infrared/ir_codes/lirc/rev008340 new file mode 100644 index 0000000..c3a55e3 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/lirc/rev008340 @@ -0,0 +1 @@ +/* RF codes for REV 008340 remote control HS2260A-R4 based on hx2262 by telekatz 2010-10-04 by eme 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 3 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 . */ // Bit translation: // HX2262 LIRC_RF // 0 00 // F (floating) 01 // 1 11 // "channel" // A: 1FFF -> 11010101 -> 0xD5 // B: F1FF -> 01110101 -> 0x75 // C: FF1F -> 01011101 -> 0x5D // D: FFF1 -> 01010111 -> 0x57 // "device" // 1: 1FF0 -> 11010100 -> 0xD4 // 2: F1F0 -> 01110100 -> 0x74 // 3: FFF1 -> 01010111 -> 0x57 // "action" // 1: 0010 (on/+) -> 00001100 -> 0x0C // 0: 0001 (off/-) -> 00000011 -> 0x03 /*pre_data*/ 0xD5, // A0-A3 /*post_data*/ 0x00, /*toggle_bit_mask*/ 0x00, /*gap*/ 14570, /*repeat_gap*/ 14570, // gap after min_repeats /*bits*/ 16, // data bits /*pre_data_bits*/ 8, /*post_data_bits*/ 0, /*rc6_bit*/ 0, /*frequency*/ 0x00101234, // 433,919861MHz /*flags*/ LIRC_RF, /*header*/ 0,0, /*three*/ 0,0, /*two*/ 0,0, /*one*/ 1410,470, /*zero*/ 470,1410, /*plead*/ 0, /*ptrail*/ 470, // sync pulse /*foot*/ 0,0, /*pre*/ 0,0, /*post*/ 0,0, /*repeat*/ 0,0, /*min_repeat*/ 0, /*duty cycle*/ 0, { 0x0000, // A -> 0x0000, // B -> 0x0000, // C -> 0x0000, // D -> 0x0000, // Betty -> 0x0000, // Exit -> 0x0000, // Up -> 0x0000, // Down -> 0x0000, // Left -> 0x0000, // Right -> 0x0000, // OK -> 0x0000, // Vol+ -> 0x0000, // Vol- -> 0x0000, // Mute -> 0x0000, // Prog+ -> 0x0000, // Prog- -> 0xD40C, // 1 -> 1 on 0xD403, // 2 -> 1 off 0x0000, // 3 -> 0x740C, // 4 -> dim2 + 0x7403, // 5 -> dim2 - 0x0000, // 6 -> 0x570C, // 7 -> dim3 + 0x5703, // 8 -> dim3 - 0x0000, // 9 -> 0x0000, // 0 -> 0x0000, // -/-- -> 0x0000, // AV -> 0x0000, // Menu -> 0x0000, // PiP -> 0x0000, // A/B -> 0x0000, // 16:9 -> 0x0000, // Info -> 0x0000, // VTX1 -> 0x0000, // VTX2 -> 0x0000, // VTX3 -> 0x0000, // Blue -> 0x0000, // Yello -> 0x0000, // Green -> 0x0000, // Red -> 0x0000, // TV -> 0x0000 // Power -> }, \ No newline at end of file diff --git a/boop/trunk/infrared/ir_codes/lirc/samsung_ue46b6000 b/boop/trunk/infrared/ir_codes/lirc/samsung_ue46b6000 new file mode 100644 index 0000000..508fdcd --- /dev/null +++ b/boop/trunk/infrared/ir_codes/lirc/samsung_ue46b6000 @@ -0,0 +1 @@ +/* infrared codes for Samsung UE46B6000 Copyright (C) 2009 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 3 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 . */ /*pre_data*/ 0x0000E0E0, /*post_data*/ 0x00000000, /*toggle_bit_mask*/ 0x0000000000000000, /*gap*/ 107635, /*repeat_gap*/ 0, /*bits*/ 16, /*pre_data_bits*/ 16, /*post_data_bits*/ 0, /*rc6_bit*/ 0, /*frequency*/ 36000, /*flags*/ LIRC_CONST_LENGTH, /*header*/ 4498,4450, /*three*/ 0,0, /*two*/ 0,0, /*one*/ 588,1646, /*zero*/ 588,535, /*plead*/ 0, /*ptrail*/ 584, /*foot*/ 0,0, /*pre*/ 0,0, /*post*/ 0,0, /*repeat*/ 0,0, /*min_repeat*/ 1, /*duty cycle*/ 33, { 0x0000, // A -> 0x0000, // B -> 0x0000, // C -> 0x0000, // D -> 0x0000, // Betty -> 0xB44B, // Exit -> Exit 0x06F9, // Up -> UP 0x8679, // Down -> Down 0xA659, // Left -> Left 0x46B9, // Right -> Right 0x16E9, // OK -> OK 0xE01F, // Vol+ -> Vol+ 0xD02F, // Vol- -> Vol- 0xF00F, // Mute -> Mute 0x48B7, // Prog+ -> Prog+ 0x48B7, // Prog- -> Prog- 0x20DF, // 1 -> 1 0xA05F, // 2 -> 2 0x609F, // 3 -> 3 0x10EF, // 4 -> 4 0x906F, // 5 -> 5 0x50AF, // 6 -> 6 0x30CF, // 7 -> 7 0xB04F, // 8 -> 8 0x708F, // 9 -> 9 0x8877, // 0 -> 0 0xF20D, // -/-- -> Guide 0x807F, // AV -> Source 0x58A7, // Menu -> Menue 0xD22D, // PiP -> Tools 0x1AE5, // A/B -> Return 0x7C83, // 16:9 -> P.Size 0xF807, // Info -> Info 0xD629, // VTX1 -> Ch.List 0x0000, // VTX2 -> 0xC837, // VTX3 -> Pre-CH 0x6897, // Blue -> Blue 0xA857, // Yello -> Yellow 0x28D7, // Green -> Green 0x36C9, // Red -> Red 0xC23D, // TV -> TV/DTV 0x40BF // Power -> Standby }, \ No newline at end of file diff --git a/boop/trunk/infrared/ir_codes/lirc/str_de545 b/boop/trunk/infrared/ir_codes/lirc/str_de545 new file mode 100644 index 0000000..ff078e4 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/lirc/str_de545 @@ -0,0 +1 @@ +/* infrared codes for Kathrein UFS922 Copyright (C) 2009 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 3 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 . */ /*pre_data*/ 0x00000000, /*post_data*/ 0x00000000, /*toggle_bit_mask*/ 0x0000000000008000, /*gap*/ 45152, /*repeat_gap*/ 0, /*bits*/ 12, /*pre_data_bits*/ 0, /*post_data_bits*/ 0, /*rc6_bit*/ 0, /*frequency*/ 40000, /*flags*/ LIRC_CONST_LENGTH, /*header*/ 2400,600, /*three*/ 0,0, /*two*/ 0,0, /*one*/ 1200,600, /*zero*/ 600,600, /*plead*/ 0, /*ptrail*/ 0, /*foot*/ 0,0, /*pre*/ 0,0, /*post*/ 0,0, /*repeat*/ 0,0, /*min_repeat*/ 1, /*duty cycle*/ 25, { 0x0000, // A -> 0x0000, // B -> 0x0000, // C -> 0x0000, // D -> 0x0000, // Betty -> 0x0000, // Exit -> 0x0000, // Up -> 0x0000, // Down -> 0x0000, // Left -> 0x0000, // Right -> 0x0000, // OK -> 0x0481, // Vol+ -> Vol+ 0x0C81, // Vol- -> Vol- 0x0281, // Mute -> Mute 0x0096, // Prog+ -> Tuner Prog+ 0x0896, // Prog- -> Tuner Prog- 0x0561, // 1 -> TV/SAT 0x0441, // 2 -> Video 0x0BE1, // 3 -> DVD 0x0841, // 4 -> Tuner 0x0A41, // 5 -> CD 0x0B81, // 6 -> AUX 0x0961, // 7 -> MD/TAPE 0x04E1, // 8 -> 5.1 0x0000, // 9 -> 0x0000, // 0 -> 0x0000, // -/-- -> 0x0000, // AV -> 0x0000, // Menu -> 0x0000, // PiP -> 0x0000, // A/B -> 0x0000, // 16:9 -> 0x0000, // Info -> 0x0000, // VTX1 -> 0x0000, // VTX2 -> 0x0000, // VTX3 -> 0x0000, // Blue -> 0x0000, // Yello -> 0x0000, // Green -> 0x0000, // Red -> 0x0000, // TV -> 0x0A81 // Power -> Power }, \ No newline at end of file diff --git a/boop/trunk/infrared/ir_codes/lirc/ufs910 b/boop/trunk/infrared/ir_codes/lirc/ufs910 new file mode 100644 index 0000000..4b03d1d --- /dev/null +++ b/boop/trunk/infrared/ir_codes/lirc/ufs910 @@ -0,0 +1 @@ +/* infrared codes for Kathrein UFS910 Copyright (C) 2009 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 3 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 . */ /*pre_data*/ 0x00229000, /*post_data*/ 0x00000000, /*toggle_bit_mask*/ 0x0000000000008000, /*gap*/ 99000, /*repeat_gap*/ 0, /*bits*/ 8, /*pre_data_bits*/ 24, /*post_data_bits*/ 0, /*rc6_bit*/ 0, /*frequency*/ 36000, /*flags*/ LIRC_RCMM | LIRC_CONST_LENGTH, /*header*/ 417,278, /*three*/ 167,778, /*two*/ 167,611, /*one*/ 167,444, /*zero*/ 167,278, /*plead*/ 0, /*ptrail*/ 167, /*foot*/ 0,0, /*pre*/ 0,0, /*post*/ 0,0, /*repeat*/ 0,0, /*min_repeat*/ 1, /*duty cycle*/ 33, { 0x00, // A -> 0x00, // B -> 0x00, // C -> 0x00, // D -> 0x00, // Betty -> 0x55, // Exit -> Back 0x58, // Up -> Up 0x59, // Down -> Down 0x5A, // Left -> Left 0x5B, // Right -> Right 0x5c, // OK -> OK 0x10, // Vol+ -> Vol+ 0x11, // Vol- -> Vol- 0x0D, // Mute -> Mute 0x1E, // Prog+ -> Prog+ 0x1F, // Prog- -> Prog- 0x01, // 1 -> 1 0x02, // 2 -> 2 0x03, // 3 -> 3 0x04, // 4 -> 4 0x05, // 5 -> 5 0x06, // 6 -> 6 0x07, // 7 -> 7 0x08, // 8 -> 8 0x09, // 9 -> 9 0x100, // 0 -> 0 //eigentlich 0x00 0xCC, // -/-- -> EPG 0x00, // AV -> 0x54, // Menu -> Menue 0x21, // PiP -> Rewind 0x38, // A/B -> Play 0x20, // 16:9 -> Forward 0x0F, // Info -> Info 0x39, // VTX1 -> Pause 0x37, // VTX2 -> Record 0x31, // VTX3 -> Stop 0x70, // Blue -> Blue 0x6F, // Yello -> Yellow 0x6E, // Green -> Green 0x6D, // Red -> Red 0x3C, // TV -> Text 0x0C // Power -> Standby }, \ No newline at end of file diff --git a/boop/trunk/infrared/ir_codes/lirc/ufs922 b/boop/trunk/infrared/ir_codes/lirc/ufs922 new file mode 100644 index 0000000..45ec946 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/lirc/ufs922 @@ -0,0 +1 @@ +/* infrared codes for Kathrein UFS922 Copyright (C) 2009 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 3 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 . */ /*pre_data*/ 0x00037FB9, /*post_data*/ 0x00000000, /*toggle_bit_mask*/ 0x0000000000008000, /*gap*/ 106291, /*repeat_gap*/ 0, /*bits*/ 16, /*pre_data_bits*/ 21, /*post_data_bits*/ 0, /*rc6_bit*/ 5, /*frequency*/ 36000, /*flags*/ LIRC_RC6 | LIRC_CONST_LENGTH, /*header*/ 2676,870, /*three*/ 0,0, /*two*/ 0,0, /*one*/ 454,429, /*zero*/ 454,429, /*plead*/ 0, /*ptrail*/ 0, /*foot*/ 0,0, /*pre*/ 0,0, /*post*/ 0,0, /*repeat*/ 0,0, /*min_repeat*/ 1, /*duty cycle*/ 33, { 0x0000, // A -> 0x0000, // B -> 0x0000, // C -> 0x0000, // D -> 0x0000, // Betty -> 0xFFAA, // Exit -> Back 0xFFA7, // Up -> Up 0xFFA6, // Down -> Down 0xFFA5, // Left -> Left 0xFFA4, // Right -> Right 0xFFA3, // OK -> OK 0xFFEF, // Vol+ -> Vol+ 0xFFEE, // Vol- -> Vol- 0xFFF2, // Mute -> Mute 0xFFE1, // Prog+ -> Prog+ 0xFFE0, // Prog- -> Prog- 0xFFFE, // 1 -> 1 0xFFFD, // 2 -> 2 0xFFFC, // 3 -> 3 0xFFFB, // 4 -> 4 0xFFFA, // 5 -> 5 0xFFF9, // 6 -> 6 0xFFF8, // 7 -> 7 0xFFF7, // 8 -> 8 0xFFF6, // 9 -> 9 0xFFF5, // 0 -> 0 0xFF33, // -/-- -> EPG 0xFFB9, // AV -> Archiv 0xFFAB, // Menu -> Menue 0xFFDE, // PiP -> Rewind 0xFFC7, // A/B -> Play 0xFFDF, // 16:9 -> Forward 0xFFF0, // Info -> Info 0xFFC6, // VTX1 -> Pause 0xFFC8, // VTX2 -> Record 0xFFCE, // VTX3 -> Stop 0xFF8F, // Blue -> Blue 0xFF90, // Yello -> Yellow 0xFF91, // Green -> Green 0xFF92, // Red -> Red 0xFF2A, // TV -> Media 0xFFF3 // Power -> Standby }, \ No newline at end of file diff --git a/boop/trunk/infrared/ir_codes/nrc17/dbox2 b/boop/trunk/infrared/ir_codes/nrc17/dbox2 new file mode 100644 index 0000000..e6f2c73 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/nrc17/dbox2 @@ -0,0 +1,64 @@ +/* + NRC17_dbox2.code - infrared codes for the dbox2 in NRC17 coding + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +// codes are: subcode[4]:address[4]:command[8] = 16 bits + +{ + 0x0000, // A + 0x0000, // B + 0x0000, // C + 0x0000, // D + 0x5c20, // Betty -> Home + 0x5c27, // Exit -> dbox + 0x5c0e, // Up -> Up + 0x5c0f, // Down -> Down + 0x5c2f, // Left -> Left + 0x5c2e, // Right -> Right + 0x5c30, // OK -> OK + 0x5c16, // Vol+ -> Vol+ + 0x5c17, // Vol- -> Vol- + 0x5c28, // Mute -> Mute + 0x5c54, // Prog+ -> Next + 0x5c53, // Prog- -> Prev + 0x5c01, // 1 -> 1 + 0x5c02, // 2 -> 2 + 0x5c03, // 3 -> 3 + 0x5c04, // 4 -> 4 + 0x5c05, // 5 -> 5 + 0x5c06, // 6 -> 6 + 0x5c07, // 7 -> 7 + 0x5c08, // 8 -> 8 + 0x5c09, // 9 -> 9 + 0x5c00, // 0 -> 0 + 0x0000, // -/-- + 0x0000, // AV + 0x5c27, // Menu -> dbox + 0x0000, // PiP + 0x0000, // A/B + 0x0000, // 16:9 + 0x5c82, // Info -> Help + 0x0000, // VTX1 + 0x0000, // VTX2 + 0x0000, // VTX3 + 0x5c3b, // Blue -> Blue + 0x5c52, // Yellow -> Yellow + 0x5c55, // Green -> Green + 0x5c2d, // Red -> Red + 0x5c20, // TV -> Home + 0x5c0c // Power -> Power +}, diff --git a/boop/trunk/infrared/ir_codes/nrc17/grundig_tp720 b/boop/trunk/infrared/ir_codes/nrc17/grundig_tp720 new file mode 100644 index 0000000..20ea9ae --- /dev/null +++ b/boop/trunk/infrared/ir_codes/nrc17/grundig_tp720 @@ -0,0 +1,64 @@ +/* + infrared codes for the grundig tp720 tv + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +// codes are: command[9] = 9 bits + +{ + 0x0000, // A + 0x0000, // B + 0x0000, // C + 0x0000, // D + 0x0000, // Betty -> + 0x0000, // Exit -> + 0x000C, // Up -> COLOR+ + 0x000D, // Down -> COLOR- + 0x000B, // Left -> BR- + 0x000A, // Right -> BR+ + 0x8000, // OK -> OK + 0x0008, // Vol+ -> V+ + 0x0009, // Vol- -> V- + 0x0001, // Mute -> Mute + 0x002A, // Prog+ -> P+ + 0x002B, // Prog- -> P- + 0x0011, // 1 -> 1 + 0x0012, // 2 -> 2 + 0x0013, // 3 -> 3 + 0x0014, // 4 -> 4 + 0x0015, // 5 -> 5 + 0x0016, // 6 -> 6 + 0x0017, // 7 -> 7 + 0x0018, // 8 -> 8 + 0x0019, // 9 -> 9 + 0x0010, // 0 -> 0 + 0x0000, // -/-- + 0x0000, // AV + 0x001A, // Menu -> PC + 0x0000, // PiP + 0x0000, // A/B + 0x0000, // 16:9 + 0x002D, // Info -> I + 0x0030, // VTX1 -> Teletext + 0x0000, // VTX2 + 0x0000, // VTX3 + 0x002E, // Blue -> Blue + 0x003B, // Yellow -> Yellow + 0x003e, // Green -> Green + 0x003a, // Red -> Red + 0x0007, // TV -> Aux + 0x0002 // Power -> Power +}, diff --git a/boop/trunk/infrared/ir_codes/rc5/HARMONY_655 b/boop/trunk/infrared/ir_codes/rc5/HARMONY_655 new file mode 100644 index 0000000..fa174b0 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/rc5/HARMONY_655 @@ -0,0 +1,62 @@ +/* + infrared codes for technisat satreceiver + Copyright (C) 2008 p.c.squirrel + + 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 3 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 . +*/ +{ + RC5_STD(0x0000), // A -> + RC5_STD(0x0000), // B -> + RC5_STD(0x0000), // C -> + RC5_STD(0x0000), // D -> + RC5_STD(0x0000), // Betty -> + RC5_STD(0x100B), // Exit -> Zurück + RC5_STD(0x1012), // Up -> + RC5_STD(0x1013), // Down -> + RC5_STD(0x1015), // Left -> + RC5_STD(0x1014), // Right -> + RC5_STD(0x1023), // OK -> + RC5_STD(0x0210), // Vol+ -> Vol+ + RC5_STD(0x0211), // Vol- -> Vol- + RC5_STD(0x020D), // Mute -> Mute + RC5_STD(0x1020), // Prog+ -> Prog+ + RC5_STD(0x1021), // Prog- -> Prog- + RC5_STD(0x0201), // 1 -> 1 + RC5_STD(0x0202), // 2 -> 2 + RC5_STD(0x0203), // 3 -> 3 + RC5_STD(0x0204), // 4 -> 4 + RC5_STD(0x0205), // 5 -> 5 + RC5_STD(0x0206), // 6 -> 6 + RC5_STD(0x0207), // 7 -> 7 + RC5_STD(0x0208), // 8 -> 8 + RC5_STD(0x0209), // 9 -> 9 + RC5_STD(0x1000), // 0 -> 0 + RC5_STD(0x17C0), // -/-- -> AUDIO + RC5_STD(0x0238), // AV -> EXT + RC5_STD(0x100E), // Menu -> + RC5_STD(0x17FB), // PiP -> Full + RC5_STD(0x17FC), // A/B -> GO + RC5_STD(0x1165), // 16:9 -> FR + RC5_STD(0x1166), // Info -> FF + RC5_STD(0x1175), // VTX1 -> Play + RC5_STD(0x17F6), // VTX2 -> Stop + RC5_STD(0x17F7), // VTX3 -> Record + RC5_STD(0x1034), // Blue -> + RC5_STD(0x1032), // Yello -> + RC5_STD(0x1036), // Green -> + RC5_STD(0x1037), // Red -> + RC5_STD(0x1169), // TV -> Pause + RC5_STD(0x020C) // Power -> Standby +}, + diff --git a/boop/trunk/infrared/ir_codes/rc5/technisat_satreceiver_103TS103 b/boop/trunk/infrared/ir_codes/rc5/technisat_satreceiver_103TS103 new file mode 100644 index 0000000..8cc2205 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/rc5/technisat_satreceiver_103TS103 @@ -0,0 +1 @@ +/* infrared codes for technisat satreceiver Copyright (C) 2008 p.c.squirrel 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 3 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 . */ { RC5_STD(0x0000), // A -> RC5_STD(0x0000), // B -> RC5_STD(0x0000), // C -> RC5_STD(0x0000), // D -> RC5_STD(0x0000), // Betty -> RC5_STD(0x0000), // Exit -> RC5_STD(0x0210), // Up -> RC5_STD(0x0211), // Down -> RC5_STD(0x0215), // Left -> RC5_STD(0x0216), // Right -> RC5_STD(0x0217), // OK -> RC5_STD(0x0210), // Vol+ -> Vol+ RC5_STD(0x0211), // Vol- -> Vol- RC5_STD(0x020D), // Mute -> Mute RC5_STD(0x0220), // Prog+ -> Prog+ RC5_STD(0x0221), // Prog- -> Prog- RC5_STD(0x0201), // 1 -> 1 RC5_STD(0x0202), // 2 -> 2 RC5_STD(0x0203), // 3 -> 3 RC5_STD(0x0204), // 4 -> 4 RC5_STD(0x0205), // 5 -> 5 RC5_STD(0x0206), // 6 -> 6 RC5_STD(0x0207), // 7 -> 7 RC5_STD(0x0208), // 8 -> 8 RC5_STD(0x0209), // 9 -> 9 RC5_STD(0x0200), // 0 -> 0 RC5_STD(0x0000), // -/-- -> RC5_STD(0x0238), // AV ->EXT RC5_STD(0x0000), // Menu -> RC5_STD(0x0000), // PiP -> RC5_STD(0x0000), // A/B -> RC5_STD(0x0000), // 16:9 -> RC5_STD(0x0000), // Info -> RC5_STD(0x0000), // VTX1 -> RC5_STD(0x0000), // VTX2 -> RC5_STD(0x0000), // VTX3 -> RC5_STD(0x022E), // Blue -> RC5_STD(0x022D), // Yello -> RC5_STD(0x022C), // Green -> RC5_STD(0x022B), // Red -> RC5_STD(0x0000), // TV -> RC5_STD(0x020C) // Power -> Standby /* SAT1-OPTION 0x000000000000120A SAT1-A/B 0x0000000000001223 SAT1-SFI 0x000000000000122F SAT1-EXIT 0x0000000000001222 SAT1-INFO 0x000000000000020F SAT1-TV/RADIO 0x0000000000000213 SAT1-MENU 0x0000000000000212 SAT1-TV/SAT 0x0000000000000200 SAT1-TXT 0x000000000000123C SAT1-STOP 0x0000000000001229*/ }, \ No newline at end of file diff --git a/boop/trunk/infrared/ir_codes/rc5/tv b/boop/trunk/infrared/ir_codes/rc5/tv new file mode 100644 index 0000000..532d2b8 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/rc5/tv @@ -0,0 +1 @@ +/* infrared codes for RC5 tv Copyright (C) 2007 Ch. Klippel 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 3 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 . */ { RC5_STD(0x0000), // A -> RC5_STD(0x0000), // B -> RC5_STD(0x0000), // C -> RC5_STD(0x0000), // D -> RC5_STD(0x0000), // Betty -> RC5_STD(0x0000), // Exit -> RC5_STD(0x0812), // Up -> Brightness+ RC5_STD(0x0813), // Down -> Brightness- RC5_STD(0x0000), // Left -> RC5_STD(0x0000), // Right -> RC5_STD(0x0000), // OK -> RC5_STD(0x0810), // Vol+ -> Vol+ RC5_STD(0x0811), // Vol- -> Vol- RC5_STD(0x080D), // Mute -> Mute RC5_STD(0x0820), // Prog+ -> Prog+ RC5_STD(0x0821), // Prog- -> Prog- RC5_STD(0x0801), // 1 -> 1 RC5_STD(0x0802), // 2 -> 2 RC5_STD(0x0803), // 3 -> 3 RC5_STD(0x0804), // 4 -> 4 RC5_STD(0x0805), // 5 -> 5 RC5_STD(0x0806), // 6 -> 6 RC5_STD(0x0807), // 7 -> 7 RC5_STD(0x0808), // 8 -> 8 RC5_STD(0x0809), // 9 -> 9 RC5_STD(0x0800), // 0 -> 0 RC5_STD(0x080A), // -/-- -> RC5_STD(0x0000), // AV -> RC5_STD(0x0000), // Menu -> RC5_STD(0x0000), // PiP -> RC5_STD(0x0000), // A/B -> RC5_STD(0x0000), // 16:9 -> RC5_STD(0x0000), // Info -> RC5_STD(0x0000), // VTX1 -> RC5_STD(0x0000), // VTX2 -> RC5_STD(0x0000), // VTX3 -> RC5_STD(0x0000), // Blue -> RC5_STD(0x0000), // Yello -> RC5_STD(0x0000), // Green -> RC5_STD(0x0000), // Red -> RC5_STD(0x0000), // TV -> RC5_STD(0x080C) // Power -> Standby }, \ No newline at end of file diff --git a/boop/trunk/infrared/ir_codes/rc6/dvd b/boop/trunk/infrared/ir_codes/rc6/dvd new file mode 100644 index 0000000..b351666 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/rc6/dvd @@ -0,0 +1 @@ +/* infrared codes for RC6 DVD Copyright (C) 2008 p.c.squirrel 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 3 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 . */ { 0x0000, // A -> 0x0000, // B -> 0x0000, // C -> 0x0000, // D -> 0x0000, // Betty -> 0x0000, // Exit -> 0x0458, // Up -> Brightness+ 0x0459, // Down -> Brightness- 0xFBA5, // Left -> 0x045B, // Right -> 0x045C, // OK -> 0x1810, // Vol+ -> Vol+ 0x1811, // Vol- -> Vol- 0x180D, // Mute -> Mute 0x1820, // Prog+ -> Prog+ 0x1821, // Prog- -> Prog- 0x0401, // 1 -> 1 0x0402, // 2 -> 2 0x0403, // 3 -> 3 0x0404, // 4 -> 4 0x0405, // 5 -> 5 0x0406, // 6 -> 6 0x0407, // 7 -> 7 0x0408, // 8 -> 8 0x0409, // 9 -> 9 0x040A, // 0 -> 0 0x1800, // -/-- -> 0x0000, // AV -> 0x0000, // Menu -> 0x0000, // PiP -> 0x0000, // A/B -> 0x0000, // 16:9 -> 0x0000, // Info -> 0x0000, // VTX1 -> 0x0000, // VTX2 -> 0x0000, // VTX3 -> 0x0000, // Blue -> 0x0000, // Yello -> 0x0000, // Green -> 0x0000, // Red -> 0x0000, // TV -> 0x180C // Power -> Standby }, \ No newline at end of file diff --git a/boop/trunk/infrared/ir_codes/rc6/tv b/boop/trunk/infrared/ir_codes/rc6/tv new file mode 100644 index 0000000..365ee3a --- /dev/null +++ b/boop/trunk/infrared/ir_codes/rc6/tv @@ -0,0 +1 @@ +/* infrared codes for RC6 TV Copyright (C) 2008 p.c.squirrel 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 3 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 . */ { 0x0000, // A -> 0x0000, // B -> 0x0000, // C -> 0x0000, // D -> 0x0000, // Betty -> 0x0000, // Exit -> 0x0012, // Up -> Brightness+ 0x0013, // Down -> Brightness- 0x0000, // Left -> 0x0000, // Right -> 0x0000, // OK -> 0x0010, // Vol+ -> Vol+ 0x0011, // Vol- -> Vol- 0x000D, // Mute -> Mute 0x0020, // Prog+ -> Prog+ 0x0021, // Prog- -> Prog- 0x0001, // 1 -> 1 0x0002, // 2 -> 2 0x0003, // 3 -> 3 0x0004, // 4 -> 4 0x0005, // 5 -> 5 0x0006, // 6 -> 6 0x0007, // 7 -> 7 0x0008, // 8 -> 8 0x0009, // 9 -> 9 0x000A, // 0 -> 0 0x0000, // -/-- -> 0x0000, // AV -> 0x0000, // Menu -> 0x0000, // PiP -> 0x0000, // A/B -> 0x0000, // 16:9 -> 0x0000, // Info -> 0x0000, // VTX1 -> 0x0000, // VTX2 -> 0x0000, // VTX3 -> 0x0000, // Blue -> 0x0000, // Yello -> 0x0000, // Green -> 0x0000, // Red -> 0x0000, // TV -> 0x000C // Power -> Standby }, \ No newline at end of file diff --git a/boop/trunk/infrared/ir_codes/rc6/ufs922 b/boop/trunk/infrared/ir_codes/rc6/ufs922 new file mode 100644 index 0000000..ba92abf --- /dev/null +++ b/boop/trunk/infrared/ir_codes/rc6/ufs922 @@ -0,0 +1 @@ +/* infrared codes for Kathrein UFS922 Copyright (C) 2009 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 3 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 . */ { 0x00000000, // A -> 0x00000000, // B -> 0x00000000, // C -> 0x00000000, // D -> 0x00000000, // Betty -> 0x80460055, // Exit -> Back 0x80460058, // Up -> Up 0x80460059, // Down -> Down 0x8046005A, // Left -> Left 0x8046005B, // Right -> Right 0x8046005c, // OK -> OK 0x80460010, // Vol+ -> Vol+ 0x80460011, // Vol- -> Vol- 0x8046000D, // Mute -> Mute 0x8046001E, // Prog+ -> Prog+ 0x8046001F, // Prog- -> Prog- 0x80460001, // 1 -> 1 0x80460002, // 2 -> 2 0x80460003, // 3 -> 3 0x80460004, // 4 -> 4 0x80460005, // 5 -> 5 0x80460006, // 6 -> 6 0x80460007, // 7 -> 7 0x80460008, // 8 -> 8 0x80460009, // 9 -> 9 0x80460000, // 0 -> 0 0x804600CC, // -/-- -> EPG 0x80460046, // AV -> Archiv 0x80460054, // Menu -> Menue 0x80460021, // PiP -> Rewind 0x80460038, // A/B -> Play 0x80460020, // 16:9 -> Forward 0x8046000F, // Info -> Info 0x80460039, // VTX1 -> Pause 0x80460037, // VTX2 -> Record 0x80460031, // VTX3 -> Stop 0x80460070, // Blue -> Blue 0x8046006F, // Yello -> Yellow 0x8046006E, // Green -> Green 0x8046006D, // Red -> Red 0x804600D5, // TV -> Media 0x8046000C // Power -> Standby }, \ No newline at end of file diff --git a/boop/trunk/infrared/ir_codes/rca/xbox b/boop/trunk/infrared/ir_codes/rca/xbox new file mode 100644 index 0000000..38679e8 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/rca/xbox @@ -0,0 +1,62 @@ +/* + infrared codes for RCA xbox + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +{ + 0x00, // A -> + 0x00, // B -> + 0x00, // C -> + 0x00, // D -> + 0x00, // Betty -> + 0x27, // Exit -> Back + 0x59, // Up -> Up + 0x58, // Down -> Down + 0x56, // Left -> Left + 0x57, // Right -> Right + 0xF4, // OK -> Select + 0x33, // Vol+ -> + 0x36, // Vol- -> + 0x39, // Mute -> + 0x20, // Prog+ -> Skip+ + 0x22, // Prog- -> Skip- + 0x31, // 1 -> 1 + 0x32, // 2 -> 2 + 0x33, // 3 -> 3 + 0x34, // 4 -> 4 + 0x35, // 5 -> 5 + 0x36, // 6 -> 6 + 0x37, // 7 -> 7 + 0x38, // 8 -> 8 + 0x39, // 9 -> 9 + 0x30, // 0 -> 0 + 0x15, // -/-- -> Play + 0x1F, // AV -> Stop + 0x08, // Menu -> Menu + 0x19, // PiP -> Pause + 0x1C, // A/B -> Forward + 0x1D, // 16:9 -> Reverse + 0x3C, // Info -> Info + 0x1A, // VTX1 -> Title + 0x2A, // VTX2 -> Display + 0x00, // VTX3 -> + 0x00, // Blue -> + 0x00, // Yello -> + 0x00, // Green -> + 0x00, // Red -> + 0x00, // TV -> + 0x30 // Power -> +}, diff --git a/boop/trunk/infrared/ir_codes/rcmm/galaxis b/boop/trunk/infrared/ir_codes/rcmm/galaxis new file mode 100644 index 0000000..7b7767f --- /dev/null +++ b/boop/trunk/infrared/ir_codes/rcmm/galaxis @@ -0,0 +1,62 @@ +/* + rcmm_galaxis.code - infrared codes for the galaxis receiver in RCMM coding + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +{ + 0x0D500800, // A -> + 0x0D500861, // B -> Alt + 0x0D500879, // C -> List + 0x0D50080A, // D -> Back + 0x0D500845, // Betty -> Setup + 0x0D500855, // Exit -> Exit + 0x0D500858, // Up -> Up + 0x0D500859, // Down -> Down + 0x0D50085A, // Left -> Left + 0x0D50085B, // Right -> Right + 0x0D50085C, // OK -> OK + 0x0D500810, // Vol+ -> Vol+ + 0x0D500811, // Vol- -> Vol- + 0x0D50080D, // Mute -> Mute + 0x0D500820, // Prog+ -> Prog+ + 0x0D500821, // Prog- -> Prog- + 0x0D500801, // 1 -> 1 + 0x0D500802, // 2 -> 2 + 0x0D500803, // 3 -> 3 + 0x0D500804, // 4 -> 4 + 0x0D500805, // 5 -> 5 + 0x0D500806, // 6 -> 6 + 0x0D500807, // 7 -> 7 + 0x0D500808, // 8 -> 8 + 0x0D500809, // 9 -> 9 + 0x0D500800, // 0 -> 0 + 0x0D500850, // -/-- -> Audio + 0x0D5008FF, // AV -> VCR + 0x0D500878, // Menu -> Menu + 0x0D500879, // PiP -> List + 0x0D50084E, // A/B -> Language + 0x0D500861, // 16:9 -> Alt + 0x0D50080F, // Info -> Info + 0x0D50083C, // VTX1 -> Text + 0x0D50084B, // VTX2 -> Subtitle + 0x0D5008CC, // VTX3 -> EPG + 0x0D500870, // Blue -> Blue + 0x0D50086F, // Yello -> Yellow + 0x0D50086E, // Green -> Green + 0x0D50086D, // Red -> Red + 0x0D50083F, // TV -> TV + 0x0D50080C // Power -> Power +}, diff --git a/boop/trunk/infrared/ir_codes/rcmm/ufs910 b/boop/trunk/infrared/ir_codes/rcmm/ufs910 new file mode 100644 index 0000000..0554c3e --- /dev/null +++ b/boop/trunk/infrared/ir_codes/rcmm/ufs910 @@ -0,0 +1 @@ +/* infrared codes for Kathrein UFS910 Copyright (C) 2009 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 3 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 . */ { 0x00000000, // A -> 0x00000000, // B -> 0x00000000, // C -> 0x00000000, // D -> 0x00000000, // Betty -> 0x22908055, // Exit -> Back 0x22908058, // Up -> Up 0x22908059, // Down -> Down 0x2290805A, // Left -> Left 0x2290805B, // Right -> Right 0x2290805c, // OK -> OK 0x22908010, // Vol+ -> Vol+ 0x22908011, // Vol- -> Vol- 0x2290800D, // Mute -> Mute 0x2290801E, // Prog+ -> Prog+ 0x2290801F, // Prog- -> Prog- 0x22908001, // 1 -> 1 0x22908002, // 2 -> 2 0x22908003, // 3 -> 3 0x22908004, // 4 -> 4 0x22908005, // 5 -> 5 0x22908006, // 6 -> 6 0x22908007, // 7 -> 7 0x22908008, // 8 -> 8 0x22908009, // 9 -> 9 0x22908000, // 0 -> 0 0x229080CC, // -/-- -> EPG 0x00000000, // AV -> 0x22908054, // Menu -> Menue 0x22908021, // PiP -> Rewind 0x22908038, // A/B -> Play 0x22908020, // 16:9 -> Forward 0x2290800F, // Info -> Info 0x22908039, // VTX1 -> Pause 0x22908037, // VTX2 -> Record 0x22908031, // VTX3 -> Stop 0x22908070, // Blue -> Blue 0x2290806F, // Yello -> Yellow 0x2290806E, // Green -> Green 0x2290806D, // Red -> Red 0x2290803C, // TV -> Text 0x2290800C // Power -> Standby }, \ No newline at end of file diff --git a/boop/trunk/infrared/ir_codes/rec80/rak_sc957wk b/boop/trunk/infrared/ir_codes/rec80/rak_sc957wk new file mode 100644 index 0000000..2dc8181 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/rec80/rak_sc957wk @@ -0,0 +1,62 @@ +/* + infrared codes for REC80 rak sc957wk + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +{ + 0x80F64A1C, // A -> Subwoofer + 0x8024981C, // B -> Auto Off + 0x802A961C, // C -> Sleep + 0x800EA40A, // D -> Disc + 0x80208A0A, // Betty -> Program + 0x8009A30A, // Exit -> Cancel + 0x80B60A1C, // Up -> Up + 0x80BA061C, // Down -> Down + 0x80F5491C, // Left -> SkipBack/Rewind + 0x80F64A1C, // Right -> SkipForward/FastForward + 0x80000000, // OK -> + 0x80802000, // Vol+ -> Vol+ + 0x80812100, // Vol- -> Vol- + 0x80923200, // Mute -> Muting + 0x80000000, // Prog+ -> + 0x80000000, // Prog- -> + 0x80AC101C, // 1 -> 1 + 0x80AD111C, // 2 -> 2 + 0x80AE121C, // 3 -> 3 + 0x80AF131C, // 4 -> 4 + 0x80A8141C, // 5 -> 5 + 0x80A9151C, // 6 -> 6 + 0x80AA161C, // 7 -> 7 + 0x80AB171C, // 8 -> 8 + 0x80A4181C, // 9 -> 9 + 0x80A5191C, // 0 -> 0 + 0x8038841C, // -/-- -> >10 + 0x80000000, // AV -> + 0x80BC001C, // Menu -> Stop + 0x80ED470A, // PiP -> Repeat + 0x80E74D0A, // A/B -> Random + 0x80813110, // 16:9 -> 3D AI + 0x80000000, // Info -> CD + 0x80000000, // VTX1 -> Tuner + 0x80000000, // VTX2 -> Aux + 0x80338310, // VTX3 -> EQ + 0x80813110, // Blue -> Tape + 0x80349400, // Yello -> CD + 0x8000A404, // Green -> Tuner + 0x803A9A00, // Red -> Aux + 0x80000000, // TV -> + 0x80813D1C // Power -> Standby +}, diff --git a/boop/trunk/infrared/ir_codes/recs80/seleco_020 b/boop/trunk/infrared/ir_codes/recs80/seleco_020 new file mode 100644 index 0000000..d957ed9 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/recs80/seleco_020 @@ -0,0 +1,62 @@ +/* + infrared codes for RECS80 seleco 020 + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +{ + 0x0000, // A -> + 0x0000, // B -> + 0x0000, // C -> + 0x0000, // D -> + 0x0000, // Betty -> + 0x0000, // Exit -> + 0x05DC, // Up -> + 0x05DE, // Down -> + 0x05DA, // Left -> + 0x05DB, // Right -> + 0x05EC, // OK -> Enter + 0x05D0, // Vol+ -> Vol+ + 0x05D1, // Vol- -> Vol- + 0x05E9, // Mute -> Muting + 0x05CA, // Prog+ -> Prog+ + 0x05CB, // Prog- -> Prog- + 0x05C1, // 1 -> 1 + 0x05C2, // 2 -> 2 + 0x05C3, // 3 -> 3 + 0x05C4, // 4 -> 4 + 0x05C5, // 5 -> 5 + 0x05C6, // 6 -> 6 + 0x05C7, // 7 -> 7 + 0x05C8, // 8 -> 8 + 0x05C9, // 9 -> 9 + 0x05C0, // 0 -> 0 + 0x0000, // -/-- -> + 0x0000, // AV -> + 0x0000, // Menu -> + 0x0000, // PiP -> + 0x05EE, // A/B -> A/B + 0x0000, // 16:9 -> + 0x05EE, // Info -> Info + 0x05F6, // VTX1 -> VTX1 + 0x05F0, // VTX2 -> VTX3 + 0x05F7, // VTX3 -> VTX4 + 0x0000, // Blue -> + 0x0000, // Yello -> + 0x0000, // Green -> + 0x0000, // Red -> + 0x0000, // TV -> + 0x05CC // Power -> Power +}, diff --git a/boop/trunk/infrared/ir_codes/recs80/seleco_157 b/boop/trunk/infrared/ir_codes/recs80/seleco_157 new file mode 100644 index 0000000..70cd77f --- /dev/null +++ b/boop/trunk/infrared/ir_codes/recs80/seleco_157 @@ -0,0 +1,62 @@ +/* + infrared codes for RECS80 seleco 157 + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +{ + 0x0000, // A -> + 0x0000, // B -> + 0x0000, // C -> + 0x0000, // D -> + 0x0000, // Betty -> + 0x0000, // Exit -> + 0x05DC, // Up -> + 0x05DE, // Down -> + 0x05DA, // Left -> + 0x05DB, // Right -> + 0x05EC, // OK -> Enter + 0x05D0, // Vol+ -> Vol+ + 0x05D1, // Vol- -> Vol- + 0x05E9, // Mute -> Muting + 0x05D2, // Prog+ -> Prog+ + 0x05D3, // Prog- -> Prog- + 0x05C1, // 1 -> 1 + 0x05C2, // 2 -> 2 + 0x05C3, // 3 -> 3 + 0x05C4, // 4 -> 4 + 0x05C5, // 5 -> 5 + 0x05C6, // 6 -> 6 + 0x05C7, // 7 -> 7 + 0x05C8, // 8 -> 8 + 0x05C9, // 9 -> 9 + 0x05C0, // 0 -> 0 + 0x0000, // -/-- -> + 0x0000, // AV -> + 0x0000, // Menu -> + 0x0000, // PiP -> + 0x05CA, // A/B -> A/B + 0x0000, // 16:9 -> + 0x05E8, // Info -> Info + 0x05F3, // VTX1 -> VTX1 + 0x05E5, // VTX2 -> VTX2 + 0x05F6, // VTX3 -> VTX3 + 0x0000, // Blue -> + 0x0000, // Yello -> + 0x0000, // Green -> + 0x0000, // Red -> + 0x0000, // TV -> + 0x05F0 // Power -> Power +}, diff --git a/boop/trunk/infrared/ir_codes/rf/cc1100_a0 b/boop/trunk/infrared/ir_codes/rf/cc1100_a0 new file mode 100644 index 0000000..2e05ed9 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/rf/cc1100_a0 @@ -0,0 +1,62 @@ +/* + RF codes for cc1100 Adress 0 + Copyright (C) 2008 + + 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 3 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 . +*/ + +{ + 0x0000, // A -> + 0x0000, // B -> + 0x0000, // C -> + 0x0000, // D -> + 0x0000, // Betty -> + 0x0000, // Exit -> + 0x000b, // Up -> Brightness+ + 0x000c, // Down -> Brightness- + 0x000d, // Left -> Left + 0x000e, // Right -> Right + 0x000f, // OK -> OK + 0x0010, // Vol+ -> Vol+ + 0x0011, // Vol- -> Vol- + 0x0012, // Mute -> Mute + 0x0013, // Prog+ -> Prog+ + 0x0014, // Prog- -> Prog- + 0x0001, // 1 -> 1 + 0x0002, // 2 -> 2 + 0x0003, // 3 -> 3 + 0x0004, // 4 -> 4 + 0x0005, // 5 -> 5 + 0x0006, // 6 -> 6 + 0x0007, // 7 -> 7 + 0x0008, // 8 -> 8 + 0x0009, // 9 -> 9 + 0x000a, // 0 -> 0 + 0x0015, // -/-- -> -/-- + 0x0016, // AV -> AV + 0x0017, // Menu -> Menu + 0x0018, // PiP -> PiP + 0x0019, // A/B -> A/B + 0x001a, // 16:9 -> 16:9 + 0x001b, // Info -> Info + 0x001c, // VTX1 -> VTX1 + 0x001d, // VTX2 -> VTX2 + 0x001e, // VTX3 -> VTX3 + 0x001f, // Blue -> Blue + 0x0020, // Yello -> Yello + 0x0021, // Green -> Green + 0x0022, // Red -> Red + 0x0023, // TV -> TV + 0x0024 // Power -> Standby +}, diff --git a/boop/trunk/infrared/ir_codes/rf/cc1100_a1 b/boop/trunk/infrared/ir_codes/rf/cc1100_a1 new file mode 100644 index 0000000..ec84a50 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/rf/cc1100_a1 @@ -0,0 +1,62 @@ +/* + RF codes for cc1100 Adress 1 + Copyright (C) 2008 + + 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 3 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 . +*/ + +{ + 0x0000, // A -> + 0x0000, // B -> + 0x0000, // C -> + 0x0000, // D -> + 0x0000, // Betty -> + 0x0000, // Exit -> + 0x010b, // Up -> Brightness+ + 0x010c, // Down -> Brightness- + 0x010d, // Left -> Left + 0x010e, // Right -> Right + 0x010f, // OK -> OK + 0x0110, // Vol+ -> Vol+ + 0x0111, // Vol- -> Vol- + 0x0112, // Mute -> Mute + 0x0113, // Prog+ -> Prog+ + 0x0114, // Prog- -> Prog- + 0x0101, // 1 -> 1 + 0x0102, // 2 -> 2 + 0x0103, // 3 -> 3 + 0x0104, // 4 -> 4 + 0x0105, // 5 -> 5 + 0x0106, // 6 -> 6 + 0x0107, // 7 -> 7 + 0x0108, // 8 -> 8 + 0x0109, // 9 -> 9 + 0x010a, // 0 -> 0 + 0x0115, // -/-- -> -/-- + 0x0116, // AV -> AV + 0x0117, // Menu -> Menu + 0x0118, // PiP -> PiP + 0x0119, // A/B -> A/B + 0x011a, // 16:9 -> 16:9 + 0x011b, // Info -> Info + 0x011c, // VTX1 -> VTX1 + 0x011d, // VTX2 -> VTX2 + 0x011e, // VTX3 -> VTX3 + 0x011f, // Blue -> Blue + 0x0120, // Yello -> Yello + 0x0121, // Green -> Green + 0x0122, // Red -> Red + 0x0123, // TV -> TV + 0x0124 // Power -> Standby +}, diff --git a/boop/trunk/infrared/ir_codes/sirc/UFD400 b/boop/trunk/infrared/ir_codes/sirc/UFD400 new file mode 100644 index 0000000..158abcd --- /dev/null +++ b/boop/trunk/infrared/ir_codes/sirc/UFD400 @@ -0,0 +1,62 @@ +/* + infrared codes for SPACEENC seleco 027 + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +{ + 0x0000, // A -> + 0x00, // B -> + 0x00, // C -> + 0x00, // D -> + 0x00, // Betty -> + 0x47B8, // Exit -> + 0x0BF4, // Up -> Play + 0x738C, // Down -> Stop + 0x6798, // Left -> Rewind + 0x27D8, // Right -> Forward + 0x3BC4, // OK -> Enter + 0x4BB4, // Vol+ -> Vol+ + 0x2BD4, // Vol- -> Vol- + 0x1BE4, // Mute -> Muting + 0x00, // Prog+ -> Prog+ + 0x00, // Prog- -> Prog- + 0x3FC0, // 1 -> 1 + 0x5FA0, // 2 -> 2 + 0x1FE0, // 3 -> 3 + 0x6F90, // 4 -> 4 + 0x2FD0, // 5 -> 5 + 0x4FB0, // 6 -> 6 + 0x0FF0, // 7 -> 7 + 0x7788, // 8 -> 8 + 0x37C8, // 9 -> 9 + 0x7F80, // 0 -> 0 + 0x00, // -/-- -> + 0x00, // AV -> + 0x00, // Menu -> + 0x00, // PiP -> + 0x26D9, // A/B -> A/B + 0x15EA, // 16:9 -> + 0x659A, // Info -> Info + 0x6798, // VTX1 -> VTX1 + 0x7B84, // VTX2 -> VTX3 + 0x5EA1, // VTX3 -> VTX4 + 0x00, // Blue -> + 0x00, // Yello -> + 0x00, // Green -> + 0x00, // Red -> Pause + 0x07F8, // TV -> + 0x5BA4 // Power -> Power +}, diff --git a/boop/trunk/infrared/ir_codes/sirc/rm-pp411 b/boop/trunk/infrared/ir_codes/sirc/rm-pp411 new file mode 100644 index 0000000..d849442 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/sirc/rm-pp411 @@ -0,0 +1,64 @@ +/* + Infrared codes for Sony RM-PP411 Receiver AV2 + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +// 15 bit commands, msb = 1 + +{ + 0x0000, // A -> + 0x0000, // B -> + 0x0000, // C -> + 0x0000, // D -> + 0xD877, // Betty -> Main Menu + 0x9860, // Exit -> Sleep + 0x0000, // Up -> + 0x0000, // Down -> + 0x0000, // Left -> + 0x0000, // Right -> + 0x0000, // OK -> + 0x9812, // Vol+ -> Master Vol+ + 0x9813, // Vol- -> Master Vol- + 0x9814, // Mute -> Muting + 0xD86E, // Prog+ -> Mode+ + 0xD86F, // Prog- -> Mode- + 0x9822, // 1 -> Video 1 + 0x981E, // 2 -> Video 2 + 0x9842, // 3 -> Video 3 + 0x987D, // 4 -> DVD/LD + 0x9869, // 5 -> MD/Tape + 0x9825, // 6 -> CD/SACD + 0x9821, // 7 -> Tuner + 0x9820, // 8 -> Phono + 0x981D, // 9 -> Aux + 0x9849, // 0 -> Analog Direct + 0xD841, // -/-- -> 2 CH + 0x0000, // AV -> + 0x0000, // Menu -> + 0x0000, // PiP -> + 0x0000, // A/B -> + 0x0000, // 16:9 -> + 0x9853, // Info -> On Screen + 0x9815, // VTX1 -> I/O + 0xD847, // VTX2 -> AUTO Decoding + 0x9817, // VTX3 -> MPX/Dual + 0xD826, // Blue -> Preset + 0xD84A, // Yello -> Test Tone + 0xBCFB, // Green -> Source + 0x9872, // Red -> Multi CH + 0x986A, // TV -> TV/Sat + 0x8237, // Power -> Standby +}, diff --git a/boop/trunk/infrared/ir_codes/sirc/tv b/boop/trunk/infrared/ir_codes/sirc/tv new file mode 100644 index 0000000..02ab553 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/sirc/tv @@ -0,0 +1,64 @@ +/* + Infrared codes for Sony TV + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +// 12 bit commands (MSB = 0) + +{ + 0x0000, // A -> + 0x0000, // B -> + 0x0000, // C -> + 0x0000, // D -> + 0x0000, // Betty -> + 0x0000, // Exit -> + 0x0000, // Up -> + 0x0000, // Down -> + 0x0000, // Left -> + 0x0000, // Right -> + 0x0000, // OK -> + 0x0092, // Vol+ -> Vol+ + 0x0093, // Vol- -> Vol- + 0x0094, // Mute -> Mute + 0x0090, // Prog+ -> Prog+ + 0x0091, // Prog- -> Prog- + 0x0080, // 1 -> 1 + 0x0081, // 2 -> 2 + 0x0082, // 3 -> 3 + 0x0083, // 4 -> 4 + 0x0084, // 5 -> 5 + 0x0085, // 6 -> 6 + 0x0086, // 7 -> 7 + 0x0087, // 8 -> 8 + 0x0088, // 9 -> 9 + 0x0089, // 0 -> 0 + 0x009D, // -/-- -> -/-- + 0x00A5, // AV -> Ext + 0x0000, // Menu -> + 0x0000, // PiP -> + 0x0000, // A/B -> + 0x0000, // 16:9 -> + 0x0000, // Info -> + 0x00BF, // VTX1 -> Teletext + 0x0000, // VTX2 -> + 0x0000, // VTX3 -> + 0x0182, // Blue -> Blue + 0x0182, // Yellow -> Yellow + 0x0181, // Green -> Green + 0x0180, // Red -> Red + 0x00B8, // TV -> TV + 0x0095 // Power -> +}, diff --git a/boop/trunk/infrared/ir_codes/spaceenc/schneider_dtv3 b/boop/trunk/infrared/ir_codes/spaceenc/schneider_dtv3 new file mode 100644 index 0000000..488e73d --- /dev/null +++ b/boop/trunk/infrared/ir_codes/spaceenc/schneider_dtv3 @@ -0,0 +1,62 @@ +/* + infrared codes for SPACEENC schneider dtv3 + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +{ + 0x00, // A -> + 0x00, // B -> + 0x00, // C -> + 0x00, // D -> + 0x00, // Betty -> + 0x00, // Exit -> + 0x00, // Up -> Chan+ Fast + 0x00, // Down -> Chan- Fast + 0x00, // Left -> Vol- Fast + 0x00, // Right -> Vol+ Fast + 0x00, // OK -> + 0x05, // Vol+ -> Vol+ + 0x06, // Vol- -> Vol- + 0x00, // Mute -> + 0x07, // Prog+ -> Chan+ + 0x08, // Prog- -> Chan-- + 0x00, // 1 -> + 0x00, // 2 -> + 0x00, // 3 -> + 0x00, // 4 -> + 0x00, // 5 -> + 0x00, // 6 -> + 0x00, // 7 -> + 0x00, // 8 -> + 0x00, // 9 -> + 0x00, // 0 -> + 0x00, // -/-- -> + 0x00, // AV -> + 0x00, // Menu -> + 0x00, // PiP -> + 0x00, // A/B -> + 0x00, // 16:9 -> + 0x09, // Info -> White + 0x00, // VTX1 -> + 0x00, // VTX2 -> + 0x00, // VTX3 -> + 0x0A, // Blue -> Blue + 0x0B, // Yello -> Yellow + 0x0C, // Green -> Green + 0x0D, // Red -> Red + 0x00, // TV -> + 0x0E // Power -> Power +}, diff --git a/boop/trunk/infrared/ir_codes/spaceenc/schneider_dtv3_xtra b/boop/trunk/infrared/ir_codes/spaceenc/schneider_dtv3_xtra new file mode 100644 index 0000000..da11f31 --- /dev/null +++ b/boop/trunk/infrared/ir_codes/spaceenc/schneider_dtv3_xtra @@ -0,0 +1,55 @@ +/* + infrared codes for SPACEENC schneider dtv3 + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +const unsigned int dtv3_codes[15] = +{ + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0000003F, // Vol+ + 0x0008007E, // Vol- + 0x0000207F, // Chan+ + 0x000840FC, // Chan- + 0x90000027, // White + 0x2000004F, // Blue + 0x08000067, // Yellow + 0xC000000F, // Green + 0x8000001F, // Red + 0x30000087 // Power +}; + +const unsigned char dtv3_pre[15] = +{ + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xFF, // Vol+ + 0x7F, // Vol- + 0xCF, // Chan+ + 0xCF, // Chan- + 0xFF, // White + 0xFF, // Blue + 0xFF, // Yellow + 0xFF, // Green + 0xFF, // Red + 0xFF // Power +}; diff --git a/boop/trunk/infrared/ir_codes/spaceenc/seleco_027 b/boop/trunk/infrared/ir_codes/spaceenc/seleco_027 new file mode 100644 index 0000000..08ec25e --- /dev/null +++ b/boop/trunk/infrared/ir_codes/spaceenc/seleco_027 @@ -0,0 +1,62 @@ +/* + infrared codes for SPACEENC seleco 027 + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +{ + 0x00, // A -> + 0x00, // B -> + 0x00, // C -> + 0x00, // D -> + 0x00, // Betty -> + 0x00, // Exit -> + 0x1C, // Up -> Play + 0x1E, // Down -> Stop + 0x1A, // Left -> Rewind + 0x1B, // Right -> Forward + 0x07, // OK -> Enter + 0x01, // Vol+ -> Vol+ + 0x02, // Vol- -> Vol- + 0x05, // Mute -> Muting + 0x03, // Prog+ -> Prog+ + 0x04, // Prog- -> Prog- + 0x10, // 1 -> 1 + 0x11, // 2 -> 2 + 0x12, // 3 -> 3 + 0x13, // 4 -> 4 + 0x14, // 5 -> 5 + 0x15, // 6 -> 6 + 0x16, // 7 -> 7 + 0x17, // 8 -> 8 + 0x18, // 9 -> 9 + 0x19, // 0 -> 0 + 0x00, // -/-- -> + 0x00, // AV -> + 0x00, // Menu -> + 0x00, // PiP -> + 0x1F, // A/B -> A/B + 0x00, // 16:9 -> + 0x28, // Info -> Info + 0x3F, // VTX1 -> VTX1 + 0x0B, // VTX2 -> VTX3 + 0x0D, // VTX3 -> VTX4 + 0x00, // Blue -> + 0x00, // Yello -> + 0x00, // Green -> + 0x1D, // Red -> Pause + 0x00, // TV -> + 0x0E // Power -> Power +}, diff --git a/boop/trunk/infrared/ir_itt.c b/boop/trunk/infrared/ir_itt.c new file mode 100644 index 0000000..6294cc4 --- /dev/null +++ b/boop/trunk/infrared/ir_itt.c @@ -0,0 +1,213 @@ +/* + ir_itt.c - itt protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lpc2220.h" +#include "infrared.h" +#include "ir_itt.h" +#include "encoders.h" +#include "codes.h" + +const struct irModule ITT_Module = +{ + ITT_Encode, + ITT_Send, + ITT_Repeat, + ITT_Stop, + 103, // carrier + 2, // carrier-on + 3 // carrier-off +}; + +const struct irModule ITT2_Module = +{ + ITT_Encode, + ITT_Send, + ITT_Repeat, + ITT_Stop, + 111, // carrier + 1, // carrier-on + 3 // carrier-off +}; + +extern volatile unsigned char mod_enable; +extern volatile unsigned int cycles; +extern volatile unsigned long keyMap[42]; + +#define ITT_IDLE 0x00 +#define ITT_LEADIN_A 0x01 +#define ITT_LEADIN_B 0x02 +#define ITT_START_A 0x03 +#define ITT_START_B 0x04 +#define ITT_BIT_A 0x05 +#define ITT_BIT_B 0x06 +#define ITT_LEADOUT_A 0x07 +#define ITT_LEADOUT_B 0x08 +#define ITT_STOP 0x09 +#define ITT_WAIT 0x0A + +#define ITT_LEADTIME 13 +#define ITT_BITTIME_0 4 +#define ITT_BITTIME_1 8 +#define ITT_WAITTIME 130 + +#define ITT2_LEADTIME 15 +#define ITT2_BITTIME_0 4 +#define ITT2_BITTIME_1 9 + +void __attribute__ ((section(".text.fastcode"))) ITT_Encode (void) +{ + switch(ir.state) + { + case ITT_IDLE: + mod_enable = 0; + break; + + case ITT_LEADIN_A: + case ITT_START_A: + case ITT_BIT_A: + case ITT_LEADOUT_A: + case ITT_STOP: + cycles = 1; + mod_enable = 1; + ir.state++; + break; + + case ITT_LEADIN_B: + case ITT_LEADOUT_B: + mod_enable = 0; + cycles = ir.general.leadtime; + ir.state++; + break; + + case ITT_START_B: + mod_enable = 0; + cycles = ir.general.bittime0; + ir.state++; + break; + + case ITT_BIT_B: + mod_enable = 0; + if(ir.cmd & 0x01) + cycles = ir.general.bittime1; + else + cycles = ir.general.bittime0; + ir.cmd >>= 1; + ir.general.bit++; + if(ir.general.bit == ir.general.numbits) + ir.state++; + else + ir.state--; + break; + + case ITT_WAIT: + mod_enable = 0; + cycles = 40; + ir.general.wait++; + if(ir.general.wait >= ITT_WAITTIME) + { + ir.general.bit = 0; + ir.general.wait = 0; + ir.state = ITT_IDLE; + } + break; + } +} + +void ITT_LoadMap(unsigned char map) +{ + switch(map) + { + case 2: + ir.general.leadtime = ITT2_LEADTIME; + ir.general.bittime0 = ITT2_BITTIME_0; + ir.general.bittime1 = ITT2_BITTIME_1; + setIR(ITT2_Module); + break; + default: + ir.general.leadtime = ITT_LEADTIME; + ir.general.bittime0 = ITT_BITTIME_0; + ir.general.bittime1 = ITT_BITTIME_1; + setIR(ITT_Module); + break; + } +} + +void ITT_Init(unsigned char map) +{ + if(map < ITT.num_tables) + { + ir.state = ITT_IDLE; + ir.cmd = 0x0000; + ir.actcmd = 0x0000; + ir.general.bit = 0x00; + ir.general.numbits = 0x0A; + ir.general.wait = 0; + copyMapS((unsigned short*)ITT.table[map].codes); + ITT_LoadMap(map); + cycles = 1; + } +} + +void ITT_Send(unsigned long cmd) +{ + ir.actcmd = cmd; + setIRspeed(ITT_Module); + if(ir.actcmd != 0x0000) + { + if(ir.state == ITT_IDLE) + { + ir.cmd = ir.actcmd; + ir.state++; + runIR(); + } + } +} + +void ITT_Repeat(void) +{ + if(ir.actcmd != 0x0000) + { + if(ir.state == ITT_IDLE) + { + ir.cmd = ir.actcmd ^ 0x00f; + ir.state++; + runIR(); + } + } +} + +void ITT_Stop(void) +{ +/* +waitend1: + if(ir.state != ITT_IDLE) + goto waitend1; + + ir.state++; +*/ + if(ir.actcmd != 0x00000000) + { +waitend2: + if(ir.state != ITT_IDLE) + goto waitend2; + } + ir.actcmd = 0x0000; + stopIR(); +} + + diff --git a/boop/trunk/infrared/ir_itt.h b/boop/trunk/infrared/ir_itt.h new file mode 100644 index 0000000..b9faf4f --- /dev/null +++ b/boop/trunk/infrared/ir_itt.h @@ -0,0 +1,29 @@ +/* + ir_itt.h - itt protocol ir encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_ITT_H +#define IR_ITT_H + +void ITT_Encode (void) __attribute__ ((section(".text.fastcode"))); + +void ITT_Init(unsigned char map); +void ITT_Send(unsigned long cmd); +void ITT_Repeat(void); +void ITT_Stop(void); + +#endif diff --git a/boop/trunk/infrared/ir_lirc.c b/boop/trunk/infrared/ir_lirc.c new file mode 100644 index 0000000..7e34d60 --- /dev/null +++ b/boop/trunk/infrared/ir_lirc.c @@ -0,0 +1,451 @@ +/* + ir_lirc.c - lirc ir encoder + Copyright (C) 2009 + + 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 3 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 "lpc2220.h" +#include "infrared.h" +#include "ir_lirc.h" +#include "encoders.h" +#include "codes.h" +#include "fonty.h" +#include "lcd.h" +#include "rf.h" +#include "cc1100.h" + +#include "global.h" + +extern volatile unsigned char mod_enable; +extern volatile unsigned int cycles; +extern volatile unsigned long keyMap[42]; + +/* +#define RAW_IDLE 0x00 +#define RAW_HI 0x01 +#define RAW_LO 0x02 +*/ + +#define LIRC_IDLE 0x00 +#define LIRC_HEAD_P 0x01 +#define LIRC_HEAD_S 0x02 +#define LIRC_LEAD_P 0x03 +#define LIRC_PRE_DAT_P 0x04 +#define LIRC_PRE_DAT_S 0x05 +#define LIRC_PRE_P 0x06 +#define LIRC_PRE_S 0x07 +#define LIRC_DATA_P 0x08 +#define LIRC_DATA_S 0x09 +#define LIRC_POST_P 0x0A +#define LIRC_POST_S 0x0B +#define LIRC_POST_DAT_P 0x0C +#define LIRC_POST_DAT_S 0x0D +#define LIRC_REPEAT_P 0x0E +#define LIRC_REPEAT_S 0x0F +#define LIRC_TRAIL_P 0x10 +#define LIRC_FOOT_S 0x11 +#define LIRC_FOOT_P 0x12 +#define LIRC_GAP 0x13 + +const struct irModule LIRC_Module = +{ + LIRC_Encode, + LIRC_Send, + LIRC_Repeat, + LIRC_Stop, + 136, // carrier + 1, // carrier-on + 3 // carrier-off +}; + + +unsigned char __attribute__ ((section(".text.fastcode"))) send_data (unsigned long data, unsigned char pulse) { + + const unsigned char* bittimes[4] = {&(ir.lirc.pzero), &(ir.lirc.pone), &(ir.lirc.ptwo), &(ir.lirc.pthree)}; + unsigned char notpulse = 1; + + if(pulse) { + pulse = 1; + notpulse = 0; + } + + if(is_rcmm) { + switch(data & 0xC0000000) { + case 0x00000000: + cycles = bittimes[0][notpulse]; + break; + case 0x40000000: + cycles = bittimes[1][notpulse]; + break; + case 0x80000000: + cycles = bittimes[2][notpulse]; + break; + case 0xC0000000: + cycles = bittimes[3][notpulse]; + break; + } + mod_enable = pulse; + if(!pulse) { + ir.lirc.bit +=2; + return(2); + } + return(0); + } + else if(is_biphase) { + if(data & 0x80000000) { + cycles = bittimes[1][pulse]; + mod_enable = notpulse; + } + else { + cycles = bittimes[0][notpulse]; + mod_enable = pulse; + } + if((ir.lirc.bit+1 == ir.lirc.rc6_bit)) + cycles <<= 1; + } + else { + if(data & 0x80000000) { + cycles = bittimes[1][notpulse]; + } + else { + cycles = bittimes[0][notpulse]; + } + mod_enable = pulse; + } + if(!pulse) { + ir.lirc.bit++; + return(1); + } + return(0); +} + +void __attribute__ ((section(".text.fastcode"))) LIRC_Encode (void) { + unsigned short gap; + + ir.lirc.cycles_counter += cycles; + + switch(ir.state) + { + case LIRC_IDLE: + cycles = ir.lirc.pone; + mod_enable = 0; + break; + case LIRC_HEAD_P: + ir.lirc.cycles_counter = 0; + if(has_header && (!ir.lirc.repeats || (!(ir.lirc.flags&LIRC_NO_HEAD_REP) && !has_repeat) || (ir.lirc.flags&LIRC_REPEAT_HEADER))) { // + mod_enable = 1; + cycles = ir.lirc.phead; + ir.state++; + break; + case LIRC_HEAD_S: + mod_enable = 0; + cycles = ir.lirc.shead; + ir.state++; + break; + } + ir.state = LIRC_LEAD_P; + case LIRC_LEAD_P: + if(ir.lirc.plead) { + mod_enable = 1; + cycles = ir.lirc.plead; + ir.state++; + break; + } + ir.state++; + case LIRC_PRE_DAT_P: + if(!has_repeat || !(ir.lirc.repeats)) { + if(ir.lirc.pre_data_bits) { + send_data(ir.lirc.pre_data,1); + ir.state++; + break; + case LIRC_PRE_DAT_S: + ir.lirc.pre_data <<= send_data(ir.lirc.pre_data,0); + if(ir.lirc.bit >= ir.lirc.pre_data_bits) + ir.state++; + else + ir.state--; + break; + case LIRC_PRE_P: + if(ir.lirc.pre_p && ir.lirc.pre_s) { + mod_enable = 1; + cycles = ir.lirc.pre_p; + ir.state++; + break; + case LIRC_PRE_S: + mod_enable = 0; + cycles = ir.lirc.pre_s; + ir.state++; + break; + } + } + ir.state = LIRC_DATA_P; + case LIRC_DATA_P: + send_data(ir.cmd,1); + ir.state++; + break; + case LIRC_DATA_S: + ir.cmd <<= send_data(ir.cmd,0); + if(ir.lirc.bit >= ir.lirc.pre_data_bits + ir.lirc.bits) + ir.state++; + else + ir.state--; + break; + case LIRC_POST_P: + if(ir.lirc.post_data_bits) { + if(ir.lirc.post_p && ir.lirc.post_s) { + mod_enable = 1; + cycles = ir.lirc.post_p; + ir.state++; + break; + case LIRC_POST_S: + mod_enable = 0; + cycles = ir.lirc.post_s; + ir.state++; + break; + } + ir.state = LIRC_POST_DAT_P; + case LIRC_POST_DAT_P: + send_data(ir.lirc.post_data,1); + ir.state++; + break; + case LIRC_POST_DAT_S: + ir.lirc.post_data <<= send_data(ir.lirc.post_data,0); + if(ir.lirc.bit >= ir.lirc.pre_data_bits + ir.lirc.bits +ir.lirc.post_data_bits) + ir.state = LIRC_TRAIL_P; + else + ir.state--; + break; + } + } + ir.state = LIRC_REPEAT_P; + case LIRC_REPEAT_P: + if(has_repeat && ir.lirc.repeats) { + mod_enable = 1; + cycles = ir.lirc.prepeat; + ir.state++; + break; + case LIRC_REPEAT_S: + mod_enable = 0; + cycles = ir.lirc.srepeat; + ir.state++; + break; + } + ir.state = LIRC_TRAIL_P; + case LIRC_TRAIL_P: + if(ir.lirc.ptrail) { + mod_enable = 1; + cycles = ir.lirc.ptrail; + ir.state++; + break; + } + ir.state++; + case LIRC_FOOT_S: + if(has_foot && (!ir.lirc.repeats || !(ir.lirc.flags&LIRC_NO_FOOT_REP)) && (!has_repeat || !ir.lirc.repeats)) { + mod_enable = 0; + cycles = ir.lirc.sfoot; + ir.state++; + break; + case LIRC_FOOT_P: + mod_enable = 1; + cycles = ir.lirc.pfoot; + ir.state++; + break; + } + case LIRC_GAP: + default: + mod_enable = 0; + ir.lirc.bit = 0; + ir.cmd = ir.actcmd; + ir.lirc.pre_data = ir.lirc.actpre_data; + ir.lirc.post_data = ir.lirc.actpost_data; + + if((ir.lirc.repeat_gap && has_repeat && ir.lirc.repeats) | (is_RF && (ir.lirc.repeats >= ir.lirc.min_repeat))) + gap = ir.lirc.repeat_gap; + else + gap = ir.lirc.gap; + + if(is_const && (ir.lirc.cycles_counter < gap)) + cycles = gap - ir.lirc.cycles_counter; + else + cycles = gap; + + if((ir.lirc.repeats >= ir.lirc.min_repeat) && ir.lirc.stop) { + ir.state = LIRC_IDLE; + } + else { + if(ir.lirc.repeats < 0xff) + ir.lirc.repeats++; + ir.state = LIRC_HEAD_P; + } + } +} + +void LIRC_Init(unsigned char map) +{ + unsigned long freq; + struct CODE_TABLE_L *lirctable; + + if(map < LIRC.num_tables) { + + lirctable = (struct CODE_TABLE_L*)&(LIRC.table[map]); + + copyMapI((unsigned int*)LIRC.table[map].codes); + setIR(LIRC_Module); + + if(lirctable->flags&LIRC_RF) { + hi_border = 0; + lo_border = 1; + freq = 20000; + } + else { + freq = lirctable->freq; + if(!freq) + freq = 38000; + + if(lirctable->duty_cycle == 0) { //default 50% + hi_border = 1; + lo_border = 2; + } + else if(lirctable->duty_cycle <= 25) { + hi_border = 1; + lo_border = 4; + } + else if(lirctable->duty_cycle <= 33) { + hi_border = 1; + lo_border = 3; + } + else if(lirctable->duty_cycle <= 50) { + hi_border = 1; + lo_border = 2; + } + else if(lirctable->duty_cycle <= 66) { + hi_border = 2; + lo_border = 3; + } + else { //75% + hi_border = 3; + lo_border = 4; + } + } + + T1MR0 = 15000000 / (freq * lo_border); + + + ir.lirc.phead = (lirctable->phead * freq) / 1000000; + ir.lirc.shead = (lirctable->shead * freq) / 1000000; + + ir.lirc.plead = (lirctable->plead * freq) / 1000000; + + ir.lirc.actpre_data = (lirctable->pre_data)<<(32-lirctable->pre_data_bits); + ir.lirc.pre_data_bits = lirctable->pre_data_bits; + ir.lirc.pre_p = (lirctable->pre_p * freq) / 1000000; + ir.lirc.pre_s = (lirctable->pre_s * freq) / 1000000; + + ir.lirc.post_p = (lirctable->post_p * freq) / 1000000; + ir.lirc.post_s = (lirctable->post_s * freq) / 1000000; + ir.lirc.actpost_data = (lirctable->post_data)<<(32-lirctable->post_data_bits); + ir.lirc.post_data_bits = lirctable->post_data_bits; + + ir.lirc.ptrail = (lirctable->ptrail * freq) / 1000000; + + ir.lirc.pfoot = (lirctable->pfoot * freq) / 1000000; + ir.lirc.sfoot = (lirctable->sfoot * freq) / 1000000; + + ir.lirc.prepeat = (lirctable->prepeat * freq) / 1000000; + ir.lirc.srepeat = (lirctable->srepeat * freq) / 1000000; + + ir.lirc.pzero = (lirctable->pzero * freq) / 1000000; + ir.lirc.szero = (lirctable->szero * freq) / 1000000; + ir.lirc.pone = (lirctable->pone * freq) / 1000000; + ir.lirc.sone = (lirctable->sone * freq) / 1000000; + ir.lirc.ptwo = (lirctable->ptwo * freq) / 1000000; + ir.lirc.stwo = (lirctable->stwo * freq) / 1000000; + ir.lirc.pthree = (lirctable->pthree * freq) / 1000000; + ir.lirc.sthree = (lirctable->sthree * freq) / 1000000; + + ir.lirc.gap = (lirctable->gap * freq) / 1000000; + ir.lirc.repeat_gap = (lirctable->repeat_gap * freq) / 1000000; + + ir.lirc.rc6_bit = lirctable->rc6_bit; + ir.lirc.flags = lirctable->flags; + ir.lirc.bits = lirctable->bits; + ir.lirc.min_repeat = lirctable->min_repeat; + + ir.cmd = 0; + ir.actcmd = 0; + ir.lirc.stop = 0; + ir.state = LIRC_IDLE; + ir.lirc.bit = 0; + ir.lirc.map = map; + + } +} + +void LIRC_Send(unsigned long cmd) +{ + unsigned long togglemask; + if(cmd != 0x0000) { + + ir.lirc.pre_data = ir.lirc.actpre_data; + ir.actcmd = cmd<<(32-ir.lirc.bits); + ir.lirc.post_data = ir.lirc.actpost_data; + ir.lirc.stop = 0; + ir.lirc.repeats = 0; + + if(ir.toggle & 0x01) { + togglemask = (unsigned long)(LIRC.table[ir.lirc.map].toggle_bit_mask) << (32-ir.lirc.post_data_bits); + ir.lirc.post_data ^= togglemask; + + togglemask = (unsigned long)(LIRC.table[ir.lirc.map].toggle_bit_mask>>ir.lirc.post_data_bits) << (32-ir.lirc.bits); + ir.actcmd ^= togglemask; + + togglemask = (unsigned long)(LIRC.table[ir.lirc.map].toggle_bit_mask>>(ir.lirc.post_data_bits + ir.lirc.bits)) << (32-ir.lirc.pre_data_bits); + ir.lirc.pre_data ^= togglemask; + } + + if(ir.state == LIRC_IDLE) { + ir.cmd = ir.actcmd; + ir.lirc.bit = 0; + ir.state++; + if(is_RF) { + RFasyncmode(true); + cc1100_write1(FREQ2,((LIRC.table[ir.lirc.map].freq)>>16) & 0xFF); + cc1100_write1(FREQ1,((LIRC.table[ir.lirc.map].freq)>>8) & 0xFF); + cc1100_write1(FREQ0,(LIRC.table[ir.lirc.map].freq) & 0xFF); + cc1100_strobe(STX); + } + runIR(); + } + } +} + +void LIRC_Repeat(void) { + +} + +void LIRC_Stop(void) +{ + ir.lirc.stop = 1; + if(ir.lirc.bits){ + while(ir.state != LIRC_IDLE); + } + + ir.toggle++; + ir.actcmd = 0x0000; + stopIR(); + if(is_RF) { + RFasyncmode(false); + } +} diff --git a/boop/trunk/infrared/ir_lirc.h b/boop/trunk/infrared/ir_lirc.h new file mode 100644 index 0000000..2154aa9 --- /dev/null +++ b/boop/trunk/infrared/ir_lirc.h @@ -0,0 +1,63 @@ +/* + ir_lirc.h - lirc ir encoder + Copyright (C) 2009 + + 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 3 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 IR_LIRC_H +#define IR_LIRC_H + + +#define LIRC_RC5 0x0002 /* IR data follows RC5 protocol */ +#define LIRC_SHIFT_ENC LIRC_RC5 /* IR data is shift encoded (name obsolete) */ +#define LIRC_RC6 0x0004 /* IR data follows RC6 protocol */ +#define LIRC_RCMM 0x0008 /* IR data follows RC-MM protocol */ +#define LIRC_SPACE_ENC 0x0010 /* IR data is space encoded */ +//#define LIRC_SPACE_FIRST 0x0020 /* bits are encoded as space+pulse */ +//#define LIRC_GOLDSTAR 0x0040 /* encoding found on Goldstar remote */ +//#define LIRC_GRUNDIG 0x0080 /* encoding found on Grundig remote */ +//#define LIRC_BO 0x0100 /* encoding found on Bang & Olufsen remote */ +#define LIRC_RF 0x0100 /* RF ASK/OOK modulator */ +//#define LIRC_SERIAL 0x0200 /* serial protocol */ +//#define LIRC_XMP 0x0400 /* XMP protocol */ + +/* additinal flags: can be orred together with protocol flag */ +//#define REVERSE 0x0800 +#define LIRC_NO_HEAD_REP 0x1000 /* no header for key repeats */ +#define LIRC_NO_FOOT_REP 0x2000 /* no foot for key repeats */ +#define LIRC_CONST_LENGTH 0x4000 /* signal length+gap is always constant */ +#define LIRC_REPEAT_HEADER 0x8000 /* header is also sent before repeat code */ + +#define is_rc6 (ir.lirc.flags & LIRC_RC6) +#define is_biphase ((ir.lirc.flags & LIRC_RC5) || is_rc6) +#define is_rcmm (ir.lirc.flags & LIRC_RCMM) +#define is_const (ir.lirc.flags & LIRC_CONST_LENGTH) +#define is_RF (ir.lirc.flags & LIRC_RF) +#define has_header (ir.lirc.phead && ir.lirc.shead) +#define has_foot (ir.lirc.pfoot && ir.lirc.sfoot) +#define has_repeat (ir.lirc.prepeat && ir.lirc.srepeat) + +//FS20 Protocol description see http://fhz4linux.info/tiki-index.php?page=FS20%20Protocol +#define calcFS20pre(HC1,par1,HC2,par2) ((1<<18) | (HC1<<10) | (par1<<9) | (HC2<<1) | par2) +#define calcFS20code(Adr,parAdr,Cmd,parCmd,Chk,parChk) ((Adr<<19) | (parAdr<<18) | (Cmd<<10) | (parCmd<<9) | (Chk<<1) | parChk) + +void LIRC_Encode (void) __attribute__ ((section(".text.fastcode"))); + +void LIRC_Init(unsigned char map); +void LIRC_Send(unsigned long cmd); +void LIRC_Repeat(void); +void LIRC_Stop(void); + +#endif diff --git a/boop/trunk/infrared/ir_nrc17.c b/boop/trunk/infrared/ir_nrc17.c new file mode 100644 index 0000000..afbe81f --- /dev/null +++ b/boop/trunk/infrared/ir_nrc17.c @@ -0,0 +1,211 @@ +/* + ir_nrc17.c - nokia remote control 17 encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lpc2220.h" +#include "infrared.h" +#include "ir_nrc17.h" +#include "encoders.h" +#include "codes.h" + +#define NRC17_IDLE 0x00 +#define NRC17_PRE_A 0x01 +#define NRC17_PRE_B 0x02 +#define NRC17_START_A 0x03 +#define NRC17_START_B 0x04 +#define NRC17_BIT_A 0x05 +#define NRC17_BIT_B 0x06 +#define NRC17_WAIT 0x07 + +#define NRC17_BONTIME 19 +#define NRC17_BOFFTIME 19 +#define NRC17_PTIME 95 +#define NRC17_GTIME 156 +#define NRC17_WTIME 38 + +#define NRC17_STARTSTOP_DBOX2 0xFEFF +#define NRC17_STARTSTOP_TP720 0x01FF + +const struct irModule NRC17_Module = +{ + NRC17_Encode, + NRC17_Send, + NRC17_Repeat, + NRC17_Stop, + 132, // carrier + 1, // carrier-on + 3 // carrier-off +}; + +extern volatile unsigned char mod_enable; +extern volatile unsigned int cycles; +extern volatile unsigned long keyMap[42]; + +void __attribute__ ((section(".text.fastcode"))) NRC17_Encode(void) +{ + switch(ir.state) + { + case NRC17_IDLE: + mod_enable = 0; + break; + + case NRC17_PRE_A: + case NRC17_START_A: + cycles = NRC17_BONTIME; // 0.5 ms + mod_enable = 1; + ir.state++; + break; + + case NRC17_PRE_B: + case NRC17_START_B: + if(ir.state == NRC17_PRE_B) + cycles = NRC17_PTIME; // 2,5 ms + else + cycles = NRC17_BOFFTIME; // 0.5 ms + mod_enable = 0; + ir.state++; + break; + + case NRC17_BIT_A: + if(ir.cmd & 0x0001) + mod_enable = 1; + else + mod_enable = 0; + ir.cmd >>= 1; + ir.state++; + break; + + case NRC17_BIT_B: + if(mod_enable == 1) + mod_enable = 0; + else + mod_enable = 1; + ir.general.bit++; + if(ir.general.bit == ir.general.numbits) + ir.state++; + else + ir.state--; + break; + + case NRC17_WAIT: + mod_enable = 0; + ir.general.wait++; + cycles = NRC17_BONTIME; // 1 ms + if(ir.general.wait >= ir.general.pause) + { + ir.general.bit = 0; + ir.general.wait = 0; + ir.general.pause = NRC17_PTIME; + ir.state = NRC17_IDLE; + } + break; + + } +} +/* +void NRC17_CopyMap(unsigned char xtra, unsigned short *map) +{ + int x; + for(x=0;x<42;x++) + { + keyMap[x] = map[x]; + } +}*/ + +void NRC17_LoadMap(unsigned char map) +{ + switch(map) + { + case 1: // tp720 - tv, 9 bit data + ir.general.startstop = NRC17_STARTSTOP_TP720; + ir.general.numbits = 9; + break; + default: // nokia dbox2, 16 bit data + ir.general.startstop = NRC17_STARTSTOP_DBOX2; + ir.general.numbits = 16; + break; + } + +} + +void NRC17_Init(unsigned char map) +{ + if(map < NRC17.num_tables) + { + ir.state = NRC17_IDLE; + ir.cmd = 0x0000; + ir.actcmd = 0x0000; + ir.general.bit = 0x00; + ir.general.numbits = 16; + ir.general.wait = 0; + ir.general.pause = NRC17_BONTIME; + copyMapS((unsigned short*)NRC17.table[map].codes); + NRC17_LoadMap(map); + setIR(NRC17_Module); + } +} + +void NRC17_Send(unsigned long cmd) +{ + ir.actcmd = cmd; + if(ir.actcmd != 0x0000) + { + setIRspeed(NRC17_Module); + if(ir.state == NRC17_IDLE) + { + ir.general.pause = NRC17_WTIME; + ir.cmd = ir.general.startstop; + ir.state++; + runIR(); + } + } +} + +void NRC17_Repeat(void) +{ + if(ir.actcmd != 0x0000) + { + if(ir.state == NRC17_IDLE) + { + ir.general.pause = NRC17_GTIME; + ir.cmd = ir.actcmd; + ir.state++; + } + } +} + +void NRC17_Stop(void) +{ + if(ir.actcmd != 0x0000) + { +retry: + if(ir.state == NRC17_IDLE) + { + ir.cmd = ir.general.startstop; + ir.state++; + } + else + goto retry; + +waitend: + if(ir.state != NRC17_IDLE) + goto waitend; + } + ir.actcmd = 0x0000; + stopIR(); +} + diff --git a/boop/trunk/infrared/ir_nrc17.h b/boop/trunk/infrared/ir_nrc17.h new file mode 100644 index 0000000..73cf199 --- /dev/null +++ b/boop/trunk/infrared/ir_nrc17.h @@ -0,0 +1,29 @@ +/* + ir_nrc17.h - nokia remote control 17 encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_NRC17_H +#define IR_NRC17_H + +void NRC17_Encode (void) __attribute__ ((section(".text.fastcode"))); + +void NRC17_Init(unsigned char map); +void NRC17_Send(unsigned long cmd); +void NRC17_Repeat(void); +void NRC17_Stop(void); + +#endif diff --git a/boop/trunk/infrared/ir_raw.c b/boop/trunk/infrared/ir_raw.c new file mode 100644 index 0000000..726ade8 --- /dev/null +++ b/boop/trunk/infrared/ir_raw.c @@ -0,0 +1,164 @@ +/* + ir_raw.c - raw ir encoder + Copyright (C) 2008 + + 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 3 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 "lpc2220.h" +#include "infrared.h" +#include "ir_raw.h" +#include "encoders.h" +#include "codes.h" +#include "ir_capture.h" +#include "fonty.h" +#include "lcd.h" + +#include "global.h" +#include "bfs.h" + +extern volatile unsigned char mod_enable; +extern volatile unsigned int cycles; +extern volatile unsigned long keyMap[42]; + +struct RAWcmd_* RAWcmd; + +#define RAW_IDLE 0x00 +#define RAW_HI 0x01 +#define RAW_LO 0x02 + +const struct irModule RAW_Module = +{ + RAW_Encode, + RAW_Send, + RAW_Repeat, + RAW_Stop, + 91, // carrier + 1, // carrier-on + 3, // carrier-off +}; + +void __attribute__ ((section(".text.fastcode"))) RAW_Encode (void) +{ + + switch(ir.state) + { unsigned char* x; + + case RAW_IDLE: + mod_enable = 0; + break; + + case RAW_HI: + mod_enable = 1; + + x=(unsigned char*)&(RAWcmd->pulselen[(RAWcmd->data[RAWcmd->CMDstart[ir.actcmd]+ir.general.bit])>>4]); + cycles = x[0] + (x[1]<<8); + ir.state++; + break; + + case RAW_LO: + mod_enable = 0; + x=(unsigned char*)&(RAWcmd->pulselen[(RAWcmd->data[RAWcmd->CMDstart[ir.actcmd]+ir.general.bit])&0x0f]); + cycles = x[0] + (x[1]<<8); + ir.general.bit++; + if (ir.general.bit >= RAWcmd->CMDlen[ir.actcmd]) { + ir.general.bit = 0; + if (ir.general.trail) { + ir.state = RAW_HI; + ir.actcmd = 1; + } + else + ir.state = RAW_IDLE; + } + else + ir.state--; + break; + + + } +} + +void RAW_Init(unsigned char map) +{ + if(map < RAW.num_tables) + { + struct RAWset_ *RAWset; + unsigned long RAWcmdbase; + + int x; + for(x=0;x<42;x++) { + keyMap[x] = (unsigned long)&ir.cmd; + } + ir.actcmd = 0; + ir.general.bit = 0; + ir.state = RAW_IDLE; + setIR(RAW_Module); + ir.cmd = 0xff; + + RAWcmdbase = (unsigned long)BFS_LoadFileAddr(BFS_ID_RAWslot0 + map); + if(!RAWcmdbase) + return; + + RAWset = (struct RAWset_ *)RAWcmdbase; + + x = memcmp(RAWset,"RC01",4); + if(x == 0) { + for(x=0;x<38;x++) { + keyMap[x+4] = (unsigned long)&RAWset->RAWcmd[x]; + } + } + + } +} + +void RAW_Send(unsigned long cmd) +{ + RAWcmd = (struct RAWcmd_*)cmd; + ir.actcmd = RAWcmd->tval; + if(RAWcmd->tval != 0xff) { + setIR(RAW_Module); + T1MR0 = RAWcmd->tval; + hi_border = (RAWcmd->borders)>>4; + lo_border = (RAWcmd->borders)&0x0f; + ir.actcmd = 0; + ir.general.trail = 0x01; + sysInfo |= SYS_IR; + if(ir.state == RAW_IDLE) + { + ir.general.bit = 0; + ir.state++; + runIR(); + } + } +} + +void RAW_Repeat(void) +{ + +} + +void RAW_Stop(void) +{ + if(RAWcmd->tval != 0xff) { + ir.general.trail = 0; + while(ir.state != RAW_IDLE); + ir.actcmd = 2; + if(RAWcmd->CMDstart[1] != RAWcmd->CMDstart[2]) + ir.state++; + + while(ir.state != RAW_IDLE); + stopIR(); + sysInfo &= ~SYS_IR; + } +} diff --git a/boop/trunk/infrared/ir_raw.h b/boop/trunk/infrared/ir_raw.h new file mode 100644 index 0000000..35a0ad1 --- /dev/null +++ b/boop/trunk/infrared/ir_raw.h @@ -0,0 +1,29 @@ +/* + ir_raw.h - raw ir encoder + Copyright (C) 2008 + + 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 3 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 IR_RAW_H +#define IR_RAW_H + +void RAW_Encode (void) __attribute__ ((section(".text.fastcode"))); + +void RAW_Init(unsigned char map); +void RAW_Send(unsigned long cmd); +void RAW_Repeat(void); +void RAW_Stop(void); + +#endif diff --git a/boop/trunk/infrared/ir_rc5.c b/boop/trunk/infrared/ir_rc5.c new file mode 100644 index 0000000..8c6c6c1 --- /dev/null +++ b/boop/trunk/infrared/ir_rc5.c @@ -0,0 +1,160 @@ +/* + ir_rc5.c - phillips rc5 protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lpc2220.h" +#include "infrared.h" +#include "ir_rc5.h" +#include "encoders.h" +#include "codes.h" + +const struct irModule RC5_Module = +{ + RC5_Encode, + RC5_Send, + RC5_Repeat, + RC5_Stop, + 139, // carrier + 1, // carrier-on + 3 // carrier-off +}; + +extern volatile unsigned char mod_enable; +extern volatile unsigned int cycles; +extern volatile unsigned long keyMap[42]; + +#define RC5_IDLE 0x00 +#define RC5_START_A 0x01 +#define RC5_START_B 0x02 +#define RC5_BIT_A 0x03 +#define RC5_BIT_B 0x04 +#define RC5_WAIT 0x05 + + +#define RC5_BITTIME 32 +#define RC5_WAITTIME 100 + +void __attribute__ ((section(".text.fastcode"))) RC5_Encode (void) +{ + switch(ir.state) + { + case RC5_IDLE: + mod_enable = 0; + break; + + case RC5_START_A: + mod_enable = 0; + ir.state++; + break; + + case RC5_START_B: + mod_enable = 1; + ir.state++; + break; + + case RC5_BIT_A: + if(ir.cmd & 0x1000) + mod_enable = 0; + else + mod_enable = 1; + ir.cmd <<= 1; + ir.state++; + break; + + case RC5_BIT_B: + if(mod_enable == 0) + mod_enable = 1; + else + mod_enable = 0; + ir.general.bit++; + if(ir.general.bit == 13) + ir.state++; + else + ir.state--; + break; + + case RC5_WAIT: + mod_enable = 0; + ir.general.wait++; + if(ir.general.wait >= RC5_WAITTIME) + { + ir.general.bit = 0; + ir.general.wait = 0; + ir.state = RC5_IDLE; + } + break; + } +} + +void RC5_Init(unsigned char map) +{ + if(map < RC5.num_tables) + { + ir.state = RC5_IDLE; + ir.cmd = 0x0000; + ir.actcmd = 0x0000; + ir.general.bit = 0x00; + ir.general.wait = 0; + copyMapS((unsigned short*)RC5.table[map].codes); + setIR(RC5_Module); + cycles = RC5_BITTIME; + } +} + +void RC5_Send(unsigned long cmd) +{ + ir.actcmd = cmd; + setIRspeed(RC5_Module); + if((ir.actcmd != 0x0000) && (ir.actcmd != 0x1000)) + { + //toggle bit sollte nicht über dir Konfiguration gesetzt werden + if(ir.toggle & 0x01) + ir.actcmd &= 0xF7FF; + else + ir.actcmd |= 0x0800; + RC5_Repeat(); + } +} + +void RC5_Repeat(void) +{ + if((ir.actcmd != 0x0000) && (ir.actcmd != 0x1000)) + { + if(ir.state == RC5_IDLE) + { + ir.cmd = ir.actcmd; + ir.state++; + runIR(); + } + } +} + +void RC5_Stop(void) +{ + if((ir.actcmd != 0x0000) && (ir.actcmd != 0x1000)) + { +waitend: + if(ir.state != RC5_IDLE) + goto waitend; + } + + ir.toggle++; + ir.actcmd = 0x0000; + stopIR(); +} + + diff --git a/boop/trunk/infrared/ir_rc5.h b/boop/trunk/infrared/ir_rc5.h new file mode 100644 index 0000000..7f199ff --- /dev/null +++ b/boop/trunk/infrared/ir_rc5.h @@ -0,0 +1,29 @@ +/* + ir_rc5.h - phillips rc5 protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_RC5_H +#define IR_RC5_H + +void RC5_Encode (void) __attribute__ ((section(".text.fastcode"))); + +void RC5_Init(unsigned char map); +void RC5_Send(unsigned long cmd); +void RC5_Repeat(void); +void RC5_Stop(void); + +#endif diff --git a/boop/trunk/infrared/ir_rc6.c b/boop/trunk/infrared/ir_rc6.c new file mode 100644 index 0000000..d42b43a --- /dev/null +++ b/boop/trunk/infrared/ir_rc6.c @@ -0,0 +1,224 @@ +/* + ir_rc6.c - phillips rc6 protocoll encoder + Copyright (C) 2008 p.c.squirrel + + 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 3 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 "lpc2220.h" +#include "infrared.h" +#include "ir_rc6.h" +#include "encoders.h" +#include "codes.h" + +const struct irModule RC6_Module = +{ + RC6_Encode, + RC6_Send, + RC6_Repeat, + RC6_Stop, + 136, // carrier + 1, // carrier-on + 3 // carrier-off +}; + +extern volatile unsigned char mod_enable; +extern volatile unsigned int cycles; +extern volatile unsigned long keyMap[42]; + +#define RC6_IDLE 0x00 +#define RC6_LEADER_A 0x01 +#define RC6_LEADER_B 0x02 +#define RC6_HEADER_BIT_A 0x03 +#define RC6_HEADER_BIT_B 0x04 +#define RC6_TRAILER_BIT_A 0x05 +#define RC6_TRAILER_BIT_B 0x06 +#define RC6_BIT_A 0x07 +#define RC6_BIT_B 0x08 +#define RC6_WAIT 0x09 + + +#define RC6_BITTIME 16 +#define RC6_WAITTIME_M0 188 //~80 ms +#define RC6_WAITTIME_M6 155 + +void __attribute__ ((section(".text.fastcode"))) RC6_Encode (void) +{ + cycles = RC6_BITTIME; //? + switch(ir.state) + { + case RC6_IDLE: + mod_enable = 0; + break; + + case RC6_LEADER_A: + mod_enable = 1; + cycles = RC6_BITTIME*6; + ir.state++; + break; + + case RC6_LEADER_B: + mod_enable = 0; + cycles = RC6_BITTIME*2; + ir.state++; + break; + + case RC6_HEADER_BIT_A: + if(ir.general.header_cmd & 0x8) //0b1000 4. bit SB, mb2, mb1, mb0 + mod_enable = 1; + else + mod_enable = 0; + ir.general.header_cmd <<= 1; + cycles = RC6_BITTIME; + ir.state++; + break; + + case RC6_HEADER_BIT_B: + if(mod_enable == 0) + mod_enable = 1; + else + mod_enable = 0; + ir.general.header_bit++; + cycles = RC6_BITTIME; + if(ir.general.header_bit == 4) + ir.state++; + else + ir.state--; + break; + + case RC6_TRAILER_BIT_A: + if(ir.general.trail) + mod_enable = 1; + else + mod_enable = 0; + cycles = RC6_BITTIME*2; + ir.state++; + break; + + case RC6_TRAILER_BIT_B: + if(ir.general.trail) + mod_enable = 0; + else + mod_enable = 1; + cycles = RC6_BITTIME*2; + ir.state++; + break; + + case RC6_BIT_A: + if(ir.cmd & 0x80000000) + mod_enable = 1; + else + mod_enable = 0; + ir.cmd <<= 1; + ir.state++; + break; + + case RC6_BIT_B: + if(mod_enable == 0) + mod_enable = 1; + else + mod_enable = 0; + ir.general.bit++; + if(ir.general.bit == ir.general.numbits) + ir.state++; + else + ir.state--; + break; + + case RC6_WAIT: + mod_enable = 0; + ir.general.wait++; + if(ir.general.wait >= ir.general.waittime) + { + ir.general.bit = 0; + ir.general.header_bit = 0; + ir.general.wait = 0; + ir.state = RC6_IDLE; + } + break; + } +} + +void RC6_Init(unsigned char map) +{ + if(map < RC6.num_tables) + { + ir.state = RC6_IDLE; + ir.cmd = 0x0000; + ir.actcmd = 0x0000; + ir.general.wait = 0; + ir.general.bit = 0; + copyMapI((unsigned int*)RC6.table[map].codes); + setIR(RC6_Module); + cycles = RC6_BITTIME; + } +} + +void RC6_Send(unsigned long cmd) +{ + ir.actcmd = cmd; + + setIRspeed(RC6_Module); + +// if(ir.general.toggle & 0x01) + // ir.actcmd &= 0xF7FF; + RC6_Repeat(); +} + +void RC6_Repeat(void) +{ + if(ir.actcmd != 0x0000) + { + if(ir.state == RC6_IDLE) + { + ir.cmd = ir.actcmd; + if(ir.cmd > 0xffff) { + if(ir.toggle & 0x01) + ir.cmd &= 0xFFFF7FFF; + else + ir.cmd |= 0x00008000; + ir.general.numbits = 32; + ir.general.header_cmd = 0x0E; //0b1110 ->Mode 6; + ir.general.trail = 0; + ir.general.waittime = RC6_WAITTIME_M6; + } + else { + ir.cmd <<=16; + ir.general.numbits = 16; + ir.general.header_cmd = 0x08; //0b1000 ->Mode 0; + ir.general.trail = ir.toggle & 0x01; + ir.general.waittime = RC6_WAITTIME_M0; + } + ir.general.header_bit = 0; + ir.state++; + runIR(); + } + } +} + +void RC6_Stop(void) +{ + if(ir.actcmd != 0x00000000) + { +waitend: + if(ir.state != RC6_IDLE) + goto waitend; + } + + ir.toggle++; + ir.actcmd = 0x0000; + stopIR(); +} + + diff --git a/boop/trunk/infrared/ir_rc6.h b/boop/trunk/infrared/ir_rc6.h new file mode 100644 index 0000000..1347e6f --- /dev/null +++ b/boop/trunk/infrared/ir_rc6.h @@ -0,0 +1,29 @@ +/* + ir_rc6.h - phillips rc6 protocoll encoder + Copyright (C) 2008 p.c.squirrel + + 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 3 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 IR_RC6_H +#define IR_RC6_H + +void RC6_Encode (void) __attribute__ ((section(".text.fastcode"))); + +void RC6_Init(unsigned char map); +void RC6_Send(unsigned long cmd); +void RC6_Repeat(void); +void RC6_Stop(void); + +#endif diff --git a/boop/trunk/infrared/ir_rca.c b/boop/trunk/infrared/ir_rca.c new file mode 100644 index 0000000..84e95d5 --- /dev/null +++ b/boop/trunk/infrared/ir_rca.c @@ -0,0 +1,189 @@ +/* + ir_rca.c - space modulated protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lpc2220.h" +#include "infrared.h" +#include "ir_rca.h" +#include "encoders.h" +#include "codes.h" +#include "global.h" + +const struct irModule RCA_Module = +{ + RCA_Encode, + RCA_Send, + RCA_Repeat, + RCA_Stop, + 134, // carrier + 1, // carrier-on + 2 // carrier-off +}; + +extern volatile unsigned char mod_enable; +extern volatile unsigned int cycles; +extern volatile unsigned long keyMap[42]; + +#define RCA_IDLE 0x00 +#define RCA_PRE_A 0x01 +#define RCA_PRE_B 0x02 +#define RCA_BIT_A 0x03 +#define RCA_BIT_B 0x04 +#define RCA_IBIT_A 0x05 +#define RCA_IBIT_B 0x06 +#define RCA_STOP 0x07 +#define RCA_WAIT 0x08 + +#define RCA_NUMBITS 12 +#define RCA_BITTIME 28 +#define RCA_BIT0 2*RCA_BITTIME +#define RCA_BIT1 4*RCA_BITTIME +#define RCA_PRETIME 8*RCA_BITTIME +#define RCA_WAITTIME 16 + +void __attribute__ ((section(".text.fastcode"))) RCA_Encode (void) +{ + switch(ir.state) + { + case RCA_IDLE: + mod_enable = 0; + break; + + case RCA_PRE_A: + cycles = RCA_PRETIME; + mod_enable = 1; + ir.state++; + break; + + case RCA_PRE_B: + mod_enable = 0; + ir.cmd = ir.actcmd; + ir.state++; + break; + + case RCA_BIT_A: + case RCA_IBIT_A: + case RCA_STOP: + cycles = RCA_BITTIME; + mod_enable = 1; + ir.state++; + break; + + case RCA_BIT_B: + case RCA_IBIT_B: + mod_enable = 0; + if(ir.cmd & 0x0800) + cycles = RCA_BIT1; + else + cycles = RCA_BIT0; + ir.cmd <<= 1; + ir.general.bit++; + if(ir.general.bit == RCA_NUMBITS) + { + if(ir.state == RCA_BIT_B) + { + ir.cmd = ~ir.actcmd; + ir.general.bit = 0; + } + ir.state++; + } + else + ir.state--; + break; + + case RCA_WAIT: + mod_enable = 0; + cycles = RCA_BITTIME; + ir.general.wait++; + if(ir.general.wait >= RCA_WAITTIME) + { + ir.general.bit = 0; + ir.general.wait = 0; + if (ir.general.trail) + ir.state = RCA_PRE_A; + else + ir.state = RCA_IDLE; + } + break; + } +} + +void RCA_LoadMap(unsigned char map) +{ + switch(map) + { + default: + copyMapPC(0x0500, (unsigned char*)RCA.table[map].codes); + break; + } +} +void RCA_Init(unsigned char map) +{ + if(map < RCA.num_tables) + { + ir.state = RCA_IDLE; + ir.cmd = 0x0000; + ir.actcmd = 0x0000; + ir.general.bit = 0x00; + ir.general.wait = 0; + RCA_LoadMap(map); + setIR(RCA_Module); + cycles = RCA_BITTIME; + } +} + +void RCA_Send(unsigned long cmd) +{ + ir.actcmd = cmd; + if(ir.actcmd != 0x0000) { + setIRspeed(RCA_Module); + ir.general.trail = 0x01; + sysInfo |= SYS_IR; + if (ir.state != RCA_IDLE) + while(ir.state != RCA_IDLE); + ir.state = RCA_PRE_A; + runIR(); + } +} + +void RCA_Repeat(void) +{ + if(ir.actcmd != 0x0000) + { + + if(ir.state == RCA_IDLE) + { + //ir.state++; + //runIR(); + } + } +} + +void RCA_Stop(void) +{ + if(ir.actcmd != 0x00000000) + { + ir.general.trail = 0; + sysInfo &= ~SYS_IR; +waitend: + if(ir.state != RCA_IDLE) + goto waitend; + } + stopIR(); +} + + diff --git a/boop/trunk/infrared/ir_rca.h b/boop/trunk/infrared/ir_rca.h new file mode 100644 index 0000000..19738c8 --- /dev/null +++ b/boop/trunk/infrared/ir_rca.h @@ -0,0 +1,29 @@ +/* + ir_rca.h - rca protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_RCA_H +#define IR_RCA_H + +void RCA_Encode (void) __attribute__ ((section(".text.fastcode"))); + +void RCA_Init(unsigned char map); +void RCA_Send(unsigned long cmd); +void RCA_Repeat(void); +void RCA_Stop(void); + +#endif diff --git a/boop/trunk/infrared/ir_rcmm.c b/boop/trunk/infrared/ir_rcmm.c new file mode 100644 index 0000000..2424391 --- /dev/null +++ b/boop/trunk/infrared/ir_rcmm.c @@ -0,0 +1,197 @@ +/* + ir_rcmm.c - phillips rc5 protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lpc2220.h" +#include "infrared.h" +#include "ir_rcmm.h" +#include "encoders.h" +#include "codes.h" + +const struct irModule RCMM_Module = +{ + RCMM_Encode, + RCMM_Send, + RCMM_Repeat, + RCMM_Stop, + 139, // carrier + 1, // carrier-on + 3 // carrier-off +}; + +extern volatile unsigned char mod_enable; +extern volatile unsigned int cycles; +extern volatile unsigned long keyMap[42]; + +#define RCMM_IDLE 0x00 +#define RCMM_HEADER_A 0x01 +#define RCMM_HEADER_B 0x02 +#define RCMM_BIT_A 0x03 +#define RCMM_BIT_B 0x04 +#define RCMM_TRAIL 0x05 +#define RCMM_WAIT 0x06 + +#define RCMM_HEADER_ON 15 +#define RCMM_HEADER_OFF 10 +#define RCMM_BIT_ON 6 +#define RCMM_BIT_00 10 +#define RCMM_BIT_01 16 +#define RCMM_BIT_10 22 +#define RCMM_BIT_11 28 +#define RCMM_PTIME 110; + +const unsigned char ir_times[4] = { RCMM_BIT_00, RCMM_BIT_01, RCMM_BIT_10, RCMM_BIT_11 }; + +void __attribute__ ((section(".text.fastcode"))) RCMM_Encode (void) +{ + switch(ir.state) + { + case RCMM_IDLE: + mod_enable = 0; + break; + + case RCMM_HEADER_A: + case RCMM_BIT_A: + mod_enable = 1; + if(ir.state == RCMM_HEADER_A) + cycles = RCMM_HEADER_ON; + else + cycles = RCMM_BIT_ON; + ir.state++; + break; + + case RCMM_HEADER_B: + mod_enable = 0; + cycles = RCMM_HEADER_OFF; + ir.state++; + break; + + case RCMM_BIT_B: + mod_enable = 0; + cycles = ir_times[(ir.cmd & 0xC0000000) >> 30]; + ir.cmd <<= 2; + ir.general.bit += 2; + if(ir.general.bit == ir.general.len) + ir.state++; + else + ir.state--; + break; + + case RCMM_TRAIL: + if(ir.general.trail) + { + mod_enable = 1; + cycles = RCMM_BIT_ON; + } + else + cycles = 1; + ir.state++; + break; + + case RCMM_WAIT: + mod_enable = 0; + ir.general.wait++; + cycles = RCMM_BIT_ON; // 1 ms + if(ir.general.wait >= ir.general.pause) + { + ir.general.bit = 0; + ir.general.wait = 0; + ir.general.pause = RCMM_PTIME; + ir.state = RCMM_IDLE; + } + break; + + + } +} + +void RCMM_LoadMap(unsigned char map) +{ + copyMapI((unsigned int*)RCMM.table[map].codes); + + switch(map) + { + case 1: + ir.general.len = 32; + ir.general.trail = 1; + ir.general.togglebit = 16; + break; + default: + ir.general.len = 32; + ir.general.trail = 1; + ir.general.togglebit = 0; + break; + } +} + +void RCMM_Init(unsigned char map) +{ + if(map < RCMM.num_tables) + { + ir.cmd = 0x00000000; + ir.actcmd = 0x00000000; + ir.state = RCMM_IDLE; + ir.general.bit = 0; + ir.general.wait = 0; + ir.general.pause = RCMM_PTIME; + RCMM_LoadMap(map); + setIR(RCMM_Module); + } +} + +void RCMM_Send(unsigned long cmd) +{ + ir.actcmd = cmd; + if(ir.actcmd != 0x00000000) { + if(ir.general.togglebit) { + if(ir.toggle & 0x01) + ir.actcmd &= ~(1<<(ir.general.togglebit-1)); + else + ir.actcmd |= 1<<(ir.general.togglebit-1); + } + setIRspeed(RCMM_Module); + RCMM_Repeat(); + } +} + +void RCMM_Repeat(void) +{ + if(ir.actcmd != 0x00000000) + { + if(ir.state == RCMM_IDLE) + { + ir.cmd = ir.actcmd; + ir.state++; + runIR(); + } + } +} + +void RCMM_Stop(void) +{ + if(ir.actcmd != 0x00000000) + { +waitend: + if(ir.state != RCMM_IDLE) + goto waitend; + } + ir.actcmd = 0x0000; + ir.toggle++; + stopIR(); +} + + diff --git a/boop/trunk/infrared/ir_rcmm.h b/boop/trunk/infrared/ir_rcmm.h new file mode 100644 index 0000000..b71dec4 --- /dev/null +++ b/boop/trunk/infrared/ir_rcmm.h @@ -0,0 +1,29 @@ +/* + ir_rcmm.h - phillips rc5 protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_RCMM_H +#define IR_RCMM_H + +void RCMM_Encode (void) __attribute__ ((section(".text.fastcode"))); + +void RCMM_Init(unsigned char map); +void RCMM_Send(unsigned long cmd); +void RCMM_Repeat(void); +void RCMM_Stop(void); + +#endif diff --git a/boop/trunk/infrared/ir_rec80.c b/boop/trunk/infrared/ir_rec80.c new file mode 100644 index 0000000..6f4f8b1 --- /dev/null +++ b/boop/trunk/infrared/ir_rec80.c @@ -0,0 +1,186 @@ +/* + ir_rec80.c - nec rec80 and derivates ir encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lpc2220.h" +#include "infrared.h" +#include "ir_rec80.h" +#include "encoders.h" +#include "codes.h" + +const struct irModule REC80_Module = +{ + REC80_Encode, + REC80_Send, + REC80_Repeat, + REC80_Stop, + 151, // carrier + 1, // carrier-on + 3 // carrier-off +}; + + +extern volatile unsigned char mod_enable; +extern volatile unsigned int cycles; +extern volatile unsigned long keyMap[42]; + +#define REC80_IDLE 0x00 +#define REC80_HEAD_A 0x01 +#define REC80_HEAD_B 0x02 +#define REC80_PRE_A 0x03 +#define REC80_PRE_B 0x04 +#define REC80_BIT_A 0x05 +#define REC80_BIT_B 0x06 +#define REC80_TRAIL 0x07 +#define REC80_WAIT 0x08 + +#define REC80_HEADER_1 128 +#define REC80_HEADER_0 51 +#define REC80_BONTIME 13 +#define REC80_BITTIME_0 13 +#define REC80_BITTIME_1 38 +#define REC80_WAITTIME 187 + +void __attribute__ ((section(".text.fastcode"))) REC80_Encode (void) +{ + switch(ir.state) + { + case REC80_IDLE: + mod_enable = 0; + break; + + case REC80_HEAD_B: + mod_enable = 0; + cycles = REC80_HEADER_0; + ir.cmd = ir.general.preamble; + ir.general.bit = 0; + ir.state++; + break; + + case REC80_HEAD_A: + case REC80_PRE_A: + case REC80_BIT_A: + case REC80_TRAIL: + mod_enable = 1; + if(ir.state == REC80_HEAD_A) + cycles = REC80_HEADER_1; + else + cycles = REC80_BONTIME; + ir.state++; + break; + + case REC80_PRE_B: + case REC80_BIT_B: + mod_enable = 0; + if(ir.cmd & 0x01) + cycles = REC80_BITTIME_1; + else + cycles = REC80_BITTIME_0; + ir.cmd >>= 1; + ir.general.bit++; + if(ir.general.bit == ir.general.numbits) + { + if(ir.state == REC80_PRE_B) + { + ir.general.bit = 0; + ir.cmd = ir.actcmd; + } + ir.state++; + } + else + ir.state--; + break; + + case REC80_WAIT: + mod_enable = 0; + ir.general.wait++; + cycles = REC80_BONTIME; // 1 ms + if(ir.general.wait >= ir.general.pause) + { + ir.general.bit = 0; + ir.general.wait = 0; + ir.state = REC80_IDLE; + } + break; + } +} + +void REC80_LoadMap(unsigned char map) +{ + switch(map) + { + default: + ir.general.preamble = 0x00A02002; + copyMapI((unsigned int*)REC80.table[map].codes); + break; + } +} + +void REC80_Init(unsigned char map) +{ + if(map < REC80.num_tables) + { + ir.cmd = 0x00000000; + ir.actcmd = 0x00000000; + ir.general.bit = 0; + ir.general.numbits = 24; + ir.general.wait = 0; + ir.general.pause = REC80_WAITTIME; + ir.state = REC80_IDLE; + REC80_LoadMap(map); + setIR(REC80_Module); + } +} + +void REC80_Send(unsigned long cmd) +{ + ir.actcmd = cmd; + + if(ir.actcmd & 0x80000000) + ir.general.numbits = 24; + else + ir.general.numbits = 0; + + ir.actcmd &= 0x0FFFFFFF; + + setIRspeed(REC80_Module); + REC80_Repeat(); +} + +void REC80_Repeat(void) +{ + if(ir.actcmd != 0x00000000) + { + if(ir.state == REC80_IDLE) + { + ir.state++; + runIR(); + } + } +} + +void REC80_Stop(void) +{ + if(ir.actcmd != 0x00000000) + { +waitend: + if(ir.state != REC80_IDLE) + goto waitend; + } + ir.actcmd = 0x00000000; + stopIR(); +} diff --git a/boop/trunk/infrared/ir_rec80.h b/boop/trunk/infrared/ir_rec80.h new file mode 100644 index 0000000..641408e --- /dev/null +++ b/boop/trunk/infrared/ir_rec80.h @@ -0,0 +1,29 @@ +/* + ir_rec80.h - nec rec80 and derivates ir encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_REC80_H +#define IR_REC80_H + +void REC80_Encode (void) __attribute__ ((section(".text.fastcode"))); + +void REC80_Init(unsigned char map); +void REC80_Send(unsigned long cmd); +void REC80_Repeat(void); +void REC80_Stop(void); + +#endif diff --git a/boop/trunk/infrared/ir_recs80.c b/boop/trunk/infrared/ir_recs80.c new file mode 100644 index 0000000..d15dbd1 --- /dev/null +++ b/boop/trunk/infrared/ir_recs80.c @@ -0,0 +1,144 @@ +/* + ir_recs80.c - space modulated protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lpc2220.h" +#include "infrared.h" +#include "ir_recs80.h" +#include "encoders.h" +#include "codes.h" + +const struct irModule RECS80_Module = +{ + RECS80_Encode, + RECS80_Send, + RECS80_Repeat, + RECS80_Stop, + 128, // carrier + 1, // carrier-on + 3 // carrier-off +}; + +extern volatile unsigned char mod_enable; +extern volatile unsigned int cycles; +extern volatile unsigned long keyMap[42]; + +#define RECS80_IDLE 0x00 +#define RECS80_BIT_A 0x01 +#define RECS80_BIT_B 0x02 +#define RECS80_STOP 0x03 +#define RECS80_WAIT 0x04 + +#define RECS80_NUMBITS 11 +#define RECS80_BITTIME 7 +#define RECS80_BIT0 27*RECS80_BITTIME +#define RECS80_BIT1 41*RECS80_BITTIME +#define RECS80_WAITTIME 10 + +void __attribute__ ((section(".text.fastcode"))) RECS80_Encode (void) +{ + switch(ir.state) + { + case RECS80_IDLE: + mod_enable = 0; + break; + + case RECS80_BIT_A: + case RECS80_STOP: + cycles = RECS80_BITTIME; + mod_enable = 1; + ir.state++; + break; + + case RECS80_BIT_B: + mod_enable = 0; + if(ir.cmd & 0x0400) + cycles = RECS80_BIT1; + else + cycles = RECS80_BIT0; + ir.cmd <<= 1; + ir.general.bit++; + if(ir.general.bit == RECS80_NUMBITS) + ir.state++; + else + ir.state--; + break; + + case RECS80_WAIT: + mod_enable = 0; + cycles = RECS80_BIT0; + ir.general.wait++; + if(ir.general.wait >= RECS80_WAITTIME) + { + ir.general.bit = 0; + ir.general.wait = 0; + ir.state = RECS80_IDLE; + } + break; + } +} + +void RECS80_Init(unsigned char map) +{ + if(map < RECS80.num_tables) + { + ir.state = RECS80_IDLE; + ir.cmd = 0x0000; + ir.actcmd = 0x0000; + ir.general.bit = 0x00; + ir.general.wait = 0; + ir.toggle = 1; + copyMapS((unsigned short*)RECS80.table[map].codes); + setIR(RECS80_Module); + cycles = RECS80_BITTIME; + } +} + +void RECS80_Send(unsigned long cmd) +{ + ir.actcmd = cmd; + + if(ir.toggle & 0x01) + ir.actcmd |= 0x0200; + setIRspeed(RECS80_Module); + RECS80_Repeat(); +} + +void RECS80_Repeat(void) +{ + if(ir.actcmd != 0x0000) + { + if(ir.state == RECS80_IDLE) + { + ir.cmd = ir.actcmd; + ir.state++; + runIR(); + } + } +} + +void RECS80_Stop(void) +{ + if(ir.actcmd != 0x00000000) + { +waitend: + if(ir.state != RECS80_IDLE) + goto waitend; + } + ir.toggle++; + stopIR(); +} diff --git a/boop/trunk/infrared/ir_recs80.h b/boop/trunk/infrared/ir_recs80.h new file mode 100644 index 0000000..fbcbe99 --- /dev/null +++ b/boop/trunk/infrared/ir_recs80.h @@ -0,0 +1,29 @@ +/* + ir_recs80.h - phillips recs80 protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_RECS80_H +#define IR_RECS80_H + +void RECS80_Encode (void) __attribute__ ((section(".text.fastcode"))); + +void RECS80_Init(unsigned char map); +void RECS80_Send(unsigned long cmd); +void RECS80_Repeat(void); +void RECS80_Stop(void); + +#endif diff --git a/boop/trunk/infrared/ir_rf.c b/boop/trunk/infrared/ir_rf.c new file mode 100644 index 0000000..b1dcbe3 --- /dev/null +++ b/boop/trunk/infrared/ir_rf.c @@ -0,0 +1,127 @@ +/* + ir_rf.c - RF IR encoder + Copyright (C) 2008 + + 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 3 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 "lpc2220.h" +#include "infrared.h" +#include "ir_rf.h" +#include "encoders.h" +#include "codes.h" +#include "rf.h" + +const struct irModule IRRF_Module = +{ + IRRF_Encode, + IRRF_Send, + IRRF_Repeat, + IRRF_Stop, + 75, // carrier turbo mode + 1, // carrier-on + 4 // carrier-off +}; + +extern volatile unsigned char mod_enable; +extern volatile unsigned int cycles; +extern volatile unsigned long keyMap[42]; + +#define IRRF_IDLE 0x00 +#define IRRF_WAIT 0x01 + +#define IRRF_BITTIME 40 +#define IRRF_WAITTIME 125 + +void __attribute__ ((section(".text.fastcode"))) IRRF_Encode (void) +{ + switch(ir.state) + { + case IRRF_IDLE: + mod_enable = 0; + break; + + case IRRF_WAIT: + mod_enable = 0; + ir.general.wait++; + if(ir.general.wait >= IRRF_WAITTIME) + { + ir.general.bit = 0; + ir.general.wait = 0; + ir.state = IRRF_IDLE; + } + break; + } +} + +void IRRF_Init(unsigned char map) +{ + if(map < IRRF.num_tables) + { + ir.state = IRRF_IDLE; + ir.cmd = 0x0000; + ir.actcmd = 0x0000; + ir.general.bit = 0x00; + ir.general.wait = 0; + copyMapS((unsigned short*)IRRF.table[map].codes); + setIR(IRRF_Module); + cycles = IRRF_BITTIME; + } +} + +void IRRF_Send(unsigned long cmd) +{ + ir.actcmd = cmd; + ir.general.trail=(unsigned int)openEP(0,0, packet_RFenc); + setIRspeed(IRRF_Module); + + if((ir.toggle & 0x01) &&(ir.actcmd != 0x0000)) + ir.actcmd |= 0x0080; + IRRF_Repeat(); +} + +void IRRF_Repeat(void) +{ + if(ir.actcmd != 0x0000) + { + if(ir.state == IRRF_IDLE) + { + struct RFendpoint_* cur_ep; + cur_ep = (struct RFendpoint_*)ir.general.trail; + if((cur_ep) && !(cur_ep->flags & EPnewdata)) { + cur_ep->dest = (ir.actcmd & 0xff00) >> 8; + cur_ep->data[0] = (ir.actcmd & 0x00ff); + cur_ep->bufferlen = 1; + cur_ep->flags |= EPenabled | EPoutput | EPnewdata; + + RF_changestate(RFtx); + } + ir.state++; + runIR(); + } + } +} + +void IRRF_Stop(void) +{ + if(ir.actcmd != 0x00000000) + while(ir.state != IRRF_IDLE); + + closeEP((struct RFendpoint_*)ir.general.trail); + ir.toggle++; + ir.actcmd = 0x0000; + stopIR(); +} + + diff --git a/boop/trunk/infrared/ir_rf.h b/boop/trunk/infrared/ir_rf.h new file mode 100644 index 0000000..2f3c546 --- /dev/null +++ b/boop/trunk/infrared/ir_rf.h @@ -0,0 +1,29 @@ +/* + iir_rf.h - RF IR encoder + Copyright (C) 2008 + + 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 3 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 IR_RF_H +#define IR_RF_H + +void IRRF_Encode (void) __attribute__ ((section(".text.fastcode"))); + +void IRRF_Init(unsigned char map); +void IRRF_Send(unsigned long cmd); +void IRRF_Repeat(void); +void IRRF_Stop(void); + +#endif diff --git a/boop/trunk/infrared/ir_selector.c b/boop/trunk/infrared/ir_selector.c new file mode 100644 index 0000000..385525d --- /dev/null +++ b/boop/trunk/infrared/ir_selector.c @@ -0,0 +1,311 @@ +/* + ir_selector.c - select ir encoder & codetable + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "infrared.h" +#include "codes.h" +#include "encoders.h" +#include "lcd.h" +#include "fonty.h" +#include "keyboard.h" +#include "ir_selector.h" +#include "bfs.h" +#include "ir_capture.h" +#include "controls.h" +#include "global.h" + +extern volatile unsigned char autorepeat; +extern unsigned char act_encoder, act_set; + +const struct irDeviceTable_ default_irDevTab = +{ + 0x04, + 0x00, + { + { 0x01, 0x00 }, + { 0x02, 0x00 }, + { 0xff, 0xff }, + { 0xff, 0xff } + } +}; + +struct irDeviceTable_ irDevTab; + +char* getEncName(unsigned char enc) +{ + return (char*) encoders.encoder[enc].name; +} + +char* getSetName(unsigned char enc, unsigned char set) +{ + struct TABLES_C *ctab; + struct TABLES_S *stab; + struct TABLES_I *itab; + struct TABLES_N *ntab; + struct TABLES_L *ltab; + struct RAWset_ *RAWset; + + if (enc < encoders.num_encoders) { + switch(encoders.encoder[enc].type) + { + case 0: + ctab = (TABLES_C*)encoders.encoder[enc].data; + if (set < ctab->num_tables) + return (char*) ctab->table[set].name; + break; + case 1: + stab = (TABLES_S*)encoders.encoder[enc].data; + if (set < stab->num_tables) + return (char*) stab->table[set].name; + break; + case 2: + itab = (TABLES_I*)encoders.encoder[enc].data; + if (set < itab->num_tables) + return (char*) itab->table[set].name; + break; + case 3: + ntab = (TABLES_N*)encoders.encoder[enc].data; + if (set < ntab->num_tables) { + RAWset = (struct RAWset_*)BFS_LoadFileAddr(BFS_ID_RAWslot0 + set); + if(RAWset && (RAWset->name[0] != 0xff)) { + return (char*) RAWset->name; + } + else + return (char*) ntab->table[set].name; + } + break; + case 4: + ltab = (TABLES_L*)encoders.encoder[enc].data; + if (set < ltab->num_tables) { + return (char*) ltab->table[set].name; + } + break; + } + } + + return "unknown\0"; +} + +unsigned char EncIsValid(unsigned char enc, unsigned char set) +{ + struct TABLES_C *ctab; + + if (!(enc < encoders.num_encoders)) + return 0; + ctab = (TABLES_C*)encoders.encoder[enc].data; + if (!(set < ctab->num_tables)) + return 0; + return 1; +} + +unsigned char listSet(unsigned int enc, unsigned char sset) +{ + unsigned char set; + + if (!(sset < (((TABLES_C*)(encoders.encoder[enc].data))->num_tables))) + sset = 0; + + lcd_fill(0); + set_font(BOLDFONT); + draw_hexC(0,0,((TABLES_C*)(encoders.encoder[enc].data))->num_tables, 3, DRAW_PUT); + draw_string(16, 0, "remotes in", 3, DRAW_PUT); + draw_string(77, 0, (char*) encoders.encoder[enc].name, 3, DRAW_PUT); + draw_block(0,10,128,2,3,DRAW_PUT); + + set_font(SMALLFONT); + + for(set=0;set<((TABLES_C*)(encoders.encoder[enc].data))->num_tables; set++) + { + draw_string(1, 15+(set*9), getSetName(enc, set), 3, DRAW_PUT); + } + + draw_string(0, 120, "\"Left\" to return", 3, DRAW_PUT); + draw_string(0, 130, "\"OK\" to select remote", 3, DRAW_PUT); + + draw_block(0, 14+(sset*9), 128, 9, 3, DRAW_XOR); + + while(!KEY_Left) + { + waitKeyUpDown(); + draw_block(0, 14+(sset*9), 128, 9, 3, DRAW_XOR); + if(KEY_OK) + { + return sset; + } + if(KEY_Up) + { + sset--; + if(sset >= ((TABLES_C*)(encoders.encoder[enc].data))->num_tables) + sset = ((TABLES_C*)(encoders.encoder[enc].data))->num_tables-1; + } + if(KEY_Down) + { + sset++; + if(sset == ((TABLES_C*)(encoders.encoder[enc].data))->num_tables) + sset = 0; + } + draw_block(0, 14+(sset*9), 128, 9, 3, DRAW_XOR); + } + return 0xFF; +} + +#define maxenclist 8 +void select_ir(unsigned char *encoder,unsigned char *set) +{ + static unsigned char enc, senc, cenc, sset; + unsigned char moff; + unsigned char moffold; + + if (*encoder < encoders.num_encoders) + senc = *encoder; + else + senc = 0; + cenc = senc; + sset = *set; + moff = 0; + + if(senc >= maxenclist) + moff = senc - maxenclist +1; + +again: + moffold = encoders.num_encoders; + + set_font(BOLDFONT); + + lcd_fill(0); + draw_string(0, 0, "Encoders: ", 3, DRAW_PUT); + draw_hexC(54,0,encoders.num_encoders,3,DRAW_PUT); + draw_block(0,10,128,2,3,DRAW_PUT); + + set_font(SMALLFONT); + + draw_string(0, 106, "\"OK\" to accept select remote", 3, DRAW_PUT); + draw_string(0, 115, "\"Exit\" to return", 3, DRAW_PUT); + draw_string(0, 124, "\"Right\" to show names for", 3, DRAW_PUT); + draw_string(35, 133, "selected encoder", 3, DRAW_PUT); + set_font(BOLDFONT); + draw_string(0, 142, "Currently Selected:", 3, DRAW_PUT); + draw_string(0, 152, (char*) encoders.encoder[cenc].name, 3, DRAW_PUT); + draw_string(48, 152, getSetName(cenc,sset), 3, DRAW_PUT); + set_font(SMALLFONT); + + while(!KEY_Exit) + { + if(moff!=moffold) { + draw_block(0, 14, 128, 9*maxenclist, 3, DRAW_ERASE); + for(enc=moff;(encnum_tables, 3, DRAW_PUT); + draw_string(15, 15+((enc-moff)*9), "remotes in", 3, DRAW_PUT); + draw_string(65, 15+((enc-moff)*9), (char*) encoders.encoder[enc].name, 3, DRAW_PUT); + } + + if(encoders.num_encoders > moff+maxenclist) { + draw_hline(120,8+9*maxenclist,5,3,DRAW_PUT); + draw_hline(121,9+9*maxenclist,3,3,DRAW_PUT); + draw_hline(122,10+9*maxenclist,1,3,DRAW_PUT); + } + if(moff) { + draw_hline(120,19,5,3,DRAW_PUT); + draw_hline(121,18,3,3,DRAW_PUT); + draw_hline(122,17,1,3,DRAW_PUT); + } + draw_block(0, 14+((senc-moff)*9), 128, 9, 3, DRAW_XOR); + } + moffold = moff; + waitKeyUpDown(); + draw_block(0, 14+((senc-moff)*9), 128, 9, 3, DRAW_XOR); + if(KEY_Right) + { + enc = sset; + sset = listSet(senc,sset); + if(sset != 0xFF) + cenc = senc; + else + sset = enc; + goto again; + } + if(KEY_Up) + { + senc--; + if(senc= encoders.num_encoders) { + if(encoders.num_encoders > maxenclist) + moff = encoders.num_encoders - maxenclist; + senc = encoders.num_encoders-1; + } + } + if(KEY_Down) + { + senc++; + if(senc == maxenclist+moff) + moff++; + if(senc == encoders.num_encoders) { + moff = 0; + senc = 0; + } + } + if(KEY_OK) + { + //setEncoder(cenc, sset); + *encoder = cenc; + *set = sset; + return; + } + draw_block(0, 14+((senc-moff)*9), 128, 9, 3, DRAW_XOR); + } +} + +void remote_click(FORM* form, CONTROL* control) { + unsigned char sel; + + sel = ((LABEL*)control)->tag; + select_ir(&irDevTab.device[sel].encoder, &irDevTab.device[sel].set); + ((LABEL*)control)->caption = getSetName(irDevTab.device[sel].encoder, irDevTab.device[sel].set); + + form_draw(form); +} + +void RC_setting(void) { + unsigned char set; + unsigned char i; + + LABEL label[irDevTab.count]; + LABEL remote[irDevTab.count]; + char caption[irDevTab.count][6]; + + CONTROL* controls[irDevTab.count * 2]; + + for(i=0;i + + 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 3 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 IR_SELECTOR_H +#define IR_SELECTOR_H + +struct irDevice_ { + unsigned char encoder; + unsigned char set; +}; + +struct irDeviceTable_ { + unsigned char count; + unsigned char active; + struct irDevice_ device[4]; +}; + +struct irDeviceTable_ irDevTab; +const struct irDeviceTable_ default_irDevTab; + +char* getSetName(unsigned char enc, unsigned char set); +unsigned char EncIsValid(unsigned char enc, unsigned char set); +void select_ir(unsigned char *encoder,unsigned char *set); +void RC_setting(void); + +#endif diff --git a/boop/trunk/infrared/ir_sirc.c b/boop/trunk/infrared/ir_sirc.c new file mode 100644 index 0000000..0bcfa8a --- /dev/null +++ b/boop/trunk/infrared/ir_sirc.c @@ -0,0 +1,161 @@ +/* + ir_sirc.c - sony sirc protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lpc2220.h" +#include "infrared.h" +#include "ir_sirc.h" +#include "encoders.h" +#include "codes.h" + +extern volatile unsigned char mod_enable; +extern volatile unsigned int cycles; +extern volatile unsigned long keyMap[42]; + +#define SIRC_IDLE 0x00 +#define SIRC_START_A 0x01 +#define SIRC_START_B 0x02 +#define SIRC_BIT_A 0x03 +#define SIRC_BIT_B 0x04 +#define SIRC_WAIT 0x05 + +#define SIRC_STARTLEN 96 +#define SIRC_BITLEN_0 24 +#define SIRC_BITLEN_1 48 +#define SIRC_BITOFF 24 +#define SIRC_GTIME 45 + +const struct irModule SIRC_Module = +{ + SIRC_Encode, + SIRC_Send, + SIRC_Repeat, + SIRC_Stop, + 122, // carrier + 1, // carrier-on + 3, // carrier-off +}; + +void __attribute__ ((section(".text.fastcode"))) SIRC_Encode (void) +{ + switch(ir.state) + { + case SIRC_IDLE: + mod_enable = 0; + break; + + case SIRC_START_A: + mod_enable = 1; + cycles = SIRC_STARTLEN; + ir.state++; + break; + + case SIRC_START_B: + mod_enable = 0; + cycles = SIRC_BITOFF; + ir.state++; + break; + + case SIRC_BIT_A: + mod_enable = 1; + if(ir.cmd & 0x01) + cycles = SIRC_BITLEN_1; + else + cycles = SIRC_BITLEN_0; + ir.cmd >>= 1; + ir.state++; + break; + + case SIRC_BIT_B: + mod_enable = 0; + cycles = SIRC_BITOFF; + ir.general.bit++; + if(ir.general.bit == ir.general.numbits) + ir.state++; + else + ir.state--; + break; + + case SIRC_WAIT: + mod_enable = 0; + ir.general.wait++; + cycles = SIRC_BITOFF; // 1 ms + if(ir.general.wait >= ir.general.pause) + { + ir.general.bit = 0; + ir.general.wait = 0; + ir.state = SIRC_IDLE; + } + break; + + } +} + +void SIRC_Init(unsigned char map) +{ + if(map < SIRC.num_tables) + { + ir.cmd = 0x00000000; + ir.actcmd = 0x00000000; + ir.general.bit = 0; + ir.general.numbits = 12; + ir.general.wait = 0; + ir.general.pause = SIRC_GTIME; + ir.state = SIRC_IDLE; + copyMapS((unsigned short*)SIRC.table[map].codes); + setIR(SIRC_Module); + } +} + +void SIRC_Send(unsigned long cmd) +{ + ir.actcmd = cmd; + + if(ir.actcmd & 0x800000) + ir.general.numbits = 20; + else if(ir.actcmd & 0x8000) + ir.general.numbits = 15; + else + ir.general.numbits = 12; + setIRspeed(SIRC_Module); + SIRC_Repeat(); +} + +void SIRC_Repeat(void) +{ + if(ir.actcmd != 0x00000000) + { + if(ir.state == SIRC_IDLE) + { + ir.cmd = ir.actcmd; + ir.state++; + runIR(); + } + } +} + +void SIRC_Stop(void) +{ + if(ir.actcmd != 0x00000000) + { +waitend: + if(ir.state != SIRC_IDLE) + goto waitend; + } + ir.actcmd = 0x0000; + stopIR(); +} diff --git a/boop/trunk/infrared/ir_sirc.h b/boop/trunk/infrared/ir_sirc.h new file mode 100644 index 0000000..358096f --- /dev/null +++ b/boop/trunk/infrared/ir_sirc.h @@ -0,0 +1,29 @@ +/* + ir_sirc.h - sony sirc protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_SIRC_H +#define IR_SIRC_H + +void SIRC_Encode (void) __attribute__ ((section(".text.fastcode"))); + +void SIRC_Init(unsigned char map); +void SIRC_Send(unsigned long cmd); +void SIRC_Repeat(void); +void SIRC_Stop(void); + +#endif diff --git a/boop/trunk/infrared/ir_spaceenc.c b/boop/trunk/infrared/ir_spaceenc.c new file mode 100644 index 0000000..d6c0ccc --- /dev/null +++ b/boop/trunk/infrared/ir_spaceenc.c @@ -0,0 +1,254 @@ +/* + ir_spaceenc.c - space modulated protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lpc2220.h" +#include "infrared.h" +#include "ir_spaceenc.h" +#include "encoders.h" +#include "codes.h" +#include "ir_codes/spaceenc/schneider_dtv3_xtra" + +const struct irModule SPACEENC_Module = +{ + SPACEENC_Encode, + SPACEENC_Send, + SPACEENC_Repeat, + SPACEENC_Stop, + 119, // carrier + 1, // carrier-on + 3 // carrier-off +}; + +const struct irModule SPACEENC2_Module = +{ + SPACEENC_Encode, + SPACEENC2_Send, + SPACEENC2_Repeat, + SPACEENC2_Stop, + 119, // carrier + 1, // carrier-on + 3 // carrier-off +}; + +static unsigned int *ir_codes; +static unsigned char *ir_precodes; + +extern volatile unsigned char mod_enable; +extern volatile unsigned int cycles; +extern volatile unsigned long keyMap[42]; + +#define SPACEENC_IDLE 0x00 +#define SPACEENC_PRE_A 0x01 +#define SPACEENC_PRE_B 0x02 +#define SPACEENC_BIT_A 0x03 +#define SPACEENC_BIT_B 0x04 +#define SPACEENC_STOP 0x05 +#define SPACEENC_WAIT 0x06 + +#define SPACEENC_NUMBITS 6 +#define SPACEENC_BITTIME 20 +#define SPACEENC_BIT0 65 +#define SPACEENC_BIT1 150 +#define SPACEENC_WAITTIME 59 + +#define SPACEENC2_BITTIME 14 +#define SPACEENC2_BIT0 7 +#define SPACEENC2_BIT1 28 +#define SPACEENC2_WAITTIME 170 + +void __attribute__ ((section(".text.fastcode"))) SPACEENC_Encode (void) +{ + switch(ir.state) + { + case SPACEENC_IDLE: + mod_enable = 0; + break; + + case SPACEENC_PRE_A: + case SPACEENC_BIT_A: + cycles = ir.general.bittime; + mod_enable = 1; + ir.state++; + break; + + case SPACEENC_PRE_B: + mod_enable = 0; + if(ir.cmd & 0x01) + cycles = ir.general.bittime1; + else + cycles = ir.general.bittime0; + ir.cmd >>= 1; + ir.general.bit++; + if(ir.general.bit == ir.general.prebits) + { + ir.state = SPACEENC_BIT_A; + ir.general.bit = 0; + ir.cmd = ir_codes[ir.actcmd]; + } + else + { + ir.state--; + } + break; + + case SPACEENC_BIT_B: + mod_enable = 0; + if(ir.cmd & 0x01) + cycles = ir.general.bittime1; + else + cycles = ir.general.bittime0; + ir.cmd >>= 1; + ir.general.bit++; + if(ir.general.bit == ir.general.numbits) + ir.state++; + else + ir.state--; + break; + + case SPACEENC_STOP: + cycles = ir.general.bittime; + mod_enable = 1; + ir.state++; + break; + + case SPACEENC_WAIT: + mod_enable = 0; + ir.general.wait++; + if(ir.general.wait >= ir.general.waittime) + { + ir.general.bit = 0; + ir.general.wait = 0; + ir.state = SPACEENC_IDLE; + } + break; + } +} + +void SPACEENC_LoadMap(unsigned char map) +{ + switch(map) + { + case 1: + ir.general.numbits = SPACEENC_NUMBITS; + ir.general.prebits = 0; + ir.general.pre = 0x00; + ir.general.bittime = SPACEENC_BITTIME; + ir.general.bittime0 = SPACEENC_BIT0; + ir.general.bittime1 = SPACEENC_BIT1; + ir.general.waittime = SPACEENC_WAITTIME; + setIR(SPACEENC_Module); + break; + default: + ir.general.numbits = 32; + ir.general.prebits = 8; + ir.general.bittime = SPACEENC2_BITTIME; + ir.general.bittime0 = SPACEENC2_BIT0; + ir.general.bittime1 = SPACEENC2_BIT1; + ir.general.waittime = SPACEENC2_WAITTIME; + ir_codes = (unsigned int*) dtv3_codes; + ir_precodes = (unsigned char*) dtv3_pre; + setIR(SPACEENC2_Module); + break; + } +} + +void SPACEENC_Init(unsigned char map) +{ + if(map < SPACEENC.num_tables) + { + ir.state = SPACEENC_IDLE; + ir.cmd = 0x0000; + ir.actcmd = 0x0000; + ir.general.wait = 0; + ir.general.bit = 0; + copyMapC((unsigned char*)SPACEENC.table[map].codes); + SPACEENC_LoadMap(map); + cycles = SPACEENC_BITTIME; + } +} + +void SPACEENC_Send(unsigned long cmd) +{ + ir.actcmd = cmd; + setIRspeed(SPACEENC_Module); + SPACEENC_Repeat(); + runIR(); +} + +void SPACEENC_Repeat(void) +{ + if(ir.actcmd != 0x00000000) + { + if(ir.state == SPACEENC_IDLE) + { + ir.cmd = ir.actcmd; + ir.state = SPACEENC_BIT_A; + } + } +} + +void SPACEENC_Stop(void) +{ +waitend1: + while(ir.state != SPACEENC_IDLE) + goto waitend1; + + if(ir.actcmd != 0x00000000) + { + SPACEENC_Repeat(); + +waitend2: + if(ir.state != SPACEENC_IDLE) + goto waitend2; + } + ir.actcmd = 0x00000000; + stopIR(); +} + +void SPACEENC2_Send(unsigned long cmd) +{ + ir.actcmd = cmd; + SPACEENC2_Repeat(); +} + +void SPACEENC2_Repeat(void) +{ + if(ir.actcmd != 0x00000000) + { + if(ir.state == SPACEENC_IDLE) + { + ir.cmd = ir_precodes[ir.actcmd]; + ir.state = SPACEENC_PRE_A; + runIR(); + } + } +} + +void SPACEENC2_Stop(void) +{ + if(ir.actcmd != 0x00000000) + { +waitend2: + if(ir.state != SPACEENC_IDLE) + goto waitend2; + } + ir.actcmd = 0x00000000; + stopIR(); +} + + diff --git a/boop/trunk/infrared/ir_spaceenc.h b/boop/trunk/infrared/ir_spaceenc.h new file mode 100644 index 0000000..8132701 --- /dev/null +++ b/boop/trunk/infrared/ir_spaceenc.h @@ -0,0 +1,32 @@ +/* + ir_spaceenc.h - space modulated protocoll encoder + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IR_SPACEENC_H +#define IR_SPACEENC_H + +void SPACEENC_Encode (void) __attribute__ ((section(".text.fastcode"))); + +void SPACEENC_Init(unsigned char map); +void SPACEENC_Send(unsigned long cmd); +void SPACEENC_Repeat(void); +void SPACEENC_Stop(void); +void SPACEENC2_Send(unsigned long cmd); +void SPACEENC2_Repeat(void); +void SPACEENC2_Stop(void); + +#endif diff --git a/boop/trunk/interrupt/Make.conf b/boop/trunk/interrupt/Make.conf new file mode 100644 index 0000000..e7853f8 --- /dev/null +++ b/boop/trunk/interrupt/Make.conf @@ -0,0 +1 @@ +SRCS := irq.c diff --git a/boop/trunk/interrupt/irq.c b/boop/trunk/interrupt/irq.c new file mode 100644 index 0000000..9c8f965 --- /dev/null +++ b/boop/trunk/interrupt/irq.c @@ -0,0 +1,93 @@ +/* + irq.c - irq core functions + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lpc2220.h" +#include "irq.h" +#include "soundirq.h" +#include "infraredirq.h" + +#define IRQ_MASK 0x000000C0 + +extern unsigned char bl_val, cmp_val; + +static inline unsigned asm_get_cpsr(void) +{ + unsigned long retval; + asm volatile (" mrs %0, cpsr" : "=r" (retval) : /* no inputs */ ); + return retval; +} + +static inline void asm_set_cpsr(unsigned val) +{ + asm volatile (" msr cpsr, %0" : /* no outputs */ : "r" (val) ); +} + +unsigned enableIRQ(void) +{ + unsigned _cpsr; + + _cpsr = asm_get_cpsr(); + asm_set_cpsr(_cpsr & ~IRQ_MASK); + return _cpsr; +} + +unsigned disableIRQ(void) +{ + unsigned _cpsr; + + _cpsr = asm_get_cpsr(); + asm_set_cpsr(_cpsr | IRQ_MASK); + return _cpsr; +} + +unsigned restoreIRQ(unsigned oldCPSR) +{ + unsigned _cpsr; + + _cpsr = asm_get_cpsr(); + asm_set_cpsr((_cpsr & ~IRQ_MASK) | (oldCPSR & IRQ_MASK)); + return _cpsr; +} + + +// handle sound, IR, backlight in timer ISR +// user manual section 5.1, p. 62: +// Fast Interrupt reQuest (FIQ) requests have the highest priority. +// (where's the vector? in lpc2220_rom.ld ?) +void __attribute__ ((section(".text.fastcode"))) FIQ_Routine (void) +{ + while ((PWMIR == 0x01) || (T1IR == 1)) + { + if (PWMIR == 0x01) + soundIRQ(); // sound, backlight + if (T1IR == 1) + irIRQ(); // IR + } +} + + +void SWI_Routine (void) { + while (1) ; +} + + +void UNDEF_Routine (void) { + while (1) ; +} + + diff --git a/boop/trunk/interrupt/irq.h b/boop/trunk/interrupt/irq.h new file mode 100644 index 0000000..23b898a --- /dev/null +++ b/boop/trunk/interrupt/irq.h @@ -0,0 +1,71 @@ +/* + irq.h - irq core functions + Copyright (C) 2007 Ch. Klippel + + 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 3 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 IRQ_H +#define IRQ_H + +#define INT_WDT 0x00000001 +#define INT_CORE0 0x00000004 +#define INT_CORE1 0x00000008 +#define INT_TIMER0 0x00000010 +#define INT_TIMER1 0x00000020 +#define INT_UART0 0x00000040 +#define INT_UART1 0x00000080 +#define INT_PWM 0x00000100 +#define INT_I2C 0x00000200 +#define INT_SPI0 0x00000400 +#define INT_SPI1 0x00000800 +#define INT_PLL 0x00001000 +#define INT_RTC 0x00002000 +#define INT_EINT0 0x00004000 +#define INT_EINT1 0x00008000 +#define INT_EINT2 0x00010000 +#define INT_EINT3 0x00020000 +#define INT_ADC 0x00040000 + +#define INT_SRC_WDT 0 +#define INT_SRC_CORE0 2 +#define INT_SRC_CORE1 3 +#define INT_SRC_TIMER0 4 +#define INT_SRC_TIMER1 5 +#define INT_SRC_UART0 6 +#define INT_SRC_UART1 7 +#define INT_SRC_PWM 8 +#define INT_SRC_I2C 9 +#define INT_SRC_SPI0 10 +#define INT_SRC_SPI1 11 +#define INT_SRC_PLL 12 +#define INT_SRC_RTC 13 +#define INT_SRC_EINT0 14 +#define INT_SRC_EINT1 15 +#define INT_SRC_EINT2 16 +#define INT_SRC_EINT3 17 +#define INT_SRC_ADC 18 + +#define VIC_SLOT_EN 0x00000020 + +void __attribute__ ((section(".text.fastcode"))) FIQ_Routine (void); +void SWI_Routine (void) __attribute__ ((interrupt("SWI"))); +void UNDEF_Routine (void) __attribute__ ((interrupt("UNDEF"))); + + +unsigned enableIRQ(void); +unsigned disableIRQ(void); +unsigned restoreIRQ(unsigned oldCPSR); + +#endif diff --git a/boop/trunk/keyboard/Make.conf b/boop/trunk/keyboard/Make.conf new file mode 100644 index 0000000..42df737 --- /dev/null +++ b/boop/trunk/keyboard/Make.conf @@ -0,0 +1,2 @@ +THUMBSRCS := keyboard.c +SRCS := keyirq.c diff --git a/boop/trunk/keyboard/keyboard.c b/boop/trunk/keyboard/keyboard.c new file mode 100644 index 0000000..2be0baa --- /dev/null +++ b/boop/trunk/keyboard/keyboard.c @@ -0,0 +1,150 @@ +/* + keyboard.c - button handling + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "keyboard.h" +#include "keyirq.h" +#include "lpc2220.h" +#include "timerfuncs.h" +#include "backlight.h" +#include "irq.h" + + +void initKeys(void) +{ + keys[0] = 0; + keys[1] = 0; + IOCLR2=((1<<18)|(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24)); + FIODIR0 &= ~(1<<30); + startCB(addTimerCB(keyScanner, 15)); + + EXTWAKE |= 0x08; + PINSEL1 |= (1<<29); +} + +void waitKeyUp(void) +{ + while((keys[0] != 0) || (keys[1] != 0)) {}; +} + +extern void cpu_idle(); + +void waitKeyDown(void) +{ + while ((keys[0] == 0) && (keys[1] == 0)) + { + cpu_idle(); + }; + setBacklight(BL_AUTO); // pwm value +} + +inline char isKeyPressed (void) +{ + return ((keys[0] != 0) || (keys[1] != 0)); +} + +signed char getNumKeyValue(void) { + signed char x; + + switch (keys[0]) { + case 0x00000002: + x= 7; + break; + case 0x00000008: + x= 4; + break; + case 0x00000020: + x= 1; + break; + case 0x00020000: + x= 0; + break; + case 0x00040000: + x= 9; + break; + case 0x00080000: + x= 8; + break; + case 0x00100000: + x= 6; + break; + default: + x=-1; + } + switch (keys[1]) { + case 0x00000040: + x= 2; + break; + case 0x00000080: + x= 3; + break; + case 0x00040000: + x= 5; + break; + } + return(x); +} + +#define keynum( _X, _Y ) if(_X) return _Y + +unsigned char getKeynum(void) +{ + keynum(KEY_A, 0); + keynum(KEY_B, 1); + keynum(KEY_C, 2); + keynum(KEY_D, 3); + keynum(KEY_Betty, 4); + keynum(KEY_Exit, 5); + keynum(KEY_Up, 6); + keynum(KEY_Down, 7); + keynum(KEY_Left, 8); + keynum(KEY_Right, 9); + keynum(KEY_OK, 10); + keynum(KEY_Vplus, 11); + keynum(KEY_Vminus, 12); + keynum(KEY_Mute, 13); + keynum(KEY_Pplus, 14); + keynum(KEY_Pminus, 15); + keynum(KEY_1, 16); + keynum(KEY_2, 17); + keynum(KEY_3, 18); + keynum(KEY_4, 19); + keynum(KEY_5, 20); + keynum(KEY_6, 21); + keynum(KEY_7, 22); + keynum(KEY_8, 23); + keynum(KEY_9, 24); + keynum(KEY_0, 25); + keynum(KEY_Minus, 26); + keynum(KEY_AV, 27); + keynum(KEY_Menu, 28); + keynum(KEY_PiP, 29); + keynum(KEY_AB, 30); + keynum(KEY_16_9, 31); + keynum(KEY_Info, 32); + keynum(KEY_VTX1, 33); + keynum(KEY_VTX2, 34); + keynum(KEY_VTX3, 35); + keynum(KEY_Blue, 36); + keynum(KEY_Yellow, 37); + keynum(KEY_Green, 38); + keynum(KEY_Red, 39); + keynum(KEY_TV, 40); + keynum(KEY_Power, 41); + return 42; +} + diff --git a/boop/trunk/keyboard/keyboard.h b/boop/trunk/keyboard/keyboard.h new file mode 100644 index 0000000..d589840 --- /dev/null +++ b/boop/trunk/keyboard/keyboard.h @@ -0,0 +1,197 @@ +/* + keyboard.h - button handling + Copyright (C) 2007 Ch. Klippel + + 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 3 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 KEYBOARD_H +#define KEYBOARD_H + + +//Uncomment if you have a swisscom Betty +//#define SWISSCOM + +/* +#define KEY_5 (keys[0] & 0x00000001) +#define KEY_6 (keys[0] & 0x00000002) +#define KEY_C (keys[0] & 0x00000004) +#define KEY_B (keys[0] & 0x00000008) +#define KEY_A (keys[0] & 0x00000010) +#define KEY_1 (keys[0] & 0x00000020) +#define KEY_8 (keys[0] & 0x00000040) +#define KEY_9 (keys[0] & 0x00000080) +#define KEY_D (keys[0] & 0x00000100) +#define KEY_Up (keys[0] & 0x00000200) +#define KEY_Betty (keys[0] & 0x00000400) +#define KEY_4 (keys[0] & 0x00000800) +#define KEY_0 (keys[0] & 0x00001000) +#define KEY_AV (keys[0] & 0x00002000) +#define KEY_Right (keys[0] & 0x00004000) +#define KEY_Left (keys[0] & 0x00008000) +#define KEY_Vplus (keys[0] & 0x00010000) +#define KEY_7 (keys[0] & 0x00020000) +#define KEY_AB (keys[0] & 0x00040000) +#define KEY_16_9 (keys[0] & 0x00080000) +#define KEY_Exit (keys[0] & 0x00100000) +#define KEY_OK (keys[0] & 0x00200000) +#define KEY_Vminus (keys[0] & 0x00400000) +#define KEY_Minus (keys[0] & 0x00800000) +#define KEY_VTX2 (keys[0] & 0x01000000) +#define KEY_VTX3 (keys[0] & 0x02000000) +#define KEY_Pplus (keys[0] & 0x04000000) +#define KEY_Down (keys[0] & 0x08000000) +#define KEY_Menu (keys[0] & 0x10000000) +#define KEY_PiP (keys[0] & 0x20000000) + +#define KEY_Yellow (keys[1] & 0x00000001) +#define KEY_Blue (keys[1] & 0x00000002) +#define KEY_Pminus (keys[1] & 0x00000004) +#define KEY_Mute (keys[1] & 0x00000008) +#define KEY_Info (keys[1] & 0x00000010) +#define KEY_VTX1 (keys[1] & 0x00000020) +#define KEY_TV (keys[1] & 0x00000040) +#define KEY_Power (keys[1] & 0x00000080) +#define KEY_3 (keys[1] & 0x00000100) +#define KEY_2 (keys[1] & 0x00000200) +#define KEY_Red (keys[1] & 0x00000400) +#define KEY_Green (keys[1] & 0x00000800) +*/ + +#ifdef SWISSCOM + #define KEY_B (keys[0] & 0x00000001) + #define KEY_C (keys[0] & 0x00000002) + #define KEY_6 (keys[0] & 0x00000004) + #define KEY_5 (keys[0] & 0x00000008) + #define KEY_Up (keys[0] & 0x00000010) + #define KEY_D (keys[0] & 0x00000020) + #define KEY_9 (keys[0] & 0x00000040) + #define KEY_8 (keys[0] & 0x00000080) + #define KEY_Left (keys[0] & 0x00000100) + #define KEY_Right (keys[0] & 0x00000200) + #define KEY_AV (keys[0] & 0x00000400) + #define KEY_0 (keys[0] & 0x00000800) + #define KEY_OK (keys[0] & 0x00001000) + #define KEY_Exit (keys[0] & 0x00002000) + #define KEY_16_9 (keys[0] & 0x00004000) + #define KEY_AB (keys[0] & 0x00008000) + #define KEY_Down (keys[0] & 0x00010000) + #define KEY_Pplus (keys[0] & 0x00020000) + #define KEY_VTX3 (keys[0] & 0x00040000) + #define KEY_VTX2 (keys[0] & 0x00080000) + #define KEY_Mute (keys[0] & 0x00100000) + #define KEY_Pminus (keys[0] & 0x00200000) + #define KEY_Blue (keys[0] & 0x00400000) + #define KEY_Yellow (keys[0] & 0x00800000) + #define KEY_2 (keys[0] & 0x01000000) + #define KEY_3 (keys[0] & 0x02000000) + #define KEY_Power (keys[0] & 0x04000000) + #define KEY_TV (keys[0] & 0x08000000) + + #define KEY_A (keys[1] & 0x00000001) + #define KEY_1 (keys[1] & 0x00000002) + #define KEY_Betty (keys[1] & 0x00000004) + #define KEY_4 (keys[1] & 0x00000008) + #define KEY_Vplus (keys[1] & 0x00000010) + #define KEY_7 (keys[1] & 0x00000020) + #define KEY_Vminus (keys[1] & 0x00000040) + #define KEY_Minus (keys[1] & 0x00000080) + #define KEY_Menu (keys[1] & 0x00000100) + #define KEY_PiP (keys[1] & 0x00000200) + #define KEY_Info (keys[1] & 0x00000400) + #define KEY_VTX1 (keys[1] & 0x00000800) + #define KEY_Red (keys[1] & 0x00001000) + #define KEY_Green (keys[1] & 0x00002000) + +#else + + #define KEY_OK (keys[0] & 0x00000001) + #define KEY_7 (keys[0] & 0x00000002) + #define KEY_Vplus (keys[0] & 0x00000004) + #define KEY_4 (keys[0] & 0x00000008) + #define KEY_Betty (keys[0] & 0x00000010) + #define KEY_1 (keys[0] & 0x00000020) + #define KEY_A (keys[0] & 0x00000040) + #define KEY_Left (keys[0] & 0x00000080) + #define KEY_Exit (keys[0] & 0x00000100) + #define KEY_Up (keys[0] & 0x00000200) + #define KEY_B (keys[0] & 0x00000400) + #define KEY_16_9 (keys[0] & 0x00000800) + #define KEY_AB (keys[0] & 0x00001000) + #define KEY_D (keys[0] & 0x00002000) + #define KEY_Right (keys[0] & 0x00004000) + #define KEY_C (keys[0] & 0x00008000) + #define KEY_AV (keys[0] & 0x00010000) + #define KEY_0 (keys[0] & 0x00020000) + #define KEY_9 (keys[0] & 0x00040000) + #define KEY_8 (keys[0] & 0x00080000) + #define KEY_6 (keys[0] & 0x00100000) + + #define KEY_Green (keys[1] & 0x00000001) + #define KEY_Red (keys[1] & 0x00000002) + #define KEY_VTX1 (keys[1] & 0x00000004) + #define KEY_Info (keys[1] & 0x00000008) + #define KEY_PiP (keys[1] & 0x00000010) + #define KEY_Menu (keys[1] & 0x00000020) + #define KEY_2 (keys[1] & 0x00000040) + #define KEY_3 (keys[1] & 0x00000080) + #define KEY_Mute (keys[1] & 0x00000100) + #define KEY_Pminus (keys[1] & 0x00000200) + #define KEY_Down (keys[1] & 0x00000400) + #define KEY_Pplus (keys[1] & 0x00000800) + #define KEY_Power (keys[1] & 0x00001000) + #define KEY_TV (keys[1] & 0x00002000) + #define KEY_Blue (keys[1] & 0x00004000) + #define KEY_Yellow (keys[1] & 0x00008000) + #define KEY_VTX3 (keys[1] & 0x00010000) + #define KEY_VTX2 (keys[1] & 0x00020000) + #define KEY_5 (keys[1] & 0x00040000) + #define KEY_Minus (keys[1] & 0x00080000) + #define KEY_Vminus (keys[1] & 0x00100000) + +#endif + +#define AUTO_TIMEOUT 5 + +#define KEY_IDLE 0x00 +#define KEY_PRESS 0x01 +#define KEY_HOLD 0x02 +#define KEY_RELEASE 0x03 + +#define FIOPIN0_KBDINT (1<<30) +#define ANYKEY (!(FIOPIN0 & FIOPIN0_KBDINT)) + +#define testLine(_c) \ +{ \ + if(!(_c)) \ + { \ + keys[half] |= keytest; \ + } \ + keytest <<= 1; \ +} + +volatile unsigned int keys[2]; + +void initKeys(void); +void scanKeys(void); +void waitKeyUp(void); +void waitKeyDown(void); +/// Return 1 if any key is pressed. +inline char isKeyPressed (void); +signed char getNumKeyValue(void); +unsigned char getKeynum(void); + +#define waitKeyUpDown() { waitKeyUp(); waitKeyDown(); } + +#endif diff --git a/boop/trunk/keyboard/keyirq.c b/boop/trunk/keyboard/keyirq.c new file mode 100644 index 0000000..6a11f45 --- /dev/null +++ b/boop/trunk/keyboard/keyirq.c @@ -0,0 +1,195 @@ +/* + keyirq.c - keyboard scanning interrupt + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "keyboard.h" +#include "keyirq.h" +#include "lpc2220.h" +#include "timerfuncs.h" +#include "global.h" + +static unsigned char scannerTimeout; +static unsigned char repeatTimeout; +static unsigned char fastToggle; +static unsigned char scannerState = 0; + +#define S_IDLE 0x00 +#define S_PRESSED 0x01 +#define S_HOLD 0x02 +#define S_REPEAT 0x03 + +#define S_REPEATDELAY 6 +#define S_REPEATRATE 4 + +#define MASK0 0x18402000 +#define MASK3 0x00300000 + +void __attribute__ ((section(".text.fastcode"))) keyScanner(unsigned int cb) +{ +#ifdef SWISSCOM + static unsigned int IO2_P, IO2_PC, IO2_0, IO2_1; +#else + static unsigned int temp; + + keys[0] = 0; + keys[1] = 0; +#endif + + if(ANYKEY) + { +#ifdef SWISSCOM + IOSET2= (126<<18); + IO2_P = (1<<18); + IO2_0=0; + IO2_1=0; + keys[0]=0; + keys[1]=0; + for(IO2_PC=18;IO2_PC<=24;IO2_PC++) + { + IOCLR2 = IO2_P; + keys[0] |= ((IOPIN1>>16) & 0xF)<>21) & 0x3)<>1; + keys[0] |= (IOPIN3 & MASK3) >> 14; + + IOSET2 = (1<<18); + IOCLR2 = (1<<19); + + keys[0] |= FIOPIN0>> 3; + keys[0] |= (IOPIN3 & MASK3) >> 16; + + IOSET2 = (1<<19); + IOCLR2 = (1<<20); + + keys[0] |= FIOPIN0>> 5; + keys[0] |= (IOPIN3 & MASK3) >> 18; + + IOSET2 = (1<<20); + IOCLR2 = (1<<21); + + keys[0] |= FIOPIN0 >> 13; + keys[0] |= (IOPIN3 & MASK3) << 8; + + keys[0] = ~keys[0]; + keys[0] &= 0x3FEAD7FD; + + IOSET2 = (1<<21); + IOCLR2 = (1<<22); + + keys[1] = FIOPIN0>> 3; + keys[1] |= (IOPIN3 & MASK3) >> 16; + + IOSET2 = (1<<22); + IOCLR2 = (1<<23); + + keys[1] |= FIOPIN0>> 5; + keys[1] |= (IOPIN3 & MASK3) >> 18; + + IOSET2 = (1<<23); + IOCLR2 = (1<<24); + + keys[1] |= FIOPIN0>> 7; + keys[1] |= (IOPIN3 & MASK3) >> 20; + + keys[1] = ~keys[1]; + keys[1] &= 0x3FA857F; + + temp = (keys[0] & 0x3FE80000)>>3; + keys[0] &= 0x0002D7FD; + keys[0] |= temp; + + temp = (keys[0] & 0x07FFD000)>>1; + keys[0] &= 0x000007FD; + keys[0] |= temp; + + temp = keys[0]>>1; + keys[0] &= 0x00000001; + keys[0] |= temp; + + temp = (keys[0] & 0x1FFF000)>>1; + keys[0] &= 0x7FF; + keys[0] |= temp; + + temp = (keys[1] & 0x03FA8000) >> 8; + keys[1] &= 0x0000057F; + keys[1] |= temp; + + temp = keys[0] & 0x00E00000; + keys[0] &= 0x1FFFFF; + keys[1] |= (temp>>3); + + FIOMASK0 &= MASK0; + IOCLR2=((1<<18)|(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23)); +#endif + } + + if((keys[0] == 0) && (keys[1] == 0)) + { + scannerTimeout = 0; + repeatTimeout = S_REPEATDELAY; + scannerState = S_IDLE; + } + else if(scannerState == S_IDLE) + { + scannerState = S_PRESSED; + } + + switch(scannerState) + { + case S_PRESSED: + scannerTimeout++; + if((scannerTimeout > repeatTimeout) && (repeatTimeout != 0) && !(sysInfo & SYS_IR)) + { + repeatTimeout = S_REPEATRATE; + scannerState++; + } + break; + case S_HOLD: + keys[0] = 0; + keys[1] = 0; + scannerState++; + break; + + case S_REPEAT: + scannerTimeout++; + if(scannerTimeout > repeatTimeout) + { + keys[0] = 0; + keys[1] = 0; + scannerTimeout = 0; + fastToggle++; + if((fastToggle > 4) && (repeatTimeout > 1)) + { + repeatTimeout >>= 1; + fastToggle = 0; + } + } + break; + } +} diff --git a/boop/trunk/keyboard/keyirq.h b/boop/trunk/keyboard/keyirq.h new file mode 100644 index 0000000..c510ce1 --- /dev/null +++ b/boop/trunk/keyboard/keyirq.h @@ -0,0 +1,35 @@ +/* + keyirq.h - keyboard scanning interrupt + Copyright (C) 2007 Ch. Klippel + + 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 3 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 KEYIRQ_H +#define KEYIRQ_H + +#define AUTO_TIMEOUT 5 + +#define testLine(_c) \ +{ \ + if(!(_c)) \ + { \ + keys[half] |= keytest; \ + } \ + keytest <<= 1; \ +} + +void __attribute__ ((section(".text.fastcode"))) keyScanner (unsigned int cb); + +#endif diff --git a/boop/trunk/lpc2220.h b/boop/trunk/lpc2220.h new file mode 100644 index 0000000..36693c3 --- /dev/null +++ b/boop/trunk/lpc2220.h @@ -0,0 +1,290 @@ +/* + lpc2220.h - register definitions + Copyright (C) 2007 Ch. Klippel + + 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 3 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 LPC2220_H +#define LPC2220_H + +/* External Memory Controller (EMC) */ +#define BCFG0 (*((volatile unsigned long *) 0xFFE00000)) +#define BCFG1 (*((volatile unsigned long *) 0xFFE00004)) +#define BCFG2 (*((volatile unsigned long *) 0xFFE00008)) +#define BCFG3 (*((volatile unsigned long *) 0xFFE0000C)) + +/* Vectored Interrupt Controller (VIC) */ +#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000)) +#define VICFIQStatus (*((volatile unsigned long *) 0xFFFFF004)) +#define VICRawIntr (*((volatile unsigned long *) 0xFFFFF008)) +#define VICIntSelect (*((volatile unsigned long *) 0xFFFFF00C)) +#define VICIntEnable (*((volatile unsigned long *) 0xFFFFF010)) +#define VICIntEnClr (*((volatile unsigned long *) 0xFFFFF014)) +#define VICSoftInt (*((volatile unsigned long *) 0xFFFFF018)) +#define VICSoftIntClr (*((volatile unsigned long *) 0xFFFFF01C)) +#define VICProtection (*((volatile unsigned long *) 0xFFFFF020)) +#define VICVectAddr (*((volatile unsigned long *) 0xFFFFF030)) +#define VICDefVectAddr (*((volatile unsigned long *) 0xFFFFF034)) +#define VICVectAddr0 (*((volatile unsigned long *) 0xFFFFF100)) +#define VICVectAddr1 (*((volatile unsigned long *) 0xFFFFF104)) +#define VICVectAddr2 (*((volatile unsigned long *) 0xFFFFF108)) +#define VICVectAddr3 (*((volatile unsigned long *) 0xFFFFF10C)) +#define VICVectAddr4 (*((volatile unsigned long *) 0xFFFFF110)) +#define VICVectAddr5 (*((volatile unsigned long *) 0xFFFFF114)) +#define VICVectAddr6 (*((volatile unsigned long *) 0xFFFFF118)) +#define VICVectAddr7 (*((volatile unsigned long *) 0xFFFFF11C)) +#define VICVectAddr8 (*((volatile unsigned long *) 0xFFFFF120)) +#define VICVectAddr9 (*((volatile unsigned long *) 0xFFFFF124)) +#define VICVectAddr10 (*((volatile unsigned long *) 0xFFFFF128)) +#define VICVectAddr11 (*((volatile unsigned long *) 0xFFFFF12C)) +#define VICVectAddr12 (*((volatile unsigned long *) 0xFFFFF130)) +#define VICVectAddr13 (*((volatile unsigned long *) 0xFFFFF134)) +#define VICVectAddr14 (*((volatile unsigned long *) 0xFFFFF138)) +#define VICVectAddr15 (*((volatile unsigned long *) 0xFFFFF13C)) +#define VICVectCntl0 (*((volatile unsigned long *) 0xFFFFF200)) +#define VICVectCntl1 (*((volatile unsigned long *) 0xFFFFF204)) +#define VICVectCntl2 (*((volatile unsigned long *) 0xFFFFF208)) +#define VICVectCntl3 (*((volatile unsigned long *) 0xFFFFF20C)) +#define VICVectCntl4 (*((volatile unsigned long *) 0xFFFFF210)) +#define VICVectCntl5 (*((volatile unsigned long *) 0xFFFFF214)) +#define VICVectCntl6 (*((volatile unsigned long *) 0xFFFFF218)) +#define VICVectCntl7 (*((volatile unsigned long *) 0xFFFFF21C)) +#define VICVectCntl8 (*((volatile unsigned long *) 0xFFFFF220)) +#define VICVectCntl9 (*((volatile unsigned long *) 0xFFFFF224)) +#define VICVectCntl10 (*((volatile unsigned long *) 0xFFFFF228)) +#define VICVectCntl11 (*((volatile unsigned long *) 0xFFFFF22C)) +#define VICVectCntl12 (*((volatile unsigned long *) 0xFFFFF230)) +#define VICVectCntl13 (*((volatile unsigned long *) 0xFFFFF234)) +#define VICVectCntl14 (*((volatile unsigned long *) 0xFFFFF238)) +#define VICVectCntl15 (*((volatile unsigned long *) 0xFFFFF23C)) + +#define SCS (*((volatile unsigned char *) 0xE01FC1A0)) +#define FIOPIN0 (*((volatile unsigned long *) 0x3FFFC014)) +#define FIOSET0 (*((volatile unsigned long *) 0x3FFFC018)) +#define FIODIR0 (*((volatile unsigned long *) 0x3FFFC000)) +#define FIOCLR0 (*((volatile unsigned long *) 0x3FFFC01C)) +#define FIOMASK0 (*((volatile unsigned long *) 0x3FFFC010)) + +/* Pin Connect Block */ +#define PINSEL0 (*((volatile unsigned long *) 0xE002C000)) +#define PINSEL1 (*((volatile unsigned long *) 0xE002C004)) +#define PINSEL2 (*((volatile unsigned long *) 0xE002C014)) + +/* General Purpose Input/Output (GPIO) */ +#define IOPIN0 (*((volatile unsigned long *) 0xE0028000)) +#define IOSET0 (*((volatile unsigned long *) 0xE0028004)) +#define IODIR0 (*((volatile unsigned long *) 0xE0028008)) +#define IOCLR0 (*((volatile unsigned long *) 0xE002800C)) +#define IOPIN1 (*((volatile unsigned long *) 0xE0028010)) +#define IOSET1 (*((volatile unsigned long *) 0xE0028014)) +#define IODIR1 (*((volatile unsigned long *) 0xE0028018)) +#define IOCLR1 (*((volatile unsigned long *) 0xE002801C)) +#define IOPIN2 (*((volatile unsigned long *) 0xE0028020)) +#define IOSET2 (*((volatile unsigned long *) 0xE0028024)) +#define IODIR2 (*((volatile unsigned long *) 0xE0028028)) +#define IOCLR2 (*((volatile unsigned long *) 0xE002802C)) +#define IOPIN3 (*((volatile unsigned long *) 0xE0028030)) +#define IOSET3 (*((volatile unsigned long *) 0xE0028034)) +#define IODIR3 (*((volatile unsigned long *) 0xE0028038)) +#define IOCLR3 (*((volatile unsigned long *) 0xE002803C)) + +/* Phase Locked Loop (PLL) */ +#define PLLCON (*((volatile unsigned char *) 0xE01FC080)) +#define PLLCFG (*((volatile unsigned char *) 0xE01FC084)) +#define PLLSTAT (*((volatile unsigned short*) 0xE01FC088)) +#define PLLFEED (*((volatile unsigned char *) 0xE01FC08C)) + +/* VPB Divider */ +#define VPBDIV (*((volatile unsigned char *) 0xE01FC100)) + +/* Power Control */ +#define PCON (*((volatile unsigned char *) 0xE01FC0C0)) +#define PCONP (*((volatile unsigned long *) 0xE01FC0C4)) + +/* External Interrupts */ +#define EXTINT (*((volatile unsigned char *) 0xE01FC140)) +#define EXTWAKE (*((volatile unsigned char *) 0xE01FC144)) +#define EXTMODE (*((volatile unsigned char *) 0xE01FC148)) +#define EXTPOLAR (*((volatile unsigned char *) 0xE01FC14C)) + +/* Timer 0 */ +#define T0IR (*((volatile unsigned long *) 0xE0004000)) +#define T0TCR (*((volatile unsigned long *) 0xE0004004)) +#define T0TC (*((volatile unsigned long *) 0xE0004008)) +#define T0PR (*((volatile unsigned long *) 0xE000400C)) +#define T0PC (*((volatile unsigned long *) 0xE0004010)) +#define T0MCR (*((volatile unsigned long *) 0xE0004014)) +#define T0MR0 (*((volatile unsigned long *) 0xE0004018)) +#define T0MR1 (*((volatile unsigned long *) 0xE000401C)) +#define T0MR2 (*((volatile unsigned long *) 0xE0004020)) +#define T0MR3 (*((volatile unsigned long *) 0xE0004024)) +#define T0CCR (*((volatile unsigned long *) 0xE0004028)) +#define T0CR0 (*((volatile unsigned long *) 0xE000402C)) +#define T0CR1 (*((volatile unsigned long *) 0xE0004030)) +#define T0CR2 (*((volatile unsigned long *) 0xE0004034)) +#define T0CR3 (*((volatile unsigned long *) 0xE0004038)) +#define T0EMR (*((volatile unsigned long *) 0xE000403C)) + +/* Timer 1 */ +#define T1IR (*((volatile unsigned long *) 0xE0008000)) +#define T1TCR (*((volatile unsigned long *) 0xE0008004)) +#define T1TC (*((volatile unsigned long *) 0xE0008008)) +#define T1PR (*((volatile unsigned long *) 0xE000800C)) +#define T1PC (*((volatile unsigned long *) 0xE0008010)) +#define T1MCR (*((volatile unsigned long *) 0xE0008014)) +#define T1MR0 (*((volatile unsigned long *) 0xE0008018)) +#define T1MR1 (*((volatile unsigned long *) 0xE000801C)) +#define T1MR2 (*((volatile unsigned long *) 0xE0008020)) +#define T1MR3 (*((volatile unsigned long *) 0xE0008024)) +#define T1CCR (*((volatile unsigned long *) 0xE0008028)) +#define T1CR0 (*((volatile unsigned long *) 0xE000802C)) +#define T1CR1 (*((volatile unsigned long *) 0xE0008030)) +#define T1CR2 (*((volatile unsigned long *) 0xE0008034)) +#define T1CR3 (*((volatile unsigned long *) 0xE0008038)) +#define T1EMR (*((volatile unsigned long *) 0xE000803C)) + +/* Pulse Width Modulator (PWM) */ +#define PWMIR (*((volatile unsigned long *) 0xE0014000)) +#define PWMTCR (*((volatile unsigned long *) 0xE0014004)) +#define PWMTC (*((volatile unsigned long *) 0xE0014008)) +#define PWMPR (*((volatile unsigned long *) 0xE001400C)) +#define PWMPC (*((volatile unsigned long *) 0xE0014010)) +#define PWMMCR (*((volatile unsigned long *) 0xE0014014)) +#define PWMMR0 (*((volatile unsigned long *) 0xE0014018)) +#define PWMMR1 (*((volatile unsigned long *) 0xE001401C)) +#define PWMMR2 (*((volatile unsigned long *) 0xE0014020)) +#define PWMMR3 (*((volatile unsigned long *) 0xE0014024)) +#define PWMMR4 (*((volatile unsigned long *) 0xE0014040)) +#define PWMMR5 (*((volatile unsigned long *) 0xE0014044)) +#define PWMMR6 (*((volatile unsigned long *) 0xE0014048)) +#define PWMCCR (*((volatile unsigned long *) 0xE0014028)) +#define PWMCR0 (*((volatile unsigned long *) 0xE001402C)) +#define PWMCR1 (*((volatile unsigned long *) 0xE0014030)) +#define PWMCR2 (*((volatile unsigned long *) 0xE0014034)) +#define PWMCR3 (*((volatile unsigned long *) 0xE0014038)) +#define PWMEMR (*((volatile unsigned long *) 0xE001403C)) +#define PWMPCR (*((volatile unsigned long *) 0xE001404C)) +#define PWMLER (*((volatile unsigned long *) 0xE0014050)) + +/* Universal Asynchronous Receiver Transmitter 0 (UART0) */ +#define U0RBR (*((volatile unsigned char *) 0xE000C000)) +#define U0THR (*((volatile unsigned char *) 0xE000C000)) +#define U0IER (*((volatile unsigned char *) 0xE000C004)) +#define U0IIR (*((volatile unsigned char *) 0xE000C008)) +#define U0FCR (*((volatile unsigned char *) 0xE000C008)) +#define U0LCR (*((volatile unsigned char *) 0xE000C00C)) +#define U0MCR (*((volatile unsigned char *) 0xE000C010)) +#define U0LSR (*((volatile unsigned char *) 0xE000C014)) +#define U0MSR (*((volatile unsigned char *) 0xE000C018)) +#define U0SCR (*((volatile unsigned char *) 0xE000C01C)) +#define U0FDR (*((volatile unsigned char *) 0xE000C028)) +#define U0DLL (*((volatile unsigned char *) 0xE000C000)) +#define U0DLM (*((volatile unsigned char *) 0xE000C004)) + +/* Universal Asynchronous Receiver Transmitter 1 (UART1) */ +#define U1RBR (*((volatile unsigned char *) 0xE0010000)) +#define U1THR (*((volatile unsigned char *) 0xE0010000)) +#define U1IER (*((volatile unsigned char *) 0xE0010004)) +#define U1IIR (*((volatile unsigned char *) 0xE0010008)) +#define U1FCR (*((volatile unsigned char *) 0xE0010008)) +#define U1LCR (*((volatile unsigned char *) 0xE001000C)) +#define U1MCR (*((volatile unsigned char *) 0xE0010010)) +#define U1LSR (*((volatile unsigned char *) 0xE0010014)) +#define U1MSR (*((volatile unsigned char *) 0xE0010018)) +#define U1SCR (*((volatile unsigned char *) 0xE001001C)) +#define U1DLL (*((volatile unsigned char *) 0xE0010000)) +#define U1DLM (*((volatile unsigned char *) 0xE0010004)) + +/* I2C Interface */ +#define I2CONSET (*((volatile unsigned char *) 0xE001C000)) +#define I2STAT (*((volatile unsigned char *) 0xE001C004)) +#define I2DAT (*((volatile unsigned char *) 0xE001C008)) +#define I2ADR (*((volatile unsigned char *) 0xE001C00C)) +#define I2SCLH (*((volatile unsigned short*) 0xE001C010)) +#define I2SCLL (*((volatile unsigned short*) 0xE001C014)) +#define I2CONCLR (*((volatile unsigned char *) 0xE001C018)) + +/* SPI0 (Serial Peripheral Interface 0) */ +#define S0SPCR (*((volatile unsigned char *) 0xE0020000)) +#define S0SPSR (*((volatile unsigned char *) 0xE0020004)) +#define S0SPDR (*((volatile unsigned char *) 0xE0020008)) +#define S0SPCCR (*((volatile unsigned char *) 0xE002000C)) +#define S0SPTCR (*((volatile unsigned char *) 0xE0020010)) +#define S0SPTSR (*((volatile unsigned char *) 0xE0020014)) +#define S0SPTOR (*((volatile unsigned char *) 0xE0020018)) +#define S0SPINT (*((volatile unsigned char *) 0xE002001C)) + +/* SPI1 (Serial Peripheral Interface 1) */ +#define S1SPCR (*((volatile unsigned char *) 0xE0030000)) +#define S1SPSR (*((volatile unsigned char *) 0xE0030004)) +#define S1SPDR (*((volatile unsigned char *) 0xE0030008)) +#define S1SPCCR (*((volatile unsigned char *) 0xE003000C)) +#define S1SPTCR (*((volatile unsigned char *) 0xE0030010)) +#define S1SPTSR (*((volatile unsigned char *) 0xE0030014)) +#define S1SPTOR (*((volatile unsigned char *) 0xE0030018)) +#define S1SPINT (*((volatile unsigned char *) 0xE003001C)) + +/* Real Time Clock */ +#define ILR (*((volatile unsigned char *) 0xE0024000)) +#define CTC (*((volatile unsigned short*) 0xE0024004)) +#define CCR (*((volatile unsigned char *) 0xE0024008)) +#define CIIR (*((volatile unsigned char *) 0xE002400C)) +#define AMR (*((volatile unsigned char *) 0xE0024010)) +#define CTIME0 (*((volatile unsigned long *) 0xE0024014)) +#define CTIME1 (*((volatile unsigned long *) 0xE0024018)) +#define CTIME2 (*((volatile unsigned long *) 0xE002401C)) +#define SEC (*((volatile unsigned char *) 0xE0024020)) +#define MIN (*((volatile unsigned char *) 0xE0024024)) +#define HOUR (*((volatile unsigned char *) 0xE0024028)) +#define DOM (*((volatile unsigned char *) 0xE002402C)) +#define DOW (*((volatile unsigned char *) 0xE0024030)) +#define DOY (*((volatile unsigned short*) 0xE0024034)) +#define MONTH (*((volatile unsigned char *) 0xE0024038)) +#define YEAR (*((volatile unsigned short*) 0xE002403C)) +#define ALSEC (*((volatile unsigned char *) 0xE0024060)) +#define ALMIN (*((volatile unsigned char *) 0xE0024064)) +#define ALHOUR (*((volatile unsigned char *) 0xE0024068)) +#define ALDOM (*((volatile unsigned char *) 0xE002406C)) +#define ALDOW (*((volatile unsigned char *) 0xE0024070)) +#define ALDOY (*((volatile unsigned short*) 0xE0024074)) +#define ALMON (*((volatile unsigned char *) 0xE0024078)) +#define ALYEAR (*((volatile unsigned short*) 0xE002407C)) +#define PREINT (*((volatile unsigned short*) 0xE0024080)) +#define PREFRAC (*((volatile unsigned short*) 0xE0024084)) + +/* A/D Converter */ +#define ADCR (*((volatile unsigned long *) 0xE0034000)) +#define ADDR (*((volatile unsigned long *) 0xE0034004)) +#define ADINTEN (*((volatile unsigned long *) 0xE003400C)) +#define ADSTAT (*((volatile unsigned long *) 0xE0034030)) + +/* Watchdog */ +#define WDMOD (*((volatile unsigned char *) 0xE0000000)) +#define WDTC (*((volatile unsigned long *) 0xE0000004)) +#define WDFEED (*((volatile unsigned char *) 0xE0000008)) +#define WDTV (*((volatile unsigned long *) 0xE000000C)) + +/* Memory Mapping control register */ +#define MEMMAP (*((volatile unsigned long *) 0xE01FC040)) + +/* SSP control register */ +#define SSPCR0 (*((volatile unsigned long *) 0xE005C000)) +#define SSPCR1 (*((volatile unsigned char *) 0xE005C004)) +#define SSPDR (*((volatile unsigned char *) 0xE005C008)) +#define SSPSR (*((volatile unsigned char *) 0xE005C00C)) +#define SSPCPSR (*((volatile unsigned char *) 0xE005C010)) + + +#endif /* __ASM_ARCH_HARDWARE_H */ diff --git a/boop/trunk/lpc2220_rom.ld b/boop/trunk/lpc2220_rom.ld new file mode 100644 index 0000000..f7470bf --- /dev/null +++ b/boop/trunk/lpc2220_rom.ld @@ -0,0 +1,144 @@ +/* + lpc2220.ld - linker script, flash based + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +/* identify the Entry Point */ + +ENTRY(_startup) + +/* specify the LPC2106 memory areas */ + +MEMORY +{ + ram : ORIGIN = 0x40000000, LENGTH = 64K-0x400 /* free RAM area */ + flash : ORIGIN = 0x80000000, LENGTH = 1M /* FLASH ROM */ +} + +/* define a global symbol _stack_end */ + +/* _stack_end = 0x4000F9DC; */ +_stack_end = 0x40010000; + +/* now define the output sections */ + +SECTIONS +{ + . = 0; /* set location counter to address zero */ + + startup : + { + *(.startup) + } >flash /* the startup code goes into FLASH */ + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + + .text : /* collect all sections that should go into FLASH after startup */ + { + *(.text) /* all .text sections (code) */ + *(.rodata) /* all .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* all .glue_7 sections (no idea what these are) */ + *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ + _etext = .; /* define a global symbol _etext just after the last code byte */ + } >flash /* put all the above into FLASH */ + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + + __exidx_start = .; + PROVIDE(__exidx_start = __exidx_start); + + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*); + } > flash AT > flash /* index entries for section unwinding */ + + . = ALIGN(4); + __exidx_end = .; + PROVIDE(__exidx_end = __exidx_end); + + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + + .fastcode : + { + __fastcode_load = LOADADDR(.fastcode); + __fastcode_start = .; + /* functions with __attribute__ ((section (".text.fastcode")))*/ + *(.text.fastcode) + *(.text.ramvectors) + *(.text.do_vic) + *(.text.do_fiq) + *(.text.timerIRQ) + *(.text.soundIRQ) + *(.text.FIQ_Routine) + *(.text.keyScanner) + *(.text.adcIRQ) + *(.text.irIRQ) + *(.text.defIR) + *(.text.NRC17_Encode) + *(.text.ITT_Encode) + *(.text.RC5_Encode) + *(.text.RCA_Encode) + *(.text.RCMM_Encode) + *(.text.REC80_Encode) + *(.text.RECS80_Encode) + *(.text.SIRC_Encode) + *(.text.SPACEENC_Encode) + *(.text.cc1100IRQ) + *(.text._evaluate) + *(.text._push_state) + *(.text._mcpy) + *(.text._do_rcu) + *(.text._do_rcuS) + *(.text._draw_block) + *(.text._draw_hline) + *(.text._draw_vline) + + . = ALIGN (4); + __fastcode_end = .; + } >ram AT>flash + + + .data : /* collect all initialized .data sections that go into RAM */ + { + _data = .; /* create a global symbol marking the start of the .data section */ + *(.data) /* all .data sections */ + _edata = .; /* define a global symbol marking the end of the .data section */ + } >ram AT >flash /* put all the above into RAM (but load the LMA copy into FLASH) */ + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + + .bss : /* collect all uninitialized .bss sections that go into RAM */ + { + _bss_start = .; /* define a global symbol marking the start of the .bss section */ + *(.bss) /* all .bss sections */ + } >ram /* put all the above in RAM (it will be cleared in the startup code */ + + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + _bss_end = . ; /* define a global symbol marking the end of the .bss section */ +} +end = .; /* define a global symbol marking the end of application RAM */ + +PROVIDE( MEMMAP = 0xE01FC040 ); +PROVIDE( BCFG0 = 0xFFE00000 ); +PROVIDE( BCFG1 = 0xFFE00004 ); +PROVIDE( BCFG2 = 0xFFE00008 ); +PROVIDE( PINSEL0 = 0xE002C000 ); +PROVIDE( PINSEL1 = 0xE002C004 ); +PROVIDE( PINSEL2 = 0xE002C014 ); +PROVIDE( IO0PIN = 0xE0028000 ); +PROVIDE( IO0DIR = 0xE0028008 ); +PROVIDE( IO2SET = 0xE0028024 ); +PROVIDE( SCS = 0xE01FC1A0 ); +PROVIDE( FIODIR0 = 0x3FFFC000 ); +PROVIDE( VICVectAddr = 0xFFFFF030 ); diff --git a/boop/trunk/main.c b/boop/trunk/main.c new file mode 100644 index 0000000..5f8fba8 --- /dev/null +++ b/boop/trunk/main.c @@ -0,0 +1,417 @@ +/* + main.c - main program routines + Copyright (C) 2007 Ch. Klippel + + 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 3 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 . +*/ + +//typedef volatile unsigned int *reg32_t; + +#include "lpc2220.h" + + +#include "lcd.h" +#include "irq.h" +#include "keyboard.h" +#include "lcd.h" +#include "fonty.h" +#include "sid.h" +#include "sound.h" +//#include "sounds.h" +//#include "sound3.h" +#include "infrared.h" +#include "codes.h" +#include "encoders.h" +#include "ir_selector.h" +#include "serial.h" +#include "flash.h" +#include "rf.h" +#include "menu.h" +#include "testmenu.h" +#include "mainmenu.h" +#include "timerfuncs.h" +#define __MAIN_C__ +#include "global.h" +#include "adc.h" +#include "backlight.h" +#include "rtc.h" +#include "i2c.h" +#include "bfs.h" +#include "settingsmenu.h" +#include "ir_raw.h" +#include "ir_capture.h" +#include "controls.h" +#include "buffer.h" + +unsigned char sysInfo; + +extern volatile char timeout; + +extern ir_sfn irSend; +extern ir_fn irRepeat; +extern ir_fn irStop; + +const char hval[16] = "0123456789ABCDEF"; + +unsigned int oldkeys[2]; +unsigned int key_state; + +extern unsigned char act_encoder, act_set; + +extern unsigned char bl_val; + + +// betty runs on 10 MHz * 1/4 on reset +// this enables the PLL clock generation and sets the prescaler +void setSpeed(unsigned char sp) +{ + disableIRQ(); + switch(sp) + { + case SPEED_60: // turbo speed (60 mhz) + BCFG0 = 0x100005EF; + PLLCFG = 0x45; // 0100.0101 = PSEL=10=4 MSEL=00101=6 = 240mhz Fcco + PLLFEED = 0xAA; + PLLFEED = 0x55; + + VPBDIV = 0x00; + + BCFG0 = 0x100004A0; + BCFG2 = 0x100004A0; + BCFG1 = 0x00000C21; + sysInfo |= SYS_TURBO; + break; + + case SPEED_30: // normal speed (30 mhz) + default: + BCFG0 = 0x100005EF; + PLLCFG = 0x42; // 0100.0010 = PSEL=10=4 MSEL=00010=3 + PLLFEED = 0xAA; + PLLFEED = 0x55; + + VPBDIV = 0x02; + + BCFG0 = 0x10000420; + BCFG2 = 0x10000420; + BCFG1 = 0x00000400; + sysInfo &= ~SYS_TURBO; + break; + } + enableIRQ(); +} + +/* +// draw "emitting waves" symbol +// used when a button is pressed +void draw_ir (unsigned char x, unsigned char y, unsigned char m) +{ + //~ 0 1: ##### + //~ 1 2: # # + //~ 2 4: ### + //~ 3 8: # # + //~ 4 1: + //~ 5 2: ### + //~ 6 4: ##### + + draw_hline(x+1,y,5,3,m); // 0 + + draw_pixel(x ,y+1,3,m); // 1 + draw_pixel(x+6,y+1,3,m); // 1 + + draw_hline(x+2,y+2,3,3,m); // 2 + + draw_pixel(x+1,y+3,3,m); // 3 + draw_pixel(x+5,y+3,3,m); // 3 + + draw_hline(x+2,y+5,3,3,m); // 5 + + draw_hline(x+1,y+6,5,3,m); // 6 + + draw_symbol(x,y,7,(unsigned char*)symIR,LCD_COLOR_B,m); + +}*/ + + + +// shows current IR set on top of main screen +void drawSet (void) +{ + set_font(SMALLFONT); + draw_block (0, 0, 99, 9, LCD_COLOR_B, DRAW_ERASE); + draw_string (0,0,getSetName (irDevTab.device[irDevTab.active].encoder, irDevTab.device[irDevTab.active].set), LCD_COLOR_B, DRAW_PUT); +} + + +// +void drawMainscreen (void) +{ + //~ set_font(SMALLFONT); // done in drawSet() + + lcd_fill(0); + draw_logo(); + + // top bar + drawSet(); + +/* is updated in main loop + // time +#if FF_LARGE_IDLE_CLOCK + printTime (6,20, (struct time_ *)&rtc.time, 1); +#else + printTime (86,152, (struct time_ *)&rtc.time, 0); + printDate(0,152,(struct date_ *)&rtc.date,0); +#endif +*/ + showBat(0xff); // battery indicator + redraw_symbols(); // +} + + +//unsigned char i; + +/** let the LPC2200 sleep until the next IRQ + * + * This function tries to enter the sleep mode and stays + * there until the next interrupt wakes up the CPU. + * If that is not possible, the function returns immediately. + */ +extern unsigned char sact; +void cpu_idle () +{ + /* fall through if a key was pressed */ + if (ANYKEY) + return; + + //fall through if UART0 Scratch pad register is not empty + //OpenOCD can set this register with "mwb 0xE000C01C 0x01" to disable idle and power down mode + if(U0SCR) + return; + + /* only idle mode instead of power down when: + * * backlight on + * * IR transmission + * * RF is activated + * * sound is playing + * * I2C access + * * SYS_NOPDOWN in sysInfo is set + */ + if (bl_val != 0 || key_state != KEY_IDLE || + (RF.state > RFidle) || + (SID.flags & SIDenable) || sact || i2ccurrentjob || (sysInfo & SYS_NOPDOWN)) + { + if(sysInfo & SYS_NOIDLE) + return; + /* WARNING: no code reuse here: + * PCON = causes timing problems */ + EXTINT = 0x08; + PCON = PCON_IDLE; + PLLFEED = 0xAA; + PLLFEED = 0x55; + } + else + { + refresh_symbols(0xff); + EXTINT = 0x08; + sysInfo |= SYS_NOIDLE; + PCON = PCON_PDOWN; + PLLFEED = 0xAA; + PLLFEED = 0x55; + } +} // cpu_idle + +int main(void) +{ + sysInfo = SYS_NOIDLE; + + SCS |= 0x01; + FIODIR0 |= ((1<<21) | (1<<11) | (1<<6) | (1<<23) | (1<<19) | (1<<17)); + FIODIR0 |= (1<<12); + FIOSET0 |= (1<<12); + FIOCLR0 |= (1<<4); + + setSpeed(SPEED_30); + + lcd_init(0); + serial_init(); + + startTimerIRQ(); + startADC(); + + initKeys(); + + initSound(); + startSoundIRQ(); + + initIR(); + startIrIRQ(); + + RF_init(); + load_RF_setting(); + startRFIRQ(); + RF_changestate(RFwor); + + initI2C(); + initRTC(); + startRtcIRQ(); + + enableIRQ(); + + //testmenu_init(); + init_menu(); + + initBacklight(); + + oldkeys[0] = keys[0]; + oldkeys[1] = keys[0]; + + key_state = KEY_IDLE; + + set_font(BOLDFONT); + + BFS_Mount(); // flash file system + load_RC_setting(); // learned remote codes + load_setting(); // display settings + + + // recorded raw IR commands + { + struct RAWset_ RAWset; + unsigned char x; + unsigned long RAWcmdbase; + + RAWcmdbase = FLASH1_BASE +(secaddr[0]<<1); // data address + x=memcmp((void*)RAWcmdbase,"RC01",4); // check ID + + if(!x) // + { + memcpy(&RAWset,(void *)RAWcmdbase,sizeof(struct RAWset_)); + RAWset.name[7] = 0; + BFS_SaveFile(BFS_ID_RAWslot0, sizeof(struct RAWset_), (unsigned char*) &RAWset); + eraseSector(1,0); + } + } + + setEncoder(irDevTab.device[irDevTab.active].encoder, irDevTab.device[irDevTab.active].set); + + drawMainscreen(); + ask_for_time(0); + +/* + playSound((unsigned char*)sound1_data, sound1_len); + waitSound(); + playSound((unsigned char*)sound2_data, sound2_len); +*/ + + // main loop + while (1) + { + // detect keyboard action (keyboard matrix scanned by interrupt) + if(keys[0] != oldkeys[0] || keys[1] != oldkeys[1]) + { + oldkeys[0] = keys[0]; + oldkeys[1] = keys[1]; + sysInfo |= SYS_KEY; + } + + // determine keyboard actions on main screen + switch(key_state) + { + case KEY_IDLE: + if(sysInfo & SYS_KEY) + { + sysInfo &= ~SYS_KEY; + if(KEY_Betty) + { + setBacklight(BL_AUTO); // activate backlight + menu_exec(&mainMenu); // select menu + setEncoder(irDevTab.device[irDevTab.active].encoder, irDevTab.device[irDevTab.active].set); + drawMainscreen(); // draw new menu + while(KEY_Exit); // block until + } + //~ else if(KEY_2) + //~ { + //setSpeed(SPEED_30); + //~ } + //~ else if(KEY_3) + //~ { + //setSpeed(SPEED_60); + //~ } + else if(KEY_A || KEY_B || KEY_C || KEY_D) + { + // select encoder + unsigned char x; + //playSound((unsigned char*)sound3_data, sound3_len); + x=0; + if (KEY_B) x=1; + if (KEY_C) x=2; + if (KEY_D) x=3; + + if (setEncoder(irDevTab.device[x].encoder, irDevTab.device[x].set)) { + setBacklight(BL_AUTO); + irDevTab.active = x; + //~ drawMainscreen(); + drawSet(); + } + } + + // (last-minute detection of regular key?) + if((keys[0] != 0) || (keys[1] != 0)) + key_state = KEY_PRESS; + } + break; + + case KEY_PRESS: + irSend(getCode()); + key_state = KEY_HOLD; + if(!(T1TCR & 0x02)) + draw_symbol(90,0,7,(unsigned char*)symIR,LCD_COLOR_B,DRAW_PUT); +// autorepeat = 0; + break; + + case KEY_HOLD: +// if(autorepeat >= AUTO_TIMEOUT) + irRepeat(); + //draw_ir(90, 0, DRAW_XOR); + if(keys[0] == 0 && keys[1] == 0) + key_state = KEY_RELEASE; + + break; + + case KEY_RELEASE: + if(!(T1TCR & 0x02)) + draw_symbol(90,0,7,(unsigned char*)symIR,LCD_COLOR_B,DRAW_ERASE); + irStop(); + key_state = KEY_IDLE; + break; + } + + cpu_idle(); // let the LPC2200 sleep until the next IRQ + + // display time + if (timeInfo & TIMECHANGED) + { +#if FF_LARGE_IDLE_CLOCK + // time large, no date + printTime( 6, 20, (struct time_ *)&rtc.time, 1); +#else + // time and date small + printTime( 86, 152, (struct time_ *)&rtc.time, 0); + printDate( 0, 152, (struct date_ *)&rtc.date, 0); +#endif + timeInfo &= ~TIMECHANGED; // clear update flag + } + + } // while (1) + return 0; // never returns +} // main diff --git a/boop/trunk/rtc/Make.conf b/boop/trunk/rtc/Make.conf new file mode 100644 index 0000000..8293f8f --- /dev/null +++ b/boop/trunk/rtc/Make.conf @@ -0,0 +1 @@ +THUMBSRCS := rtc.c i2c.c rtctimer.c diff --git a/boop/trunk/rtc/i2c.c b/boop/trunk/rtc/i2c.c new file mode 100644 index 0000000..3aa1edd --- /dev/null +++ b/boop/trunk/rtc/i2c.c @@ -0,0 +1,131 @@ +/* + i2c.c - + Copyright (C) 2008 + + 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 3 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 "lpc2220.h" +#include "i2c.h" +#include "irq.h" +#include "rtc.h" +#include "global.h" + +volatile struct i2cjob_* volatile i2ccurrentjob; + +unsigned char i2c_jobexec(struct i2cjob_* job) { + + VICVectCntl3 &= ~VIC_SLOT_EN; + while(i2ccurrentjob); + i2ccurrentjob = job; + I2CONSET = STA; + while(i2ccurrentjob); + VICVectCntl3 |= VIC_SLOT_EN; + return 1; +} + +void i2cIRQ(void) { + unsigned char state; + + state = I2STAT; + i2ccurrentjob->buffer; + + switch(state) { + case 0x08: //A START condition has been transmitted + I2DAT = RTCslaveaddr | I2C_write; + I2CONSET = AA; + I2CONCLR = SI | STA; + i2ccurrentjob->pos = 0; + break; + case 0x18: //SLA+W has been transmitted; ACK has been received. + I2DAT = i2ccurrentjob->byteaddr; + I2CONSET = AA; + I2CONCLR = SI; + break; + case 0x28: //Data byte in I2DAT has been transmitted; ACK has been received. + switch(i2ccurrentjob->action) { + case I2C_read: + I2CONSET = STA; + I2CONCLR = AA | SI; + break; + case I2C_write: + if(i2ccurrentjob->len > i2ccurrentjob->pos) { + I2DAT = i2ccurrentjob->buffer[i2ccurrentjob->pos++]; + I2CONSET = AA; + I2CONCLR = SI; + } + else + i2ccurrentjob->action = I2C_done; + break; + default: + i2ccurrentjob->action = I2C_error; + } + break; + case 0x10: //A repeated START condition has been transmitted + I2DAT = RTCslaveaddr | I2C_read; + I2CONSET = AA; + I2CONCLR = SI | STA; + break; + case 0x40: //SLA+R has been transmitted; ACK has been received. + I2CONSET = AA; + I2CONCLR = SI; + break; + case 0x50: //Data byte has been received; ACK has been returned. + i2ccurrentjob->buffer[i2ccurrentjob->pos++] = I2DAT; + if(i2ccurrentjob->len > i2ccurrentjob->pos+1) + I2CONSET = AA; + else + I2CONCLR = AA; + I2CONCLR = SI; + break; + case 0x58: //Data byte has been received; NOT ACK has been returned. + i2ccurrentjob->buffer[i2ccurrentjob->pos] = I2DAT; + i2ccurrentjob->action = I2C_done; + break; + case 0x20: //SLA+W has been transmitted; NOT ACK has been received. + case 0x30: //Data byte in I2DAT has been transmitted; NOT ACK has been received. + if(i2ccurrentjob->pos) + i2ccurrentjob->pos--; + default: + i2ccurrentjob->action = I2C_error; + break; + } + + if((i2ccurrentjob->action == I2C_done) || (i2ccurrentjob->action == I2C_error)) { + I2CONSET = STO; + I2CONCLR = SI; + if(i2ccurrentjob->onfinish) { + struct i2cjob_* job; + job = (struct i2cjob_*)i2ccurrentjob; + i2ccurrentjob = 0; + job->onfinish(job); + } + else + i2ccurrentjob = 0; + } +} + +void initI2C(void) { + PINSEL0 |= (1<<4) | (1<<6); + I2SCLL = 19; + I2SCLH = 19; + + I2CONSET = I2EN; + i2ccurrentjob = 0; + + VICVectAddr4 = (unsigned long)&(i2cIRQ); + VICVectCntl4 = VIC_SLOT_EN | INT_SRC_I2C; + VICIntEnable = INT_I2C; +} + diff --git a/boop/trunk/rtc/i2c.h b/boop/trunk/rtc/i2c.h new file mode 100644 index 0000000..82f6932 --- /dev/null +++ b/boop/trunk/rtc/i2c.h @@ -0,0 +1,51 @@ +/* + i2c.h - + Copyright (C) 2008 + + 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 3 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 I2C_H +#define I2C_H + +#define AA 0x04 +#define SI 0x08 +#define STO 0x10 +#define STA 0x20 +#define I2EN 0x40 + +extern struct i2cjob_ dummyjob; + +typedef void(*i2c_fn)(struct i2cjob_*); + +struct i2cjob_ { + unsigned char* buffer; + i2c_fn onfinish; + unsigned char len; + unsigned char pos; + unsigned char byteaddr; + unsigned char action; +}; + +#define I2C_write 0 +#define I2C_read 1 +#define I2C_done 2 +#define I2C_error 3 + +volatile struct i2cjob_* volatile i2ccurrentjob; + +unsigned char i2c_jobexec(struct i2cjob_* job); +void initI2C(void); + +#endif diff --git a/boop/trunk/rtc/rtc.c b/boop/trunk/rtc/rtc.c new file mode 100644 index 0000000..d176f96 --- /dev/null +++ b/boop/trunk/rtc/rtc.c @@ -0,0 +1,432 @@ +/* + rtc.c + + real-time clock PCF8563 by NXP Semiconductors + I2C Bus + Interrupt + + display date / time + set date / time + date calculations + settings menu + + Copyright (C) 2008 + + 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 3 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 "lpc2220.h" +#include "rtc.h" +#include "i2c.h" +#include "lcd.h" +#include "fonty.h" +#include "drawDigit.h" +#include "irq.h" +#include "adc.h" +#include "keyboard.h" +#include "rf.h" +#include "global.h" +#include "rtc.h" +#include "controls.h" +#include "timerfuncs.h" + +const unsigned long default_time[1] = {0x00000000}; +const unsigned char default_date[4] = {0x01, 0x02, 0x01, 0x08}; +const unsigned char months[36] = "JANFEBMRZAPRMAIJUNJULAUGSEPOKTNOVDEZ"; +const unsigned char days[14] = "SOMODIMIDOFRSA"; + +void initRTC (void) +{ + struct i2cjob_ job; + unsigned char buffer[4]; + + job.buffer = buffer; + job.onfinish = 0; + + //init rtc + job.len = 2; + job.byteaddr = RTCREG_CONTROL_STATUS_1; + job.buffer[0] = 0x08; + job.buffer[1] = 0x01; + do { + job.action = I2C_write; + i2c_jobexec(&job); + } while(!(job.action == I2C_done)); + + //init rtc alarm + job.len = 4; + job.byteaddr = RTCREG_MINUTE_ALARM;; + job.buffer[0] = (1<<7); + job.buffer[1] = (1<<7); + job.buffer[2] = (1<<7); + job.buffer[3] = (1<<7); + job.action = I2C_write; + i2c_jobexec(&job); + + //init rtc timer + job.len = 2; + job.byteaddr = RTCREG_TIMER_CONTROL; + job.buffer[0] = 0x82; + job.buffer[1] = 0x01; + job.action = I2C_write; + i2c_jobexec(&job); + + timeInfo =0; + + setTimeDate((struct time_*) default_time,(struct date_*) default_date); +} + +unsigned char getTimeDate (struct time_* t, struct date_ *d) +{ + struct i2cjob_ job; + unsigned char buffer[7]; + + job.buffer = buffer; + job.onfinish = 0; + job.len = 7; + job.byteaddr = RTCREG_SECOND; + job.action = I2C_read; + i2c_jobexec(&job); + + t->second = buffer[0] & 0x7F; + t->minute = buffer[1] & 0x7F; + t->hour = buffer[2] & 0x3F; + d->day = buffer[3] & 0x3F; + d->weekday = buffer[4] & 0x07; + d->month = buffer[5] & 0x1F; + d->year = buffer[6]; + + return buffer[0] & 0x80; /// \return VL - clock integrity. 0 is good. +} + +void setTimeDate (struct time_ *t, struct date_ *d) +{ + struct i2cjob_ job; + unsigned char buffer[7]; + + job.buffer = buffer; + job.onfinish = 0; + memcpy(job.buffer,(unsigned char *)t,3); + memcpy(job.buffer+3,(unsigned char *)d,4); + job.len = 7; + job.byteaddr = RTCREG_SECOND; + job.action = I2C_write; + i2c_jobexec(&job); + +} + +void printTime (unsigned char x, unsigned char y, struct time_* t, unsigned char format) +{ + if (format) + { + // 00:00 + unsigned char w = 25; + unsigned char h = 45; + + drawDigit (x+0, y, w, h, (t->hour >> 4) & 0x0F, 5, LCD_COLOR_B, DRAW_PUT); + drawDigit (x+w+2, y, w, h, t->hour & 0x0F, 5, LCD_COLOR_B, DRAW_PUT); + drawDigit (x+2*w +15, y, w, h, (t->minute >> 4) & 0x0F, 5, LCD_COLOR_B, DRAW_PUT); + drawDigit (x+3*w+2+15, y, w, h, t->minute & 0x0F, 5, LCD_COLOR_B, DRAW_PUT); + + draw_char (x+2*w+10, y+h/2, ':', LCD_COLOR_B, DRAW_PUT); + } + else + { + unsigned char f = activefont; + + set_font (SMALLFONT); + draw_block (x,y,42,7,LCD_COLOR_B,DRAW_ERASE); + draw_hexC (x+30,y,t->second, LCD_COLOR_B, DRAW_PUT); + draw_hexC (x+15,y,t->minute, LCD_COLOR_B, DRAW_PUT); + draw_hexC (x+0,y,t->hour, LCD_COLOR_B, DRAW_PUT); + draw_char (x+12,y,':', LCD_COLOR_B, DRAW_PUT); + draw_char (x+27,y,':', LCD_COLOR_B, DRAW_PUT); + set_font (f); + } +} + + +void printDate (unsigned char x, unsigned char y, struct date_* d, unsigned char format) +{ + unsigned char f; + char s[16]; + + f=activefont; + set_font(SMALLFONT); + + switch(format) { + case 1: + draw_block (x,y,80,7,LCD_COLOR_B,DRAW_ERASE); + s[ 0] = days[d->weekday * 2]; + s[ 1] = days[(d->weekday * 2) + 1]; + s[ 2] = ','; + s[ 3] = ' '; + s[ 4] = ((d->day & 0xf0)>>4) + 0x30; + s[ 5] = ((d->day & 0x0f)) + 0x30; + s[ 6] = '.'; + s[ 7] = ' '; + s[ 8] = months[(d->month - 1) * 3]; + s[ 9] = months[((d->month - 1) * 3)+1]; + s[10] = months[((d->month - 1) * 3)+2]; + s[11] = ' '; + s[12] = '2'; + s[13] = '0'; + s[14] = ((d->year & 0xf0)>>4) + 0x30; + s[15] = ((d->year & 0x0f)) + 0x30; + s[16] = 0; + draw_string (x, y, s, LCD_COLOR_B, DRAW_PUT); + break; + default: + draw_block(x,y,57,7,3,DRAW_ERASE); + draw_char (x+0,y,days[d->weekday * 2], LCD_COLOR_B, DRAW_PUT); + draw_char (x+6,y,days[ (d->weekday * 2) + 1], LCD_COLOR_B, DRAW_PUT); + draw_hexC (x+15,y,d->day, LCD_COLOR_B, DRAW_PUT); + draw_char (x+27,y,'.', LCD_COLOR_B, DRAW_PUT); + draw_hexC (x+30,y,d->month, LCD_COLOR_B, DRAW_PUT); + draw_char (x+42,y,'.', LCD_COLOR_B, DRAW_PUT); + draw_hexC (x+45,y,d->year, LCD_COLOR_B, DRAW_PUT); + } + + set_font(f); +} + +void rtcIRQreenable (struct i2cjob_* job) +{ + EXTINT |= (1<<2); + VICIntEnable = INT_EINT2; +} + +void rtcAckIRQ (struct i2cjob_* job) +{ + if (timeInfo & SETNEWTIME) { + rtcbuffer[1] = rtc.time.second; + rtcbuffer[2] = rtc.time.minute; + rtcbuffer[3] = rtc.time.hour; + rtcbuffer[4] = rtc.date.day; + rtcbuffer[5] = rtc.date.weekday; + rtcbuffer[6] = rtc.date.month; + rtcbuffer[7] = rtc.date.year; + i2cintjob.len = 8; + timeInfo &= ~SETNEWTIME; + timeInfo |= TIME_ACCURATE; // doesn't mean it's accurate, just that it was set + } + else { + rtc.time.second = job->buffer[1] & 0x7F; + rtc.time.minute = job->buffer[2] & 0x7F; + rtc.time.hour = job->buffer[3] & 0x3F; + rtc.date.day = job->buffer[4] & 0x3F; + rtc.date.weekday = job->buffer[5] & 0x07; + rtc.date.month = job->buffer[6] & 0x1F; + rtc.date.year = job->buffer[7]; + i2cintjob.len = 1; + } + + if(job->buffer[0] & ALARM_FLAG) + timeInfo |= ALARM_PENDING; + + timeInfo |= TIMECHANGED; + T0overflow = 0; + + i2cintjob.byteaddr = RTCREG_CONTROL_STATUS_2; + i2cintjob.buffer = rtcbuffer; + i2cintjob.buffer[0] = 0x01 | (timeInfo & ALARM_ENABLED); + i2cintjob.onfinish = rtcIRQreenable; + i2cintjob.action = I2C_write; + i2ccurrentjob = &i2cintjob; + I2CONSET = STA; + +} + +void rtcIRQ (void) +{ + EXTINT = (1<<2); + + i2cintjob.buffer = rtcbuffer; + i2cintjob.onfinish = rtcAckIRQ; + i2cintjob.len = 8; + i2cintjob.byteaddr = RTCREG_CONTROL_STATUS_2; + i2cintjob.action = I2C_read; + i2ccurrentjob = &i2cintjob; + I2CONSET = STA; + + if (!(PLLSTAT & (1<<8))) { + if ((rtc.time.second & 0x0f) == 9) + calcBat(0xff); + if ((rtc.time.second & 0x0f) == 0) + showBat(0xff); + } + + VICSoftIntClr = INT_EINT2; + VICIntEnClr = INT_EINT2; +} + +void startRtcIRQ (void) +{ + PINSEL0 |= (1<<31); + EXTWAKE |= (1<<2); + EXTINT |= (1<<2); + + VICVectAddr3 = (unsigned long)&(rtcIRQ); + VICVectCntl3 = VIC_SLOT_EN | INT_SRC_EINT2; + VICIntEnable = INT_EINT2; +} + +void calcBCD (unsigned char* value, char a, char max, char min) +{ + signed char x; + unsigned char y; + + x = (((*value & 0xf0)>>4) * 10 + (*value & 0x0f)) + a; + if (x > max) + x -= (1 + max - min); + if (x < min) + x += (1 + max - min); + y = x % 10; + y |= ((x-y) / 10)<<4; + *value = y; +} + +unsigned char checkBCD (unsigned char value, char max, char min) +{ + signed char x; + unsigned char y; + + x = (((value & 0xf0)>>4) * 10 + (value & 0x0f)); + if (x > max) + x = max; + if (x < min) + x = min; + y = x % 10; + y |= ((x-y) / 10)<<4; + return(y); +} + +void send_time (unsigned char dest, unsigned char wor) +{ + struct RFendpoint_* cur_ep; + + cur_ep = openEP((unsigned char*)&rtc,0, packet_time); + if (cur_ep) + { + cur_ep->dest = dest; + cur_ep->bufferlen = 7; + + cur_ep->flags |= EPenabled | EPoutput | EPnewdata | EPonce; + if(wor) + cur_ep->flags |= EPsendwor; + RF_changestate(RFtx); + } +} + +void ask_for_time (unsigned char dest) +{ + struct RFendpoint_* cur_ep; + + cur_ep = openEP(0,0, packet_time); + if(cur_ep) + { + cur_ep->dest = dest; + cur_ep->data[0] = 0xFF; + cur_ep->bufferlen = 1; + + cur_ep->flags |= EPenabled | EPoutput | EPnewdata | EPonce | EPsendwor; + + RF_changestate(RFtx); + RF_timed_rx(400); + } +} + +void settime_click (FORM* form, CONTROL* control) +{ + VICIntEnClr = INT_EINT2; + rtc.date = ((DATEBOX*)(form->controls[0]))->date; + rtc.time = ((TIMEBOX*)(form->controls[1]))->time; + send_time(0,1); + setTimeDate((struct time_ *)&rtc.time, (struct date_ *)&rtc.date); + timeInfo |= TIME_ACCURATE; + VICIntEnable = INT_EINT2; + + form->flags |= BC_Form_exit; +} + + +// Settings > Clock menu +// +void change_clock (void) +{ + const LABEL label1 = {BC_Labelnotab,0,15,100,10,BOLDFONT,0,"Datum",0}; + DATEBOX datebox1 = {BC_Datebox,0,25,58,9,SMALLFONT,0,{0x00,0x00,0x00,0x00},NULL,NULL}; + const LABEL label2 = {BC_Labelnotab,0,37,100,10,BOLDFONT,0,"Uhrzeit",0}; + TIMEBOX timebox1 = {BC_Timebox,0,47,43,9,SMALLFONT,0,{0x00,0x00,0x00,0x00},NULL,NULL}; + const BUTTON button1 = {BC_Button,0,63,50,15,SMALLFONT,0,"Speichern",settime_click}; + + timebox1.time = rtc.time; + datebox1.date = rtc.date; + + CONTROL* controls[5] = { (CONTROL*)&datebox1, + (CONTROL*)&timebox1, + (CONTROL*)&label1, + (CONTROL*)&label2, + (CONTROL*)&button1}; + + FORM form = {"Datum & Uhrzeit"," ",0,0,0,0,controls,0,5,0,0}; + + form_exec(&form); +} + +/* Globale zur Verfügung stehenden Variablen: +//Variablen für die Zeit: +u08 dayofweek = 1, day = 1, month = 1; +u16 year = 2004; +u08 isschaltjahr; +*/ + +unsigned char isschaltjahr(unsigned int year) { + + if ( (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0) ) + return 1; + else + return 0; +} + +void calcweekday(struct date_* d) { + + unsigned int tagdesjahres; + unsigned int jahrdiff; + unsigned int tempwochentag; + unsigned char day; + unsigned char month; + unsigned char year; + + day = (d->day >> 4)*10 + (d->day & 0x0f); + month = (d->month >> 4)*10 + (d->month & 0x0f); + year = 2000+(d->year >> 4)*10 + (d->year & 0x0f); + + tagdesjahres = 31*(month-1); + if (month > 2) tagdesjahres = tagdesjahres -3 +isschaltjahr(year); + if (month > 4) tagdesjahres--; + if (month > 6) tagdesjahres--; + if (month > 9) tagdesjahres--; + if (month > 11) tagdesjahres--; + tagdesjahres += day; + + jahrdiff = year -2000; + tempwochentag = jahrdiff + (jahrdiff-1) / 4 - (jahrdiff-1) / 100 + (jahrdiff-1) / 400 + tagdesjahres; + if (jahrdiff > 0) + tempwochentag++; + tempwochentag = (tempwochentag % 7)+3; + if (tempwochentag > 6) + tempwochentag -= 7; + d->weekday = tempwochentag; +} diff --git a/boop/trunk/rtc/rtc.h b/boop/trunk/rtc/rtc.h new file mode 100644 index 0000000..81a520e --- /dev/null +++ b/boop/trunk/rtc/rtc.h @@ -0,0 +1,106 @@ +/* + rtc.h - + Copyright (C) 2008 + + 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 3 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 RTC_H +#define RTC_H + +#include "i2c.h" + +#define RTCslaveaddr 0xA2 + +//PCF8563 registers +#define RTCREG_CONTROL_STATUS_1 0x00 +#define RTCREG_CONTROL_STATUS_2 0x01 +#define RTCREG_SECOND 0x02 +#define RTCREG_MINUTES 0x03 +#define RTCREG_HOURS 0x04 +#define RTCREG_DAYS 0x05 +#define RTCREG_WEEKDAYS 0x06 +#define RTCREG_MONTHS_CENTURY 0x07 +#define RTCREG_YEARS 0x08 +#define RTCREG_MINUTE_ALARM 0x09 +#define RTCREG_HOUR_ALARM 0x0A +#define RTCREG_DAY_ALARM 0x0B +#define RTCREG_WEEKDAY_ALARM 0x0C +#define RTCREG_CLKOUT_CONTROL 0x0D +#define RTCREG_TIMER_CONTROL 0x0E +#define RTCREG_TIMER 0x0F + +//RTCREG_CONTROL_STATUS_2 +#define TIMER_INT_EN (1<<0) +#define ALARM_INT_EN (1<<1) +#define TIMER_FLAG (1<<2) +#define ALARM_FLAG (1<<3) + +struct time_ +{ + unsigned char second; + unsigned char minute; + unsigned char hour; + unsigned char tag; +}; + +struct date_ +{ + unsigned char day; + unsigned char weekday; + unsigned char month; + unsigned char year; +}; + +struct rtc_ +{ + struct date_ date; + struct time_ time; +}; + +volatile struct rtc_ rtc; + +volatile unsigned char timeInfo; +#define TIMECHANGED (1<<0) +#define ALARM_ENABLED (1<<1) +#define SETNEWTIME (1<<2) +#define TIME_ACCURATE (1<<3) +#define ALARM_PENDING (1<<3) + + +struct i2cjob_ i2cintjob; +unsigned char rtcbuffer[8]; + +const unsigned char days[14]; + +void initRTC(void); +unsigned char getTimeDate(struct time_* t, struct date_ *d); +void setTimeDate(struct time_* t, struct date_ *d); +void printTime (unsigned char x, unsigned char y, struct time_* t, unsigned char format); +void printDate(unsigned char x, unsigned char y, struct date_* d, unsigned char format); +void rtcIRQ (void); +void startRtcIRQ(void); +void change_clock(void); +void calcweekday(struct date_* d); + +/// Send the time via RF packet @see RF_PACKET_TIME to dest +void send_time(unsigned char dest, unsigned char wor); + +/// Request to receive time via RF packet @see RF_PACKET_TIME from dest +void ask_for_time(unsigned char dest); + +void calcBCD(unsigned char* value, char a, char max, char min); +unsigned char checkBCD(unsigned char value, char max, char min); + +#endif diff --git a/boop/trunk/rtc/rtctimer.c b/boop/trunk/rtc/rtctimer.c new file mode 100644 index 0000000..1944f90 --- /dev/null +++ b/boop/trunk/rtc/rtctimer.c @@ -0,0 +1,103 @@ +/* + rtctimer.c - real-time clock timer + Copyright (C) 2010 + + 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 3 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 "lpc2220.h" +#include "rtc.h" +#include "lcd.h" +#include "fonty.h" +#include "keyboard.h" +#include "global.h" +#include "controls.h" +#include "sid.h" + +void initRTCtimer (void) { + +} + + +void RTCtimer_timer (FORM* form) +{ + ((TIMEBOX*)(form->controls[0]))->time = rtc.time; + control_draw(form->controls[0],0); //redraw timebox1 + if(timeInfo & ALARM_PENDING) { + form->tag=9; + timeInfo &= ~ALARM_PENDING; + } + if(form->tag) { + if(form->tag & 0x01) beep(1); + form->tag--; + } +} + +void RTCsave_click(FORM* form, CONTROL* control) { + struct i2cjob_ job; + unsigned char buffer[4]; + + buffer[0] = ((TIMEBOX*)(form->controls[8]))->time.minute; + buffer[1] = ((TIMEBOX*)(form->controls[8]))->time.hour | (1<<7); + buffer[2] = (1<<7); + buffer[3] = (1<<7); + + job.buffer = buffer; + job.onfinish = 0; + job.len = 4; + job.byteaddr = RTCREG_MINUTE_ALARM; + job.action = I2C_write; + i2c_jobexec(&job); + + timeInfo |= ALARM_ENABLED; +} + +void RTCtimer_edit(void) { + + const char* listbox1items[] = {"Alarm","Tastendruck","Makro","Funktion"}; + const char* listbox2items[] = {"Stunde","Tag","Monat"}; + + TIMEBOX timebox1 = {BC_Timebox | BC_NoTabStop,85,151,43,8,SMALLFONT,0,{0x00,0x00,0x00,0x00},NULL,NULL}; + timebox1.time = rtc.time; + + const LABEL label1 = {BC_Labelnotab,0,20,70,9,BOLDFONT,0,"Timer",0}; + const LABEL label2 = {BC_Labelnotab,0,32,70,9,BOLDFONT,0,"Typ",0}; + const LABEL label3 = {BC_Labelnotab,0,44,70,9,BOLDFONT,0,"Wiederholung",0}; + const LABEL label4 = {BC_Labelnotab,0,56,70,9,BOLDFONT,0,"Alarmzeit",0}; + + NUMBOX numbox1 = {BC_Numbox,76,20,20,9,SMALLFONT,1,1,1,NULL,NULL}; + LISTBOX listbox1 = {BC_Listbox,76,32,50,10,SMALLFONT,0,1,(char**)listbox1items,NULL,NULL}; + LISTBOX listbox2 = {BC_Listbox,76,44,50,10,SMALLFONT,0,1,(char**)listbox2items,NULL,NULL}; + TIMEBOX timebox2 = {BC_Timebox,76,56,43,8,SMALLFONT,0,{0x00,0x00,0x00,0x00},NULL,NULL}; + + const BUTTON button1 = {BC_Button,0,80,60,15,SMALLFONT,0,"Speichern",RTCsave_click}; + + CONTROL* controls[] = { (CONTROL*)&timebox1, + (CONTROL*)&label1, + (CONTROL*)&label2, + (CONTROL*)&label3, + (CONTROL*)&label4, + (CONTROL*)&numbox1, + (CONTROL*)&listbox1, + (CONTROL*)&listbox2, + (CONTROL*)&timebox2, + (CONTROL*)&button1}; + + timebox2.time = rtc.time; + + FORM form = {"Timer bearbeiten","",NULL,NULL,RTCtimer_timer,0,controls,0,NUM_OF_ELEMENTS(controls),0,200}; + form_exec(&form); + + timeInfo &= ~ALARM_ENABLED; +} diff --git a/boop/trunk/rtc/rtctimer.h b/boop/trunk/rtc/rtctimer.h new file mode 100644 index 0000000..6bc0018 --- /dev/null +++ b/boop/trunk/rtc/rtctimer.h @@ -0,0 +1,42 @@ +/* + rtctimer.h - real-time clock timer + Copyright (C) 2010 + + 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 3 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 RTCTIMER_H +#define RTCTIMER_H + +struct RTCtimer_ { + unsigned char flags; + unsigned char minute; + unsigned char hour; + unsigned char day; + unsigned char month; + unsigned char repeat; //!< repeat alarm: Bit0=So...Bit6=Sa + unsigned char arg[4]; //!< argument for timer execution +}; +#endif + +//RTCtimer_ flags +#define RTCTIMER_TYPEMASK 0x07 +#define RTCTIMER_ALARM 0x00 +#define RTCTIMER_KEY 0x01 +#define RTCTIMER_MACRO 0x02 +#define RTCTIMER_FUNCTION 0x03 +#define RTCTIMER_OBSOLETE (1<<6) +#define RTCTIMER_SLOTFREE (1<<7) + +void RTCtimer_edit(void); diff --git a/boop/trunk/serial/Make.conf b/boop/trunk/serial/Make.conf new file mode 100644 index 0000000..e36a9e2 --- /dev/null +++ b/boop/trunk/serial/Make.conf @@ -0,0 +1,2 @@ +THUMBSRCS := serial.c redirector.c +SRCS := serirq.c diff --git a/boop/trunk/serial/redirector.c b/boop/trunk/serial/redirector.c new file mode 100644 index 0000000..df263bd --- /dev/null +++ b/boop/trunk/serial/redirector.c @@ -0,0 +1,306 @@ +/* + redirector.h - serial port redirector + Copyright (C) 2009 Telekatz + + 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 3 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 "lpc2220.h" +#include "redirector.h" +#include "serial.h" +#include "buffer.h" +#include "global.h" +#include "controls.h" +#include "fonty.h" +#include "rf.h" +#include "timerfuncs.h" + +#define redirectorbuffersize 200 + +extern unsigned int is_drawing; + +struct redirector_ { + struct cBuffer_ incbuffer; + struct cBuffer_ outcbuffer; + struct RFendpoint_* dataout_ep; + struct RFendpoint_* datain_ep; + struct RFendpoint_* cmdout_ep; + struct RFendpoint_* cmdin_ep; + unsigned long lastlen; + unsigned char timeoutcnt; + unsigned char inbuffer[redirectorbuffersize]; + unsigned char outbuffer[redirectorbuffersize]; + unsigned char status; +}; + +const unsigned int listbrg[8] = { 1200,2400,4800,9600,14400,19200,28800,38400}; + +void redirector_start(FORM* form, struct redirector_* redirectorvars) { + + redirectorvars->dataout_ep->dest = ((NUMBOX*)(form->controls[3]))->value; + redirectorvars->lastlen = 0; + redirectorvars->timeoutcnt = 0; + + cBufferFlush(&redirectorvars->incbuffer); + cBufferFlush(&redirectorvars->outcbuffer); + uart0_incbuffer = &redirectorvars->incbuffer; + uart0_outcbuffer = &redirectorvars->outcbuffer; + + redirectorvars->dataout_ep->flags |= EPenabled; + redirectorvars->datain_ep->flags |= EPenabled; + + U0FCR |= (1<<7); // trigger level 1 + serial_setbrg (listbrg[((LISTBOX*)(form->controls[2]))->listindex]); + sysInfo |= SYS_NOPDOWN; + + form->controls[2]->type |= BC_NoTabStop; + form->controls[3]->type |= BC_NoTabStop; + form->controls[5]->type |= BC_Disabled; + form->controls[6]->type &= ~BC_Disabled; + form->sel = 6; + form->flags |= BC_Form_redraw; + +} + +void redirector_start_click(FORM* form, CONTROL* control) { + + volatile unsigned long timeout; + + struct redirector_* redirectorvars; + redirectorvars = (struct redirector_*)form->tag; + + RF_changestate(RFrx); + + redirectorvars->cmdout_ep->dest = ((NUMBOX*)(form->controls[3]))->value; + redirectorvars->cmdout_ep->data[0] = redir_SET; + redirectorvars->cmdout_ep->data[1] = ((LISTBOX*)(form->controls[2]))->listindex; + redirectorvars->cmdout_ep->bufferlen = 2; + redirectorvars->cmdout_ep->flags |= EPnewdata | EPsendwor; + redirectorvars->cmdin_ep->flags &= ~EPnewdata; + + RF_changestate(RFtx); + + addTimeout(&timeout, 200); + while(timeout && !(redirectorvars->cmdin_ep->flags & EPnewdata)); + removeTimeout(&timeout); + + if(!timeout) { + msgbox(30,BC_OKOnly | BC_DefaultButton1,"Fehler:\nZiel antwortet nicht"); + form_draw(form); + RF_changestate(RFwor); + return; + } + + redirectorvars->cmdout_ep->data[0] = redir_START; + redirectorvars->cmdout_ep->bufferlen = 1; + redirectorvars->cmdout_ep->flags |= EPnewdata; + redirectorvars->cmdin_ep->flags &= ~EPnewdata; + + RF_changestate(RFtx); + + addTimeout(&timeout, 200); + while(timeout && !(redirectorvars->cmdin_ep->flags & EPnewdata)); + removeTimeout(&timeout); + + if(!timeout) { + msgbox(30,BC_OKOnly | BC_DefaultButton1,"Fehler:\nZiel antwortet nicht"); + form->flags |= BC_Form_redraw; + RF_changestate(RFwor); + return; + } + + redirector_start(form, redirectorvars); + +} + + +void redirector_stop_click(FORM* form, CONTROL* control) { + + struct redirector_* redirectorvars; + redirectorvars = (struct redirector_*)form->tag; + + redirectorvars->cmdout_ep->dest = ((NUMBOX*)(form->controls[3]))->value; + redirectorvars->cmdout_ep->data[0] = redir_STOP; + redirectorvars->cmdout_ep->bufferlen = 1; + redirectorvars->cmdout_ep->flags |= EPnewdata; + + RF_changestate(RFtx); + + redirectorvars->dataout_ep->flags &= ~EPenabled; + redirectorvars->datain_ep->flags &= ~EPenabled; + + U0FCR &= ~((1<<6) | (1<<7)); // trigger level 0 + uart0_incbuffer = 0; + uart0_outcbuffer = 0; + serial_setbrg (DEFAULTBRG); + sysInfo &= ~SYS_NOPDOWN; + RF_changestate(RFwor); + + form->controls[2]->type &= ~BC_NoTabStop; + form->controls[3]->type &= ~BC_NoTabStop; + form->controls[5]->type &= ~BC_Disabled; + form->controls[6]->type |= BC_Disabled; + form->sel = 5; + form->flags |= BC_Form_redraw; + +} + +#define sendcount 59 +void redirector_timer(FORM* form) { + struct redirector_* redirectorvars; + redirectorvars = (struct redirector_*)form->tag; + + //((NUMBOX*)(form->controls[4]))->value = redirectorvars->outcbuffer.len; + //control_draw(form->controls[4],0); + + if(redirectorvars->incbuffer.len == redirectorvars->lastlen) { + if(redirectorvars->timeoutcnt) + redirectorvars->timeoutcnt--; + } + else { + redirectorvars->timeoutcnt = 2; + } + redirectorvars->lastlen = redirectorvars->incbuffer.len; + + + if(redirectorvars->dataout_ep && redirectorvars->incbuffer.len && !(redirectorvars->dataout_ep->flags & EPnewdata) && + ((redirectorvars->incbuffer.len >= sendcount) | !(redirectorvars->timeoutcnt))) { + + if(redirectorvars->incbuffer.len >= sendcount) + redirectorvars->dataout_ep->bufferlen = sendcount; + else + redirectorvars->dataout_ep->bufferlen = redirectorvars->incbuffer.len; + + redirectorvars->dataout_ep->flags |= EPnewdata; + RF_changestate(RFtx); + } + + if(redirectorvars->outcbuffer.len) { + if(!(U0IER & IER_THRE)) { + U0IER |= IER_THRE; + U0THR = cBufferGet(uart0_outcbuffer); + (((NUMBOX*)(form->controls[4]))->value)++; + control_draw(form->controls[4],0); + } + } + + if(redirectorvars->cmdin_ep->flags & EPnewdata) { + unsigned char ACK = 0; + switch (redirectorvars->cmdin_ep->data[0]) { + case redir_ACK: + break; + case redir_SET: + if (redirectorvars->cmdin_ep->bufferlen > 1) { + if(redirectorvars->cmdin_ep->data[1] <= baud_38400) { + ((LISTBOX*)(form->controls[2]))->listindex = redirectorvars->cmdin_ep->data[1]; + form->flags |= BC_Form_redraw; + } + ACK = 1; + } + break; + case redir_START: + ((NUMBOX*)(form->controls[3]))->value = redirectorvars->cmdin_ep->dest; + form->flags |= BC_Form_redraw; + /*redir_dest = RXframe->srcAddr; + setbaud(redir_baud); + redirector = 1; + ACK = 1;*/ + break; + case redir_STOP: + /*redirector = 0; + setbaud(baud_default); + ACK = 1;*/ + break; + case redir_PING: + ACK = 1; + break; + } + + redirectorvars->cmdin_ep->flags &= ~EPnewdata; + + if(ACK) { + redirectorvars->cmdout_ep->data[0] = redir_ACK; + redirectorvars->cmdout_ep->dest = redirectorvars->cmdin_ep->dest; + redirectorvars->cmdout_ep->bufferlen = 1; + redirectorvars->cmdout_ep->flags |= EPnewdata; + RF_changestate(RFtx); + } + } +} + + +void redirector_test(FORM* form, CONTROL* control) { + + if(uart0_incbuffer) { + cBufferAdd(uart0_incbuffer,'a'); + cBufferAdd(uart0_incbuffer,'b'); + cBufferAdd(uart0_incbuffer,'c'); + } +} + + +// menu (Tool>Redirector) +void uarto_redirector(void) { + + struct redirector_ redirectorvars; + + cBufferInit(&redirectorvars.incbuffer, redirectorvars.inbuffer, redirectorbuffersize); + cBufferInit(&redirectorvars.outcbuffer, redirectorvars.outbuffer, redirectorbuffersize); + + const char* listbox1items[8] = {"1200","2400","4800","9600","14400","19200","28800","38400"}; + + const LABEL label1 = {BC_Labelnotab,0,20,70,9,BOLDFONT,0,"Baud",0}; + const LABEL label2 = {BC_Labelnotab,0,32,70,9,BOLDFONT,0,"Zieladresse",0}; + LISTBOX listbox1 = {BC_Listbox,78,20,40,10,SMALLFONT,5,8,(char**)listbox1items,NULL,NULL}; + NUMBOX numbox1 = {BC_Numbox,78,32,20,9,SMALLFONT,1,0,255,NULL,NULL}; + NUMBOX numbox2 = {BC_Numbox | BC_NoTabStop,0,100,20,9,SMALLFONT,redirectorvars.outcbuffer.len,0,redirectorbuffersize,NULL,NULL}; + BUTTON button1 = {BC_Button,10,120,48,15,SMALLFONT,0,"Start",redirector_start_click}; + BUTTON button2 = {BC_Button | BC_Disabled,70,120,48,15,SMALLFONT,0,"Stop",redirector_stop_click}; + const BUTTON button3 = {BC_Button, 0,50,48,15,SMALLFONT,0,"test",redirector_test}; + + CONTROL* controls[8] = { (CONTROL*)&label1, + (CONTROL*)&label2, + (CONTROL*)&listbox1, + (CONTROL*)&numbox1, + (CONTROL*)&numbox2, + (CONTROL*)&button1, + (CONTROL*)&button2, + (CONTROL*)&button3}; + + FORM form = {"Com redirector","",NULL,NULL,redirector_timer,(unsigned long)&redirectorvars,controls,2,8,0,2}; + + redirectorvars.dataout_ep = openEP(&redirectorvars.incbuffer, 0, packet_redirDAT); + redirectorvars.datain_ep = openEP(&redirectorvars.outcbuffer, 0, packet_redirDAT); + redirectorvars.cmdout_ep = openEP(0, 0, packet_redirCMD); + redirectorvars.cmdin_ep = openEP(0, 0, packet_redirCMD); + + if(redirectorvars.dataout_ep && redirectorvars.datain_ep && redirectorvars.cmdout_ep && redirectorvars.cmdin_ep) { + redirectorvars.dataout_ep->flags |= EPoutput | EPtypecbuffer; + redirectorvars.datain_ep->flags |= EPinput | EPtypecbuffer; + redirectorvars.cmdout_ep->flags |= EPoutput | EPtypedata | EPenabled; + redirectorvars.cmdin_ep->flags |= EPinput | EPtypedata | EPenabled; + form_exec(&form); + } + else { + msgbox(30,BC_OKOnly | BC_DefaultButton1,"Fehler:\nKein freier RF Endpoint\nverfuegbar.\n"); + } + + redirector_stop_click(&form,form.controls[6]); + + closeEP(redirectorvars.datain_ep); + closeEP(redirectorvars.dataout_ep); + closeEP(redirectorvars.cmdin_ep); + closeEP(redirectorvars.cmdout_ep); + +} diff --git a/boop/trunk/serial/redirector.h b/boop/trunk/serial/redirector.h new file mode 100644 index 0000000..428fbe8 --- /dev/null +++ b/boop/trunk/serial/redirector.h @@ -0,0 +1,41 @@ +/* + redirector.h - serial port redirector + Copyright (C) 2009 Telekatz + + 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 3 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 REDIRECTOR_H +#define REDIRECTOR_H + +#define redir_ACK 0 +#define redir_SET 1 +#define redir_START 2 +#define redir_STOP 3 +#define redir_PING 4 + +#define baud_1200 0 +#define baud_2400 1 +#define baud_4800 2 +#define baud_9600 3 +#define baud_14400 4 +#define baud_19200 5 +#define baud_28800 6 +#define baud_38400 7 +#define baud_57600 8 +#define baud_115200 9 + +void uarto_redirector(void); + +#endif diff --git a/boop/trunk/serial/serial.c b/boop/trunk/serial/serial.c new file mode 100644 index 0000000..de8dc65 --- /dev/null +++ b/boop/trunk/serial/serial.c @@ -0,0 +1,301 @@ +/* + * minor changes (c) 2007 ch.klippel + * + * (C) Copyright 2004 + * DAVE Srl + * http://www.dave-tech.it + * http://www.wawnet.biz + * mailto:info@wawnet.biz + * + * (C) Copyright 2002-2004 + * Wolfgang Denk, DENX Software Engineering, + * + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH + * Marius Groeger + * + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH + * Alex Zuepke + * + * Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + + +#include "lpc2220.h" +#include "serial.h" +#include "irq.h" +#include "backlight.h" +#include "buffer.h" + +extern const char hval[16]; + +extern void uart0_irq(void); + +/* flush serial input queue. returns 0 on success or negative error + * number otherwise + */ +int serial_flush_input(void) +{ + volatile unsigned int tmp; + + /* keep on reading as long as the receiver is not empty */ + while(RX_DATA(U0LSR)) { + tmp = GET_CHAR(U0RBR); + } + + return 0; +} + + +/* flush output queue. returns 0 on success or negative error number + * otherwise + */ +int serial_flush_output(void) +{ + /* wait until the transmitter is no longer busy */ + while(TX_READY(U0LSR)==0) { + } + + return 0; +} + + +void serial_setbrg (unsigned int baudrate) +{ + + /* get correct divisor */ + /*for PCLK 15 Mhz */ + U0LCR = 0x83; + + switch(baudrate) { + + case 75: + U0DLL = 5; + U0DLM = 195; + U0FDR = (1 << 4) + 3; + break; + + case 150: + U0DLL = 5; + U0DLM = 195; + U0FDR = (1 << 4) + 1; + break; + + case 300: + U0DLL = 5; + U0DLM = 195; + U0FDR = (1 << 4) + 0; + break; + + case 600: + U0DLL = 2; + U0DLM = 78; + U0FDR = (4 << 4) + 1; + break; + + case 1200: + U0DLL = 1; + U0DLM = 39; + U0FDR = (4 << 4) + 1; + break; + + case 2400: + U0DLL = 186; + U0DLM = 0; + U0FDR = (10 << 4) + 11; + break; + + case 4800: + U0DLL = 93; + U0DLM = 0; + U0FDR = (10 << 4) + 11; + break; + + case 9600: + U0DLL = 71; + U0DLM = 0; + U0FDR = (8 << 4) + 3; + break; + + case 14400: + U0DLL = 31; + U0DLM = 0; + U0FDR = (10 << 4) + 11; + break; + + case 19200: + U0DLL = 38; + U0DLM = 0; + U0FDR = (14 << 4) + 4; + break; + + case 28800: + U0DLL = 24; + U0DLM = 0; + U0FDR = (14 << 4) + 5; + break; + + case 38400: + U0DLL = 19; + U0DLM = 0; + U0FDR = (14 << 4) + 4; + break; + + case 57600: + U0DLL = 12; + U0DLM = 0; + U0FDR = (14 << 4) + 5; + break; + + case 115200: + U0DLL = 6; + U0DLM = 0; + U0FDR = (14 << 4) + 5; + break; + + case 230400: + U0DLL = 3; + U0DLM = 0; + U0FDR = (14 << 4) + 5; + break; + } + U0LCR = 0x03; + + serial_flush_output(); + serial_flush_input(); +} + + +/* + * Initialise the serial port with the given baudrate. The settings + * are always 8 data bits, no parity, 1 stop bit, no start bits. + * + */ +int serial_init (void) +{ +// PINSEL0=0x05; // pin select -> tx, rx + serial_setbrg (DEFAULTBRG); +// serial_setbrg (57600); + U0FCR = 0x07; // enable fifo + uart0_incbuffer = 0; + uart0_outcbuffer = 0; + + // enable IRQ5 for UART0 + VICVectAddr5 = (unsigned long)&(uart0_irq); + VICVectCntl5 = VIC_SLOT_EN | INT_SRC_UART0; + VICIntEnable = INT_UART0; + U0IER = IER_RBR | IER_RXLS; + return (0); +} + + +/* + * Output a single byte to the serial port. + */ +void serial_putc (const char c) +{ + // proper CRLF transmission + if (c == '\n') + serial_putc('\r'); + + /* wait for room in the transmit FIFO */ + while(TX_READY(U0LSR)==0); + + PUT_CHAR(U0THR,c); +} + +void serial_putbyte (const char c) +{ + /* wait for room in the transmit FIFO */ + while(TX_READY(U0LSR)==0); + + PUT_CHAR(U0THR,c); +} +/* + * Read a single byte from the serial port. Returns 1 on success, 0 + * otherwise. When the function is succesfull, the character read is + * written into its argument c. + */ +int serial_tstc (void) +{ + return (RX_DATA(U0LSR)); +} + +/* + * Read a single byte from the serial port. Returns 1 on success, 0 + * otherwise. When the function is succesfull, the character read is + * written into its argument c. + */ +int serial_getc (void) +{ + int rv; + + for(;;) { + rv = serial_tstc(); + + if(rv > 0) + return (GET_CHAR(U0RBR)); + } +} + +void +serial_puts (const char *s) +{ + while (*s != 0) { + serial_putc (*s++); + } +} + +void putHexC(const unsigned char v) +{ + serial_putc(hval[v>>4]); + serial_putc(hval[v & 0x0F]); +} + +void putHexS(const unsigned short v) +{ + putHexC(v >> 8); + putHexC(v & 0xFF); +} + +void putHexW(const unsigned long v) +{ + putHexS(v >> 16); + putHexS(v & 0xFFFF); +} + +void serial_interactive(void) { + int ch = serial_getc(); + switch (ch) { + case '.': + serial_puts("Betty Boop ("__DATE__ " " __TIME__ ")\n"); + break; + case '0': + setBacklight(0x00); // pwm value + break; + case '1': + setBacklight(0x1F); // pwm value + break; + case '2': + setBacklight(0x3F); // pwm value + break; + default: + serial_putc(ch); + } +} diff --git a/boop/trunk/serial/serial.h b/boop/trunk/serial/serial.h new file mode 100644 index 0000000..292174f --- /dev/null +++ b/boop/trunk/serial/serial.h @@ -0,0 +1,60 @@ +/* + serial.h - serial port functions + Copyright (C) 2007 Ch. Klippel + + 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 3 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 BOOP_SERIAL_H +#define BOOP_SERIAL_H + +#define USRRxData (1 << 0) +#define USRTxHoldEmpty (1 << 6) + +#define IER_RBR 1 +#define IER_THRE 2 +#define IER_RXLS 4 + +#define IIR_RLS 0x06 +#define IIR_RDA 0x04 +#define IIR_CTI 0x0c +#define IIR_THRE 0x02 + +#define GET_CHAR(p) p +#define PUT_CHAR(p,c) (p= (unsigned )(c)) +#define TX_READY(s) ((s) & USRTxHoldEmpty) +#define RX_DATA(s) ((s) & USRRxData) + +#define DEFAULTBRG 115200 + +struct cBuffer_* uart0_incbuffer; +struct cBuffer_* uart0_outcbuffer; + +int serial_flush_input(void); +int serial_flush_output(void); +void serial_setbrg (unsigned int baudrate); +int serial_init (void); +void serial_putc (const char c); +void serial_putbyte (const char c); +int serial_tstc (void); +int serial_getc (void); +void serial_puts (const char *s); + +void putHexC(const unsigned char v); +void putHexS(const unsigned short v); +void putHexW(const unsigned long v); + +void serial_interactive(void); + +#endif /* BOOP_SERIAL_H */ diff --git a/boop/trunk/serial/serirq.c b/boop/trunk/serial/serirq.c new file mode 100644 index 0000000..8216acb --- /dev/null +++ b/boop/trunk/serial/serirq.c @@ -0,0 +1,71 @@ +/* + serirq.c - serial interrupr + Copyright (C) 2009 + + 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 3 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 "backlight.h" +#include "lpc2220.h" +#include "serial.h" +#include "buffer.h" + +//volatile int uart0_active = 0; + +void uart0_irq(void) { + char st = U0IIR & 0x0f; + + // IRQ only valid when IIR_bit_0 == 0 + if (st & 1) + return; + + switch (st) { + case IIR_RLS: // Receive Line Status + putHexW(U0LSR); + serial_puts(" RLS?!\n"); + + break; + case IIR_RDA: // Receive Data Available + case IIR_CTI: // Character Time-out indication + if(uart0_incbuffer) { + while(U0LSR & (1 << 0)) { + cBufferAdd(uart0_incbuffer,U0RBR); + } + } + else { + setBacklight(BL_AUTO); + serial_interactive(); + } + break; + case IIR_THRE: + if(uart0_outcbuffer) { + if(uart0_outcbuffer->len) { + unsigned char x = 14; + while(x-- && uart0_outcbuffer->len) { + U0THR = cBufferGet(uart0_outcbuffer); + } + } + else { + U0IER &= ~IER_THRE; + } + } + else { + serial_puts("THRE?!\n"); + } + + } + +} + + diff --git a/boop/trunk/sound3.h b/boop/trunk/sound3.h new file mode 100644 index 0000000..01655d7 --- /dev/null +++ b/boop/trunk/sound3.h @@ -0,0 +1,1571 @@ +#define sound3_len 25060 +const unsigned char sound3_data[] = { +0x80,0x80,0x80,0x80, +0x7F,0x7F,0x80,0x80,0x80,0x81,0x81,0x81,0x81,0x81,0x80,0x80,0x80,0x80,0x80,0x80, +0x7F,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x81, +0x81,0x82,0x82,0x81,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x81,0x81,0x81,0x81,0x80, +0x80,0x80,0x81,0x81,0x81,0x81,0x82,0x82,0x82,0x81,0x81,0x81,0x81,0x81,0x81,0x80, +0x80,0x80,0x80,0x80,0x81,0x81,0x82,0x81,0x81,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7F, +0x7F,0x80,0x80,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x7F,0x7F,0x7F,0x80,0x81,0x81, +0x81,0x81,0x80,0x7F,0x7F,0x7E,0x7E,0x7F,0x80,0x80,0x81,0x81,0x81,0x81,0x81,0x81, +0x81,0x81,0x81,0x81,0x80,0x80,0x81,0x82,0x83,0x83,0x83,0x83,0x82,0x81,0x81,0x80, +0x80,0x80,0x81,0x82,0x82,0x83,0x82,0x82,0x81,0x80,0x80,0x80,0x7F,0x7F,0x7F,0x7F, +0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x80,0x7F,0x7F,0x7F,0x80,0x80,0x81,0x81,0x81,0x81, +0x81,0x80,0x80,0x7F,0x7E,0x7E,0x7E,0x7E,0x7F,0x7F,0x7F,0x7F,0x7C,0x77,0x71,0x67, +0x5F,0x58,0x55,0x55,0x58,0x5B,0x5D,0x5D,0x5B,0x58,0x54,0x4D,0x42,0x38,0x3F,0x56, +0x6D,0x81,0x94,0xA6,0xB7,0xC1,0xC8,0xD0,0xDA,0xE3,0xE8,0xEA,0xE6,0xDE,0xD3,0xC5, +0xB7,0xAA,0x9F,0x9A,0x99,0x97,0x95,0x96,0x96,0x95,0x92,0x8F,0x8D,0x8E,0x8E,0x90, +0x8F,0x87,0x80,0x79,0x70,0x68,0x62,0x65,0x6B,0x6F,0x73,0x76,0x76,0x77,0x7B,0x7D, +0x77,0x72,0x6C,0x68,0x6B,0x72,0x7F,0x8A,0x8E,0x8C,0x83,0x6E,0x59,0x48,0x38,0x30, +0x2C,0x2B,0x2E,0x39,0x47,0x4E,0x54,0x5C,0x60,0x5E,0x58,0x56,0x5A,0x67,0x78,0x8D, +0xA2,0xB6,0xC1,0xC3,0xC0,0xBB,0xB2,0xAA,0xA1,0x93,0x89,0x85,0x83,0x80,0x81,0x84, +0x82,0x7D,0x72,0x63,0x55,0x48,0x40,0x3F,0x48,0x55,0x63,0x76,0x89,0x95,0x91,0x90, +0x89,0x83,0x7E,0x7B,0x7A,0x75,0x70,0x67,0x6D,0x75,0x7F,0x93,0xAB,0xB9,0xB6,0xAE, +0x9B,0x90,0x7B,0x6B,0x66,0x5F,0x5E,0x6A,0x76,0x7D,0x7F,0x82,0x85,0x7D,0x78,0x77, +0x82,0x89,0x99,0xAB,0xC3,0xC5,0xB3,0xA6,0xA0,0x93,0x85,0x8C,0x97,0x9F,0x9B,0x8A, +0x71,0x5C,0x53,0x57,0x62,0x77,0x88,0x9A,0xA6,0xAC,0xB0,0xB5,0xC5,0xD1,0xD6,0xCF, +0xCE,0xCE,0xC4,0xAE,0x97,0x81,0x71,0x65,0x5F,0x5D,0x5C,0x57,0x43,0x35,0x2C,0x27, +0x29,0x32,0x45,0x59,0x6B,0x76,0x75,0x74,0x78,0x7D,0x7D,0x77,0x71,0x73,0x78,0x70, +0x6A,0x63,0x55,0x4F,0x51,0x5B,0x57,0x54,0x60,0x6F,0x7A,0x8C,0xAB,0xCB,0xE5,0xEE, +0xD6,0xAD,0x84,0x6D,0x6F,0x7B,0x86,0x82,0x78,0x6C,0x5C,0x50,0x4E,0x53,0x59,0x6D, +0x74,0x7F,0x89,0x85,0x90,0x9F,0xB9,0xCA,0xCF,0xD3,0xD8,0xE1,0xE1,0xD2,0xB0,0x86, +0x6B,0x74,0x86,0x88,0x84,0x86,0x88,0x85,0x8C,0x98,0x97,0x95,0x93,0x92,0x8E,0x86, +0x87,0x8C,0x8D,0x8B,0x7E,0x6A,0x53,0x40,0x3C,0x3D,0x3C,0x48,0x5E,0x6F,0x7B,0x88, +0x8F,0x88,0x81,0x82,0x7D,0x72,0x6C,0x68,0x64,0x5B,0x56,0x5B,0x62,0x6A,0x6A,0x6F, +0x73,0x73,0x70,0x69,0x5F,0x5F,0x5C,0x54,0x57,0x5F,0x6B,0x77,0x86,0xA3,0xC9,0xDD, +0xD5,0xC9,0xC1,0xBA,0xB7,0xB6,0xB3,0xAA,0xA0,0x96,0x94,0x93,0x90,0x8A,0x87,0x7D, +0x71,0x67,0x5B,0x55,0x55,0x59,0x5B,0x5B,0x59,0x5F,0x79,0x8F,0x9B,0x9B,0x8F,0x86, +0x7E,0x7E,0x84,0x84,0x74,0x6B,0x6C,0x67,0x5D,0x54,0x51,0x5E,0x6E,0x6C,0x63,0x60, +0x67,0x73,0x7F,0x79,0x64,0x58,0x62,0x77,0x78,0x6B,0x63,0x5E,0x5C,0x5E,0x57,0x4F, +0x55,0x60,0x65,0x69,0x65,0x5D,0x60,0x6B,0x73,0x71,0x76,0x7F,0x8C,0x95,0x96,0x93, +0xA3,0xBE,0xC5,0xC4,0xCA,0xD6,0xD5,0xBC,0xAA,0x9F,0x97,0x9A,0xA4,0xA5,0xA6,0xAB, +0xAC,0xB1,0xB5,0xAC,0x9E,0x91,0x86,0x7E,0x83,0x8D,0x99,0xA7,0xAA,0xA4,0xA2,0x9E, +0x9D,0x9A,0x91,0x89,0x85,0x7B,0x73,0x79,0x83,0x81,0x72,0x68,0x62,0x5A,0x52,0x5A, +0x6E,0x86,0x98,0xA0,0xA3,0x9F,0x95,0x87,0x79,0x73,0x6D,0x68,0x66,0x68,0x69,0x6A, +0x6A,0x6D,0x6E,0x6C,0x6E,0x69,0x5F,0x59,0x5C,0x62,0x67,0x6B,0x6C,0x6C,0x6F,0x79, +0x80,0x7C,0x73,0x6D,0x68,0x68,0x6A,0x76,0x8C,0xA5,0xB6,0xBD,0xBD,0xB3,0xAB,0xAB, +0xAE,0xAF,0xB2,0xB3,0xA4,0x97,0x8D,0x81,0x76,0x69,0x62,0x63,0x60,0x58,0x4B,0x3B, +0x31,0x37,0x45,0x4E,0x56,0x5F,0x72,0x86,0x90,0x95,0x90,0x84,0x89,0x93,0x9B,0xA1, +0xA3,0xAA,0xA7,0xA0,0x96,0x96,0x97,0x91,0x96,0x99,0x99,0x95,0x8F,0x8C,0x89,0x8E, +0x94,0x8B,0x79,0x64,0x4B,0x37,0x2F,0x33,0x40,0x50,0x5E,0x69,0x63,0x57,0x53,0x50, +0x46,0x41,0x46,0x56,0x68,0x77,0x85,0x8F,0x92,0x9A,0xA2,0xA8,0xAC,0xB0,0xB1,0xB0, +0xB1,0xB7,0xB5,0xB0,0xAC,0xA5,0xA7,0xA8,0x9F,0x93,0x8A,0x87,0x8B,0x8A,0x85,0x7B, +0x6E,0x61,0x56,0x52,0x59,0x62,0x65,0x6B,0x77,0x81,0x7F,0x75,0x75,0x7E,0x86,0x8B, +0x8E,0x96,0x9E,0x9B,0x94,0x8F,0x89,0x92,0xA3,0xAE,0xB3,0xAD,0xA1,0x94,0x87,0x7B, +0x74,0x70,0x6C,0x69,0x61,0x55,0x48,0x47,0x52,0x63,0x71,0x73,0x75,0x77,0x7E,0x84, +0x7A,0x6E,0x70,0x77,0x7E,0x7C,0x79,0x7C,0x7C,0x79,0x75,0x70,0x71,0x76,0x7E,0x81, +0x84,0x85,0x7D,0x73,0x6F,0x75,0x81,0x84,0x88,0x88,0x7E,0x68,0x50,0x4F,0x60,0x72, +0x7D,0x84,0x80,0x6F,0x59,0x49,0x44,0x46,0x57,0x74,0x8B,0x91,0x8B,0x8A,0x8C,0x8B, +0x86,0x83,0x84,0x84,0x89,0x90,0x98,0xAA,0xBF,0xC9,0xCB,0xD1,0xCE,0xBD,0xAF,0xAC, +0xA8,0x9C,0x91,0x8A,0x88,0x8E,0x91,0x91,0x96,0xA2,0xAF,0xB3,0xAE,0x9D,0x86,0x73, +0x6C,0x6D,0x74,0x7F,0x7E,0x78,0x7E,0x89,0x8C,0x85,0x84,0x89,0x8B,0x8C,0x8A,0x81, +0x7D,0x85,0x8F,0x8E,0x87,0x8A,0x99,0xA7,0xAF,0xA9,0xA0,0x93,0x87,0x7D,0x76,0x76, +0x79,0x7E,0x7D,0x73,0x6B,0x67,0x6C,0x75,0x76,0x78,0x7A,0x7D,0x81,0x78,0x6B,0x66, +0x65,0x63,0x66,0x6B,0x6A,0x61,0x56,0x51,0x54,0x5F,0x69,0x75,0x82,0x8B,0x90,0x8C, +0x85,0x80,0x85,0x8C,0x8D,0x88,0x7B,0x67,0x57,0x4A,0x44,0x49,0x52,0x5A,0x65,0x6F, +0x70,0x71,0x6D,0x63,0x52,0x4A,0x45,0x42,0x49,0x55,0x66,0x75,0x7C,0x7D,0x78,0x73, +0x72,0x75,0x72,0x65,0x5F,0x64,0x71,0x7F,0x89,0x96,0xA6,0xB3,0xB4,0xB0,0xA9,0xA3, +0x9A,0x96,0x9A,0xA0,0xAB,0xB7,0xC0,0xC0,0xB9,0xA6,0x8E,0x7C,0x7A,0x7E,0x7C,0x79, +0x7A,0x79,0x75,0x71,0x78,0x83,0x87,0x86,0x7B,0x6B,0x67,0x6B,0x7A,0x91,0xA2,0xA7, +0xA9,0xAD,0xB0,0xB0,0xAE,0xA4,0x92,0x85,0x80,0x7F,0x7D,0x78,0x73,0x7F,0x98,0xA7, +0xA1,0x91,0x86,0x81,0x7B,0x6F,0x62,0x57,0x55,0x56,0x55,0x51,0x58,0x68,0x78,0x80, +0x80,0x7D,0x7B,0x80,0x89,0x92,0x8F,0x83,0x77,0x6F,0x6A,0x67,0x67,0x6C,0x6F,0x72, +0x73,0x73,0x78,0x80,0x82,0x7F,0x7A,0x7A,0x7F,0x86,0x92,0xA8,0xBD,0xC7,0xC7,0xC5, +0xC6,0xCB,0xC8,0xB8,0xA1,0x85,0x72,0x6C,0x6B,0x68,0x66,0x74,0x8E,0x9F,0xA5,0x9D, +0x88,0x6E,0x57,0x4E,0x51,0x5B,0x65,0x71,0x7B,0x80,0x76,0x65,0x5D,0x5D,0x61,0x5D, +0x52,0x4C,0x46,0x3C,0x3C,0x44,0x52,0x67,0x80,0x8F,0x90,0x87,0x80,0x7D,0x7A,0x7C, +0x81,0x83,0x7D,0x72,0x67,0x64,0x69,0x73,0x82,0x91,0xA1,0xAA,0xA4,0x91,0x7D,0x70, +0x69,0x6C,0x73,0x79,0x87,0x98,0xA6,0xB0,0xBB,0xD0,0xDE,0xDC,0xD8,0xD8,0xD1,0xBE, +0xA9,0x9E,0xA3,0xAE,0xAE,0xA2,0x8E,0x7B,0x74,0x78,0x7D,0x80,0x85,0x8A,0x8B,0x87, +0x7F,0x7E,0x83,0x87,0x83,0x76,0x6A,0x65,0x67,0x73,0x86,0x96,0x9F,0x9B,0x8C,0x7F, +0x75,0x6C,0x64,0x59,0x50,0x51,0x5A,0x64,0x68,0x66,0x68,0x74,0x84,0x8C,0x88,0x86, +0x86,0x7D,0x6D,0x64,0x5A,0x46,0x33,0x31,0x3B,0x41,0x3F,0x3A,0x3C,0x43,0x4F,0x5B, +0x61,0x61,0x69,0x74,0x78,0x7A,0x7A,0x7C,0x7F,0x7E,0x7E,0x83,0x8B,0x94,0x9B,0x9D, +0x92,0x88,0x89,0x89,0x80,0x76,0x74,0x7A,0x7E,0x80,0x83,0x88,0x8B,0x8F,0x98,0xA3, +0xAC,0xB0,0xA9,0x9D,0x97,0x99,0x96,0x8A,0x7A,0x78,0x7D,0x7D,0x77,0x73,0x7F,0x94, +0xA8,0xB1,0xAE,0xA9,0xA6,0x9D,0x8B,0x7D,0x72,0x6F,0x75,0x80,0x8B,0x90,0x90,0x84, +0x72,0x6B,0x74,0x79,0x76,0x7B,0x7D,0x72,0x6C,0x74,0x81,0x8A,0x8C,0x84,0x71,0x5F, +0x56,0x58,0x5C,0x59,0x51,0x4D,0x51,0x5F,0x6A,0x6B,0x73,0x86,0x93,0x98,0x98,0x96, +0x90,0x89,0x8B,0x9B,0xAC,0xB3,0xB5,0xB6,0xB9,0xB6,0xAE,0xA5,0x9F,0x9C,0xA0,0xA9, +0xAB,0xA4,0x9A,0x97,0x97,0x96,0x93,0x8F,0x88,0x7A,0x6D,0x65,0x68,0x74,0x7B,0x7D, +0x7A,0x76,0x78,0x83,0x92,0x9A,0x97,0x90,0x8B,0x8F,0x92,0x89,0x7D,0x79,0x77,0x6F, +0x65,0x5D,0x5E,0x6C,0x80,0x88,0x85,0x83,0x82,0x81,0x7C,0x77,0x74,0x77,0x7C,0x7F, +0x81,0x82,0x83,0x7C,0x6B,0x5B,0x56,0x5C,0x5F,0x5C,0x57,0x54,0x53,0x50,0x51,0x5D, +0x71,0x7D,0x83,0x87,0x86,0x84,0x85,0x8C,0x9B,0xA7,0xA2,0x92,0x88,0x88,0x8C,0x96, +0xA1,0xA3,0x98,0x89,0x7F,0x78,0x70,0x6C,0x72,0x7B,0x7A,0x73,0x6E,0x6E,0x74,0x78, +0x7A,0x7D,0x81,0x81,0x74,0x63,0x59,0x5B,0x65,0x6D,0x72,0x75,0x77,0x7A,0x81,0x83, +0x86,0x8C,0x84,0x76,0x6D,0x70,0x7C,0x88,0x8A,0x86,0x87,0x8D,0x8A,0x8A,0x96,0xA0, +0x98,0x8A,0x88,0x94,0x9F,0x9F,0x99,0x8E,0x84,0x81,0x7C,0x7B,0x80,0x82,0x7F,0x7A, +0x75,0x72,0x77,0x84,0x92,0x9B,0x9C,0x93,0x85,0x7A,0x78,0x84,0x94,0x9C,0x9A,0x8E, +0x84,0x87,0x8C,0x87,0x76,0x62,0x4E,0x41,0x43,0x56,0x6D,0x75,0x73,0x6F,0x76,0x84, +0x8C,0x8C,0x8B,0x87,0x81,0x7B,0x79,0x7E,0x7F,0x7B,0x74,0x74,0x7E,0x8B,0x92,0x93, +0x83,0x6F,0x67,0x65,0x61,0x5C,0x5A,0x5C,0x62,0x68,0x6B,0x6F,0x6D,0x63,0x5F,0x68, +0x74,0x7B,0x7D,0x7C,0x87,0x9C,0xAA,0xAA,0x9F,0x99,0xA3,0xA8,0xA5,0xA5,0xA3,0xA0, +0xA0,0x9E,0x9F,0xA7,0xA9,0xA4,0x9A,0x90,0x8D,0x8E,0x8A,0x85,0x81,0x7D,0x7A,0x76, +0x76,0x7C,0x86,0x8C,0x89,0x85,0x7E,0x76,0x70,0x6B,0x6B,0x71,0x74,0x6E,0x66,0x69, +0x79,0x8D,0x9B,0xA1,0x9D,0x96,0x93,0x92,0x8F,0x8E,0x8E,0x8C,0x86,0x81,0x83,0x85, +0x80,0x7B,0x7E,0x82,0x80,0x7F,0x81,0x81,0x7C,0x7D,0x7E,0x79,0x7A,0x7B,0x74,0x6D, +0x6B,0x73,0x80,0x92,0x9A,0x90,0x89,0x89,0x85,0x79,0x67,0x5B,0x63,0x75,0x7F,0x7B, +0x72,0x6E,0x76,0x80,0x88,0x8C,0x91,0x97,0x97,0x97,0x99,0x93,0x83,0x74,0x71,0x70, +0x6D,0x66,0x62,0x64,0x70,0x84,0x98,0xA2,0xA0,0x9C,0x97,0x91,0x8B,0x84,0x7E,0x7A, +0x72,0x67,0x65,0x76,0x8B,0x8F,0x87,0x82,0x86,0x8B,0x86,0x75,0x66,0x6A,0x75,0x7D, +0x83,0x85,0x85,0x89,0x90,0x90,0x85,0x74,0x62,0x50,0x42,0x46,0x5D,0x6D,0x6E,0x72, +0x81,0x8F,0x91,0x8B,0x84,0x7E,0x76,0x7A,0x8A,0x92,0x8C,0x87,0x8B,0x8F,0x8B,0x80, +0x75,0x6D,0x61,0x54,0x4D,0x53,0x5C,0x5D,0x55,0x46,0x40,0x4B,0x5B,0x67,0x6E,0x70, +0x6F,0x72,0x7C,0x85,0x81,0x75,0x70,0x77,0x86,0x91,0x93,0x96,0x9A,0x9D,0xA4,0xAE, +0xB8,0xB3,0xA2,0x94,0x8C,0x82,0x7C,0x81,0x8E,0x9A,0x9B,0x9B,0xA6,0xB0,0xAE,0x9E, +0x8D,0x85,0x7D,0x71,0x76,0x8E,0xA1,0xA5,0x9F,0x99,0x91,0x86,0x86,0x89,0x88,0x77, +0x64,0x61,0x6D,0x7C,0x87,0x8D,0x8A,0x80,0x76,0x70,0x74,0x83,0x8D,0x89,0x7E,0x7C, +0x79,0x73,0x75,0x7F,0x7D,0x6C,0x5C,0x63,0x79,0x81,0x7E,0x7B,0x73,0x6E,0x69,0x60, +0x60,0x6A,0x70,0x77,0x84,0x94,0x9C,0x95,0x8C,0x87,0x85,0x8D,0x91,0x8F,0x8E,0x8C, +0x8D,0x93,0x9F,0xAC,0xB1,0xA5,0x91,0x87,0x88,0x89,0x87,0x82,0x7B,0x7B,0x80,0x85, +0x92,0xA7,0xB1,0xAF,0xAB,0xA5,0xA0,0x99,0x88,0x72,0x60,0x52,0x52,0x64,0x7B,0x8B, +0x97,0x9D,0x97,0x82,0x6E,0x6A,0x73,0x74,0x69,0x62,0x65,0x68,0x63,0x62,0x6E,0x82, +0x95,0x90,0x7E,0x78,0x80,0x80,0x6D,0x5F,0x65,0x77,0x83,0x84,0x8B,0x95,0x98,0x9E, +0xA6,0x9F,0x90,0x8E,0x89,0x75,0x61,0x55,0x53,0x56,0x5B,0x63,0x6D,0x7B,0x7E,0x73, +0x66,0x5D,0x58,0x55,0x55,0x56,0x50,0x4D,0x5E,0x7B,0x96,0xA8,0xA8,0x99,0x88,0x7B, +0x79,0x84,0x8A,0x8C,0x94,0x9B,0x93,0x86,0x85,0x8A,0x93,0x95,0x85,0x73,0x6B,0x66, +0x64,0x69,0x69,0x6A,0x71,0x71,0x73,0x7E,0x8D,0x98,0x94,0x8A,0x8E,0x9A,0x9C,0x94, +0x90,0x8C,0x87,0x82,0x7C,0x77,0x79,0x85,0x99,0xA2,0x97,0x8A,0x83,0x82,0x89,0x89, +0x81,0x84,0x90,0x8E,0x82,0x7F,0x81,0x78,0x68,0x5E,0x5F,0x5D,0x5A,0x5E,0x5C,0x56, +0x51,0x56,0x62,0x74,0x83,0x85,0x87,0x8B,0x8C,0x8E,0x94,0x95,0x8C,0x88,0x94,0xAC, +0xBC,0xBC,0xBC,0xBE,0xB5,0xAB,0x9F,0x91,0x84,0x7B,0x70,0x6F,0x78,0x7E,0x79,0x78, +0x78,0x69,0x59,0x51,0x45,0x3A,0x33,0x31,0x36,0x3E,0x47,0x53,0x62,0x69,0x68,0x67, +0x6F,0x7E,0x88,0x8E,0x92,0x9A,0xA9,0xB9,0xBE,0xBF,0xC1,0xBF,0xBB,0xB0,0xA1,0x9A, +0x9E,0xA5,0xA8,0xA9,0xA4,0x99,0x8B,0x7F,0x78,0x6A,0x5F,0x60,0x61,0x62,0x6A,0x6E, +0x6D,0x70,0x76,0x7C,0x81,0x91,0x9D,0x9A,0x92,0x86,0x80,0x82,0x87,0x8A,0x94,0xA4, +0xAD,0xAD,0xA7,0xA7,0xAF,0xAC,0xA4,0x97,0x82,0x7F,0x8C,0x98,0xA3,0xA2,0x8D,0x7A, +0x75,0x70,0x66,0x60,0x63,0x65,0x64,0x61,0x63,0x65,0x63,0x5E,0x58,0x58,0x5A,0x56, +0x58,0x67,0x78,0x81,0x7D,0x7F,0x8B,0x91,0x8B,0x83,0x83,0x84,0x82,0x85,0x8E,0x91, +0x8A,0x85,0x7B,0x6B,0x6F,0x81,0x95,0xA5,0xA8,0x9B,0x93,0x97,0x96,0x8F,0x91,0x97, +0x8F,0x75,0x5A,0x58,0x65,0x71,0x79,0x80,0x82,0x7D,0x78,0x75,0x70,0x69,0x62,0x61, +0x64,0x62,0x64,0x6F,0x80,0x8F,0x9D,0xAD,0xB5,0xAE,0x98,0x7D,0x73,0x72,0x70,0x6C, +0x69,0x6C,0x6F,0x6E,0x6C,0x6B,0x68,0x69,0x69,0x64,0x5B,0x4E,0x46,0x47,0x54,0x63, +0x6D,0x6F,0x71,0x72,0x70,0x74,0x77,0x75,0x71,0x68,0x65,0x73,0x89,0x96,0x9B,0xA0, +0xA8,0xA8,0xA8,0xAA,0xA9,0xA2,0x99,0x90,0x8D,0x8D,0x8E,0x8E,0x90,0x89,0x7D,0x75, +0x6C,0x6F,0x7B,0x7B,0x73,0x73,0x77,0x7B,0x78,0x6F,0x6A,0x6A,0x67,0x6D,0x7B,0x7A, +0x7B,0x84,0x89,0x86,0x80,0x85,0x8B,0x87,0x83,0x7F,0x7C,0x87,0x96,0xA8,0xBF,0xC7, +0xBD,0xBD,0xCB,0xC6,0xAE,0x93,0x82,0x78,0x73,0x75,0x7D,0x86,0x82,0x70,0x5D,0x60, +0x73,0x81,0x85,0x82,0x73,0x66,0x6C,0x7F,0x8D,0x8C,0x82,0x76,0x69,0x60,0x5E,0x5E, +0x60,0x63,0x69,0x77,0x83,0x87,0x95,0x9D,0x9C,0xA3,0xA5,0x9A,0x93,0x99,0x9D,0x9E, +0x9E,0x9E,0x9D,0x95,0x8A,0x7A,0x72,0x77,0x7B,0x84,0x95,0x92,0x83,0x81,0x87,0x8B, +0x88,0x7E,0x74,0x69,0x5B,0x5D,0x6A,0x6E,0x6C,0x69,0x69,0x6C,0x6F,0x72,0x6E,0x64, +0x66,0x73,0x89,0xA0,0xAF,0xB9,0xC1,0xB4,0x9D,0x95,0x96,0x8B,0x84,0x83,0x73,0x59, +0x54,0x6E,0x8D,0x9C,0x95,0x7D,0x69,0x69,0x73,0x6A,0x5F,0x6A,0x79,0x7F,0x7B,0x7B, +0x7F,0x87,0x88,0x83,0x7C,0x74,0x6D,0x71,0x78,0x7B,0x78,0x7D,0x89,0x8F,0x8A,0x7A, +0x70,0x6B,0x6A,0x73,0x7A,0x7A,0x81,0x8D,0x8F,0x91,0x94,0x90,0x88,0x7D,0x73,0x72, +0x74,0x7A,0x82,0x81,0x82,0x89,0x89,0x80,0x79,0x71,0x6D,0x74,0x84,0x8D,0x85,0x74, +0x6C,0x68,0x65,0x63,0x5D,0x5B,0x64,0x66,0x5F,0x67,0x78,0x8A,0x9A,0xA2,0x9E,0x92, +0x8B,0x8E,0x96,0x99,0xA0,0xAE,0xB0,0xA5,0x91,0x84,0x77,0x67,0x5F,0x60,0x5F,0x58, +0x4A,0x41,0x4B,0x55,0x65,0x7B,0x7E,0x7E,0x84,0x8B,0x89,0x82,0x7C,0x78,0x79,0x7D, +0x80,0x86,0x89,0x8C,0x90,0x8D,0x89,0x8E,0x95,0x92,0x8B,0x86,0x8B,0x96,0x99,0x97, +0x93,0x93,0x9A,0xA3,0x9E,0x87,0x73,0x67,0x6A,0x6B,0x66,0x64,0x65,0x6B,0x74,0x7A, +0x78,0x72,0x6B,0x68,0x6E,0x75,0x72,0x69,0x6C,0x7D,0x83,0x79,0x6D,0x72,0x7F,0x85, +0x8E,0x9A,0xA6,0xAF,0xAE,0xA8,0xA1,0x97,0x91,0x9A,0xA5,0xA3,0x9E,0x9D,0x9B,0x96, +0x8D,0x87,0x8C,0x8F,0x7E,0x6C,0x6E,0x74,0x81,0x94,0x9D,0x93,0x83,0x7E,0x86,0x8D, +0x86,0x7A,0x73,0x6F,0x69,0x65,0x63,0x62,0x64,0x67,0x67,0x6D,0x79,0x7D,0x7B,0x81, +0x8D,0x96,0x9B,0xA1,0xA2,0xA0,0x9F,0xA7,0xB0,0xAF,0xA8,0x9D,0x95,0x8F,0x8D,0x8B, +0x8A,0x8F,0x92,0x83,0x6F,0x6B,0x73,0x77,0x77,0x71,0x65,0x57,0x4F,0x54,0x5B,0x5E, +0x5F,0x5A,0x59,0x62,0x6E,0x7A,0x7F,0x83,0x86,0x83,0x82,0x7A,0x6D,0x6D,0x7A,0x8F, +0xA5,0xB6,0xAF,0x97,0x8D,0x93,0x9B,0xA6,0x9E,0x88,0x7E,0x79,0x70,0x68,0x66,0x70, +0x84,0x99,0xA1,0x9A,0x90,0x87,0x7A,0x69,0x56,0x43,0x34,0x31,0x3C,0x4F,0x64,0x76, +0x7E,0x82,0x86,0x87,0x85,0x81,0x78,0x74,0x80,0x91,0x95,0x9A,0xA5,0xA1,0x92,0x87, +0x8C,0x94,0x8D,0x89,0x8B,0x88,0x84,0x7D,0x71,0x6A,0x5D,0x58,0x60,0x67,0x6D,0x73, +0x79,0x81,0x82,0x7C,0x71,0x6A,0x67,0x64,0x62,0x67,0x74,0x84,0x8F,0x96,0xA0,0xA9, +0xAF,0xB1,0xB4,0xB1,0x9D,0x8D,0x88,0x8A,0x8E,0x91,0x98,0xA2,0x9F,0x92,0x86,0x72, +0x60,0x56,0x48,0x3E,0x3C,0x3A,0x3B,0x3E,0x47,0x55,0x61,0x6D,0x74,0x7A,0x79,0x73, +0x78,0x83,0x80,0x6C,0x66,0x76,0x8C,0x9A,0xA6,0xB1,0xB4,0xB3,0xAA,0x9B,0x91,0x8D, +0x90,0x91,0x95,0xA0,0xAA,0xB7,0xBC,0xB5,0xA5,0x8D,0x72,0x61,0x62,0x64,0x61,0x63, +0x69,0x6C,0x6D,0x6D,0x73,0x74,0x6B,0x64,0x5E,0x57,0x5C,0x6B,0x79,0x86,0x92,0x9D, +0x99,0x92,0x9A,0xA5,0xAF,0xAB,0xA4,0xA5,0x9D,0x8E,0x88,0x92,0xA0,0x98,0x86,0x89, +0x95,0xA3,0xB4,0xB7,0xAA,0x9D,0x90,0x83,0x7C,0x74,0x64,0x54,0x5D,0x69,0x61,0x51, +0x4F,0x54,0x55,0x57,0x60,0x62,0x5E,0x63,0x6D,0x74,0x7A,0x7F,0x83,0x8B,0x9D,0xB2, +0xBD,0xBE,0xB9,0xB3,0xAA,0x9B,0x8F,0x8E,0x98,0x92,0x85,0x87,0x93,0xAA,0xB5,0xB8, +0xB5,0x9E,0x7F,0x70,0x6F,0x68,0x57,0x4A,0x4E,0x59,0x61,0x6C,0x74,0x74,0x6F,0x62, +0x5E,0x61,0x5D,0x56,0x58,0x6C,0x87,0x8F,0x90,0x91,0x89,0x83,0x8D,0x90,0x86,0x83, +0x8D,0x9A,0x8C,0x6C,0x60,0x75,0x92,0x98,0x90,0x89,0x78,0x6C,0x72,0x78,0x76,0x72, +0x65,0x5A,0x57,0x58,0x5B,0x67,0x72,0x6D,0x61,0x63,0x6D,0x71,0x6B,0x65,0x6E,0x79, +0x76,0x73,0x7A,0x84,0x88,0x83,0x8A,0x9D,0xAB,0xA6,0x8C,0x7D,0x87,0x91,0x95,0xA0, +0xA9,0xA1,0x96,0x8D,0x8F,0xA0,0xAC,0xA3,0x8A,0x73,0x6F,0x74,0x70,0x5B,0x49,0x49, +0x60,0x79,0x84,0x7D,0x73,0x78,0x7B,0x81,0x87,0x78,0x66,0x67,0x6D,0x6D,0x71,0x7E, +0x86,0x8B,0x95,0xA5,0xAD,0xAF,0xA8,0x99,0x8D,0x83,0x80,0x83,0x7E,0x7C,0x7E,0x7B, +0x75,0x71,0x71,0x71,0x69,0x62,0x6B,0x76,0x79,0x72,0x6A,0x74,0x7B,0x79,0x7B,0x85, +0x99,0xA3,0xA0,0x99,0x8F,0x8C,0x8A,0x89,0x87,0x7D,0x78,0x7F,0x88,0x95,0x9E,0x9A, +0x91,0x91,0x95,0x99,0x91,0x82,0x86,0x82,0x76,0x76,0x81,0x8A,0x87,0x7B,0x7C,0x7B, +0x6B,0x65,0x6F,0x72,0x77,0x7F,0x6C,0x54,0x5C,0x78,0x81,0x76,0x76,0x79,0x71,0x6A, +0x6D,0x79,0x81,0x77,0x75,0x8C,0x9B,0x99,0x9D,0xA7,0xA8,0xA4,0xA0,0xA1,0x9E,0x8B, +0x6F,0x63,0x6C,0x74,0x77,0x72,0x66,0x67,0x6E,0x73,0x7A,0x80,0x81,0x75,0x71,0x85, +0x88,0x77,0x73,0x7E,0x82,0x82,0x83,0x7E,0x8C,0x9D,0x9A,0xA2,0xA6,0x9D,0x96,0x90, +0x8B,0x8B,0x92,0x91,0x8F,0x9C,0xA6,0xAA,0xAB,0xA8,0x9F,0x93,0x83,0x70,0x64,0x60, +0x65,0x74,0x81,0x80,0x7C,0x7D,0x7B,0x80,0x7C,0x78,0x82,0x89,0x80,0x6B,0x62,0x72, +0x7E,0x82,0x83,0x7B,0x6E,0x6E,0x77,0x83,0x8A,0x8E,0x87,0x79,0x7C,0x89,0x89,0x83, +0x79,0x6C,0x61,0x64,0x72,0x7E,0x8C,0x92,0x82,0x6A,0x5F,0x64,0x6C,0x70,0x64,0x57, +0x63,0x76,0x85,0x91,0x93,0x7F,0x70,0x75,0x78,0x7C,0x81,0x7D,0x7C,0x80,0x7F,0x90, +0xA3,0xA0,0x98,0x99,0x95,0x86,0x7F,0x77,0x69,0x5F,0x61,0x69,0x6F,0x72,0x75,0x7A, +0x7E,0x74,0x69,0x6A,0x6B,0x70,0x7E,0x82,0x73,0x6F,0x84,0x9D,0xAA,0xAD,0xAA,0xA0, +0x96,0x88,0x75,0x6C,0x6A,0x5D,0x5B,0x64,0x72,0x7D,0x7F,0x78,0x75,0x77,0x70,0x68, +0x6D,0x73,0x73,0x73,0x70,0x79,0x81,0x7F,0x7E,0x88,0x91,0x89,0x7C,0x87,0x91,0x82, +0x74,0x7D,0x8D,0x92,0x8B,0x94,0x9E,0x9D,0x9B,0x9B,0xAC,0xB0,0x90,0x7A,0x86,0x8B, +0x84,0x7C,0x65,0x54,0x57,0x62,0x70,0x7D,0x81,0x78,0x72,0x6C,0x6B,0x6E,0x71,0x75, +0x76,0x6C,0x69,0x72,0x7A,0x8C,0xA0,0xAF,0xAF,0x9A,0x8F,0x89,0x7F,0x7A,0x7F,0x84, +0x83,0x82,0x80,0x80,0x8C,0xA3,0xB9,0xC5,0xC2,0xAE,0xA3,0xA5,0x99,0x8C,0x8F,0x8B, +0x8C,0x98,0x97,0x8B,0x86,0x81,0x6D,0x68,0x6F,0x72,0x6E,0x62,0x60,0x6E,0x74,0x7B, +0x84,0x7E,0x7B,0x89,0x97,0x96,0x90,0x87,0x84,0x89,0x83,0x7B,0x7A,0x71,0x74,0x7E, +0x7F,0x86,0x90,0x9B,0x9D,0x8F,0x8B,0x8E,0x94,0x92,0x7F,0x72,0x72,0x75,0x6F,0x6B, +0x77,0x7B,0x64,0x57,0x62,0x60,0x57,0x52,0x53,0x60,0x5D,0x51,0x59,0x60,0x5D,0x70, +0x80,0x7C,0x72,0x74,0x6E,0x5D,0x64,0x6E,0x70,0x81,0x93,0x97,0x93,0x96,0xA1,0xA9, +0xAB,0xA5,0xAB,0xAF,0x9E,0x96,0x93,0x86,0x7E,0x82,0x87,0x84,0x7C,0x7F,0x80,0x81, +0x86,0x82,0x76,0x77,0x7E,0x7B,0x73,0x71,0x70,0x72,0x7A,0x7C,0x8B,0x9A,0x9B,0x92, +0x86,0x86,0x8C,0x8C,0x8B,0x8E,0x91,0x90,0x99,0xA0,0x92,0x7C,0x81,0x93,0x95,0x88, +0x7A,0x7A,0x7A,0x73,0x6A,0x66,0x68,0x6C,0x72,0x6C,0x67,0x6B,0x71,0x86,0x98,0x87, +0x6B,0x6F,0x85,0x8C,0x87,0x76,0x66,0x6D,0x6D,0x6A,0x7A,0x82,0x7D,0x79,0x74,0x6C, +0x69,0x69,0x6D,0x75,0x7D,0x7B,0x78,0x82,0x86,0x7F,0x80,0x8A,0x86,0x7B,0x7F,0x84, +0x7A,0x72,0x72,0x73,0x71,0x6E,0x62,0x51,0x4E,0x54,0x66,0x75,0x72,0x6E,0x70,0x6D, +0x77,0x8F,0x92,0x8A,0x9A,0xA8,0xA3,0xAB,0xB7,0xB6,0xAC,0xA1,0x99,0x9D,0xA8,0xA2, +0x8E,0x84,0x87,0x89,0x7F,0x72,0x62,0x5F,0x71,0x81,0x7F,0x7A,0x7B,0x7D,0x81,0x82, +0x89,0x93,0x9C,0x9A,0x89,0x7B,0x7F,0x89,0x90,0x85,0x75,0x7F,0x8A,0x8E,0x87,0x85, +0x8E,0x84,0x76,0x78,0x81,0x87,0x85,0x88,0x86,0x75,0x67,0x63,0x71,0x83,0x85,0x82, +0x8D,0x8F,0x82,0x85,0x8A,0x7B,0x6E,0x70,0x78,0x7D,0x75,0x67,0x6C,0x7A,0x89,0x95, +0x87,0x6F,0x65,0x6F,0x80,0x8F,0x8D,0x84,0x84,0x88,0x8D,0x91,0x93,0x98,0xA0,0xA8, +0xAA,0x9F,0x97,0x8E,0x78,0x72,0x7D,0x78,0x75,0x7D,0x85,0x7F,0x7D,0x8A,0x7E,0x6E, +0x7A,0x87,0x88,0x82,0x7E,0x85,0x8E,0x90,0x8D,0x91,0x99,0xA1,0xA0,0x96,0x9A,0x99, +0x8E,0x7F,0x76,0x77,0x6C,0x67,0x6F,0x77,0x7D,0x7B,0x74,0x78,0x70,0x66,0x6E,0x7D, +0x85,0x7A,0x67,0x67,0x79,0x86,0x88,0x85,0x80,0x7F,0x75,0x6C,0x6F,0x73,0x79,0x76, +0x67,0x67,0x73,0x7A,0x69,0x58,0x65,0x75,0x7E,0x8B,0x86,0x7C,0x82,0x86,0x83,0x7C, +0x7B,0x7B,0x7D,0x81,0x7F,0x6D,0x5A,0x5D,0x63,0x62,0x60,0x60,0x5B,0x5F,0x74,0x87, +0x9B,0x99,0x86,0x8C,0xAD,0xB1,0x9F,0x97,0x8B,0x80,0x85,0x8A,0x89,0x7F,0x7D,0x7E, +0x79,0x7B,0x71,0x5C,0x62,0x73,0x71,0x69,0x76,0x89,0x86,0x7A,0x73,0x76,0x79,0x74, +0x78,0x86,0x91,0x85,0x6A,0x67,0x76,0x85,0x8C,0x91,0x97,0x91,0x91,0x95,0x95,0xA0, +0x9F,0x99,0x9F,0xA2,0xA2,0x9B,0x9A,0x9C,0x94,0x82,0x70,0x74,0x7A,0x72,0x69,0x70, +0x7C,0x78,0x80,0x89,0x7D,0x73,0x76,0x79,0x74,0x66,0x60,0x6B,0x79,0x7F,0x84,0x8D, +0x97,0x9C,0x9B,0x8A,0x79,0x77,0x71,0x6B,0x6F,0x7C,0x88,0x8E,0xA2,0xB4,0xAE,0x9E, +0x8D,0x82,0x7F,0x7B,0x80,0x7F,0x7F,0x80,0x7D,0x84,0x85,0x79,0x71,0x68,0x63,0x5F, +0x57,0x4C,0x4D,0x5C,0x63,0x68,0x69,0x69,0x73,0x78,0x7E,0x8C,0x92,0x98,0x99,0x99, +0x9E,0xA7,0xB0,0xA9,0xA6,0xAA,0xA9,0xAF,0xAD,0xA2,0x97,0x8C,0x81,0x77,0x78,0x75, +0x6D,0x6D,0x74,0x7C,0x84,0x8B,0x83,0x72,0x76,0x85,0x86,0x79,0x70,0x70,0x70,0x77, +0x7E,0x81,0x88,0x8D,0x87,0x83,0x83,0x84,0x8E,0x99,0x9A,0x97,0x8B,0x81,0x86,0x8F, +0x8E,0x88,0x92,0x9E,0xA4,0x99,0x81,0x7D,0x7B,0x67,0x53,0x50,0x53,0x55,0x5B,0x5F, +0x5E,0x5E,0x5F,0x63,0x68,0x6A,0x60,0x62,0x77,0x77,0x6B,0x74,0x84,0x8F,0x93,0x97, +0x96,0x8A,0x7A,0x80,0x9A,0xA2,0x99,0x98,0x9C,0x8E,0x81,0x85,0x8D,0x97,0x9E,0x9F, +0x8E,0x7E,0x76,0x70,0x78,0x8B,0x8F,0x80,0x75,0x67,0x56,0x4E,0x4A,0x54,0x65,0x6D, +0x74,0x77,0x6E,0x68,0x7C,0x98,0xA3,0xA4,0xA3,0x95,0x86,0x87,0x91,0x9F,0xA6,0x95, +0x78,0x6E,0x71,0x71,0x71,0x70,0x6E,0x6C,0x6F,0x76,0x84,0x96,0x8E,0x84,0x84,0x7E, +0x7A,0x71,0x64,0x6A,0x73,0x77,0x7D,0x87,0x92,0x8A,0x6F,0x61,0x66,0x73,0x75,0x6B, +0x64,0x6C,0x77,0x7E,0x78,0x73,0x7D,0x84,0x89,0x8A,0x89,0x88,0x84,0x7B,0x7A,0x7F, +0x86,0x8F,0x9A,0x9B,0x8A,0x74,0x79,0x8F,0x97,0x91,0x80,0x73,0x6F,0x72,0x75,0x77, +0x81,0x84,0x7F,0x7B,0x76,0x78,0x8D,0xA3,0xA0,0x94,0x8B,0x80,0x76,0x67,0x5F,0x5C, +0x63,0x6E,0x6F,0x7A,0x91,0x9A,0x95,0x96,0xA2,0xAE,0x9C,0x8B,0x9D,0xA2,0x96,0x8F, +0x8C,0x8F,0x84,0x7F,0x81,0x75,0x66,0x5E,0x63,0x68,0x66,0x68,0x70,0x7E,0x84,0x7E, +0x77,0x75,0x82,0x88,0x94,0xAB,0xAE,0xA4,0x9A,0x91,0x88,0x84,0x89,0x91,0x8C,0x88, +0x8B,0x88,0x81,0x85,0x9A,0xA3,0x98,0x8B,0x82,0x92,0xAB,0xA9,0x95,0x87,0x74,0x65, +0x6A,0x76,0x7B,0x7E,0x7B,0x7B,0x79,0x7F,0x83,0x80,0x7A,0x67,0x63,0x66,0x67,0x7B, +0x7D,0x72,0x78,0x88,0x8D,0x7B,0x76,0x7F,0x7E,0x76,0x75,0x7A,0x86,0x91,0x94,0x8F, +0x87,0x87,0x8A,0x88,0x82,0x7E,0x7D,0x76,0x70,0x73,0x80,0x80,0x78,0x67,0x56,0x68, +0x82,0x88,0x7A,0x6F,0x72,0x7A,0x86,0x88,0x82,0x7C,0x7E,0x7A,0x6A,0x56,0x54,0x65, +0x74,0x8C,0x96,0x8A,0x87,0x93,0x9E,0x9F,0x9D,0x9B,0x94,0x8D,0x8F,0x87,0x78,0x6C, +0x6A,0x71,0x7D,0x84,0x86,0x82,0x6E,0x63,0x6C,0x7A,0x7A,0x6A,0x6D,0x83,0x86,0x79, +0x6F,0x75,0x86,0x96,0x9D,0x96,0x83,0x75,0x6D,0x65,0x62,0x69,0x75,0x81,0x8E,0x94, +0x8A,0x77,0x79,0x7F,0x76,0x71,0x70,0x7B,0x89,0x8D,0x8B,0x81,0x7C,0x7E,0x74,0x5F, +0x55,0x51,0x58,0x67,0x6D,0x71,0x72,0x7B,0x8B,0x93,0x8F,0x81,0x80,0x8E,0x87,0x7F, +0x81,0x85,0x8E,0x9B,0xB0,0xAC,0x94,0x93,0x99,0x8E,0x75,0x64,0x5C,0x57,0x57,0x61, +0x70,0x77,0x7D,0x87,0x8D,0x89,0x83,0x91,0xA1,0x97,0x8B,0x91,0x9B,0x98,0x9E,0xA4, +0xA5,0xA8,0x9D,0x84,0x70,0x6B,0x76,0x7C,0x89,0x97,0x95,0x92,0x8C,0x93,0x94,0x76, +0x6A,0x71,0x75,0x71,0x6B,0x69,0x6E,0x80,0x95,0x8B,0x72,0x71,0x7A,0x83,0x8B,0x91, +0x9C,0x9D,0x8B,0x86,0x8F,0x88,0x77,0x74,0x78,0x84,0x8F,0x8E,0x8B,0x96,0x9D,0x9D, +0x9C,0x96,0x98,0x92,0x82,0x6F,0x61,0x59,0x53,0x5E,0x69,0x62,0x60,0x67,0x6E,0x6F, +0x67,0x66,0x65,0x63,0x6A,0x6E,0x76,0x80,0x8A,0x93,0x9A,0x98,0x96,0x9C,0x99,0x91, +0x8C,0x83,0x80,0x81,0x81,0x81,0x8A,0x93,0x8F,0x87,0x84,0x78,0x77,0x85,0x91,0x99, +0x99,0x8E,0x77,0x62,0x55,0x57,0x74,0x82,0x72,0x6D,0x70,0x73,0x80,0x8C,0x8D,0x93, +0x93,0x88,0x7D,0x7C,0x87,0x99,0x9C,0x93,0x91,0x91,0x92,0x9D,0xAE,0xAD,0x9B,0x8B, +0x7C,0x71,0x6A,0x62,0x69,0x6E,0x77,0x80,0x87,0x8D,0x80,0x70,0x6B,0x6D,0x76,0x7C, +0x7B,0x78,0x73,0x6F,0x66,0x5E,0x5E,0x5E,0x62,0x67,0x65,0x5D,0x62,0x75,0x7E,0x7D, +0x76,0x76,0x7F,0x82,0x8A,0x92,0xA3,0xAE,0xAB,0xA4,0x94,0x91,0x96,0x83,0x6F,0x72, +0x7D,0x83,0x8D,0x90,0x7B,0x66,0x60,0x5B,0x62,0x78,0x7A,0x6F,0x66,0x61,0x6F,0x89, +0x8C,0x84,0x7D,0x68,0x58,0x5F,0x63,0x68,0x74,0x84,0x93,0x9B,0x92,0x88,0x8F,0x9F, +0x9E,0x97,0x95,0x97,0x8C,0x7E,0x79,0x85,0x8A,0x80,0x87,0x93,0x8F,0x89,0x83,0x76, +0x6A,0x63,0x5E,0x54,0x52,0x5F,0x6E,0x80,0x83,0x8A,0x99,0x95,0x8C,0x8D,0x89,0x85, +0x83,0x7E,0x88,0x91,0x92,0x9E,0x9B,0x93,0x95,0x8D,0x85,0x7D,0x7D,0x82,0x7D,0x7B, +0x6E,0x5E,0x6C,0x79,0x81,0x8C,0x89,0x75,0x6F,0x87,0x96,0x91,0x99,0x95,0x87,0x80, +0x75,0x6C,0x6B,0x6B,0x68,0x6A,0x71,0x78,0x78,0x77,0x79,0x7E,0x8B,0x94,0x98,0x91, +0x89,0x82,0x89,0xA3,0xAF,0xAF,0xAF,0xAB,0xA1,0x8F,0x7D,0x81,0x84,0x81,0x7B,0x82, +0x7F,0x77,0x78,0x84,0x84,0x79,0x63,0x5F,0x74,0x72,0x72,0x82,0x92,0x94,0x91,0x8E, +0x88,0x8A,0x94,0x8C,0x83,0x8C,0x93,0x99,0x9F,0x98,0x8D,0x91,0x99,0x9E,0x93,0x7D, +0x72,0x7E,0x87,0x7C,0x7B,0x7B,0x82,0x85,0x79,0x68,0x66,0x68,0x6D,0x70,0x73,0x7A, +0x71,0x67,0x65,0x6D,0x6B,0x65,0x6E,0x7C,0x7F,0x82,0x6F,0x5E,0x69,0x7C,0x84,0x7A, +0x7F,0x7E,0x76,0x7A,0x8C,0x97,0x89,0x66,0x61,0x71,0x79,0x84,0x86,0x81,0x7A,0x7E, +0x78,0x6B,0x6C,0x79,0x80,0x87,0x87,0x85,0x8F,0x93,0x83,0x81,0x83,0x82,0x84,0x76, +0x6C,0x6C,0x69,0x65,0x68,0x66,0x6D,0x7B,0x84,0x82,0x80,0x7F,0x80,0x87,0x7F,0x76, +0x79,0x86,0x8E,0x81,0x75,0x7C,0x8B,0x95,0x88,0x79,0x85,0x92,0x8D,0x8E,0x91,0x8B, +0x9D,0xA9,0xA5,0xAE,0xAE,0xA2,0x9B,0x98,0x8D,0x7E,0x79,0x73,0x6D,0x68,0x61,0x71, +0x80,0x75,0x59,0x4E,0x51,0x50,0x56,0x65,0x71,0x79,0x6E,0x65,0x7D,0x89,0x85,0x86, +0x87,0x92,0x9D,0xA4,0x99,0x7B,0x63,0x66,0x7C,0x88,0x87,0x83,0x80,0x7F,0x83,0x88, +0x81,0x78,0x6F,0x6D,0x69,0x60,0x74,0x88,0x8F,0x91,0x97,0x9D,0x9C,0x90,0x94,0x91, +0x7E,0x6E,0x74,0x80,0x7B,0x78,0x78,0x84,0x8A,0x88,0x8B,0x93,0x91,0x90,0x97,0x9A, +0x9D,0xA2,0xA5,0x94,0x83,0x85,0x91,0x8F,0x8D,0x8E,0x92,0x91,0x83,0x73,0x70,0x74, +0x76,0x76,0x76,0x6B,0x66,0x68,0x69,0x83,0x8C,0x8B,0x8A,0x7B,0x78,0x85,0x84,0x79, +0x68,0x6B,0x7D,0x84,0x8E,0x8B,0x86,0x8C,0x98,0xA3,0xA0,0x94,0x8B,0x72,0x6D,0x75, +0x72,0x79,0x8A,0x8E,0x82,0x70,0x6B,0x6F,0x79,0x70,0x66,0x72,0x7B,0x81,0x81,0x8C, +0x8E,0x80,0x72,0x6E,0x75,0x7C,0x81,0x7A,0x70,0x7A,0x84,0x86,0x7F,0x80,0x89,0x87, +0x81,0x79,0x7E,0x89,0x8D,0x85,0x7B,0x78,0x7B,0x78,0x75,0x78,0x7F,0x8A,0x8A,0x81, +0x7D,0x81,0x8C,0x82,0x74,0x78,0x81,0x86,0x89,0x84,0x85,0x83,0x67,0x53,0x61,0x75, +0x71,0x6A,0x6A,0x71,0x85,0x8C,0x92,0x9A,0x9F,0xA0,0x9D,0x9C,0x9B,0xA0,0xA3,0x9D, +0x97,0x8C,0x81,0x7E,0x7F,0x73,0x66,0x64,0x6C,0x6C,0x74,0x8A,0x93,0x8A,0x76,0x76, +0x83,0x75,0x6C,0x81,0x8A,0x84,0x86,0x93,0x9E,0x9D,0x99,0x8E,0x82,0x7A,0x6D,0x69, +0x68,0x61,0x57,0x57,0x5A,0x6A,0x7B,0x7B,0x7C,0x83,0x8A,0x87,0x80,0x7C,0x72,0x6D, +0x6E,0x70,0x7B,0x86,0x8C,0x90,0x83,0x67,0x68,0x74,0x6C,0x63,0x61,0x61,0x77,0x82, +0x78,0x76,0x74,0x79,0x7D,0x73,0x7D,0x8F,0x93,0x8B,0x71,0x5F,0x6E,0x84,0x94,0x9B, +0x95,0x7F,0x6A,0x68,0x7B,0x90,0x96,0x96,0xA2,0xA9,0xA6,0x96,0x92,0x9D,0x92,0x8B, +0x90,0x91,0x88,0x7E,0x7C,0x87,0x90,0x87,0x7F,0x7D,0x77,0x75,0x79,0x67,0x65,0x76, +0x7D,0x79,0x81,0x92,0x9C,0xA0,0xA0,0x98,0x8A,0x80,0x73,0x77,0x7B,0x75,0x7E,0x95, +0x97,0x88,0x83,0x8E,0x85,0x73,0x73,0x7B,0x85,0x7D,0x65,0x5B,0x78,0x94,0x9A,0x98, +0x94,0x8D,0x89,0x88,0x80,0x7B,0x72,0x66,0x66,0x7D,0x89,0x77,0x71,0x6D,0x75,0x8C, +0x8D,0x8A,0x8D,0x92,0x94,0x94,0x94,0x94,0x98,0x96,0x88,0x78,0x79,0x72,0x67,0x69, +0x65,0x6B,0x7D,0x80,0x71,0x72,0x74,0x6D,0x6D,0x7A,0x7C,0x7B,0x80,0x7F,0x82,0x93, +0xA7,0xA5,0xA4,0xB0,0xB1,0x9A,0x83,0x79,0x72,0x6F,0x73,0x74,0x79,0x84,0x87,0x7F, +0x7C,0x82,0x82,0x85,0x8D,0x94,0x87,0x78,0x73,0x73,0x72,0x78,0x85,0x93,0xAE,0xBC, +0xA8,0x87,0x7B,0x7E,0x6C,0x60,0x64,0x58,0x4A,0x60,0x7B,0x7B,0x7A,0x78,0x6E,0x6F, +0x82,0x85,0x7D,0x6F,0x55,0x5B,0x76,0x81,0x70,0x60,0x62,0x61,0x6A,0x76,0x7B,0x88, +0x8A,0x7C,0x71,0x6D,0x8C,0xAC,0x9F,0x84,0x85,0x95,0x8D,0x8D,0x98,0x96,0x8D,0x7C, +0x6A,0x5A,0x53,0x57,0x61,0x67,0x5E,0x5D,0x6A,0x7C,0x86,0x88,0x86,0x88,0x8B,0x86, +0x8B,0x9A,0x8F,0x7A,0x72,0x78,0x7F,0x80,0x7E,0x7D,0x8D,0x9E,0x9A,0x8E,0x80,0x7B, +0x7E,0x81,0x8B,0x92,0x95,0x92,0x87,0x83,0x81,0x84,0x8A,0x8F,0x8C,0x74,0x67,0x77, +0x80,0x87,0x96,0xAA,0xB3,0x9F,0x8B,0x7E,0x77,0x71,0x7B,0x85,0x80,0x7E,0x8C,0xA4, +0xAF,0xA9,0xA5,0xA0,0x90,0x76,0x69,0x75,0x7C,0x7D,0x78,0x6B,0x76,0x89,0x98,0x99, +0x87,0x79,0x72,0x72,0x6D,0x6A,0x6C,0x61,0x6C,0x7F,0x81,0x79,0x73,0x73,0x6E,0x63, +0x59,0x52,0x5E,0x77,0x77,0x6A,0x63,0x75,0x89,0x8E,0x8F,0x8A,0x83,0x79,0x83,0x93, +0x93,0x82,0x76,0x81,0x8F,0x99,0x94,0x75,0x62,0x6B,0x81,0x94,0x89,0x80,0x87,0x80, +0x78,0x7D,0x7A,0x7C,0x83,0x7C,0x6B,0x61,0x6A,0x7A,0x83,0x87,0x8B,0xA1,0xA8,0x98, +0x8D,0x89,0x84,0x7C,0x6D,0x6A,0x7A,0x86,0x92,0xA9,0xAA,0x8E,0x7E,0x95,0xA2,0x89, +0x79,0x79,0x82,0x90,0x8F,0x7F,0x7F,0x8E,0x9C,0xA6,0x99,0x85,0x84,0x7F,0x77,0x79, +0x79,0x71,0x66,0x62,0x68,0x70,0x76,0x71,0x6D,0x78,0x85,0x91,0x95,0x93,0x8D,0x8E, +0x98,0x8D,0x7A,0x7D,0x95,0x97,0x85,0x7F,0x82,0x7E,0x72,0x6D,0x7C,0x7E,0x6F,0x67, +0x63,0x67,0x71,0x7D,0x80,0x7A,0x85,0x9A,0xA6,0xA8,0x9D,0x87,0x81,0x85,0x80,0x71, +0x63,0x5D,0x5D,0x69,0x78,0x79,0x6C,0x71,0x78,0x76,0x7B,0x74,0x6C,0x74,0x8A,0x97, +0x8B,0x82,0x88,0x8F,0x91,0x88,0x86,0x88,0x7C,0x6A,0x6A,0x70,0x75,0x6B,0x70,0x82, +0x82,0x7D,0x81,0x81,0x7D,0x88,0x8D,0x8A,0x7E,0x70,0x75,0x7B,0x7F,0x7D,0x71,0x6D, +0x73,0x7A,0x8B,0x8F,0x82,0x8C,0xA5,0xAB,0xA9,0xA8,0x99,0x81,0x76,0x7A,0x7A,0x72, +0x70,0x76,0x7E,0x82,0x6F,0x61,0x68,0x6F,0x67,0x59,0x5A,0x53,0x4A,0x56,0x6B,0x6B, +0x68,0x7E,0x93,0x92,0x8E,0x90,0x8D,0x8C,0x8C,0x7F,0x7C,0x8F,0x8E,0x7D,0x7F,0x91, +0xA5,0xA7,0xA4,0x90,0x7C,0x7B,0x6B,0x61,0x6F,0x84,0x8C,0x82,0x76,0x7C,0x8B,0x94, +0x90,0x89,0x85,0x7C,0x76,0x78,0x84,0x82,0x77,0x7C,0x7F,0x74,0x69,0x75,0x84,0x81, +0x81,0x8E,0x9D,0xA5,0xA5,0xA7,0xA5,0x9B,0x93,0x90,0x97,0xA1,0x98,0x90,0x95,0x97, +0x91,0x86,0x7C,0x82,0x7D,0x68,0x60,0x61,0x6E,0x78,0x75,0x79,0x7F,0x82,0x8D,0x8E, +0x7E,0x75,0x86,0x96,0x97,0x8B,0x7E,0x85,0x87,0x86,0x8F,0x9B,0x95,0x84,0x7D,0x7F, +0x7C,0x70,0x73,0x82,0x81,0x7E,0x82,0x8A,0x92,0x98,0x9B,0x95,0x87,0x7F,0x80,0x7B, +0x79,0x78,0x67,0x5E,0x5C,0x67,0x7F,0x8A,0x75,0x56,0x57,0x61,0x61,0x5E,0x6D,0x77, +0x68,0x71,0x8C,0x93,0x8F,0x8A,0x90,0xA2,0x9C,0x78,0x62,0x5D,0x5C,0x62,0x6C,0x6E, +0x6E,0x71,0x7E,0x8E,0x96,0x9A,0x90,0x8B,0x8E,0x8D,0x87,0x78,0x6B,0x6E,0x87,0x9A, +0x9C,0x8E,0x7B,0x7D,0x81,0x70,0x5A,0x4D,0x48,0x59,0x66,0x64,0x74,0x8B,0x8B,0x87, +0x88,0x87,0x91,0x97,0x91,0x8E,0x8F,0x8E,0x8C,0x89,0x8A,0x90,0xA2,0xAC,0x9C,0x81, +0x7C,0x85,0x8B,0x93,0x93,0x88,0x7E,0x70,0x73,0x7C,0x74,0x73,0x78,0x7F,0x81,0x7A, +0x76,0x7A,0x7F,0x83,0x85,0x77,0x6E,0x69,0x64,0x6E,0x79,0x81,0x8A,0x94,0x8F,0x8A, +0x8D,0x94,0x96,0x98,0x90,0x79,0x70,0x7F,0x92,0x9F,0x96,0x88,0x7E,0x7F,0x7F,0x76, +0x6F,0x69,0x68,0x6B,0x6D,0x67,0x62,0x72,0x8B,0x8D,0x77,0x6C,0x7D,0x86,0x82,0x72, +0x63,0x66,0x6D,0x71,0x7D,0x8F,0x9D,0x98,0x8A,0x86,0x87,0x86,0x84,0x7D,0x7D,0x7D, +0x79,0x7D,0x89,0x8E,0x88,0x8E,0x9D,0xA3,0x97,0x83,0x6E,0x62,0x6A,0x73,0x73,0x6D, +0x68,0x66,0x5C,0x5A,0x68,0x76,0x80,0x85,0x7E,0x7C,0x7C,0x7D,0x88,0x95,0x8D,0x84, +0x7D,0x7D,0x9C,0xB8,0xB8,0xAB,0xA6,0xA3,0x92,0x8A,0x85,0x7A,0x69,0x51,0x52,0x6E, +0x84,0x8F,0x92,0x90,0x95,0x9F,0xA1,0x93,0x7B,0x6B,0x7D,0x97,0x87,0x6B,0x6E,0x73, +0x73,0x70,0x74,0x71,0x6C,0x71,0x70,0x72,0x76,0x85,0x97,0x8A,0x7D,0x88,0x90,0x92, +0x98,0x9F,0x9E,0x91,0x89,0x85,0x82,0x7F,0x7C,0x8B,0x8D,0x84,0x7D,0x7F,0x7F,0x80, +0x8D,0x96,0x8E,0x80,0x7B,0x76,0x6E,0x73,0x77,0x7A,0x76,0x6A,0x64,0x5F,0x68,0x78, +0x80,0x78,0x7A,0x88,0x93,0xA9,0xAD,0x91,0x74,0x78,0x87,0x8A,0x82,0x75,0x76,0x83, +0x84,0x7B,0x75,0x7A,0x7A,0x7A,0x79,0x79,0x76,0x6C,0x6C,0x78,0x7C,0x7E,0x88,0x8D, +0x8D,0x89,0x7E,0x79,0x77,0x7A,0x84,0x8B,0x92,0x89,0x8A,0x9A,0x95,0x89,0x89,0x90, +0x8D,0x80,0x7E,0x92,0x98,0x85,0x76,0x72,0x6E,0x70,0x77,0x7C,0x78,0x72,0x69,0x5B, +0x5E,0x70,0x7D,0x7C,0x80,0x79,0x6D,0x74,0x78,0x75,0x75,0x7A,0x77,0x65,0x5B,0x5E, +0x6B,0x6F,0x61,0x63,0x79,0x89,0x8D,0x84,0x83,0x88,0x85,0x8C,0x93,0x89,0x85,0x8B, +0x8F,0x86,0x74,0x76,0x77,0x6C,0x68,0x6E,0x73,0x78,0x7B,0x7F,0x76,0x6E,0x77,0x81, +0x88,0x8C,0x8D,0x8E,0x92,0x91,0x93,0x9F,0x9F,0x8E,0x75,0x72,0x77,0x7A,0x7E,0x80, +0x8E,0x93,0x93,0x94,0x93,0x90,0x8B,0x88,0x86,0x88,0x8C,0x8E,0x8C,0x8C,0x96,0x95, +0x89,0x87,0x80,0x6E,0x6D,0x72,0x6B,0x70,0x79,0x83,0x91,0x86,0x78,0x83,0x8E,0x8A, +0x86,0x92,0x9A,0x8F,0x8E,0x90,0x84,0x81,0x78,0x65,0x65,0x78,0x84,0x93,0x94,0x89, +0x92,0x91,0x7E,0x7B,0x87,0x88,0x87,0x87,0x7C,0x6E,0x73,0x7B,0x83,0x83,0x74,0x73, +0x7F,0x80,0x77,0x78,0x80,0x8B,0x8A,0x77,0x6A,0x6C,0x7B,0x81,0x87,0x96,0x9C,0x99, +0x98,0x98,0x91,0x88,0x78,0x6C,0x67,0x63,0x66,0x6E,0x79,0x87,0x90,0x8A,0x85,0x85, +0x83,0x76,0x6D,0x61,0x5C,0x68,0x83,0x9B,0x95,0x85,0x7E,0x88,0x90,0x84,0x6E,0x6D, +0x71,0x75,0x75,0x73,0x7E,0x8D,0x99,0x9C,0x99,0x9B,0x99,0x95,0x8F,0x81,0x75,0x79, +0x7F,0x78,0x67,0x59,0x5A,0x67,0x7A,0x77,0x70,0x7D,0x85,0x83,0x86,0x85,0x80,0x7B, +0x75,0x70,0x75,0x7E,0x86,0x92,0x94,0x8D,0x83,0x7B,0x83,0x8D,0x86,0x72,0x76,0x87, +0x90,0x9E,0x9D,0x91,0x8C,0x83,0x7E,0x75,0x6B,0x62,0x52,0x53,0x63,0x64,0x5D,0x5F, +0x5B,0x58,0x68,0x79,0x7E,0x86,0x91,0x8E,0x83,0x8A,0x9A,0xA4,0xA0,0x95,0x87,0x86, +0x8E,0x95,0x92,0x7D,0x7B,0x89,0x86,0x76,0x6E,0x77,0x8C,0x8B,0x82,0x87,0x82,0x7D, +0x7D,0x7D,0x7C,0x6F,0x70,0x82,0x81,0x76,0x6F,0x71,0x75,0x78,0x78,0x78,0x82,0x88, +0x8D,0x8F,0x93,0x97,0x8C,0x86,0x8D,0x8C,0x8F,0x94,0x92,0x8E,0x8F,0x99,0xA9,0xA5, +0x8F,0x77,0x64,0x67,0x70,0x72,0x69,0x6A,0x73,0x74,0x74,0x81,0x8E,0x88,0x7F,0x7D, +0x79,0x75,0x76,0x79,0x79,0x79,0x7D,0x84,0x8F,0x8C,0x88,0x8C,0x87,0x7B,0x7A,0x7E, +0x7E,0x7D,0x79,0x81,0x93,0x91,0x83,0x87,0x8C,0x81,0x71,0x7E,0x87,0x72,0x5E,0x60, +0x6E,0x77,0x76,0x7B,0x7F,0x77,0x6F,0x75,0x86,0x90,0x90,0x7E,0x66,0x66,0x70,0x7E, +0x88,0x82,0x80,0x87,0x96,0x96,0x8D,0x8B,0x92,0x95,0x91,0x96,0x91,0x85,0x76,0x6F, +0x76,0x7E,0x84,0x86,0x85,0x85,0x87,0x8A,0x8C,0x88,0x85,0x80,0x78,0x76,0x78,0x7B, +0x76,0x6E,0x73,0x7E,0x90,0x8D,0x78,0x70,0x77,0x7F,0x7F,0x80,0x81,0x88,0x92,0x8D, +0x95,0xAD,0xAD,0x9D,0x9D,0x9D,0x95,0x95,0x8A,0x76,0x71,0x79,0x82,0x84,0x82,0x81, +0x75,0x6C,0x70,0x6E,0x70,0x7C,0x8B,0x86,0x71,0x6C,0x73,0x81,0x8B,0x7F,0x7A,0x83, +0x8E,0x96,0x8D,0x7F,0x79,0x79,0x81,0x7E,0x76,0x7A,0x78,0x78,0x81,0x8C,0x92,0x83, +0x78,0x7C,0x79,0x70,0x74,0x84,0x8C,0x7D,0x76,0x7C,0x7E,0x72,0x6D,0x76,0x71,0x66, +0x6D,0x71,0x75,0x76,0x6B,0x6B,0x70,0x6C,0x67,0x70,0x7E,0x8A,0x95,0x94,0x7E,0x79, +0x83,0x83,0x7D,0x7D,0x81,0x7D,0x82,0x89,0x85,0x8A,0x8B,0x7B,0x7B,0x7F,0x6F,0x74, +0x7A,0x74,0x80,0x92,0x8E,0x80,0x85,0x8F,0x8F,0x8D,0x82,0x73,0x71,0x79,0x77,0x70, +0x71,0x7A,0x76,0x76,0x82,0x7F,0x6F,0x62,0x62,0x71,0x77,0x7B,0x82,0x7C,0x78,0x7F, +0x88,0x8D,0x8A,0x7A,0x73,0x89,0x98,0x8F,0x8F,0x96,0x98,0x91,0x87,0x88,0x8B,0x8B, +0x88,0x7D,0x79,0x7C,0x77,0x7E,0x8E,0x86,0x76,0x77,0x7F,0x86,0x8E,0x93,0x99,0x8D, +0x75,0x6F,0x75,0x71,0x6F,0x75,0x7B,0x80,0x8F,0x91,0x80,0x70,0x7A,0x81,0x85,0x93, +0x9E,0x94,0x87,0x82,0x8E,0xA4,0xA7,0x9E,0x94,0x7E,0x77,0x80,0x71,0x75,0x80,0x86, +0x90,0x92,0x91,0x8F,0x8F,0x90,0x83,0x82,0x91,0x90,0x97,0x87,0x6B,0x6D,0x74,0x6E, +0x65,0x75,0x8C,0x92,0x94,0x83,0x79,0x80,0x7B,0x79,0x75,0x72,0x6B,0x66,0x6F,0x81, +0x91,0x9B,0x9C,0x9C,0x90,0x78,0x7E,0x7E,0x7D,0x75,0x75,0x77,0x64,0x65,0x7C,0x91, +0x9C,0x98,0x85,0x7A,0x6A,0x61,0x69,0x77,0x6F,0x61,0x6D,0x89,0x8D,0x84,0x7B,0x85, +0x96,0x8C,0x84,0x81,0x7B,0x70,0x6A,0x73,0x7A,0x78,0x72,0x6D,0x73,0x74,0x69,0x6A, +0x6E,0x66,0x64,0x79,0x83,0x88,0x8E,0x88,0x7B,0x7D,0x87,0x8F,0x88,0x7C,0x77,0x74, +0x72,0x6C,0x69,0x72,0x81,0x7E,0x73,0x6B,0x6F,0x7B,0x8D,0x9B,0x9C,0x9D,0x92,0x86, +0x86,0x8C,0x8D,0x97,0x9D,0x94,0x84,0x8A,0x8F,0x87,0x7B,0x7C,0x8B,0x92,0x81,0x6D, +0x74,0x85,0x8D,0x85,0x7C,0x86,0x94,0x9D,0x96,0x87,0x85,0x7A,0x6E,0x70,0x77,0x72, +0x68,0x7A,0x89,0x83,0x7F,0x83,0x8D,0x84,0x7B,0x8D,0x94,0x91,0x94,0x98,0x8B,0x81, +0x87,0x89,0x7E,0x76,0x75,0x74,0x74,0x6C,0x66,0x6F,0x7A,0x79,0x74,0x73,0x72,0x6D, +0x68,0x6C,0x7C,0x8D,0x99,0x9A,0x8F,0x8B,0x94,0x8D,0x77,0x74,0x7A,0x7B,0x7B,0x77, +0x74,0x6E,0x65,0x6F,0x81,0x87,0x82,0x7D,0x73,0x6F,0x6B,0x6F,0x7B,0x7C,0x7B,0x8F, +0x99,0x91,0x8F,0x94,0x8D,0x7A,0x74,0x81,0x88,0x87,0x86,0x8A,0x8A,0x8C,0x9A,0xA1, +0x8A,0x7C,0x7F,0x75,0x6E,0x6B,0x66,0x71,0x7F,0x79,0x71,0x7D,0x82,0x77,0x6D,0x71, +0x72,0x62,0x64,0x7B,0x86,0x81,0x81,0x83,0x80,0x7B,0x76,0x80,0x84,0x84,0x8F,0x9F, +0xA6,0xA5,0x9D,0x8D,0x8A,0x91,0x90,0x87,0x6F,0x62,0x76,0x8A,0x88,0x78,0x73,0x7E, +0x7D,0x7B,0x75,0x67,0x6B,0x7D,0x80,0x7A,0x83,0x90,0x93,0x97,0x9A,0x9A,0x92,0x84, +0x7F,0x79,0x7F,0x8C,0x8A,0x83,0x7E,0x7C,0x80,0x91,0x9F,0x9D,0x9B,0x9E,0x99,0x89, +0x7F,0x81,0x8A,0x8E,0x90,0x8F,0x89,0x8C,0x88,0x7E,0x7C,0x70,0x63,0x6A,0x74,0x6B, +0x68,0x6E,0x6F,0x67,0x67,0x78,0x84,0x80,0x83,0x8B,0x8F,0x91,0x94,0x99,0x9A,0x98, +0x93,0x83,0x73,0x6E,0x77,0x7B,0x77,0x76,0x7A,0x7E,0x80,0x84,0x84,0x82,0x7F,0x71, +0x68,0x72,0x7B,0x7B,0x79,0x78,0x7D,0x85,0x7F,0x74,0x70,0x64,0x56,0x57,0x62,0x65, +0x66,0x72,0x7F,0x84,0x86,0x82,0x85,0x8D,0x8A,0x80,0x7D,0x82,0x82,0x7E,0x83,0x88, +0x89,0x92,0x94,0x8B,0x7A,0x69,0x6A,0x7A,0x7D,0x71,0x76,0x81,0x7C,0x6E,0x65,0x70, +0x76,0x70,0x71,0x68,0x62,0x6B,0x76,0x80,0x86,0x85,0x89,0x8F,0x8D,0x83,0x8B,0x9C, +0xA2,0x9C,0x8E,0x88,0x82,0x84,0x89,0x93,0x9D,0x9B,0x95,0x94,0x90,0x87,0x86,0x82, +0x75,0x7B,0x78,0x73,0x73,0x67,0x64,0x70,0x78,0x78,0x7A,0x87,0x8A,0x84,0x8A,0x96, +0x98,0x95,0x98,0x97,0x84,0x77,0x7F,0x84,0x79,0x76,0x71,0x77,0x8A,0x91,0x8E,0x8C, +0x94,0x8F,0x7B,0x75,0x75,0x83,0x86,0x74,0x77,0x8C,0x90,0x8C,0x91,0x91,0x8F,0x90, +0x81,0x72,0x72,0x6F,0x6B,0x70,0x6A,0x63,0x73,0x83,0x7C,0x72,0x7A,0x82,0x7E,0x73, +0x6B,0x70,0x76,0x7E,0x87,0x8A,0x8A,0x89,0x8E,0x8F,0x90,0x98,0x91,0x7D,0x7B,0x8E, +0x99,0x95,0x8E,0x8B,0x92,0x90,0x7F,0x71,0x71,0x7D,0x7E,0x77,0x7D,0x8D,0x9A,0xA4, +0x9A,0x84,0x7E,0x83,0x80,0x75,0x68,0x60,0x60,0x67,0x70,0x70,0x6E,0x6C,0x73,0x7A, +0x7A,0x7C,0x88,0x9B,0x9A,0x8A,0x84,0x81,0x86,0x8C,0x86,0x87,0x8E,0x83,0x77,0x78, +0x75,0x6F,0x70,0x7F,0x7C,0x72,0x74,0x79,0x75,0x65,0x6E,0x80,0x82,0x82,0x75,0x6C, +0x71,0x70,0x6F,0x72,0x7B,0x82,0x7F,0x78,0x6F,0x72,0x83,0x88,0x83,0x84,0x89,0x86, +0x81,0x8A,0x8E,0x8B,0x88,0x8B,0x9B,0x9E,0x8D,0x83,0x82,0x86,0x81,0x70,0x6F,0x88, +0x8F,0x82,0x7A,0x77,0x81,0x91,0x94,0x91,0x8C,0x81,0x82,0x85,0x80,0x83,0x94,0x95, +0x87,0x83,0x8D,0x92,0x8D,0x87,0x7C,0x74,0x6C,0x6A,0x6E,0x75,0x73,0x82,0x93,0x8E, +0x8A,0x90,0x8E,0x88,0x87,0x81,0x84,0x8B,0x89,0x89,0x83,0x77,0x73,0x71,0x79,0x86, +0x8E,0x87,0x76,0x6E,0x6C,0x71,0x78,0x75,0x71,0x6E,0x63,0x68,0x7C,0x82,0x82,0x85, +0x88,0x82,0x82,0x83,0x77,0x67,0x60,0x5C,0x6C,0x7B,0x71,0x72,0x7A,0x7B,0x7E,0x84, +0x82,0x83,0x86,0x81,0x7B,0x79,0x83,0x93,0x9C,0x9D,0x91,0x86,0x89,0x8F,0x8C,0x7F, +0x71,0x6B,0x69,0x6C,0x6E,0x6F,0x75,0x6C,0x5D,0x62,0x7A,0x89,0x7C,0x71,0x87,0x9A, +0x9B,0x9C,0x9B,0x97,0x93,0x8D,0x87,0x87,0x8B,0x84,0x77,0x76,0x78,0x81,0x86,0x87, +0x86,0x7F,0x75,0x76,0x8A,0x9F,0xA0,0x92,0x87,0x8C,0x8F,0x88,0x87,0x8F,0x8F,0x8D, +0x8C,0x7C,0x6D,0x70,0x74,0x75,0x75,0x7A,0x89,0x90,0x86,0x7A,0x72,0x73,0x70,0x70, +0x73,0x7D,0x8A,0x92,0x99,0xA5,0xAC,0xA5,0x90,0x85,0x81,0x74,0x60,0x50,0x57,0x6A, +0x78,0x7E,0x89,0x8F,0x8F,0x8B,0x82,0x83,0x80,0x72,0x68,0x69,0x71,0x77,0x76,0x75, +0x7D,0x87,0x88,0x7A,0x75,0x7F,0x84,0x84,0x85,0x85,0x8B,0x96,0x97,0x86,0x7E,0x89, +0x97,0x99,0x8F,0x82,0x79,0x84,0x91,0x8B,0x7D,0x79,0x7A,0x74,0x6E,0x77,0x7D,0x73, +0x73,0x7E,0x88,0x8D,0x90,0x8C,0x7B,0x72,0x78,0x80,0x7E,0x7F,0x7E,0x79,0x7E,0x81, +0x80,0x7D,0x7B,0x84,0x98,0x9E,0x8D,0x7B,0x78,0x79,0x74,0x73,0x7D,0x88,0x83,0x77, +0x74,0x7A,0x89,0x8B,0x8A,0x8A,0x7D,0x74,0x78,0x7B,0x7D,0x7D,0x73,0x6C,0x71,0x75, +0x76,0x78,0x7E,0x7C,0x73,0x7A,0x7E,0x75,0x6E,0x70,0x7C,0x8A,0x8E,0x8B,0x81,0x7E, +0x76,0x7B,0x8C,0x8F,0x84,0x74,0x6D,0x72,0x79,0x7E,0x80,0x7E,0x85,0x8A,0x81,0x6F, +0x68,0x71,0x73,0x63,0x64,0x78,0x90,0x98,0x8F,0x83,0x81,0x8C,0x85,0x72,0x6C,0x68, +0x6A,0x76,0x80,0x85,0x86,0x85,0x86,0x85,0x84,0x91,0x93,0x7C,0x6E,0x73,0x78,0x79, +0x8C,0x94,0x8F,0x97,0xA2,0x9E,0x94,0x96,0x94,0x89,0x81,0x80,0x7D,0x89,0x93,0x8B, +0x80,0x7C,0x7E,0x7E,0x82,0x80,0x7E,0x81,0x80,0x76,0x66,0x70,0x86,0x7D,0x6B,0x70, +0x83,0x92,0x98,0x95,0x8E,0x91,0x91,0x92,0x95,0x96,0x8D,0x84,0x84,0x86,0x86,0x90, +0x9C,0x92,0x8B,0x93,0x89,0x75,0x6B,0x6B,0x6B,0x69,0x74,0x77,0x69,0x6C,0x79,0x76, +0x79,0x82,0x8A,0x88,0x76,0x62,0x61,0x6D,0x71,0x78,0x85,0x8F,0x8A,0x77,0x7A,0x8B, +0x87,0x81,0x7F,0x7E,0x7D,0x7F,0x7E,0x7D,0x80,0x83,0x8B,0x85,0x75,0x77,0x7A,0x75, +0x7D,0x8E,0x94,0x8A,0x78,0x75,0x7E,0x83,0x84,0x71,0x64,0x6F,0x76,0x7C,0x8B,0x8A, +0x7E,0x88,0x91,0x82,0x76,0x78,0x79,0x74,0x76,0x78,0x79,0x85,0x8E,0x82,0x83,0x90, +0x83,0x6C,0x6D,0x78,0x78,0x7A,0x83,0x87,0x8E,0x93,0x97,0x91,0x84,0x94,0x9F,0x94, +0x82,0x78,0x7A,0x7A,0x7E,0x8B,0x93,0x8D,0x8D,0x90,0x82,0x74,0x77,0x7E,0x7F,0x78, +0x6C,0x72,0x84,0x7E,0x6C,0x69,0x7D,0x8B,0x80,0x74,0x71,0x82,0x8B,0x83,0x72,0x72, +0x88,0x9E,0xA4,0x97,0x86,0x7E,0x7D,0x77,0x72,0x74,0x76,0x78,0x79,0x7D,0x8D,0x8D, +0x8D,0x89,0x7C,0x7B,0x79,0x6D,0x73,0x7F,0x85,0x82,0x77,0x75,0x79,0x7B,0x7A,0x7D, +0x85,0x85,0x85,0x8D,0x8A,0x79,0x66,0x69,0x73,0x75,0x7A,0x88,0x94,0x8D,0x84,0x92, +0x98,0x8C,0x7C,0x7D,0x83,0x78,0x71,0x74,0x7F,0x87,0x93,0x91,0x86,0x7C,0x76,0x7F, +0x7F,0x77,0x70,0x67,0x68,0x72,0x74,0x73,0x70,0x84,0x92,0x7D,0x6E,0x7B,0x85,0x87, +0x87,0x88,0x8A,0x8B,0x8F,0x92,0x8F,0x89,0x86,0x87,0x8B,0x8B,0x97,0xA3,0x99,0x83, +0x78,0x78,0x79,0x71,0x64,0x5E,0x67,0x72,0x6E,0x6D,0x75,0x72,0x6F,0x7B,0x7A,0x6D, +0x6A,0x68,0x71,0x80,0x8C,0x90,0x91,0x94,0x92,0x8B,0x8F,0x8B,0x7E,0x7F,0x79,0x6F, +0x6F,0x7E,0x8B,0x8C,0x8D,0x93,0x8E,0x86,0x7E,0x80,0x8A,0x86,0x76,0x71,0x7D,0x7D, +0x7B,0x80,0x7E,0x7F,0x7E,0x7D,0x77,0x73,0x7C,0x7C,0x7A,0x86,0x91,0x9D,0x9D,0x98, +0x97,0x98,0x9B,0x97,0x8E,0x83,0x80,0x87,0x94,0x92,0x85,0x82,0x86,0x88,0x87,0x7E, +0x7A,0x7B,0x78,0x7D,0x88,0x86,0x86,0x90,0x97,0x8B,0x7E,0x74,0x6C,0x6B,0x70,0x7C, +0x81,0x7B,0x79,0x7D,0x7C,0x86,0x8C,0x81,0x7D,0x85,0x84,0x8F,0xA0,0x96,0x91,0x96, +0x94,0x88,0x7F,0x71,0x5E,0x56,0x5D,0x69,0x67,0x68,0x77,0x89,0x91,0x85,0x71,0x6A, +0x67,0x5B,0x60,0x6F,0x7C,0x88,0x90,0x9A,0x96,0x7D,0x6E,0x76,0x7C,0x75,0x6D,0x72, +0x7B,0x7D,0x7D,0x86,0x90,0x88,0x81,0x85,0x86,0x78,0x6A,0x61,0x5E,0x60,0x6A,0x7B, +0x8C,0x90,0x89,0x85,0x85,0x80,0x79,0x72,0x71,0x7B,0x79,0x6D,0x6C,0x74,0x7D,0x90, +0x9E,0x9F,0x9A,0x8E,0x7F,0x77,0x80,0x85,0x82,0x82,0x89,0x83,0x78,0x7A,0x83,0x80, +0x7F,0x87,0x83,0x7A,0x77,0x77,0x7A,0x82,0x89,0x88,0x7E,0x7D,0x86,0x8B,0x81,0x7E, +0x86,0x87,0x7C,0x76,0x7D,0x8A,0x94,0x99,0x94,0x85,0x82,0x87,0x8E,0x93,0x90,0x85, +0x88,0x8D,0x8C,0x8C,0x85,0x82,0x86,0x82,0x80,0x80,0x83,0x83,0x82,0x82,0x78,0x72, +0x75,0x80,0x8B,0x92,0x8B,0x7C,0x75,0x79,0x78,0x73,0x73,0x73,0x75,0x79,0x7F,0x81, +0x82,0x81,0x87,0x91,0x90,0x79,0x6E,0x6A,0x67,0x70,0x7A,0x84,0x89,0x8A,0x89,0x86, +0x82,0x7D,0x6F,0x67,0x6F,0x6F,0x70,0x7C,0x82,0x86,0x8F,0x97,0x9D,0x94,0x86,0x85, +0x85,0x82,0x7E,0x7B,0x84,0x86,0x81,0x75,0x75,0x81,0x7F,0x71,0x79,0x87,0x7E,0x7C, +0x83,0x88,0x83,0x82,0x83,0x80,0x7A,0x6F,0x6C,0x78,0x83,0x80,0x7C,0x81,0x87,0x89, +0x7F,0x6F,0x76,0x7E,0x7E,0x7D,0x83,0x81,0x7A,0x86,0x93,0x9D,0x97,0x85,0x7A,0x78, +0x7B,0x86,0x88,0x82,0x84,0x89,0x8C,0x86,0x82,0x7F,0x7D,0x87,0x8D,0x83,0x75,0x79, +0x84,0x87,0x85,0x6F,0x69,0x73,0x79,0x7A,0x79,0x79,0x72,0x6C,0x75,0x82,0x85,0x8B, +0x90,0x92,0x98,0x9E,0x9A,0x96,0x8C,0x7C,0x75,0x7B,0x7B,0x82,0x87,0x7C,0x79,0x7C, +0x7D,0x7B,0x7C,0x79,0x71,0x6D,0x6A,0x6D,0x78,0x8D,0x9E,0x9D,0x92,0x85,0x74,0x6F, +0x70,0x73,0x78,0x7A,0x7C,0x8B,0x8F,0x87,0x7B,0x7E,0x7E,0x7A,0x82,0x84,0x7D,0x7B, +0x81,0x88,0x8B,0x85,0x7D,0x73,0x6C,0x63,0x5F,0x6B,0x79,0x83,0x89,0x8B,0x86,0x81, +0x8A,0x93,0x8F,0x83,0x77,0x7A,0x82,0x88,0x8C,0x86,0x80,0x7E,0x83,0x8C,0x8D,0x8B, +0x8E,0x86,0x77,0x75,0x7A,0x79,0x76,0x7B,0x7D,0x7D,0x80,0x84,0x83,0x78,0x73,0x79, +0x74,0x6B,0x69,0x7A,0x86,0x83,0x81,0x83,0x93,0x91,0x7B,0x7A,0x85,0x8D,0x87,0x7D, +0x82,0x82,0x73,0x6A,0x7C,0x8D,0x8D,0x83,0x7B,0x7D,0x80,0x83,0x7E,0x7F,0x86,0x7E, +0x79,0x7C,0x7D,0x7B,0x79,0x7B,0x83,0x87,0x7F,0x7C,0x70,0x66,0x75,0x7A,0x6B,0x68, +0x77,0x85,0x86,0x86,0x8C,0x91,0x8A,0x88,0x92,0x92,0x88,0x85,0x7C,0x70,0x71,0x84, +0x8F,0x8F,0x95,0x8B,0x82,0x89,0x96,0x94,0x91,0x91,0x8A,0x77,0x69,0x6A,0x74,0x88, +0x91,0x87,0x7F,0x7F,0x83,0x80,0x7D,0x7F,0x83,0x8A,0x87,0x7B,0x7C,0x7F,0x76,0x83, +0x94,0x96,0x91,0x8E,0x89,0x82,0x81,0x8C,0x8D,0x86,0x85,0x81,0x85,0x90,0x98,0x96, +0x8D,0x89,0x80,0x77,0x72,0x6D,0x6A,0x5C,0x58,0x65,0x73,0x7C,0x7F,0x80,0x81,0x82, +0x79,0x69,0x70,0x87,0x8A,0x88,0x84,0x7C,0x7D,0x8D,0x99,0x90,0x81,0x70,0x69,0x75, +0x7F,0x7F,0x78,0x7A,0x89,0x8C,0x84,0x7D,0x7A,0x74,0x75,0x7C,0x81,0x82,0x7C,0x75, +0x73,0x71,0x6F,0x73,0x71,0x6C,0x66,0x67,0x69,0x66,0x6F,0x81,0x8C,0x87,0x7E,0x82, +0x8C,0x94,0x98,0x8B,0x84,0x8D,0x8C,0x7F,0x82,0x8A,0x8D,0x8E,0x8F,0x99,0x95,0x84, +0x81,0x89,0x89,0x7C,0x6E,0x6D,0x6F,0x7C,0x89,0x7E,0x73,0x6E,0x6A,0x77,0x87,0x89, +0x83,0x89,0x97,0x9A,0x92,0x90,0x8F,0x85,0x7B,0x76,0x75,0x7B,0x81,0x83,0x7E,0x80, +0x80,0x83,0x87,0x8A,0x8D,0x8E,0x82,0x71,0x6E,0x74,0x7A,0x7B,0x76,0x7A,0x85,0x81, +0x6F,0x69,0x6B,0x70,0x79,0x76,0x6D,0x69,0x74,0x83,0x89,0x80,0x82,0x8B,0x8C,0x88, +0x7F,0x83,0x91,0x8F,0x8B,0x8F,0x8A,0x7A,0x77,0x81,0x7D,0x77,0x7E,0x86,0x89,0x7C, +0x71,0x7C,0x86,0x84,0x7F,0x79,0x74,0x75,0x76,0x79,0x79,0x7A,0x7E,0x7E,0x88,0x8C, +0x87,0x8E,0x8E,0x85,0x81,0x85,0x8C,0x8B,0x88,0x8F,0x99,0x96,0x91,0x94,0x9C,0x94, +0x87,0x85,0x84,0x7E,0x76,0x70,0x6F,0x72,0x74,0x70,0x79,0x8B,0x8C,0x83,0x85,0x8A, +0x83,0x78,0x73,0x78,0x7C,0x7B,0x7D,0x82,0x86,0x8B,0x8F,0x94,0x93,0x8D,0x86,0x85, +0x86,0x7E,0x73,0x6B,0x75,0x87,0x83,0x77,0x7C,0x86,0x87,0x78,0x71,0x7B,0x7B,0x79, +0x7A,0x75,0x77,0x72,0x6C,0x6B,0x71,0x7A,0x79,0x7C,0x7D,0x78,0x79,0x76,0x73,0x73, +0x75,0x78,0x75,0x77,0x7D,0x7D,0x83,0x88,0x92,0x95,0x8C,0x88,0x8A,0x8C,0x8B,0x83, +0x82,0x86,0x82,0x7B,0x78,0x7B,0x7E,0x82,0x7E,0x7A,0x7D,0x7C,0x74,0x71,0x70,0x71, +0x80,0x88,0x76,0x76,0x93,0x94,0x83,0x7D,0x81,0x80,0x7F,0x80,0x81,0x89,0x91,0x91, +0x94,0x9B,0x97,0x8D,0x8D,0x82,0x70,0x78,0x8A,0x86,0x79,0x78,0x7E,0x86,0x83,0x7F, +0x80,0x88,0x87,0x7F,0x7E,0x87,0x8B,0x7D,0x6F,0x78,0x8D,0x90,0x87,0x82,0x85,0x85, +0x79,0x77,0x80,0x87,0x8D,0x86,0x74,0x77,0x89,0x8E,0x87,0x81,0x7A,0x7D,0x8A,0x8E, +0x82,0x7D,0x7D,0x74,0x6C,0x6D,0x74,0x73,0x6F,0x6B,0x73,0x72,0x68,0x72,0x7C,0x77, +0x72,0x7F,0x8F,0x8F,0x77,0x68,0x71,0x7E,0x7B,0x7D,0x82,0x82,0x7D,0x83,0x8B,0x90, +0x8B,0x83,0x84,0x84,0x87,0x79,0x67,0x6E,0x7B,0x7F,0x7A,0x78,0x81,0x86,0x83,0x7A, +0x73,0x7D,0x88,0x85,0x7E,0x81,0x89,0x8C,0x90,0x92,0x84,0x7E,0x85,0x87,0x81,0x7C, +0x7C,0x74,0x6E,0x6F,0x74,0x88,0x97,0x8E,0x80,0x7D,0x85,0x89,0x81,0x7B,0x81,0x87, +0x86,0x8B,0x99,0x9F,0x93,0x88,0x87,0x86,0x82,0x8A,0x8D,0x7E,0x7B,0x81,0x88,0x8E, +0x83,0x74,0x7A,0x7A,0x71,0x6F,0x74,0x77,0x7A,0x7D,0x7F,0x7F,0x79,0x73,0x76,0x7C, +0x76,0x75,0x82,0x94,0x95,0x8D,0x8D,0x82,0x78,0x75,0x7D,0x8B,0x8D,0x88,0x8A,0x92, +0x9E,0x97,0x7A,0x71,0x7B,0x82,0x83,0x7E,0x7E,0x79,0x78,0x7A,0x7A,0x7E,0x7F,0x74, +0x76,0x80,0x87,0x8E,0x8A,0x7D,0x7A,0x77,0x76,0x73,0x67,0x6B,0x77,0x7E,0x81,0x81, +0x83,0x8B,0x8D,0x81,0x75,0x78,0x7F,0x7E,0x82,0x84,0x86,0x91,0x95,0x8B,0x88,0x8D, +0x92,0x86,0x74,0x73,0x77,0x7B,0x83,0x81,0x72,0x6E,0x7A,0x80,0x7E,0x75,0x7A,0x80, +0x79,0x7D,0x7E,0x77,0x77,0x78,0x7F,0x7C,0x78,0x83,0x91,0x91,0x92,0x93,0x91,0x8B, +0x7E,0x7A,0x77,0x71,0x78,0x7E,0x81,0x88,0x85,0x7A,0x7E,0x83,0x73,0x6B,0x70,0x71, +0x73,0x7D,0x7E,0x7B,0x7B,0x74,0x6E,0x71,0x79,0x7E,0x80,0x81,0x7D,0x77,0x7E,0x7D, +0x81,0x8A,0x82,0x7A,0x83,0x87,0x7F,0x81,0x81,0x7C,0x7B,0x81,0x8B,0x90,0x8D,0x83, +0x7A,0x79,0x7A,0x82,0x90,0x92,0x8F,0x95,0x97,0x8A,0x77,0x6E,0x72,0x73,0x76,0x77, +0x7D,0x83,0x81,0x82,0x7F,0x83,0x8A,0x85,0x85,0x84,0x7F,0x7F,0x88,0x8F,0x8A,0x8E, +0x8D,0x89,0x8F,0x8D,0x89,0x94,0x92,0x89,0x8F,0x98,0x92,0x89,0x88,0x8A,0x84,0x7B, +0x78,0x73,0x78,0x7E,0x7A,0x76,0x75,0x79,0x71,0x6B,0x6E,0x6C,0x75,0x7F,0x7A,0x7D, +0x86,0x83,0x80,0x7F,0x79,0x76,0x74,0x74,0x74,0x7C,0x83,0x7C,0x7A,0x83,0x8B,0x82, +0x78,0x7B,0x87,0x8E,0x88,0x81,0x84,0x8B,0x87,0x7E,0x79,0x7E,0x7F,0x7D,0x7C,0x7D, +0x88,0x8A,0x7D,0x7C,0x7C,0x69,0x66,0x76,0x78,0x71,0x76,0x88,0x93,0x87,0x7D,0x82, +0x81,0x7A,0x7F,0x87,0x81,0x6B,0x66,0x7E,0x95,0x8F,0x79,0x6B,0x6F,0x72,0x69,0x6E, +0x84,0x8F,0x8C,0x8A,0x93,0x98,0x90,0x8A,0x84,0x7F,0x7B,0x7C,0x82,0x82,0x7D,0x7B, +0x7F,0x86,0x8D,0x8E,0x87,0x81,0x7D,0x7C,0x7A,0x83,0x8E,0x92,0x8E,0x89,0x87,0x86, +0x85,0x86,0x8A,0x8B,0x84,0x7D,0x80,0x7E,0x72,0x66,0x68,0x76,0x7D,0x81,0x8D,0x98, +0x96,0x87,0x83,0x8B,0x8D,0x8E,0x91,0x8E,0x86,0x7C,0x7C,0x86,0x87,0x82,0x81,0x82, +0x8B,0x8C,0x81,0x7E,0x7E,0x7A,0x70,0x6B,0x6B,0x72,0x78,0x75,0x75,0x76,0x71,0x66, +0x62,0x6B,0x79,0x81,0x83,0x7F,0x7A,0x7F,0x86,0x82,0x82,0x8C,0x8F,0x88,0x82,0x82, +0x83,0x82,0x7F,0x81,0x7C,0x75,0x80,0x8A,0x90,0x8E,0x7D,0x6F,0x67,0x6D,0x7A,0x7F, +0x7C,0x7E,0x86,0x7F,0x74,0x77,0x81,0x7B,0x69,0x6A,0x75,0x79,0x78,0x74,0x73,0x7F, +0x91,0x94,0x88,0x7C,0x74,0x76,0x78,0x78,0x7D,0x88,0x8C,0x8C,0x8D,0x93,0x9D,0x97, +0x8A,0x83,0x85,0x85,0x80,0x85,0x8C,0x8D,0x90,0x8C,0x84,0x7D,0x77,0x75,0x72,0x70, +0x70,0x71,0x76,0x8A,0x8F,0x82,0x7B,0x74,0x71,0x77,0x82,0x82,0x80,0x85,0x8D,0x91, +0x8A,0x82,0x89,0x98,0x99,0x90,0x8C,0x8F,0x97,0x8F,0x7D,0x7D,0x7F,0x7B,0x70,0x68, +0x6F,0x7A,0x81,0x87,0x86,0x85,0x7E,0x77,0x72,0x70,0x6E,0x6D,0x74,0x79,0x81,0x8C, +0x8E,0x88,0x86,0x8A,0x85,0x7B,0x74,0x74,0x7B,0x84,0x8C,0x88,0x86,0x8C,0x90,0x92, +0x8C,0x88,0x85,0x85,0x8D,0x89,0x76,0x71,0x79,0x78,0x73,0x75,0x7F,0x86,0x86,0x88, +0x80,0x73,0x69,0x65,0x6B,0x73,0x73,0x72,0x75,0x75,0x73,0x76,0x85,0x92,0x8B,0x7C, +0x7A,0x82,0x83,0x7E,0x80,0x86,0x88,0x8C,0x8F,0x8D,0x87,0x80,0x80,0x85,0x89,0x8E, +0x96,0x98,0x8E,0x83,0x7C,0x80,0x89,0x88,0x81,0x7E,0x7D,0x76,0x6B,0x6D,0x76,0x75, +0x75,0x75,0x77,0x7A,0x77,0x72,0x79,0x7D,0x71,0x70,0x81,0x8C,0x85,0x7E,0x7D,0x7F, +0x80,0x83,0x87,0x85,0x83,0x87,0x95,0xA1,0x9E,0x90,0x84,0x89,0x8D,0x8C,0x8C,0x8A, +0x8C,0x8B,0x86,0x7E,0x74,0x6B,0x67,0x6A,0x6D,0x70,0x75,0x74,0x75,0x7D,0x75,0x66, +0x67,0x71,0x6C,0x66,0x73,0x84,0x88,0x8A,0x8B,0x89,0x8F,0x8E,0x7F,0x76,0x74,0x7B, +0x8C,0x92,0x94,0x95,0x92,0x96,0x98,0x96,0x8C,0x86,0x81,0x78,0x72,0x6D,0x72,0x7F, +0x81,0x83,0x84,0x81,0x81,0x84,0x85,0x7D,0x72,0x71,0x73,0x73,0x76,0x79,0x77,0x71, +0x7B,0x89,0x82,0x7C,0x7D,0x79,0x80,0x81,0x7D,0x82,0x91,0x9A,0x97,0x94,0x9B,0x9D, +0x9C,0x8D,0x83,0x8A,0x7D,0x73,0x79,0x83,0x83,0x7E,0x81,0x7D,0x79,0x7C,0x73,0x71, +0x76,0x6C,0x63,0x69,0x6D,0x6C,0x76,0x7F,0x7E,0x79,0x7C,0x75,0x73,0x70,0x6D,0x79, +0x85,0x7B,0x72,0x7D,0x91,0x95,0x90,0x8A,0x89,0x95,0x8E,0x89,0x96,0x93,0x89,0x8D, +0x91,0x88,0x83,0x84,0x7F,0x7F,0x7E,0x75,0x79,0x89,0x8A,0x84,0x78,0x6E,0x6C,0x69, +0x61,0x57,0x61,0x6D,0x73,0x82,0x89,0x85,0x86,0x89,0x8E,0x8C,0x89,0x8B,0x88,0x8F, +0x93,0x94,0x9A,0x93,0x83,0x85,0x8A,0x8C,0x87,0x86,0x7D,0x7F,0x8F,0x90,0x92,0x9B, +0x94,0x87,0x82,0x83,0x83,0x84,0x85,0x79,0x7A,0x77,0x6D,0x70,0x77,0x74,0x6F,0x6F, +0x72,0x75,0x7D,0x7E,0x81,0x93,0x84,0x74,0x7A,0x7F,0x7F,0x80,0x7E,0x82,0x85,0x85, +0x7F,0x7E,0x86,0x81,0x81,0x7F,0x7F,0x86,0x8C,0x89,0x7F,0x7A,0x79,0x75,0x76,0x76, +0x76,0x77,0x73,0x70,0x60,0x63,0x72,0x73,0x6C,0x68,0x6A,0x71,0x78,0x81,0x87,0x83, +0x7E,0x88,0x8C,0x85,0x84,0x8A,0x87,0x7F,0x83,0x8D,0x93,0x90,0x94,0x92,0x85,0x82, +0x8A,0x93,0x90,0x82,0x7F,0x7B,0x79,0x81,0x7E,0x7D,0x7F,0x84,0x83,0x7F,0x86,0x7D, +0x6F,0x72,0x77,0x81,0x88,0x84,0x83,0x87,0x8A,0x7F,0x7A,0x7C,0x7D,0x83,0x83,0x6F, +0x6F,0x7E,0x91,0x94,0x89,0x8E,0x94,0x92,0x86,0x85,0x91,0x88,0x77,0x7B,0x83,0x84, +0x77,0x7A,0x80,0x7A,0x74,0x79,0x7E,0x77,0x6F,0x74,0x72,0x6D,0x77,0x7F,0x84,0x87, +0x86,0x85,0x83,0x7C,0x77,0x7C,0x82,0x7E,0x7A,0x79,0x83,0x8C,0x8C,0x8A,0x7F,0x76, +0x76,0x7C,0x80,0x7F,0x7D,0x81,0x82,0x83,0x83,0x85,0x86,0x7E,0x7B,0x82,0x79,0x79, +0x83,0x82,0x7B,0x78,0x7D,0x82,0x84,0x78,0x6E,0x6E,0x79,0x7B,0x77,0x71,0x72,0x82, +0x8F,0x88,0x7F,0x81,0x8D,0x90,0x8D,0x80,0x75,0x82,0x87,0x7B,0x72,0x7C,0x85,0x89, +0x8A,0x88,0x82,0x87,0x89,0x81,0x7E,0x84,0x8A,0x8E,0x93,0x90,0x91,0x91,0x85,0x83, +0x8A,0x89,0x8F,0x8F,0x81,0x7B,0x83,0x89,0x86,0x7A,0x70,0x6B,0x6A,0x6C,0x6E,0x7C, +0x87,0x89,0x84,0x81,0x84,0x84,0x81,0x81,0x84,0x8D,0x8E,0x87,0x7E,0x7A,0x82,0x8F, +0x90,0x82,0x79,0x7F,0x86,0x82,0x7D,0x84,0x8F,0x8F,0x8C,0x8B,0x8B,0x7D,0x75,0x72, +0x6A,0x66,0x61,0x5C,0x5B,0x5E,0x5F,0x69,0x77,0x7B,0x79,0x7A,0x79,0x7E,0x86,0x86, +0x85,0x8A,0x90,0x94,0x97,0x9B,0x99,0x91,0x85,0x83,0x8C,0x88,0x79,0x71,0x74,0x72, +0x6E,0x77,0x83,0x82,0x81,0x81,0x80,0x82,0x7C,0x7B,0x7D,0x74,0x75,0x7C,0x7D,0x80, +0x7A,0x74,0x7E,0x8A,0x87,0x7E,0x7E,0x85,0x85,0x81,0x82,0x86,0x81,0x7C,0x79,0x79, +0x7C,0x79,0x80,0x8B,0x8A,0x84,0x86,0x8F,0x94,0x91,0x90,0x90,0x90,0x8D,0x86,0x80, +0x7C,0x80,0x84,0x82,0x84,0x81,0x7D,0x75,0x6B,0x6D,0x69,0x6B,0x75,0x77,0x74,0x77, +0x82,0x89,0x82,0x7C,0x7D,0x88,0x91,0x8C,0x78,0x6D,0x71,0x75,0x79,0x7E,0x7E,0x7B, +0x7E,0x80,0x7F,0x85,0x8F,0x9B,0x9E,0x91,0x86,0x8C,0x93,0x88,0x7B,0x74,0x7A,0x83, +0x83,0x7F,0x7E,0x7E,0x80,0x79,0x71,0x75,0x7F,0x79,0x6F,0x73,0x7A,0x7B,0x7E,0x85, +0x84,0x7F,0x7D,0x79,0x79,0x82,0x85,0x86,0x8F,0x95,0x90,0x8D,0x96,0x92,0x83,0x7E, +0x72,0x6E,0x7C,0x82,0x84,0x8D,0x92,0x8F,0x8B,0x88,0x7B,0x73,0x77,0x71,0x62,0x64, +0x72,0x71,0x6F,0x73,0x7A,0x79,0x78,0x77,0x7C,0x86,0x8A,0x87,0x81,0x7E,0x85,0x89, +0x8A,0x8C,0x90,0x91,0x8D,0x85,0x83,0x87,0x8C,0x8B,0x8A,0x85,0x78,0x71,0x71,0x75, +0x7A,0x7F,0x84,0x81,0x7F,0x82,0x83,0x80,0x79,0x7B,0x83,0x79,0x6F,0x6F,0x76,0x7E, +0x82,0x7D,0x70,0x69,0x75,0x83,0x8C,0x8B,0x84,0x8B,0x93,0x91,0x83,0x78,0x7D,0x85, +0x91,0x9A,0x92,0x8D,0x91,0x94,0x97,0x96,0x8D,0x7C,0x69,0x6D,0x7E,0x84,0x89,0x8F, +0x8A,0x7F,0x7B,0x7A,0x7A,0x76,0x6B,0x5F,0x5C,0x60,0x6E,0x7C,0x7C,0x77,0x78,0x7E, +0x81,0x83,0x83,0x7C,0x80,0x8F,0x8F,0x88,0x8F,0x9A,0xA0,0xA0,0x96,0x87,0x7E,0x7E, +0x7A,0x7A,0x84,0x83,0x7D,0x84,0x84,0x76,0x6F,0x80,0x90,0x89,0x76,0x6D,0x70,0x72, +0x70,0x75,0x7A,0x77,0x6C,0x6A,0x71,0x73,0x75,0x79,0x80,0x86,0x85,0x8A,0x89,0x85, +0x87,0x86,0x84,0x8D,0x92,0x81,0x6E,0x70,0x80,0x8A,0x85,0x7C,0x74,0x74,0x77,0x75, +0x77,0x7F,0x7B,0x77,0x7A,0x77,0x76,0x84,0x91,0x93,0x7E,0x6C,0x74,0x80,0x7E,0x7C, +0x7E,0x7B,0x6E,0x6A,0x74,0x7A,0x84,0x8B,0x8C,0x86,0x80,0x8D,0x94,0x8C,0x8A,0x89, +0x7F,0x78,0x7F,0x8D,0x90,0x84,0x74,0x73,0x7B,0x82,0x87,0x8A,0x8E,0x8B,0x90,0x98, +0x94,0x88,0x85,0x87,0x83,0x7C,0x79,0x81,0x83,0x7A,0x75,0x7A,0x82,0x7D,0x7B,0x75, +0x69,0x6A,0x73,0x7E,0x8B,0x8F,0x93,0x93,0x8F,0x88,0x84,0x89,0x8A,0x87,0x7F,0x7A, +0x88,0x94,0x90,0x88,0x7F,0x7C,0x7D,0x7E,0x84,0x84,0x80,0x7C,0x82,0x8A,0x85,0x84, +0x88,0x82,0x7B,0x82,0x89,0x83,0x7F,0x81,0x7B,0x73,0x78,0x7D,0x78,0x6D,0x6C,0x76, +0x7E,0x82,0x7C,0x72,0x73,0x76,0x74,0x74,0x7B,0x81,0x7E,0x82,0x8D,0x89,0x83,0x82, +0x84,0x85,0x7D,0x76,0x6F,0x6E,0x7C,0x82,0x81,0x82,0x82,0x80,0x7C,0x7F,0x87,0x87, +0x81,0x7B,0x76,0x7A,0x83,0x85,0x85,0x82,0x81,0x82,0x83,0x82,0x80,0x85,0x8B,0x8B, +0x82,0x76,0x71,0x6D,0x72,0x75,0x73,0x79,0x84,0x87,0x85,0x7B,0x76,0x7C,0x84,0x89, +0x82,0x78,0x77,0x75,0x76,0x83,0x88,0x82,0x83,0x84,0x83,0x87,0x8C,0x8A,0x84,0x79, +0x75,0x81,0x84,0x80,0x85,0x8D,0x8E,0x8E,0x8C,0x85,0x7F,0x82,0x85,0x87,0x86,0x7C, +0x7D,0x83,0x82,0x82,0x7E,0x78,0x76,0x7B,0x7F,0x80,0x8A,0x93,0x8D,0x82,0x7E,0x85, +0x93,0x98,0x8F,0x8F,0x8C,0x8B,0x8C,0x89,0x83,0x78,0x79,0x7A,0x71,0x6B,0x6E,0x77, +0x78,0x7B,0x88,0x8A,0x82,0x7B,0x79,0x7B,0x7B,0x78,0x7D,0x80,0x7C,0x75,0x72,0x75, +0x7B,0x87,0x86,0x7C,0x7B,0x7D,0x79,0x79,0x82,0x82,0x75,0x72,0x7D,0x91,0xA1,0xA2, +0x95,0x84,0x79,0x78,0x77,0x70,0x6A,0x66,0x66,0x69,0x69,0x6A,0x76,0x80,0x77,0x6F, +0x73,0x71,0x71,0x77,0x7F,0x86,0x88,0x83,0x83,0x86,0x89,0x8C,0x87,0x8A,0x8B,0x88, +0x7F,0x78,0x81,0x8D,0x8C,0x84,0x83,0x87,0x89,0x88,0x8C,0x92,0x92,0x8B,0x84,0x80, +0x82,0x81,0x7D,0x76,0x77,0x78,0x70,0x70,0x7D,0x8A,0x89,0x89,0x86,0x7A,0x75,0x7A, +0x7D,0x7D,0x7F,0x87,0x8E,0x83,0x78,0x7E,0x8B,0x99,0x9F,0x99,0x92,0x8C,0x82,0x7C, +0x7F,0x82,0x80,0x80,0x85,0x8C,0x8A,0x87,0x8F,0x8A,0x7B,0x70,0x6D,0x6D,0x72,0x75, +0x76,0x7B,0x82,0x85,0x82,0x7F,0x82,0x85,0x87,0x7A,0x68,0x6C,0x7D,0x81,0x7D,0x80, +0x85,0x86,0x84,0x7B,0x78,0x7C,0x7A,0x79,0x81,0x89,0x91,0x93,0x92,0x92,0x8F,0x8D, +0x8D,0x8D,0x88,0x80,0x78,0x7B,0x88,0x85,0x7B,0x71,0x6B,0x71,0x7A,0x78,0x6A,0x62, +0x66,0x6C,0x73,0x81,0x87,0x86,0x86,0x7F,0x7A,0x7A,0x7D,0x83,0x87,0x88,0x88,0x8A, +0x93,0x9A,0x94,0x86,0x7F,0x80,0x81,0x83,0x83,0x7C,0x77,0x78,0x7B,0x80,0x8B,0x91, +0x8A,0x7F,0x6D,0x60,0x65,0x72,0x6F,0x6C,0x70,0x74,0x7C,0x7F,0x81,0x80,0x7B,0x74, +0x70,0x72,0x72,0x6E,0x74,0x79,0x79,0x84,0x94,0x98,0x95,0x95,0x95,0x93,0x90,0x8A, +0x88,0x8C,0x89,0x81,0x7D,0x79,0x79,0x85,0x8C,0x84,0x79,0x76,0x7B,0x82,0x85,0x7F, +0x76,0x73,0x71,0x72,0x7B,0x82,0x7B,0x71,0x78,0x7D,0x78,0x73,0x72,0x7B,0x7E,0x7D, +0x82,0x83,0x82,0x8A,0x8F,0x92,0x95,0x96,0x97,0x96,0x9A,0x9D,0x96,0x8A,0x7F,0x76, +0x78,0x84,0x88,0x84,0x80,0x80,0x83,0x85,0x7D,0x74,0x71,0x75,0x76,0x77,0x7F,0x83, +0x86,0x8D,0x8F,0x8C,0x89,0x84,0x7F,0x7F,0x7B,0x7B,0x83,0x88,0x87,0x88,0x8A,0x86, +0x7A,0x6C,0x70,0x81,0x91,0x8B,0x77,0x78,0x87,0x8E,0x89,0x78,0x6A,0x65,0x6A,0x73, +0x78,0x79,0x78,0x7B,0x78,0x71,0x77,0x84,0x84,0x7A,0x72,0x6E,0x70,0x78,0x79,0x79, +0x81,0x8D,0x94,0x92,0x8D,0x8C,0x8D,0x8A,0x85,0x7F,0x78,0x77,0x7C,0x7C,0x71,0x6B, +0x73,0x7F,0x87,0x85,0x81,0x84,0x88,0x7D,0x72,0x71,0x71,0x71,0x71,0x7A,0x83,0x83, +0x8A,0x90,0x91,0x8E,0x88,0x87,0x92,0x93,0x80,0x78,0x84,0x85,0x7F,0x7E,0x82,0x86, +0x8B,0x8A,0x81,0x82,0x87,0x8A,0x8C,0x89,0x85,0x83,0x82,0x82,0x7E,0x7C,0x7C,0x80, +0x76,0x70,0x7C,0x86,0x7E,0x71,0x6E,0x72,0x7A,0x7C,0x80,0x95,0x9F,0x92,0x84,0x84, +0x8B,0x8E,0x8A,0x7F,0x7B,0x7E,0x7F,0x7C,0x7D,0x81,0x86,0x87,0x80,0x7A,0x76,0x70, +0x6E,0x72,0x75,0x7B,0x80,0x82,0x7B,0x7A,0x81,0x7D,0x73,0x70,0x78,0x7A,0x73,0x74, +0x81,0x90,0x97,0x8D,0x87,0x88,0x85,0x86,0x88,0x81,0x7F,0x82,0x82,0x88,0x8C,0x86, +0x81,0x84,0x85,0x85,0x79,0x6D,0x70,0x78,0x78,0x71,0x6F,0x76,0x7B,0x7B,0x73,0x70, +0x7B,0x7A,0x79,0x81,0x84,0x84,0x8C,0x91,0x8A,0x83,0x89,0x8D,0x84,0x7F,0x85,0x8C, +0x8F,0x88,0x83,0x88,0x8D,0x86,0x83,0x8C,0x89,0x80,0x7A,0x76,0x75,0x7F,0x86,0x7A, +0x75,0x7F,0x7F,0x80,0x84,0x82,0x7A,0x77,0x74,0x73,0x75,0x74,0x73,0x75,0x7B,0x7B, +0x81,0x84,0x85,0x8A,0x89,0x84,0x7A,0x6E,0x73,0x80,0x88,0x8B,0x91,0x95,0x8B,0x88, +0x89,0x81,0x7E,0x7E,0x7D,0x7D,0x7C,0x7E,0x78,0x77,0x75,0x74,0x7A,0x77,0x74,0x78, +0x77,0x77,0x7D,0x85,0x88,0x85,0x83,0x80,0x80,0x7E,0x7C,0x86,0x8E,0x8A,0x85,0x82, +0x84,0x7A,0x71,0x70,0x72,0x7D,0x87,0x8F,0x94,0x8F,0x84,0x85,0x8D,0x91,0x90,0x91, +0x8C,0x83,0x87,0x87,0x83,0x89,0x88,0x82,0x7F,0x7A,0x7B,0x7A,0x75,0x75,0x7F,0x83, +0x7F,0x78,0x6E,0x5F,0x63,0x76,0x7B,0x7F,0x80,0x81,0x7F,0x85,0x8B,0x8D,0x92,0x8A, +0x7E,0x82,0x84,0x7F,0x84,0x8B,0x8B,0x8A,0x8F,0x8E,0x89,0x85,0x83,0x8A,0x90,0x7C, +0x69,0x76,0x84,0x7E,0x7C,0x7E,0x7C,0x81,0x80,0x7A,0x79,0x77,0x75,0x7B,0x7F,0x7C, +0x75,0x73,0x72,0x73,0x73,0x76,0x77,0x7D,0x86,0x84,0x86,0x88,0x85,0x84,0x7B,0x77, +0x7D,0x7E,0x81,0x84,0x84,0x88,0x91,0x97,0x95,0x91,0x8C,0x85,0x7E,0x7A,0x78,0x7A, +0x82,0x87,0x7F,0x79,0x7D,0x77,0x6D,0x73,0x7D,0x86,0x85,0x7E,0x7D,0x78,0x6E,0x67, +0x69,0x76,0x81,0x86,0x85,0x84,0x8D,0x90,0x84,0x7F,0x7E,0x7B,0x7C,0x7D,0x7F,0x83, +0x85,0x85,0x86,0x85,0x82,0x7C,0x75,0x71,0x70,0x70,0x7C,0x8B,0x8D,0x86,0x7B,0x79, +0x7E,0x75,0x72,0x7F,0x83,0x79,0x79,0x82,0x83,0x80,0x83,0x81,0x7F,0x7E,0x7B,0x83, +0x94,0x95,0x8A,0x8C,0x91,0x8C,0x8C,0x8E,0x8B,0x8B,0x8A,0x79,0x77,0x81,0x80,0x7F, +0x7D,0x78,0x75,0x74,0x76,0x7A,0x7E,0x7D,0x77,0x7B,0x84,0x87,0x88,0x85,0x7F,0x7A, +0x74,0x79,0x83,0x8A,0x87,0x85,0x86,0x7E,0x78,0x77,0x79,0x7F,0x89,0x8B,0x89,0x8B, +0x8D,0x8E,0x91,0x91,0x86,0x7D,0x7E,0x7F,0x82,0x88,0x8B,0x85,0x7F,0x7E,0x80,0x81, +0x77,0x71,0x6E,0x6D,0x77,0x80,0x7D,0x7B,0x81,0x82,0x83,0x86,0x84,0x7B,0x76,0x7F, +0x86,0x88,0x86,0x84,0x89,0x8B,0x7F,0x73,0x76,0x81,0x8B,0x8A,0x7F,0x79,0x7F,0x80, +0x78,0x77,0x7C,0x81,0x81,0x81,0x83,0x83,0x81,0x7F,0x7D,0x75,0x70,0x77,0x74,0x68, +0x6D,0x78,0x78,0x75,0x77,0x7D,0x84,0x81,0x76,0x76,0x7C,0x79,0x78,0x86,0x95,0x9B, +0x99,0x8F,0x82,0x7A,0x78,0x6D,0x64,0x70,0x7C,0x7C,0x7F,0x87,0x8B,0x8A,0x89,0x8E, +0x8D,0x89,0x82,0x7A,0x79,0x87,0x91,0x8B,0x86,0x86,0x86,0x85,0x81,0x75,0x79,0x8C, +0x87,0x78,0x78,0x7C,0x7B,0x77,0x73,0x78,0x7E,0x77,0x72,0x7E,0x8F,0x8E,0x89,0x8B, +0x8C,0x8A,0x85,0x85,0x85,0x86,0x8C,0x91,0x93,0x92,0x8D,0x87,0x81,0x7C,0x7F,0x78, +0x73,0x78,0x7A,0x7D,0x82,0x8B,0x8F,0x8D,0x8A,0x8B,0x8C,0x85,0x82,0x86,0x84,0x7A, +0x7D,0x83,0x86,0x7B,0x6A,0x62,0x5E,0x5E,0x60,0x68,0x74,0x78,0x79,0x7E,0x81,0x83, +0x89,0x8F,0x94,0x95,0x95,0x93,0x92,0x97,0x8B,0x7C,0x7D,0x80,0x82,0x80,0x7F,0x80, +0x85,0x84,0x7F,0x80,0x83,0x79,0x71,0x72,0x73,0x73,0x75,0x83,0x8B,0x7A,0x6E,0x6F, +0x6D,0x62,0x5F,0x6B,0x74,0x6E,0x6E,0x78,0x81,0x7F,0x73,0x76,0x83,0x87,0x87,0x88, +0x95,0x9A,0x96,0x91,0x95,0xA2,0x9A,0x87,0x7A,0x78,0x7A,0x7D,0x7E,0x83,0x8C,0x8E, +0x87,0x7A,0x76,0x6E,0x64,0x68,0x70,0x71,0x6D,0x72,0x7A,0x82,0x88,0x85,0x7D,0x79, +0x75,0x71,0x6F,0x73,0x7A,0x7F,0x8C,0x98,0x9A,0x99,0x97,0x91,0x8B,0x85,0x83,0x88, +0x91,0x8F,0x86,0x87,0x8D,0x8D,0x8C,0x8C,0x86,0x81,0x83,0x82,0x7A,0x76,0x72,0x6E, +0x6D,0x6D,0x70,0x74,0x76,0x76,0x77,0x7B,0x85,0x8B,0x8E,0x91,0x8A,0x83,0x7E,0x82, +0x94,0x9A,0x8E,0x88,0x92,0x97,0x8B,0x8A,0x97,0x9B,0x8E,0x82,0x80,0x7E,0x7A,0x7D, +0x78,0x7A,0x84,0x85,0x80,0x7E,0x7D,0x7D,0x7D,0x7E,0x7C,0x72,0x69,0x67,0x6A,0x70, +0x77,0x7D,0x7C,0x7A,0x7F,0x89,0x87,0x7A,0x77,0x7E,0x7E,0x80,0x82,0x86,0x8B,0x8D, +0x90,0x91,0x8E,0x8D,0x87,0x84,0x81,0x7D,0x75,0x6C,0x71,0x7A,0x7D,0x7C,0x77,0x71, +0x6A,0x65,0x63,0x69,0x73,0x7C,0x7E,0x76,0x71,0x78,0x79,0x79,0x81,0x86,0x84,0x83, +0x7D,0x73,0x75,0x85,0x8D,0x84,0x7C,0x7B,0x7F,0x80,0x80,0x80,0x86,0x8E,0x8D,0x8D, +0x8F,0x88,0x7E,0x7D,0x83,0x8B,0x8A,0x7F,0x79,0x78,0x76,0x75,0x79,0x7B,0x73,0x6C, +0x6E,0x7A,0x85,0x8B,0x8B,0x85,0x84,0x88,0x89,0x8A,0x8D,0x85,0x7F,0x7D,0x83,0x88, +0x83,0x7F,0x87,0x90,0x8E,0x88,0x86,0x8B,0x93,0x91,0x87,0x7F,0x81,0x88,0x8A,0x89, +0x85,0x81,0x7C,0x79,0x77,0x7B,0x82,0x88,0x8B,0x87,0x7F,0x78,0x76,0x79,0x7D,0x7D, +0x80,0x83,0x82,0x7E,0x7B,0x7C,0x83,0x83,0x81,0x81,0x80,0x80,0x84,0x81,0x77,0x79, +0x7D,0x7F,0x81,0x80,0x84,0x86,0x81,0x81,0x80,0x81,0x7A,0x69,0x68,0x7A,0x8F,0x97, +0x90,0x8A,0x87,0x86,0x81,0x7B,0x78,0x6C,0x6D,0x7C,0x80,0x79,0x7A,0x86,0x8A,0x7F, +0x76,0x7A,0x7B,0x6E,0x64,0x74,0x86,0x85,0x80,0x83,0x88,0x8A,0x86,0x7A,0x6F,0x74, +0x7E,0x85,0x8A,0x8B,0x85,0x80,0x81,0x84,0x8A,0x84,0x7F,0x81,0x80,0x76,0x73,0x7E, +0x89,0x8C,0x87,0x7F,0x82,0x88,0x84,0x7B,0x78,0x7B,0x7B,0x78,0x77,0x74,0x73,0x75, +0x74,0x72,0x75,0x79,0x7D,0x80,0x7E,0x7C,0x83,0x8E,0x93,0x96,0x92,0x92,0x94,0x8C, +0x89,0x8A,0x88,0x81,0x7C,0x80,0x8B,0x87,0x7C,0x78,0x77,0x73,0x74,0x7F,0x80,0x79, +0x76,0x74,0x77,0x80,0x84,0x84,0x83,0x7E,0x73,0x70,0x79,0x80,0x81,0x7F,0x84,0x8B, +0x82,0x76,0x7B,0x8C,0x94,0x8C,0x86,0x82,0x84,0x87,0x8B,0x93,0x91,0x8A,0x88,0x88, +0x86,0x84,0x83,0x85,0x7F,0x76,0x76,0x7D,0x84,0x89,0x84,0x85,0x88,0x83,0x83,0x88, +0x87,0x7D,0x7A,0x7C,0x7B,0x75,0x75,0x7D,0x83,0x83,0x7F,0x86,0x8C,0x84,0x79,0x7A, +0x84,0x87,0x89,0x8C,0x86,0x7A,0x72,0x73,0x79,0x82,0x83,0x7F,0x81,0x80,0x7B,0x78, +0x79,0x7A,0x74,0x6E,0x71,0x71,0x6A,0x64,0x69,0x7A,0x86,0x81,0x76,0x73,0x7A,0x7E, +0x76,0x73,0x7A,0x85,0x87,0x89,0x8D,0x87,0x7E,0x80,0x7D,0x7B,0x85,0x89,0x8A,0x88, +0x84,0x80,0x7E,0x88,0x86,0x7A,0x80,0x88,0x86,0x80,0x7E,0x84,0x84,0x7D,0x74,0x73, +0x76,0x71,0x68,0x6A,0x7B,0x87,0x89,0x83,0x7F,0x7F,0x82,0x83,0x82,0x84,0x85,0x7E, +0x77,0x7B,0x88,0x92,0xA1,0xA4,0x98,0x90,0x90,0x89,0x80,0x7C,0x7B,0x7C,0x82,0x85, +0x83,0x87,0x88,0x84,0x7E,0x7B,0x7E,0x7D,0x79,0x79,0x79,0x82,0x8F,0x90,0x8A,0x83, +0x7D,0x80,0x82,0x77,0x6D,0x6F,0x76,0x7B,0x80,0x82,0x84,0x89,0x87,0x7D,0x83,0x8C, +0x8A,0x7E,0x74,0x73,0x7D,0x87,0x86,0x80,0x83,0x87,0x89,0x87,0x87,0x85,0x7E,0x79, +0x79,0x7A,0x7E,0x82,0x7D,0x76,0x78,0x84,0x8E,0x90,0x83,0x7A,0x7C,0x7D,0x76,0x7D, +0x86,0x82,0x79,0x78,0x76,0x73,0x77,0x79,0x7D,0x80,0x82,0x86,0x90,0x95,0x94,0x89, +0x7E,0x78,0x79,0x7C,0x7B,0x80,0x83,0x87,0x87,0x84,0x83,0x81,0x77,0x77,0x83,0x84, +0x79,0x78,0x7D,0x7E,0x84,0x8D,0x89,0x82,0x81,0x7F,0x7F,0x7E,0x7E,0x7B,0x75,0x6C, +0x70,0x78,0x78,0x70,0x6B,0x74,0x7E,0x7D,0x79,0x7C,0x81,0x8D,0x92,0x8E,0x8A,0x88, +0x82,0x7A,0x76,0x7C,0x83,0x81,0x7E,0x84,0x90,0x91,0x8E,0x8B,0x81,0x76,0x6D,0x73, +0x7D,0x7C,0x7A,0x75,0x74,0x77,0x77,0x7E,0x84,0x81,0x79,0x6D,0x68,0x67,0x6A,0x7F, +0x8B,0x84,0x80,0x84,0x85,0x8A,0x92,0x90,0x88,0x89,0x85,0x7B,0x77,0x7D,0x85,0x88, +0x8B,0x8B,0x85,0x85,0x7B,0x7E,0x98,0xA0,0x98,0x99,0x9A,0x8D,0x80,0x83,0x86,0x7F, +0x77,0x71,0x75,0x79,0x74,0x6C,0x65,0x6B,0x77,0x7A,0x7E,0x7E,0x7B,0x7B,0x7D,0x81, +0x84,0x89,0x8A,0x85,0x8A,0x90,0x86,0x82,0x89,0x83,0x7C,0x84,0x8B,0x89,0x8E,0x91, +0x8F,0x8E,0x8E,0x90,0x91,0x86,0x76,0x72,0x76,0x78,0x77,0x7F,0x87,0x89,0x80,0x75, +0x75,0x7A,0x7B,0x74,0x74,0x76,0x76,0x72,0x71,0x76,0x7B,0x7C,0x7B,0x7B,0x7D,0x78, +0x73,0x79,0x84,0x8A,0x87,0x85,0x82,0x80,0x86,0x8C,0x89,0x85,0x7F,0x7D,0x84,0x89, +0x86,0x85,0x83,0x7C,0x7B,0x80,0x7A,0x6D,0x67,0x6C,0x77,0x7D,0x7F,0x83,0x80,0x79, +0x7A,0x7A,0x7C,0x79,0x76,0x77,0x78,0x81,0x87,0x87,0x8A,0x92,0x94,0x8D,0x89,0x84, +0x7A,0x79,0x7C,0x7E,0x83,0x85,0x8A,0x91,0x8B,0x82,0x7F,0x82,0x82,0x7D,0x79,0x73, +0x72,0x77,0x7A,0x79,0x79,0x7E,0x80,0x7E,0x7A,0x71,0x76,0x83,0x85,0x80,0x7D,0x7F, +0x84,0x82,0x81,0x8C,0x98,0x98,0x89,0x7F,0x7D,0x85,0x8D,0x89,0x84,0x85,0x88,0x85, +0x7E,0x78,0x7C,0x83,0x7E,0x7A,0x88,0x93,0x8C,0x85,0x84,0x7E,0x81,0x82,0x7B,0x79, +0x75,0x72,0x78,0x7D,0x79,0x79,0x84,0x87,0x7C,0x79,0x84,0x85,0x85,0x82,0x7D,0x82, +0x85,0x86,0x8A,0x8D,0x8C,0x87,0x84,0x82,0x7A,0x7A,0x7C,0x80,0x83,0x88,0x8D,0x97, +0x97,0x8A,0x84,0x89,0x84,0x7A,0x75,0x73,0x77,0x75,0x6C,0x6D,0x78,0x7B,0x73,0x71, +0x7B,0x81,0x7D,0x75,0x6F,0x73,0x79,0x74,0x74,0x7C,0x7D,0x7E,0x8A,0x95,0x94,0x92, +0x8D,0x87,0x84,0x7C,0x78,0x7F,0x83,0x80,0x7A,0x7E,0x85,0x82,0x7C,0x7B,0x80,0x81, +0x7C,0x75,0x75,0x79,0x72,0x68,0x68,0x6C,0x6F,0x72,0x76,0x7F,0x84,0x85,0x83,0x7B, +0x79,0x78,0x78,0x7D,0x7F,0x7E,0x81,0x89,0x94,0x92,0x84,0x7F,0x80,0x7E,0x7A,0x7C, +0x81,0x84,0x81,0x79,0x79,0x88,0x93,0x90,0x8A,0x8F,0x95,0x8F,0x86,0x84,0x88,0x89, +0x85,0x80,0x7A,0x7A,0x7C,0x7D,0x7C,0x75,0x7A,0x85,0x85,0x7D,0x75,0x71,0x79,0x82, +0x82,0x85,0x8C,0x91,0x8C,0x88,0x89,0x8D,0x92,0x8F,0x89,0x84,0x7C,0x7B,0x86,0x8D, +0x8A,0x8A,0x8C,0x88,0x83,0x7E,0x7E,0x83,0x86,0x85,0x88,0x89,0x81,0x7B,0x7D,0x7D, +0x78,0x75,0x73,0x73,0x74,0x6E,0x6E,0x7C,0x86,0x86,0x82,0x7E,0x7F,0x80,0x7C,0x7D, +0x89,0x8C,0x88,0x89,0x8D,0x8A,0x86,0x89,0x8B,0x83,0x78,0x7C,0x81,0x7C,0x76,0x76, +0x7F,0x89,0x8A,0x88,0x85,0x83,0x7A,0x72,0x70,0x6F,0x6E,0x70,0x76,0x75,0x73,0x70, +0x6F,0x77,0x81,0x7D,0x78,0x7C,0x7F,0x7C,0x78,0x7A,0x82,0x87,0x8A,0x89,0x86,0x7D, +0x76,0x7D,0x86,0x85,0x7F,0x7B,0x76,0x76,0x75,0x75,0x7B,0x86,0x89,0x86,0x83,0x80, +0x7D,0x7B,0x7A,0x74,0x6D,0x6E,0x79,0x7E,0x7D,0x7C,0x82,0x86,0x8A,0x8A,0x88,0x87, +0x83,0x7D,0x7E,0x81,0x7F,0x77,0x70,0x77,0x82,0x88,0x85,0x81,0x84,0x8B,0x8D,0x87, +0x86,0x89,0x87,0x86,0x8A,0x8E,0x91,0x8F,0x8D,0x89,0x89,0x8B,0x86,0x81,0x75,0x68, +0x6A,0x72,0x77,0x7D,0x83,0x83,0x7B,0x76,0x79,0x82,0x89,0x88,0x89,0x8E,0x90,0x8B, +0x86,0x85,0x84,0x80,0x83,0x88,0x85,0x7E,0x7C,0x84,0x8B,0x8D,0x8B,0x8C,0x8E,0x8A, +0x80,0x7F,0x82,0x81,0x7E,0x7C,0x82,0x89,0x89,0x84,0x85,0x88,0x85,0x80,0x7C,0x74, +0x6D,0x6C,0x73,0x7D,0x81,0x7C,0x7A,0x7E,0x7D,0x76,0x77,0x79,0x77,0x78,0x79,0x81, +0x8A,0x8E,0x8F,0x8C,0x8C,0x8B,0x82,0x75,0x6E,0x6D,0x75,0x7B,0x7D,0x7E,0x80,0x83, +0x84,0x81,0x7C,0x7C,0x81,0x88,0x89,0x80,0x73,0x70,0x6E,0x6C,0x72,0x78,0x77,0x73, +0x74,0x74,0x71,0x6F,0x70,0x78,0x7F,0x85,0x85,0x82,0x80,0x7C,0x7E,0x86,0x88,0x86, +0x85,0x85,0x84,0x7F,0x7E,0x80,0x7E,0x7E,0x80,0x7C,0x78,0x7B,0x80,0x85,0x92,0x9C, +0x97,0x91,0x92,0x87,0x79,0x74,0x74,0x76,0x73,0x71,0x75,0x80,0x8A,0x8B,0x86,0x85, +0x84,0x7A,0x71,0x74,0x7A,0x7B,0x7D,0x83,0x8F,0x9B,0x9D,0x96,0x8D,0x83,0x7F,0x7D, +0x7D,0x84,0x88,0x87,0x86,0x86,0x8F,0x9D,0xA0,0x99,0x8D,0x7E,0x74,0x76,0x78,0x78, +0x7D,0x7F,0x7F,0x81,0x7F,0x76,0x76,0x7F,0x7D,0x78,0x7D,0x81,0x81,0x81,0x86,0x8B, +0x8A,0x86,0x82,0x79,0x72,0x73,0x76,0x7A,0x80,0x8A,0x91,0x92,0x8E,0x88,0x84,0x83, +0x82,0x81,0x85,0x87,0x81,0x77,0x76,0x7B,0x7F,0x7C,0x75,0x6E,0x68,0x6A,0x6C,0x6C, +0x6B,0x6C,0x72,0x78,0x7E,0x80,0x7F,0x83,0x83,0x7B,0x7A,0x7F,0x86,0x87,0x88,0x8E, +0x94,0x97,0x95,0x92,0x92,0x88,0x79,0x6F,0x6F,0x74,0x6E,0x71,0x7E,0x7D,0x7A,0x7E, +0x81,0x80,0x77,0x70,0x6B,0x6A,0x6E,0x6E,0x76,0x82,0x86,0x8A,0x8E,0x88,0x7F,0x7E, +0x83,0x81,0x7B,0x79,0x7F,0x82,0x7F,0x7A,0x77,0x7D,0x88,0x8A,0x8A,0x8D,0x8E,0x8B, +0x8B,0x8E,0x91,0x8A,0x7D,0x79,0x76,0x75,0x74,0x73,0x7D,0x86,0x86,0x83,0x7F,0x7B, +0x79,0x77,0x75,0x78,0x81,0x86,0x88,0x8D,0x8C,0x85,0x84,0x85,0x85,0x80,0x79,0x7A, +0x7B,0x7D,0x80,0x84,0x8B,0x8C,0x85,0x83,0x8D,0x94,0x90,0x8E,0x8C,0x85,0x82,0x82, +0x82,0x84,0x82,0x80,0x81,0x81,0x78,0x74,0x78,0x7F,0x84,0x85,0x82,0x80,0x7F,0x7F, +0x80,0x7E,0x7B,0x7B,0x7E,0x7E,0x7F,0x82,0x85,0x89,0x8B,0x88,0x85,0x86,0x89,0x8B, +0x85,0x80,0x7F,0x86,0x8F,0x95,0x96,0x93,0x87,0x80,0x7F,0x7D,0x76,0x72,0x6B,0x67, +0x69,0x6B,0x6E,0x72,0x75,0x76,0x7C,0x83,0x80,0x76,0x74,0x74,0x7A,0x82,0x81,0x7F, +0x82,0x82,0x7C,0x81,0x8F,0x8E,0x82,0x7B,0x75,0x71,0x74,0x7D,0x84,0x87,0x84,0x81, +0x81,0x7D,0x71,0x6F,0x74,0x77,0x77,0x73,0x75,0x82,0x83,0x7A,0x74,0x79,0x7E,0x7B, +0x7C,0x7E,0x84,0x8B,0x87,0x84,0x86,0x8B,0x87,0x7E,0x80,0x80,0x7B,0x7B,0x7B,0x80, +0x8A,0x8C,0x89,0x87,0x88,0x86,0x7D,0x7B,0x7F,0x84,0x83,0x85,0x8B,0x8B,0x8E,0x91, +0x88,0x77,0x6F,0x74,0x76,0x72,0x76,0x80,0x89,0x8F,0x89,0x7F,0x7C,0x7C,0x7E,0x7D, +0x7E,0x7E,0x79,0x77,0x78,0x7E,0x88,0x8C,0x8C,0x8C,0x8E,0x8D,0x83,0x7C,0x81,0x87, +0x89,0x82,0x80,0x7F,0x81,0x8C,0x91,0x8E,0x8A,0x8E,0x88,0x7C,0x74,0x73,0x75,0x76, +0x77,0x7C,0x80,0x7F,0x7D,0x80,0x82,0x7D,0x7A,0x83,0x85,0x7D,0x80,0x84,0x84,0x81, +0x83,0x85,0x88,0x83,0x78,0x78,0x7F,0x82,0x83,0x80,0x7D,0x83,0x83,0x7C,0x76,0x79, +0x81,0x8A,0x87,0x7C,0x7C,0x8A,0x8D,0x8A,0x86,0x7D,0x78,0x7A,0x74,0x6B,0x6A,0x70, +0x78,0x7A,0x7C,0x7C,0x88,0x8E,0x87,0x85,0x89,0x85,0x85,0x86,0x82,0x7D,0x80,0x7F, +0x7D,0x83,0x82,0x7B,0x7F,0x7C,0x74,0x75,0x76,0x75,0x70,0x74,0x79,0x79,0x7A,0x7B, +0x83,0x8F,0x8D,0x87,0x89,0x88,0x83,0x7C,0x77,0x76,0x7D,0x81,0x80,0x7C,0x7F,0x7F, +0x7E,0x7E,0x81,0x7F,0x7B,0x7C,0x7A,0x75,0x76,0x7D,0x83,0x85,0x82,0x87,0x8A,0x8A, +0x85,0x7F,0x7A,0x82,0x84,0x7F,0x7C,0x7E,0x85,0x82,0x82,0x7C,0x7B,0x7A,0x75,0x71, +0x7A,0x81,0x8B,0x8F,0x8D,0x83,0x7B,0x7D,0x7F,0x7D,0x81,0x88,0x8B,0x8A,0x88,0x8B, +0x88,0x89,0x80,0x83,0x8F,0x95,0x8D,0x85,0x80,0x82,0x87,0x8D,0x8F,0x87,0x7F,0x73, +0x72,0x73,0x76,0x81,0x8E,0x8B,0x82,0x75,0x75,0x78,0x7C,0x7F,0x7E,0x86,0x8B,0x85, +0x83,0x82,0x80,0x83,0x84,0x85,0x7F,0x82,0x7E,0x7D,0x84,0x84,0x80,0x87,0x8A,0x87, +0x84,0x8A,0x8E,0x82,0x7A,0x76,0x75,0x70,0x65,0x67,0x78,0x82,0x8A,0x88,0x85,0x80, +0x81,0x80,0x7A,0x7B,0x7D,0x7A,0x7C,0x78,0x72,0x78,0x7C,0x7C,0x78,0x7C,0x7A,0x75, +0x76,0x74,0x74,0x81,0x82,0x87,0x92,0x97,0x97,0x8D,0x82,0x78,0x7C,0x87,0x8B,0x88, +0x82,0x78,0x77,0x78,0x7C,0x7D,0x76,0x72,0x70,0x73,0x77,0x70,0x70,0x75,0x7A,0x85, +0x8A,0x8D,0x87,0x81,0x7C,0x78,0x73,0x74,0x75,0x78,0x79,0x7B,0x80,0x87,0x8F,0x8E, +0x88,0x8C,0x8E,0x85,0x80,0x7F,0x84,0x82,0x81,0x83,0x84,0x85,0x80,0x7A,0x7D,0x80, +0x7C,0x76,0x79,0x7E,0x7D,0x7D,0x7F,0x80,0x83,0x87,0x83,0x83,0x85,0x80,0x7B,0x7D, +0x84,0x8A,0x89,0x83,0x81,0x7F,0x7F,0x84,0x89,0x89,0x89,0x89,0x87,0x82,0x80,0x7D, +0x81,0x85,0x80,0x7B,0x7E,0x7E,0x81,0x87,0x86,0x83,0x81,0x81,0x82,0x80,0x7D,0x7E, +0x82,0x87,0x8A,0x89,0x87,0x85,0x81,0x84,0x89,0x8B,0x8B,0x8A,0x85,0x80,0x7E,0x7F, +0x81,0x7F,0x7B,0x76,0x7B,0x85,0x88,0x84,0x85,0x88,0x8D,0x8A,0x86,0x89,0x8A,0x81, +0x76,0x72,0x73,0x72,0x6B,0x6D,0x7A,0x82,0x81,0x7D,0x7C,0x7F,0x7D,0x74,0x70,0x71, +0x74,0x7D,0x88,0x8C,0x8A,0x86,0x87,0x8B,0x89,0x81,0x78,0x75,0x71,0x69,0x69,0x77, +0x82,0x85,0x87,0x88,0x86,0x86,0x7F,0x74,0x73,0x7A,0x7A,0x71,0x6F,0x70,0x72,0x7C, +0x83,0x81,0x7B,0x76,0x70,0x6D,0x71,0x73,0x78,0x80,0x84,0x87,0x8B,0x8F,0x8D,0x84, +0x7E,0x7F,0x82,0x80,0x7A,0x77,0x7E,0x87,0x89,0x88,0x87,0x81,0x79,0x79,0x7F,0x81, +0x7F,0x87,0x8F,0x90,0x8D,0x88,0x86,0x85,0x85,0x8A,0x8E,0x85,0x7C,0x79,0x7E,0x85, +0x84,0x7E,0x7F,0x85,0x85,0x82,0x7F,0x80,0x85,0x8B,0x8C,0x8D,0x8C,0x85,0x7F,0x7F, +0x80,0x7F,0x7B,0x7B,0x7E,0x7F,0x7E,0x7F,0x83,0x83,0x84,0x86,0x87,0x85,0x81,0x7E, +0x7B,0x7A,0x7D,0x84,0x8D,0x8F,0x8D,0x8F,0x90,0x8C,0x84,0x7E,0x7F,0x7F,0x7B,0x7A, +0x7F,0x81,0x81,0x82,0x84,0x81,0x78,0x71,0x70,0x6F,0x6A,0x6B,0x73,0x79,0x7B,0x7B, +0x7A,0x7B,0x7F,0x86,0x88,0x88,0x8D,0x8C,0x86,0x82,0x84,0x88,0x8C,0x8E,0x88,0x80, +0x77,0x76,0x7C,0x7C,0x79,0x78,0x7C,0x80,0x7C,0x7C,0x82,0x83,0x80,0x79,0x78,0x79, +0x77,0x79,0x7D,0x82,0x84,0x7F,0x79,0x75,0x70,0x6A,0x65,0x67,0x6E,0x73,0x7B,0x80, +0x80,0x7F,0x7E,0x82,0x87,0x8C,0x91,0x91,0x8C,0x84,0x85,0x88,0x87,0x86,0x86,0x86, +0x85,0x7E,0x7E,0x80,0x83,0x84,0x7E,0x77,0x73,0x70,0x70,0x73,0x75,0x79,0x7E,0x83, +0x89,0x89,0x88,0x82,0x76,0x70,0x74,0x79,0x7D,0x83,0x89,0x8D,0x93,0x94,0x8F,0x90, +0x8D,0x87,0x81,0x80,0x83,0x87,0x8D,0x8F,0x8A,0x88,0x87,0x89,0x87,0x81,0x7B,0x75, +0x71,0x6E,0x6F,0x76,0x79,0x7E,0x87,0x8A,0x87,0x86,0x86,0x83,0x7C,0x7A,0x7C,0x7F, +0x81,0x83,0x85,0x87,0x8B,0x91,0x94,0x97,0x96,0x91,0x88,0x7F,0x7E,0x87,0x91,0x92, +0x8D,0x8B,0x8A,0x83,0x7F,0x79,0x74,0x6F,0x67,0x63,0x6B,0x76,0x7C,0x81,0x84,0x81, +0x81,0x86,0x85,0x7E,0x75,0x71,0x73,0x77,0x78,0x7B,0x81,0x85,0x84,0x82,0x82,0x85, +0x84,0x7F,0x7D,0x7E,0x7F,0x7C,0x7D,0x86,0x8B,0x89,0x86,0x82,0x80,0x7C,0x7A,0x7B, +0x77,0x6E,0x68,0x6A,0x6F,0x6F,0x6D,0x6C,0x6E,0x71,0x73,0x78,0x7B,0x7E,0x7F,0x7D, +0x81,0x80,0x7A,0x77,0x78,0x78,0x76,0x7A,0x82,0x8C,0x90,0x89,0x80,0x81,0x80,0x83, +0x86,0x85,0x8C,0x92,0x8F,0x8A,0x8B,0x8E,0x8A,0x86,0x83,0x7D,0x79,0x76,0x71,0x71, +0x74,0x7A,0x81,0x80,0x7D,0x78,0x75,0x7A,0x7E,0x84,0x84,0x82,0x82,0x85,0x86,0x84, +0x83,0x86,0x88,0x90,0x90,0x8E,0x91,0x92,0x8D,0x8C,0x91,0x95,0x8E,0x88,0x83,0x84, +0x8A,0x88,0x7D,0x75,0x76,0x7C,0x7B,0x7A,0x7E,0x82,0x8C,0x8E,0x85,0x7B,0x76,0x7E, +0x83,0x7C,0x7A,0x7F,0x85,0x86,0x7E,0x7C,0x80,0x83,0x7F,0x7F,0x80,0x7C,0x77,0x7A, +0x7B,0x81,0x87,0x8B,0x89,0x82,0x81,0x82,0x85,0x85,0x7F,0x7D,0x81,0x89,0x89,0x7A, +0x73,0x76,0x76,0x75,0x73,0x77,0x81,0x80,0x7B,0x76,0x77,0x7C,0x80,0x84,0x81,0x7D, +0x81,0x84,0x87,0x86,0x83,0x83,0x7A,0x74,0x75,0x7A,0x7B,0x76,0x7A,0x82,0x86,0x80, +0x77,0x78,0x7E,0x7F,0x7A,0x71,0x73,0x7D,0x85,0x87,0x89,0x8F,0x90,0x8A,0x82,0x7E, +0x79,0x75,0x74,0x78,0x78,0x78,0x7C,0x82,0x83,0x7D,0x7B,0x81,0x85,0x7F,0x78,0x75, +0x77,0x7B,0x7D,0x7C,0x83,0x8D,0x8C,0x84,0x7D,0x7E,0x81,0x83,0x84,0x80,0x7C,0x7C, +0x7C,0x80,0x84,0x87,0x8A,0x8B,0x81,0x79,0x7E,0x85,0x88,0x84,0x7A,0x7B,0x87,0x8B, +0x85,0x80,0x81,0x82,0x82,0x7F,0x7E,0x7F,0x80,0x7E,0x7E,0x7F,0x7F,0x7E,0x7D,0x79, +0x73,0x73,0x79,0x7B,0x7F,0x86,0x8E,0x93,0x94,0x92,0x8F,0x8A,0x80,0x78,0x78,0x81, +0x89,0x8F,0x92,0x94,0x95,0x92,0x8E,0x89,0x84,0x7B,0x77,0x7A,0x7B,0x79,0x7B,0x87, +0x8E,0x85,0x7A,0x7A,0x81,0x82,0x78,0x6C,0x6A,0x73,0x79,0x7C,0x7A,0x7B,0x81,0x86, +0x88,0x85,0x81,0x81,0x89,0x88,0x82,0x82,0x83,0x82,0x7B,0x75,0x79,0x85,0x8D,0x84, +0x7E,0x85,0x87,0x81,0x7D,0x78,0x73,0x73,0x71,0x72,0x77,0x78,0x76,0x77,0x78,0x74, +0x7A,0x83,0x82,0x7A,0x77,0x78,0x79,0x7B,0x7C,0x7D,0x87,0x89,0x84,0x83,0x83,0x81, +0x7D,0x7B,0x7A,0x80,0x82,0x7D,0x78,0x7A,0x79,0x80,0x8C,0x90,0x8B,0x83,0x7F,0x7D, +0x7C,0x78,0x74,0x77,0x7B,0x77,0x7D,0x8C,0x92,0x90,0x88,0x7D,0x7A,0x7B,0x75,0x70, +0x78,0x7F,0x81,0x88,0x87,0x82,0x88,0x8C,0x86,0x88,0x87,0x7C,0x76,0x80,0x86,0x8E, +0x92,0x87,0x80,0x7F,0x79,0x77,0x85,0x87,0x7B,0x7F,0x86,0x86,0x89,0x8B,0x8C,0x8B, +0x83,0x7C,0x81,0x89,0x84,0x81,0x82,0x7E,0x7B,0x84,0x82,0x7B,0x7D,0x79,0x74,0x74, +0x7A,0x7C,0x80,0x84,0x84,0x8B,0x8A,0x86,0x84,0x83,0x80,0x82,0x8B,0x8E,0x83,0x83, +0x83,0x7D,0x7E,0x7F,0x77,0x7C,0x7A,0x79,0x80,0x80,0x7E,0x7D,0x81,0x7D,0x79,0x84, +0x8A,0x86,0x88,0x89,0x8B,0x82,0x79,0x70,0x74,0x79,0x6F,0x70,0x78,0x75,0x7E,0x85, +0x84,0x85,0x7E,0x7C,0x79,0x76,0x6B,0x6B,0x7C,0x87,0x84,0x89,0x89,0x8C,0x93,0x90, +0x8B,0x84,0x8E,0x87,0x7E,0x82,0x84,0x84,0x81,0x78,0x78,0x79,0x7B,0x7C,0x80,0x7C, +0x73,0x7B,0x7F,0x72,0x6A,0x6C,0x6E,0x73,0x74,0x7D,0x80,0x86,0x88,0x88,0x8C,0x8A, +0x85,0x88,0x7B,0x72,0x7B,0x82,0x85,0x82,0x82,0x81,0x82,0x87,0x89,0x81,0x80,0x84, +0x87,0x84,0x79,0x77,0x84,0x7C,0x7B,0x79,0x7B,0x79,0x73,0x73,0x74,0x7A,0x7A,0x71, +0x78,0x7F,0x7B,0x84,0x84,0x83,0x86,0x8D,0x8E,0x87,0x88,0x86,0x80,0x8D,0x86,0x7F, +0x85,0x86,0x8A,0x86,0x84,0x85,0x8B,0x8D,0x7B,0x76,0x82,0x82,0x84,0x88,0x8A,0x90, +0x90,0x8A,0x7F,0x7C,0x7D,0x72,0x75,0x7B,0x6C,0x72,0x7B,0x7F,0x80,0x84,0x87,0x8A, +0x87,0x7D,0x73,0x7C,0x83,0x7E,0x82,0x8A,0x96,0x9D,0x96,0x88,0x82,0x83,0x81,0x79, +0x7F,0x7F,0x7D,0x80,0x80,0x87,0x8D,0x89,0x88,0x80,0x77,0x72,0x75,0x79,0x76,0x7D, +0x80,0x79,0x7C,0x7D,0x7A,0x7C,0x7A,0x75,0x76,0x7A,0x7C,0x7C,0x82,0x7F,0x7A,0x7E, +0x7F,0x82,0x86,0x82,0x80,0x80,0x84,0x85,0x86,0x83,0x7E,0x83,0x88,0x82,0x81,0x83, +0x7F,0x7D,0x7D,0x80,0x80,0x7D,0x76,0x74,0x7B,0x7C,0x7A,0x7C,0x78,0x78,0x7A,0x7A, +0x78,0x7B,0x83,0x82,0x7B,0x7E,0x82,0x84,0x86,0x89,0x8D,0x8C,0x84,0x7E,0x7B,0x77, +0x72,0x79,0x82,0x81,0x7E,0x7B,0x79,0x76,0x77,0x7B,0x83,0x8C,0x8E,0x8E,0x8D,0x86, +0x7D,0x81,0x88,0x89,0x83,0x7D,0x7B,0x80,0x84,0x7E,0x77,0x7A,0x80,0x81,0x76,0x6B, +0x6C,0x75,0x7F,0x89,0x8B,0x8B,0x8A,0x88,0x87,0x87,0x87,0x81,0x7E,0x7E,0x7E,0x7D, +0x81,0x81,0x7B,0x77,0x7B,0x81,0x88,0x8E,0x8E,0x8B,0x8C,0x8D,0x89,0x85,0x84,0x7E, +0x7A,0x7A,0x7E,0x80,0x7E,0x7F,0x81,0x80,0x7F,0x81,0x81,0x7E,0x7C,0x79,0x7B,0x80, +0x7F,0x7C,0x80,0x8E,0x94,0x90,0x8B,0x8B,0x8A,0x81,0x7B,0x80,0x84,0x85,0x84,0x7F, +0x7C,0x82,0x86,0x8B,0x8E,0x88,0x7F,0x7F,0x80,0x7D,0x7A,0x75,0x72,0x73,0x74,0x76, +0x7E,0x85,0x83,0x7D,0x7A,0x79,0x75,0x73,0x76,0x82,0x87,0x7F,0x7B,0x78,0x78,0x7B, +0x80,0x87,0x8A,0x82,0x79,0x7B,0x7D,0x79,0x79,0x81,0x83,0x83,0x85,0x80,0x7E,0x80, +0x80,0x7D,0x82,0x87,0x83,0x7D,0x78,0x75,0x75,0x74,0x77,0x7D,0x7D,0x79,0x7A,0x7F, +0x82,0x7E,0x78,0x72,0x6A,0x6A,0x77,0x7F,0x7D,0x7C,0x7F,0x82,0x85,0x87,0x86,0x85, +0x85,0x81,0x7C,0x7A,0x80,0x8B,0x8F,0x93,0x94,0x90,0x8C,0x8B,0x8C,0x88,0x7F,0x7A, +0x7D,0x85,0x8A,0x86,0x84,0x84,0x81,0x7D,0x76,0x74,0x74,0x75,0x74,0x72,0x7A,0x7F, +0x80,0x86,0x8F,0x8E,0x8A,0x88,0x85,0x88,0x8B,0x8C,0x89,0x8A,0x89,0x88,0x8B,0x87, +0x7E,0x7D,0x7E,0x7B,0x7F,0x86,0x88,0x84,0x83,0x81,0x81,0x86,0x87,0x83,0x81,0x7E, +0x7E,0x7C,0x78,0x74,0x79,0x7A,0x76,0x7D,0x83,0x80,0x7D,0x7A,0x75,0x73,0x71,0x77, +0x7E,0x88,0x94,0x99,0x98,0x90,0x8B,0x8A,0x85,0x80,0x7E,0x7C,0x7B,0x7C,0x84,0x87, +0x81,0x80,0x86,0x8B,0x83,0x72,0x6B,0x6A,0x6C,0x6B,0x68,0x6F,0x78,0x7F,0x7F,0x7C, +0x7E,0x7D,0x78,0x7A,0x79,0x7A,0x7B,0x7F,0x82,0x83,0x88,0x8C,0x8B,0x8F,0x91,0x8D, +0x87,0x81,0x7A,0x72,0x70,0x74,0x77,0x7A,0x7C,0x7E,0x84,0x83,0x84,0x84,0x84,0x87, +0x86,0x7F,0x76,0x73,0x75,0x76,0x74,0x6D,0x6E,0x79,0x7A,0x7B,0x80,0x7E,0x7A,0x7C, +0x84,0x88,0x85,0x87,0x87,0x84,0x82,0x82,0x88,0x8C,0x8E,0x90,0x90,0x8D,0x85,0x7B, +0x78,0x73,0x72,0x77,0x79,0x7A,0x82,0x8D,0x8F,0x8A,0x87,0x86,0x86,0x81,0x79,0x79, +0x7E,0x80,0x7D,0x78,0x78,0x7E,0x8A,0x93,0x8B,0x83,0x83,0x83,0x7F,0x79,0x7C,0x83, +0x88,0x8C,0x89,0x87,0x8C,0x8E,0x8C,0x84,0x81,0x86,0x88,0x85,0x7C,0x7A,0x7E,0x79, +0x76,0x7C,0x84,0x84,0x7C,0x7F,0x88,0x88,0x81,0x7B,0x7C,0x82,0x83,0x83,0x85,0x86, +0x84,0x81,0x84,0x85,0x82,0x7E,0x78,0x7A,0x7F,0x80,0x80,0x7F,0x7E,0x7F,0x7F,0x83, +0x86,0x85,0x80,0x77,0x79,0x7E,0x81,0x84,0x87,0x86,0x81,0x7B,0x7B,0x7C,0x79,0x77, +0x78,0x78,0x77,0x77,0x78,0x77,0x78,0x77,0x78,0x7C,0x7A,0x7B,0x80,0x82,0x7E,0x79, +0x77,0x77,0x77,0x77,0x73,0x75,0x79,0x7D,0x7A,0x7A,0x81,0x89,0x89,0x84,0x7D,0x78, +0x7C,0x84,0x85,0x7F,0x78,0x7A,0x82,0x87,0x87,0x87,0x8C,0x8C,0x85,0x82,0x83,0x87, +0x8B,0x87,0x7E,0x79,0x7B,0x7F,0x7E,0x7E,0x7E,0x81,0x84,0x83,0x7E,0x76,0x72,0x6F, +0x70,0x74,0x77,0x7E,0x8A,0x8F,0x90,0x95,0x9B,0x97,0x8C,0x83,0x7F,0x7E,0x7E,0x7F, +0x80,0x86,0x90,0x90,0x8C,0x8B,0x89,0x85,0x81,0x7B,0x77,0x7A,0x82,0x88,0x89,0x8B, +0x8C,0x8B,0x87,0x7B,0x73,0x72,0x73,0x72,0x6F,0x74,0x7C,0x82,0x84,0x85,0x87,0x87, +0x83,0x7F,0x7E,0x83,0x89,0x8B,0x88,0x88,0x8A,0x88,0x83,0x85,0x84,0x81,0x7E,0x7C, +0x77,0x77,0x79,0x79,0x7A,0x7B,0x7C,0x7E,0x7B,0x77,0x75,0x75,0x73,0x72,0x74,0x75, +0x7B,0x82,0x85,0x8A,0x8B,0x84,0x81,0x83,0x82,0x7A,0x74,0x75,0x7B,0x82,0x88,0x87, +0x8A,0x91,0x90,0x8C,0x86,0x7E,0x75,0x70,0x70,0x74,0x7E,0x85,0x87,0x8B,0x89,0x82, +0x7D,0x7B,0x7D,0x7A,0x75,0x6B,0x6A,0x78,0x7F,0x82,0x86,0x84,0x7F,0x75,0x71,0x75, +0x7A,0x7E,0x7D,0x82,0x89,0x88,0x89,0x84,0x7D,0x7B,0x7E,0x85,0x85,0x83,0x88,0x8D, +0x89,0x85,0x87,0x89,0x84,0x7F,0x7E,0x7F,0x80,0x78,0x75,0x7A,0x83,0x88,0x82,0x7C, +0x7B,0x7E,0x7E,0x75,0x76,0x7C,0x7D,0x7E,0x7C,0x77,0x79,0x7F,0x84,0x85,0x83,0x81, +0x84,0x87,0x7E,0x78,0x81,0x8A,0x8D,0x8F,0x8D,0x8C,0x8A,0x89,0x8B,0x8A,0x85,0x81, +0x81,0x81,0x7E,0x82,0x8D,0x8F,0x86,0x7D,0x7D,0x7B,0x7A,0x7D,0x7C,0x78,0x7C,0x80, +0x81,0x81,0x88,0x8F,0x88,0x7F,0x78,0x79,0x7F,0x7C,0x7D,0x83,0x82,0x87,0x8F,0x91, +0x89,0x80,0x80,0x7A,0x76,0x79,0x79,0x7E,0x82,0x83,0x8A,0x87,0x80,0x76,0x75,0x78, +0x7B,0x7B,0x78,0x71,0x74,0x79,0x7D,0x83,0x86,0x87,0x85,0x81,0x7A,0x74,0x76,0x7B, +0x82,0x89,0x88,0x88,0x87,0x86,0x7D,0x75,0x79,0x7A,0x76,0x77,0x7D,0x7B,0x77,0x73, +0x7B,0x7E,0x82,0x82,0x81,0x82,0x7A,0x78,0x7E,0x7A,0x75,0x76,0x79,0x85,0x87,0x87, +0x84,0x88,0x80,0x72,0x71,0x71,0x71,0x78,0x7C,0x7E,0x8E,0x98,0x94,0x8C,0x8D,0x88, +0x84,0x82,0x7C,0x74,0x76,0x75,0x7F,0x85,0x84,0x8B,0x96,0x97,0x89,0x85,0x8B,0x8C, +0x83,0x7D,0x7C,0x81,0x81,0x7C,0x79,0x7C,0x7D,0x7E,0x78,0x75,0x77,0x7E,0x82,0x7E, +0x7F,0x7F,0x86,0x86,0x89,0x87,0x86,0x86,0x90,0x8F,0x86,0x7F,0x7F,0x7E,0x79,0x76, +0x7B,0x7C,0x78,0x78,0x7A,0x86,0x8D,0x8F,0x8B,0x8E,0x8A,0x7E,0x7A,0x83,0x86,0x82, +0x83,0x87,0x85,0x85,0x82,0x77,0x72,0x70,0x6F,0x77,0x80,0x7C,0x75,0x73,0x7C,0x80, +0x85,0x85,0x85,0x84,0x7F,0x7A,0x77,0x7D,0x7D,0x7E,0x7E,0x7C,0x7F,0x85,0x83,0x80, +0x7E,0x82,0x81,0x7E,0x7E,0x77,0x7E,0x86,0x87,0x8B,0x8B,0x88,0x84,0x7E,0x7D,0x7D, +0x81,0x7F,0x78,0x7D,0x81,0x80,0x80,0x7C,0x7C,0x7C,0x7C,0x7D,0x7E,0x80,0x7E,0x7F, +0x81,0x7F,0x82,0x81,0x7C,0x7A,0x77,0x75,0x73,0x77,0x7E,0x82,0x8B,0x90,0x8E,0x8C, +0x83,0x7D,0x7E,0x7E,0x81,0x82,0x85,0x89,0x88,0x81,0x7D,0x84,0x86,0x7C,0x73,0x70, +0x73,0x77,0x7A,0x77,0x75,0x7C,0x80,0x80,0x83,0x80,0x7C,0x82,0x84,0x80,0x7D,0x7D, +0x7E,0x7F,0x82,0x82,0x82,0x84,0x81,0x7B,0x7A,0x7D,0x81,0x82,0x84,0x8A,0x89,0x83, +0x7F,0x82,0x84,0x84,0x80,0x7B,0x7F,0x87,0x86,0x81,0x7E,0x7C,0x78,0x79,0x7E,0x80, +0x81,0x80,0x7F,0x82,0x84,0x89,0x8F,0x91,0x95,0x95,0x8E,0x84,0x7D,0x79,0x76,0x77, +0x7E,0x81,0x82,0x86,0x90,0x96,0x91,0x8A,0x82,0x7D,0x7A,0x75,0x72,0x78,0x82,0x85, +0x86,0x89,0x87,0x82,0x7E,0x7D,0x79,0x72,0x70,0x74,0x7C,0x7F,0x7F,0x85,0x8F,0x8F, +0x8D,0x88,0x80,0x80,0x80,0x7F,0x80,0x83,0x83,0x83,0x86,0x84,0x7D,0x79,0x76,0x72, +0x6A,0x67,0x6D,0x79,0x83,0x88,0x8A,0x88,0x85,0x82,0x81,0x7E,0x76,0x6B,0x6B,0x74, +0x7E,0x83,0x85,0x86,0x86,0x80,0x7B,0x78,0x7C,0x82,0x7F,0x7E,0x84,0x89,0x88,0x86, +0x8B,0x8F,0x87,0x80,0x7D,0x79,0x79,0x7C,0x7C,0x7C,0x7E,0x7E,0x7F,0x83,0x81,0x7D, +0x7D,0x7D,0x7E,0x7E,0x7E,0x7F,0x82,0x80,0x7C,0x81,0x86,0x82,0x7C,0x7A,0x79,0x7C, +0x7E,0x80,0x87,0x8A,0x85,0x87,0x8E,0x8D,0x85,0x80,0x7C,0x77,0x74,0x72,0x73,0x7B, +0x80,0x82,0x84,0x84,0x84,0x84,0x85,0x87,0x8A,0x88,0x82,0x7F,0x81,0x80,0x83,0x8B, +0x8D,0x8B,0x85,0x7E,0x78,0x76,0x7A,0x80,0x87,0x88,0x82,0x7F,0x7E,0x7F,0x7F,0x7C, +0x78,0x77,0x7C,0x84,0x88,0x86,0x80,0x7E,0x81,0x7F,0x7B,0x76,0x76,0x7B,0x77,0x73, +0x78,0x83,0x87,0x82,0x80,0x81,0x83,0x86,0x82,0x7E,0x80,0x86,0x8A,0x8C,0x90,0x92, +0x8B,0x87,0x85,0x84,0x7F,0x7B,0x7C,0x7E,0x7A,0x7C,0x84,0x86,0x84,0x83,0x85,0x7F, +0x7C,0x7F,0x7C,0x7E,0x7C,0x74,0x70,0x6F,0x76,0x7E,0x82,0x80,0x79,0x77,0x77,0x77, +0x7D,0x81,0x85,0x86,0x81,0x81,0x83,0x8B,0x93,0x90,0x8F,0x89,0x84,0x7E,0x76,0x77, +0x76,0x71,0x71,0x71,0x75,0x7D,0x82,0x81,0x7A,0x76,0x78,0x7C,0x82,0x7C,0x78,0x7E, +0x81,0x81,0x7D,0x7C,0x81,0x7F,0x7C,0x7B,0x7E,0x7F,0x7A,0x78,0x7B,0x80,0x88,0x89, +0x86,0x82,0x82,0x83,0x7E,0x7D,0x7F,0x80,0x82,0x80,0x7D,0x7F,0x80,0x83,0x83,0x80, +0x7F,0x81,0x81,0x7C,0x7A,0x7F,0x84,0x86,0x80,0x7B,0x7E,0x84,0x88,0x85,0x7F,0x7E, +0x7F,0x83,0x80,0x80,0x8C,0x93,0x8F,0x89,0x88,0x8B,0x8A,0x87,0x82,0x7E,0x82,0x86, +0x86,0x85,0x7F,0x7D,0x7F,0x7F,0x7C,0x7C,0x7F,0x7E,0x7A,0x7A,0x7C,0x83,0x89,0x86, +0x83,0x81,0x7F,0x81,0x84,0x83,0x7E,0x7B,0x7C,0x7D,0x83,0x89,0x89,0x85,0x7F,0x82, +0x8A,0x8B,0x82,0x7A,0x7C,0x81,0x83,0x83,0x84,0x88,0x87,0x83,0x7D,0x7B,0x7A,0x7C, +0x7A,0x7A,0x7C,0x7A,0x71,0x6D,0x70,0x72,0x77,0x7F,0x87,0x8A,0x88,0x86,0x83,0x7D, +0x75,0x6E,0x70,0x77,0x7E,0x83,0x87,0x8A,0x8B,0x8A,0x87,0x84,0x80,0x7B,0x78,0x76, +0x73,0x71,0x77,0x7E,0x81,0x81,0x83,0x88,0x8D,0x89,0x7F,0x7A,0x7D,0x7C,0x75,0x74, +0x78,0x7D,0x7D,0x7B,0x7B,0x7E,0x80,0x82,0x83,0x83,0x83,0x82,0x82,0x83,0x7E,0x7B, +0x7E,0x82,0x85,0x88,0x8B,0x87,0x80,0x7D,0x80,0x87,0x88,0x7E,0x7A,0x7D,0x84,0x86, +0x83,0x82,0x81,0x80,0x7C,0x79,0x7B,0x80,0x82,0x82,0x80,0x7D,0x7A,0x7D,0x82,0x80, +0x80,0x82,0x83,0x83,0x7E,0x7C,0x84,0x89,0x86,0x7D,0x7F,0x85,0x87,0x89,0x8B,0x8B, +0x8E,0x8B,0x83,0x7A,0x76,0x78,0x7A,0x7C,0x7E,0x82,0x87,0x8B,0x89,0x83,0x7C,0x7A, +0x7B,0x7B,0x7A,0x79,0x79,0x7B,0x7D,0x7F,0x84,0x8C,0x92,0x90,0x87,0x80,0x80,0x83, +0x83,0x82,0x84,0x85,0x85,0x85,0x85,0x80,0x7A,0x76,0x74,0x76,0x79,0x7B,0x7C,0x7D, +0x7F,0x81,0x82,0x81,0x7F,0x83,0x84,0x7D,0x79,0x7B,0x80,0x86,0x8E,0x8D,0x82,0x7D, +0x7C,0x7B,0x7A,0x75,0x6F,0x73,0x76,0x76,0x7C,0x88,0x8C,0x86,0x84,0x80,0x7B,0x7C, +0x77,0x72,0x73,0x75,0x75,0x7A,0x85,0x85,0x82,0x83,0x7F,0x79,0x7D,0x7E,0x7D,0x7E, +0x7D,0x7D,0x82,0x87,0x83,0x7C,0x80,0x83,0x82,0x7D,0x75,0x79,0x82,0x81,0x7C,0x7F, +0x85,0x86,0x84,0x83,0x7C,0x7B,0x80,0x80,0x7F,0x7B,0x7A,0x7F,0x82,0x7C,0x7F,0x85, +0x83,0x7A,0x7A,0x7F,0x84,0x90,0x97,0x91,0x93,0x98,0x8F,0x83,0x7C,0x7B,0x80,0x88, +0x85,0x7F,0x83,0x88,0x84,0x83,0x7E,0x76,0x74,0x78,0x78,0x7C,0x7F,0x79,0x79,0x82, +0x86,0x8C,0x98,0x8F,0x81,0x7A,0x73,0x71,0x79,0x78,0x7D,0x87,0x8F,0x8A,0x88,0x8D, +0x8C,0x89,0x81,0x78,0x78,0x81,0x7A,0x7D,0x83,0x81,0x83,0x8E,0x8D,0x87,0x83,0x83, +0x7E,0x7D,0x77,0x75,0x85,0x85,0x7A,0x73,0x79,0x7B,0x7E,0x7B,0x74,0x71,0x79,0x7C, +0x7A,0x7F,0x7E,0x83,0x85,0x7E,0x7F,0x80,0x82,0x80,0x7A,0x80,0x83,0x8C,0x8D,0x83, +0x83,0x86,0x81,0x7E,0x79,0x75,0x7A,0x7D,0x7C,0x78,0x7F,0x84,0x83,0x8A,0x88,0x81, +0x7A,0x73,0x73,0x71,0x74,0x74,0x75,0x7B,0x7C,0x7E,0x86,0x84,0x83,0x86,0x8C,0x8B, +0x82,0x7D,0x79,0x7C,0x83,0x80,0x86,0x85,0x86,0x89,0x82,0x79,0x76,0x7C,0x85,0x7E, +0x7B,0x79,0x76,0x7D,0x7B,0x7D,0x83,0x85,0x89,0x85,0x81,0x82,0x83,0x87,0x7E,0x7C, +0x82,0x81,0x85,0x81,0x7F,0x86,0x84,0x84,0x85,0x84,0x88,0x7E,0x7D,0x80,0x81,0x86, +0x83,0x83,0x88,0x84,0x84,0x85,0x7F,0x7C,0x7B,0x81,0x83,0x7F,0x7B,0x73,0x77,0x7A, +0x78,0x7F,0x81,0x80,0x7F,0x85,0x85,0x81,0x84,0x87,0x86,0x86,0x82,0x7B,0x7B,0x7E, +0x85,0x8B,0x90,0x8E,0x84,0x80,0x85,0x87,0x89,0x82,0x7D,0x7D,0x7F,0x7D,0x7B,0x7F, +0x86,0x8A,0x89,0x83,0x7E,0x83,0x83,0x7F,0x7E,0x7B,0x7C,0x7E,0x7E,0x7C,0x7A,0x7D, +0x81,0x7E,0x79,0x75,0x79,0x7A,0x75,0x75,0x7A,0x79,0x7A,0x81,0x88,0x87,0x88,0x86, +0x83,0x7D,0x71,0x70,0x77,0x7E,0x83,0x83,0x7D,0x7D,0x81,0x85,0x82,0x82,0x82,0x79, +0x75,0x78,0x7C,0x81,0x7F,0x7D,0x7F,0x84,0x85,0x85,0x86,0x86,0x81,0x80,0x82,0x7E, +0x79,0x79,0x7E,0x7C,0x78,0x75,0x70,0x71,0x72,0x77,0x7C,0x82,0x83,0x82,0x83,0x7F, +0x78,0x79,0x7A,0x7F,0x84,0x85,0x86,0x8E,0x95,0x98,0x95,0x8F,0x88,0x81,0x7E,0x7B, +0x7A,0x7C,0x7D,0x7D,0x7D,0x7C,0x7D,0x81,0x86,0x89,0x86,0x81,0x7F,0x81,0x82,0x86, +0x88,0x87,0x81,0x7B,0x7A,0x7B,0x7E,0x83,0x85,0x86,0x82,0x7E,0x7E,0x7F,0x7F,0x82, +0x82,0x80,0x7F,0x84,0x8B,0x8B,0x86,0x7E,0x7C,0x81,0x86,0x84,0x7D,0x79,0x7E,0x82, +0x83,0x81,0x81,0x84,0x84,0x84,0x85,0x84,0x84,0x86,0x85,0x7D,0x75,0x76,0x7B,0x7C, +0x77,0x74,0x79,0x80,0x84,0x84,0x87,0x86,0x7F,0x7B,0x76,0x73,0x74,0x76,0x79,0x7F, +0x87,0x8B,0x8F,0x92,0x8F,0x88,0x81,0x7A,0x74,0x76,0x79,0x7F,0x83,0x84,0x84,0x84, +0x85,0x82,0x7D,0x7C,0x7E,0x7D,0x79,0x76,0x78,0x7C,0x7A,0x7A,0x7B,0x7D,0x83,0x86, +0x86,0x85,0x82,0x7F,0x80,0x83,0x84,0x84,0x86,0x86,0x85,0x84,0x86,0x88,0x86,0x82, +0x7D,0x79,0x7B,0x7B,0x77,0x75,0x76,0x80,0x88,0x85,0x83,0x86,0x85,0x81,0x79,0x7A, +0x77,0x74,0x75,0x76,0x7B,0x7E,0x81,0x87,0x87,0x83,0x7F,0x7B,0x75,0x73,0x7F,0x88, +0x89,0x89,0x85,0x81,0x7F,0x7F,0x82,0x82,0x83,0x80,0x76,0x72,0x71,0x77,0x7A,0x79, +0x79,0x7B,0x7B,0x7A,0x80,0x87,0x88,0x87,0x88,0x8A,0x8B,0x87,0x87,0x88,0x81,0x7B, +0x7D,0x85,0x8B,0x8A,0x8B,0x8A,0x89,0x89,0x83,0x7F,0x7D,0x7B,0x7E,0x7C,0x7C,0x7E, +0x7F,0x83,0x80,0x80,0x7E,0x7C,0x7F,0x80,0x7D,0x7E,0x7D,0x83,0x85,0x82,0x7F,0x7C, +0x7E,0x81,0x7D,0x85,0x8B,0x87,0x82,0x7D,0x78,0x75,0x7B,0x85,0x88,0x89,0x85,0x83, +0x81,0x7E,0x80,0x82,0x80,0x7D,0x7B,0x81,0x84,0x83,0x86,0x85,0x80,0x7E,0x7A,0x7B, +0x7A,0x78,0x78,0x75,0x71,0x75,0x7B,0x7C,0x79,0x79,0x7D,0x80,0x80,0x81,0x7F,0x7D, +0x7E,0x7E,0x80,0x7F,0x7E,0x80,0x80,0x7F,0x7F,0x80,0x80,0x7C,0x7C,0x80,0x83,0x82, +0x7D,0x7D,0x80,0x7F,0x7B,0x7F,0x85,0x85,0x84,0x85,0x80,0x7C,0x7A,0x7B,0x81,0x81, +0x7C,0x7A,0x7C,0x7C,0x78,0x76,0x77,0x78,0x7D,0x7F,0x7E,0x82,0x8A,0x8C,0x90,0x95, +0x98,0x95,0x8E,0x88,0x7F,0x77,0x74,0x73,0x77,0x7D,0x7D,0x7B,0x7B,0x7B,0x7C,0x81, +0x84,0x82,0x7D,0x7C,0x80,0x7E,0x7A,0x7E,0x87,0x8C,0x8A,0x87,0x87,0x83,0x7D,0x7A, +0x7C,0x82,0x86,0x86,0x87,0x84,0x81,0x7F,0x80,0x84,0x88,0x8B,0x8B,0x8C,0x8E,0x8C, +0x85,0x7D,0x79,0x78,0x77,0x7B,0x7D,0x7D,0x79,0x78,0x7B,0x7E,0x84,0x88,0x83,0x7D, +0x7C,0x7D,0x7F,0x81,0x82,0x80,0x7B,0x7A,0x7D,0x82,0x86,0x87,0x85,0x81,0x81,0x80, +0x7A,0x79,0x7C,0x80,0x81,0x7F,0x81,0x87,0x8C,0x8C,0x89,0x8A,0x8D,0x8A,0x83,0x7C, +0x7A,0x7D,0x81,0x84,0x86,0x88,0x85,0x7F,0x7D,0x7C,0x79,0x77,0x75,0x71,0x70,0x72, +0x73,0x74,0x75,0x77,0x7A,0x7C,0x7D,0x81,0x88,0x8B,0x86,0x83,0x87,0x8C,0x8E,0x8B, +0x85,0x80,0x82,0x82,0x7D,0x7B,0x7F,0x81,0x81,0x7C,0x74,0x6F,0x71,0x75,0x7B,0x80, +0x81,0x82,0x88,0x88,0x86,0x88,0x88,0x85,0x81,0x7A,0x74,0x77,0x77,0x72,0x70,0x74, +0x78,0x7A,0x7A,0x79,0x77,0x7A,0x80,0x80,0x83,0x86,0x8C,0x90,0x8C,0x89,0x8D,0x8C, +0x87,0x81,0x80,0x82,0x84,0x82,0x7B,0x7A,0x7F,0x7E,0x7A,0x7C,0x80,0x83,0x83,0x86, +0x88,0x85,0x81,0x7D,0x81,0x83,0x7F,0x81,0x86,0x87,0x83,0x82,0x87,0x89,0x85,0x81, +0x7E,0x85,0x88,0x7C,0x76,0x79,0x82,0x8C,0x91,0x90,0x8B,0x8B,0x89,0x86,0x8B,0x87, +0x7F,0x87,0x84,0x7B,0x78,0x7E,0x83,0x81,0x7F,0x78,0x79,0x7F,0x77,0x70,0x72,0x71, +0x70,0x72,0x77,0x7F,0x8D,0x92,0x89,0x8A,0x8D,0x89,0x8B,0x85,0x73,0x71,0x77,0x7E, +0x7E,0x80,0x82,0x86,0x8C,0x8D,0x89,0x8B,0x88,0x7A,0x6E,0x69,0x6D,0x7A,0x7D,0x7A, +0x7D,0x7F,0x75,0x71,0x73,0x76,0x79,0x7E,0x7C,0x78,0x75,0x76,0x7D,0x7F,0x7B,0x79, +0x7E,0x82,0x7F,0x84,0x82,0x7D,0x7E,0x81,0x81,0x84,0x8D,0x8C,0x80,0x7C,0x7E,0x85, +0x88,0x85,0x87,0x85,0x81,0x7F,0x7B,0x77,0x72,0x75,0x7D,0x73,0x72,0x75,0x76,0x7C, +0x7F,0x84,0x87,0x87,0x8F,0x87,0x86,0x83,0x82,0x86,0x7E,0x78,0x7A,0x79,0x7B,0x7E, +0x7C,0x80,0x81,0x86,0x85,0x82,0x8B,0x8D,0x8C,0x87,0x83,0x84,0x85,0x87,0x82,0x7F, +0x82,0x7E,0x7E,0x76,0x75,0x78,0x75,0x74,0x78,0x7B,0x81,0x81,0x82,0x81,0x7E,0x89, +0x91,0x89,0x87,0x88,0x8B,0x89,0x83,0x80,0x7D,0x7D,0x7D,0x81,0x86,0x8B,0x89,0x87, +0x81,0x7E,0x85,0x88,0x83,0x7D,0x7C,0x7D,0x7F,0x80,0x7D,0x7F,0x87,0x8B,0x8A,0x7F, +0x77,0x7D,0x7D,0x77,0x76,0x7C,0x80,0x82,0x81,0x80,0x7E,0x84,0x89,0x85,0x83,0x82, +0x7C,0x7F,0x80,0x82,0x83,0x87,0x8B,0x85,0x84,0x86,0x86,0x82,0x7C,0x7B,0x7A,0x77, +0x79,0x7C,0x7D,0x7F,0x7F,0x7D,0x77,0x76,0x7A,0x7A,0x79,0x77,0x7B,0x81,0x7F,0x7F, +0x83,0x8B,0x8D,0x85,0x7F,0x77,0x72,0x7A,0x7D,0x7D,0x7A,0x7A,0x7D,0x7B,0x7D,0x7D, +0x7A,0x7D,0x80,0x7B,0x76,0x78,0x81,0x85,0x85,0x85,0x82,0x80,0x7F,0x82,0x85,0x86, +0x88,0x83,0x7B,0x79,0x7D,0x84,0x87,0x84,0x82,0x80,0x7F,0x7A,0x75,0x78,0x7D,0x80, +0x81,0x82,0x85,0x86,0x84,0x81,0x82,0x86,0x84,0x7F,0x7E,0x82,0x84,0x84,0x86,0x86, +0x83,0x85,0x86,0x87,0x85,0x81,0x80,0x7F,0x80,0x81,0x82,0x88,0x8B,0x8B,0x85,0x7C, +0x7C,0x80,0x7E,0x7C,0x7F,0x80,0x7F,0x7F,0x83,0x87,0x86,0x85,0x84,0x85,0x83,0x80, +0x7F,0x7C,0x79,0x78,0x7A,0x80,0x85,0x84,0x7E,0x76,0x78,0x7B,0x7E,0x7E,0x7E,0x80, +0x80,0x81,0x84,0x84,0x83,0x81,0x82,0x86,0x89,0x8A,0x8A,0x84,0x7D,0x7C,0x7F,0x82, +0x7F,0x7C,0x77,0x75,0x77,0x79,0x7F,0x82,0x84,0x85,0x83,0x80,0x7B,0x77,0x76,0x76, +0x75,0x73,0x73,0x77,0x7C,0x7F,0x81,0x7F,0x80,0x80,0x7F,0x7D,0x7B,0x7F,0x80,0x82, +0x83,0x81,0x81,0x83,0x82,0x86,0x87,0x85,0x86,0x87,0x89,0x85,0x82,0x80,0x7D,0x7B, +0x79,0x76,0x78,0x7B,0x80,0x85,0x85,0x85,0x87,0x8A,0x85,0x7C,0x79,0x77,0x74,0x72, +0x71,0x79,0x7F,0x85,0x8B,0x8B,0x89,0x83,0x7F,0x7E,0x7D,0x80,0x7C,0x73,0x76,0x7D, +0x83,0x85,0x87,0x8C,0x8E,0x8E,0x8B,0x84,0x81,0x80,0x87,0x8D,0x87,0x82,0x7E,0x7B, +0x7A,0x7D,0x84,0x82,0x7C,0x79,0x77,0x7C,0x7D,0x7D,0x83,0x82,0x7E,0x79,0x79,0x79, +0x75,0x7A,0x7F,0x83,0x89,0x89,0x89,0x88,0x83,0x81,0x7D,0x7B,0x78,0x7C,0x86,0x87, +0x86,0x8D,0x90,0x8C,0x85,0x86,0x87,0x88,0x87,0x80,0x79,0x75,0x75,0x79,0x7B,0x7A, +0x81,0x85,0x84,0x80,0x7C,0x7A,0x79,0x7D,0x82,0x84,0x87,0x89,0x8F,0x90,0x8A,0x86, +0x86,0x82,0x79,0x79,0x7B,0x79,0x7B,0x80,0x83,0x82,0x80,0x7E,0x7D,0x7B,0x7C,0x78, +0x71,0x6B,0x6C,0x7D,0x8A,0x89,0x88,0x86,0x82,0x7B,0x79,0x7C,0x79,0x75,0x76,0x7C, +0x82,0x83,0x86,0x88,0x83,0x7B,0x7D,0x83,0x80,0x7A,0x79,0x78,0x7C,0x80,0x80,0x81, +0x87,0x8C,0x87,0x80,0x7C,0x78,0x77,0x77,0x77,0x7F,0x83,0x83,0x7E,0x79,0x76,0x73, +0x75,0x7A,0x7C,0x7B,0x7C,0x84,0x89,0x88,0x8C,0x90,0x8E,0x83,0x79,0x78,0x7C,0x7E, +0x7F,0x7F,0x81,0x83,0x85,0x8A,0x8C,0x88,0x82,0x80,0x80,0x7D,0x7D,0x82,0x86,0x8C, +0x91,0x90,0x8A,0x83,0x7D,0x7F,0x84,0x84,0x80,0x79,0x77,0x78,0x7D,0x80,0x80,0x81, +0x81,0x7C,0x7B,0x7B,0x7D,0x80,0x84,0x85,0x82,0x80,0x7F,0x81,0x86,0x89,0x8C,0x8E, +0x8A,0x85,0x86,0x86,0x84,0x82,0x81,0x7E,0x7B,0x7A,0x78,0x76,0x7B,0x81,0x81,0x7E, +0x7B,0x7E,0x82,0x80,0x7C,0x7D,0x7E,0x7C,0x7A,0x7E,0x7E,0x7F,0x7E,0x7F,0x7F,0x82, +0x85,0x82,0x7C,0x7A,0x79,0x7B,0x7D,0x7E,0x7E,0x7F,0x81,0x85,0x85,0x83,0x80,0x7E, +0x7B,0x76,0x74,0x75,0x76,0x78,0x7B,0x7E,0x81,0x85,0x88,0x86,0x81,0x80,0x82,0x85, +0x84,0x84,0x85,0x87,0x89,0x89,0x88,0x86,0x84,0x7F,0x7E,0x7B,0x78,0x75,0x76,0x77, +0x78,0x76,0x77,0x7B,0x80,0x79,0x75,0x7B,0x80,0x81,0x84,0x86,0x87,0x87,0x87,0x84, +0x80,0x80,0x7F,0x80,0x82,0x7E,0x7D,0x80,0x82,0x84,0x87,0x84,0x83,0x84,0x85,0x7E, +0x7C,0x7D,0x7F,0x7F,0x7E,0x7E,0x80,0x82,0x81,0x7F,0x81,0x84,0x86,0x89,0x87,0x80, +0x7D,0x79,0x76,0x77,0x77,0x7A,0x7C,0x7E,0x7B,0x7C,0x82,0x83,0x81,0x7F,0x7D,0x80, +0x83,0x7F,0x7E,0x86,0x89,0x86,0x86,0x8A,0x8B,0x87,0x87,0x84,0x85,0x85,0x80,0x7E, +0x7B,0x77,0x7B,0x81,0x81,0x80,0x86,0x86,0x84,0x87,0x89,0x84,0x83,0x85,0x82,0x80, +0x7D,0x79,0x7A,0x7B,0x79,0x78,0x7E,0x80,0x7D,0x80,0x7C,0x7E,0x81,0x82,0x85,0x88, +0x8C,0x8E,0x8F,0x8F,0x87,0x86,0x8C,0x87,0x85,0x85,0x83,0x80,0x7E,0x79,0x74,0x75, +0x76,0x72,0x76,0x75,0x72,0x7A,0x7E,0x79,0x78,0x7D,0x7D,0x7A,0x7D,0x7F,0x7E,0x82, +0x86,0x84,0x84,0x82,0x7F,0x7C,0x7B,0x78,0x80,0x82,0x7D,0x7F,0x83,0x87,0x82,0x83, +0x84,0x81,0x7E,0x7C,0x7C,0x7D,0x7B,0x7A,0x7A,0x7E,0x79,0x7E,0x84,0x79,0x74,0x7B, +0x76,0x74,0x7A,0x7A,0x7C,0x7D,0x85,0x87,0x83,0x87,0x81,0x82,0x84,0x81,0x86,0x88, +0x89,0x89,0x85,0x84,0x84,0x89,0x86,0x82,0x84,0x86,0x87,0x8A,0x81,0x7F,0x81,0x76, +0x75,0x78,0x81,0x83,0x83,0x85,0x83,0x7F,0x7C,0x77,0x7C,0x77,0x77,0x7F,0x85,0x87, +0x82,0x85,0x87,0x83,0x7E,0x7D,0x7A,0x80,0x7D,0x82,0x86,0x87,0x8D,0x90,0x8A,0x8D, +0x8B,0x8A,0x82,0x7A,0x7E,0x7E,0x83,0x89,0x8B,0x82,0x7D,0x7E,0x7A,0x7A,0x7E,0x79, +0x79,0x7A,0x78,0x7A,0x7F,0x83,0x83,0x82,0x86,0x81,0x77,0x7A,0x72,0x76,0x7B,0x7B, +0x7B,0x7E,0x83,0x86,0x82,0x7E,0x7B,0x7D,0x83,0x83,0x7C,0x7B,0x7F,0x83,0x87,0x89, +0x90,0x91,0x93,0x8F,0x85,0x81,0x81,0x7C,0x78,0x79,0x7C,0x78,0x74,0x74,0x76,0x78, +0x78,0x7A,0x7A,0x7B,0x7A,0x79,0x79,0x78,0x79,0x7E,0x86,0x8A,0x84,0x7F,0x82,0x84, +0x84,0x85,0x85,0x83,0x7D,0x77,0x78,0x82,0x8D,0x91,0x89,0x80,0x7F,0x80,0x7F,0x81, +0x82,0x84,0x86,0x89,0x86,0x7F,0x7B,0x78,0x71,0x6B,0x6A,0x6F,0x7A,0x7F,0x79,0x76, +0x7D,0x81,0x7F,0x7B,0x7B,0x7B,0x79,0x76,0x78,0x7C,0x83,0x84,0x85,0x89,0x8B,0x8A, +0x87,0x86,0x86,0x87,0x89,0x8C,0x8D,0x8C,0x8A,0x85,0x80,0x7F,0x80,0x83,0x83,0x7F, +0x79,0x78,0x7B,0x7B,0x7A,0x7C,0x7E,0x7F,0x7D,0x79,0x7B,0x81,0x86,0x8C,0x8A,0x82, +0x7C,0x7C,0x82,0x84,0x83,0x80,0x7E,0x7F,0x7E,0x7D,0x7E,0x83,0x8B,0x8F,0x8C,0x8A, +0x89,0x8B,0x8C,0x8C,0x8B,0x8A,0x8A,0x86,0x7F,0x7C,0x7C,0x7E,0x81,0x81,0x81,0x7B, +0x74,0x70,0x6F,0x73,0x76,0x7B,0x80,0x80,0x81,0x80,0x7C,0x78,0x75,0x72,0x74,0x7A, +0x81,0x85,0x83,0x84,0x86,0x88,0x86,0x86,0x89,0x8C,0x88,0x82,0x80,0x7E,0x7D,0x81, +0x84,0x83,0x81,0x7D,0x7B,0x7A,0x75,0x72,0x74,0x77,0x7A,0x7A,0x79,0x76,0x78,0x7F, +0x7F,0x7B,0x76,0x74,0x78,0x7C,0x7F,0x85,0x8A,0x8B,0x87,0x88,0x85,0x7F,0x81,0x81, +0x84,0x82,0x80,0x80,0x7D,0x7D,0x80,0x83,0x85,0x82,0x81,0x80,0x7B,0x79,0x79,0x7A, +0x81,0x80,0x7E,0x80,0x81,0x82,0x80,0x80,0x7F,0x7D,0x80,0x80,0x80,0x80,0x7F,0x80, +0x84,0x86,0x86,0x86,0x88,0x88,0x84,0x82,0x81,0x83,0x85,0x83,0x85,0x89,0x86,0x83, +0x7F,0x7C,0x76,0x76,0x7B,0x80,0x83,0x7E,0x7E,0x86,0x88,0x84,0x86,0x8A,0x88,0x80, +0x7F,0x81,0x81,0x83,0x84,0x82,0x80,0x7B,0x7E,0x7E,0x77,0x72,0x73,0x7E,0x86,0x88, +0x85,0x7E,0x7E,0x7E,0x7D,0x7C,0x7B,0x7D,0x81,0x82,0x84,0x88,0x8C,0x89,0x84,0x86, +0x85,0x81,0x84,0x84,0x82,0x83,0x86,0x8A,0x88,0x85,0x82,0x7C,0x79,0x75,0x74,0x76, +0x7A,0x7C,0x7B,0x7C,0x7D,0x80,0x7E,0x7C,0x7F,0x84,0x81,0x7A,0x77,0x78,0x7C,0x7C, +0x81,0x85,0x80,0x7E,0x7F,0x85,0x89,0x85,0x85,0x84,0x87,0x87,0x85,0x85,0x81,0x7D, +0x79,0x7B,0x81,0x80,0x7C,0x7D,0x81,0x80,0x79,0x75,0x75,0x75,0x75,0x75,0x77,0x7E, +0x84,0x85,0x82,0x7D,0x7A,0x79,0x7D,0x7E,0x7A,0x78,0x77,0x7C,0x82,0x82,0x7D,0x7A, +0x7B,0x7F,0x84,0x8D,0x91,0x8D,0x8A,0x8B,0x8B,0x87,0x81,0x83,0x83,0x81,0x7C,0x78, +0x78,0x79,0x7D,0x7B,0x78,0x79,0x79,0x78,0x77,0x76,0x79,0x80,0x88,0x8A,0x84,0x7F, +0x7F,0x82,0x83,0x7E,0x7E,0x84,0x89,0x8A,0x86,0x85,0x84,0x82,0x83,0x83,0x84,0x85, +0x88,0x8C,0x8C,0x8D,0x8F,0x90,0x8E,0x88,0x84,0x81,0x80,0x81,0x83,0x83,0x84,0x84, +0x80,0x7C,0x7B,0x78,0x73,0x70,0x6F,0x71,0x77,0x7A,0x7B,0x7E,0x81,0x83,0x84,0x86, +0x83,0x83,0x83,0x82,0x81,0x82,0x85,0x8B,0x8E,0x91,0x8E,0x89,0x85,0x80,0x7A,0x78, +0x79,0x79,0x77,0x75,0x78,0x7D,0x86,0x89,0x84,0x7E,0x7D,0x7E,0x7B,0x77,0x70,0x6F, +0x72,0x73,0x71,0x75,0x7B,0x80,0x7D,0x80,0x81,0x80,0x82,0x83,0x7F,0x7D,0x80,0x82, +0x81,0x83,0x85,0x85,0x88,0x8B,0x86,0x81,0x7E,0x7C,0x7E,0x7A,0x76,0x76,0x7A,0x81, +0x82,0x83,0x83,0x84,0x82,0x81,0x81,0x80,0x7C,0x7B,0x7E,0x7E,0x7A,0x7B,0x7E,0x7C, +0x80,0x84,0x81,0x83,0x85,0x81,0x7D,0x77,0x75,0x76,0x80,0x8A,0x89,0x87,0x85,0x83, +0x85,0x86,0x86,0x88,0x88,0x84,0x7E,0x7F,0x81,0x84,0x81,0x7D,0x7E,0x83,0x84,0x86, +0x87,0x80,0x7B,0x7B,0x81,0x7E,0x83,0x84,0x81,0x82,0x80,0x7F,0x81,0x80,0x82,0x7E, +0x86,0x8A,0x7C,0x7D,0x7D,0x79,0x77,0x7A,0x81,0x81,0x80,0x83,0x7D,0x80,0x80,0x80, +0x83,0x7E,0x83,0x82,0x7F,0x81,0x84,0x85,0x87,0x88,0x8C,0x83,0x86,0x85,0x7F,0x80, +0x79,0x75,0x7C,0x80,0x82,0x82,0x87,0x8B,0x83,0x87,0x7F,0x7A,0x80,0x7F,0x80,0x81, +0x7E,0x81,0x7B,0x7C,0x82,0x82,0x85,0x80,0x7E,0x78,0x77,0x78,0x79,0x79,0x7F,0x7C, +0x80,0x86,0x89,0x89,0x86,0x86,0x82,0x80,0x82,0x7F,0x7E,0x81,0x7E,0x7F,0x78,0x7B, +0x7F,0x81,0x7F,0x7D,0x79,0x76,0x74,0x75,0x74,0x78,0x81,0x80,0x7E,0x79,0x7A,0x79, +0x79,0x7C,0x7F,0x84,0x8E,0x89,0x84,0x84,0x7D,0x7A,0x7B,0x7F,0x7C,0x77,0x7D,0x7D, +0x80,0x85,0x88,0x87,0x82,0x7E,0x7B,0x7D,0x80,0x7D,0x7D,0x7D,0x7F,0x80,0x83,0x81, +0x82,0x7F,0x77,0x71,0x6F,0x74,0x7B,0x83,0x86,0x81,0x84,0x87,0x8B,0x8E,0x86,0x81, +0x82,0x84,0x82,0x82,0x82,0x81,0x82,0x88,0x86,0x87,0x8A,0x86,0x85,0x86,0x85,0x87, +0x8C,0x88,0x81,0x85,0x8B,0x8A,0x86,0x7E,0x75,0x76,0x78,0x78,0x79,0x7B,0x7A,0x79, +0x79,0x77,0x7A,0x82,0x83,0x85,0x89,0x86,0x84,0x87,0x84,0x7F,0x83,0x8A,0x8B,0x89, +0x86,0x83,0x83,0x88,0x89,0x8C,0x8E,0x89,0x87,0x87,0x80,0x76,0x73,0x74,0x71,0x73, +0x78,0x7A,0x7B,0x7A,0x78,0x79,0x7C,0x7B,0x7C,0x7B,0x7C,0x7A,0x79,0x7B,0x82,0x8B, +0x8B,0x86,0x83,0x81,0x80,0x7B,0x76,0x73,0x73,0x78,0x7C,0x81,0x80,0x7E,0x80,0x85, +0x89,0x8C,0x8A,0x84,0x80,0x7D,0x7B,0x76,0x78,0x7E,0x81,0x82,0x81,0x7E,0x7D,0x7B, +0x7C,0x78,0x75,0x75,0x78,0x7A,0x7B,0x7F,0x86,0x8A,0x8C,0x8A,0x85,0x87,0x8A,0x8C, +0x86,0x80,0x7A,0x78,0x7A,0x7C,0x7C,0x7B,0x7A,0x7C,0x7E,0x7E,0x80,0x81,0x83,0x84, +0x82,0x82,0x84,0x88,0x84,0x7F,0x80,0x84,0x8B,0x8E,0x8A,0x86,0x81,0x7C,0x78,0x75, +0x74,0x73,0x75,0x7B,0x81,0x85,0x86,0x86,0x87,0x85,0x84,0x87,0x8A,0x88,0x81,0x7B, +0x76,0x74,0x7A,0x81,0x86,0x83,0x7E,0x7E,0x7F,0x7F,0x7D,0x7D,0x7F,0x82,0x84,0x85, +0x83,0x84,0x84,0x84,0x86,0x87,0x85,0x83,0x83,0x83,0x80,0x80,0x80,0x7F,0x81,0x7E, +0x7D,0x80,0x87,0x89,0x85,0x82,0x80,0x82,0x85,0x83,0x7A,0x76,0x78,0x7B,0x7E,0x83, +0x89,0x8B,0x88,0x85,0x7F,0x7C,0x7E,0x7B,0x78,0x76,0x79,0x7D,0x83,0x85,0x86,0x87, +0x88,0x86,0x81,0x7C,0x7A,0x7A,0x78,0x76,0x79,0x7E,0x84,0x85,0x84,0x83,0x80,0x7C, +0x79,0x79,0x78,0x76,0x78,0x7C,0x7D,0x81,0x84,0x87,0x83,0x7F,0x7E,0x81,0x81,0x7E, +0x7D,0x7E,0x7E,0x7F,0x7E,0x7D,0x7F,0x83,0x81,0x7F,0x7E,0x7D,0x7B,0x7B,0x78,0x75, +0x74,0x79,0x7D,0x7F,0x81,0x82,0x7D,0x7B,0x7A,0x7D,0x83,0x86,0x83,0x82,0x83,0x85, +0x82,0x80,0x7F,0x7D,0x7D,0x7C,0x7B,0x7E,0x81,0x83,0x86,0x8B,0x8D,0x8D,0x8E,0x8B, +0x85,0x80,0x80,0x87,0x8C,0x8C,0x8B,0x87,0x7F,0x77,0x73,0x73,0x75,0x75,0x77,0x79, +0x7B,0x7F,0x81,0x86,0x8B,0x8B,0x88,0x83,0x81,0x82,0x82,0x83,0x82,0x81,0x83,0x88, +0x8A,0x86,0x7F,0x7E,0x7F,0x81,0x82,0x83,0x87,0x89,0x87,0x84,0x80,0x81,0x84,0x87, +0x86,0x82,0x81,0x81,0x82,0x80,0x7D,0x79,0x76,0x76,0x77,0x74,0x75,0x76,0x78,0x78, +0x78,0x7B,0x7F,0x82,0x87,0x86,0x84,0x83,0x81,0x7E,0x7C,0x7D,0x7D,0x7E,0x80,0x82, +0x85,0x89,0x8A,0x89,0x86,0x85,0x83,0x81,0x7F,0x80,0x7F,0x7E,0x7D,0x79,0x76,0x77, +0x7B,0x7E,0x80,0x7F,0x7D,0x79,0x74,0x71,0x75,0x7B,0x80,0x82,0x82,0x7F,0x7D,0x7E, +0x81,0x85,0x86,0x87,0x86,0x81,0x7C,0x7D,0x82,0x81,0x7D,0x7A,0x78,0x7C,0x84,0x86, +0x85,0x87,0x89,0x89,0x84,0x7D,0x7B,0x7B,0x7E,0x7E,0x7F,0x7E,0x80,0x83,0x85,0x81, +0x7D,0x7C,0x7D,0x7A,0x78,0x78,0x7D,0x81,0x83,0x83,0x7F,0x79,0x7A,0x7D,0x7E,0x7D, +0x79,0x77,0x7B,0x80,0x82,0x84,0x87,0x8A,0x88,0x83,0x80,0x82,0x87,0x8E,0x8F,0x8B, +0x89,0x86,0x84,0x82,0x7F,0x7E,0x7B,0x79,0x79,0x77,0x76,0x79,0x7F,0x89,0x8A,0x84, +0x7E,0x7C,0x7D,0x7E,0x7F,0x84,0x83,0x84,0x87,0x8C,0x8B,0x89,0x89,0x83,0x7F,0x7E, +0x7B,0x7B,0x7C,0x81,0x85,0x85,0x88,0x88,0x87,0x88,0x88,0x85,0x80,0x7F,0x80,0x84, +0x82,0x83,0x7F,0x7E,0x82,0x7C,0x7B,0x7D,0x7C,0x7A,0x75,0x74,0x76,0x77,0x7A,0x7B, +0x7D,0x83,0x85,0x81,0x84,0x84,0x85,0x86,0x88,0x83,0x7E,0x7E,0x7C,0x7C,0x7D,0x80, +0x83,0x82,0x81,0x7A,0x72,0x78,0x82,0x8A,0x88,0x89,0x8B,0x83,0x7B,0x79,0x74,0x77, +0x7C,0x7B,0x78,0x78,0x7D,0x82,0x7F,0x79,0x74,0x70,0x71,0x6F,0x73,0x79,0x7A,0x7F, +0x82,0x87,0x86,0x85,0x83,0x80,0x7F,0x7C,0x7C,0x7E,0x80,0x86,0x91,0x92,0x8D,0x8A, +0x85,0x82,0x81,0x82,0x7D,0x7A,0x83,0x81,0x80,0x87,0x85,0x83,0x84,0x7F,0x74,0x70, +0x79,0x78,0x79,0x7B,0x7B,0x7F,0x81,0x85,0x84,0x83,0x86,0x85,0x84,0x83,0x82,0x85, +0x80,0x78,0x86,0x8B,0x8C,0x8A,0x82,0x89,0x87,0x89,0x8C,0x8C,0x8E,0x86,0x84,0x81, +0x7B,0x7E,0x7D,0x7C,0x78,0x78,0x7A,0x76,0x79,0x79,0x74,0x78,0x80,0x81,0x85,0x85, +0x88,0x85,0x82,0x83,0x80,0x85,0x86,0x83,0x87,0x82,0x81,0x7E,0x78,0x79,0x7A,0x7F, +0x7A,0x7E,0x83,0x81,0x86,0x8A,0x88,0x8A,0x8A,0x8A,0x85,0x7F,0x79,0x70,0x73,0x72, +0x6F,0x7A,0x7C,0x78,0x7A,0x77,0x7A,0x77,0x7D,0x85,0x7F,0x84,0x87,0x84,0x88,0x88, +0x89,0x84,0x7E,0x81,0x7F,0x83,0x8B,0x8C,0x8B,0x86,0x85,0x82,0x7E,0x7F,0x79,0x78, +0x78,0x76,0x7B,0x83,0x89,0x87,0x83,0x86,0x83,0x7C,0x75,0x6E,0x6E,0x71,0x76,0x7B, +0x79,0x7D,0x82,0x80,0x80,0x7E,0x7A,0x76,0x77,0x79,0x78,0x7B,0x81,0x83,0x81,0x7F, +0x80,0x82,0x88,0x8A,0x87,0x88,0x89,0x88,0x86,0x86,0x83,0x7D,0x7D,0x81,0x81,0x80, +0x7F,0x7F,0x81,0x83,0x82,0x7F,0x7B,0x79,0x77,0x75,0x76,0x7C,0x80,0x80,0x81,0x7C, +0x78,0x79,0x7D,0x7D,0x7C,0x7E,0x82,0x84,0x88,0x86,0x83,0x86,0x87,0x89,0x8B,0x8E, +0x8F,0x88,0x83,0x80,0x7F,0x82,0x84,0x85,0x85,0x83,0x87,0x87,0x86,0x82,0x7F,0x81, +0x82,0x7F,0x7C,0x7B,0x7D,0x80,0x84,0x88,0x86,0x82,0x81,0x82,0x82,0x80,0x7F,0x7D, +0x7B,0x7F,0x83,0x85,0x88,0x87,0x86,0x80,0x7B,0x79,0x76,0x7A,0x7F,0x81,0x82,0x82, +0x86,0x86,0x86,0x86,0x82,0x7F,0x7E,0x7A,0x77,0x79,0x7F,0x83,0x85,0x8A,0x83,0x7C, +0x7B,0x79,0x74,0x71,0x70,0x6F,0x73,0x7C,0x83,0x89,0x8D,0x89,0x84,0x7E,0x79,0x7C, +0x7F,0x81,0x80,0x7D,0x7C,0x79,0x76,0x74,0x73,0x76,0x76,0x7B,0x83,0x82,0x7E,0x7F, +0x84,0x89,0x8E,0x8C,0x82,0x7B,0x7A,0x7A,0x7D,0x7E,0x7F,0x80,0x80,0x7F,0x7F,0x81, +0x81,0x7D,0x7B,0x7A,0x7A,0x7D,0x7E,0x80,0x81,0x80,0x83,0x86,0x83,0x85,0x88,0x88, +0x84,0x82,0x81,0x7E,0x7D,0x7E,0x7F,0x81,0x89,0x8A,0x84,0x80,0x7E,0x80,0x83,0x82, +0x82,0x82,0x81,0x81,0x82,0x87,0x87,0x80,0x7B,0x7D,0x83,0x83,0x7F,0x7D,0x7E,0x80, +0x86,0x88,0x83,0x81,0x7F,0x7B,0x78,0x78,0x78,0x77,0x7B,0x81,0x87,0x89,0x8A,0x8A, +0x86,0x84,0x80,0x80,0x86,0x86,0x84,0x82,0x85,0x88,0x84,0x80,0x7E,0x7D,0x7A,0x78, +0x76,0x78,0x7C,0x7F,0x81,0x80,0x80,0x80,0x81,0x80,0x7E,0x7D,0x7F,0x83,0x86,0x86, +0x87,0x83,0x81,0x80,0x7D,0x79,0x76,0x78,0x7A,0x7C,0x7F,0x82,0x83,0x84,0x84,0x86, +0x87,0x87,0x84,0x80,0x7E,0x7F,0x82,0x83,0x81,0x7E,0x80,0x81,0x81,0x82,0x82,0x7D, +0x79,0x78,0x77,0x75,0x75,0x74,0x77,0x7B,0x80,0x81,0x82,0x83,0x84,0x85,0x83,0x80, +0x80,0x7F,0x7C,0x7C,0x7C,0x7D,0x80,0x87,0x8A,0x86,0x82,0x82,0x84,0x83,0x7C,0x78, +0x79,0x79,0x79,0x7C,0x81,0x82,0x83,0x83,0x7F,0x7C,0x7A,0x76,0x72,0x71,0x74,0x77, +0x78,0x7A,0x7B,0x7A,0x7D,0x82,0x89,0x8E,0x8D,0x8B,0x89,0x88,0x89,0x8A,0x89,0x85, +0x81,0x7E,0x80,0x81,0x7F,0x7F,0x82,0x82,0x80,0x7C,0x76,0x78,0x7D,0x7D,0x7B,0x79, +0x7D,0x82,0x89,0x8C,0x8B,0x8B,0x8B,0x89,0x85,0x83,0x82,0x81,0x81,0x82,0x7E,0x80, +0x84,0x84,0x83,0x81,0x84,0x89,0x8C,0x8C,0x84,0x81,0x7D,0x78,0x76,0x77,0x79,0x7E, +0x85,0x89,0x88,0x8B,0x8A,0x86,0x82,0x7F,0x7E,0x7E,0x7E,0x80,0x7D,0x7C,0x7E,0x82, +0x83,0x83,0x84,0x81,0x79,0x76,0x77,0x7B,0x82,0x85,0x87,0x87,0x88,0x86,0x81,0x83, +0x82,0x7D,0x7D,0x79,0x76,0x76,0x79,0x75,0x74,0x75,0x74,0x7B,0x79,0x77,0x77,0x74, +0x7B,0x83,0x7F,0x7A,0x7D,0x85,0x84,0x80,0x81,0x7D,0x80,0x85,0x81,0x7E,0x7E,0x80, +0x80,0x7F,0x83,0x84,0x85,0x87,0x86,0x84,0x85,0x88,0x82,0x7F,0x7E,0x7E,0x7C,0x7D, +0x7D,0x79,0x7A,0x7F,0x80,0x7E,0x7A,0x7A,0x7B,0x7C,0x79,0x76,0x79,0x7B,0x7B,0x78, +0x7E,0x82,0x81,0x85,0x89,0x8B,0x88,0x85,0x81,0x7D,0x80,0x84,0x83,0x84,0x89,0x8A, +0x89,0x89,0x86,0x83,0x83,0x85,0x80,0x80,0x7E,0x7A,0x84,0x89,0x86,0x81,0x7F,0x80, +0x7E,0x7E,0x7C,0x79,0x7E,0x78,0x78,0x80,0x7F,0x87,0x84,0x80,0x7A,0x79,0x82,0x7D, +0x83,0x82,0x74,0x81,0x82,0x87,0x8B,0x8C,0x8E,0x8A,0x8B,0x84,0x7A,0x80,0x82,0x81, +0x87,0x82,0x82,0x80,0x7C,0x7B,0x77,0x7A,0x7B,0x7D,0x81,0x77,0x7C,0x80,0x7B,0x85, +0x86,0x89,0x8B,0x89,0x8A,0x81,0x84,0x83,0x78,0x83,0x7B,0x7A,0x83,0x7D,0x7B,0x79, +0x7F,0x85,0x83,0x8A,0x84,0x7D,0x87,0x7F,0x7C,0x79,0x75,0x79,0x7A,0x82,0x81,0x7F, +0x85,0x7B,0x7C,0x7E,0x7D,0x80,0x7A,0x79,0x79,0x7C,0x84,0x82,0x86,0x84,0x7F,0x80, +0x81,0x85,0x87,0x80,0x7B,0x75,0x74,0x76,0x76,0x7A,0x7A,0x7D,0x84,0x86,0x88,0x84, +0x7E,0x7A,0x7A,0x7C,0x7A,0x7D,0x7F,0x7D,0x7E,0x7F,0x83,0x87,0x87,0x82,0x7E,0x7E, +0x7D,0x7B,0x7D,0x7C,0x7C,0x7D,0x7C,0x7B,0x7A,0x7D,0x7D,0x7F,0x83,0x84,0x84,0x85, +0x83,0x82,0x7E,0x7D,0x7F,0x83,0x84,0x83,0x83,0x81,0x80,0x84,0x88,0x89,0x86,0x84, +0x82,0x7E,0x7B,0x7A,0x7C,0x80,0x85,0x89,0x88,0x86,0x87,0x87,0x84,0x82,0x7F,0x82, +0x83,0x82,0x83,0x82,0x82,0x82,0x82,0x82,0x80,0x81,0x82,0x81,0x7F,0x7E,0x7F,0x7F, +0x81,0x82,0x80,0x80,0x81,0x82,0x83,0x82,0x7F,0x80,0x84,0x88,0x87,0x84,0x84,0x81, +0x80,0x7E,0x7A,0x7B,0x7C,0x7E,0x80,0x82,0x83,0x7F,0x80,0x80,0x7C,0x79,0x77,0x76, +0x76,0x79,0x7F,0x7F,0x81,0x83,0x80,0x82,0x81,0x7E,0x7E,0x7B,0x7C,0x7D,0x80,0x84, +0x85,0x89,0x8A,0x86,0x84,0x81,0x7F,0x7B,0x79,0x7B,0x79,0x78,0x7A,0x7D,0x81,0x83, +0x83,0x80,0x7E,0x7F,0x7D,0x78,0x76,0x73,0x75,0x79,0x83,0x88,0x83,0x7E,0x7A,0x7C, +0x7F,0x7D,0x7D,0x7C,0x7E,0x7F,0x7F,0x86,0x87,0x84,0x7F,0x7E,0x86,0x89,0x88,0x87, +0x85,0x85,0x80,0x81,0x84,0x85,0x87,0x86,0x81,0x7F,0x7D,0x7B,0x7A,0x7A,0x7A,0x7A, +0x7B,0x7C,0x7A,0x79,0x79,0x7B,0x7F,0x82,0x81,0x84,0x89,0x87,0x83,0x81,0x81,0x80, +0x7C,0x7B,0x7C,0x7E,0x7F,0x83,0x84,0x84,0x88,0x8C,0x8A,0x87,0x88,0x87,0x84,0x80, +0x7A,0x7B,0x80,0x80,0x7E,0x7F,0x82,0x84,0x83,0x80,0x7A,0x7A,0x7E,0x7E,0x7D,0x7A, +0x7D,0x82,0x87,0x89,0x88,0x87,0x85,0x82,0x80,0x7F,0x80,0x80,0x7D,0x7B,0x7D,0x82, +0x86,0x87,0x88,0x87,0x85,0x83,0x83,0x84,0x85,0x87,0x86,0x81,0x7E,0x7B,0x7A,0x7B, +0x7B,0x7B,0x7E,0x7F,0x7B,0x74,0x74,0x7B,0x80,0x80,0x7D,0x7A,0x7C,0x81,0x82,0x7F, +0x80,0x80,0x80,0x81,0x83,0x84,0x83,0x80,0x7E,0x7C,0x7C,0x7E,0x81,0x83,0x85,0x87, +0x88,0x83,0x7D,0x77,0x76,0x7A,0x7D,0x7D,0x7C,0x7F,0x82,0x7F,0x7B,0x77,0x79,0x7A, +0x79,0x79,0x7A,0x7B,0x7A,0x7A,0x7C,0x7D,0x7C,0x7B,0x7B,0x7C,0x7C,0x7C,0x7D,0x7E, +0x82,0x87,0x8A,0x89,0x85,0x82,0x81,0x82,0x82,0x7F,0x7E,0x85,0x8A,0x88,0x85,0x87, +0x87,0x84,0x80,0x80,0x82,0x86,0x85,0x7E,0x78,0x77,0x7B,0x80,0x80,0x7D,0x7F,0x84, +0x86,0x88,0x84,0x7E,0x80,0x82,0x81,0x7F,0x81,0x83,0x82,0x81,0x81,0x81,0x88,0x86, +0x7E,0x79,0x7A,0x7D,0x7E,0x85,0x88,0x86,0x86,0x83,0x7F,0x83,0x82,0x89,0x86,0x83, +0x87,0x83,0x86,0x83,0x82,0x80,0x7C,0x81,0x7E,0x7A,0x82,0x82,0x7F,0x7B,0x78,0x79, +0x7F,0x7F,0x80,0x7C,0x83,0x87,0x84,0x86,0x7E,0x80,0x81,0x7B,0x7D,0x79,0x7F,0x83, +0x80,0x7E,0x76,0x7F,0x7C,0x7A,0x7F,0x79,0x7E,0x83,0x84,0x84,0x82,0x86,0x84,0x83, +0x85,0x83,0x83,0x88,0x82,0x78,0x7A,0x78,0x7F,0x7A,0x7E,0x7F,0x7D,0x83,0x7E,0x84, +0x80,0x80,0x7E,0x72,0x72,0x78,0x7A,0x7D,0x7F,0x83,0x84,0x89,0x89,0x86,0x83,0x84, +0x80,0x80,0x7F,0x79,0x79,0x7F,0x81,0x7F,0x80,0x87,0x82,0x82,0x7F,0x7D,0x7B,0x7B, +0x78,0x74,0x7A,0x81,0x81,0x83,0x7F,0x7F,0x7E,0x7E,0x7B,0x78,0x7B,0x7C,0x7C,0x78, +0x77,0x7C,0x81,0x8B,0x89,0x8E,0x8A,0x8A,0x8C,0x83,0x81,0x81,0x87,0x87,0x84,0x85, +0x82,0x81,0x80,0x7D,0x78,0x7A,0x78,0x74,0x7B,0x7D,0x81,0x84,0x82,0x80,0x7A,0x7E, +0x80,0x83,0x83,0x82,0x82,0x80,0x7E,0x7C,0x7C,0x7B,0x7C,0x80,0x81,0x86,0x8B,0x84, +0x83,0x86,0x85,0x83,0x84,0x84,0x87,0x8A,0x8A,0x86,0x88,0x8E,0x8D,0x8D,0x8D,0x83, +0x7E,0x7D,0x7A,0x78,0x73,0x72,0x77,0x7B,0x7C,0x7A,0x7C,0x7E,0x7F,0x83,0x84,0x83, +0x83,0x82,0x81,0x82,0x81,0x7E,0x7E,0x82,0x84,0x88,0x89,0x89,0x8A,0x87,0x82,0x7C, +0x78,0x78,0x76,0x75,0x75,0x76,0x7A,0x7D,0x80,0x83,0x85,0x85,0x82,0x7B,0x78,0x77, +0x78,0x7A,0x7C,0x7F,0x7D,0x7A,0x7A,0x78,0x79,0x7C,0x7E,0x7F,0x81,0x84,0x86,0x87, +0x86,0x81,0x80,0x7E,0x7D,0x80,0x82,0x83,0x80,0x7D,0x7A,0x77,0x79,0x79,0x78,0x7C, +0x7E,0x7E,0x7D,0x7B,0x7D,0x7F,0x83,0x85,0x82,0x83,0x82,0x81,0x7F,0x7C,0x82,0x89, +0x8A,0x85,0x82,0x82,0x85,0x8A,0x88,0x81,0x7B,0x7A,0x7A,0x7B,0x78,0x7A,0x7F,0x84, +0x86,0x85,0x85,0x84,0x83,0x82,0x7F,0x7D,0x7F,0x80,0x81,0x84,0x83,0x81,0x7F,0x80, +0x88,0x89,0x87,0x84,0x85,0x86,0x88,0x88,0x84,0x80,0x81,0x83,0x88,0x82,0x7F,0x81, +0x81,0x7E,0x76,0x76,0x78,0x7B,0x81,0x7F,0x80,0x83,0x85,0x82,0x81,0x80,0x7D,0x7D, +0x79,0x7C,0x81,0x83,0x82,0x7C,0x7D,0x7D,0x7E,0x83,0x82,0x7E,0x7D,0x7A,0x7F,0x82, +0x86,0x89,0x8A,0x88,0x82,0x83,0x83,0x81,0x80,0x7F,0x82,0x80,0x7D,0x7E,0x78,0x7B, +0x7B,0x7A,0x80,0x81,0x84,0x84,0x80,0x7F,0x7B,0x7D,0x7F,0x7D,0x7B,0x7D,0x7F,0x83, +0x81,0x7E,0x81,0x82,0x83,0x80,0x7C,0x7B,0x7D,0x82,0x7F,0x7C,0x7E,0x81,0x86,0x85, +0x86,0x85,0x82,0x82,0x7E,0x7C,0x7C,0x7D,0x7F,0x7B,0x75,0x76,0x7A,0x7D,0x7F,0x7F, +0x80,0x7E,0x7B,0x7C,0x7D,0x81,0x81,0x81,0x82,0x80,0x81,0x81,0x84,0x83,0x82,0x81, +0x7E,0x7F,0x81,0x82,0x82,0x80,0x7E,0x7D,0x7E,0x80,0x80,0x7F,0x7E,0x7C,0x7B,0x7B, +0x7B,0x7B,0x79,0x7C,0x80,0x80,0x82,0x81,0x7E,0x79,0x79,0x7D,0x7D,0x7F,0x7F,0x81, +0x87,0x8B,0x8A,0x86,0x83,0x84,0x8A,0x8E,0x8D,0x89,0x89,0x89,0x88,0x87,0x86,0x83, +0x83,0x84,0x86,0x84,0x80,0x80,0x81,0x80,0x81,0x82,0x7F,0x78,0x73,0x72,0x6E,0x72, +0x79,0x7F,0x84,0x86,0x85,0x83,0x83,0x88,0x88,0x89,0x85,0x7E,0x7D,0x7E,0x81,0x81, +0x84,0x88,0x87,0x85,0x84,0x84,0x84,0x81,0x7B,0x7A,0x7D,0x85,0x88,0x85,0x85,0x82, +0x84,0x84,0x82,0x83,0x80,0x7F,0x7F,0x7B,0x75,0x70,0x70,0x72,0x78,0x7E,0x7E,0x80, +0x82,0x7F,0x7C,0x7B,0x7C,0x7B,0x7D,0x7B,0x79,0x79,0x7A,0x79,0x7D,0x81,0x82,0x83, +0x83,0x85,0x83,0x80,0x7F,0x7F,0x85,0x83,0x80,0x7E,0x7A,0x80,0x83,0x85,0x84,0x7D, +0x7B,0x7A,0x80,0x7F,0x7E,0x7D,0x7B,0x7D,0x79,0x80,0x85,0x86,0x83,0x7C,0x7C,0x76, +0x78,0x7B,0x7C,0x7D,0x7B,0x84,0x83,0x88,0x8C,0x8B,0x88,0x85,0x83,0x80,0x7E,0x7E, +0x7C,0x7C,0x7F,0x83,0x83,0x8A,0x8A,0x8B,0x8C,0x88,0x84,0x79,0x77,0x74,0x74,0x7A, +0x7B,0x7D,0x80,0x81,0x81,0x80,0x7E,0x7F,0x83,0x82,0x81,0x81,0x80,0x82,0x83,0x85, +0x84,0x89,0x85,0x89,0x87,0x82,0x81,0x7E,0x83,0x82,0x81,0x82,0x7B,0x7F,0x82,0x81, +0x87,0x85,0x85,0x88,0x8B,0x89,0x86,0x7F,0x78,0x78,0x7A,0x7B,0x7A,0x7C,0x7D,0x7C, +0x7B,0x77,0x7B,0x80,0x80,0x7C,0x7A,0x7A,0x7A,0x81,0x85,0x80,0x81,0x82,0x86,0x8A, +0x88,0x88,0x85,0x80,0x80,0x7E,0x7E,0x7D,0x7C,0x7F,0x83,0x88,0x8C,0x8E,0x8B,0x84, +0x7E,0x7B,0x7C,0x7C,0x7C,0x7B,0x78,0x78,0x79,0x79,0x79,0x7A,0x7A,0x77,0x74,0x74, +0x76,0x78,0x7D,0x81,0x81,0x82,0x82,0x82,0x83,0x81,0x80,0x81,0x84,0x86,0x87,0x89, +0x88,0x83,0x7D,0x76,0x7A,0x7F,0x80,0x7F,0x7E,0x7E,0x80,0x83,0x84,0x81,0x82,0x80, +0x7A,0x77,0x76,0x73,0x72,0x74,0x78,0x7D,0x81,0x83,0x84,0x85,0x81,0x7E,0x7C,0x7D, +0x7F,0x7E,0x7E,0x80,0x82,0x86,0x8B,0x8F,0x8E,0x89,0x84,0x81,0x80,0x80,0x7B,0x7A, +0x7E,0x82,0x84,0x84,0x88,0x89,0x87,0x82,0x7A,0x75,0x75,0x78,0x7C,0x7D,0x7B,0x7D, +0x81,0x86,0x85,0x83,0x84,0x81,0x82,0x83,0x84,0x8A,0x8E,0x91,0x90,0x90,0x8C,0x87, +0x85,0x82,0x7D,0x7C,0x78,0x78,0x7B,0x80,0x86,0x87,0x86,0x82,0x82,0x82,0x7F,0x7F, +0x7A,0x79,0x7A,0x7C,0x7C,0x7B,0x80,0x7D,0x7B,0x7B,0x77,0x7A,0x7B,0x7E,0x83,0x85, +0x87,0x88,0x87,0x83,0x7E,0x7E,0x82,0x81,0x80,0x7E,0x7F,0x81,0x80,0x7D,0x7C,0x7E, +0x81,0x7F,0x7B,0x78,0x7A,0x7E,0x7D,0x7F,0x81,0x83,0x86,0x83,0x82,0x7E,0x7D,0x7D, +0x79,0x75,0x75,0x78,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x80,0x7A,0x7C,0x7D,0x82,0x81, +0x80,0x80,0x7F,0x83,0x84,0x84,0x83,0x7F,0x7E,0x7D,0x7F,0x7E,0x7B,0x7C,0x7B,0x7C, +0x7E,0x7F,0x80,0x80,0x80,0x82,0x83,0x83,0x84,0x85,0x88,0x89,0x87,0x85,0x81,0x7F, +0x7D,0x7A,0x7B,0x7B,0x7A,0x7A,0x7C,0x80,0x81,0x83,0x84,0x85,0x83,0x83,0x84,0x83, +0x7F,0x7E,0x80,0x81,0x82,0x81,0x82,0x82,0x7F,0x7B,0x79,0x7A,0x7C,0x7D,0x80,0x82, +0x85,0x87,0x88,0x89,0x89,0x87,0x83,0x80,0x83,0x85,0x84,0x81,0x7E,0x7D,0x7D,0x7F, +0x81,0x80,0x81,0x81,0x82,0x82,0x82,0x82,0x81,0x7F,0x7F,0x7C,0x7C,0x80,0x80,0x7E, +0x7F,0x81,0x81,0x85,0x85,0x81,0x81,0x7E,0x7E,0x80,0x83,0x84,0x82,0x85,0x89,0x86, +0x88,0x88,0x85,0x83,0x80,0x7F,0x82,0x82,0x83,0x80,0x7A,0x78,0x79,0x7F,0x7D,0x7B, +0x7D,0x79,0x79,0x75,0x73,0x73,0x78,0x7F,0x7F,0x83,0x84,0x81,0x82,0x80,0x7F,0x80, +0x7F,0x82,0x84,0x83,0x85,0x83,0x82,0x82,0x7F,0x7E,0x7D,0x80,0x81,0x81,0x7F,0x7F, +0x81,0x83,0x83,0x7F,0x7A,0x78,0x76,0x74,0x74,0x73,0x75,0x76,0x79,0x7C,0x7C,0x7B, +0x7D,0x80,0x82,0x81,0x7E,0x7F,0x81,0x82,0x83,0x82,0x86,0x85,0x86,0x86,0x82,0x82, +0x7F,0x82,0x85,0x87,0x87,0x85,0x89,0x87,0x84,0x7E,0x7D,0x7F,0x7C,0x7C,0x7A,0x7C, +0x7E,0x7D,0x7F,0x7F,0x81,0x84,0x85,0x86,0x84,0x84,0x7F,0x7E,0x81,0x84,0x88,0x87, +0x86,0x83,0x82,0x81,0x80,0x7F,0x7B,0x7D,0x7F,0x80,0x82,0x84,0x86,0x87,0x89,0x8A, +0x86,0x86,0x84,0x85,0x83,0x84,0x83,0x81,0x80,0x7B,0x79,0x7B,0x7A,0x79,0x76,0x77, +0x7C,0x7D,0x80,0x80,0x82,0x87,0x87,0x85,0x81,0x7F,0x83,0x82,0x81,0x82,0x80,0x80, +0x80,0x7D,0x7B,0x7D,0x80,0x84,0x83,0x81,0x80,0x82,0x85,0x83,0x80,0x81,0x80,0x7E, +0x7B,0x77,0x77,0x76,0x76,0x76,0x76,0x75,0x77,0x7C,0x7E,0x7F,0x7D,0x7E,0x80,0x81, +0x81,0x82,0x84,0x86,0x84,0x84,0x85,0x86,0x86,0x84,0x82,0x80,0x7E,0x7C,0x7B,0x7E, +0x7F,0x7E,0x7E,0x7F,0x81,0x83,0x84,0x82,0x7F,0x7C,0x7B,0x7E,0x82,0x83,0x83,0x82, +0x7F,0x7A,0x77,0x79,0x7E,0x81,0x80,0x7E,0x7F,0x7F,0x7D,0x7B,0x7B,0x7F,0x82,0x82, +0x81,0x80,0x7F,0x7B,0x7B,0x7F,0x82,0x85,0x87,0x89,0x8A,0x89,0x87,0x86,0x86,0x81, +0x7C,0x7D,0x7D,0x7D,0x7C,0x79,0x79,0x7A,0x80,0x87,0x88,0x87,0x85,0x84,0x80,0x7D, +0x7A,0x79,0x7D,0x82,0x84,0x81,0x7F,0x82,0x85,0x89,0x87,0x81,0x7D,0x78,0x77,0x78, +0x7B,0x7F,0x82,0x87,0x86,0x86,0x88,0x88,0x85,0x7E,0x7C,0x7E,0x84,0x85,0x85,0x87, +0x85,0x84,0x81,0x7F,0x7C,0x7D,0x82,0x82,0x82,0x82,0x82,0x83,0x85,0x82,0x80,0x7F, +0x7E,0x80,0x81,0x80,0x7D,0x7A,0x7A,0x7D,0x84,0x88,0x87,0x84,0x81,0x80,0x80,0x7F, +0x7B,0x7A,0x7B,0x7B,0x7D,0x7E,0x7E,0x7F,0x80,0x81,0x84,0x82,0x7F,0x7F,0x7F,0x7D, +0x7D,0x7F,0x82,0x84,0x85,0x86,0x83,0x7E,0x78,0x74,0x73,0x72,0x73,0x76,0x79,0x7C, +0x80,0x81,0x7E,0x7D,0x7E,0x81,0x83,0x83,0x80,0x7C,0x7A,0x7B,0x7E,0x83,0x85,0x86, +0x85,0x83,0x7E,0x7A,0x78,0x7A,0x7F,0x82,0x83,0x7F,0x7D,0x7B,0x7A,0x7A,0x7B,0x7E, +0x7F,0x7F,0x81,0x80,0x7F,0x80,0x82,0x85,0x87,0x87,0x85,0x82,0x80,0x7F,0x80,0x82, +0x84,0x85,0x88,0x88,0x85,0x86,0x86,0x84,0x80,0x7C,0x7D,0x80,0x81,0x80,0x7E,0x7E, +0x7F,0x80,0x81,0x81,0x7F,0x80,0x80,0x7D,0x7D,0x7E,0x83,0x86,0x83,0x81,0x7E,0x81, +0x85,0x84,0x84,0x88,0x88,0x8C,0x8B,0x89,0x87,0x86,0x86,0x83,0x7F,0x7C,0x7A,0x78, +0x78,0x79,0x7C,0x7E,0x81,0x80,0x7E,0x7B,0x7E,0x81,0x7F,0x7F,0x80,0x81,0x82,0x82, +0x80,0x80,0x7D,0x80,0x80,0x7E,0x7B,0x7A,0x7A,0x7C,0x7C,0x81,0x85,0x87,0x88,0x8A, +0x89,0x88,0x82,0x7F,0x81,0x81,0x82,0x7E,0x7B,0x7B,0x7A,0x79,0x79,0x78,0x7A,0x7B, +0x7D,0x7D,0x79,0x78,0x7D,0x83,0x86,0x85,0x83,0x84,0x85,0x85,0x84,0x83,0x83,0x81, +0x7E,0x7B,0x7A,0x7A,0x7A,0x7B,0x7E,0x81,0x82,0x82,0x80,0x7D,0x7A,0x7A,0x7B,0x7D, +0x7E,0x7E,0x80,0x82,0x85,0x85,0x82,0x81,0x7D,0x7A,0x78,0x79,0x7D,0x81,0x84,0x85, +0x85,0x85,0x85,0x85,0x83,0x7F,0x7C,0x7C,0x81,0x86,0x87,0x85,0x82,0x82,0x80,0x7F, +0x7D,0x7A,0x7B,0x7E,0x80,0x7D,0x7B,0x7C,0x7C,0x7D,0x7B,0x7A,0x7C,0x7E,0x7E,0x7B, +0x7B,0x7E,0x82,0x84,0x82,0x80,0x81,0x83,0x84,0x84,0x83,0x82,0x83,0x84,0x84,0x83, +0x85,0x8A,0x8E,0x8E,0x89,0x85,0x84,0x83,0x83,0x82,0x81,0x80,0x80,0x7F,0x80,0x82, +0x82,0x7F,0x7D,0x7C,0x7D,0x7E,0x7D,0x7B,0x7B,0x7C,0x7F,0x80,0x81,0x82,0x84,0x83, +0x81,0x7E,0x7D,0x81,0x86,0x87,0x86,0x87,0x86,0x86,0x84,0x84,0x84,0x85,0x85,0x83, +0x81,0x7F,0x7A,0x77,0x78,0x7D,0x84,0x87,0x85,0x82,0x80,0x80,0x7F,0x7B,0x77,0x76, +0x7A,0x7C,0x7B,0x77,0x76,0x79,0x7B,0x7C,0x7B,0x7B,0x7E,0x7E,0x7E,0x7E,0x7E,0x7F, +0x7F,0x7F,0x7E,0x7E,0x82,0x86,0x86,0x86,0x85,0x83,0x80,0x7F,0x7F,0x7C,0x77,0x73, +0x75,0x7B,0x82,0x86,0x87,0x84,0x80,0x7D,0x7C,0x7C,0x7A,0x78,0x76,0x78,0x7A,0x7B, +0x7E,0x81,0x81,0x7F,0x7E,0x7F,0x81,0x82,0x82,0x83,0x86,0x87,0x87,0x86,0x84,0x82, +0x83,0x85,0x84,0x81,0x80,0x82,0x83,0x84,0x84,0x83,0x84,0x83,0x81,0x7E,0x7D,0x7E, +0x7F,0x80,0x80,0x7F,0x7F,0x7E,0x7F,0x7F,0x7F,0x81,0x81,0x80,0x7F,0x80,0x82,0x83, +0x83,0x82,0x81,0x81,0x82,0x82,0x81,0x82,0x82,0x82,0x81,0x81,0x83,0x86,0x89,0x89, +0x87,0x84,0x81,0x80,0x81,0x83,0x83,0x80,0x7F,0x80,0x81,0x81,0x7F,0x7E,0x7D,0x7F, +0x81,0x81,0x7E,0x7B,0x79,0x79,0x7B,0x7C,0x7E,0x7E,0x7C,0x7A,0x79,0x7A,0x7C,0x7E, +0x7E,0x7E,0x82,0x86,0x89,0x88,0x88,0x87,0x87,0x89,0x89,0x8A,0x89,0x85,0x84,0x83, +0x82,0x7F,0x7C,0x7A,0x79,0x78,0x77,0x76,0x77,0x79,0x7B,0x7C,0x7D,0x7F,0x7F,0x79, +0x74,0x73,0x75,0x79,0x7E,0x82,0x85,0x86,0x87,0x87,0x88,0x86,0x84,0x82,0x81,0x80, +0x7E,0x7E,0x81,0x84,0x85,0x84,0x83,0x83,0x84,0x81,0x7C,0x78,0x77,0x77,0x76,0x77, +0x78,0x77,0x77,0x79,0x7D,0x7E,0x7D,0x7D,0x7E,0x81,0x83,0x81,0x7F,0x80,0x80,0x7F, +0x7E,0x7E,0x80,0x83,0x85,0x85,0x84,0x81,0x7F,0x7E,0x7F,0x82,0x86,0x89,0x89,0x85, +0x80,0x7E,0x7E,0x7E,0x7D,0x7F,0x84,0x88,0x88,0x87,0x84,0x81,0x81,0x83,0x84,0x82, +0x7E,0x7B,0x7A,0x7B,0x7D,0x81,0x83,0x82,0x82,0x81,0x7F,0x7D,0x7D,0x7F,0x82,0x85, +0x86,0x86,0x86,0x83,0x81,0x82,0x85,0x89,0x8A,0x8B,0x8A,0x8A,0x87,0x81,0x7F,0x7F, +0x80,0x80,0x7F,0x80,0x82,0x82,0x83,0x84,0x83,0x80,0x7E,0x80,0x80,0x7E,0x7A,0x79, +0x7A,0x7B,0x7B,0x78,0x76,0x76,0x76,0x77,0x78,0x7A,0x7D,0x81,0x85,0x89,0x8B,0x8B, +0x89,0x87,0x84,0x81,0x7E,0x7B,0x79,0x7A,0x7D,0x80,0x82,0x82,0x81,0x80,0x7F,0x7D, +0x7A,0x7A,0x78,0x76,0x75,0x77,0x7B,0x7E,0x7E,0x7E,0x7F,0x80,0x7F,0x7B,0x78,0x77, +0x78,0x7D,0x81,0x81,0x80,0x81,0x82,0x82,0x83,0x87,0x8A,0x8B,0x8A,0x86,0x81,0x7F, +0x7F,0x7E,0x7B,0x78,0x78,0x7B,0x7F,0x80,0x7F,0x7F,0x7E,0x7F,0x82,0x83,0x82,0x83, +0x83,0x80,0x80,0x82,0x84,0x80,0x7B,0x7B,0x7F,0x83,0x83,0x82,0x82,0x82,0x81,0x81, +0x81,0x80,0x7F,0x7C,0x78,0x79,0x7D,0x81,0x85,0x88,0x88,0x86,0x85,0x84,0x86,0x87, +0x86,0x85,0x83,0x83,0x85,0x85,0x85,0x85,0x84,0x84,0x83,0x7F,0x7A,0x78,0x79,0x7A, +0x7B,0x7D,0x81,0x85,0x89,0x89,0x85,0x80,0x7D,0x79,0x78,0x77,0x76,0x77,0x79,0x7B, +0x7D,0x80,0x82,0x85,0x87,0x88,0x88,0x88,0x87,0x86,0x85,0x84,0x83,0x85,0x87,0x85, +0x81,0x81,0x81,0x81,0x81,0x7F,0x7D,0x7C,0x7E,0x7F,0x80,0x81,0x81,0x7F,0x7D,0x7D, +0x80,0x80,0x80,0x7F,0x7E,0x7A,0x76,0x75,0x79,0x7B,0x79,0x79,0x7C,0x81,0x85,0x86, +0x84,0x81,0x80,0x81,0x82,0x81,0x7F,0x7D,0x7D,0x7F,0x80,0x7F,0x80,0x80,0x81,0x80, +0x7F,0x7F,0x80,0x7F,0x7C,0x7C,0x7D,0x7E,0x7E,0x7E,0x7F,0x7F,0x7F,0x7C,0x7A,0x79, +0x78,0x77,0x76,0x77,0x77,0x7A,0x7D,0x81,0x85,0x84,0x84,0x83,0x82,0x85,0x86,0x84, +0x80,0x7F,0x82,0x86,0x89,0x89,0x86,0x83,0x80,0x7C,0x79,0x78,0x7A,0x7F,0x80,0x7F, +0x7E,0x7E,0x7E,0x7D,0x7C,0x7B,0x7B,0x7C,0x7E,0x7F,0x7F,0x80,0x83,0x85,0x84,0x84, +0x86,0x86,0x84,0x84,0x86,0x8A,0x8B,0x8A,0x8A,0x8A,0x8A,0x8C,0x8C,0x8A,0x87,0x83, +0x80,0x80,0x82,0x84,0x84,0x84,0x83,0x81,0x80,0x7D,0x7B,0x79,0x78,0x76,0x78,0x78, +0x77,0x78,0x7C,0x7F,0x80,0x82,0x81,0x80,0x7C,0x7A,0x7C,0x7F,0x82,0x83,0x85,0x88, +0x8B,0x8D,0x8C,0x8B,0x88,0x85,0x84,0x82,0x81,0x7E,0x7D,0x7C,0x7C,0x7E,0x7E,0x7E, +0x7E,0x7F,0x7F,0x7E,0x7A,0x76,0x75,0x76,0x77,0x78,0x7A,0x7C,0x7B,0x78,0x76,0x78, +0x7B,0x7E,0x7D,0x7D,0x7E,0x7F,0x80,0x83,0x85,0x85,0x83,0x82,0x82,0x84,0x85,0x86, +0x86,0x83,0x7E,0x79,0x77,0x79,0x79,0x79,0x7A,0x7D,0x80,0x80,0x80,0x82,0x82,0x83, +0x83,0x82,0x81,0x81,0x81,0x81,0x82,0x85,0x87,0x85,0x82,0x7E,0x7B,0x7A,0x7C,0x7D, +0x7A,0x78,0x79,0x7D,0x7F,0x7E,0x7F,0x81,0x83,0x83,0x82,0x82,0x83,0x84,0x85,0x84, +0x83,0x83,0x84,0x85,0x86,0x86,0x83,0x7F,0x7E,0x80,0x81,0x81,0x80,0x7E,0x7D,0x7E, +0x82,0x85,0x86,0x88,0x88,0x86,0x81,0x7C,0x7B,0x7C,0x7D,0x7B,0x7A,0x7C,0x7E,0x7E, +0x7C,0x79,0x78,0x7A,0x80,0x84,0x85,0x84,0x85,0x87,0x8A,0x8D,0x8E,0x8B,0x87,0x83, +0x80,0x7F,0x80,0x7E,0x7C,0x7B,0x7C,0x7E,0x80,0x81,0x82,0x81,0x7F,0x7D,0x7D,0x7E, +0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x7D,0x7E,0x81,0x83,0x84,0x85,0x85,0x85,0x85,0x83, +0x82,0x81,0x80,0x80,0x80,0x80,0x81,0x82,0x82,0x81,0x7F,0x7F,0x7F,0x7F,0x7F,0x7B, +0x79,0x79,0x7C,0x7E,0x7D,0x7C,0x7C,0x7B,0x79,0x77,0x77,0x77,0x78,0x7A,0x7D,0x80, +0x83,0x86,0x86,0x85,0x81,0x80,0x81,0x85,0x87,0x84,0x7F,0x7D,0x7D,0x7E,0x7E,0x7E, +0x80,0x81,0x81,0x80,0x80,0x7F,0x7E,0x7C,0x7B,0x7A,0x79,0x7B,0x7B,0x7B,0x79,0x78, +0x7A,0x7E,0x82,0x82,0x81,0x7F,0x7C,0x7A,0x79,0x7B,0x7D,0x80,0x83,0x85,0x87,0x88, +0x88,0x87,0x88,0x87,0x86,0x86,0x85,0x85,0x85,0x84,0x83,0x83,0x83,0x81,0x80,0x81, +0x83,0x83,0x85,0x85,0x84,0x80,0x7D,0x7A,0x77,0x74,0x76,0x7A,0x7F,0x83,0x84,0x84, +0x84,0x85,0x84,0x80,0x7C,0x7A,0x7B,0x7E,0x82,0x87,0x8B,0x8D,0x8E,0x8D,0x8A,0x85, +0x81,0x7F,0x7D,0x7D,0x80,0x85,0x88,0x89,0x88,0x87,0x85,0x83,0x82,0x80,0x7A,0x76, +0x74,0x73,0x74,0x76,0x78,0x7B,0x7E,0x7F,0x7F,0x7E,0x7F,0x7E,0x7C,0x7C,0x80,0x84, +0x85,0x82,0x80,0x80,0x84,0x88,0x8C,0x8C,0x88,0x84,0x82,0x82,0x80,0x7C,0x7B,0x7B, +0x7B,0x77,0x74,0x74,0x74,0x75,0x79,0x7D,0x81,0x82,0x80,0x7E,0x7E,0x80,0x80,0x7F, +0x7E,0x7C,0x7B,0x7E,0x83,0x87,0x87,0x84,0x82,0x81,0x82,0x83,0x82,0x7F,0x7C,0x7A, +0x7A,0x7E,0x82,0x84,0x84,0x84,0x83,0x81,0x7F,0x7E,0x7D,0x7C,0x7D,0x7C,0x7D,0x7E, +0x7E,0x7E,0x7E,0x7F,0x7F,0x7D,0x7B,0x79,0x79,0x7C,0x81,0x83,0x84,0x87,0x88,0x86, +0x84,0x83,0x81,0x80,0x7F,0x7F,0x80,0x82,0x82,0x81,0x80,0x7F,0x7E,0x7E,0x7E,0x82, +0x86,0x88,0x88,0x86,0x84,0x7F,0x7B,0x7A,0x79,0x78,0x78,0x7A,0x7C,0x7E,0x82,0x85, +0x87,0x85,0x81,0x7F,0x7C,0x7B,0x7C,0x7E,0x80,0x82,0x85,0x89,0x8E,0x91,0x8F,0x88, +0x84,0x81,0x81,0x81,0x7F,0x7F,0x80,0x82,0x84,0x85,0x85,0x82,0x80,0x7E,0x7D,0x7E, +0x7D,0x7C,0x7A,0x79,0x78,0x7A,0x7E,0x83,0x86,0x89,0x88,0x84,0x82,0x80,0x7F,0x7F, +0x80,0x83,0x86,0x87,0x86,0x85,0x84,0x82,0x80,0x7C,0x7A,0x79,0x7C,0x7F,0x81,0x80, +0x80,0x83,0x86,0x83,0x7F,0x7C,0x7A,0x78,0x77,0x77,0x79,0x7B,0x7E,0x7E,0x7A,0x76, +0x74,0x76,0x7C,0x82,0x85,0x86,0x88,0x89,0x89,0x88,0x85,0x80,0x7C,0x79,0x77,0x77, +0x79,0x7A,0x7B,0x7C,0x7F,0x81,0x82,0x81,0x7E,0x7B,0x79,0x7B,0x7D,0x7D,0x7C,0x7B, +0x7D,0x7F,0x80,0x82,0x82,0x80,0x7D,0x7C,0x7C,0x7E,0x80,0x82,0x82,0x81,0x80,0x80, +0x80,0x7F,0x7E,0x7F,0x81,0x82,0x82,0x83,0x86,0x89,0x8A,0x87,0x83,0x80,0x7D,0x7A, +0x79,0x7B,0x7E,0x80,0x83,0x87,0x8B,0x8A,0x85,0x7F,0x7E,0x7E,0x7F,0x81,0x82,0x84, +0x86,0x87,0x87,0x86,0x84,0x83,0x82,0x7F,0x7E,0x7F,0x81,0x81,0x7F,0x7E,0x7D,0x7F, +0x83,0x85,0x84,0x81,0x80,0x80,0x80,0x81,0x7F,0x7E,0x7F,0x82,0x82,0x80,0x81,0x84, +0x85,0x83,0x7F,0x7C,0x7C,0x7E,0x80,0x81,0x83,0x86,0x88,0x89,0x87,0x85,0x83,0x81, +0x7F,0x7D,0x7D,0x7D,0x7C,0x7C,0x7D,0x7B,0x7A,0x79,0x7B,0x7B,0x7C,0x7D,0x7C,0x79, +0x79,0x7B,0x80,0x82,0x83,0x83,0x84,0x86,0x85,0x82,0x80,0x81,0x81,0x80,0x80,0x81, +0x81,0x80,0x7F,0x7F,0x81,0x81,0x80,0x80,0x80,0x80,0x7F,0x80,0x7F,0x7E,0x7E,0x7D, +0x7C,0x79,0x78,0x79,0x7A,0x79,0x77,0x78,0x7C,0x80,0x7F,0x7D,0x7D,0x80,0x82,0x83, +0x83,0x82,0x81,0x81,0x81,0x81,0x81,0x81,0x82,0x83,0x84,0x85,0x86,0x85,0x84,0x80, +0x7B,0x78,0x78,0x79,0x7A,0x7B,0x7C,0x7C,0x7D,0x7D,0x7B,0x7A,0x79,0x7A,0x7D,0x80, +0x81,0x81,0x82,0x85,0x88,0x89,0x88,0x86,0x85,0x83,0x82,0x81,0x7F,0x7D,0x7F,0x81, +0x82,0x84,0x85,0x86,0x86,0x84,0x82,0x84,0x86,0x86,0x84,0x81,0x7F,0x7F,0x7E,0x7D, +0x7D,0x7F,0x7F,0x80,0x80,0x7F,0x80,0x82,0x84,0x86,0x86,0x86,0x86,0x84,0x82,0x81, +0x81,0x83,0x84,0x84,0x84,0x83,0x83,0x85,0x85,0x83,0x81,0x80,0x81,0x82,0x82,0x82, +0x82,0x82,0x82,0x82,0x82,0x81,0x7F,0x7D,0x7C,0x7B,0x7A,0x7A,0x7B,0x7C,0x7D,0x7E, +0x7F,0x7F,0x7E,0x7B,0x79,0x79,0x7B,0x7C,0x7E,0x80,0x82,0x83,0x85,0x85,0x84,0x81, +0x7E,0x7F,0x80,0x7E,0x7A,0x79,0x7B,0x7D,0x7E,0x80,0x82,0x83,0x80,0x7E,0x7C,0x7A, +0x78,0x77,0x76,0x76,0x77,0x79,0x7C,0x7E,0x7E,0x7E,0x7F,0x80,0x81,0x81,0x7F,0x7D, +0x7C,0x7C,0x7C,0x7C,0x7D,0x7F,0x81,0x80,0x7F,0x81,0x84,0x89,0x8A,0x88,0x85,0x83, +0x82,0x80,0x7E,0x7C,0x7A,0x7A,0x7E,0x83,0x85,0x84,0x84,0x85,0x86,0x85,0x83,0x83, +0x83,0x82,0x7E,0x7C,0x7A,0x7A,0x7B,0x7D,0x7F,0x81,0x82,0x83,0x84,0x84,0x83,0x81, +0x80,0x80,0x80,0x82,0x86,0x89,0x88,0x83,0x80,0x7D,0x7D,0x7E,0x7E,0x7E,0x7F,0x80, +0x82,0x85,0x89,0x8B,0x8B,0x89,0x86,0x83,0x81,0x81,0x82,0x82,0x82,0x82,0x82,0x80, +0x7E,0x7C,0x7C,0x7D,0x7E,0x80,0x81,0x80,0x7E,0x7D,0x7B,0x7A,0x7C,0x7E,0x7F,0x80, +0x81,0x83,0x83,0x81,0x7F,0x7E,0x7F,0x80,0x81,0x83,0x83,0x84,0x84,0x83,0x82,0x7F, +0x7D,0x7B,0x7C,0x7E,0x81,0x83,0x83,0x81,0x82,0x85,0x84,0x81,0x7C,0x79,0x79,0x7A, +0x7D,0x7F,0x82,0x85,0x83,0x80,0x7E,0x7E,0x7D,0x7B,0x79,0x77,0x77,0x7B,0x80,0x83, +0x81,0x7F,0x80,0x82,0x84,0x83,0x81,0x81,0x81,0x7F,0x7C,0x7A,0x7A,0x7C,0x7E,0x7F, +0x7F,0x7F,0x7D,0x7A,0x78,0x76,0x74,0x76,0x7A,0x7D,0x80,0x83,0x85,0x84,0x81,0x80, +0x7F,0x7F,0x7F,0x7F,0x81,0x83,0x83,0x82,0x81,0x82,0x82,0x81,0x7F,0x81,0x84,0x83, +0x80,0x7F,0x82,0x85,0x86,0x86,0x85,0x80,0x7B,0x79,0x79,0x7B,0x7D,0x7E,0x7F,0x7D, +0x7B,0x7A,0x7D,0x82,0x84,0x84,0x85,0x85,0x86,0x85,0x83,0x83,0x85,0x86,0x87,0x88, +0x88,0x86,0x84,0x84,0x84,0x84,0x83,0x84,0x85,0x83,0x81,0x83,0x85,0x86,0x85,0x84, +0x82,0x80,0x7F,0x7F,0x7F,0x7E,0x7F,0x81,0x83,0x84,0x84,0x81,0x7E,0x7C,0x7B,0x7A, +0x7B,0x7F,0x82,0x83,0x81,0x7F,0x7F,0x81,0x82,0x81,0x7F,0x7F,0x80,0x81,0x82,0x81, +0x81,0x83,0x82,0x81,0x80,0x7F,0x7F,0x7F,0x7F,0x7E,0x7E,0x7D,0x7C,0x7B,0x79,0x79, +0x7B,0x7D,0x7D,0x7B,0x7A,0x7C,0x7E,0x7F,0x7F,0x7D,0x7A,0x78,0x76,0x75,0x76,0x79, +0x7D,0x80,0x82,0x83,0x83,0x83,0x82,0x80,0x80,0x7F,0x7F,0x80,0x81,0x81,0x80,0x80, +0x83,0x85,0x87,0x86,0x83,0x80,0x7C,0x79,0x75,0x75,0x78,0x7D,0x7F,0x7F,0x7F,0x82, +0x86,0x87,0x86,0x84,0x81,0x7E,0x7A,0x77,0x74,0x76,0x7C,0x80,0x83,0x86,0x89,0x8C, +0x8C,0x8A,0x87,0x86,0x85,0x82,0x80,0x7E,0x7C,0x7D,0x7F,0x81,0x83,0x84,0x83,0x82, +0x81,0x81,0x80,0x7E,0x7D,0x7D,0x7E,0x80,0x81,0x82,0x84,0x86,0x85,0x84,0x83,0x81, +0x7F,0x7D,0x7D,0x7E,0x80,0x82,0x83,0x84,0x85,0x85,0x85,0x85,0x82,0x7F,0x7D,0x7C, +0x7B,0x7A,0x79,0x79,0x7B,0x7F,0x82,0x86,0x88,0x88,0x85,0x81,0x81,0x81,0x82,0x82, +0x81,0x81,0x81,0x83,0x84,0x82,0x81,0x80,0x81,0x81,0x81,0x80,0x80,0x81,0x83,0x85, +0x85,0x82,0x80,0x80,0x80,0x7E,0x7B,0x7A,0x7D,0x7F,0x80,0x7D,0x7C,0x7B,0x7A,0x78, +0x78,0x7A,0x7E,0x81,0x83,0x85,0x87,0x88,0x86,0x84,0x83,0x80,0x7D,0x7B,0x7A,0x79, +0x78,0x79,0x7C,0x7E,0x81,0x81,0x81,0x80,0x80,0x81,0x82,0x83,0x82,0x81,0x80,0x7F, +0x7E,0x7C,0x7C,0x80,0x82,0x82,0x80,0x7E,0x7C,0x7B,0x7C,0x7D,0x7E,0x7D,0x7C,0x7C, +0x7B,0x7A,0x79,0x7A,0x7B,0x7B,0x7A,0x7C,0x7F,0x81,0x80,0x7F,0x81,0x83,0x82,0x80, +0x7F,0x80,0x80,0x7F,0x7F,0x83,0x87,0x8A,0x89,0x86,0x83,0x82,0x83,0x84,0x83,0x83, +0x84,0x85,0x83,0x80,0x7E,0x7E,0x7D,0x7C,0x7B,0x7A,0x7D,0x81,0x84,0x86,0x86,0x84, +0x83,0x82,0x81,0x80,0x80,0x81,0x83,0x85,0x85,0x87,0x88,0x88,0x86,0x84,0x84,0x83, +0x81,0x7F,0x7E,0x7E,0x7E,0x7F,0x82,0x85,0x86,0x85,0x82,0x80,0x81,0x82,0x81,0x7F, +0x7D,0x7C,0x7E,0x7F,0x7F,0x7F,0x80,0x81,0x83,0x83,0x82,0x82,0x82,0x7F,0x7D,0x7E, +0x7F,0x7F,0x7E,0x7F,0x82,0x83,0x82,0x82,0x83,0x83,0x82,0x81,0x80,0x7D,0x7A,0x7A, +0x7B,0x7C,0x7D,0x7B,0x7A,0x7C,0x7F,0x81,0x81,0x7F,0x7B,0x78,0x79,0x7B,0x7A,0x7A, +0x7C,0x7E,0x7F,0x7F,0x80,0x80,0x80,0x7F,0x7E,0x7E,0x80,0x83,0x85,0x85,0x82,0x80, +0x7F,0x80,0x81,0x81,0x81,0x83,0x85,0x84,0x81,0x7F,0x7D,0x7C,0x7A,0x78,0x7A,0x7C, +0x7E,0x7E,0x7D,0x7D,0x7E,0x81,0x82,0x81,0x7F,0x7E,0x7F,0x7E,0x7B,0x7A,0x7B,0x7C, +0x7D,0x7E,0x81,0x84,0x86,0x86,0x85,0x84,0x82,0x80,0x7F,0x80,0x81,0x81,0x83,0x86, +0x89,0x8B,0x8C,0x8C,0x8A,0x86,0x80,0x7B,0x78,0x79,0x7A,0x7C,0x7D,0x7D,0x7C,0x7E, +0x81,0x82,0x81,0x7F,0x7B,0x79,0x79,0x7C,0x7F,0x83,0x86,0x87,0x87,0x86,0x84,0x83, +0x81,0x81,0x81,0x81,0x81,0x80,0x7F,0x7E,0x80,0x80,0x80,0x7F,0x7F,0x80,0x83,0x87, +0x8A,0x8C,0x8C,0x8A,0x86,0x80,0x7C,0x7A,0x79,0x7B,0x7E,0x81,0x81,0x81,0x81,0x80, +0x7E,0x7E,0x7E,0x80,0x81,0x81,0x81,0x80,0x80,0x82,0x83,0x84,0x83,0x82,0x81,0x80, +0x7E,0x7E,0x7D,0x7C,0x7E,0x81,0x83,0x83,0x81,0x7F,0x7E,0x80,0x83,0x85,0x84,0x81, +0x7D,0x7B,0x7C,0x7D,0x7E,0x7E,0x7E,0x7E,0x7F,0x80,0x7E,0x7A,0x77,0x76,0x77,0x77, +0x77,0x78,0x7B,0x7D,0x7E,0x7E,0x7F,0x81,0x81,0x7F,0x7E,0x7E,0x7F,0x7F,0x7F,0x7E, +0x7F,0x81,0x81,0x82,0x82,0x83,0x84,0x85,0x85,0x83,0x81,0x81,0x82,0x80,0x7D,0x7B, +0x7C,0x7C,0x7C,0x79,0x78,0x79,0x7A,0x7A,0x7A,0x7A,0x7B,0x7C,0x7C,0x7B,0x7C,0x7E, +0x81,0x83,0x85,0x86,0x85,0x83,0x83,0x84,0x85,0x84,0x85,0x86,0x89,0x8B,0x8B,0x89, +0x86,0x85,0x85,0x85,0x84,0x84,0x84,0x85,0x86,0x85,0x83,0x7F,0x7A,0x77,0x78,0x7C, +0x80,0x82,0x82,0x81,0x80,0x7F,0x7F,0x7F,0x7F,0x7D,0x7C,0x7B,0x7D,0x7F,0x81,0x84, +0x85,0x84,0x84,0x84,0x86,0x85,0x84,0x83,0x83,0x84,0x86,0x8B,0x8D,0x8C,0x88,0x85, +0x82,0x7E,0x7B,0x7A,0x7C,0x7E,0x7F,0x7E,0x7C,0x79,0x78,0x78,0x79,0x79,0x79,0x78, +0x78,0x77,0x77,0x7A,0x7D,0x7F,0x80,0x81,0x83,0x84,0x85,0x85,0x85,0x83,0x83,0x85, +0x87,0x86,0x83,0x81,0x83,0x84,0x83,0x80,0x7F,0x80,0x82,0x81,0x7F,0x7D,0x7B,0x78, +0x76,0x76,0x77,0x77,0x78,0x79,0x79,0x79,0x7B,0x7E,0x81,0x81,0x80,0x7E,0x7C,0x7B, +0x7A,0x79,0x79,0x7B,0x80,0x85,0x89,0x8A,0x89,0x89,0x89,0x87,0x84,0x81,0x7F,0x80, +0x81,0x80,0x7F,0x7F,0x82,0x84,0x85,0x82,0x7D,0x7A,0x78,0x77,0x76,0x75,0x77,0x7B, +0x7E,0x7F,0x7E,0x7E,0x7E,0x7E,0x7D,0x7C,0x7D,0x80,0x82,0x82,0x83,0x85,0x85,0x84, +0x83,0x84,0x86,0x86,0x83,0x81,0x82,0x85,0x86,0x86,0x85,0x84,0x84,0x85,0x85,0x84, +0x82,0x81,0x81,0x82,0x83,0x81,0x7D,0x7B,0x7B,0x7C,0x7E,0x7F,0x7F,0x7F,0x7F,0x80, +0x81,0x84,0x85,0x84,0x83,0x83,0x86,0x88,0x88,0x86,0x85,0x86,0x85,0x85,0x86,0x85, +0x83,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0x84,0x85,0x83,0x7E,0x7C,0x7C,0x7C,0x7D, +0x7F,0x80,0x81,0x81,0x81,0x7F,0x7E,0x7E,0x7E,0x7D,0x7A,0x77,0x76,0x78,0x7A,0x7D, +0x7F,0x80,0x82,0x85,0x89,0x8A,0x89,0x86,0x81,0x7E,0x7D,0x7D,0x7D,0x7B,0x79,0x76, +0x76,0x78,0x7B,0x7E,0x7F,0x80,0x80,0x7F,0x7B,0x79,0x7B,0x7E,0x7F,0x81,0x81,0x82, +0x81,0x7D,0x7B,0x79,0x79,0x78,0x77,0x78,0x79,0x7B,0x7C,0x7C,0x7E,0x80,0x82,0x83, +0x83,0x83,0x83,0x83,0x82,0x7F,0x7D,0x7C,0x7D,0x7E,0x80,0x84,0x86,0x86,0x85,0x85, +0x86,0x85,0x83,0x81,0x7E,0x7D,0x7D,0x7F,0x81,0x84,0x87,0x89,0x8A,0x8A,0x86,0x81, +0x7F,0x7F,0x7E,0x7D,0x7E,0x80,0x82,0x81,0x80,0x7D,0x7B,0x7A,0x7A,0x7B,0x7C,0x7E, +0x00 +}; diff --git a/boop/trunk/syscalls.c b/boop/trunk/syscalls.c new file mode 100644 index 0000000..eea9557 --- /dev/null +++ b/boop/trunk/syscalls.c @@ -0,0 +1,22 @@ +/* based on a example-code from Keil for CS G++ */ + +/* for caddr_t (typedef char * caddr_t;) */ +#include + +extern int _bss_end; + +caddr_t _sbrk ( int incr ) +{ + static unsigned char *heap = NULL; + unsigned char *prev_heap; + + if (heap == NULL) { + heap = (unsigned char *)&_bss_end; + } + prev_heap = heap; + /* check removed to show basic approach */ + + heap += incr; + + return (caddr_t) prev_heap; +} diff --git a/boop/trunk/timer/Make.conf b/boop/trunk/timer/Make.conf new file mode 100644 index 0000000..6a23f8a --- /dev/null +++ b/boop/trunk/timer/Make.conf @@ -0,0 +1,2 @@ +THUMBSRCS := timerfuncs.c +SRCS := timerirq.c diff --git a/boop/trunk/timer/timerfuncs.c b/boop/trunk/timer/timerfuncs.c new file mode 100644 index 0000000..f7749c1 --- /dev/null +++ b/boop/trunk/timer/timerfuncs.c @@ -0,0 +1,169 @@ +/* + timerfuncs.c - timer control functions + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lpc2220.h" +#include "timerfuncs.h" +#include "irq.h" +#include "keyboard.h" + +extern struct CB callbacks[MAX_CB]; +extern unsigned long* timeouts[MAX_TO]; + +void startTimerIRQ(void) +{ + int i; + struct CB *cur_cb; + + for(i=0; istate = SLOT_FREE; + cur_cb->exec = 0; + } + + for(i=0; i PR = 15 - 1 = 0x0e + T0MR0 = 5000; // 1.000.000 Hz / 5000 = 200 Hz = 5 msec intervall time + T0MCR = 0x03; // reset and issue IRQ on TC == MR0 + T0TCR = 0x01; // enable timer + + T0overflow = 0; + + VICVectAddr15 = (unsigned long)&(timerIRQ); + VICVectCntl15 = VIC_SLOT_EN | INT_SRC_TIMER0; + VICIntEnable = INT_TIMER0; +} + +void wait5ms(void) { + + unsigned long x; + + x=T0TC; + while(x==T0TC); + while(x!=T0TC); +} + +void waitus(unsigned long d) { + + unsigned long x,y; + + x=(T0TC+d)%5000; + y= T0overflow; + + if(xT0TC); +} + +unsigned int addTimerCB(cb_fn cb, unsigned short intervall) +{ + int i; + struct CB *cur_cb; + + for(i=0; istate == SLOT_FREE) + { + cur_cb->exec = cb; + cur_cb->intervall = intervall; + cur_cb->cur_intervall = 0; + cur_cb->state = SLOT_HALT | SLOT_USED; + return i; + } + i++; + } + return 0xFF; +} + +unsigned int removeTimerCB(unsigned int cb) +{ + if(cb < MAX_CB) + { + callbacks[cb].state = SLOT_FREE; + return MAX_CB; + } + return 0xFF; +} + +void startCB(unsigned int cb) +{ + if(cb < MAX_CB) + { + callbacks[cb].state &= ~SLOT_HALT; + } +} + +void stopCB(unsigned int cb) +{ + if(cb < MAX_CB) + { + callbacks[cb].state |= SLOT_HALT; + } +} + +void setCBIntervall(unsigned int cb, unsigned short intervall) +{ + if(cb < MAX_CB) + { + callbacks[cb].intervall = intervall; + callbacks[cb].cur_intervall = 0; + } +} + +unsigned char addTimeout(volatile unsigned long* counter, unsigned long value) { + + int i; + + for(i=0; i + + 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 3 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 TIMERFUNCS_H +#define TIMERFUNCS_H + +//////////////////////////////////////////////// +///@Attention: Timer are using 5msec intervall! +//////////////////////////////////////////////// +#define TIME_MSEC2TICKS(t) (t/5) + +#include "timerirq.h" + +volatile unsigned long T0overflow; + +void startTimerIRQ(void); + +/** +@brief Alocate a timer, set the time but do *NOT* start. + + Use @see startCB to start the timer + +@Param Timer expiry callback, time intervall + +@return index of the allocated timer on success + 0xFF is no timer left +*/ +unsigned int addTimerCB(cb_fn cb, unsigned short intervall); +unsigned int removeTimerCB(unsigned int cb); +void startCB(unsigned int cb); +void stopCB(unsigned int cb); +void setCBIntervall(unsigned int cb, unsigned short intervall); +void wait5ms(void); +void waitus(unsigned long d); +unsigned char addTimeout(volatile unsigned long* counter, unsigned long value); +unsigned char removeTimeout(volatile unsigned long* counter); + +#endif diff --git a/boop/trunk/timer/timerirq.c b/boop/trunk/timer/timerirq.c new file mode 100644 index 0000000..a19cfae --- /dev/null +++ b/boop/trunk/timer/timerirq.c @@ -0,0 +1,70 @@ +/* + timerirq.c - timekeeping and calllbacks + Copyright (C) 2007 Ch. Klippel + + 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 3 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 "lpc2220.h" +#include "timerirq.h" +#include "timerfuncs.h" +#include "lcd.h" + +struct CB callbacks[MAX_CB]; +unsigned long* timeouts[MAX_TO]; + + +// wird alle 5 ms aufgerufen (s. startTimerIRQ() in timerfuncs) +// bearbeitet eingetragene "timer" +void __attribute__ ((section(".text.fastcode"))) timerIRQ(void) +{ + unsigned int cnt; + struct CB *cur_cb; + + for(cnt=0; cntstate & SLOT_USED) + { + if(!(cur_cb->state & SLOT_HALT)) + { + cur_cb->cur_intervall++; + if(cur_cb->cur_intervall >= cur_cb->intervall) + { + if(cur_cb->exec) + (cur_cb->exec)(cnt); // run callback function + cur_cb->cur_intervall = 0; + } + } + } + } + + for(cnt = 0; cnt < MAX_TO; cnt++) { + if(timeouts[cnt]) { + if(*timeouts[cnt]) + (*timeouts[cnt])--; + else + timeouts[cnt] = 0; + } + } + + if(oldsymbols != symbols) { + volatile cb_fn x; + x=refresh_symbols; + x(0xff); + } + + T0overflow++; + T0IR = 1; +} diff --git a/boop/trunk/timer/timerirq.h b/boop/trunk/timer/timerirq.h new file mode 100644 index 0000000..c39a6ae --- /dev/null +++ b/boop/trunk/timer/timerirq.h @@ -0,0 +1,41 @@ +/* + timerirq.h - timekeeping and calllbacks + Copyright (C) 2007 Ch. Klippel + + 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 3 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 TIMERIRQ_H +#define TIMERIRQ_H + +#define MAX_CB 32 +#define MAX_TO 10 + +#define SLOT_FREE 0x00 +#define SLOT_USED 0x01 +#define SLOT_HALT 0x02 + +typedef void(*cb_fn)(unsigned int cb); + +typedef struct CB +{ + unsigned int state; + unsigned short cur_intervall; + unsigned short intervall; + cb_fn exec; +} CB; + +void __attribute__ ((section(".text.fastcode"))) timerIRQ (void); + +#endif diff --git a/boop/trunk/tools/Make.conf b/boop/trunk/tools/Make.conf new file mode 100644 index 0000000..1ed1f58 --- /dev/null +++ b/boop/trunk/tools/Make.conf @@ -0,0 +1 @@ +THUMBSRCS := toolsmenu.c scart_icp.c diff --git a/boop/trunk/tools/scart_icp.c b/boop/trunk/tools/scart_icp.c new file mode 100644 index 0000000..3bc6cb2 --- /dev/null +++ b/boop/trunk/tools/scart_icp.c @@ -0,0 +1,715 @@ +/* + 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 3 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 DEBUGMODE + #define USE_SCART_ICP 1 +#endif + +#include "lpc2220.h" +#include "lcd.h" +#include "fonty.h" +#include "keyboard.h" + +#if USE_SCART_ICP + +#include "scart_icp.h" +#include "scart_image.h" + + + +/* The portpins (P0.x) to use to connect to scart */ +#define PIN_RST (1<<14) /* Portpin P0.14 to RST/P1.5 on Scart */ +#define PIN_PDA (1<<1) /* Portpin P0.1 to PDA/P0.4 on Scart */ +#define PIN_PCL (1<<0) /* Portpin P0.0 to PCL/P0.5 on Scart */ + +/* bit mask for port value and direction register */ +#define PORT_MASK (PIN_RST | PIN_PDA | PIN_PCL) +/* bit mask for pin function select register */ +#define PINSEL_MASK (((PIN_RST*PIN_RST) | (PIN_PDA*PIN_PDA) | (PIN_PCL*PIN_PCL)) * 3) + + +/* Definitions of the ICP commands/opcodes */ +/* see http://www.zlgmcu.com/philips/yingrong/lpc900/LPC900_ICP_Spec_en.pdf */ +#define OP_NOP 0x00 /* NOP */ +#define OP_WR_FMADRL 0x08 /* Write address low command */ +#define OP_RD_FMADRL 0x09 /* Read address low command */ +#define OP_WR_FMADRH 0x0A /* Write address high command */ +#define OP_RD_FMADRH 0x0B /* Read address high command */ +#define OP_WR_FMCON 0x0E /* Write a command to FMCON */ +#define OP_RD_FMCON 0x0F /* Read a command from FMCON */ +#define OP_WR_FMDATA_PG 0x14 /* Write a command to FMDATA and increment address */ +#define OP_RD_FMDATA_PG 0x15 /* Read a command from FMDATA and increment address */ +#define OP_WR_FMDATA 0x0C /* Write a command to FMDATA */ +#define OP_RD_FMDATA 0x0D /* Read a command from FMDATA */ +#define OP_WR_FMDATA_I 0x04 /* Write a command to FMDATA and increment address */ +#define OP_RD_FMDATA_I 0x05 /* Read a command from FMDATA and increment address */ + +#define CMD_LOAD 0x00 /* Clear and then load the page register */ +#define CMD_PROG 0x48 /* Program page with page register command */ +#define CMD_ERS_G 0x72 /* Erase global command */ +#define CMD_ERS_S 0x71 /* Erase sector command */ +#define CMD_ERS_P 0x70 /* Erase page command */ +#define CMD_CONF 0x6C /* Accesses user configuration information addressed by FMADRL */ +#define CMD_CRC_G 0x1A /* Calculate CRC on the entire user code command */ +#define CMD_CRC_S 0x19 /* Calculate CRC on a sector command */ +#define CMD_CCP 0x67 /* Clear configuration protection */ + +#define ADR_UCFG1 0x00 /* User Configuration Reg. #1 */ +#define ADR_UCFG2 0x01 /* User Configuration Reg. #2 */ +#define ADR_BootVector 0x02 /* Bootvector */ +#define ADR_StatusByte 0x03 /* Status Byte */ +#define ADR_SEC0 0x08 /* Security byte, sector 0 */ +#define ADR_SEC1 0x09 /* Security byte, sector 1 */ +#define ADR_SEC2 0x0A /* Security byte, sector 2 */ +#define ADR_SEC3 0x0B /* Security byte, sector 3 */ +#define ADR_SEC4 0x0C /* Security byte, sector 4 */ +#define ADR_SEC5 0x0D /* Security byte, sector 5 */ +#define ADR_SEC6 0x0E /* Security byte, sector 6 */ +#define ADR_SEC7 0x0F /* Security byte, sector 7 */ +#define ADR_MFGID 0x10 /* Manufacturer ID */ +#define ADR_ID1 0x11 /* Device ID 1 */ +#define ADR_ID2 0x12 /* Device ID 2 */ + + +/* Scart's flash memory attributes */ +#define PAGE_SIZE 64 /* flash page size of LPC931 */ +#define SECTOR_SIZE 1024 /* flash sector size of LPC931 */ + + +/* saved pin configuration for later restore */ +static unsigned int savedPinsel0, savedPindir0, savedPin0; + + +/**************************************************************************/ +/* icp_init() */ +/* Purpose: Initialize the portpins for use as ICP */ +/* Input: - */ +/* Output: - */ +/* Return: - */ +/**************************************************************************/ +static void icp_init() +{ + /* save the current pin configuration */ + savedPinsel0 = PINSEL0; + savedPindir0 = FIODIR0; + savedPin0 = FIOPIN0; + + /* setup all used pins as GPIO, output, low */ + PINSEL0 &= ~PINSEL_MASK; + FIODIR0 |= (PIN_RST | PIN_PDA | PIN_PCL); + FIOCLR0 = (PIN_RST | PIN_PDA | PIN_PCL); +} + +/**************************************************************************/ +/* icp_close() */ +/* Purpose: Configure the portpins as they was before used for ICP */ +/* Input: - */ +/* Output: - */ +/* Return: - */ +/**************************************************************************/ +static void icp_close() +{ + /* restore the saved pin configuration */ + PINSEL0 = (PINSEL0 & ~PINSEL_MASK) | (savedPinsel0 & PINSEL_MASK); + FIODIR0 = (FIODIR0 & ~PORT_MASK) | (savedPindir0 & PORT_MASK); + FIOPIN0 = (FIOPIN0 & ~PORT_MASK) | (savedPin0 & PORT_MASK); +} + +/**************************************************************************/ +/* icp_wait_us() */ +/* Purpose: Wait some us */ +/* Input: time: the time to wait in us */ +/* Output: - */ +/* Return: - */ +/**************************************************************************/ +static void icp_wait_us(int time) +{ + int start; + + /* use Timer0, which increments every 1us and rollover at T0MR0 */ + start = T0TC; + if ((start + time) < T0MR0) + { + while (T0TC < (start + time)); + } + else + { + while ((T0TC < (start + time - T0MR0)) || (T0TC >= start)); + } +} + +/**************************************************************************/ +/* icp_wait_ns() */ +/* Purpose: Wait some ns */ +/* Input: time: the time to wait in ns */ +/* Output: - */ +/* Return: - */ +/**************************************************************************/ +static void icp_wait_ns(int time) +{ + int i; + + /* inaccurate, but okay */ + for (i=0; i<(time>>4); i++); +} + +/**************************************************************************/ +/* icp_mode_entry() */ +/* Purpose: Bring the scart's CPU into ICP mode */ +/* Input: - */ +/* Output: - */ +/* Return: - */ +/**************************************************************************/ +static void icp_mode_entry() +{ + int i; + + /* see ICP spec */ + for (i=0; i<8; i++) + { + FIOCLR0 = PIN_RST; + icp_wait_us(10); + FIOSET0 = PIN_RST; + icp_wait_us(10); + } + icp_wait_us(50); +} + +/**************************************************************************/ +/* icp_mode_exit() */ +/* Purpose: Bring the scart's CPU out of ICP mode, reset CPU */ +/* Input: - */ +/* Output: - */ +/* Return: - */ +/**************************************************************************/ +static void icp_mode_exit() +{ + FIOCLR0 = (PIN_RST | PIN_PDA | PIN_PCL); +} + +/**************************************************************************/ +/* icp_shift_out() */ +/* Purpose: Shift out one byte to scart */ +/* Input: val: byte to shift out */ +/* Output: - */ +/* Return: - */ +/**************************************************************************/ +static void icp_shift_out(unsigned char val) +{ + int i; + + for (i=0; i<8; i++) + { + FIOCLR0 = PIN_PCL; + icp_wait_ns(50); + if (val & 1) + { + FIOSET0 = PIN_PDA; + } + else + { + FIOCLR0 = PIN_PDA; + } + val >>= 1; + icp_wait_ns(50); + FIOSET0 = PIN_PCL; + icp_wait_ns(100); + } + icp_wait_ns(100); +} + +/**************************************************************************/ +/* icp_shift_in() */ +/* Purpose: Shift in one byte from scart */ +/* Input: - */ +/* Output: - */ +/* Return: byte shifted in */ +/**************************************************************************/ +static unsigned char icp_shift_in() +{ + int i; + unsigned char val; + + /* configure pin as input */ + FIODIR0 &= ~PIN_PDA; + val = 0; + for (i=0; i<8; i++) + { + FIOCLR0 = PIN_PCL; + icp_wait_ns(100); + val >>= 1; + val |= ((FIOPIN0 & PIN_PDA) ? 0x80 : 0); + FIOSET0 = PIN_PCL; + icp_wait_ns(100); + } + /* configure pin as output */ + FIODIR0 |= PIN_PDA; + icp_wait_ns(100); + return val; +} + +/**************************************************************************/ +/* icp_read_config_byte() */ +/* Purpose: Read a configuration byte from scart */ +/* Input: adr: address of the config byte */ +/* Output: - */ +/* Return: value of the config byte */ +/**************************************************************************/ +static unsigned char icp_read_config_byte(unsigned char adr) +{ + icp_shift_out(OP_WR_FMCON); + icp_shift_out(CMD_CONF); + icp_shift_out(OP_WR_FMADRL); + icp_shift_out(adr); + icp_shift_out(OP_RD_FMDATA); + return icp_shift_in(); +} + +/**************************************************************************/ +/* icp_write_config_byte() */ +/* Purpose: Write a configuration byte to scart */ +/* Input: adr: address of the config byte */ +/* val: value of the config byte */ +/* Output: - */ +/* Return: 0 on success, else error code */ +/**************************************************************************/ +static unsigned char icp_write_config_byte(unsigned char adr, unsigned char val) +{ + unsigned char status; + + icp_shift_out(OP_WR_FMCON); + icp_shift_out(CMD_CONF); + icp_shift_out(OP_WR_FMADRL); + icp_shift_out(adr); + icp_shift_out(OP_WR_FMDATA); + icp_shift_out(val); + + do + { + icp_shift_out(OP_RD_FMCON); + status = icp_shift_in(); + } while ((status & 0x8F) == 0x80); + + return (status & 0x8F); +} + +/**************************************************************************/ +/* icp_calc_sector_crc() */ +/* Purpose: Calculate the CRC of one sector */ +/* Input: adr: start address of the sector */ +/* Output: crc: value of the CRC */ +/* Return: 0 on success, else error code */ +/**************************************************************************/ +static unsigned char icp_calc_sector_crc(unsigned short adr, unsigned int *pcrc) +{ + int i; + unsigned char status; + + icp_shift_out(OP_WR_FMADRH); + icp_shift_out(adr>>8); + icp_shift_out(OP_WR_FMCON); + icp_shift_out(CMD_CRC_S); + + do + { + icp_shift_out(OP_RD_FMCON); + status = icp_shift_in(); + } while ((status & 0x8F) == 0x80); + + if (status & 0x8F) return (status & 0x8F); + + *pcrc = 0; + for (i=0; i<4; i++) + { + icp_shift_out(OP_RD_FMDATA_I); + *pcrc >>= 8; + *pcrc |= (unsigned int)icp_shift_in() << 24; + } + return 0; +} + +/**************************************************************************/ +/* icp_load_page_register() */ +/* Purpose: Load the page registers with bytes */ +/* Input: adr: start address of the bytes in the flash */ +/* pval: pointer to the bytes to load */ +/* nbytes: number of bytes to load */ +/* Output: - */ +/* Return: - */ +/**************************************************************************/ +static void icp_load_page_register(unsigned short adr, const unsigned char *pval, unsigned char nbytes) +{ + int i; + + icp_shift_out(OP_WR_FMCON); + icp_shift_out(CMD_LOAD); + icp_shift_out(OP_WR_FMADRL); + icp_shift_out(adr & 0xFF); + icp_shift_out(OP_WR_FMDATA_PG); + for (i=0; i> 8); + icp_shift_out(OP_WR_FMCON); + icp_shift_out(CMD_PROG); + + do + { + icp_shift_out(OP_RD_FMCON); + status = icp_shift_in(); + } while ((status & 0x8F) == 0x80); + + return (status & 0x8F); +} + +/**************************************************************************/ +/* icp_erase_sector() */ +/* Purpose: Erase one flash sector */ +/* Input: adr: start address of the sector in the flash */ +/* Output: - */ +/* Return: 0 on success, else error code */ +/**************************************************************************/ +static unsigned char icp_erase_sector(unsigned short adr) +{ + unsigned char status; + + icp_shift_out(OP_WR_FMADRH); + icp_shift_out(adr >> 8); + icp_shift_out(OP_WR_FMCON); + icp_shift_out(CMD_ERS_S); + + do + { + icp_shift_out(OP_RD_FMCON); + status = icp_shift_in(); + } while ((status & 0x8F) == 0x80); + + return (status & 0x8F); +} + +void scart_icp_header(void) { + set_font(BOLDFONT); + draw_string(0, 0, "Scart ICP", 3, DRAW_PUT); + draw_block(0,10,128,2,3,DRAW_PUT); + draw_block(0,149,128,2,3,DRAW_PUT); + set_font(SMALLFONT); +} + +/**************************************************************************/ +/* scart_icp() */ +/* Purpose: Use ICP to program an image into scart's flash */ +/* and read some infos from scart */ +/* Input: - */ +/* Output: - */ +/* Return: - */ +/**************************************************************************/ +void scart_icp(void) +{ + int i; + unsigned short offs, addr, blklen; + unsigned int err, crc_sc, crc_im, tap, poly, crcf; + unsigned char data; + + + set_font(SMALLFONT); + + lcd_fill(0); + scart_icp_header(); + draw_string(0, 20, "Um Schaeden an der Betty", 3, DRAW_PUT); + draw_string(0, 29, "und am Scart-Adapter zu", 3, DRAW_PUT); + draw_string(0, 38, "vermeiden, folgen Sie", 3, DRAW_PUT); + draw_string(0, 47, "bitte den Anweisungen!", 3, DRAW_PUT); + draw_string(0, 56, "Entfernen Sie alle", 3, DRAW_PUT); + draw_string(0, 65, "Kabel von der Betty!", 3, DRAW_PUT); + draw_string(0, 74, "Druecken Sie dann OK.", 3, DRAW_PUT); + draw_string(0, 83, "Oder druecken Sie EXIT", 3, DRAW_PUT); + draw_string(0, 92, "um jetzt abzubrechen.", 3, DRAW_PUT); + + do + { + waitKeyUpDown(); + } while(!KEY_OK && !KEY_Exit); + + if (KEY_Exit) return; + + /* init port pins */ + icp_init(); + + lcd_fill(0); + scart_icp_header(); + draw_string(0, 20, "Trennen Sie zuerst die", 3, DRAW_PUT); + draw_string(0, 29, "Stromversorgung des", 3, DRAW_PUT); + draw_string(0, 38, "SCART-Adapters.", 3, DRAW_PUT); + draw_string(0, 47, "Verbinden Sie danach die", 3, DRAW_PUT); + draw_string(0, 56, "Betty mit dem SCART-", 3, DRAW_PUT); + draw_string(0, 65, "Adapter. Schliessen Sie", 3, DRAW_PUT); + draw_string(0, 74, "dann die Stromversorgung", 3, DRAW_PUT); + draw_string(0, 83, "des SCART-Adapters", 3, DRAW_PUT); + draw_string(0, 92, "wieder an.", 3, DRAW_PUT); + draw_string(0, 101, "Druecken Sie dann OK.", 3, DRAW_PUT); + + do + { + waitKeyUpDown(); + } while(!KEY_OK); + + /* bring scart into ICP mode */ + icp_mode_entry(); + + while (1) + { + lcd_fill(0); + scart_icp_header(); + draw_string(0, 20, "Druecken Sie eine Taste", 3, DRAW_PUT); + draw_string(0, 40, "1 Lese Config-Bytes", 3, DRAW_PUT); + draw_string(0, 49, "2 Programmiere Image", 3, DRAW_PUT); + draw_string(0, 58, "3 Vergleiche CRCs", 3, DRAW_PUT); + draw_string(0, 67, "4 Schreibe Config-Bytes", 3, DRAW_PUT); + draw_string(0, 84, "Exit Beenden", 3, DRAW_PUT); + + do + { + waitKeyUpDown(); + } while(!KEY_Exit && !KEY_1 && !KEY_2 && !KEY_3 && !KEY_4); + + lcd_fill(0); + scart_icp_header(); + if (KEY_Exit) break; + + if (KEY_1) + { /* show all config bytes */ + draw_string(0, 14, "UCFG1 & 2", 3, DRAW_PUT); + draw_hexC (60, 14, icp_read_config_byte(ADR_UCFG1), 3, DRAW_PUT); + draw_hexC (80, 14, icp_read_config_byte(ADR_UCFG2), 3, DRAW_PUT); + draw_string(0, 23, "BootVector", 3, DRAW_PUT); + draw_hexC (60, 23, icp_read_config_byte(ADR_BootVector), 3, DRAW_PUT); + draw_string(0, 32, "StatusByte", 3, DRAW_PUT); + draw_hexC (60, 32, icp_read_config_byte(ADR_StatusByte), 3, DRAW_PUT); + draw_string(0, 41, "SEC0", 3, DRAW_PUT); + draw_hexC (60, 41, icp_read_config_byte(ADR_SEC0), 3, DRAW_PUT); + draw_string(0, 50, "SEC1", 3, DRAW_PUT); + draw_hexC (60, 50, icp_read_config_byte(ADR_SEC1), 3, DRAW_PUT); + draw_string(0, 59, "SEC2", 3, DRAW_PUT); + draw_hexC (60, 59, icp_read_config_byte(ADR_SEC2), 3, DRAW_PUT); + draw_string(0, 68, "SEC3", 3, DRAW_PUT); + draw_hexC (60, 68, icp_read_config_byte(ADR_SEC3), 3, DRAW_PUT); + draw_string(0, 77, "SEC4", 3, DRAW_PUT); + draw_hexC (60, 77, icp_read_config_byte(ADR_SEC4), 3, DRAW_PUT); + draw_string(0, 86, "SEC5", 3, DRAW_PUT); + draw_hexC (60, 86, icp_read_config_byte(ADR_SEC5), 3, DRAW_PUT); + draw_string(0, 95, "SEC6", 3, DRAW_PUT); + draw_hexC (60, 95, icp_read_config_byte(ADR_SEC6), 3, DRAW_PUT); + draw_string(0, 104, "SEC7", 3, DRAW_PUT); + draw_hexC (60, 104, icp_read_config_byte(ADR_SEC7), 3, DRAW_PUT); + draw_string(0, 113, "MFGID", 3, DRAW_PUT); + draw_hexC (60, 113, icp_read_config_byte(ADR_MFGID), 3, DRAW_PUT); + draw_string(0, 122, "ID1", 3, DRAW_PUT); + draw_hexC (60, 122, icp_read_config_byte(ADR_ID1), 3, DRAW_PUT); + draw_string(0, 131, "ID2", 3, DRAW_PUT); + draw_hexC (60, 131, icp_read_config_byte(ADR_ID2), 3, DRAW_PUT); + } + + if (KEY_2) + { /* erase sectors and program image */ + draw_string(0, 20, "Loesche", 3, DRAW_PUT); + + /* only erase first 7 sectors, not all! */ + for (i=0; i<7; i++) + { + draw_block (0, 29, 128, 9, 3, DRAW_ERASE); + draw_string(0, 29, "Sektor", 3, DRAW_PUT); + draw_numU (40, 29, i, 0, 3, DRAW_PUT); + err = icp_erase_sector(i*SECTOR_SIZE); + if (err) break; + } + + if (!err) + { + lcd_fill(0); + draw_string(0, 20, "Programmiere", 3, DRAW_PUT); + } + + offs = 0; + addr = scart_image_startaddr; + while (!err && (offs < sizeof(scart_image))) + { + blklen = (addr | (PAGE_SIZE-1)) + 1 - addr; + if ((sizeof(scart_image) - offs) < blklen) + { + blklen = sizeof(scart_image) - offs; + } + + draw_block(0, 29, 128, 9, 3, DRAW_ERASE); + draw_hexS (0, 29, addr, 3, DRAW_PUT); + + icp_load_page_register(addr, &scart_image[offs], blklen); + err = icp_prog_page_register(addr); + + addr += blklen; + offs += blklen; + } + + if (!err) + { + draw_block(0, 29, 128, 9, 3, DRAW_ERASE); + draw_string(0, 29, "BootVector", 3, DRAW_PUT); + err = icp_write_config_byte(ADR_BootVector, scart_bootvec); + } + if (!err) + { + draw_block(0, 29, 128, 9, 3, DRAW_ERASE); + draw_string(0, 29, "StatusByte", 3, DRAW_PUT); + err = icp_write_config_byte(ADR_StatusByte, scart_bootstat); + } + if (err) + { + draw_string(0, 40, "Fehler", 3, DRAW_PUT); + draw_hexC (40, 40, err, 3, DRAW_PUT); + } + else + { + draw_string(0, 40, "OK", 3, DRAW_PUT); + } + } + + if (KEY_3) + { /* compare CRC of all programmed sectors */ + draw_string(0, 20, "Vergleiche", 3, DRAW_PUT); + err = 0; + crc_sc = 0; + offs = 0; + addr = scart_image_startaddr; + while (!err && (offs < sizeof(scart_image))) + { + blklen = (addr | (SECTOR_SIZE-1)) + 1 - addr; + if ((sizeof(scart_image) - offs) < blklen) + { + blklen = sizeof(scart_image) - offs; + } + + draw_block (0, 29, 128, 9, 3, DRAW_ERASE); + draw_string(0, 29, "Sektor @", 3, DRAW_PUT); + draw_hexS (44, 29, addr, 3, DRAW_PUT); + + /* calculate CRC from scart */ + err = icp_calc_sector_crc(addr, &crc_sc); + + /* calculate CRC from image */ + poly = 0x00400007; + crc_im = tap = 0; + for (i=0; i. +*/ + + +#ifndef SCART_ICP +#define SCART_ICP + +extern void scart_icp(void); + +#endif diff --git a/boop/trunk/tools/scart_image.h b/boop/trunk/tools/scart_image.h new file mode 100644 index 0000000..52887f1 --- /dev/null +++ b/boop/trunk/tools/scart_image.h @@ -0,0 +1,27 @@ +/* + 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 3 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 . +*/ + +/* bootstat register */ +const unsigned char scart_bootstat = 0x01; + +/* bootvec register, high byte of the reset vector */ +const unsigned char scart_bootvec = 0x00; + +/* address of the first byte of scart_image to program to */ +const unsigned short scart_image_startaddr = 0x0000; + +/* from betty_scart.bin SVN #14 */ +/* truncated to a size of 0x1C00 = 7168 to preserve the content of the last flash sector */ +#include "scart_image_data.h" diff --git a/boop/trunk/tools/scart_image_data.h b/boop/trunk/tools/scart_image_data.h new file mode 100644 index 0000000..514f01c --- /dev/null +++ b/boop/trunk/tools/scart_image_data.h @@ -0,0 +1,484 @@ +// Array representation of binary file betty_scart.bin + + +const unsigned char scart_image[] = +{ + 0x02,0x00,0x73,0x32,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x32,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0x32,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x32,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0x02,0x03,0xf7,0xff,0xff,0xff,0xff,0xff,0x32,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0x32,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x02, + 0x09,0x90,0xff,0xff,0xff,0xff,0xff,0x32,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0x32,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x32,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0x32,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x32,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0x02,0x04,0x46,0x12,0x00,0xdb,0x80,0xfe,0x75,0x81,0xac,0x12,0x0d, + 0x0e,0xe5,0x82,0x60,0x03,0x02,0x00,0x6e,0x79,0x00,0xe9,0x44,0x00,0x60,0x1b, + 0x7a,0x00,0x90,0x0d,0xd3,0x78,0x00,0x75,0xa0,0x00,0xe4,0x93,0xf2,0xa3,0x08, + 0xb8,0x00,0x02,0x05,0xa0,0xd9,0xf4,0xda,0xf2,0x75,0xa0,0xff,0xe4,0x78,0xff, + 0xf6,0xd8,0xfd,0x78,0x00,0xe8,0x44,0x00,0x60,0x0a,0x79,0x00,0x75,0xa0,0x00, + 0xe4,0xf3,0x09,0xd8,0xfc,0x78,0x00,0xe8,0x44,0x00,0x60,0x0c,0x79,0x00,0x90, + 0x00,0x00,0xe4,0xf0,0xa3,0xd8,0xfc,0xd9,0xfa,0x75,0x08,0x00,0x75,0x09,0x00, + 0x75,0x22,0x00,0x75,0x23,0x05,0x02,0x00,0x6e,0x53,0x84,0x6c,0x43,0x85,0x92, + 0x75,0x80,0x83,0x53,0x91,0x3e,0x43,0x92,0xcd,0x75,0x90,0xcd,0x53,0xb1,0xfe, + 0x43,0xb2,0x01,0x75,0xb0,0x00,0x12,0x0c,0xd3,0x12,0x03,0x12,0x12,0x09,0x77, + 0x12,0x09,0x84,0xd2,0xaf,0x90,0x0d,0x12,0x75,0xf0,0x80,0x12,0x03,0x2c,0x90, + 0x0d,0x15,0x75,0xf0,0x80,0x12,0x03,0x2c,0x90,0x0d,0x12,0x75,0xf0,0x80,0x12, + 0x03,0x2c,0xd2,0x00,0x7a,0x00,0x30,0x01,0x2b,0x74,0xc6,0x25,0x09,0x50,0x0f, + 0x85,0x22,0x28,0x75,0x82,0x3a,0xc0,0x02,0x12,0x07,0x2e,0xd0,0x02,0x80,0xe8, + 0xe5,0x09,0x60,0xe4,0x30,0x8d,0xe1,0x85,0x22,0x28,0x85,0x09,0x82,0xc0,0x02, + 0x12,0x07,0x2e,0xd0,0x02,0x80,0xd2,0x20,0x00,0x03,0x02,0x02,0x63,0xc3,0xea, + 0x95,0x09,0x50,0xc6,0x8a,0x82,0x0a,0xc0,0x02,0x12,0x04,0xe1,0xab,0x82,0xd0, + 0x02,0xbb,0x0d,0x02,0x80,0x03,0x02,0x02,0x57,0x90,0x0d,0x12,0x75,0xf0,0x80, + 0xc0,0x02,0x12,0x03,0x2c,0xd0,0x02,0xea,0x25,0x08,0x14,0x54,0x3f,0x24,0x2d, + 0xf8,0x76,0x00,0xc0,0x02,0x12,0x04,0x92,0xab,0x82,0xd0,0x02,0xda,0x03,0x02, + 0x02,0x36,0xbb,0x62,0x02,0x80,0x62,0xbb,0x63,0x02,0x80,0x54,0xbb,0x72,0x02, + 0x80,0x29,0xbb,0x73,0x02,0x80,0x41,0xbb,0x74,0x02,0x80,0x05,0xbb,0x77,0x65, + 0x80,0x57,0xe5,0x09,0x60,0x6c,0x8a,0x82,0x12,0x06,0xb8,0x7a,0x00,0x90,0x0d, + 0x12,0x75,0xf0,0x80,0xc0,0x02,0x12,0x03,0x2c,0xd0,0x02,0x80,0x56,0xe5,0x09, + 0x60,0x52,0x75,0x28,0x00,0x8a,0x82,0x12,0x07,0x2e,0x7a,0x00,0x90,0x0d,0x1b, + 0x75,0xf0,0x80,0xc0,0x02,0x12,0x03,0x2c,0xd0,0x02,0x80,0x39,0xc0,0x02,0x12, + 0x08,0x9d,0xd0,0x02,0x80,0x30,0xc0,0x02,0x12,0x07,0xd1,0xd0,0x02,0x80,0x27, + 0xc2,0x00,0x75,0x82,0x01,0xc0,0x02,0x12,0x03,0xad,0xd0,0x02,0x80,0x19,0x75, + 0x82,0x00,0xc0,0x02,0x12,0x0c,0x55,0xd0,0x02,0x80,0x0d,0x90,0x0d,0x23,0x75, + 0xf0,0x80,0xc0,0x02,0x12,0x03,0x2c,0xd0,0x02,0x8a,0x04,0xec,0x60,0x1b,0xc0, + 0x04,0x12,0x04,0x92,0xd0,0x04,0x1c,0x8c,0x02,0x80,0xf1,0x90,0x0d,0x15,0x75, + 0xf0,0x80,0xc0,0x02,0x12,0x03,0x2c,0xd0,0x02,0x80,0x02,0x8c,0x02,0x90,0x0d, + 0x12,0x75,0xf0,0x80,0xc0,0x02,0x12,0x03,0x2c,0xd0,0x02,0x02,0x01,0x23,0x8b, + 0x82,0xc0,0x02,0x12,0x03,0xad,0xd0,0x02,0x02,0x01,0x23,0xe5,0x09,0x70,0x03, + 0x02,0x01,0x23,0xc0,0x02,0x12,0x04,0x92,0xab,0x82,0xd0,0x02,0xeb,0x24,0xf8, + 0x40,0x60,0xeb,0x2b,0x2b,0x90,0x02,0x7f,0x73,0x02,0x02,0x97,0x02,0x02,0x99, + 0x02,0x02,0xa2,0x02,0x02,0xab,0x02,0x02,0xb4,0x02,0x02,0xbd,0x02,0x02,0xc6, + 0x02,0x02,0xcf,0x80,0x49,0xc0,0x02,0x12,0x07,0x7d,0xd0,0x02,0x80,0x40,0xc0, + 0x02,0x12,0x09,0x68,0xd0,0x02,0x80,0x37,0xc0,0x02,0x12,0x08,0xc1,0xd0,0x02, + 0x80,0x2e,0xc0,0x02,0x12,0x08,0xdb,0xd0,0x02,0x80,0x25,0xc0,0x02,0x12,0x08, + 0xf5,0xd0,0x02,0x80,0x1c,0xc0,0x02,0x12,0x09,0x2d,0xd0,0x02,0x80,0x13,0xc0, + 0x02,0x12,0x09,0x71,0xd0,0x02,0x80,0x0a,0x75,0x82,0x00,0xc0,0x02,0x12,0x03, + 0xad,0xd0,0x02,0x30,0x00,0x03,0x02,0x01,0x23,0x75,0x82,0x01,0xc0,0x02,0x12, + 0x03,0xad,0xd0,0x02,0x02,0x01,0x23,0xe5,0x82,0x25,0x82,0x24,0x33,0xfa,0xe4, + 0x34,0x0d,0xfb,0x8a,0x82,0x8b,0x83,0xa3,0xe4,0x93,0xf5,0xbe,0x8a,0x82,0x8b, + 0x83,0xe4,0x93,0xf5,0xbf,0x22,0x75,0x98,0x52,0x43,0xba,0xa0,0x75,0x82,0x07, + 0x12,0x02,0xf5,0x75,0xbd,0x03,0xc2,0x98,0xd2,0xac,0xd2,0x99,0xd2,0xbc,0xd2, + 0xfe,0x22,0xaa,0x82,0xab,0x83,0xac,0xf0,0x7d,0x00,0xed,0x2a,0xfe,0xe4,0x3b, + 0xff,0x8c,0x00,0x8e,0x82,0x8f,0x83,0x88,0xf0,0x12,0x0c,0xf2,0x60,0x2b,0x8d, + 0x06,0x0d,0xee,0x2a,0xfe,0xe4,0x3b,0xff,0x8c,0x00,0x8e,0x82,0x8f,0x83,0x88, + 0xf0,0x12,0x0c,0xf2,0xf5,0x82,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0x12, + 0x03,0xad,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0x80,0xc2,0x22,0xaa,0x82, + 0xab,0x83,0xac,0xf0,0x7d,0x00,0xc3,0xed,0x95,0x0c,0x50,0x2b,0x8d,0x06,0x0d, + 0xee,0x2a,0xfe,0xe4,0x3b,0xff,0x8c,0x00,0x8e,0x82,0x8f,0x83,0x88,0xf0,0x12, + 0x0c,0xf2,0xf5,0x82,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0x12,0x03,0xad, + 0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0x80,0xcf,0x22,0xaa,0x82,0x8a,0x82, + 0xc0,0x02,0x12,0x05,0x06,0xe5,0x82,0xd0,0x02,0x70,0x04,0xd2,0xee,0x80,0xef, + 0xd2,0xee,0x22,0xe5,0x82,0xfa,0xc4,0x54,0x0f,0xfb,0x53,0x03,0x0f,0x74,0x30, + 0x2b,0xfb,0x24,0xc6,0x50,0x04,0x74,0x07,0x2b,0xfb,0x8b,0x82,0xc0,0x02,0x12, + 0x03,0xad,0xd0,0x02,0x74,0x0f,0x5a,0xfb,0x74,0x30,0x2b,0xfb,0x24,0xc6,0x50, + 0x04,0x74,0x07,0x2b,0xfb,0x8b,0x82,0x02,0x03,0xad,0xc0,0x21,0xc0,0xe0,0xc0, + 0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06, + 0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0,0x00,0x74,0xc0,0x25,0x09, + 0x40,0x06,0x85,0x99,0x82,0x12,0x04,0xef,0xc2,0x98,0xc2,0x8d,0x75,0x8c,0x00, + 0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0, + 0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0xd0,0x21,0x32,0xc0, + 0x21,0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04, + 0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0,0x00, + 0xe5,0x0b,0x60,0x0a,0x12,0x04,0xad,0x85,0x82,0x99,0xc2,0x99,0x80,0x02,0xc2, + 0xee,0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04, + 0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0xd0,0x21,0x32, + 0x7a,0x00,0xc2,0xaf,0xe5,0x09,0x60,0x0e,0x15,0x09,0xab,0x08,0x05,0x08,0x74, + 0x3f,0x5b,0x24,0x2d,0xf8,0x86,0x02,0xd2,0xaf,0x8a,0x82,0x22,0x7a,0x00,0xc2, + 0xaf,0xe5,0x0b,0x60,0x0e,0x15,0x0b,0xab,0x0a,0x05,0x0a,0x74,0x3f,0x5b,0x24, + 0x6d,0xf8,0x86,0x02,0xd2,0xaf,0x8a,0x82,0x22,0xe5,0x09,0x60,0xfc,0xc2,0xaf, + 0x15,0x09,0xaa,0x08,0x05,0x08,0x74,0x3f,0x5a,0x24,0x2d,0xf8,0x86,0x02,0xd2, + 0xaf,0x8a,0x82,0x22,0xe5,0x82,0x25,0x08,0x54,0x3f,0x24,0x2d,0xf8,0x86,0x02, + 0x8a,0x82,0x22,0xaa,0x82,0x74,0xc0,0x25,0x09,0x40,0x0e,0xab,0x09,0x05,0x09, + 0xeb,0x25,0x08,0x54,0x3f,0x24,0x2d,0xf8,0xa6,0x02,0x22,0xaa,0x82,0xc2,0xaf, + 0x74,0xc0,0x25,0x0b,0x40,0x14,0xab,0x0b,0x05,0x0b,0xeb,0x25,0x0a,0x54,0x3f, + 0x24,0x6d,0xf8,0xa6,0x02,0xd2,0xaf,0x75,0x82,0x01,0x22,0xd2,0xaf,0x75,0x82, + 0x00,0x22,0xaa,0x82,0x7b,0x08,0xeb,0x60,0x10,0xc2,0x97,0xea,0x33,0x92,0x96, + 0xd2,0x97,0xea,0xa2,0x95,0x3a,0xfa,0x1b,0x80,0xed,0xc2,0x97,0x8a,0x82,0x22, + 0x7a,0x00,0xc2,0x96,0xc2,0x97,0x7b,0x08,0xeb,0x60,0x0c,0xd2,0x97,0xea,0xa2, + 0x95,0x3a,0xfa,0xc2,0x97,0x1b,0x80,0xf1,0x8a,0x82,0x22,0xd2,0x97,0xc2,0x96, + 0xc2,0x81,0x7a,0xff,0xea,0x60,0x03,0x1a,0x80,0xfa,0xd2,0x81,0x7a,0xff,0xea, + 0x60,0x03,0x1a,0x80,0xfa,0xc2,0x81,0xc2,0x97,0x20,0x95,0xfd,0x75,0x82,0x30, + 0x12,0x05,0x2a,0x20,0x95,0xfd,0x75,0x82,0x40,0x12,0x05,0x2a,0x7a,0x00,0xba, + 0x2f,0x00,0x50,0x11,0xea,0x90,0x0d,0x47,0x93,0xf5,0x82,0xc0,0x02,0x12,0x05, + 0x2a,0xd0,0x02,0x0a,0x80,0xea,0xd2,0x81,0x75,0x11,0xc0,0x75,0x82,0x3e,0x12, + 0x06,0x07,0x75,0x82,0x36,0x12,0x06,0x90,0x75,0x82,0x33,0x12,0x06,0x90,0x75, + 0x82,0x3a,0x12,0x06,0x90,0x75,0x82,0x34,0x02,0x06,0x90,0xaa,0x82,0xc2,0x81, + 0x20,0x95,0xfd,0x8a,0x82,0x12,0x05,0x2a,0xaa,0x82,0x7b,0x00,0xc3,0xeb,0x95, + 0x10,0x50,0x23,0xeb,0x25,0x0d,0xfc,0xe4,0x35,0x0e,0xfd,0xae,0x0f,0x8c,0x82, + 0x8d,0x83,0x8e,0xf0,0x12,0x0c,0xf2,0xf5,0x82,0xc0,0x02,0xc0,0x03,0x12,0x05, + 0x2a,0xd0,0x03,0xd0,0x02,0x0b,0x80,0xd7,0xd2,0x81,0x8a,0x82,0x22,0xaa,0x82, + 0xc2,0x81,0x20,0x95,0xfd,0x8a,0x82,0x12,0x05,0x2a,0xaa,0x82,0x85,0x11,0x82, + 0xc0,0x02,0x12,0x05,0x2a,0xd0,0x02,0xd2,0x81,0x8a,0x82,0x22,0xaa,0x82,0xc2, + 0x81,0x20,0x95,0xfd,0x74,0x80,0x4a,0xf5,0x82,0x12,0x05,0x2a,0xaa,0x82,0x7b, + 0x00,0xac,0x15,0xec,0x60,0x37,0x8b,0x05,0x0b,0xed,0x25,0x12,0xfd,0xe4,0x35, + 0x13,0xfe,0xaf,0x14,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, + 0x07,0x12,0x05,0x46,0xa8,0x82,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0, + 0x03,0xd0,0x02,0x8d,0x82,0x8e,0x83,0x8f,0xf0,0xe8,0x12,0x0c,0xd9,0x1c,0x80, + 0xc6,0xd2,0x81,0x8a,0x82,0x22,0xaa,0x82,0xc2,0x81,0x20,0x95,0xfd,0x74,0x80, + 0x4a,0xf5,0x82,0x12,0x05,0x2a,0x75,0x82,0x00,0x12,0x05,0x2a,0xd2,0x81,0x22, + 0xaa,0x82,0xc2,0x81,0x20,0x95,0xfd,0x8a,0x82,0x12,0x05,0x2a,0xd2,0x81,0x22, + 0xaa,0x82,0x10,0x81,0x02,0x80,0x03,0x20,0x95,0xfd,0x8a,0x82,0x12,0x05,0x2a, + 0xaa,0x82,0x30,0x02,0x02,0xd2,0x81,0x8a,0x82,0x22,0xaa,0x82,0x75,0x82,0x00, + 0xc0,0x02,0x12,0x0c,0x55,0xc2,0xe9,0x75,0x82,0x36,0x12,0x06,0x90,0xd0,0x02, + 0x75,0x82,0xf5,0xc0,0x02,0x12,0x06,0x78,0xab,0x82,0xd0,0x02,0xbb,0x01,0xf1, + 0x74,0x03,0x2a,0xf5,0x24,0x75,0x25,0x00,0x85,0x16,0x26,0x75,0x27,0x01,0x75, + 0x0d,0x24,0x75,0x0e,0x00,0x75,0x0f,0x40,0x75,0x10,0x04,0x75,0x82,0x7f,0xc0, + 0x02,0x12,0x05,0xc9,0xc2,0x02,0x75,0x82,0x7f,0x12,0x06,0x9f,0xd0,0x02,0x8a, + 0x03,0x1a,0xeb,0x60,0x0e,0xc0,0x02,0x12,0x04,0x92,0xc2,0x02,0x12,0x06,0x9f, + 0xd0,0x02,0x80,0xec,0xd2,0x81,0x75,0x82,0x35,0x12,0x06,0x90,0xd2,0xe9,0x90, + 0x0d,0x79,0x75,0xf0,0x80,0x02,0x03,0x2c,0xaa,0x82,0x74,0x03,0x2a,0xf5,0x29, + 0x85,0x28,0x2a,0x85,0x16,0x2b,0x75,0x2c,0x05,0xc2,0xe9,0x75,0x0d,0x29,0x75, + 0x0e,0x00,0x75,0x0f,0x40,0x75,0x10,0x04,0x75,0x82,0x7f,0xc0,0x02,0x12,0x05, + 0xc9,0xc2,0x02,0x75,0x82,0x7f,0x12,0x06,0x9f,0xd0,0x02,0x8a,0x03,0x1a,0xeb, + 0x60,0x0e,0xc0,0x02,0x12,0x04,0x92,0xc2,0x02,0x12,0x06,0x9f,0xd0,0x02,0x80, + 0xec,0xd2,0x81,0x75,0x82,0x35,0x12,0x06,0x90,0xd2,0xe9,0x22,0xe5,0x09,0x60, + 0xfc,0x12,0x04,0x92,0xaa,0x82,0xba,0x3e,0x00,0x50,0x40,0xc2,0x02,0x75,0x82, + 0x7f,0xc0,0x02,0x12,0x06,0x9f,0xd0,0x02,0xc2,0x02,0x8a,0x82,0xc0,0x02,0x12, + 0x06,0x9f,0xd0,0x02,0x7b,0x00,0xc3,0xeb,0x9a,0x50,0x17,0xe5,0x09,0x60,0xfc, + 0xc0,0x02,0xc0,0x03,0x12,0x04,0x92,0xc2,0x02,0x12,0x06,0x9f,0xd0,0x03,0xd0, + 0x02,0x0b,0x80,0xe4,0xd2,0x81,0x75,0x82,0x35,0x12,0x06,0x90,0x02,0x0c,0x10, + 0x75,0x82,0x00,0x02,0x03,0xad,0xc2,0x02,0x75,0x82,0xc0,0x12,0x06,0x9f,0x7a, + 0x00,0xba,0x2f,0x00,0x50,0x50,0x90,0x0d,0x81,0x75,0xf0,0x80,0xc0,0x02,0x12, + 0x03,0x2c,0xd0,0x02,0x8a,0x82,0xc0,0x02,0x12,0x03,0xc3,0x90,0x0d,0x88,0x75, + 0xf0,0x80,0x12,0x03,0x2c,0xc2,0x02,0x75,0x82,0x00,0x12,0x06,0x9f,0x12,0x03, + 0xc3,0xd0,0x02,0x74,0x03,0x5a,0xfb,0xbb,0x03,0x0f,0x90,0x0d,0x76,0x75,0xf0, + 0x80,0xc0,0x02,0x12,0x03,0x2c,0xd0,0x02,0x80,0x0d,0x90,0x0d,0x8e,0x75,0xf0, + 0x80,0xc0,0x02,0x12,0x03,0x2c,0xd0,0x02,0x0a,0x80,0xab,0xd2,0x81,0x90,0x0d, + 0x76,0x75,0xf0,0x80,0x12,0x03,0x2c,0xc2,0x02,0x75,0x82,0xfe,0x12,0x06,0x9f, + 0x7a,0x00,0xba,0x08,0x00,0x50,0x50,0x90,0x0d,0x92,0x75,0xf0,0x80,0xc0,0x02, + 0x12,0x03,0x2c,0xd0,0x02,0x8a,0x82,0xc0,0x02,0x12,0x03,0xc3,0x90,0x0d,0x9b, + 0x75,0xf0,0x80,0x12,0x03,0x2c,0xc2,0x02,0x75,0x82,0x00,0x12,0x06,0x9f,0x12, + 0x03,0xc3,0xd0,0x02,0x74,0x03,0x5a,0xfb,0xbb,0x03,0x0f,0x90,0x0d,0x76,0x75, + 0xf0,0x80,0xc0,0x02,0x12,0x03,0x2c,0xd0,0x02,0x80,0x0d,0x90,0x0d,0xa2,0x75, + 0xf0,0x80,0xc0,0x02,0x12,0x03,0x2c,0xd0,0x02,0x0a,0x80,0xab,0xd2,0x81,0x22, + 0x90,0x0d,0xa5,0x75,0xf0,0x80,0x12,0x03,0x2c,0x75,0x82,0xbd,0x12,0x06,0x90, + 0x12,0x03,0xc3,0x90,0x0d,0xba,0x75,0xf0,0x80,0x12,0x03,0x2c,0x75,0x82,0x3d, + 0x12,0x06,0x90,0x02,0x03,0xc3,0x12,0x04,0xc8,0xaa,0x82,0x74,0x80,0x4a,0xf5, + 0x82,0xc2,0x02,0x12,0x06,0x9f,0xd2,0x02,0x75,0x82,0x00,0x12,0x06,0x9f,0x02, + 0x03,0xad,0x12,0x04,0xc8,0xaa,0x82,0xc2,0x02,0x8a,0x82,0x12,0x06,0x9f,0x30, + 0x98,0xfd,0xaa,0x99,0xc2,0x98,0xd2,0x02,0x8a,0x82,0x02,0x06,0x9f,0x12,0x04, + 0xc8,0xaa,0x82,0xc0,0x02,0x12,0x04,0xc8,0xab,0x82,0x74,0xc0,0x4b,0xf5,0x82, + 0xc2,0x02,0x12,0x06,0x9f,0xd0,0x02,0x7c,0x00,0xc3,0xec,0x9a,0x50,0x16,0xc2, + 0x02,0x75,0x82,0x00,0xc0,0x02,0xc0,0x04,0x12,0x06,0x9f,0x12,0x03,0xad,0xd0, + 0x04,0xd0,0x02,0x0c,0x80,0xe5,0xd2,0x81,0x22,0x12,0x04,0xc8,0xaa,0x82,0xc0, + 0x02,0x12,0x04,0xc8,0xab,0x82,0x74,0x40,0x4b,0xf5,0x82,0xc2,0x02,0x12,0x06, + 0x9f,0xd0,0x02,0x7c,0x00,0xc3,0xec,0x9a,0x50,0x19,0x30,0x98,0xfd,0xab,0x99, + 0xc2,0x98,0xc2,0x02,0x8b,0x82,0xc0,0x02,0xc0,0x04,0x12,0x06,0x9f,0xd0,0x04, + 0xd0,0x02,0x0c,0x80,0xe2,0xd2,0x81,0x22,0x12,0x04,0xc8,0x12,0x06,0x90,0x02, + 0x03,0xad,0x12,0x04,0xc8,0x02,0x0c,0x55,0x12,0x05,0x60,0xc2,0x03,0x90,0x0d, + 0x50,0xe4,0x93,0xf5,0x16,0x22,0x75,0x93,0x40,0x75,0x86,0x40,0x75,0x94,0x02, + 0xd2,0xe9,0x22,0xc0,0x21,0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02, + 0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0, + 0xd0,0x75,0xd0,0x00,0xe5,0x93,0x30,0xe6,0x09,0x75,0x93,0x00,0x75,0x94,0x02, + 0x02,0x0b,0xf3,0x75,0x82,0xfb,0x12,0x06,0x78,0xe5,0x82,0xf5,0x17,0xfa,0x70, + 0x03,0x02,0x0b,0xbd,0xc2,0x04,0xea,0x24,0xfc,0x50,0x14,0x75,0x12,0x17,0x75, + 0x13,0x00,0x75,0x14,0x40,0x75,0x15,0x04,0x75,0x82,0xff,0x12,0x06,0x24,0x80, + 0x11,0x75,0x12,0x17,0x75,0x13,0x00,0x75,0x14,0x40,0x8a,0x15,0x75,0x82,0xff, + 0x12,0x06,0x24,0xe5,0x17,0x24,0xfc,0x40,0x03,0x02,0x0b,0x93,0x20,0x00,0x06, + 0x20,0x01,0x03,0x02,0x0b,0x5d,0xc2,0x05,0xaa,0x1a,0xba,0x02,0x02,0x80,0x0d, + 0xba,0x05,0x02,0x80,0x45,0xba,0x06,0x02,0x80,0x67,0x02,0x0b,0x13,0x75,0x82, + 0xff,0x12,0x06,0x78,0xaa,0x82,0xba,0x01,0x02,0x80,0x03,0x02,0x0b,0x93,0x75, + 0x17,0x04,0xaa,0x19,0x8a,0x18,0x85,0x16,0x19,0x75,0x1a,0x02,0x75,0x0d,0x17, + 0x75,0x0e,0x00,0x75,0x0f,0x40,0x75,0x10,0x04,0x75,0x82,0x7f,0x12,0x05,0xc9, + 0x75,0x11,0x02,0x75,0x82,0x7f,0x12,0x06,0x07,0xd2,0x04,0x02,0x0b,0x93,0xc2, + 0x02,0x75,0x82,0xff,0x12,0x06,0x9f,0x7a,0x03,0xc3,0xea,0x95,0x17,0x50,0x12, + 0xc2,0x02,0x75,0x82,0x00,0xc0,0x02,0x12,0x06,0x9f,0x12,0x03,0xad,0xd0,0x02, + 0x0a,0x80,0xe8,0xd2,0x81,0x02,0x0b,0x93,0x75,0x82,0xff,0x12,0x06,0x78,0xe5, + 0x82,0xfa,0x24,0xfb,0x40,0x4e,0xea,0x2a,0x2a,0x90,0x0a,0x99,0x73,0x02,0x0a, + 0xa8,0x02,0x0a,0xaa,0x02,0x0a,0xc3,0x02,0x0a,0xd2,0x02,0x0a,0xde,0x80,0x36, + 0xe5,0x17,0x24,0xfb,0x50,0x30,0x75,0x82,0xff,0x12,0x06,0x78,0xe5,0x82,0xfa, + 0x24,0xf6,0x40,0x02,0x8a,0x23,0xd2,0x05,0x80,0x1d,0x85,0x19,0x22,0x85,0x23, + 0x82,0x12,0x02,0xf5,0xd2,0x01,0xd2,0x05,0x80,0x0e,0xc2,0x01,0x75,0x82,0x07, + 0x12,0x02,0xf5,0xd2,0x05,0x80,0x02,0xd2,0x05,0x20,0x05,0x03,0x02,0x0b,0x93, + 0x75,0x17,0x04,0xaa,0x19,0x8a,0x18,0x85,0x16,0x19,0x75,0x1a,0x06,0x75,0x0d, + 0x17,0x75,0x0e,0x00,0x75,0x0f,0x40,0x75,0x10,0x04,0x75,0x82,0x7f,0x12,0x05, + 0xc9,0x75,0x11,0x00,0x75,0x82,0x7f,0x12,0x06,0x07,0xd2,0x04,0x02,0x0b,0x93, + 0xe5,0x17,0x24,0xfc,0x50,0x7a,0x30,0x00,0x77,0x90,0x0d,0xcb,0x75,0xf0,0x80, + 0x12,0x03,0x2c,0x90,0x0d,0xce,0x75,0xf0,0x80,0x12,0x03,0x2c,0xc2,0x02,0x75, + 0x82,0xff,0x12,0x06,0x9f,0x7a,0x03,0xc3,0xea,0x95,0x17,0x50,0x12,0xc2,0x02, + 0x75,0x82,0x00,0xc0,0x02,0x12,0x06,0x9f,0x12,0x03,0xad,0xd0,0x02,0x0a,0x80, + 0xe8,0xd2,0x81,0x90,0x0d,0xcb,0x75,0xf0,0x80,0x12,0x03,0x2c,0x80,0x36,0x75, + 0x82,0x02,0x12,0x03,0xad,0x75,0x0c,0x04,0x90,0x00,0x17,0x75,0xf0,0x40,0x12, + 0x03,0x73,0xc2,0x02,0x75,0x82,0xff,0x12,0x06,0x9f,0x7a,0x03,0xc3,0xea,0x95, + 0x17,0x50,0x12,0xc2,0x02,0x75,0x82,0x00,0xc0,0x02,0x12,0x06,0x9f,0x12,0x03, + 0xad,0xd0,0x02,0x0a,0x80,0xe8,0xd2,0x81,0x75,0x82,0x36,0x12,0x06,0x90,0x75, + 0x82,0xf5,0x12,0x06,0x78,0xaa,0x82,0xba,0x01,0xf5,0x75,0x82,0x3a,0x12,0x06, + 0x90,0x30,0x04,0x08,0x75,0x82,0x35,0x12,0x06,0x90,0x80,0x38,0x75,0x82,0x34, + 0x12,0x06,0x90,0x80,0x30,0x75,0x82,0xf5,0x12,0x06,0x78,0xaa,0x82,0xba,0x0d, + 0x02,0x80,0x23,0x75,0x82,0x36,0x12,0x06,0x90,0x75,0x82,0xf5,0x12,0x06,0x78, + 0xaa,0x82,0xba,0x01,0xf5,0x75,0x82,0x3a,0x12,0x06,0x90,0x75,0x82,0x3b,0x12, + 0x06,0x90,0x75,0x82,0x34,0x12,0x06,0x90,0x75,0x93,0x40,0x75,0x94,0x02,0xd0, + 0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03, + 0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0xd0,0x21,0x32,0x7a,0x01, + 0xea,0x60,0x3f,0x75,0x82,0x3d,0xc0,0x02,0x12,0x06,0x90,0xe5,0x82,0xd0,0x02, + 0x54,0xf0,0xfb,0x60,0x21,0xbb,0x10,0x02,0x80,0x0f,0xbb,0x70,0xe4,0x75,0x82, + 0x3b,0xc0,0x02,0x12,0x06,0x90,0xd0,0x02,0x80,0xd8,0x30,0x03,0x06,0x75,0x82, + 0x36,0x12,0x06,0x90,0x7a,0x00,0x80,0xcb,0x20,0x03,0x06,0x75,0x82,0x34,0x12, + 0x06,0x90,0x7a,0x00,0x80,0xbe,0x22,0xaa,0x82,0x75,0x1b,0x01,0x8a,0x1c,0xc2, + 0xe9,0xd2,0x03,0x90,0x0d,0x5f,0xe4,0x93,0xfa,0x74,0xcf,0x5a,0xf5,0x11,0x75, + 0x82,0x18,0x12,0x06,0x07,0x75,0x82,0x36,0x12,0x06,0x90,0x75,0x82,0x33,0x12, + 0x06,0x90,0x12,0x0c,0x10,0x7a,0x00,0x7b,0x00,0x8a,0x04,0x8b,0x05,0x0a,0xba, + 0x00,0x01,0x0b,0xc3,0xec,0x94,0xfa,0xed,0x94,0x00,0x50,0x25,0x75,0x0d,0x1b, + 0x75,0x0e,0x00,0x75,0x0f,0x40,0x75,0x10,0x02,0x75,0x82,0x7f,0xc0,0x02,0xc0, + 0x03,0x12,0x05,0xc9,0x75,0x82,0x35,0x12,0x06,0x90,0x12,0x0c,0x10,0xd0,0x03, + 0xd0,0x02,0x80,0xc9,0x90,0x0d,0x5f,0xe4,0x93,0xf5,0x11,0x75,0x82,0x18,0x12, + 0x06,0x07,0xc2,0x03,0x12,0x0c,0x10,0x75,0x94,0x02,0xd2,0xe9,0x22,0x43,0x89, + 0x01,0xd2,0x8c,0x22,0x20,0xf7,0x10,0x30,0xf6,0x11,0x88,0x83,0xa8,0x82,0x20, + 0xf5,0x07,0xf6,0xa8,0x83,0x75,0x83,0x00,0x22,0xf2,0x80,0xf7,0xf0,0x22,0x20, + 0xf7,0x14,0x30,0xf6,0x14,0x88,0x83,0xa8,0x82,0x20,0xf5,0x07,0xe6,0xa8,0x83, + 0x75,0x83,0x00,0x22,0xe2,0x80,0xf7,0xe4,0x93,0x22,0xe0,0x22,0x75,0x82,0x00, + 0x22,0x0d,0x0a,0x00,0x52,0x65,0x61,0x64,0x79,0x00,0x54,0x58,0x20,0x44,0x6f, + 0x6e,0x65,0x00,0x53,0x79,0x6e,0x74,0x61,0x78,0x20,0x65,0x72,0x72,0x6f,0x72, + 0x00,0x0d,0x0a,0x00,0x2d,0x1b,0x16,0x85,0x0b,0x3b,0x05,0x95,0x03,0xb4,0x02, + 0xc3,0x01,0xd2,0x01,0x59,0x00,0xe1,0x00,0x68,0x29,0x2e,0x06,0x47,0xd3,0x91, + 0x3e,0x1a,0x45,0x01,0x01,0x06,0x00,0x10,0x0b,0xda,0x8a,0x75,0x13,0x22,0xc1, + 0x35,0x07,0x03,0x38,0x16,0x6c,0x43,0x40,0x91,0x46,0x50,0x78,0x56,0x10,0xa9, + 0x0a,0x00,0x11,0x41,0x00,0x57,0x7f,0x3f,0x98,0x31,0x0b,0x0d,0x0a,0x00,0x54, + 0x58,0x20,0x44,0x6f,0x6e,0x65,0x00,0x52,0x65,0x67,0x20,0x30,0x78,0x00,0x20, + 0x3d,0x20,0x30,0x78,0x00,0x20,0x20,0x20,0x00,0x50,0x41,0x54,0x41,0x42,0x4c, + 0x45,0x5b,0x00,0x5d,0x20,0x3d,0x20,0x30,0x78,0x00,0x20,0x20,0x00,0x43,0x43, + 0x31,0x31,0x30,0x30,0x20,0x52,0x65,0x61,0x64,0x20,0x53,0x74,0x61,0x74,0x75, + 0x73,0x3a,0x20,0x00,0x20,0x20,0x57,0x72,0x69,0x74,0x65,0x20,0x53,0x74,0x61, + 0x74,0x75,0x73,0x3a,0x20,0x00,0x0d,0x0a,0x00,0x52,0x58,0x3a,0x20,0x00,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +}; diff --git a/boop/trunk/tools/toolsmenu.c b/boop/trunk/tools/toolsmenu.c new file mode 100644 index 0000000..d2b3173 --- /dev/null +++ b/boop/trunk/tools/toolsmenu.c @@ -0,0 +1,34 @@ +/* + 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 3 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 "global.h" +#include "menu.h" +#include "scart_icp.h" +#include "redirector.h" +#include "fs20.h" + +const struct MENU_ENTRY toolsMenuEntries[] = +{ + { scart_icp, 0, FUNCENTRY, "Scart ICP", "Program the SCART unit" }, // tools/scarticp.c +#if FF_UART_REDIRECT + { uarto_redirector, 0, FUNCENTRY, "Redirector", "Serial redirector" }, // serial/redirector.c +#endif + { fs20_decoder, 0, FUNCENTRY, "FS20 decoder", "FS20 decoder" } // cc1100/fs20.c + +}; + +const struct MENU toolsMenu = +{ + NUM_OF_ELEMENTS (toolsMenuEntries), (MENU_ENTRY*)&toolsMenuEntries, "Tools" +}; diff --git a/boop/trunk/tools/toolsmenu.h b/boop/trunk/tools/toolsmenu.h new file mode 100644 index 0000000..4411339 --- /dev/null +++ b/boop/trunk/tools/toolsmenu.h @@ -0,0 +1,21 @@ +/* + 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 3 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 TOOLSMENU_H +#define TOOLSMENU_H + +extern const struct MENU toolsMenu; + +#endif diff --git a/lpctool/testing/ChangeLog b/lpctool/testing/ChangeLog new file mode 100644 index 0000000..5513d9d --- /dev/null +++ b/lpctool/testing/ChangeLog @@ -0,0 +1,8 @@ +2007-10-05 Simon Budig + + toolcom.c: added info line for flash erase. + +2007-10-05 Ch. Klippel + + */* initial import into SVN + diff --git a/lpctool/testing/Makefile b/lpctool/testing/Makefile new file mode 100644 index 0000000..df2849b --- /dev/null +++ b/lpctool/testing/Makefile @@ -0,0 +1,41 @@ +############################################################### +##### +##### Makefile for ramtool and lpctool +##### +############################################################### + +include Makefile.inc + +all: lpctool + +tool_data.h: force_look + cd flashtool; $(MAKE) $(MFLAGS) + +lpctool: tool_data.h + gcc -Os infohelper.c lpctool_serial.c bootcom.c toolcom.c lpctool.c -o lpctool + strip lpctool + +upload: lpctool + ./lpctool -i -v + +resident: romtool.bin lpctool + ./lpctool -S -i -a romtool.bin -v + +uresident: romtool.bin lpctool + ./lpctool -d /dev/ttyUSB0 -S -i -a romtool.bin -v + +install: lpctool + cp lpctool $(INSTALLDIR_BIN) + +uninstall: + rm $(INSTALLDIR_BIN)/lpctool + +clean: + $(RM) *.o *~ lpctool tool_data.h + cd flashtool; make clean + +force_look : + true + + +### EOF diff --git a/lpctool/testing/Makefile.inc b/lpctool/testing/Makefile.inc new file mode 100644 index 0000000..c0266bf --- /dev/null +++ b/lpctool/testing/Makefile.inc @@ -0,0 +1,37 @@ + +############################################################### +##### +##### PATHS (default installation) +##### +############################################################### + +ARMBASE=/opt/armtool/4.1.1 +INCLUDEPATH=$(ARMBASE)/include +LIBPATH=$(ARMBASE)/arm-elf/lib/interwork +ARMPATH=$(ARMBASE)/bin +TOOLPREFIX=/arm-elf- + +INSTALLDIR_BIN=/usr/local/bin + +-include Makefile.local + +############################################################### +##### +##### Compiler, Linker and Tools +##### +############################################################### + +CC=$(ARMPATH)$(TOOLPREFIX)gcc +AS=$(ARMPATH)$(TOOLPREFIX)as +LD=$(ARMPATH)$(TOOLPREFIX)ld +OC=$(ARMPATH)$(TOOLPREFIX)objcopy +OD=$(ARMPATH)$(TOOLPREFIX)objdump + +CPUFLAGS=-mcpu=arm7tdmi-s +OPTFLAGS=-Os +#OPTFLAGS=-O0 +#OPTFLAGS= +CFLAGS=$(CPUFLAGS) -c -Wall -mthumb-interwork -msoft-float -I$(INCLUDEPATH) +ASFLAGS=$(CPUFLAGS) -D --gstabs -mthumb-interwork -mfpu=softfpa +LDFLAGS=$(OPTFLAGS) -Tlpc2220.ld +ROMLDFLAGS=$(OPTFLAGS) -Tlpc2220_rom.ld diff --git a/lpctool/testing/Makefile.local.WinARM b/lpctool/testing/Makefile.local.WinARM new file mode 100644 index 0000000..4454656 --- /dev/null +++ b/lpctool/testing/Makefile.local.WinARM @@ -0,0 +1,25 @@ +############################################################### +##### +##### Makefile.local.WinARM for boop +##### Created in the early morninghours +##### +##### Makefile.local.WinARM V1.0 by alterego - alteregon@gmx.net +##### +############################################################### + +############################################################### +##### +##### PATHS (default installation) +##### +##### You can put your path-config into Makefile.local +##### to override these defaults +##### +############################################################### + +ARMBASE=c:/WinARM/ +INCLUDEPATH=$(ARMBASE)/include +LIBPATH=$(ARMBASE)/arm-elf/lib/interwork +ARMPATH=$(ARMBASE)/bin +TOOLPREFIX=/arm-elf- + +######################## EOF ################################## diff --git a/lpctool/testing/Makefile.local.linuxARM b/lpctool/testing/Makefile.local.linuxARM new file mode 100644 index 0000000..3fccf37 --- /dev/null +++ b/lpctool/testing/Makefile.local.linuxARM @@ -0,0 +1,25 @@ +############################################################### +##### +##### Makefile.local.linuxARM for boop +##### Created in the early morninghours +##### +##### Makefile.local.linuxARM +##### +############################################################### + +############################################################### +##### +##### PATHS (default installation) +##### +##### You can put your path-config into Makefile.local +##### to override these defaults +##### +############################################################### + +ARMBASE=/opt/arm-elf +INCLUDEPATH=$(ARMBASE)/include +LIBPATH=$(ARMBASE)/lib/gcc/arm-elf/4.1.1/interwork +ARMPATH=$(ARMBASE)/bin +TOOLPREFIX=/arm-elf- + +######################## EOF ################################## diff --git a/lpctool/testing/baudrate.h b/lpctool/testing/baudrate.h new file mode 100644 index 0000000..a0843ec --- /dev/null +++ b/lpctool/testing/baudrate.h @@ -0,0 +1,9 @@ + +// serial baudrate +// this is the baudrate at which lpctool communicates with flashtool + +//~#define TOOLBAUD 115200UL +#define TOOLBAUD 38400UL // use this if problems occur + // USB-UART bridges like FT232 or PL2303 + // have glitches on the handshake lines + // when the baudrate is changed. diff --git a/lpctool/testing/bootcom.c b/lpctool/testing/bootcom.c new file mode 100644 index 0000000..d7a9926 --- /dev/null +++ b/lpctool/testing/bootcom.c @@ -0,0 +1,308 @@ +#include "infohelper.h" +#include "lpctool_serial.h" +#include "bootcom.h" +#include "tool_data.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +unsigned int uuencode(unsigned char *ibuf, unsigned char *obuf, int len) +{ + unsigned int slen, r,s; + unsigned char q; + slen = len; + + r = 0; + s = 0; + + while(slen >= 45) + { + + obuf[r++]=77; + for(q=0;q<45;q+=3) + { + + obuf[r++]=0x20+(( ibuf[s]>>2)&0x3f); + obuf[r++]=0x20+(((ibuf[s]<<4) | (ibuf[s+1]>>4))&0x3f); + s++; + obuf[r++]=0x20+(((ibuf[s]<<2)|(ibuf[s+1]>>6))&0x3f); + s++; + obuf[r++]=0x20+( ibuf[s++]&0x3f); + } + obuf[r++] = '\r'; + obuf[r++] = '\n'; + slen -= 45; + } + + if(slen) + { + obuf[r++]=0x20+slen; + for(q=0;q>2)&0x3f); + obuf[r++]=0x20+(((ibuf[s]<<4) | (ibuf[s+1]>>4))&0x3f); + s++; + obuf[r++]=0x20+(((ibuf[s]<<2)|(ibuf[s+1]>>6))&0x3f); + s++; + obuf[r++]=0x20+( ibuf[s++]&0x3f); + } + obuf[r++] = '\r'; + obuf[r++] = '\n'; + } + + return r; +} + +void printBuf(unsigned char len, unsigned char *buf) +{ + unsigned char cnt; + cnt = 0; + while(len--) + printf("%c",buf[cnt++]); +} + +int getOK(unsigned char oktype) +{ + char buf[4]; + unsigned char q; + + switch(oktype) + { + case OK_LIT: + q = getBuf(4, buf); + if(strncmp(buf, "OK\r\n", 4)) + { + return printError("wrong response, expected OK"); + } + return 1; + break; + + case OK_0: + q = getBuf(3, buf); + if(strncmp(buf, "0", 1)) + { + return printError("wrong response, expected 0"); + } + return 1; + break; + } +} + +int openBootLoader(unsigned int cfreq) +{ + char buf[20]; + unsigned char q; + + printInfoS(2,"initiating auto-baud",0); + tcflush(serialDev, TCIOFLUSH); + sendBuf(sprintf(buf, "?\r\n"), buf); + + printInfoS(2,"awaiting autobaud response",0); + + q = getBuf(14, buf); + + if(strncmp(buf, "Synchronized\r\n", 14)) + { + return printError("autobaud detection failed"); + } + + printInfoS(2,"got response, answering",0); + + q = sendBufE(q, buf); + + if(!getOK(OK_LIT)) + { + return printError("cant synchronize bootloader"); + } + + printInfoS(2,"setting frequency",0); + + sendBufE(sprintf(buf, "%i\r\n", cfreq), buf); + + if(!getOK(OK_LIT)) + { + return printError("cant set frequency"); + } + + printInfoS(2,"switching baudrate",0); + + sendBufE(sprintf(buf, "B 38400 1\r\n"), buf); + + if(!getOK(OK_0)) + { + return printError("cant set baudrate"); + } + + reconfSerial(38400, 1, 10); + + printInfoS(2,"disabling echo",0); + + sendBufE(sprintf(buf, "A 0\r\n"), buf); + + if(!getOK(OK_0)) + { + return printError("cant disable echo"); + } + return 1; +} + +int unlockBootLoader(void) +{ + char buf[20]; + + sendBuf(sprintf(buf, "U 23130\r\n"), buf); + + if(!getOK(OK_0)) + { + return printError("cant unlock bootloader"); + } + return 1; + +} + +int goBootLoader(unsigned long addr) +{ + char buf[20]; + + sendBuf(sprintf(buf, "G %lu A\r\n", addr), buf); + + if(!getOK(OK_0)) + { + return printError("cant issue go command");; + } + return 1; +} + +#define BSIZE 400 + +int uploadData(unsigned long addr, unsigned long len, unsigned char *ibuf) +{ + char buf[128]; + unsigned char uubuf[BSIZE*3]; + unsigned int blen, csum; + unsigned long slen, saddr, soff; + slen = len; + saddr = addr; + soff = 0; + + if(addr & 0x3) + { + return printError("RAM address not on dword boundary"); + } + + while(slen >= BSIZE) + { + sendBuf(sprintf(buf, "W %lu %i\r\n", saddr+soff, BSIZE), buf); + if(!getOK(OK_0)) + { + return printError("cant write data"); + } + + csum = 0; + + for(blen = 0; blen < BSIZE; blen++) + { + csum += ibuf[soff+blen]; + } + + blen = uuencode(ibuf+soff, uubuf, BSIZE); + sendBuf(blen, (char*)uubuf); + sendBuf(sprintf(buf, "%u\r\n", csum), buf); + if(!getOK(OK_LIT)) + { + return printError("error in checksum"); + } + slen -= BSIZE; + soff += BSIZE; + } + + if(slen) + { + sendBuf(sprintf(buf, "W %lu %lu\r\n", saddr+soff, slen), buf); + if(!getOK(OK_0)) + { + + return printError("cant write remaining data"); + } + + csum = 0; + + for(blen = 0; blen < slen; blen++) + { + csum += ibuf[soff+blen]; + } + + blen = uuencode(ibuf+soff, uubuf, slen); + sendBuf(blen, (char*)uubuf); + sendBuf(sprintf(buf, "%i\r\n", csum), buf); + + if(!getOK(OK_LIT)) + { + return printError("error in checksum for remaining data"); + } + + } + return 1; +} + +int uploadRAM(int fd, int loc) +{ + unsigned char buf[70000]; + + unsigned long fx, total, size; + total = 0; + + if(fd) + { + printInfoS(2,"reading image into buffer", 0); + fx = read(fd,buf,70000); + } + else + { + for(fx=0; fx= 256) + { + if(!uploadData(loc+total, 256, buf+total)) + { + return printError("Error in upload"); + } + total += 256; + fx -= 256; + } + else + { + if(!uploadData(loc+total, fx, buf+total)) + { + return printError("Error in upload"); + } + total += fx; + fx -= fx; + } + + printProgress(0,"RAM",total,size); + } + + printInfoH(0,"ram upload complete, total bytes:", total); + + return 1; +} diff --git a/lpctool/testing/bootcom.h b/lpctool/testing/bootcom.h new file mode 100644 index 0000000..61dc7a3 --- /dev/null +++ b/lpctool/testing/bootcom.h @@ -0,0 +1,12 @@ +#ifndef BOOTCOM_H +#define BOOTCOM_H + +#define OK_LIT 0x00 +#define OK_0 0x01 + +unsigned int uuencode(unsigned char *ibuf, unsigned char *obuf, int len); +int openBootLoader(unsigned int cfreq); +int uploadData(unsigned long addr, unsigned long len, unsigned char *ibuf); +int uploadRAM(int fd, int loc); + +#endif diff --git a/lpctool/testing/fla.sh b/lpctool/testing/fla.sh new file mode 100644 index 0000000..6eb9749 --- /dev/null +++ b/lpctool/testing/fla.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +#~ ./lpctool -d /dev/ttyS0 -i -v -e -a ../../boop/trunk/boop_rom.bin +./lpctool -d /dev/ttyUSB0 -i -v -e -a ../../boop/trunk/boop_rom.bin diff --git a/lpctool/testing/flashtool/Makefile b/lpctool/testing/flashtool/Makefile new file mode 100644 index 0000000..c5052c0 --- /dev/null +++ b/lpctool/testing/flashtool/Makefile @@ -0,0 +1,51 @@ + +include ../Makefile.inc + + +all: tool_data.h + +ramtool.bin: ramtool.elf + $(OC) -O binary ramtool.elf ramtool.bin + +ramtool.elf: crt.o serial.o lcd.o fonty.o flash.o ramtool.o lpc2220.ld + $(LD) $(LDFLAGS) -o ramtool.elf crt.o serial.o lcd.o fonty.o flash.o ramtool.o + +romtool.bin: romtool.elf + $(OC) -O binary romtool.elf romtool.bin + +romtool.elf: crt.o serial.o lcd.o fonty.o flash.o romtool.o lpc2220_rom.ld + $(LD) $(ROMLDFLAGS) -o romtool.elf crt.o serial.o lcd.o fonty.o flash.o romtool.o + +crt.o: crt.s + $(AS) $(ASFLAGS) -o crt.o crt.s + +flash.o: flash.c flash.h serial.h lcd.h + $(CC) $(CFLAGS) -o flash.o flash.c + +lcd.o: lcd.c lcd.h lpc2220.h + $(CC) $(CFLAGS) -o lcd.o lcd.c + +fonty.o: fonty.c fonty.h charset.bits charset.info lcd.h + $(CC) $(CFLAGS) -o fonty.o fonty.c + +serial.o: serial.c serial.h lcd.h lpc2220.h + $(CC) $(CFLAGS) -o serial.o serial.c + +ramtool.o: ramtool.c serial.o lcd.h flash.h lpc2220.h + $(CC) $(CFLAGS) -o ramtool.o ramtool.c + +romtool.o: ramtool.c serial.o lcd.h flash.h lpc2220.h + $(CC) $(CFLAGS) -DRESIDENT -o romtool.o ramtool.c + +bin2h: bin2h.c ramtool.bin + gcc -Os bin2h.c -o bin2h + strip bin2h + +tool_data.h: bin2h + ./bin2h > tool_data.h + mv tool_data.h .. + +clean: + $(RM) *.o ramtool.elf ramtool.bin romtool.elf romtool.bin *~ bin2h + +### EOF diff --git a/lpctool/testing/flashtool/bin2h.c b/lpctool/testing/flashtool/bin2h.c new file mode 100644 index 0000000..9caa7b6 --- /dev/null +++ b/lpctool/testing/flashtool/bin2h.c @@ -0,0 +1,30 @@ +#include "stdio.h" +#include "string.h" +#include + + +int main(void) +{ + int fd; + unsigned long cnt, cnt2; + unsigned char buf[0x10000]; + + fd = open("ramtool.bin", O_RDONLY); + + if(fd) + { + cnt = read(fd, buf, 0x10000); + cnt2 = 0; + printf("#define tool_len 0x%08lX\n",cnt); + printf("const unsigned char tool_data[] = {\n\t"); + while(cnt--) + { + printf("0x%02X,",buf[cnt2++]); + if((cnt2 & 0x0F) == 0) + printf("\n\t"); + } + printf("\n};\n"); + close(fd); + } + return 0; +} diff --git a/lpctool/testing/flashtool/charset.bits b/lpctool/testing/flashtool/charset.bits new file mode 100644 index 0000000..307a269 --- /dev/null +++ b/lpctool/testing/flashtool/charset.bits @@ -0,0 +1,118 @@ +const unsigned char charset_bits[] = { + 0x80, 0xc0, 0x80, 0xe0, 0x80, 0xc0, 0x80, 0xf0, 0x01, 0x03, 0x01, 0x07, + 0x01, 0x03, 0x01, 0x0f, 0x80, 0x88, 0xaa, 0xff, 0xff, 0xaa, 0x88, 0x80, + 0x00, 0xc0, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xf0, 0x00, 0x03, 0x00, 0x07, + 0x00, 0x03, 0x00, 0x0f, 0x80, 0x88, 0xaa, 0xab, 0xab, 0xaa, 0x88, 0x80, + 0x80, 0x80, 0x80, 0x70, 0x01, 0x01, 0x01, 0x0e, 0x0e, 0x01, 0x01, 0x01, + 0x70, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x24, + 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x92, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x81, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xaa, 0x02, 0x05, 0x02, 0x00, + 0x3e, 0x41, 0x41, 0x22, 0x02, 0x05, 0x02, 0x00, 0x7f, 0x09, 0x09, 0x01, + 0x1c, 0x22, 0x41, 0x4f, 0x41, 0x22, 0x1c, 0x1c, 0x22, 0x41, 0x4f, 0x47, + 0x22, 0x1c, 0x1c, 0x22, 0x41, 0x4f, 0x4f, 0x2e, 0x1c, 0x1c, 0x22, 0x41, + 0x4f, 0x5f, 0x3e, 0x1c, 0x1c, 0x22, 0x41, 0x7f, 0x7f, 0x3e, 0x1c, 0x1c, + 0x22, 0x71, 0x7f, 0x7f, 0x3e, 0x1c, 0x1c, 0x3a, 0x79, 0x7f, 0x7f, 0x3e, + 0x1c, 0x1c, 0x3e, 0x7d, 0x7f, 0x7f, 0x3e, 0x1c, 0x1c, 0x3e, 0x7f, 0x7f, + 0x7f, 0x3e, 0x1c, 0x00, 0x00, 0x5f, 0x03, 0x00, 0x03, 0x14, 0x7f, 0x14, + 0x7f, 0x14, 0x24, 0x4a, 0xff, 0x4a, 0x32, 0x63, 0x13, 0x08, 0x64, 0x63, + 0x36, 0x49, 0x55, 0x22, 0x50, 0x03, 0x1c, 0x22, 0x41, 0x41, 0x22, 0x1c, + 0x14, 0x08, 0x3e, 0x08, 0x14, 0x08, 0x08, 0x3e, 0x08, 0x08, 0x80, 0x60, + 0x60, 0x08, 0x08, 0x08, 0x08, 0x08, 0x60, 0x60, 0xc0, 0x30, 0x0c, 0x03, + 0x3e, 0x51, 0x49, 0x45, 0x3e, 0x00, 0x42, 0x7f, 0x40, 0x00, 0x42, 0x61, + 0x51, 0x49, 0x46, 0x22, 0x41, 0x49, 0x49, 0x36, 0x18, 0x14, 0x12, 0x7f, + 0x10, 0x27, 0x45, 0x45, 0x45, 0x39, 0x3e, 0x49, 0x49, 0x49, 0x32, 0x61, + 0x11, 0x09, 0x05, 0x03, 0x36, 0x49, 0x49, 0x49, 0x36, 0x26, 0x49, 0x49, + 0x49, 0x3e, 0x6c, 0x6c, 0x80, 0x6c, 0x6c, 0x08, 0x14, 0x22, 0x41, 0x14, + 0x14, 0x14, 0x14, 0x41, 0x22, 0x14, 0x08, 0x02, 0x01, 0x51, 0x09, 0x06, + 0x3e, 0x41, 0x59, 0x55, 0x5e, 0x7e, 0x09, 0x09, 0x09, 0x7e, 0x7f, 0x49, + 0x49, 0x49, 0x36, 0x3e, 0x41, 0x41, 0x41, 0x22, 0x7f, 0x41, 0x41, 0x41, + 0x3e, 0x7f, 0x49, 0x49, 0x41, 0x41, 0x7f, 0x09, 0x09, 0x01, 0x01, 0x3e, + 0x41, 0x41, 0x49, 0x3a, 0x7f, 0x08, 0x08, 0x08, 0x7f, 0x41, 0x7f, 0x41, + 0x30, 0x41, 0x41, 0x41, 0x3f, 0x7f, 0x08, 0x14, 0x22, 0x41, 0x7f, 0x40, + 0x40, 0x40, 0x40, 0x7f, 0x02, 0x0c, 0x02, 0x7f, 0x7f, 0x02, 0x04, 0x08, + 0x7f, 0x3e, 0x41, 0x41, 0x41, 0x3e, 0x7f, 0x09, 0x09, 0x09, 0x06, 0x3e, + 0x41, 0x41, 0x41, 0xbe, 0x7f, 0x09, 0x09, 0x09, 0x76, 0x26, 0x49, 0x49, + 0x49, 0x32, 0x01, 0x01, 0x7f, 0x01, 0x01, 0x3f, 0x40, 0x40, 0x40, 0x3f, + 0x1f, 0x20, 0x40, 0x20, 0x1f, 0x7f, 0x20, 0x10, 0x20, 0x7f, 0x41, 0x22, + 0x1c, 0x22, 0x41, 0x07, 0x08, 0x70, 0x08, 0x07, 0x61, 0x51, 0x49, 0x45, + 0x43, 0x7f, 0x41, 0x41, 0x03, 0x0c, 0x30, 0xc0, 0x41, 0x41, 0x7f, 0x02, + 0x01, 0x02, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01, 0x02, 0x20, 0x54, 0x54, + 0x78, 0x7f, 0x48, 0x48, 0x30, 0x38, 0x44, 0x44, 0x24, 0x30, 0x48, 0x48, + 0x7f, 0x38, 0x54, 0x54, 0x18, 0x08, 0x7e, 0x09, 0x02, 0x98, 0xa4, 0xa4, + 0x78, 0x7f, 0x08, 0x08, 0x70, 0x44, 0x7d, 0x40, 0x44, 0x84, 0x7d, 0x7f, + 0x10, 0x28, 0x44, 0x41, 0x7f, 0x40, 0x7c, 0x04, 0x18, 0x04, 0x78, 0x7c, + 0x08, 0x04, 0x78, 0x38, 0x44, 0x44, 0x38, 0xfc, 0x24, 0x24, 0x18, 0x18, + 0x24, 0x24, 0xfc, 0x7c, 0x08, 0x04, 0x08, 0x48, 0x54, 0x54, 0x24, 0x04, + 0x3f, 0x44, 0x3c, 0x40, 0x20, 0x7c, 0x1c, 0x20, 0x40, 0x20, 0x1c, 0x3c, + 0x40, 0x30, 0x40, 0x3c, 0x44, 0x28, 0x10, 0x28, 0x44, 0x9c, 0xa0, 0xa0, + 0x7c, 0x64, 0x54, 0x54, 0x4c, 0x08, 0x36, 0x41, 0x77, 0x41, 0x36, 0x08, + 0x08, 0x08, 0x2a, 0x1c, 0x08, 0x08, 0x1c, 0x2a, 0x08, 0x08, 0x00, 0x00, + 0x00, 0xdf, 0xdf, 0x07, 0x07, 0x00, 0x07, 0x07, 0x14, 0x3e, 0x14, 0x3e, + 0x14, 0x24, 0x4a, 0xff, 0x4a, 0x32, 0xf3, 0xfb, 0x18, 0xdf, 0xc7, 0x36, + 0x49, 0x55, 0x22, 0x50, 0x04, 0x07, 0x03, 0x3c, 0x7e, 0xc3, 0x81, 0x81, + 0xc3, 0x7e, 0x3c, 0x14, 0x08, 0x3e, 0x08, 0x14, 0x18, 0x7e, 0x7e, 0x18, + 0x80, 0x60, 0x60, 0x18, 0x18, 0x18, 0x18, 0x18, 0x60, 0x60, 0xc0, 0xf0, + 0x3c, 0x0f, 0x03, 0x7e, 0xff, 0xc3, 0xff, 0x7e, 0x04, 0xc6, 0xff, 0xff, + 0xc0, 0xe6, 0xf7, 0xd3, 0xdf, 0xce, 0x42, 0xc3, 0xdb, 0xff, 0x76, 0x38, + 0x3c, 0x36, 0xff, 0xff, 0x5f, 0xdf, 0xdb, 0xfb, 0x73, 0x7e, 0xff, 0xdb, + 0xfb, 0x72, 0x03, 0xf3, 0xfb, 0x0f, 0x07, 0x76, 0xff, 0xdb, 0xff, 0x76, + 0x4e, 0xdf, 0xdb, 0xff, 0x7e, 0x6c, 0x6c, 0x80, 0x6c, 0x6c, 0x18, 0x3c, + 0x66, 0xc3, 0x81, 0x36, 0x36, 0x36, 0x36, 0x81, 0xc3, 0x66, 0x3c, 0x18, + 0x06, 0xd3, 0xd9, 0x0f, 0x06, 0x7e, 0xc3, 0xdb, 0xd7, 0xde, 0xfe, 0xff, + 0x33, 0xff, 0xfe, 0xff, 0xff, 0xdb, 0xff, 0x66, 0x7e, 0xff, 0xc3, 0xe7, + 0x66, 0xff, 0xff, 0xc3, 0xff, 0x7e, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xff, + 0xff, 0x1b, 0x1b, 0x03, 0x7e, 0xff, 0xc3, 0xfb, 0x7a, 0xff, 0xff, 0x18, + 0xff, 0xff, 0xc3, 0xff, 0xff, 0xc3, 0x60, 0xe3, 0xc3, 0xff, 0x7f, 0xff, + 0xff, 0x1c, 0xf7, 0xe3, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xff, 0xfe, 0x0c, + 0xfe, 0xff, 0xff, 0xfe, 0x18, 0x7f, 0xff, 0x7e, 0xff, 0xc3, 0xff, 0x7e, + 0xff, 0xff, 0x1b, 0x1f, 0x0e, 0x7e, 0xff, 0xc3, 0x7f, 0xde, 0xff, 0xff, + 0x1b, 0xff, 0xee, 0x4e, 0xdf, 0xdb, 0xfb, 0x72, 0x03, 0xff, 0xff, 0x03, + 0x03, 0x7f, 0xff, 0xc0, 0xff, 0x7f, 0x3f, 0x7f, 0xc0, 0x7f, 0x3f, 0xff, + 0x7f, 0x30, 0x7f, 0xff, 0xe7, 0xe7, 0x18, 0x18, 0xe7, 0xe7, 0x0f, 0x1f, + 0xf0, 0x1f, 0x0f, 0xe3, 0xf3, 0xdb, 0xcf, 0xc7, 0xff, 0xff, 0xc3, 0xc3, + 0x03, 0x0f, 0x3c, 0xf0, 0xc0, 0xc3, 0xc3, 0xff, 0xff, 0x04, 0x06, 0x03, + 0x06, 0x04, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x03, 0x07, 0x60, 0xf4, 0xd4, + 0xf4, 0xf8, 0xff, 0xff, 0xcc, 0xfc, 0x78, 0x78, 0xfc, 0xcc, 0xcc, 0x48, + 0x78, 0xfc, 0xcc, 0xff, 0xff, 0x78, 0xfc, 0xac, 0xbc, 0xb8, 0x18, 0xfe, + 0xff, 0x1b, 0x1b, 0xb8, 0xbc, 0xac, 0xfc, 0x78, 0xff, 0xff, 0x18, 0xf8, + 0xf0, 0xcc, 0xfd, 0xfd, 0xc0, 0xc0, 0xcc, 0xfd, 0x7d, 0xff, 0xff, 0x10, + 0xfc, 0xec, 0x7f, 0xff, 0xc0, 0xc0, 0xfc, 0xfc, 0x0c, 0xfc, 0x0c, 0xfc, + 0xf8, 0xfc, 0xf8, 0x0c, 0xfc, 0xf8, 0x78, 0xfc, 0xcc, 0xfc, 0x78, 0xfc, + 0xfc, 0x6c, 0x7c, 0x38, 0x38, 0x7c, 0x6c, 0xfc, 0xf8, 0xfc, 0xf8, 0x0c, + 0x1c, 0x18, 0xd8, 0xdc, 0xfc, 0xec, 0x6c, 0x0c, 0x7f, 0xff, 0xcc, 0xcc, + 0x7c, 0xfc, 0xc0, 0x7c, 0xfc, 0x3c, 0x7c, 0xc0, 0x7c, 0x3c, 0x7c, 0xfc, + 0xc0, 0x60, 0xc0, 0xfc, 0x7c, 0xcc, 0xfc, 0x30, 0xfc, 0xdc, 0x9c, 0xbc, + 0xb0, 0xfc, 0x7c, 0xcc, 0xec, 0xfc, 0xdc, 0xcc, 0x10, 0x56, 0xef, 0x81, + 0xef, 0xef, 0x81, 0xee, 0x56, 0x10, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x18, + 0x3c, 0x7e, 0x18, 0x18, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, 0x3e, 0x1f, + 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, 0x3e, 0x1f, 0x8f, 0xe3, 0xf1, 0xf8, 0x7c, + 0x3e, 0x1f, 0x8f, 0xc7, 0xf1, 0xf8, 0x7c, 0x3e, 0x1f, 0x8f, 0xc7, 0xe3, + 0xf8, 0x7c, 0x3e, 0x1f, 0x8f, 0xc7, 0xe3, 0xf1, 0x7c, 0x3e, 0x1f, 0x8f, + 0xc7, 0xe3, 0xf1, 0xf8, 0x3e, 0x1f, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, + 0x1f, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, 0x3e, 0xff, 0xff, 0xe7, 0xc3, + 0xc3, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xc3, 0xc3, 0xe7, 0xff, 0xff, + 0xff, 0xf8, 0xe0, 0xc0, 0xc0, 0xe0, 0xf8, 0xff, 0xff, 0x1f, 0x07, 0x03, + 0x03, 0x07, 0x1f, 0xff, 0x1c, 0x3e, 0x77, 0x63, 0x77, 0x3e, 0x1c, 0x1c, + 0x36, 0x63, 0x41, 0x63, 0x36, 0x1c, 0x1c, 0x08, 0x41, 0x63, 0x41, 0x08, + 0x1c, 0x08, 0x14, 0x22, 0x49, 0x22, 0x14, 0x08, 0x55, 0xaa, 0x55, 0xaa, + 0x55, 0xaa, 0x55, 0xaa, 0x33, 0x33, 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, + 0x33, 0x33, 0x0e, 0x11, 0x0e, 0x12, 0x1f, 0x10, 0x19, 0x15, 0x12, 0x11, + 0x15, 0x0a, 0x07, 0x04, 0x1e, 0x17, 0x15, 0x09, 0x0e, 0x15, 0x09, 0x01, + 0x1d, 0x03, 0x0a, 0x15, 0x0a, 0x12, 0x15, 0x0e, 0x0a, 0x10, 0x0a, 0x04, + 0x0a, 0x11, 0x0a, 0x0a, 0x0a, 0x11, 0x0a, 0x04, 0x01, 0x15, 0x02, 0x01, + 0x03, 0x07, 0x03, 0x01, 0x04, 0x06, 0x07, 0x06, 0x04, 0x04, 0x0e, 0x1f, + 0x1f, 0x0e, 0x04, 0x18, 0x3c, 0x7e, 0x7e, 0x3c, 0x18, 0x3c, 0x42, 0x81, + 0x81, 0x81, 0x81, 0x42, 0x3c, 0x3c, 0x42, 0x99, 0xbd, 0xbd, 0x99, 0x42, + 0x3c, 0x7f, 0x49, 0x41, 0x6b, 0x41, 0x49, 0x7f, 0x80, 0x40, 0x20, 0x10, + 0x0f, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x3e, 0x01, 0x01, 0x01, + 0x01, 0x02, 0x04, 0x38, 0x08, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, + 0x15, 0x0a, 0x15, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/lpctool/testing/flashtool/charset.info b/lpctool/testing/flashtool/charset.info new file mode 100644 index 0000000..5c205b8 --- /dev/null +++ b/lpctool/testing/flashtool/charset.info @@ -0,0 +1,22 @@ +const unsigned char charset_info[] = { +0x08, 0x84, 0x48, 0x84, 0x44, 0x44, 0x48, 0x88, // 0- 15 graticule & borders +0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, // 16- 31 graticule & symbols +0x21, 0x35, 0x55, 0x51, 0x33, 0x55, 0x35, 0x24, // 32- 47 ascii, font 1 +0x55, 0x55, 0x55, 0x55, 0x55, 0x23, 0x44, 0x45, // 48- 63 ascii, font 1 +0x55, 0x55, 0x55, 0x55, 0x53, 0x55, 0x55, 0x55, // 64- 80 ascii, font 1 +0x55, 0x55, 0x55, 0x55, 0x55, 0x53, 0x43, 0x35, // 80- 95 ascii, font 1 +0x24, 0x44, 0x44, 0x44, 0x43, 0x34, 0x35, 0x44, // 96-112 ascii, font 1 +0x44, 0x44, 0x34, 0x55, 0x54, 0x43, 0x13, 0x55, // 112-127 ascii, font 1 +0x32, 0x55, 0x55, 0x53, 0x44, 0x54, 0x35, 0x25, // 128-143 ascii, bold font +0x55, 0x55, 0x55, 0x55, 0x55, 0x23, 0x54, 0x55, // 144-159 ascii, bold font +0x55, 0x55, 0x55, 0x55, 0x54, 0x55, 0x55, 0x55, // 160-175 ascii, bold font +0x55, 0x55, 0x55, 0x55, 0x65, 0x54, 0x54, 0x55, // 176-191 ascii, bold font +0x25, 0x55, 0x55, 0x55, 0x54, 0x45, 0x47, 0x55, // 192-207 ascii, bold font +0x55, 0x55, 0x55, 0x57, 0x55, 0x54, 0x24, 0x55, // 208-223 ascii, bold font +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, // 224-239 symbols +0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 240-255 symbols +0x33, 0x33, 0x33, 0x33, 0x33, 0x12, 0x33, 0x33, // 256-271 small numbers +0x55, 0x33, 0x68, 0x87, 0x84, 0x44, 0x44, 0x44 // 272-288 symbols +}; + +const unsigned char charset_dlines = 1; diff --git a/lpctool/testing/flashtool/crt.s b/lpctool/testing/flashtool/crt.s new file mode 100644 index 0000000..9e1dd44 --- /dev/null +++ b/lpctool/testing/flashtool/crt.s @@ -0,0 +1,163 @@ +/* ************************************************************* + + crt.s STARTUP ASSEMBLY CODE + ----------------------- + + + Module includes the interrupt vectors and start-up code. + +****************************************************************/ + +/* Stack Sizes */ +.set UND_STACK_SIZE, 0x00000004 /* stack for "undefined instruction" interrupts is 4 bytes */ +.set ABT_STACK_SIZE, 0x00000004 /* stack for "abort" interrupts is 4 bytes */ +.set FIQ_STACK_SIZE, 0x00000010 /* stack for "FIQ" interrupts is 4 bytes */ +.set IRQ_STACK_SIZE, 0X00000020 /* stack for "IRQ" normal interrupts is 4 bytes */ +.set SVC_STACK_SIZE, 0x00000010 /* stack for "SVC" supervisor mode is 4 bytes */ + + + +/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs (program status registers) */ +.set MODE_USR, 0x10 /* Normal User Mode */ +.set MODE_FIQ, 0x11 /* FIQ Processing Fast Interrupts Mode */ +.set MODE_IRQ, 0x12 /* IRQ Processing Standard Interrupts Mode */ +.set MODE_SVC, 0x13 /* Supervisor Processing Software Interrupts Mode */ +.set MODE_ABT, 0x17 /* Abort Processing memory Faults Mode */ +.set MODE_UND, 0x1B /* Undefined Processing Undefined Instructions Mode */ +.set MODE_SYS, 0x1F /* System Running Priviledged Operating System Tasks Mode */ + +.set I_BIT, 0x80 /* when I bit is set, IRQ is disabled (program status registers) */ +.set F_BIT, 0x40 /* when F bit is set, FIQ is disabled (program status registers) */ + + +.text +.arm + +.global Reset_Handler +.global _startup +.func _startup + +_startup: + +# Exception Vectors + +_vectors: ldr PC, Reset_Addr + ldr PC, Undef_Addr + ldr PC, SWI_Addr + ldr PC, PAbt_Addr + ldr PC, DAbt_Addr + nop /* Reserved Vector (holds Philips ISP checksum) */ + ldr PC, [PC,#-0xFF0] /* see page 71 of "Insiders Guide to the Philips ARM7-Based Microcontrollers" by Trevor Martin */ + ldr PC, FIQ_Addr + +Reset_Addr: .word Reset_Handler /* defined in this module below */ +Undef_Addr: .word UNDEF_Routine /* defined in main.c */ +SWI_Addr: .word SWI_Routine /* defined in main.c */ +PAbt_Addr: .word UNDEF_Routine /* defined in main.c */ +DAbt_Addr: .word UNDEF_Routine /* defined in main.c */ +IRQ_Addr: .word IRQ_Routine /* defined in main.c */ +FIQ_Addr: .word FIQ_Routine /* defined in main.c */ + .word 0 /* rounds the vectors and ISR addresses to 64 bytes total */ + + +# Reset Handler + +Reset_Handler: + + /* Setup a stack for each mode - note that this only sets up a usable stack + for User mode. Also each mode is setup with interrupts initially disabled. */ + + ldr r0, =_stack_end + msr CPSR_c, #MODE_UND|I_BIT|F_BIT /* Undefined Instruction Mode */ + mov sp, r0 + sub r0, r0, #UND_STACK_SIZE + msr CPSR_c, #MODE_ABT|I_BIT|F_BIT /* Abort Mode */ + mov sp, r0 + sub r0, r0, #ABT_STACK_SIZE + msr CPSR_c, #MODE_FIQ|I_BIT|F_BIT /* FIQ Mode */ + mov sp, r0 + sub r0, r0, #FIQ_STACK_SIZE + msr CPSR_c, #MODE_IRQ|I_BIT|F_BIT /* IRQ Mode */ + mov sp, r0 + sub r0, r0, #IRQ_STACK_SIZE + msr CPSR_c, #MODE_SVC|I_BIT|F_BIT /* Supervisor Mode */ + mov sp, r0 + sub r0, r0, #SVC_STACK_SIZE + msr CPSR_c, #MODE_SYS|F_BIT /* User Mode */ + mov sp, r0 + + /* set up pins and membanks */ + ldr r0, = PINSEL2 + ldr r2, =0xD6041D4 + str r2, [r0] + + ldr r1, =0x10000420 + ldr r0,=BCFG0 + str r1,[r0] + str r1,[r0,#0x08] + + /* copy .data section (Copy from ROM to RAM) */ + ldr R1, =_etext + ldr R2, =_data + ldr R3, =_edata +1: cmp R2, R3 + ldrlo R0, [R1], #4 + strlo R0, [R2], #4 + blo 1b + + /* Clear .bss section (Zero init) */ + + mov R0, #0 + ldr R1, =_bss_start + ldr R2, =_bss_end +2: cmp R1, R2 + strlo R0, [R1], #4 + blo 2b + + + + /* set up the pll */ + ldr r0, =0xe01fc000 + ldr r2, =0xaa + ldr r3, =0x55 + ldr r1, =0x03 + str r1, [r0,#0x80] + ldr r1, =0x0 + str r1, [r0,#0x100] + ldr r1, =0x42 + str r1,[r0,#0x84] + str r2, [r0,#0x8c] + str r3, [r0,#0x8c] + + ldr r2, =IO0PIN + mov r3, #0x10 + str r3, [r2,#0xc] + ldr r3, [r2,#8] + bic r3, r3, #0x10 + str r3, [r2,#8] + + ldr r1, =0xc42 + ldr r0, =BCFG1 + str r1, [r0] + + ldr r2, =PINSEL0 + ldr r3, [r2,#0x14] + orr r3, r3, #0x800 + str r3, [r2,#0x14] + ldr r3, [r2,#0x14] + orr r3, r3, #0x800000 + str r3, [r2,#0x14] + + /* Enter the C code */ + mov r0,#0 + mov r1,r0 + mov r2,r0 + mov fp,r0 + mov r7,r0 + ldr r10,=main + mov lr,pc + bx r10 + +.endfunc +entry_mask: .word 0x4FFFFFFF /* defined in this module below */ +.end diff --git a/lpctool/testing/flashtool/flash.c b/lpctool/testing/flashtool/flash.c new file mode 100644 index 0000000..21a0253 --- /dev/null +++ b/lpctool/testing/flashtool/flash.c @@ -0,0 +1,230 @@ +#include "lpc2220.h" +#include "flash.h" +#include "serial.h" +#include "lcd.h" + +const unsigned long secaddr[19] = +{ 0x00000, + 0x02000, + 0x03000, + 0x04000, + 0x08000, + 0x10000, + 0x18000, + 0x20000, + 0x28000, + 0x30000, + 0x38000, + 0x40000, + 0x48000, + 0x50000, + 0x58000, + 0x60000, + 0x68000, + 0x70000, + 0x78000 }; + +unsigned long flash_base; +unsigned short check1, check2; + +void slow(void) +{ + BCFG0 = 0x10000420; + BCFG2 = 0x10000420; +} + +void fast(void) +{ + BCFG0 = 0x10000400; + BCFG2 = 0x10000400; +} +int eraseSector(unsigned char chip, unsigned char secnum) +{ + + if(chip == 0) + flash_base = FLASH0_BASE; + else + flash_base = FLASH1_BASE; + + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x80; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base + (secaddr[secnum]<<1))) = 0x30; + retry: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x44) == (check2 & 0x44)) + goto done; + if(!(check2 & 0x24)) + goto retry; + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x44) == (check2 & 0x44)) + goto done; + *((volatile unsigned short *)flash_base) = 0xF0; + return -1; + + done: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if(check1 != check2) + goto retry; + return 0; +} + +int eraseSectorAt(unsigned long sadr) +{ + + flash_base = sadr & 0xFF000000; + + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x80; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(sadr)) = 0x30; + + retry: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x44) == (check2 & 0x44)) + goto done; + if(!(check2 & 0x24)) + goto retry; + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x44) == (check2 & 0x44)) + goto done; + *((volatile unsigned short *)flash_base) = 0xF0; + return -1; + + done: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if(check1 != check2) + goto retry; + return 0; +} + +int eraseFlash(unsigned char chip) +{ + if(chip == 0) + flash_base = FLASH0_BASE; + else + flash_base = FLASH1_BASE; + + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x80; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x10; + + retry: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x44) == (check2 & 0x44)) + goto done; + if(!(check2 & 0x24)) + goto retry; + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x44) == (check2 & 0x44)) + goto done; + *((volatile unsigned short *)flash_base) = 0xF0; + return -1; + + done: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if(check1 != check2) + goto retry; + return 0; +} + +int writeWord(unsigned long addr, unsigned short data) +{ + flash_base = addr & 0xFF000000; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xA0; + *((volatile unsigned short *)(addr)) = data; + + retry: + check1 = *((volatile unsigned short *)addr); + check2 = *((volatile unsigned short *)addr); + if((check1 & 0x40) == (check2 & 0x40)) + goto done; + if(!(check2 & 0x20)) + goto retry; + check1 = *((volatile unsigned short *)addr); + check2 = *((volatile unsigned short *)addr); + if((check1 & 0x40) == (check2 & 0x40)) + goto done; + *((volatile unsigned short *)addr) = 0xF0; + return -1; + + done: + check1 = *((volatile unsigned short *)addr); + check2 = *((volatile unsigned short *)addr); + if(check1 != check2) + goto retry; + + return 0; +} + +void prepareBulk(unsigned long dst) +{ + flash_base = dst & 0xFF000000; + + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x20; +} + +void endBulk(unsigned long dst) +{ + flash_base = dst & 0xFF000000; + + *((volatile unsigned short *)(flash_base)) = 0x90; + *((volatile unsigned short *)(flash_base)) = 0x00; +} + +int writeBulk(unsigned long src, unsigned long dst, unsigned long cnt) +{ + flash_base = dst; + while(cnt--) + { + if(*((volatile unsigned short *)src) != 0xFFFF) + { + *((volatile unsigned short *)flash_base) = 0xA0; + *((volatile unsigned short *)flash_base) = *((volatile unsigned short *)src); + + retry: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x40) == (check2 & 0x40)) + goto done; + if(!(check2 & 0x20)) + goto retry; + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x40) == (check2 & 0x40)) + goto done; + *((volatile unsigned short *)flash_base) = 0xF0; + return -1; + + done: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if(check1 != check2) + goto retry; + } + src+=2; + flash_base+=2; + } + + return 0; +} diff --git a/lpctool/testing/flashtool/flash.h b/lpctool/testing/flashtool/flash.h new file mode 100644 index 0000000..6621209 --- /dev/null +++ b/lpctool/testing/flashtool/flash.h @@ -0,0 +1,16 @@ +#ifndef FLASH_H +#define FLASH_H + +#define FLASH0_BASE 0x80000000 +#define FLASH1_BASE 0x82000000 + +void prepareBulk(unsigned long dst); +void endBulk(unsigned long dst); +int eraseSector(unsigned char chip, unsigned char secnum); +int eraseSectorAt(unsigned long sadr); +int eraseFlash(unsigned char chip); +int writeWord(unsigned long addr, unsigned short data); +int writeBulk(unsigned long src, unsigned long dst, unsigned long cnt); +void lcd_set(unsigned char s); + +#endif diff --git a/lpctool/testing/flashtool/fonty.c b/lpctool/testing/flashtool/fonty.c new file mode 100644 index 0000000..0d6bf52 --- /dev/null +++ b/lpctool/testing/flashtool/fonty.c @@ -0,0 +1,175 @@ +#include "lcd.h" +#include "fonty.h" + +#include "charset.info" +#include "charset.bits" + +static unsigned char tx, ty; +static unsigned short coff; +unsigned char *font_bits, *font_info; + +void set_font(unsigned char f) +{ + font_bits = (unsigned char*) charset_bits; + font_info = (unsigned char*) charset_info; + switch(f) + { + case 0: + coff = 0; + break; + case 1: + coff = 96; + break; + case 2: + coff = 224; + break; + case 3: + case 4: + coff = 272; + break; + } +} + +void _draw_char( + unsigned int ch, // char + unsigned char c, // color + unsigned char m // mode + ) +{ + unsigned char p,s; + unsigned int cpos, cnt; + + cpos = 0; + + for(cnt=0; cnt>1] & 0x0F); + } + else + { + cpos += (font_info[cnt>>1] >> 4); + } + } + + p = font_info[ch>>1]; + if(ch & 0x01) + { + p &= 0x0F; + } + else + { + p >>= 4; + } + + if(ty & 0x07) + { + s = ty & 0x07; + + for(cnt=0;cnt> (8-s); + else + drawbuf[0][p-cnt-1] = 0x00; + + if(c & 0x01) + drawbuf[1][p-cnt-1] = font_bits[cpos+cnt] >> (8-s); + else + drawbuf[1][p-cnt-1] = 0x00; + } + do_rcu(tx,ty+8,p,m); + } + else + { + for(cnt=0;cnt>4]+coff, c, m); + _draw_char(hval[v & 0x0F]+coff, c, m); +} + +void draw_hexS(unsigned char x, unsigned char y, const unsigned short v, unsigned char c, unsigned char m) +{ + tx = x; + ty = y; + draw_hexC(x, y, v >> 8, c, m); + draw_hexC(tx, ty, v & 0xFF, c, m); +} + +void draw_hexW(unsigned char x, unsigned char y, const unsigned long v, unsigned char c, unsigned char m) +{ + draw_hexS(x, y, v >> 16, c, m); + draw_hexS(tx, ty, v & 0xFFFF, c, m); +} diff --git a/lpctool/testing/flashtool/fonty.h b/lpctool/testing/flashtool/fonty.h new file mode 100644 index 0000000..2b34133 --- /dev/null +++ b/lpctool/testing/flashtool/fonty.h @@ -0,0 +1,14 @@ +#ifndef FONTY_H +#define FONTY_H + +extern unsigned char drawbuf[2][128]; + +void set_font(unsigned char f); +void draw_char(unsigned char x, unsigned char y, unsigned char ch, unsigned char c, unsigned char m); +void draw_string(unsigned char x, unsigned char y, char *st, unsigned char c, unsigned char m); +void draw_stringc(unsigned char x, unsigned char y, char *st, unsigned char cnt, unsigned char c, unsigned char m); +void draw_hexC(unsigned char x, unsigned char y, const unsigned char v, unsigned char c, unsigned char m); +void draw_hexS(unsigned char x, unsigned char y, const unsigned short v, unsigned char c, unsigned char m); +void draw_hexW(unsigned char x, unsigned char y, const unsigned long v, unsigned char c, unsigned char m); + +#endif diff --git a/lpctool/testing/flashtool/irq.c b/lpctool/testing/flashtool/irq.c new file mode 100644 index 0000000..be2e6df --- /dev/null +++ b/lpctool/testing/flashtool/irq.c @@ -0,0 +1,43 @@ +#include "lpc2220.hh" +#include "irq.h" + +#define IRQ_MASK 0x00000080 + +static inline unsigned asm_get_cpsr(void) +{ + unsigned long retval; + asm volatile (" mrs %0, cpsr" : "=r" (retval) : /* no inputs */ ); + return retval; +} + +static inline void asm_set_cpsr(unsigned val) +{ + asm volatile (" msr cpsr, %0" : /* no outputs */ : "r" (val) ); +} + +unsigned enableIRQ(void) +{ + unsigned _cpsr; + + _cpsr = asm_get_cpsr(); + asm_set_cpsr(_cpsr & ~IRQ_MASK); + return _cpsr; +} + +unsigned disableIRQ(void) +{ + unsigned _cpsr; + + _cpsr = asm_get_cpsr(); + asm_set_cpsr(_cpsr | IRQ_MASK); + return _cpsr; +} + +unsigned restoreIRQ(unsigned oldCPSR) +{ + unsigned _cpsr; + + _cpsr = asm_get_cpsr(); + asm_set_cpsr((_cpsr & ~IRQ_MASK) | (oldCPSR & IRQ_MASK)); + return _cpsr; +} diff --git a/lpctool/testing/flashtool/lcd.c b/lpctool/testing/flashtool/lcd.c new file mode 100644 index 0000000..9f57b1c --- /dev/null +++ b/lpctool/testing/flashtool/lcd.c @@ -0,0 +1,450 @@ +#include "lpc2220.h" +#include "lcd.h" +#include "fonty.h" +//#include "b.h" + +void pause(unsigned int ptime) +{ + unsigned long xx; + xx = ptime * 750; + while(xx--) + {}; +} + +void clearStatus(void) +{ + draw_block(0, 151, 128, 10, 3, DRAW_ERASE); + timer++; +} + +void drawStatus(char *msg) +{ + draw_block(0, 152, 128, 10, 3, DRAW_PUT); + draw_string(1,152,">>",3,DRAW_XOR); + draw_string(16,152,msg,3,DRAW_XOR); + timer = 0; +} + +void lcd_fill(unsigned char f) +{ + unsigned char x,y; + for(y=0;y<20;y++) + { + LCD_CMD = 0xB0; + LCD_CMD = y; + LCD_CMD = 0x10; + LCD_CMD = 0x00; + for(x=0;x<128;x++) + { + LCD_DATA = f; + LCD_DATA = f; + } + } +} + +void lcd_set(unsigned char s) +{ + if(s == 0) + { + LCD_CMD = 0xA0; // set segment remap (00H mapped to seg0) + LCD_CMD = 0xC8; // set com output scan direction (remapped mode) + } + else + { + LCD_CMD = 0xA1; // set segment remap (7FH mapped to seg0) + LCD_CMD = 0xC0; // set com output scan direction (normal mode) + } +} + +void lcd_init(unsigned char s) +{ + LCD_CMD = 0xE1; // exit power save mode + LCD_CMD = 0xE2; // software reset + pause(0x64); + LCD_CMD = 0xAB; // start internal oscillator + LCD_CMD = 0x27; // set internal regulator resistor ratio (8.1) + LCD_CMD = 0x81; // volume cmd + LCD_CMD = 0x3B; // volume cmd value + LCD_CMD = 0x65; // set DC-DC converter factor (4x) + LCD_CMD = 0x60; // set upper window corner ax cmd + LCD_CMD = 0x1C; // set upper window corner ax value + LCD_CMD = 0x61; // set upper window corner ay cmd + LCD_CMD = 0x0A; // set upper window corner ay value + LCD_CMD = 0x62; // set lower window corner bx cmd + LCD_CMD = 0x75; // set lower window corner bx value + LCD_CMD = 0x63; // set lower window corner by cmd + LCD_CMD = 0x81; // set lower window corner by value + LCD_CMD = 0x90; // set PWM and FRC (4-frames) + LCD_CMD = 0x88; // set white mode frame 2nd and 1st cmd + LCD_CMD = 0x00; // set white mode frame 2nd and 1st value + LCD_CMD = 0x89; // set white mode frame 4th and 3rd cmd + LCD_CMD = 0x00; // set white mode frame 4th and 3rd value + LCD_CMD = 0x8A; // set light gray mode frame 2nd and 1st cmd + LCD_CMD = 0x55; // set light gray mode frame 2nd and 1st value + LCD_CMD = 0x8B; // set light gray mode frame 4th and 3rd cmd + LCD_CMD = 0x55; // set light gray mode frame 4th and 3rd vakue + LCD_CMD = 0x8C; // set dark gray mode frame 2nd and 1st cmd + LCD_CMD = 0x66; // set dark gray mode frame 2nd and 1st value + LCD_CMD = 0x8D; // set dark gray mode frame 4th and 3rd cmd + LCD_CMD = 0x66; // set dark gray mode frame 4th and 3rd vakue + LCD_CMD = 0x8E; // set black mode frame 2nd and 1st cmd + LCD_CMD = 0xAA; // set black mode frame 2nd and 1st value + LCD_CMD = 0x8F; // set black mode frame 4th and 3rd cmd + LCD_CMD = 0xAA; // set black mode frame 4th and 3rd value + + lcd_set(s); + + LCD_CMD = 0x2E; // set power control register (boost on, reg on, buffer off) + + pause(0x64); + + LCD_CMD = 0x2F; // set power control register (boost on, reg on, buffer on) + LCD_CMD = 0xA4; // set entire display on, normal mode) + LCD_CMD = 0xA6; // set normal display mode, inverse = 0xA7 + + + lcd_fill(0x00); + + LCD_CMD = 0xAF; + + set_font(0); +} + +void lcd_enable(unsigned char e) +{ + if(e) + { + LCD_CMD = 0xAF; // set display on + } + else + { + LCD_CMD = 0xAE; // set display off + } +} + + +unsigned char rcubuf[2][128]; +unsigned char drawbuf[2][128]; + +void do_rcu(unsigned char x, unsigned char y, unsigned char l, unsigned char m) +{ + unsigned char q; + + LCD_CMD = 0xB0; + LCD_CMD = (y >> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + q = LCD_DATA; + q = l; + + while(q--) + { + rcubuf[0][q] = LCD_DATA; + rcubuf[1][q] = LCD_DATA; + } + + q = LCD_DATA; + + LCD_CMD = 0xB0; + LCD_CMD = (y >> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + q = l; + + switch(m) + { + case DRAW_PUT: // draw put + while(q--) + { + LCD_DATA = rcubuf[0][q] | drawbuf[0][q]; + LCD_DATA = rcubuf[1][q] | drawbuf[1][q]; + } + break; + case DRAW_XOR: // draw xor + while(q--) + { + LCD_DATA = rcubuf[0][q] ^ drawbuf[0][q]; + LCD_DATA = rcubuf[1][q] ^ drawbuf[1][q]; + } + break; + case DRAW_ERASE: // draw erase + while(q--) + { + LCD_DATA = rcubuf[0][q] & ~drawbuf[0][q]; + LCD_DATA = rcubuf[1][q] & ~drawbuf[1][q]; + } + break; + } +} + +void do_rcuS(unsigned char x, unsigned char y, unsigned char m) +{ + unsigned char q; + + LCD_CMD = 0xB0; + LCD_CMD = (y >> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + q = LCD_DATA; + rcubuf[0][0] = LCD_DATA; + rcubuf[1][0] = LCD_DATA; + + q = LCD_DATA; + + LCD_CMD = 0xB0; + LCD_CMD = (y >> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + switch(m) + { + case 0: // draw put + LCD_DATA = rcubuf[0][0] | drawbuf[0][0]; + LCD_DATA = rcubuf[1][0] | drawbuf[1][0]; + break; + case 1: // draw xor + LCD_DATA = rcubuf[0][0] ^ drawbuf[0][0]; + LCD_DATA = rcubuf[1][0] ^ drawbuf[1][0]; + break; + case 2: // draw erase + LCD_DATA = rcubuf[0][0] & ~drawbuf[0][0]; + LCD_DATA = rcubuf[1][0] & ~drawbuf[1][0]; + break; + } +} + +void draw_block(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char c, unsigned char m) +{ + unsigned char q,s; + unsigned char yy,ss,vv,ww,xx; + unsigned char segm; + + s = y; + + if(h) + { + + + + yy = h; + ss = y >> 3; + vv = y & 0x07; + + ww = yy & 0x07; + + segm = 0xFF; + + xx = 8; + if(yy < 8) + { + segm >>= (8-ww); + xx -= (8-ww); + if(vv > (8-xx)) + { + xx = yy -(vv-(8-xx)); + } + else + { + xx = yy; + } + } + else + { + xx -= vv; + } + + segm <<= vv; + + q = w; + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = segm; + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = segm; + else + drawbuf[1][q] = 0; + } + do_rcu(x,s,w,m); + + yy -= xx; + + while(yy > 8) + { + s += 8; + yy -= 8; + q = w; + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = 0xFF; + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = 0xFF; + else + drawbuf[1][q] = 0; + } + do_rcu(x,s,w,m); + } + + if(yy) + { + s += 8; + q = w; + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = 0xFF >> (8-yy); + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = 0xFF >> (8-yy); + else + drawbuf[1][q] = 0; + } + do_rcu(x,s,w,m); + } + } +} + +void draw_hline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m) +{ + unsigned char p,q; + + q = l; + p = 0x01 << (y & 0x07); + + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = p; + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = p; + else + drawbuf[1][q] = 0; + } + do_rcu(x,y,l,m); +} + +void draw_vline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m) +{ + unsigned char s; + unsigned char yy,ss,vv,ww,xx; + unsigned char segm; + + s = y; + + if(l) + { + + + + yy = l; + ss = y >> 3; + vv = y & 0x07; + + ww = yy & 0x07; + + segm = 0xFF; + + xx = 8; + if(yy < 8) + { + segm >>= (8-ww); + xx -= (8-ww); + if(vv > (8-xx)) + { + xx = yy -(vv-(8-xx)); + } + else + { + xx = yy; + } + } + else + { + xx -= vv; + } + + segm <<= vv; + + if(c & 0x02) + drawbuf[0][0] = segm; + else + drawbuf[0][0] = 0; + + if(c & 0x01) + drawbuf[1][0] = segm; + else + drawbuf[1][0] = 0; + + do_rcuS(x,s,m); + + yy -= xx; + + while(yy > 8) + { + s += 8; + yy -= 8; + if(c & 0x02) + drawbuf[0][0] = 0xFF; + else + drawbuf[0][0] = 0; + + if(c & 0x01) + drawbuf[1][0] = 0xFF; + else + drawbuf[1][0] = 0; + do_rcuS(x,s,m); + } + + if(yy) + { + s += 8; + if(c & 0x02) + drawbuf[0][0] = 0xFF >> (8-yy); + else + drawbuf[0][0] = 0; + + if(c & 0x01) + drawbuf[1][0] = 0xFF >> (8-yy); + else + drawbuf[1][0] = 0; + do_rcuS(x,s,m); + } + } +} + +void draw_rect(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char lw, unsigned char c, unsigned char m) +{ + if(lw) + { + if(lw == 1) + { + draw_hline(x, y, w, c, m); + draw_hline(x, y+h-1, w, c, m); + + draw_vline(x, y+1, h-2, c, m); + draw_vline(x+w-1, y+1, h-2, c, m); + } + else + { + draw_block(x, y, w, lw, c, m); + draw_block(x, y+h-lw, w, lw, c, m); + draw_block(x, y+lw, lw, h-(2*lw), c, m); + draw_block(x+w-lw, y+lw, lw, h-(2*lw), c, m); + } + } +} diff --git a/lpctool/testing/flashtool/lcd.h b/lpctool/testing/flashtool/lcd.h new file mode 100644 index 0000000..9969d5b --- /dev/null +++ b/lpctool/testing/flashtool/lcd.h @@ -0,0 +1,42 @@ +#ifndef LCD_H +#define LCD_H + +// the lcd data & command ports +#define LCD_CMD (*((volatile unsigned char *) 0x81000000)) +#define LCD_DATA (*((volatile unsigned char *) 0x81000001)) + +// drawmodes +#define DRAW_PUT 0 +#define DRAW_XOR 1 +#define DRAW_ERASE 2 +#define DRAW_RAW 10 +#define DRAW_RAW_INV 11 + +#define TIMEOUT 0x00400000 + +struct t_bitmap +{ + unsigned char width; + unsigned char height; + unsigned char mode; + unsigned char *data; +} ; + +extern unsigned long timer; + +struct t_bitmap bitmap; + +void lcd_init(unsigned char s); +void lcd_enable(unsigned char e); + +void do_rcu(unsigned char x, unsigned char y, unsigned char l, unsigned char m); + +void lcd_fill(unsigned char f); +void draw_block(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char c, unsigned char m); +void draw_hline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m); +void draw_vline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m); +void draw_rect(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char lw, unsigned char c, unsigned char m); +void clearStatus(void); +void drawStatus(char *msg); + +#endif diff --git a/lpctool/testing/flashtool/lpc2220.h b/lpctool/testing/flashtool/lpc2220.h new file mode 100644 index 0000000..4c59632 --- /dev/null +++ b/lpctool/testing/flashtool/lpc2220.h @@ -0,0 +1,261 @@ +/********************************************************/ +/* */ +/* philips */ +/* lpc2220 */ +/* */ +/********************************************************/ +#ifndef LPC2220_H +#define LPC2220_H + +/* External Memory Controller (EMC) */ +#define BCFG0 (*((volatile unsigned long *) 0xFFE00000)) +#define BCFG1 (*((volatile unsigned long *) 0xFFE00004)) +#define BCFG2 (*((volatile unsigned long *) 0xFFE00008)) +#define BCFG3 (*((volatile unsigned long *) 0xFFE0000C)) + +/* Vectored Interrupt Controller (VIC) */ +#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000)) +#define VICFIQStatus (*((volatile unsigned long *) 0xFFFFF004)) +#define VICRawIntr (*((volatile unsigned long *) 0xFFFFF008)) +#define VICIntSelect (*((volatile unsigned long *) 0xFFFFF00C)) +#define VICIntEnable (*((volatile unsigned long *) 0xFFFFF010)) +#define VICIntEnClr (*((volatile unsigned long *) 0xFFFFF014)) +#define VICSoftInt (*((volatile unsigned long *) 0xFFFFF018)) +#define VICSoftIntClr (*((volatile unsigned long *) 0xFFFFF01C)) +#define VICProtection (*((volatile unsigned long *) 0xFFFFF020)) +#define VICVectAddr (*((volatile unsigned long *) 0xFFFFF030)) +#define VICDefVectAddr (*((volatile unsigned long *) 0xFFFFF034)) +#define VICVectAddr0 (*((volatile unsigned long *) 0xFFFFF100)) +#define VICVectAddr1 (*((volatile unsigned long *) 0xFFFFF104)) +#define VICVectAddr2 (*((volatile unsigned long *) 0xFFFFF108)) +#define VICVectAddr3 (*((volatile unsigned long *) 0xFFFFF10C)) +#define VICVectAddr4 (*((volatile unsigned long *) 0xFFFFF110)) +#define VICVectAddr5 (*((volatile unsigned long *) 0xFFFFF114)) +#define VICVectAddr6 (*((volatile unsigned long *) 0xFFFFF118)) +#define VICVectAddr7 (*((volatile unsigned long *) 0xFFFFF11C)) +#define VICVectAddr8 (*((volatile unsigned long *) 0xFFFFF120)) +#define VICVectAddr9 (*((volatile unsigned long *) 0xFFFFF124)) +#define VICVectAddr10 (*((volatile unsigned long *) 0xFFFFF128)) +#define VICVectAddr11 (*((volatile unsigned long *) 0xFFFFF12C)) +#define VICVectAddr12 (*((volatile unsigned long *) 0xFFFFF130)) +#define VICVectAddr13 (*((volatile unsigned long *) 0xFFFFF134)) +#define VICVectAddr14 (*((volatile unsigned long *) 0xFFFFF138)) +#define VICVectAddr15 (*((volatile unsigned long *) 0xFFFFF13C)) +#define VICVectCntl0 (*((volatile unsigned long *) 0xFFFFF200)) +#define VICVectCntl1 (*((volatile unsigned long *) 0xFFFFF204)) +#define VICVectCntl2 (*((volatile unsigned long *) 0xFFFFF208)) +#define VICVectCntl3 (*((volatile unsigned long *) 0xFFFFF20C)) +#define VICVectCntl4 (*((volatile unsigned long *) 0xFFFFF210)) +#define VICVectCntl5 (*((volatile unsigned long *) 0xFFFFF214)) +#define VICVectCntl6 (*((volatile unsigned long *) 0xFFFFF218)) +#define VICVectCntl7 (*((volatile unsigned long *) 0xFFFFF21C)) +#define VICVectCntl8 (*((volatile unsigned long *) 0xFFFFF220)) +#define VICVectCntl9 (*((volatile unsigned long *) 0xFFFFF224)) +#define VICVectCntl10 (*((volatile unsigned long *) 0xFFFFF228)) +#define VICVectCntl11 (*((volatile unsigned long *) 0xFFFFF22C)) +#define VICVectCntl12 (*((volatile unsigned long *) 0xFFFFF230)) +#define VICVectCntl13 (*((volatile unsigned long *) 0xFFFFF234)) +#define VICVectCntl14 (*((volatile unsigned long *) 0xFFFFF238)) +#define VICVectCntl15 (*((volatile unsigned long *) 0xFFFFF23C)) + +/* Pin Connect Block */ +#define PINSEL0 (*((volatile unsigned long *) 0xE002C000)) +#define PINSEL1 (*((volatile unsigned long *) 0xE002C004)) +#define PINSEL2 (*((volatile unsigned long *) 0xE002C014)) + +/* General Purpose Input/Output (GPIO) */ +#define IOPIN0 (*((volatile unsigned long *) 0xE0028000)) +#define IOSET0 (*((volatile unsigned long *) 0xE0028004)) +#define IODIR0 (*((volatile unsigned long *) 0xE0028008)) +#define IOCLR0 (*((volatile unsigned long *) 0xE002800C)) +#define IOPIN1 (*((volatile unsigned long *) 0xE0028010)) +#define IOSET1 (*((volatile unsigned long *) 0xE0028014)) +#define IODIR1 (*((volatile unsigned long *) 0xE0028018)) +#define IOCLR1 (*((volatile unsigned long *) 0xE002801C)) +#define IOPIN2 (*((volatile unsigned long *) 0xE0028020)) +#define IOSET2 (*((volatile unsigned long *) 0xE0028024)) +#define IODIR2 (*((volatile unsigned long *) 0xE0028028)) +#define IOCLR2 (*((volatile unsigned long *) 0xE002802C)) +#define IOPIN3 (*((volatile unsigned long *) 0xE0028030)) +#define IOSET3 (*((volatile unsigned long *) 0xE0028034)) +#define IODIR3 (*((volatile unsigned long *) 0xE0028038)) +#define IOCLR3 (*((volatile unsigned long *) 0xE002803C)) + +/* Phase Locked Loop (PLL) */ +#define PLLCON (*((volatile unsigned char *) 0xE01FC080)) +#define PLLCFG (*((volatile unsigned char *) 0xE01FC084)) +#define PLLSTAT (*((volatile unsigned short*) 0xE01FC088)) +#define PLLFEED (*((volatile unsigned char *) 0xE01FC08C)) + +/* VPB Divider */ +#define VPBDIV (*((volatile unsigned char *) 0xE01FC100)) + +/* Power Control */ +#define PCON (*((volatile unsigned char *) 0xE01FC0C0)) +#define PCONP (*((volatile unsigned long *) 0xE01FC0C4)) + +/* External Interrupts */ +#define EXTINT (*((volatile unsigned char *) 0xE01FC140)) +#define EXTWAKE (*((volatile unsigned char *) 0xE01FC144)) +#define EXTMODE (*((volatile unsigned char *) 0xE01FC148)) +#define EXTPOLAR (*((volatile unsigned char *) 0xE01FC14C)) + +/* Timer 0 */ +#define T0IR (*((volatile unsigned long *) 0xE0004000)) +#define T0TCR (*((volatile unsigned long *) 0xE0004004)) +#define T0TC (*((volatile unsigned long *) 0xE0004008)) +#define T0PR (*((volatile unsigned long *) 0xE000400C)) +#define T0PC (*((volatile unsigned long *) 0xE0004010)) +#define T0MCR (*((volatile unsigned long *) 0xE0004014)) +#define T0MR0 (*((volatile unsigned long *) 0xE0004018)) +#define T0MR1 (*((volatile unsigned long *) 0xE000401C)) +#define T0MR2 (*((volatile unsigned long *) 0xE0004020)) +#define T0MR3 (*((volatile unsigned long *) 0xE0004024)) +#define T0CCR (*((volatile unsigned long *) 0xE0004028)) +#define T0CR0 (*((volatile unsigned long *) 0xE000402C)) +#define T0CR1 (*((volatile unsigned long *) 0xE0004030)) +#define T0CR2 (*((volatile unsigned long *) 0xE0004034)) +#define T0CR3 (*((volatile unsigned long *) 0xE0004038)) +#define T0EMR (*((volatile unsigned long *) 0xE000403C)) + +/* Timer 1 */ +#define T1IR (*((volatile unsigned long *) 0xE0008000)) +#define T1TCR (*((volatile unsigned long *) 0xE0008004)) +#define T1TC (*((volatile unsigned long *) 0xE0008008)) +#define T1PR (*((volatile unsigned long *) 0xE000800C)) +#define T1PC (*((volatile unsigned long *) 0xE0008010)) +#define T1MCR (*((volatile unsigned long *) 0xE0008014)) +#define T1MR0 (*((volatile unsigned long *) 0xE0008018)) +#define T1MR1 (*((volatile unsigned long *) 0xE000801C)) +#define T1MR2 (*((volatile unsigned long *) 0xE0008020)) +#define T1MR3 (*((volatile unsigned long *) 0xE0008024)) +#define T1CCR (*((volatile unsigned long *) 0xE0008028)) +#define T1CR0 (*((volatile unsigned long *) 0xE000802C)) +#define T1CR1 (*((volatile unsigned long *) 0xE0008030)) +#define T1CR2 (*((volatile unsigned long *) 0xE0008034)) +#define T1CR3 (*((volatile unsigned long *) 0xE0008038)) +#define T1EMR (*((volatile unsigned long *) 0xE000803C)) + +/* Pulse Width Modulator (PWM) */ +#define PWMIR (*((volatile unsigned long *) 0xE0014000)) +#define PWMTCR (*((volatile unsigned long *) 0xE0014004)) +#define PWMTC (*((volatile unsigned long *) 0xE0014008)) +#define PWMPR (*((volatile unsigned long *) 0xE001400C)) +#define PWMPC (*((volatile unsigned long *) 0xE0014010)) +#define PWMMCR (*((volatile unsigned long *) 0xE0014014)) +#define PWMMR0 (*((volatile unsigned long *) 0xE0014018)) +#define PWMMR1 (*((volatile unsigned long *) 0xE001401C)) +#define PWMMR2 (*((volatile unsigned long *) 0xE0014020)) +#define PWMMR3 (*((volatile unsigned long *) 0xE0014024)) +#define PWMMR4 (*((volatile unsigned long *) 0xE0014040)) +#define PWMMR5 (*((volatile unsigned long *) 0xE0014044)) +#define PWMMR6 (*((volatile unsigned long *) 0xE0014048)) +#define PWMCCR (*((volatile unsigned long *) 0xE0014028)) +#define PWMCR0 (*((volatile unsigned long *) 0xE001402C)) +#define PWMCR1 (*((volatile unsigned long *) 0xE0014030)) +#define PWMCR2 (*((volatile unsigned long *) 0xE0014034)) +#define PWMCR3 (*((volatile unsigned long *) 0xE0014038)) +#define PWMEMR (*((volatile unsigned long *) 0xE001403C)) +#define PWMPCR (*((volatile unsigned long *) 0xE001404C)) +#define PWMLER (*((volatile unsigned long *) 0xE0014050)) + +/* Universal Asynchronous Receiver Transmitter 0 (UART0) */ +#define U0RBR (*((volatile unsigned char *) 0xE000C000)) +#define U0THR (*((volatile unsigned char *) 0xE000C000)) +#define U0IER (*((volatile unsigned char *) 0xE000C004)) +#define U0IIR (*((volatile unsigned char *) 0xE000C008)) +#define U0FCR (*((volatile unsigned char *) 0xE000C008)) +#define U0LCR (*((volatile unsigned char *) 0xE000C00C)) +#define U0MCR (*((volatile unsigned char *) 0xE000C010)) +#define U0LSR (*((volatile unsigned char *) 0xE000C014)) +#define U0MSR (*((volatile unsigned char *) 0xE000C018)) +#define U0SCR (*((volatile unsigned char *) 0xE000C01C)) +#define U0FDR (*((volatile unsigned char *) 0xE000C028)) +#define U0DLL (*((volatile unsigned char *) 0xE000C000)) +#define U0DLM (*((volatile unsigned char *) 0xE000C004)) + +/* Universal Asynchronous Receiver Transmitter 1 (UART1) */ +#define U1RBR (*((volatile unsigned char *) 0xE0010000)) +#define U1THR (*((volatile unsigned char *) 0xE0010000)) +#define U1IER (*((volatile unsigned char *) 0xE0010004)) +#define U1IIR (*((volatile unsigned char *) 0xE0010008)) +#define U1FCR (*((volatile unsigned char *) 0xE0010008)) +#define U1LCR (*((volatile unsigned char *) 0xE001000C)) +#define U1MCR (*((volatile unsigned char *) 0xE0010010)) +#define U1LSR (*((volatile unsigned char *) 0xE0010014)) +#define U1MSR (*((volatile unsigned char *) 0xE0010018)) +#define U1SCR (*((volatile unsigned char *) 0xE001001C)) +#define U1DLL (*((volatile unsigned char *) 0xE0010000)) +#define U1DLM (*((volatile unsigned char *) 0xE0010004)) + +/* I2C Interface */ +#define I2CONSET (*((volatile unsigned char *) 0xE001C000)) +#define I2STAT (*((volatile unsigned char *) 0xE001C004)) +#define I2DAT (*((volatile unsigned char *) 0xE001C008)) +#define I2ADR (*((volatile unsigned char *) 0xE001C00C)) +#define I2SCLH (*((volatile unsigned short*) 0xE001C010)) +#define I2SCLL (*((volatile unsigned short*) 0xE001C014)) +#define I2CONCLR (*((volatile unsigned char *) 0xE001C018)) + +/* SPI0 (Serial Peripheral Interface 0) */ +#define S0SPCR (*((volatile unsigned char *) 0xE0020000)) +#define S0SPSR (*((volatile unsigned char *) 0xE0020004)) +#define S0SPDR (*((volatile unsigned char *) 0xE0020008)) +#define S0SPCCR (*((volatile unsigned char *) 0xE002000C)) +#define S0SPTCR (*((volatile unsigned char *) 0xE0020010)) +#define S0SPTSR (*((volatile unsigned char *) 0xE0020014)) +#define S0SPTOR (*((volatile unsigned char *) 0xE0020018)) +#define S0SPINT (*((volatile unsigned char *) 0xE002001C)) + +/* SPI1 (Serial Peripheral Interface 1) */ +#define S1SPCR (*((volatile unsigned char *) 0xE0030000)) +#define S1SPSR (*((volatile unsigned char *) 0xE0030004)) +#define S1SPDR (*((volatile unsigned char *) 0xE0030008)) +#define S1SPCCR (*((volatile unsigned char *) 0xE003000C)) +#define S1SPTCR (*((volatile unsigned char *) 0xE0030010)) +#define S1SPTSR (*((volatile unsigned char *) 0xE0030014)) +#define S1SPTOR (*((volatile unsigned char *) 0xE0030018)) +#define S1SPINT (*((volatile unsigned char *) 0xE003001C)) + +/* Real Time Clock */ +#define ILR (*((volatile unsigned char *) 0xE0024000)) +#define CTC (*((volatile unsigned short*) 0xE0024004)) +#define CCR (*((volatile unsigned char *) 0xE0024008)) +#define CIIR (*((volatile unsigned char *) 0xE002400C)) +#define AMR (*((volatile unsigned char *) 0xE0024010)) +#define CTIME0 (*((volatile unsigned long *) 0xE0024014)) +#define CTIME1 (*((volatile unsigned long *) 0xE0024018)) +#define CTIME2 (*((volatile unsigned long *) 0xE002401C)) +#define SEC (*((volatile unsigned char *) 0xE0024020)) +#define MIN (*((volatile unsigned char *) 0xE0024024)) +#define HOUR (*((volatile unsigned char *) 0xE0024028)) +#define DOM (*((volatile unsigned char *) 0xE002402C)) +#define DOW (*((volatile unsigned char *) 0xE0024030)) +#define DOY (*((volatile unsigned short*) 0xE0024034)) +#define MONTH (*((volatile unsigned char *) 0xE0024038)) +#define YEAR (*((volatile unsigned short*) 0xE002403C)) +#define ALSEC (*((volatile unsigned char *) 0xE0024060)) +#define ALMIN (*((volatile unsigned char *) 0xE0024064)) +#define ALHOUR (*((volatile unsigned char *) 0xE0024068)) +#define ALDOM (*((volatile unsigned char *) 0xE002406C)) +#define ALDOW (*((volatile unsigned char *) 0xE0024070)) +#define ALDOY (*((volatile unsigned short*) 0xE0024074)) +#define ALMON (*((volatile unsigned char *) 0xE0024078)) +#define ALYEAR (*((volatile unsigned short*) 0xE002407C)) +#define PREINT (*((volatile unsigned short*) 0xE0024080)) +#define PREFRAC (*((volatile unsigned short*) 0xE0024084)) + +/* A/D Converter */ +#define ADCR (*((volatile unsigned long *) 0xE0034000)) +#define ADDR (*((volatile unsigned long *) 0xE0034004)) + +/* Watchdog */ +#define WDMOD (*((volatile unsigned char *) 0xE0000000)) +#define WDTC (*((volatile unsigned long *) 0xE0000004)) +#define WDFEED (*((volatile unsigned char *) 0xE0000008)) +#define WDTV (*((volatile unsigned long *) 0xE000000C)) + +/* Memory Mapping control register */ +#define MEMMAP (*((volatile unsigned long *) 0xE01FC040)) + +#endif /* __ASM_ARCH_HARDWARE_H */ diff --git a/lpctool/testing/flashtool/lpc2220.ld b/lpctool/testing/flashtool/lpc2220.ld new file mode 100644 index 0000000..c331351 --- /dev/null +++ b/lpctool/testing/flashtool/lpc2220.ld @@ -0,0 +1,60 @@ +/* identify the Entry Point */ + +ENTRY(Reset_Handler) + +/* specify the LPC2106 memory areas */ + +MEMORY +{ + flash : ORIGIN = 0x00000000, LENGTH = 128K /* free FLASH EPROM area */ + ram : ORIGIN = 0x40000200, LENGTH = 64K - 0x200 /* free RAM area */ +} + +/* define a global symbol _stack_end */ + +_stack_end = 0x4000FEDC; + +/* now define the output sections */ + +SECTIONS +{ + startup : + { + *(.startup) + } >ram /* the startup code goes into FLASH */ + + .text : /* collect all sections that should go into FLASH after startup */ + { + *(.text) /* all .text sections (code) */ + *(.rodata) /* all .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* all .glue_7 sections (no idea what these are) */ + *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ + _etext = .; /* define a global symbol _etext just after the last code byte */ + } >ram /* put all the above into FLASH */ + + .data : /* collect all initialized .data sections that go into RAM */ + { + _data = .; /* create a global symbol marking the start of the .data section */ + *(.data) /* all .data sections */ + _edata = .; /* define a global symbol marking the end of the .data section */ + } >ram /* put all the above into RAM (but load the LMA copy into FLASH) */ + + .bss : /* collect all uninitialized .bss sections that go into RAM */ + { + _bss_start = .; /* define a global symbol marking the start of the .bss section */ + *(.bss) /* all .bss sections */ + } >ram /* put all the above in RAM (it will be cleared in the startup code */ + + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + _bss_end = . ; /* define a global symbol marking the end of the .bss section */ + + _end = .; /* define a global symbol marking the end of application RAM */ +} + +PROVIDE( BCFG0 = 0xFFE00000); +PROVIDE( BCFG1 = 0xFFE00004); +PROVIDE( BCFG2 = 0xFFE00008); +PROVIDE( PINSEL0 = 0xE002C000); +PROVIDE( PINSEL2 = 0xE002C014); +PROVIDE( IO0PIN = 0xE0028000); diff --git a/lpctool/testing/flashtool/lpc2220_rom.ld b/lpctool/testing/flashtool/lpc2220_rom.ld new file mode 100644 index 0000000..557bbf7 --- /dev/null +++ b/lpctool/testing/flashtool/lpc2220_rom.ld @@ -0,0 +1,61 @@ +/* identify the Entry Point */ + +ENTRY(_startup) + +/* specify the LPC2106 memory areas */ + +MEMORY +{ + flash : ORIGIN = 0x80000000, LENGTH = 1M /* FLASH ROM */ + ram : ORIGIN = 0x40000200, LENGTH = 64K - 0x220 /* free RAM area */ +} + +/* define a global symbol _stack_end */ + +_stack_end = 0x4000FEDC; + +/* now define the output sections */ + +SECTIONS +{ + . = 0; /* set location counter to address zero */ + + startup : + { + *(.startup) + } >flash /* the startup code goes into FLASH */ + + .text : /* collect all sections that should go into FLASH after startup */ + { + *(.text) /* all .text sections (code) */ + *(.rodata) /* all .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* all .glue_7 sections (no idea what these are) */ + *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ + _etext = .; /* define a global symbol _etext just after the last code byte */ + } >flash /* put all the above into FLASH */ + + .data : /* collect all initialized .data sections that go into RAM */ + { + _data = .; /* create a global symbol marking the start of the .data section */ + *(.data) /* all .data sections */ + _edata = .; /* define a global symbol marking the end of the .data section */ + } >ram AT >flash /* put all the above into RAM (but load the LMA copy into FLASH) */ + + .bss : /* collect all uninitialized .bss sections that go into RAM */ + { + _bss_start = .; /* define a global symbol marking the start of the .bss section */ + *(.bss) /* all .bss sections */ + } >ram /* put all the above in RAM (it will be cleared in the startup code */ + + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + _bss_end = . ; /* define a global symbol marking the end of the .bss section */ +} + _end = .; /* define a global symbol marking the end of application RAM */ + +PROVIDE( BCFG0 = 0xFFE00000); +PROVIDE( BCFG1 = 0xFFE00004); +PROVIDE( BCFG2 = 0xFFE00008); +PROVIDE( PINSEL0 = 0xE002C000); +PROVIDE( PINSEL2 = 0xE002C014); +PROVIDE( IO0PIN = 0xE0028000); diff --git a/lpctool/testing/flashtool/ramtool.c b/lpctool/testing/flashtool/ramtool.c new file mode 100644 index 0000000..e23b70b --- /dev/null +++ b/lpctool/testing/flashtool/ramtool.c @@ -0,0 +1,368 @@ +void IRQ_Routine (void) __attribute__ ((interrupt("IRQ"))); +void FIQ_Routine (void) __attribute__ ((interrupt("FIQ"))); +void SWI_Routine (void) __attribute__ ((interrupt("SWI"))); +void UNDEF_Routine (void) __attribute__ ((interrupt("UNDEF"))); + +typedef volatile unsigned int *reg32_t; + + +#include "lpc2220.h" +#include "serial.h" +#include "flash.h" +#include "lcd.h" +#include "../toolcmd.h" +#include "fonty.h" + +union +{ + unsigned long wbuf[128]; + unsigned short sbuf[256]; + unsigned char bbuf[512]; +} buf; + +unsigned long checksum; +unsigned short count; +unsigned long adr; +unsigned long numBytes; + +void putHN(unsigned char pos, unsigned long hn) +{ + draw_string(33,pos,"0x",3,DRAW_PUT); + draw_hexW(45,pos,hn,3,DRAW_PUT); +} + +void putInfoVal(unsigned char pos, char *name, unsigned long val) +{ + draw_block(0, pos, 128, 8, 3, DRAW_ERASE); + + draw_string(0,pos,name,3,DRAW_PUT); + putHN(pos, val); +} + +void ACK(void) +{ + serial_puts(ACKTOKEN); +} + +void BACK(void) +{ + serial_puts(BACKTOKEN); +} + +void NACK(void) +{ + serial_puts(NACKTOKEN); +} + +int receiveBuf(void) +{ + unsigned long ccheck; + unsigned short cnt, cnt2, cnt3; + + cnt = count<<2; + + if(cnt > 512) + return 0; + + checksum = 0; + ccheck = 0; + cnt2 = 0; + +#define XFERSIZE 16 + + while(cnt >= XFERSIZE) + { + cnt3=XFERSIZE; + while(cnt3--) + { + buf.bbuf[cnt2] = serial_getc(); + checksum += buf.bbuf[cnt2++]; + } + BACK(); + cnt -= XFERSIZE; + } + + if(cnt) + { + while(cnt--) + { + buf.bbuf[cnt2] = serial_getc(); + checksum += buf.bbuf[cnt2++]; + } + BACK(); + } + + ccheck = serial_getc() << 24; + ccheck += serial_getc() << 16; + ccheck += serial_getc() << 8; + ccheck += serial_getc(); + + if(ccheck == checksum) + { + return 1; + } + drawStatus("Wrong Checksum"); + + return 0; +} + +int main(void) +{ + unsigned char i; + unsigned char counter; + + count = 0; + adr = 0x00000000; + timer = TIMEOUT+1; + numBytes = 0; + + lcd_init(0); + + IODIR0|=0x10; + IOCLR0=0x10; + + serial_init(); + + set_font(1); +#ifdef RESIDENT + draw_string(0, 0,">> FlashTool V0.2-r",3,DRAW_PUT); +#else + draw_string(0, 0,">> FlashTool V0.2",3,DRAW_PUT); +#endif + set_font(0); + draw_string(0,14,"This tool is licensed under",3,DRAW_PUT); + draw_string(0,22,"the GNU GPL 3 or later",3,DRAW_PUT); + draw_string(0,34,"(c) 2007 Ch. Klippel",3,DRAW_PUT); + draw_string(0,42,"",3,DRAW_PUT); + + drawStatus("FlashTool ready!"); + + adr = 0x00000000; + while (1) + { + i = serial_getc(); + + if (i) // misses 0x00 ! + { + counter += 10; + if ( counter > 100) + counter = 50; + + putInfoVal(counter, "i:", i); + } + + if(i==HELO_CMD) + { + serial_puts(HELOTOKEN); + drawStatus("Sent HELO"); + } + else if(i==BULKENABLE_CMD) + { + putInfoVal(80, "Bulk:", 1); + if((adr & 0xFF000000) == 0x80000000 || (adr & 0xFF000000) == 0x82000000) + { + prepareBulk(adr); + drawStatus("Enabled bulk write"); + draw_string(100,80,ACKTOKEN,3,DRAW_PUT); + ACK(); + } + else + { + draw_string(100,80,NACKTOKEN,3,DRAW_PUT); + NACK(); + } + } + else if(i==SKIP_CMD) + { + adr += (serial_getc() << 16); + adr += serial_getc(); + ACK(); + } + else if(i==BULKDISABLE_CMD) + { + putInfoVal(80, "Bulk:", 0); + if((adr & 0xFF000000) == 0x80000000 || (adr & 0xFF000000) == 0x82000000) + { + endBulk(adr); + drawStatus("Disabled bulk write"); + draw_string(100,80,ACKTOKEN,3,DRAW_PUT); + ACK(); + } + else + { + draw_string(100,80,NACKTOKEN,3,DRAW_PUT); + NACK(); + } + } + else if(i==SETADR_CMD) + { + adr = serial_getc() << 24; + adr += serial_getc() << 16; + adr += serial_getc() << 8; + adr += serial_getc(); + + putInfoVal(72, "Addr:", adr); + + if((adr & 0xFF000000) == 0x40000000 || (adr & 0xFF000000) == 0x80000000 || (adr & 0xFF000000) == 0x82000000) + { + drawStatus("Address changed"); + draw_string(100,72,ACKTOKEN,3,DRAW_PUT); + ACK(); + } + else + { + draw_string(100,72,NACKTOKEN,3,DRAW_PUT); + adr = 0x00000000; + NACK(); + } + } + else if(i==FILLBUF_CMD) + { + count = serial_getc(); + putInfoVal(88, "Buf:", count<<2); + if(count > 0 && count <= 128) + { + if(receiveBuf()) + { + ACK(); + } + else + { + goto fail_f; + } + } + else + { +fail_f: + draw_string(100,88,NACKTOKEN,3,DRAW_PUT); + count = 0; + NACK(); + } + } + else if(i==WRITE_CMD) + { + putInfoVal(96, "Write:", adr); + i = serial_getc(); + if(i==WRITEGO_CMD && count > 0) + { + if(writeBulk((unsigned long) &buf.bbuf, adr, count<<1) == 0) + { + adr += (count<<2); + ACK(); + } + else + { + draw_string(100,96,NACKTOKEN,3,DRAW_PUT); + NACK(); + } + } + } + else if(i==SECTERASE_CMD) + { + + drawStatus("Erasing Flash Sector"); + if(eraseSectorAt(adr) == 0) + { + drawStatus("Erased Flash Sector"); + ACK(); + } + else + { + drawStatus("Erase Sector FAILED!!"); + NACK(); + } + } + else if(i==FULLERASE_CMD) + { + unsigned char w; + w = 0xFF; + if((adr & 0xFF000000) == 0x82000000) + { + drawStatus("Erasing Flash #1"); + w = 1; + } + else + { + drawStatus("Erasing Flash #0"); + w = 0; + } + if(eraseFlash(w) == 0) + { + if(w==1) + { + drawStatus("Erased Flash #1"); + } + else if(w==0) + { + drawStatus("Erased Flash #0"); + } + ACK(); + } + else + { + if(w) + { + drawStatus("Flash #1 Erase FAILED!!"); + } + else + { + drawStatus("Flash #0 Erase FAILED!!"); + } + NACK(); + } + } + else if(i==SETNUMBYTES_CMD) + { + numBytes = serial_getc() << 24; + numBytes += serial_getc() << 16; + numBytes += serial_getc() << 8; + numBytes += serial_getc(); + putInfoVal(104, "NumB:", numBytes); + if(numBytes <= 0x00100000) + { + draw_string(100,104,ACKTOKEN,3,DRAW_PUT); + ACK(); + } + else + { + draw_string(100,104,NACKTOKEN,3,DRAW_PUT); + NACK(); + } + } + else if(i==READ_CMD) + { + for(adr = 0x40000200; adr < 0x40000210; adr+=4) + { + putHexW((unsigned long)(*(volatile unsigned long *)(adr))); + serial_putc('\n'); + } + for(adr = 0x80000000; adr < 0x80000010; adr+=4) + { + putHexW((unsigned long)(*(volatile unsigned long *)(adr))); + serial_putc('\n'); + } + } + } + return 0; +} + +/* Stubs for various interrupts (may be replaced later) */ +/* ---------------------------------------------------- */ + +void IRQ_Routine (void) { + while (1) ; +} + +void FIQ_Routine (void) { + while (1) ; +} + + +void SWI_Routine (void) { + while (1) ; +} + + +void UNDEF_Routine (void) { + while (1) ; +} diff --git a/lpctool/testing/flashtool/serial.c b/lpctool/testing/flashtool/serial.c new file mode 100644 index 0000000..8d9cf65 --- /dev/null +++ b/lpctool/testing/flashtool/serial.c @@ -0,0 +1,247 @@ +/* + * minor changes (c) 2007 ch.klippel + * + * (C) Copyright 2004 + * DAVE Srl + * http://www.dave-tech.it + * http://www.wawnet.biz + * mailto:info@wawnet.biz + * + * (C) Copyright 2002-2004 + * Wolfgang Denk, DENX Software Engineering, + * + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH + * Marius Groeger + * + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH + * Alex Zuepke + * + * Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "lpc2220.h" +#include "serial.h" +#include "lcd.h" +#include "../baudrate.h" + +unsigned long timer; + + +/* flush serial input queue. returns 0 on success or negative error + * number otherwise + */ +int serial_flush_input(void) +{ + volatile unsigned int tmp; + + /* keep on reading as long as the receiver is not empty */ + while(RX_DATA(U0LSR)) { + tmp = GET_CHAR(U0RBR); + } + + return 0; +} + + +/* flush output queue. returns 0 on success or negative error number + * otherwise + */ +int serial_flush_output(void) +{ + /* wait until the transmitter is no longer busy */ + while(TX_READY(U0LSR)==0) { + } + + return 0; +} + + +void serial_setbrg (unsigned int baudrate) +{ + + /* get correct divisor */ + U0LCR = 0x83; + + switch(baudrate) { + + case 75: + U0DLL = 161; + U0DLM = 1; + U0FDR = (1 << 4) + 14; + break; + + case 150: + U0DLL = 195; + U0DLM = 0; + U0FDR = (1 << 4) + 15; + break; + + case 300: + U0DLL = 184; + U0DLM = 0; + U0FDR = (2 << 4) + 15; + break; + + case 600: + U0DLL = 156; + U0DLM = 0; + U0FDR = (1 << 4) + 4; + break; + + case 1200: + U0DLL = 130; + U0DLM = 0; + U0FDR = (7 << 4) + 14; + break; + + case 2400: + U0DLL = 180; + U0DLM = 0; + U0FDR = (12 << 4) + 1; + break; + + case 4800: + U0DLL = 90; + U0DLM = 0; + U0FDR = (1 << 4) + 4; + break; + + case 9600: + U0DLL = 23; + U0DLM = 0; + U0FDR = (8 << 4) + 9; + break; + + case 19200: + U0DLL = 11; + U0DLM = 0; + U0FDR = (9 << 4) + 11; + break; + + case 38400: + U0DLL = 5; + U0DLM = 0; + U0FDR = (9 << 4) + 13; + break; + + case 57600: + U0DLL = 6; + U0DLM = 0; + U0FDR = (14 << 4) + 5; + break; + + case 115200: + U0DLL = 3; + U0DLM = 0; + U0FDR = (14 << 4) + 5; + break; + } + U0LCR = 0x03; + + serial_flush_output(); + serial_flush_input(); +} + + +/* + * Initialise the serial port with the given baudrate. The settings + * are always 8 data bits, no parity, 1 stop bit, no start bits. + * + */ +int serial_init (void) +{ + PINSEL0=0x05; // pin select -> tx, rx + serial_setbrg (TOOLBAUD); + U0FCR = 0x07; // enable fifo + timer = TIMEOUT+1; + return (0); +} + + +/* + * Output a single byte to the serial port. + */ +void serial_putc (const char c) +{ + /* wait for room in the transmit FIFO */ + while(TX_READY(U0LSR)==0); + + PUT_CHAR(U0THR,c); +} + +/* + * Read a single byte from the serial port. Returns 1 on success, 0 + * otherwise. When the function is succesfull, the character read is + * written into its argument c. + */ +int serial_tstc (void) +{ + return (RX_DATA(U0LSR)); +} + +/* + * Read a single byte from the serial port. Returns 1 on success, 0 + * otherwise. When the function is succesfull, the character read is + * written into its argument c. + */ + +int serial_getc (void) +{ + while(((U0LSR) & USRRxData) <= 0) + { + if(timer == TIMEOUT) + { + clearStatus(); + timer++; + } + else if(timer < TIMEOUT) + { + timer++; + } + } + return (U0RBR); +} + +void serial_puts (const char *s) +{ + while (*s != 0) { + serial_putc (*s++); + } +} + +const char hval[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; + +void putHexC(const unsigned char v) +{ + serial_putc(hval[v>>4]); + serial_putc(hval[v & 0x0F]); +} + +void putHexS(const unsigned short v) +{ + putHexC(v >> 8); + putHexC(v & 0xFF); +} + +void putHexW(const unsigned long v) +{ + putHexS(v >> 16); + putHexS(v & 0xFFFF); +} diff --git a/lpctool/testing/flashtool/serial.h b/lpctool/testing/flashtool/serial.h new file mode 100644 index 0000000..d49e396 --- /dev/null +++ b/lpctool/testing/flashtool/serial.h @@ -0,0 +1,24 @@ +#ifndef BOOP_SERIAL_H +#define BOOP_SERIAL_H + +#define USRRxData (1 << 0) +#define USRTxHoldEmpty (1 << 6) +#define GET_CHAR(p) p +#define PUT_CHAR(p,c) (p= (unsigned )(c)) +#define TX_READY(s) ((s) & USRTxHoldEmpty) +#define RX_DATA(s) ((s) & USRRxData) + +int serial_flush_input(void); +int serial_flush_output(void); +void serial_setbrg (unsigned int baudrate); +int serial_init (void); +void serial_putc (const char c); +int serial_tstc (void); +int serial_getc (void); +void serial_puts (const char *s); + +void putHexC(const unsigned char v); +void putHexS(const unsigned short v); +void putHexW(const unsigned long v); + +#endif /* BOOP_SERIAL_H */ diff --git a/lpctool/testing/infohelper.c b/lpctool/testing/infohelper.c new file mode 100644 index 0000000..0240548 --- /dev/null +++ b/lpctool/testing/infohelper.c @@ -0,0 +1,104 @@ +#include + +#include "infohelper.h" + +char verbosity; + +int printError(char *err) +{ + printf("ERROR: %s\n",err); + return 0; +} + +int printErrorS(char *err, char *xtra) +{ + if(xtra) + printf("ERROR: %s %s\n", err, xtra); + else + printf("ERROR: %s\n", err); + return 0; +} + +int printInfoS(unsigned char level, char *msg, char *xtra) +{ + if(level <= verbosity) + { + if(xtra) + printf("Info : %s %s\n", msg, xtra); + else + printf("Info : %s\n", msg); + return 1; + } + return 0; +} + + +int printInfoC(unsigned char level, char *msg, char xtra) +{ + if(level <= verbosity) + { + if(xtra) + printf("Info : %s %c\n", msg, xtra); + else + printf("Info : %s\n", msg); + return 1; + } + return 0; +} + + + +int printInfoH(unsigned char level, char *msg, unsigned long val) +{ + if(level <= verbosity) + { + printf("Info : %s 0x%08lX\n", msg, val); + return 1; + } + return 0; +} + +int printInfoU(unsigned char level, char *msg, unsigned long val) +{ + if(level <= verbosity) + { + printf("Info : %s %li\n", msg, val); + return 1; + } + return 0; +} + +const char heartbeat[] = { ".oOo" }; + +int printProgress(unsigned char level, char *msg, float cval, float maxval) +{ + unsigned int cur, cnt; + + static char beat = 0; + + if(level <= verbosity) + { + cur = (35 / maxval) * cval; + + cnt = 35-cur; + + printf("Progress: ["); + + while(cur--) + printf("*"); + + if(cnt) + printf("%c",heartbeat[beat]); + else + printf("*"); + + while(cnt--) + printf(" "); + + printf("\b]\r"); + fflush(stdout); + beat++; + beat &= 0x03; + } +} + diff --git a/lpctool/testing/infohelper.h b/lpctool/testing/infohelper.h new file mode 100644 index 0000000..68c7193 --- /dev/null +++ b/lpctool/testing/infohelper.h @@ -0,0 +1,14 @@ +#ifndef TOOL_INFOHELPER +#define TOOL_INFOHELPER + +extern char verbosity; + +int printError(char *err); +int printErrorS(char *err, char *xtra); +int printInfoS(unsigned char level, char *msg, char *xtra); +int printInfoC(unsigned char level, char *msg, char xtra); +int printInfoH(unsigned char level, char *msg, unsigned long val); +int printInfoU(unsigned char level, char *msg, unsigned long val); +int printProgress(unsigned char level, char *msg, float cval, float maxval); + +#endif diff --git a/lpctool/testing/lpctool.c b/lpctool/testing/lpctool.c new file mode 100644 index 0000000..027104f --- /dev/null +++ b/lpctool/testing/lpctool.c @@ -0,0 +1,492 @@ +#include "infohelper.h" +#include "lpctool_serial.h" +#include "bootcom.h" +#include "toolcom.h" + +#define VERSION_MAJOR 0 +#define VERSION_MINOR 9 + +#include +#include +#include +#include +#include +#include +#include + +unsigned long radr, f0adr, f1adr, gadr; + +void printHeader(void) +{ + printf("\nlpctool V%i.%i\n\n", VERSION_MAJOR, VERSION_MINOR); + printf("This Software is free Software under GNU GPL 3 or later\n"); + printf("(c) 2007 Ch. Klippel \n\n"); +} + +void printUsage(void) +{ + printf("usage: lpctool [-d NAME] [-i] [-r [NAME]] [-R ADDRESS] [-X [ADDRESS]] [-a [NAME] [-A ADRDESS]] [-e] [-b [NAME] [-B ADDRESS]] [-E] [-s] [-S] [-c] [-C] [-v] [-V]\n\n"); + printf(" -d NAME specify serial device, default is /dev/ttyS0\n"); + printf(" -i use compiled-in flash-tool instead of external ram image file\n"); + printf(" -r NAME specify file for ram, default is ramtool.bin\n"); + printf(" -R ADDRESS optionally specifies the start-address to load into ram\n"); + printf(" default is 0x40000200 - must be specified in hex\n"); + printf(" -X ADDRESS set the execution address for the uploaded ram image\n"); + printf(" defualt is 0x40000200, omiting the address disables execution\n"); + printf(" -a NAME specify file for flash #0, default is flash0.bin\n"); + printf(" -A ADDRESS optionally specifies the start-address to load into flash #0\n"); + printf(" default is 0x80000000 - must be specified in hex\n"); + printf(" -e completely erase the first flash before writing\n"); + printf(" default is no erase\n"); + printf(" -b NAME specify file for flash #1, default is flash1.bin\n"); + printf(" -B ADDRESS optionally specifies the start-address to load into flash #1\n"); + printf(" default is 0x82000000 - must be specified in hex\n"); + printf(" -E completely erase the second flash before writing\n"); + printf(" defualt is no erase\n"); + printf(" -S only erase the first sector in flash before writing\n"); + printf(" this is a lot faster if only the first sector is used\n"); + printf(" -c write flash0 in chunk mode instead of write-all\n"); + printf(" -C write flash1 in chunk mode instead of write-all\n"); + printf(" in chunk mode, parts with 4 consectuive 0xFFFFFFFF or more\n"); + printf(" in the image are skipped. speeds upload when the image has\n"); + printf(" gaps. defualt is off\n"); + printf(" -N do not reset the device after uploading to flash\n"); + printf(" by default the device gets reset after upload\n"); + printf(" -? print this help\n"); + printf(" -v print version\n"); + printf(" -V be more verbose\n"); + printf("\n"); + printf("at least -r or -i must be given to be usefull. everything in [] is optional\n"); + printf("examples:\n"); + printf("\n"); + printf("to just load ramtool.bin, starting at 0x40000200, using serial device /dev/ttyS0 :\n"); + printf("lpcload -r\n\n"); + printf("to do the same, but using serial device /dev/ttyS1 instead :\n"); + printf("lpcload -r -d /dev/ttyS1\n\n"); + printf("using the file image.bin as source for the ram, use /dev/ttyS1 as serial device :\n"); + printf("lpcload -r image.bin -d /dev/ttyS1\n"); +} + +unsigned long parseHex(char *buf) +{ + unsigned char cnt; + unsigned long adr; + + cnt = 0; + adr = 0; + + while(buf[cnt]) + { + adr <<= 4; + if(buf[cnt] >= '0' && buf[cnt] <= '9') + { + adr += (buf[cnt] - '0'); + } + else if(buf[cnt] >= 'A' && buf[cnt] <= 'F') + { + adr += (buf[cnt] - 'A' + 10); + } + else if(buf[cnt] >= 'a' && buf[cnt] <= 'f') + { + adr += (buf[cnt] - 'a' + 10); + } + else if(buf[cnt] == 'x' || buf[cnt] == 'X') + { + adr = 0; + } + else + { + } + cnt++; + } + return adr; +} + +const char hval[] = { "0123456789ABCDEF" }; + +void printHexC(unsigned char num) +{ + printf("%c%c", hval[(num&0xF0)>>4], hval[num&0x0F]); +} + +void printHexS(unsigned short num) +{ + printHexC((num & 0xFF00) >> 8); + printHexC(num & 0x00FF); +} + +void printHexW(unsigned long num) +{ + printHexS((num & 0xFFFF0000) >> 16); + printHexS(num & 0x0000FFFF); +} +/* +void enterBootLD(void) +{ + setDTR(1); + usleep(10); + setRTS(1); + usleep(100); + setRTS(0); + usleep(10); + setDTR(0); + usleep(100); +} + +void resetFB(void) +{ + setRTS(1); + usleep(100); + setRTS(0); +} +*/ + +// eINT1 low on RESET to enter bootloader +void enterBootLD(void) +{ + setRTS(1); + usleep(1000); + setDTR(1); + usleep(1000); + setDTR(0); + usleep(1000); + setRTS(0); + usleep(1000); +} + +void resetFB(void) +{ + setDTR(1); + usleep(100); + setDTR(0); +} + +int main(int argc,char **argv) +{ + char sname[256]; + char rname[256]; + char f0name[256]; + char f1name[256]; + unsigned char i, cmd; + unsigned int uflags; + int fd; + + sprintf(sname,"/dev/ttyS0"); + sprintf(rname,"ramtool.bin"); + sprintf(f0name,"flash0.bin"); + sprintf(f1name,"flash1.bin"); + + verbosity = 0; + uflags = 0; + + radr = 0x40000200; + f0adr = 0x80000000; + f1adr = 0x82000000; + gadr = radr; + + printHeader(); + + for(i=1;i i+1) && (argv[i+1][0] != '-')) + { + strncpy(sname,argv[++i],256); + printInfoS(1,"using serial device",sname); + } + else + { + printError("Error in device argument"); + goto bailout; + } + break; + case 'r': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + strncpy(rname,argv[++i],256); + printInfoS(1,"using ram image",rname); + } + uflags |= 0x01; + break; + case 'R': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + radr = parseHex(argv[++i]); + printInfoH(1,"loading ram @",radr); + } + else + printInfoH(1,"used -R but no address given, using default", radr); + break; + case 'a': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + strncpy(f0name,argv[++i],256); + printInfoS(1,"using flash #0 image",f0name); + } + uflags |= 0x02; + break; + case 'A': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + f0adr = parseHex(argv[++i]); + printInfoH(1,"setting address for flash #0 @",f0adr); + } + else + printInfoH(1,"used -A but no address given, using default",f0adr); + break; + case 'b': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + strncpy(f1name,argv[++i],256); + printInfoS(1,"using flash #1 image",f1name); + } + uflags |= 0x04; + break; + case 'B': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + f1adr = parseHex(argv[++i]); + printInfoH(1,"setting address for flash #1 @",f1adr); + } + else + printInfoH(1,"used -B but no address given, using default",f1adr); + break; + case 'X': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + gadr = parseHex(argv[++i]); + printInfoH(1,"setting ram execute address @",gadr); + uflags |= 0x08; + } + else + printInfoS(1,"disabling auto-run",0); + break; + case 'e': + printInfoS(1,"erasing flash #0 before write",0); + uflags |= 0x10; + break; + case 'E': + printInfoS(1,"erasing flash #1 before write",0); + uflags |= 0x20; + break; + case 'S': + printInfoS(1,"only erasing start sector",0); + uflags |= 0x40; + break; + case 's': + printInfoS(1,"auto-erasing sectors as needed",0); + uflags |= 0x80; + break; + case 'N': + printInfoS(1,"don't reset after flash upload is done",0); + uflags |= 0x100; + break; + case 'c': + printInfoS(1,"using chunk mode for flash #0",0); + uflags |= 0x200; + break; + case 'C': + printInfoS(1,"using chunk mode for flash #1",0); + uflags |= 0x400; + break; + case 'i': + uflags |= 0x800; + break; + default: + goto bailout; + } + } + else + { +bailout: + printUsage(); + goto end; + } + } + + if(!uflags) + { + printUsage(); + printInfoS(0,"\nnothing to do!",0); + goto end; + } + + printInfoS(2,"opening serial device",sname); + if(openSerial(sname) <= 0) + { + printError("Error opening serial device"); + goto end; + } + + if((uflags & 0x01) || (uflags & 0x800)) + { + if(!(uflags & 0x800)) + { + printInfoS(2,"opening ram image",rname); + fd = open(rname,O_RDONLY); + if(fd < 0) + { + printErrorS("can't open",rname); + goto end; + } + } + else + { + fd = 0; + } + + #if TOOLBAUD <= 38400 + printInfoS(2,"wait for buggy serial ports",0); + setRTS(0); + usleep(100000); + #endif + + printInfoS(2,"reset into bootmode",0); + enterBootLD(); + + printInfoS(2,"opening bootloader",0); + if(!openBootLoader(10000)) + { + printError("Error opening BootLoader"); + goto end; + } + + printInfoS(2,"unlocking bootloader",0); + if(!unlockBootLoader()) + { + printError("Error unlocking BootLoader"); + goto end; + } + if(!(uflags & 0x800)) + { + printInfoS(1,"uploading ram image",rname); + } + else + { + printInfoS(1,"uploading compiled-in ram image",0); + } + if(uploadRAM(fd, radr)) + { + printInfoS(1,"ram uploaded",0); + if(!(uflags&0x08)) + { + printInfoH(1,"executing code at ram address",gadr); + if(!goBootLoader(gadr)) + { + printError("Error starting from ram"); + goto end; + } + printInfoH(2,"code execution started",gadr); + } + } + if(fd) + { + close(fd); + } + } + + //~ reconfSerial(TOOLBAUD, 0, 5); + + if(uflags & 0x06) + { + printInfoS(2,"opening ram tool",0); + if(openRamTool()) + printInfoS(2,"opened ramtool",0); + else + goto end; + + if(uflags & 0x02) + { + printInfoS(2,"opening flash0 image",f0name); + fd = open(f0name,O_RDONLY); + if(fd < 0) + { + printErrorS("cant open",f0name); + goto end; + } + printInfoS(1,"uploading flash0 image",f0name); + if(uflags & 0x200) + { + if(uploadChunks(fd, f0adr, (uflags & 0x50))) + printInfoS(1,"flash #0 uploaded",0); + else + goto end; + } + else + { + if(uploadFlash(fd, f0adr, (uflags & 0x50))) + printInfoS(1,"flash #0 uploaded",0); + else + goto end; + } + + close(fd); + } + + + + if(uflags & 0x04) + { + printInfoS(2,"opening flash1 image",f1name); + fd = open(f1name,O_RDONLY); + if(fd < 0) + { + printErrorS("cant open",f1name); + goto end; + } + printInfoS(1,"uploading flash1 image",f1name); + + if(uflags & 0x400) + { + if(uploadChunks(fd, f1adr, (uflags & 0x60))) + printInfoS(1,"flash #1 uploaded",0); + else + goto end; + } + else + { + if(uploadFlash(fd, f1adr, (uflags & 0x60))) + printInfoS(1,"flash #1 uploaded",0); + else + goto end; + } + close(fd); + } + + if((uflags & 06) && !(uflags & 0x100)) + { + printInfoS(2,"reset device",0); + resetFB(); + } + } + +end: + if(fd) + { + printInfoS(2,"closing file descriptor",0); + close(fd); + } + printInfoS(2,"closing serial device",sname); + closeSerial(); + printf("\n"); + return 0; +} diff --git a/lpctool/testing/lpctool_serial.c b/lpctool/testing/lpctool_serial.c new file mode 100644 index 0000000..37b99d3 --- /dev/null +++ b/lpctool/testing/lpctool_serial.c @@ -0,0 +1,259 @@ +#include "lpctool_serial.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "infohelper.h" + +#define MAX(x,y) ((x) > (y) ? (x) : (y)) +#define MIN(x,y) ((x) < (y) ? (x) : (y)) + +int serialDev = -1; +static struct termios term; + +// change baudrate +// doesn't really do anything if it's the same +void setBaud(unsigned int baud) +{ + + printInfoU(0, "Setting baudrate to", baud); + switch(baud) + { + case 2400: + cfsetispeed(&term,B2400); + cfsetospeed(&term,B2400); + break; + case 4800: + cfsetispeed(&term,B4800); + cfsetospeed(&term,B4800); + break; + case 9600: + cfsetispeed(&term,B9600); + cfsetospeed(&term,B9600); + break; + case 19200: + cfsetispeed(&term,B19200); + cfsetospeed(&term,B19200); + break; + case 38400: + cfsetispeed(&term,B38400); + cfsetospeed(&term,B38400); + break; + case 57600: + cfsetispeed(&term,B57600); + cfsetospeed(&term,B57600); + break; + case 115200: + cfsetispeed(&term,B115200); + cfsetospeed(&term,B115200); + break; + case 230400: + cfsetispeed(&term,B230400); + cfsetospeed(&term,B230400); + break; + default: + break; + } +} + +void setFlow(unsigned char flow) +{ + if(flow == 0) + { + term.c_iflag&=~(IXON|IXOFF|IXANY|INLCR|ICRNL); + } + else + { + term.c_iflag&=~(INLCR|ICRNL|IXANY); + term.c_iflag|=(IXON|IXOFF); + } +} + +void setTimeout(unsigned int tout) +{ + term.c_cc[VMIN]=0; + term.c_cc[VTIME]=tout; // 10 seconds timeout +} + +int openSerial(char *dev) +{ + + serialDev=open(dev,O_RDWR); + if(serialDev<0) + { + printf("cannot acces %s\n",dev); + return serialDev; + } + + tcflush(serialDev, TCIOFLUSH); + + setDTR(0); + setRTS(0); + + tcgetattr(serialDev,&term); + + setBaud(TOOLBAUD); + + term.c_cflag = (term.c_cflag & ~CSIZE) | CS8; + term.c_cflag |= CLOCAL | CREAD; + + term.c_cflag &= ~(PARENB | PARODD); + term.c_cflag &= ~CSTOPB; + term.c_iflag=IGNBRK; + + term.c_iflag |= IXON | IXOFF; + + term.c_lflag=0; + + term.c_oflag=0; + + + setTimeout(5); + + if (tcsetattr(serialDev, TCSANOW, &term)!=0) + return printError("setattr stage 1 failed"); + + + if (tcgetattr(serialDev, &term)!=0) + return printError("getattr failed"); + + + term.c_cflag &= ~CRTSCTS; + + if (tcsetattr(serialDev, TCSANOW, &term)!=0) + return printError("setattr stage 2 failed"); + + return serialDev; +} + +int closeSerial(void) +{ + if(serialDev) + { + tcflush(serialDev, TCIOFLUSH); + close(serialDev); + return 0; + } + else + return serialDev; +} + +int reconfSerial(unsigned int baud, unsigned char flow, unsigned char tout) +{ + if(serialDev > 0) + { + + setBaud(baud); + setFlow(flow); + setTimeout(tout); + return tcsetattr(serialDev,TCSANOW,&term); + } + else + return serialDev; +} + +#define XFERSIZE 16 + +int sendBuf(unsigned int len, char *buf) +{ + unsigned int boff; + int ret; + + if(serialDev > 0) + { + boff = 0; + //~ tcflush(serialDev, TCIOFLUSH); + while (boff < len) + { + ret = write (serialDev, buf+boff, MIN (len - boff, XFERSIZE)); + + #if 0 + printf("sent %i: %c\n", ret, *(buf+boff)); + #endif + + if (ret < 0 && errno != EAGAIN) + { + perror ("error writing to serial port"); + return 0; + } + boff += ret; + } + return boff; + } + return 0; +} + +int sendBufE(unsigned int len, char *buf) +{ + return(getBuf(sendBuf(len,buf), buf)); +} + +int getBuf(unsigned int len, char *buf) +{ + unsigned int boff; + int ret; + + if(serialDev > 0) + { + boff = 0; + while (boff < len) + { + ret = read (serialDev, buf+boff, MIN (len - boff, XFERSIZE)); + if (ret < 0 && errno != EAGAIN) + { + perror ("error reading from serial port"); + return 0; + } + boff += ret; + } + return boff; + } + return 0; +} + +void setDTR(unsigned char val) +{ + int mcs; + if(serialDev) + { + ioctl (serialDev, TIOCMGET, &mcs); + if(val) + { + mcs |= TIOCM_DTR; + ioctl (serialDev, TIOCMSET, &mcs); + } + else + { + mcs &= ~TIOCM_DTR; + ioctl (serialDev, TIOCMSET, &mcs); + } + } +} + +void setRTS(unsigned char val) +{ + int mcs; + if(serialDev) + { + ioctl (serialDev, TIOCMGET, &mcs); + if(val) + { + mcs |= TIOCM_RTS; + ioctl (serialDev, TIOCMSET, &mcs); + } + else + { + mcs &= ~TIOCM_RTS; + ioctl (serialDev, TIOCMSET, &mcs); + } + } +} + diff --git a/lpctool/testing/lpctool_serial.h b/lpctool/testing/lpctool_serial.h new file mode 100644 index 0000000..5093059 --- /dev/null +++ b/lpctool/testing/lpctool_serial.h @@ -0,0 +1,16 @@ +#ifndef LPCTOOL_SERIAL_H +#define LPCTOOL_SERIAL_H + +#include "baudrate.h" + +int openSerial(char *dev); +int closeSerial(void); +int reconfSerial(unsigned int baud, unsigned char flow, unsigned char tout); +int sendBuf(unsigned int len, char *buf); +int getBuf(unsigned int len, char *buf); +void setDTR(unsigned char val); +void setRTS(unsigned char val); + +extern int serialDev; + +#endif diff --git a/lpctool/testing/toolcmd.h b/lpctool/testing/toolcmd.h new file mode 100644 index 0000000..065ddd9 --- /dev/null +++ b/lpctool/testing/toolcmd.h @@ -0,0 +1,31 @@ +#ifndef TOOLCMD_H +#define TOOLCMD_H + +#define HELO_CMD '.' +#define BULKENABLE_CMD 'B' +#define BULKDISABLE_CMD 'X' +#define SETADR_CMD 'A' +#define FILLBUF_CMD 'F' +#define WRITE_CMD 'W' +#define WRITEGO_CMD '!' +#define SECTERASE_CMD 'P' +#define FULLERASE_CMD 'E' +#define SETNUMBYTES_CMD 'S' +#define READ_CMD 'R' +#define SKIP_CMD '>' +#define HELOTOKEN "HELO" +#define ACKTOKEN "ACK!" +#define NACKTOKEN "NACK" +#define BACKTOKEN "!" + +#define MIN_GAP 0x10 + +typedef struct t_chunk +{ + unsigned long start; + unsigned long len; + struct t_chunk *prev; + struct t_chunk *next; +} t_chunk; + +#endif diff --git a/lpctool/testing/toolcom.c b/lpctool/testing/toolcom.c new file mode 100644 index 0000000..cc49049 --- /dev/null +++ b/lpctool/testing/toolcom.c @@ -0,0 +1,549 @@ +#include "infohelper.h" +#include "lpctool_serial.h" +#include "toolcom.h" +#include "toolcmd.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +const unsigned long secinfo[20] = +{ 0x00000, + 0x04000, + 0x06000, + 0x08000, + 0x10000, + 0x20000, + 0x30000, + 0x40000, + 0x50000, + 0x60000, + 0x70000, + 0x80000, + 0x90000, + 0xA0000, + 0xB0000, + 0xC0000, + 0xD0000, + 0xE0000, + 0xF0000, + 0x100000 }; + + +struct t_chunk *chunklist = NULL; + +union { + unsigned char cbuf[MAXBUF]; + unsigned short sbuf[MAXBUF/2]; + unsigned long lbuf[MAXBUF/4]; +} buffs; + +int makeList(unsigned long *buf, unsigned long len) +{ + unsigned long mlen; + t_chunk *mlist; + int cnt; + unsigned long gap, pos; + if(chunklist) + freeList(); + + mlen = len>>2; + gap = 0; + pos = 0; + cnt = 1; + + if(mlen) + { + printInfoS(2,"creating list of chunks",0); + + chunklist = malloc(sizeof(t_chunk)); + + mlist = chunklist; + + if(mlist) + { + mlist->start = 0x80000000; + mlist->len = 0; + mlist->prev = NULL; + mlist->next = NULL; + } + + while(mlen) + { + gap = 0; + if(buf[pos] != 0xFFFFFFFF) + { + mlist->len += 4; + mlen --; + pos ++; + } + else while(buf[pos] == 0xFFFFFFFF) + { + gap += 4; + pos ++; + mlen --; + } + if(gap) + { + if(gap >= MIN_GAP) + { + mlist->next = malloc(sizeof(t_chunk)); + if(mlist->next) + { + cnt++; + mlist->next->start = chunklist->start + (pos*4); + mlist->next->prev = mlist; + mlist->next->next = NULL; + mlist->next->len = 0; + mlist = mlist->next; + } + + } + else + { + mlist->len += gap; + } + } + } + } + printInfoH(2, "chunk entries created:",cnt); + return(cnt); +} + +void freeList(void) +{ + t_chunk *mlist; + int cnt; + + if(chunklist) + { + mlist = chunklist; + cnt = 0; + + while(mlist->next != NULL) + { + mlist = mlist->next; + cnt++; + free(mlist->prev); + } + cnt++; + free(mlist); + } +} + + +int getRESULT(unsigned char acktype) +{ + char buf[4]; + unsigned char q; + + switch(acktype) + { + case ACK: + q = getBuf(4, buf); + if(strncmp(buf, ACKTOKEN, 4)) + { + return printError("wrong response, expected ACK!"); + } + return 1; + break; + + case HELO: + q = getBuf(4, buf); + if(strncmp(buf, HELOTOKEN, 4)) + { + return printError("wrong response, expected HELO"); + } + return 1; + break; + case BACK: + q = getBuf(1, buf); + if(strncmp(buf, BACKTOKEN, 1)) + { + return printError("wrong response, expected !"); + } + return 1; + break; + } +} + +int openRamTool() +{ + unsigned char q; + + //~ char buf = HELO_CMD; + char buf[1]; + buf[0] = HELO_CMD; + + printInfoS(0,"Waiting for FlashTool", 0); + usleep(1000000); + + //~ while(1) + //~ { + tcflush(serialDev, TCIOFLUSH); // flush transmit/recieve buffers + + printInfoC(0,"Sending command HELO_CMD", buf[0]); + //~ sendBuf(1, &buf); + sendBuf(1, buf); + + //~ write (serialDev, &buf, 1); + + printInfoS(0,"Waiting for token HELO", 0); + usleep(100000); + + //~ tcflush(serialDev, TCIOFLUSH); + + //~ reconfSerial(TOOLBAUD, 0, 50); // longer timeout + + q = getRESULT(HELO); + + //~ while (1) + //~ { + //~ q = getBuf(1, &buf); + //~ printInfoU(0,"Got", q); + //~ } + //~ reconfSerial(TOOLBAUD, 0, 5); // shorter timeout + + printInfoU(0,"FlashTool sent", q); + + //~ if + + //~ } + + return q; +} + +int setToolAdr(unsigned long adr) +{ + char buf[5]; + + buf[0] = SETADR_CMD; + buf[1] =(adr & 0xFF000000) >> 24; + buf[2] =(adr & 0x00FF0000) >> 16; + buf[3] =(adr & 0x0000FF00) >> 8; + buf[4] = adr & 0x000000FF; + + sendBuf(5, buf); + + return getRESULT(ACK); +} + +int eraseFlash(void) +{ + char buf[1]; + printInfoS(0,"erasing flash", 0); + buf[0] = FULLERASE_CMD; + sendBuf(1, buf); + return getRESULT(ACK); +} + +int eraseFlashSector(void) +{ + char buf[1]; + buf[0] = SECTERASE_CMD; + sendBuf(1, buf); + return getRESULT(ACK); +} + +int enableBulk(unsigned char b) +{ + char buf[1]; + if(b) + buf[0] = BULKENABLE_CMD; + else + buf[0] = BULKDISABLE_CMD; + + sendBuf(1, buf); + return getRESULT(ACK); +} + +int setNumBytes(unsigned long numBytes) +{ + char buf[5]; + + buf[0] = SETNUMBYTES_CMD; + buf[1] =(numBytes & 0xFF000000) >> 24; + buf[2] =(numBytes & 0x00FF0000) >> 16; + buf[3] =(numBytes & 0x0000FF00) >> 8; + buf[4] = numBytes & 0x000000FF; + + sendBuf(5, buf); + + return getRESULT(ACK); +} + +int writeFlash(void) +{ + char buf[2]; + + buf[0] = WRITE_CMD; + buf[1] = WRITEGO_CMD; + + tcflush(serialDev, TCIOFLUSH); + sendBuf(2, buf); + + return getRESULT(ACK); +} + +int uploadBuf(unsigned char nwords, unsigned char* buf) +{ + unsigned short cnt,cnt2, cnt3; + unsigned long checksum; + char tbuf[6]; + checksum = 0; + tbuf[0] = FILLBUF_CMD; + tbuf[1] = nwords; + + if(!sendBuf(2,tbuf)) + return 0; + + cnt = nwords << 2; + cnt2 = 0; + +#define XFERSIZE 16 + + while(cnt >= XFERSIZE) + { + + cnt3=XFERSIZE; + while(cnt3--) + checksum += buf[cnt2++]; + + if(!sendBuf(XFERSIZE, (char*)buf+cnt2-XFERSIZE)) + return 0; + + if(!getRESULT(BACK)) + return 0; + + cnt -= XFERSIZE; + } + + if(cnt) + { + cnt3 = cnt; + while(cnt--) + checksum += buf[cnt2++]; + + if(!sendBuf(cnt3, (char*)buf+cnt2-cnt3)) + return 0; + + if(!getRESULT(BACK)) + return 0; + + } + + + tbuf[0] = (checksum >> 24) & 0xFF; + tbuf[1] = (checksum >> 16) & 0xFF; + tbuf[2] = (checksum >> 8) & 0xFF; + tbuf[3] = checksum & 0xFF; + if(!sendBuf(4, tbuf)) + return 0; + + return getRESULT(ACK); +} + +int uploadChunks(int fd, unsigned long loc, unsigned int erase) +{ + unsigned long fsize, cnt, total, csize; + unsigned char buf[MAXBUF]; + unsigned int numChunks; + t_chunk *curr_chunk; + + if(!setToolAdr(loc)) + { + freeList(); + return printError("failed to set address"); + } + + if(erase & 0x40) + { + printInfoS(2,"erasing flash sector", 0); + if(!eraseFlashSector()) + return printError("failed to erase start sector"); + printInfoS(2,"flash sector erased", 0); + } + else if((erase & 0x20) || (erase & 0x10)) + { + printInfoS(2,"erasing whole flash", 0); + reconfSerial(TOOLBAUD, 0, 200); + + if(!eraseFlash()) + return printError("failed to erase whole flash"); + reconfSerial(TOOLBAUD, 0, 5); + + printInfoS(2,"whole flash erased", 0); + } + + printInfoS(2,"enabling bulk write",0); + if(!enableBulk(1)) + return printError("bulk write enable failed"); + + fsize = read(fd, buf, MAXBUF); + total = fsize; + cnt = 0; + + printInfoH(2,"setting total number of bytes to", fsize); + if(!setNumBytes(fsize)) + return printError("cannot set total number of bytes"); + + printInfoS(0,"starting flash upload (chunk mode)", 0); + + numChunks = makeList((unsigned long*)buf, fsize); + curr_chunk = chunklist; + + printProgress(0,"Flash",cnt,total); + + while(numChunks--) + { + if(!setToolAdr(curr_chunk->start)) + { + freeList(); + return printError("failed to set address"); + } + + csize = curr_chunk->len; + cnt = curr_chunk->start & 0x00FFFFFF; + + while(csize >= 512) + { + if(!uploadBuf(128, buf+cnt)) + { + freeList(); + return printError("buffer upload failed");; + } + else + { + if(!writeFlash()) + { + freeList(); + return printError("flash write failed");; + } + } + csize -= 512; + cnt += 512; + printProgress(0,"Flash",cnt,total); + } + if(csize) + { + if(!uploadBuf(csize>>2, buf+cnt)) + { + freeList(); + return printError("buffer upload failed");; + } + else + { + if(!writeFlash()) + { + freeList(); + return printError("flash write failed");; + } + } + csize = 0; + printProgress(0,"Flash",cnt,total); + } + + curr_chunk = curr_chunk->next; + } + + printProgress(0,"Flash",total,total); + + freeList(); + + if(!enableBulk(0)) + return printError("bulk write disable failed");; + + printInfoH(0,"flash upload (chunk mode) complete, total bytes:", total); + return 1; +} + + + +int uploadFlash(int fd, unsigned long loc, unsigned int erase) +{ + unsigned long fsize, cnt, total; + unsigned char buf[MAXBUF]; + + printInfoH(2,"setting address to", loc); + if(!setToolAdr(loc)) + return printError("failed to set address"); + + if(erase & 0x40) + { + printInfoS(2,"erasing flash sector", 0); + if(!eraseFlashSector()) + return printError("failed to erase start sector"); + printInfoS(2,"flash sector erased", 0); + } + else if((erase & 0x20) || (erase & 0x10)) + { + printInfoS(2,"erasing whole flash", 0); + reconfSerial(TOOLBAUD, 0, 200); + + if(!eraseFlash()) + return printError("failed to erase whole flash"); + reconfSerial(TOOLBAUD, 0, 5); + + printInfoS(2,"whole flash erased", 0); + } + + printInfoS(2,"enabling bulk write",0); + if(!enableBulk(1)) + return printError("bulk write enable failed"); + + fsize = read(fd, buf, MAXBUF); + + printInfoH(2,"setting total number of bytes to", fsize); + if(!setNumBytes(fsize)) + return printError("cannot set total number of bytes"); + + cnt = 0; + total = fsize; + + printInfoS(0,"starting flash upload", 0); + printProgress(0,"Flash",cnt,total); + + while(fsize >= 512) + { + if(!uploadBuf(128, buf+cnt)) + { + return printError("buffer upload failed");; + } + else + { + if(!writeFlash()) + return printError("flash write failed");; + } + fsize -= 512; + cnt += 512; + printProgress(0,"Flash",cnt,total); + } + + if(fsize) + { + if(!uploadBuf(fsize>>2, buf+cnt)) + { + return printError("buffer upload failed");; + } + else + { + if(!writeFlash()) + return printError("flash write failed");; + } + fsize = 0; + printProgress(0,"Flash",total,total); + } + + if(!enableBulk(0)) + return printError("bulk write disable failed");; + + printInfoH(0,"flash upload complete, total bytes:", total); + return 1; +} + + diff --git a/lpctool/testing/toolcom.h b/lpctool/testing/toolcom.h new file mode 100644 index 0000000..30eb47d --- /dev/null +++ b/lpctool/testing/toolcom.h @@ -0,0 +1,21 @@ +#ifndef TOOLCOM_H +#define TOOLCOM_H + +#define ACK 0x00 +#define HELO 0x01 +#define BACK 0x02 + +#define MAXBUF 0x00100000 + +int makeList(unsigned long *buf, unsigned long len); +void freeList(void); +int openRamTool(); +int setToolAdr(unsigned long adr); +int eraseFlash(void); +int writeFlash(void); +int enableBulk(unsigned char b); +int setNumBytes(unsigned long numBytes); +int uploadFlash(int fd, unsigned long loc, unsigned int erase); +int uploadChunks(int fd, unsigned long loc, unsigned int erase); + +#endif diff --git a/lpctool/trunk/ChangeLog b/lpctool/trunk/ChangeLog new file mode 100644 index 0000000..5513d9d --- /dev/null +++ b/lpctool/trunk/ChangeLog @@ -0,0 +1,8 @@ +2007-10-05 Simon Budig + + toolcom.c: added info line for flash erase. + +2007-10-05 Ch. Klippel + + */* initial import into SVN + diff --git a/lpctool/trunk/Makefile b/lpctool/trunk/Makefile new file mode 100644 index 0000000..ffbcbc0 --- /dev/null +++ b/lpctool/trunk/Makefile @@ -0,0 +1,114 @@ +############################################################### +##### +##### Makefile for ramtool and lpctool +##### +############################################################### + +############################################################### +##### +##### PATHS (default installation) +##### +############################################################### + +ARMBASE=/opt/summon-arm-toolchain +INCLUDEPATH=$(ARMBASE)/include +LIBPATH=$(ARMBASE)/arm-elf/lib/interwork +ARMPATH=$(ARMBASE)/bin +TOOLPREFIX=/arm-none-eabi- + +INSTALLDIR_BIN=/usr/local/bin + +-include Makefile.local + +############################################################### +##### +##### Compiler, Linker and Tools +##### +############################################################### + +CC=$(ARMPATH)$(TOOLPREFIX)gcc +AS=$(ARMPATH)$(TOOLPREFIX)as +LD=$(ARMPATH)$(TOOLPREFIX)ld +OC=$(ARMPATH)$(TOOLPREFIX)objcopy +OD=$(ARMPATH)$(TOOLPREFIX)objdump + +CPUFLAGS=-mcpu=arm7tdmi-s +OPTFLAGS=-Os +#OPTFLAGS=-O0 +#OPTFLAGS= +CFLAGS=$(CPUFLAGS) -c -Wall -mthumb-interwork -msoft-float -I$(INCLUDEPATH) +ASFLAGS=$(CPUFLAGS) -D --gstabs -mthumb-interwork -mfpu=softfpa +LDFLAGS=$(OPTFLAGS) -Tlpc2220.ld +ROMLDFLAGS=$(OPTFLAGS) -Tlpc2220_rom.ld + +############################################################### +##### +##### Do the whole shabang +##### +############################################################### + +all: ramtool.bin romtool.bin lpctool + +ramtool.bin: ramtool.elf + $(OC) -O binary ramtool.elf ramtool.bin + +ramtool.elf: crt.o serial.o lcd.o fonty.o flash.o ramtool.o lpc2220.ld + $(LD) $(LDFLAGS) -o ramtool.elf crt.o serial.o lcd.o fonty.o flash.o ramtool.o + +romtool.bin: romtool.elf + $(OC) -O binary romtool.elf romtool.bin + +romtool.elf: crt.o serial.o lcd.o fonty.o flash.o romtool.o lpc2220_rom.ld + $(LD) $(ROMLDFLAGS) -o romtool.elf crt.o serial.o lcd.o fonty.o flash.o romtool.o + +crt.o: crt.s + $(AS) $(ASFLAGS) -o crt.o crt.s + +flash.o: flash.c flash.h serial.h lcd.h + $(CC) $(CFLAGS) -o flash.o flash.c + +lcd.o: lcd.c lcd.h lpc2220.h + $(CC) $(CFLAGS) -o lcd.o lcd.c + +fonty.o: fonty.c fonty.h charset.bits charset.info lcd.h + $(CC) $(CFLAGS) -o fonty.o fonty.c + +serial.o: serial.c serial.h lcd.h lpc2220.h + $(CC) $(CFLAGS) -o serial.o serial.c + +ramtool.o: ramtool.c serial.o lcd.h flash.h lpc2220.h + $(CC) $(CFLAGS) -o ramtool.o ramtool.c + +romtool.o: ramtool.c serial.o lcd.h flash.h lpc2220.h + $(CC) $(CFLAGS) -DRESIDENT -o romtool.o ramtool.c + +bin2h: bin2h.c ramtool.bin + gcc -Os bin2h.c -o bin2h + strip bin2h + +tool_data.h: bin2h + ./bin2h > tool_data.h + +lpctool: infohelper.c lpctool_serial.c bootcom.c toolcom.c lpctool.c infohelper.h lpctool_serial.h bootcom.h toolcom.h tool_data.h + gcc -Os infohelper.c lpctool_serial.c bootcom.c toolcom.c lpctool.c -o lpctool + strip lpctool + +upload: lpctool + ./lpctool -i -v + +resident: romtool.bin lpctool + ./lpctool -S -i -a romtool.bin -v + +uresident: romtool.bin lpctool + ./lpctool -d /dev/ttyUSB0 -S -i -a romtool.bin -v + +install: lpctool + cp lpctool $(INSTALLDIR_BIN) + +uninstall: + rm $(INSTALLDIR_BIN)/lpctool + +clean: + $(RM) *.o ramtool.elf ramtool.bin romtool.elf romtool.bin *~ lpctool tool_data.h bin2h + +### EOF diff --git a/lpctool/trunk/Makefile.local.WinARM b/lpctool/trunk/Makefile.local.WinARM new file mode 100644 index 0000000..4454656 --- /dev/null +++ b/lpctool/trunk/Makefile.local.WinARM @@ -0,0 +1,25 @@ +############################################################### +##### +##### Makefile.local.WinARM for boop +##### Created in the early morninghours +##### +##### Makefile.local.WinARM V1.0 by alterego - alteregon@gmx.net +##### +############################################################### + +############################################################### +##### +##### PATHS (default installation) +##### +##### You can put your path-config into Makefile.local +##### to override these defaults +##### +############################################################### + +ARMBASE=c:/WinARM/ +INCLUDEPATH=$(ARMBASE)/include +LIBPATH=$(ARMBASE)/arm-elf/lib/interwork +ARMPATH=$(ARMBASE)/bin +TOOLPREFIX=/arm-elf- + +######################## EOF ################################## diff --git a/lpctool/trunk/Makefile.local.linuxARM b/lpctool/trunk/Makefile.local.linuxARM new file mode 100644 index 0000000..3fccf37 --- /dev/null +++ b/lpctool/trunk/Makefile.local.linuxARM @@ -0,0 +1,25 @@ +############################################################### +##### +##### Makefile.local.linuxARM for boop +##### Created in the early morninghours +##### +##### Makefile.local.linuxARM +##### +############################################################### + +############################################################### +##### +##### PATHS (default installation) +##### +##### You can put your path-config into Makefile.local +##### to override these defaults +##### +############################################################### + +ARMBASE=/opt/arm-elf +INCLUDEPATH=$(ARMBASE)/include +LIBPATH=$(ARMBASE)/lib/gcc/arm-elf/4.1.1/interwork +ARMPATH=$(ARMBASE)/bin +TOOLPREFIX=/arm-elf- + +######################## EOF ################################## diff --git a/lpctool/trunk/bin2h.c b/lpctool/trunk/bin2h.c new file mode 100644 index 0000000..8c026dc --- /dev/null +++ b/lpctool/trunk/bin2h.c @@ -0,0 +1,30 @@ +#include "stdio.h" +#include "string.h" +#include + + +int main(void) +{ + int fd; + unsigned long cnt, cnt2; + unsigned char buf[0x10000]; + + fd = open("ramtool.bin", O_RDONLY); + + if(fd) + { + cnt = read(fd, buf, 0x10000); + cnt2 = 0; + printf("#define tool_len 0x%08X\n",cnt); + printf("const unsigned char tool_data[] = {\n\t"); + while(cnt--) + { + printf("0x%02X,",buf[cnt2++]); + if((cnt2 & 0x0F) == 0) + printf("\n\t"); + } + printf("\n};\n"); + close(fd); + } + return 0; +} diff --git a/lpctool/trunk/bootcom.c b/lpctool/trunk/bootcom.c new file mode 100644 index 0000000..83410ed --- /dev/null +++ b/lpctool/trunk/bootcom.c @@ -0,0 +1,307 @@ +#include "infohelper.h" +#include "lpctool_serial.h" +#include "bootcom.h" +#include "tool_data.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +unsigned int uuencode(unsigned char *ibuf, unsigned char *obuf, int len) +{ + unsigned int slen, r,s; + unsigned char q; + slen = len; + + r = 0; + s = 0; + + while(slen >= 45) + { + + obuf[r++]=77; + for(q=0;q<45;q+=3) + { + + obuf[r++]=0x20+(( ibuf[s]>>2)&0x3f); + obuf[r++]=0x20+(((ibuf[s]<<4) | (ibuf[s+1]>>4))&0x3f); + s++; + obuf[r++]=0x20+(((ibuf[s]<<2)|(ibuf[s+1]>>6))&0x3f); + s++; + obuf[r++]=0x20+( ibuf[s++]&0x3f); + } + obuf[r++] = '\r'; + obuf[r++] = '\n'; + slen -= 45; + } + + if(slen) + { + obuf[r++]=0x20+slen; + for(q=0;q>2)&0x3f); + obuf[r++]=0x20+(((ibuf[s]<<4) | (ibuf[s+1]>>4))&0x3f); + s++; + obuf[r++]=0x20+(((ibuf[s]<<2)|(ibuf[s+1]>>6))&0x3f); + s++; + obuf[r++]=0x20+( ibuf[s++]&0x3f); + } + obuf[r++] = '\r'; + obuf[r++] = '\n'; + } + + return r; +} + +void printBuf(unsigned char len, unsigned char *buf) +{ + unsigned char cnt; + cnt = 0; + while(len--) + printf("%c",buf[cnt++]); +} + +int getOK(unsigned char oktype) +{ + char buf[4]; + unsigned char q; + + switch(oktype) + { + case OK_LIT: + q = getBuf(4, buf); + if(strncmp(buf, "OK\r\n", 4)) + { + return printError("wrong response, expected OK"); + } + return 1; + break; + + case OK_0: + q = getBuf(3, buf); + if(strncmp(buf, "0", 1)) + { + return printError("wrong response, expected 0"); + } + return 1; + break; + } +} + +int openBootLoader(unsigned int cfreq) +{ + char buf[20]; + unsigned char q; + + printInfoS(2,"initiating auto-baud",0); + sendBuf(sprintf(buf, "?\r\n"), buf); + + printInfoS(2,"awaiting autobaud response",0); + + q = getBuf(14, buf); + + if(strncmp(buf, "Synchronized\r\n", 14)) + { + return printError("autobaud detection failed"); + } + + printInfoS(2,"got response, answering",0); + + q = sendBufE(q, buf); + + if(!getOK(OK_LIT)) + { + return printError("cant synchronize bootloader"); + } + + printInfoS(2,"setting frequency",0); + + sendBufE(sprintf(buf, "%i\r\n", cfreq), buf); + + if(!getOK(OK_LIT)) + { + return printError("cant set frequency"); + } + + printInfoS(2,"switching baudrate",0); + + sendBufE(sprintf(buf, "B 38400 1\r\n"), buf); + + if(!getOK(OK_0)) + { + return printError("cant set baudrate"); + } + + reconfSerial(38400, 1, 10); + + printInfoS(2,"disabling echo",0); + + sendBufE(sprintf(buf, "A 0\r\n"), buf); + + if(!getOK(OK_0)) + { + return printError("cant disable echo"); + } + return 1; +} + +int unlockBootLoader(void) +{ + char buf[20]; + + sendBuf(sprintf(buf, "U 23130\r\n"), buf); + + if(!getOK(OK_0)) + { + return printError("cant unlock bootloader"); + } + return 1; + +} + +int goBootLoader(unsigned long addr) +{ + char buf[20]; + + sendBuf(sprintf(buf, "G %i A\r\n", addr), buf); + + if(!getOK(OK_0)) + { + return printError("cant issue go command");; + } + return 1; +} + +#define BSIZE 400 + +int uploadData(unsigned long addr, unsigned long len, unsigned char *ibuf) +{ + char buf[128]; + unsigned char uubuf[BSIZE*3]; + unsigned int blen, csum; + unsigned long slen, saddr, soff; + slen = len; + saddr = addr; + soff = 0; + + if(addr & 0x3) + { + return printError("RAM address not on dword boundary"); + } + + while(slen >= BSIZE) + { + sendBuf(sprintf(buf, "W %i %i\r\n", saddr+soff, BSIZE), buf); + if(!getOK(OK_0)) + { + return printError("cant write data"); + } + + csum = 0; + + for(blen = 0; blen < BSIZE; blen++) + { + csum += ibuf[soff+blen]; + } + + blen = uuencode(ibuf+soff, uubuf, BSIZE); + sendBuf(blen, (char*)uubuf); + sendBuf(sprintf(buf, "%u\r\n", csum), buf); + if(!getOK(OK_LIT)) + { + return printError("error in checksum"); + } + slen -= BSIZE; + soff += BSIZE; + } + + if(slen) + { + sendBuf(sprintf(buf, "W %i %i\r\n", saddr+soff, slen), buf); + if(!getOK(OK_0)) + { + + return printError("cant write remaining data"); + } + + csum = 0; + + for(blen = 0; blen < slen; blen++) + { + csum += ibuf[soff+blen]; + } + + blen = uuencode(ibuf+soff, uubuf, slen); + sendBuf(blen, (char*)uubuf); + sendBuf(sprintf(buf, "%i\r\n", csum), buf); + + if(!getOK(OK_LIT)) + { + return printError("error in checksum for remaining data"); + } + + } + return 1; +} + +int uploadRAM(int fd, int loc) +{ + unsigned char buf[70000]; + + unsigned long fx, total, size; + total = 0; + + if(fd) + { + printInfoS(2,"reading image into buffer", 0); + fx = read(fd,buf,70000); + } + else + { + for(fx=0; fx= 256) + { + if(!uploadData(loc+total, 256, buf+total)) + { + return printError("Error in upload"); + } + total += 256; + fx -= 256; + } + else + { + if(!uploadData(loc+total, fx, buf+total)) + { + return printError("Error in upload"); + } + total += fx; + fx -= fx; + } + + printProgress(0,"RAM",total,size); + } + + printInfoH(0,"ram upload complete, total bytes:", total); + + return 1; +} diff --git a/lpctool/trunk/bootcom.h b/lpctool/trunk/bootcom.h new file mode 100644 index 0000000..61dc7a3 --- /dev/null +++ b/lpctool/trunk/bootcom.h @@ -0,0 +1,12 @@ +#ifndef BOOTCOM_H +#define BOOTCOM_H + +#define OK_LIT 0x00 +#define OK_0 0x01 + +unsigned int uuencode(unsigned char *ibuf, unsigned char *obuf, int len); +int openBootLoader(unsigned int cfreq); +int uploadData(unsigned long addr, unsigned long len, unsigned char *ibuf); +int uploadRAM(int fd, int loc); + +#endif diff --git a/lpctool/trunk/charset.bits b/lpctool/trunk/charset.bits new file mode 100644 index 0000000..307a269 --- /dev/null +++ b/lpctool/trunk/charset.bits @@ -0,0 +1,118 @@ +const unsigned char charset_bits[] = { + 0x80, 0xc0, 0x80, 0xe0, 0x80, 0xc0, 0x80, 0xf0, 0x01, 0x03, 0x01, 0x07, + 0x01, 0x03, 0x01, 0x0f, 0x80, 0x88, 0xaa, 0xff, 0xff, 0xaa, 0x88, 0x80, + 0x00, 0xc0, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xf0, 0x00, 0x03, 0x00, 0x07, + 0x00, 0x03, 0x00, 0x0f, 0x80, 0x88, 0xaa, 0xab, 0xab, 0xaa, 0x88, 0x80, + 0x80, 0x80, 0x80, 0x70, 0x01, 0x01, 0x01, 0x0e, 0x0e, 0x01, 0x01, 0x01, + 0x70, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x24, + 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x92, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x81, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xaa, 0x02, 0x05, 0x02, 0x00, + 0x3e, 0x41, 0x41, 0x22, 0x02, 0x05, 0x02, 0x00, 0x7f, 0x09, 0x09, 0x01, + 0x1c, 0x22, 0x41, 0x4f, 0x41, 0x22, 0x1c, 0x1c, 0x22, 0x41, 0x4f, 0x47, + 0x22, 0x1c, 0x1c, 0x22, 0x41, 0x4f, 0x4f, 0x2e, 0x1c, 0x1c, 0x22, 0x41, + 0x4f, 0x5f, 0x3e, 0x1c, 0x1c, 0x22, 0x41, 0x7f, 0x7f, 0x3e, 0x1c, 0x1c, + 0x22, 0x71, 0x7f, 0x7f, 0x3e, 0x1c, 0x1c, 0x3a, 0x79, 0x7f, 0x7f, 0x3e, + 0x1c, 0x1c, 0x3e, 0x7d, 0x7f, 0x7f, 0x3e, 0x1c, 0x1c, 0x3e, 0x7f, 0x7f, + 0x7f, 0x3e, 0x1c, 0x00, 0x00, 0x5f, 0x03, 0x00, 0x03, 0x14, 0x7f, 0x14, + 0x7f, 0x14, 0x24, 0x4a, 0xff, 0x4a, 0x32, 0x63, 0x13, 0x08, 0x64, 0x63, + 0x36, 0x49, 0x55, 0x22, 0x50, 0x03, 0x1c, 0x22, 0x41, 0x41, 0x22, 0x1c, + 0x14, 0x08, 0x3e, 0x08, 0x14, 0x08, 0x08, 0x3e, 0x08, 0x08, 0x80, 0x60, + 0x60, 0x08, 0x08, 0x08, 0x08, 0x08, 0x60, 0x60, 0xc0, 0x30, 0x0c, 0x03, + 0x3e, 0x51, 0x49, 0x45, 0x3e, 0x00, 0x42, 0x7f, 0x40, 0x00, 0x42, 0x61, + 0x51, 0x49, 0x46, 0x22, 0x41, 0x49, 0x49, 0x36, 0x18, 0x14, 0x12, 0x7f, + 0x10, 0x27, 0x45, 0x45, 0x45, 0x39, 0x3e, 0x49, 0x49, 0x49, 0x32, 0x61, + 0x11, 0x09, 0x05, 0x03, 0x36, 0x49, 0x49, 0x49, 0x36, 0x26, 0x49, 0x49, + 0x49, 0x3e, 0x6c, 0x6c, 0x80, 0x6c, 0x6c, 0x08, 0x14, 0x22, 0x41, 0x14, + 0x14, 0x14, 0x14, 0x41, 0x22, 0x14, 0x08, 0x02, 0x01, 0x51, 0x09, 0x06, + 0x3e, 0x41, 0x59, 0x55, 0x5e, 0x7e, 0x09, 0x09, 0x09, 0x7e, 0x7f, 0x49, + 0x49, 0x49, 0x36, 0x3e, 0x41, 0x41, 0x41, 0x22, 0x7f, 0x41, 0x41, 0x41, + 0x3e, 0x7f, 0x49, 0x49, 0x41, 0x41, 0x7f, 0x09, 0x09, 0x01, 0x01, 0x3e, + 0x41, 0x41, 0x49, 0x3a, 0x7f, 0x08, 0x08, 0x08, 0x7f, 0x41, 0x7f, 0x41, + 0x30, 0x41, 0x41, 0x41, 0x3f, 0x7f, 0x08, 0x14, 0x22, 0x41, 0x7f, 0x40, + 0x40, 0x40, 0x40, 0x7f, 0x02, 0x0c, 0x02, 0x7f, 0x7f, 0x02, 0x04, 0x08, + 0x7f, 0x3e, 0x41, 0x41, 0x41, 0x3e, 0x7f, 0x09, 0x09, 0x09, 0x06, 0x3e, + 0x41, 0x41, 0x41, 0xbe, 0x7f, 0x09, 0x09, 0x09, 0x76, 0x26, 0x49, 0x49, + 0x49, 0x32, 0x01, 0x01, 0x7f, 0x01, 0x01, 0x3f, 0x40, 0x40, 0x40, 0x3f, + 0x1f, 0x20, 0x40, 0x20, 0x1f, 0x7f, 0x20, 0x10, 0x20, 0x7f, 0x41, 0x22, + 0x1c, 0x22, 0x41, 0x07, 0x08, 0x70, 0x08, 0x07, 0x61, 0x51, 0x49, 0x45, + 0x43, 0x7f, 0x41, 0x41, 0x03, 0x0c, 0x30, 0xc0, 0x41, 0x41, 0x7f, 0x02, + 0x01, 0x02, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01, 0x02, 0x20, 0x54, 0x54, + 0x78, 0x7f, 0x48, 0x48, 0x30, 0x38, 0x44, 0x44, 0x24, 0x30, 0x48, 0x48, + 0x7f, 0x38, 0x54, 0x54, 0x18, 0x08, 0x7e, 0x09, 0x02, 0x98, 0xa4, 0xa4, + 0x78, 0x7f, 0x08, 0x08, 0x70, 0x44, 0x7d, 0x40, 0x44, 0x84, 0x7d, 0x7f, + 0x10, 0x28, 0x44, 0x41, 0x7f, 0x40, 0x7c, 0x04, 0x18, 0x04, 0x78, 0x7c, + 0x08, 0x04, 0x78, 0x38, 0x44, 0x44, 0x38, 0xfc, 0x24, 0x24, 0x18, 0x18, + 0x24, 0x24, 0xfc, 0x7c, 0x08, 0x04, 0x08, 0x48, 0x54, 0x54, 0x24, 0x04, + 0x3f, 0x44, 0x3c, 0x40, 0x20, 0x7c, 0x1c, 0x20, 0x40, 0x20, 0x1c, 0x3c, + 0x40, 0x30, 0x40, 0x3c, 0x44, 0x28, 0x10, 0x28, 0x44, 0x9c, 0xa0, 0xa0, + 0x7c, 0x64, 0x54, 0x54, 0x4c, 0x08, 0x36, 0x41, 0x77, 0x41, 0x36, 0x08, + 0x08, 0x08, 0x2a, 0x1c, 0x08, 0x08, 0x1c, 0x2a, 0x08, 0x08, 0x00, 0x00, + 0x00, 0xdf, 0xdf, 0x07, 0x07, 0x00, 0x07, 0x07, 0x14, 0x3e, 0x14, 0x3e, + 0x14, 0x24, 0x4a, 0xff, 0x4a, 0x32, 0xf3, 0xfb, 0x18, 0xdf, 0xc7, 0x36, + 0x49, 0x55, 0x22, 0x50, 0x04, 0x07, 0x03, 0x3c, 0x7e, 0xc3, 0x81, 0x81, + 0xc3, 0x7e, 0x3c, 0x14, 0x08, 0x3e, 0x08, 0x14, 0x18, 0x7e, 0x7e, 0x18, + 0x80, 0x60, 0x60, 0x18, 0x18, 0x18, 0x18, 0x18, 0x60, 0x60, 0xc0, 0xf0, + 0x3c, 0x0f, 0x03, 0x7e, 0xff, 0xc3, 0xff, 0x7e, 0x04, 0xc6, 0xff, 0xff, + 0xc0, 0xe6, 0xf7, 0xd3, 0xdf, 0xce, 0x42, 0xc3, 0xdb, 0xff, 0x76, 0x38, + 0x3c, 0x36, 0xff, 0xff, 0x5f, 0xdf, 0xdb, 0xfb, 0x73, 0x7e, 0xff, 0xdb, + 0xfb, 0x72, 0x03, 0xf3, 0xfb, 0x0f, 0x07, 0x76, 0xff, 0xdb, 0xff, 0x76, + 0x4e, 0xdf, 0xdb, 0xff, 0x7e, 0x6c, 0x6c, 0x80, 0x6c, 0x6c, 0x18, 0x3c, + 0x66, 0xc3, 0x81, 0x36, 0x36, 0x36, 0x36, 0x81, 0xc3, 0x66, 0x3c, 0x18, + 0x06, 0xd3, 0xd9, 0x0f, 0x06, 0x7e, 0xc3, 0xdb, 0xd7, 0xde, 0xfe, 0xff, + 0x33, 0xff, 0xfe, 0xff, 0xff, 0xdb, 0xff, 0x66, 0x7e, 0xff, 0xc3, 0xe7, + 0x66, 0xff, 0xff, 0xc3, 0xff, 0x7e, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xff, + 0xff, 0x1b, 0x1b, 0x03, 0x7e, 0xff, 0xc3, 0xfb, 0x7a, 0xff, 0xff, 0x18, + 0xff, 0xff, 0xc3, 0xff, 0xff, 0xc3, 0x60, 0xe3, 0xc3, 0xff, 0x7f, 0xff, + 0xff, 0x1c, 0xf7, 0xe3, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xff, 0xfe, 0x0c, + 0xfe, 0xff, 0xff, 0xfe, 0x18, 0x7f, 0xff, 0x7e, 0xff, 0xc3, 0xff, 0x7e, + 0xff, 0xff, 0x1b, 0x1f, 0x0e, 0x7e, 0xff, 0xc3, 0x7f, 0xde, 0xff, 0xff, + 0x1b, 0xff, 0xee, 0x4e, 0xdf, 0xdb, 0xfb, 0x72, 0x03, 0xff, 0xff, 0x03, + 0x03, 0x7f, 0xff, 0xc0, 0xff, 0x7f, 0x3f, 0x7f, 0xc0, 0x7f, 0x3f, 0xff, + 0x7f, 0x30, 0x7f, 0xff, 0xe7, 0xe7, 0x18, 0x18, 0xe7, 0xe7, 0x0f, 0x1f, + 0xf0, 0x1f, 0x0f, 0xe3, 0xf3, 0xdb, 0xcf, 0xc7, 0xff, 0xff, 0xc3, 0xc3, + 0x03, 0x0f, 0x3c, 0xf0, 0xc0, 0xc3, 0xc3, 0xff, 0xff, 0x04, 0x06, 0x03, + 0x06, 0x04, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x03, 0x07, 0x60, 0xf4, 0xd4, + 0xf4, 0xf8, 0xff, 0xff, 0xcc, 0xfc, 0x78, 0x78, 0xfc, 0xcc, 0xcc, 0x48, + 0x78, 0xfc, 0xcc, 0xff, 0xff, 0x78, 0xfc, 0xac, 0xbc, 0xb8, 0x18, 0xfe, + 0xff, 0x1b, 0x1b, 0xb8, 0xbc, 0xac, 0xfc, 0x78, 0xff, 0xff, 0x18, 0xf8, + 0xf0, 0xcc, 0xfd, 0xfd, 0xc0, 0xc0, 0xcc, 0xfd, 0x7d, 0xff, 0xff, 0x10, + 0xfc, 0xec, 0x7f, 0xff, 0xc0, 0xc0, 0xfc, 0xfc, 0x0c, 0xfc, 0x0c, 0xfc, + 0xf8, 0xfc, 0xf8, 0x0c, 0xfc, 0xf8, 0x78, 0xfc, 0xcc, 0xfc, 0x78, 0xfc, + 0xfc, 0x6c, 0x7c, 0x38, 0x38, 0x7c, 0x6c, 0xfc, 0xf8, 0xfc, 0xf8, 0x0c, + 0x1c, 0x18, 0xd8, 0xdc, 0xfc, 0xec, 0x6c, 0x0c, 0x7f, 0xff, 0xcc, 0xcc, + 0x7c, 0xfc, 0xc0, 0x7c, 0xfc, 0x3c, 0x7c, 0xc0, 0x7c, 0x3c, 0x7c, 0xfc, + 0xc0, 0x60, 0xc0, 0xfc, 0x7c, 0xcc, 0xfc, 0x30, 0xfc, 0xdc, 0x9c, 0xbc, + 0xb0, 0xfc, 0x7c, 0xcc, 0xec, 0xfc, 0xdc, 0xcc, 0x10, 0x56, 0xef, 0x81, + 0xef, 0xef, 0x81, 0xee, 0x56, 0x10, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x18, + 0x3c, 0x7e, 0x18, 0x18, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, 0x3e, 0x1f, + 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, 0x3e, 0x1f, 0x8f, 0xe3, 0xf1, 0xf8, 0x7c, + 0x3e, 0x1f, 0x8f, 0xc7, 0xf1, 0xf8, 0x7c, 0x3e, 0x1f, 0x8f, 0xc7, 0xe3, + 0xf8, 0x7c, 0x3e, 0x1f, 0x8f, 0xc7, 0xe3, 0xf1, 0x7c, 0x3e, 0x1f, 0x8f, + 0xc7, 0xe3, 0xf1, 0xf8, 0x3e, 0x1f, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, + 0x1f, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0x7c, 0x3e, 0xff, 0xff, 0xe7, 0xc3, + 0xc3, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xc3, 0xc3, 0xe7, 0xff, 0xff, + 0xff, 0xf8, 0xe0, 0xc0, 0xc0, 0xe0, 0xf8, 0xff, 0xff, 0x1f, 0x07, 0x03, + 0x03, 0x07, 0x1f, 0xff, 0x1c, 0x3e, 0x77, 0x63, 0x77, 0x3e, 0x1c, 0x1c, + 0x36, 0x63, 0x41, 0x63, 0x36, 0x1c, 0x1c, 0x08, 0x41, 0x63, 0x41, 0x08, + 0x1c, 0x08, 0x14, 0x22, 0x49, 0x22, 0x14, 0x08, 0x55, 0xaa, 0x55, 0xaa, + 0x55, 0xaa, 0x55, 0xaa, 0x33, 0x33, 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, + 0x33, 0x33, 0x0e, 0x11, 0x0e, 0x12, 0x1f, 0x10, 0x19, 0x15, 0x12, 0x11, + 0x15, 0x0a, 0x07, 0x04, 0x1e, 0x17, 0x15, 0x09, 0x0e, 0x15, 0x09, 0x01, + 0x1d, 0x03, 0x0a, 0x15, 0x0a, 0x12, 0x15, 0x0e, 0x0a, 0x10, 0x0a, 0x04, + 0x0a, 0x11, 0x0a, 0x0a, 0x0a, 0x11, 0x0a, 0x04, 0x01, 0x15, 0x02, 0x01, + 0x03, 0x07, 0x03, 0x01, 0x04, 0x06, 0x07, 0x06, 0x04, 0x04, 0x0e, 0x1f, + 0x1f, 0x0e, 0x04, 0x18, 0x3c, 0x7e, 0x7e, 0x3c, 0x18, 0x3c, 0x42, 0x81, + 0x81, 0x81, 0x81, 0x42, 0x3c, 0x3c, 0x42, 0x99, 0xbd, 0xbd, 0x99, 0x42, + 0x3c, 0x7f, 0x49, 0x41, 0x6b, 0x41, 0x49, 0x7f, 0x80, 0x40, 0x20, 0x10, + 0x0f, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x3e, 0x01, 0x01, 0x01, + 0x01, 0x02, 0x04, 0x38, 0x08, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, + 0x15, 0x0a, 0x15, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/lpctool/trunk/charset.info b/lpctool/trunk/charset.info new file mode 100644 index 0000000..5c205b8 --- /dev/null +++ b/lpctool/trunk/charset.info @@ -0,0 +1,22 @@ +const unsigned char charset_info[] = { +0x08, 0x84, 0x48, 0x84, 0x44, 0x44, 0x48, 0x88, // 0- 15 graticule & borders +0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, // 16- 31 graticule & symbols +0x21, 0x35, 0x55, 0x51, 0x33, 0x55, 0x35, 0x24, // 32- 47 ascii, font 1 +0x55, 0x55, 0x55, 0x55, 0x55, 0x23, 0x44, 0x45, // 48- 63 ascii, font 1 +0x55, 0x55, 0x55, 0x55, 0x53, 0x55, 0x55, 0x55, // 64- 80 ascii, font 1 +0x55, 0x55, 0x55, 0x55, 0x55, 0x53, 0x43, 0x35, // 80- 95 ascii, font 1 +0x24, 0x44, 0x44, 0x44, 0x43, 0x34, 0x35, 0x44, // 96-112 ascii, font 1 +0x44, 0x44, 0x34, 0x55, 0x54, 0x43, 0x13, 0x55, // 112-127 ascii, font 1 +0x32, 0x55, 0x55, 0x53, 0x44, 0x54, 0x35, 0x25, // 128-143 ascii, bold font +0x55, 0x55, 0x55, 0x55, 0x55, 0x23, 0x54, 0x55, // 144-159 ascii, bold font +0x55, 0x55, 0x55, 0x55, 0x54, 0x55, 0x55, 0x55, // 160-175 ascii, bold font +0x55, 0x55, 0x55, 0x55, 0x65, 0x54, 0x54, 0x55, // 176-191 ascii, bold font +0x25, 0x55, 0x55, 0x55, 0x54, 0x45, 0x47, 0x55, // 192-207 ascii, bold font +0x55, 0x55, 0x55, 0x57, 0x55, 0x54, 0x24, 0x55, // 208-223 ascii, bold font +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, // 224-239 symbols +0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 240-255 symbols +0x33, 0x33, 0x33, 0x33, 0x33, 0x12, 0x33, 0x33, // 256-271 small numbers +0x55, 0x33, 0x68, 0x87, 0x84, 0x44, 0x44, 0x44 // 272-288 symbols +}; + +const unsigned char charset_dlines = 1; diff --git a/lpctool/trunk/crt.s b/lpctool/trunk/crt.s new file mode 100644 index 0000000..9e1dd44 --- /dev/null +++ b/lpctool/trunk/crt.s @@ -0,0 +1,163 @@ +/* ************************************************************* + + crt.s STARTUP ASSEMBLY CODE + ----------------------- + + + Module includes the interrupt vectors and start-up code. + +****************************************************************/ + +/* Stack Sizes */ +.set UND_STACK_SIZE, 0x00000004 /* stack for "undefined instruction" interrupts is 4 bytes */ +.set ABT_STACK_SIZE, 0x00000004 /* stack for "abort" interrupts is 4 bytes */ +.set FIQ_STACK_SIZE, 0x00000010 /* stack for "FIQ" interrupts is 4 bytes */ +.set IRQ_STACK_SIZE, 0X00000020 /* stack for "IRQ" normal interrupts is 4 bytes */ +.set SVC_STACK_SIZE, 0x00000010 /* stack for "SVC" supervisor mode is 4 bytes */ + + + +/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs (program status registers) */ +.set MODE_USR, 0x10 /* Normal User Mode */ +.set MODE_FIQ, 0x11 /* FIQ Processing Fast Interrupts Mode */ +.set MODE_IRQ, 0x12 /* IRQ Processing Standard Interrupts Mode */ +.set MODE_SVC, 0x13 /* Supervisor Processing Software Interrupts Mode */ +.set MODE_ABT, 0x17 /* Abort Processing memory Faults Mode */ +.set MODE_UND, 0x1B /* Undefined Processing Undefined Instructions Mode */ +.set MODE_SYS, 0x1F /* System Running Priviledged Operating System Tasks Mode */ + +.set I_BIT, 0x80 /* when I bit is set, IRQ is disabled (program status registers) */ +.set F_BIT, 0x40 /* when F bit is set, FIQ is disabled (program status registers) */ + + +.text +.arm + +.global Reset_Handler +.global _startup +.func _startup + +_startup: + +# Exception Vectors + +_vectors: ldr PC, Reset_Addr + ldr PC, Undef_Addr + ldr PC, SWI_Addr + ldr PC, PAbt_Addr + ldr PC, DAbt_Addr + nop /* Reserved Vector (holds Philips ISP checksum) */ + ldr PC, [PC,#-0xFF0] /* see page 71 of "Insiders Guide to the Philips ARM7-Based Microcontrollers" by Trevor Martin */ + ldr PC, FIQ_Addr + +Reset_Addr: .word Reset_Handler /* defined in this module below */ +Undef_Addr: .word UNDEF_Routine /* defined in main.c */ +SWI_Addr: .word SWI_Routine /* defined in main.c */ +PAbt_Addr: .word UNDEF_Routine /* defined in main.c */ +DAbt_Addr: .word UNDEF_Routine /* defined in main.c */ +IRQ_Addr: .word IRQ_Routine /* defined in main.c */ +FIQ_Addr: .word FIQ_Routine /* defined in main.c */ + .word 0 /* rounds the vectors and ISR addresses to 64 bytes total */ + + +# Reset Handler + +Reset_Handler: + + /* Setup a stack for each mode - note that this only sets up a usable stack + for User mode. Also each mode is setup with interrupts initially disabled. */ + + ldr r0, =_stack_end + msr CPSR_c, #MODE_UND|I_BIT|F_BIT /* Undefined Instruction Mode */ + mov sp, r0 + sub r0, r0, #UND_STACK_SIZE + msr CPSR_c, #MODE_ABT|I_BIT|F_BIT /* Abort Mode */ + mov sp, r0 + sub r0, r0, #ABT_STACK_SIZE + msr CPSR_c, #MODE_FIQ|I_BIT|F_BIT /* FIQ Mode */ + mov sp, r0 + sub r0, r0, #FIQ_STACK_SIZE + msr CPSR_c, #MODE_IRQ|I_BIT|F_BIT /* IRQ Mode */ + mov sp, r0 + sub r0, r0, #IRQ_STACK_SIZE + msr CPSR_c, #MODE_SVC|I_BIT|F_BIT /* Supervisor Mode */ + mov sp, r0 + sub r0, r0, #SVC_STACK_SIZE + msr CPSR_c, #MODE_SYS|F_BIT /* User Mode */ + mov sp, r0 + + /* set up pins and membanks */ + ldr r0, = PINSEL2 + ldr r2, =0xD6041D4 + str r2, [r0] + + ldr r1, =0x10000420 + ldr r0,=BCFG0 + str r1,[r0] + str r1,[r0,#0x08] + + /* copy .data section (Copy from ROM to RAM) */ + ldr R1, =_etext + ldr R2, =_data + ldr R3, =_edata +1: cmp R2, R3 + ldrlo R0, [R1], #4 + strlo R0, [R2], #4 + blo 1b + + /* Clear .bss section (Zero init) */ + + mov R0, #0 + ldr R1, =_bss_start + ldr R2, =_bss_end +2: cmp R1, R2 + strlo R0, [R1], #4 + blo 2b + + + + /* set up the pll */ + ldr r0, =0xe01fc000 + ldr r2, =0xaa + ldr r3, =0x55 + ldr r1, =0x03 + str r1, [r0,#0x80] + ldr r1, =0x0 + str r1, [r0,#0x100] + ldr r1, =0x42 + str r1,[r0,#0x84] + str r2, [r0,#0x8c] + str r3, [r0,#0x8c] + + ldr r2, =IO0PIN + mov r3, #0x10 + str r3, [r2,#0xc] + ldr r3, [r2,#8] + bic r3, r3, #0x10 + str r3, [r2,#8] + + ldr r1, =0xc42 + ldr r0, =BCFG1 + str r1, [r0] + + ldr r2, =PINSEL0 + ldr r3, [r2,#0x14] + orr r3, r3, #0x800 + str r3, [r2,#0x14] + ldr r3, [r2,#0x14] + orr r3, r3, #0x800000 + str r3, [r2,#0x14] + + /* Enter the C code */ + mov r0,#0 + mov r1,r0 + mov r2,r0 + mov fp,r0 + mov r7,r0 + ldr r10,=main + mov lr,pc + bx r10 + +.endfunc +entry_mask: .word 0x4FFFFFFF /* defined in this module below */ +.end diff --git a/lpctool/trunk/flash.c b/lpctool/trunk/flash.c new file mode 100644 index 0000000..21a0253 --- /dev/null +++ b/lpctool/trunk/flash.c @@ -0,0 +1,230 @@ +#include "lpc2220.h" +#include "flash.h" +#include "serial.h" +#include "lcd.h" + +const unsigned long secaddr[19] = +{ 0x00000, + 0x02000, + 0x03000, + 0x04000, + 0x08000, + 0x10000, + 0x18000, + 0x20000, + 0x28000, + 0x30000, + 0x38000, + 0x40000, + 0x48000, + 0x50000, + 0x58000, + 0x60000, + 0x68000, + 0x70000, + 0x78000 }; + +unsigned long flash_base; +unsigned short check1, check2; + +void slow(void) +{ + BCFG0 = 0x10000420; + BCFG2 = 0x10000420; +} + +void fast(void) +{ + BCFG0 = 0x10000400; + BCFG2 = 0x10000400; +} +int eraseSector(unsigned char chip, unsigned char secnum) +{ + + if(chip == 0) + flash_base = FLASH0_BASE; + else + flash_base = FLASH1_BASE; + + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x80; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base + (secaddr[secnum]<<1))) = 0x30; + retry: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x44) == (check2 & 0x44)) + goto done; + if(!(check2 & 0x24)) + goto retry; + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x44) == (check2 & 0x44)) + goto done; + *((volatile unsigned short *)flash_base) = 0xF0; + return -1; + + done: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if(check1 != check2) + goto retry; + return 0; +} + +int eraseSectorAt(unsigned long sadr) +{ + + flash_base = sadr & 0xFF000000; + + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x80; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(sadr)) = 0x30; + + retry: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x44) == (check2 & 0x44)) + goto done; + if(!(check2 & 0x24)) + goto retry; + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x44) == (check2 & 0x44)) + goto done; + *((volatile unsigned short *)flash_base) = 0xF0; + return -1; + + done: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if(check1 != check2) + goto retry; + return 0; +} + +int eraseFlash(unsigned char chip) +{ + if(chip == 0) + flash_base = FLASH0_BASE; + else + flash_base = FLASH1_BASE; + + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x80; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x10; + + retry: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x44) == (check2 & 0x44)) + goto done; + if(!(check2 & 0x24)) + goto retry; + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x44) == (check2 & 0x44)) + goto done; + *((volatile unsigned short *)flash_base) = 0xF0; + return -1; + + done: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if(check1 != check2) + goto retry; + return 0; +} + +int writeWord(unsigned long addr, unsigned short data) +{ + flash_base = addr & 0xFF000000; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xA0; + *((volatile unsigned short *)(addr)) = data; + + retry: + check1 = *((volatile unsigned short *)addr); + check2 = *((volatile unsigned short *)addr); + if((check1 & 0x40) == (check2 & 0x40)) + goto done; + if(!(check2 & 0x20)) + goto retry; + check1 = *((volatile unsigned short *)addr); + check2 = *((volatile unsigned short *)addr); + if((check1 & 0x40) == (check2 & 0x40)) + goto done; + *((volatile unsigned short *)addr) = 0xF0; + return -1; + + done: + check1 = *((volatile unsigned short *)addr); + check2 = *((volatile unsigned short *)addr); + if(check1 != check2) + goto retry; + + return 0; +} + +void prepareBulk(unsigned long dst) +{ + flash_base = dst & 0xFF000000; + + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0xAA; + *((volatile unsigned short *)(flash_base | 0x554)) = 0x55; + *((volatile unsigned short *)(flash_base | 0xAAA)) = 0x20; +} + +void endBulk(unsigned long dst) +{ + flash_base = dst & 0xFF000000; + + *((volatile unsigned short *)(flash_base)) = 0x90; + *((volatile unsigned short *)(flash_base)) = 0x00; +} + +int writeBulk(unsigned long src, unsigned long dst, unsigned long cnt) +{ + flash_base = dst; + while(cnt--) + { + if(*((volatile unsigned short *)src) != 0xFFFF) + { + *((volatile unsigned short *)flash_base) = 0xA0; + *((volatile unsigned short *)flash_base) = *((volatile unsigned short *)src); + + retry: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x40) == (check2 & 0x40)) + goto done; + if(!(check2 & 0x20)) + goto retry; + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if((check1 & 0x40) == (check2 & 0x40)) + goto done; + *((volatile unsigned short *)flash_base) = 0xF0; + return -1; + + done: + check1 = *((volatile unsigned short *)flash_base); + check2 = *((volatile unsigned short *)flash_base); + if(check1 != check2) + goto retry; + } + src+=2; + flash_base+=2; + } + + return 0; +} diff --git a/lpctool/trunk/flash.h b/lpctool/trunk/flash.h new file mode 100644 index 0000000..6621209 --- /dev/null +++ b/lpctool/trunk/flash.h @@ -0,0 +1,16 @@ +#ifndef FLASH_H +#define FLASH_H + +#define FLASH0_BASE 0x80000000 +#define FLASH1_BASE 0x82000000 + +void prepareBulk(unsigned long dst); +void endBulk(unsigned long dst); +int eraseSector(unsigned char chip, unsigned char secnum); +int eraseSectorAt(unsigned long sadr); +int eraseFlash(unsigned char chip); +int writeWord(unsigned long addr, unsigned short data); +int writeBulk(unsigned long src, unsigned long dst, unsigned long cnt); +void lcd_set(unsigned char s); + +#endif diff --git a/lpctool/trunk/fonty.c b/lpctool/trunk/fonty.c new file mode 100644 index 0000000..aa023e2 --- /dev/null +++ b/lpctool/trunk/fonty.c @@ -0,0 +1,171 @@ +#include "lcd.h" +#include "fonty.h" + +#include "charset.info" +#include "charset.bits" + +static unsigned char tx, ty; +static unsigned short coff; +unsigned char *font_bits, *font_info; + +void set_font(unsigned char f) +{ + font_bits = (unsigned char*) charset_bits; + font_info = (unsigned char*) charset_info; + switch(f) + { + case 0: + coff = 0; + break; + case 1: + coff = 96; + break; + case 2: + coff = 224; + break; + case 3: + case 4: + coff = 272; + break; + } +} + +void _draw_char(unsigned int ch, unsigned char c, unsigned char m) +{ + unsigned char p,s; + unsigned int cpos, cnt; + + cpos = 0; + + for(cnt=0; cnt>1] & 0x0F); + } + else + { + cpos += (font_info[cnt>>1] >> 4); + } + } + + p = font_info[ch>>1]; + if(ch & 0x01) + { + p &= 0x0F; + } + else + { + p >>= 4; + } + + if(ty & 0x07) + { + s = ty & 0x07; + + for(cnt=0;cnt> (8-s); + else + drawbuf[0][p-cnt-1] = 0x00; + + if(c & 0x01) + drawbuf[1][p-cnt-1] = font_bits[cpos+cnt] >> (8-s); + else + drawbuf[1][p-cnt-1] = 0x00; + } + do_rcu(tx,ty+8,p,m); + } + else + { + for(cnt=0;cnt>4]+coff, c, m); + _draw_char(hval[v & 0x0F]+coff, c, m); +} + +void draw_hexS(unsigned char x, unsigned char y, const unsigned short v, unsigned char c, unsigned char m) +{ + tx = x; + ty = y; + draw_hexC(x, y, v >> 8, c, m); + draw_hexC(tx, ty, v & 0xFF, c, m); +} + +void draw_hexW(unsigned char x, unsigned char y, const unsigned long v, unsigned char c, unsigned char m) +{ + draw_hexS(x, y, v >> 16, c, m); + draw_hexS(tx, ty, v & 0xFFFF, c, m); +} diff --git a/lpctool/trunk/fonty.h b/lpctool/trunk/fonty.h new file mode 100644 index 0000000..2b34133 --- /dev/null +++ b/lpctool/trunk/fonty.h @@ -0,0 +1,14 @@ +#ifndef FONTY_H +#define FONTY_H + +extern unsigned char drawbuf[2][128]; + +void set_font(unsigned char f); +void draw_char(unsigned char x, unsigned char y, unsigned char ch, unsigned char c, unsigned char m); +void draw_string(unsigned char x, unsigned char y, char *st, unsigned char c, unsigned char m); +void draw_stringc(unsigned char x, unsigned char y, char *st, unsigned char cnt, unsigned char c, unsigned char m); +void draw_hexC(unsigned char x, unsigned char y, const unsigned char v, unsigned char c, unsigned char m); +void draw_hexS(unsigned char x, unsigned char y, const unsigned short v, unsigned char c, unsigned char m); +void draw_hexW(unsigned char x, unsigned char y, const unsigned long v, unsigned char c, unsigned char m); + +#endif diff --git a/lpctool/trunk/infohelper.c b/lpctool/trunk/infohelper.c new file mode 100644 index 0000000..9fef49d --- /dev/null +++ b/lpctool/trunk/infohelper.c @@ -0,0 +1,78 @@ +#include + +#include "infohelper.h" + +char verbosity; + +int printError(char *err) +{ + printf("ERROR: %s\n",err); + return 0; +} + +int printErrorS(char *err, char *xtra) +{ + if(xtra) + printf("ERROR: %s %s\n", err, xtra); + else + printf("ERROR: %s\n", err); + return 0; +} + +int printInfoS(unsigned char level, char *msg, char *xtra) +{ + if(level <= verbosity) + { + if(xtra) + printf("Info : %s %s\n", msg, xtra); + else + printf("Info : %s\n", msg); + return 1; + } + return 0; +} + +int printInfoH(unsigned char level, char *msg, unsigned long val) +{ + if(level <= verbosity) + { + printf("Info : %s 0x%08X\n", msg, val); + return 1; + } + return 0; +} + +const char heartbeat[] = { ".oOo" }; + +int printProgress(unsigned char level, char *msg, float cval, float maxval) +{ + unsigned int cur, cnt; + + static char beat = 0; + + if(level <= verbosity) + { + cur = (35 / maxval) * cval; + + cnt = 35-cur; + + printf("Progress: ["); + + while(cur--) + printf("*"); + + if(cnt) + printf("%c",heartbeat[beat]); + else + printf("*"); + + while(cnt--) + printf(" "); + + printf("\b]\r"); + fflush(stdout); + beat++; + beat &= 0x03; + } +} + diff --git a/lpctool/trunk/infohelper.h b/lpctool/trunk/infohelper.h new file mode 100644 index 0000000..cc6598f --- /dev/null +++ b/lpctool/trunk/infohelper.h @@ -0,0 +1,12 @@ +#ifndef TOOL_INFOHELPER +#define TOOL_INFOHELPER + +extern char verbosity; + +int printError(char *err); +int printErrorS(char *err, char *xtra); +int printInfoS(unsigned char level, char *msg, char *xtra); +int printInfoH(unsigned char level, char *msg, unsigned long val); +int printProgress(unsigned char level, char *msg, float cval, float maxval); + +#endif diff --git a/lpctool/trunk/irq.c b/lpctool/trunk/irq.c new file mode 100644 index 0000000..be2e6df --- /dev/null +++ b/lpctool/trunk/irq.c @@ -0,0 +1,43 @@ +#include "lpc2220.hh" +#include "irq.h" + +#define IRQ_MASK 0x00000080 + +static inline unsigned asm_get_cpsr(void) +{ + unsigned long retval; + asm volatile (" mrs %0, cpsr" : "=r" (retval) : /* no inputs */ ); + return retval; +} + +static inline void asm_set_cpsr(unsigned val) +{ + asm volatile (" msr cpsr, %0" : /* no outputs */ : "r" (val) ); +} + +unsigned enableIRQ(void) +{ + unsigned _cpsr; + + _cpsr = asm_get_cpsr(); + asm_set_cpsr(_cpsr & ~IRQ_MASK); + return _cpsr; +} + +unsigned disableIRQ(void) +{ + unsigned _cpsr; + + _cpsr = asm_get_cpsr(); + asm_set_cpsr(_cpsr | IRQ_MASK); + return _cpsr; +} + +unsigned restoreIRQ(unsigned oldCPSR) +{ + unsigned _cpsr; + + _cpsr = asm_get_cpsr(); + asm_set_cpsr((_cpsr & ~IRQ_MASK) | (oldCPSR & IRQ_MASK)); + return _cpsr; +} diff --git a/lpctool/trunk/lcd.c b/lpctool/trunk/lcd.c new file mode 100644 index 0000000..9f57b1c --- /dev/null +++ b/lpctool/trunk/lcd.c @@ -0,0 +1,450 @@ +#include "lpc2220.h" +#include "lcd.h" +#include "fonty.h" +//#include "b.h" + +void pause(unsigned int ptime) +{ + unsigned long xx; + xx = ptime * 750; + while(xx--) + {}; +} + +void clearStatus(void) +{ + draw_block(0, 151, 128, 10, 3, DRAW_ERASE); + timer++; +} + +void drawStatus(char *msg) +{ + draw_block(0, 152, 128, 10, 3, DRAW_PUT); + draw_string(1,152,">>",3,DRAW_XOR); + draw_string(16,152,msg,3,DRAW_XOR); + timer = 0; +} + +void lcd_fill(unsigned char f) +{ + unsigned char x,y; + for(y=0;y<20;y++) + { + LCD_CMD = 0xB0; + LCD_CMD = y; + LCD_CMD = 0x10; + LCD_CMD = 0x00; + for(x=0;x<128;x++) + { + LCD_DATA = f; + LCD_DATA = f; + } + } +} + +void lcd_set(unsigned char s) +{ + if(s == 0) + { + LCD_CMD = 0xA0; // set segment remap (00H mapped to seg0) + LCD_CMD = 0xC8; // set com output scan direction (remapped mode) + } + else + { + LCD_CMD = 0xA1; // set segment remap (7FH mapped to seg0) + LCD_CMD = 0xC0; // set com output scan direction (normal mode) + } +} + +void lcd_init(unsigned char s) +{ + LCD_CMD = 0xE1; // exit power save mode + LCD_CMD = 0xE2; // software reset + pause(0x64); + LCD_CMD = 0xAB; // start internal oscillator + LCD_CMD = 0x27; // set internal regulator resistor ratio (8.1) + LCD_CMD = 0x81; // volume cmd + LCD_CMD = 0x3B; // volume cmd value + LCD_CMD = 0x65; // set DC-DC converter factor (4x) + LCD_CMD = 0x60; // set upper window corner ax cmd + LCD_CMD = 0x1C; // set upper window corner ax value + LCD_CMD = 0x61; // set upper window corner ay cmd + LCD_CMD = 0x0A; // set upper window corner ay value + LCD_CMD = 0x62; // set lower window corner bx cmd + LCD_CMD = 0x75; // set lower window corner bx value + LCD_CMD = 0x63; // set lower window corner by cmd + LCD_CMD = 0x81; // set lower window corner by value + LCD_CMD = 0x90; // set PWM and FRC (4-frames) + LCD_CMD = 0x88; // set white mode frame 2nd and 1st cmd + LCD_CMD = 0x00; // set white mode frame 2nd and 1st value + LCD_CMD = 0x89; // set white mode frame 4th and 3rd cmd + LCD_CMD = 0x00; // set white mode frame 4th and 3rd value + LCD_CMD = 0x8A; // set light gray mode frame 2nd and 1st cmd + LCD_CMD = 0x55; // set light gray mode frame 2nd and 1st value + LCD_CMD = 0x8B; // set light gray mode frame 4th and 3rd cmd + LCD_CMD = 0x55; // set light gray mode frame 4th and 3rd vakue + LCD_CMD = 0x8C; // set dark gray mode frame 2nd and 1st cmd + LCD_CMD = 0x66; // set dark gray mode frame 2nd and 1st value + LCD_CMD = 0x8D; // set dark gray mode frame 4th and 3rd cmd + LCD_CMD = 0x66; // set dark gray mode frame 4th and 3rd vakue + LCD_CMD = 0x8E; // set black mode frame 2nd and 1st cmd + LCD_CMD = 0xAA; // set black mode frame 2nd and 1st value + LCD_CMD = 0x8F; // set black mode frame 4th and 3rd cmd + LCD_CMD = 0xAA; // set black mode frame 4th and 3rd value + + lcd_set(s); + + LCD_CMD = 0x2E; // set power control register (boost on, reg on, buffer off) + + pause(0x64); + + LCD_CMD = 0x2F; // set power control register (boost on, reg on, buffer on) + LCD_CMD = 0xA4; // set entire display on, normal mode) + LCD_CMD = 0xA6; // set normal display mode, inverse = 0xA7 + + + lcd_fill(0x00); + + LCD_CMD = 0xAF; + + set_font(0); +} + +void lcd_enable(unsigned char e) +{ + if(e) + { + LCD_CMD = 0xAF; // set display on + } + else + { + LCD_CMD = 0xAE; // set display off + } +} + + +unsigned char rcubuf[2][128]; +unsigned char drawbuf[2][128]; + +void do_rcu(unsigned char x, unsigned char y, unsigned char l, unsigned char m) +{ + unsigned char q; + + LCD_CMD = 0xB0; + LCD_CMD = (y >> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + q = LCD_DATA; + q = l; + + while(q--) + { + rcubuf[0][q] = LCD_DATA; + rcubuf[1][q] = LCD_DATA; + } + + q = LCD_DATA; + + LCD_CMD = 0xB0; + LCD_CMD = (y >> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + q = l; + + switch(m) + { + case DRAW_PUT: // draw put + while(q--) + { + LCD_DATA = rcubuf[0][q] | drawbuf[0][q]; + LCD_DATA = rcubuf[1][q] | drawbuf[1][q]; + } + break; + case DRAW_XOR: // draw xor + while(q--) + { + LCD_DATA = rcubuf[0][q] ^ drawbuf[0][q]; + LCD_DATA = rcubuf[1][q] ^ drawbuf[1][q]; + } + break; + case DRAW_ERASE: // draw erase + while(q--) + { + LCD_DATA = rcubuf[0][q] & ~drawbuf[0][q]; + LCD_DATA = rcubuf[1][q] & ~drawbuf[1][q]; + } + break; + } +} + +void do_rcuS(unsigned char x, unsigned char y, unsigned char m) +{ + unsigned char q; + + LCD_CMD = 0xB0; + LCD_CMD = (y >> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + q = LCD_DATA; + rcubuf[0][0] = LCD_DATA; + rcubuf[1][0] = LCD_DATA; + + q = LCD_DATA; + + LCD_CMD = 0xB0; + LCD_CMD = (y >> 3); + LCD_CMD = (0x10 + (x >> 4)); + LCD_CMD = (x & 0x0F); + + switch(m) + { + case 0: // draw put + LCD_DATA = rcubuf[0][0] | drawbuf[0][0]; + LCD_DATA = rcubuf[1][0] | drawbuf[1][0]; + break; + case 1: // draw xor + LCD_DATA = rcubuf[0][0] ^ drawbuf[0][0]; + LCD_DATA = rcubuf[1][0] ^ drawbuf[1][0]; + break; + case 2: // draw erase + LCD_DATA = rcubuf[0][0] & ~drawbuf[0][0]; + LCD_DATA = rcubuf[1][0] & ~drawbuf[1][0]; + break; + } +} + +void draw_block(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char c, unsigned char m) +{ + unsigned char q,s; + unsigned char yy,ss,vv,ww,xx; + unsigned char segm; + + s = y; + + if(h) + { + + + + yy = h; + ss = y >> 3; + vv = y & 0x07; + + ww = yy & 0x07; + + segm = 0xFF; + + xx = 8; + if(yy < 8) + { + segm >>= (8-ww); + xx -= (8-ww); + if(vv > (8-xx)) + { + xx = yy -(vv-(8-xx)); + } + else + { + xx = yy; + } + } + else + { + xx -= vv; + } + + segm <<= vv; + + q = w; + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = segm; + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = segm; + else + drawbuf[1][q] = 0; + } + do_rcu(x,s,w,m); + + yy -= xx; + + while(yy > 8) + { + s += 8; + yy -= 8; + q = w; + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = 0xFF; + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = 0xFF; + else + drawbuf[1][q] = 0; + } + do_rcu(x,s,w,m); + } + + if(yy) + { + s += 8; + q = w; + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = 0xFF >> (8-yy); + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = 0xFF >> (8-yy); + else + drawbuf[1][q] = 0; + } + do_rcu(x,s,w,m); + } + } +} + +void draw_hline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m) +{ + unsigned char p,q; + + q = l; + p = 0x01 << (y & 0x07); + + while(q--) + { + if(c & 0x02) + drawbuf[0][q] = p; + else + drawbuf[0][q] = 0; + + if(c & 0x01) + drawbuf[1][q] = p; + else + drawbuf[1][q] = 0; + } + do_rcu(x,y,l,m); +} + +void draw_vline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m) +{ + unsigned char s; + unsigned char yy,ss,vv,ww,xx; + unsigned char segm; + + s = y; + + if(l) + { + + + + yy = l; + ss = y >> 3; + vv = y & 0x07; + + ww = yy & 0x07; + + segm = 0xFF; + + xx = 8; + if(yy < 8) + { + segm >>= (8-ww); + xx -= (8-ww); + if(vv > (8-xx)) + { + xx = yy -(vv-(8-xx)); + } + else + { + xx = yy; + } + } + else + { + xx -= vv; + } + + segm <<= vv; + + if(c & 0x02) + drawbuf[0][0] = segm; + else + drawbuf[0][0] = 0; + + if(c & 0x01) + drawbuf[1][0] = segm; + else + drawbuf[1][0] = 0; + + do_rcuS(x,s,m); + + yy -= xx; + + while(yy > 8) + { + s += 8; + yy -= 8; + if(c & 0x02) + drawbuf[0][0] = 0xFF; + else + drawbuf[0][0] = 0; + + if(c & 0x01) + drawbuf[1][0] = 0xFF; + else + drawbuf[1][0] = 0; + do_rcuS(x,s,m); + } + + if(yy) + { + s += 8; + if(c & 0x02) + drawbuf[0][0] = 0xFF >> (8-yy); + else + drawbuf[0][0] = 0; + + if(c & 0x01) + drawbuf[1][0] = 0xFF >> (8-yy); + else + drawbuf[1][0] = 0; + do_rcuS(x,s,m); + } + } +} + +void draw_rect(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char lw, unsigned char c, unsigned char m) +{ + if(lw) + { + if(lw == 1) + { + draw_hline(x, y, w, c, m); + draw_hline(x, y+h-1, w, c, m); + + draw_vline(x, y+1, h-2, c, m); + draw_vline(x+w-1, y+1, h-2, c, m); + } + else + { + draw_block(x, y, w, lw, c, m); + draw_block(x, y+h-lw, w, lw, c, m); + draw_block(x, y+lw, lw, h-(2*lw), c, m); + draw_block(x+w-lw, y+lw, lw, h-(2*lw), c, m); + } + } +} diff --git a/lpctool/trunk/lcd.h b/lpctool/trunk/lcd.h new file mode 100644 index 0000000..9969d5b --- /dev/null +++ b/lpctool/trunk/lcd.h @@ -0,0 +1,42 @@ +#ifndef LCD_H +#define LCD_H + +// the lcd data & command ports +#define LCD_CMD (*((volatile unsigned char *) 0x81000000)) +#define LCD_DATA (*((volatile unsigned char *) 0x81000001)) + +// drawmodes +#define DRAW_PUT 0 +#define DRAW_XOR 1 +#define DRAW_ERASE 2 +#define DRAW_RAW 10 +#define DRAW_RAW_INV 11 + +#define TIMEOUT 0x00400000 + +struct t_bitmap +{ + unsigned char width; + unsigned char height; + unsigned char mode; + unsigned char *data; +} ; + +extern unsigned long timer; + +struct t_bitmap bitmap; + +void lcd_init(unsigned char s); +void lcd_enable(unsigned char e); + +void do_rcu(unsigned char x, unsigned char y, unsigned char l, unsigned char m); + +void lcd_fill(unsigned char f); +void draw_block(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char c, unsigned char m); +void draw_hline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m); +void draw_vline(unsigned char x, unsigned char y, unsigned char l, unsigned char c, unsigned char m); +void draw_rect(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned char lw, unsigned char c, unsigned char m); +void clearStatus(void); +void drawStatus(char *msg); + +#endif diff --git a/lpctool/trunk/lpc2220.h b/lpctool/trunk/lpc2220.h new file mode 100644 index 0000000..4c59632 --- /dev/null +++ b/lpctool/trunk/lpc2220.h @@ -0,0 +1,261 @@ +/********************************************************/ +/* */ +/* philips */ +/* lpc2220 */ +/* */ +/********************************************************/ +#ifndef LPC2220_H +#define LPC2220_H + +/* External Memory Controller (EMC) */ +#define BCFG0 (*((volatile unsigned long *) 0xFFE00000)) +#define BCFG1 (*((volatile unsigned long *) 0xFFE00004)) +#define BCFG2 (*((volatile unsigned long *) 0xFFE00008)) +#define BCFG3 (*((volatile unsigned long *) 0xFFE0000C)) + +/* Vectored Interrupt Controller (VIC) */ +#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000)) +#define VICFIQStatus (*((volatile unsigned long *) 0xFFFFF004)) +#define VICRawIntr (*((volatile unsigned long *) 0xFFFFF008)) +#define VICIntSelect (*((volatile unsigned long *) 0xFFFFF00C)) +#define VICIntEnable (*((volatile unsigned long *) 0xFFFFF010)) +#define VICIntEnClr (*((volatile unsigned long *) 0xFFFFF014)) +#define VICSoftInt (*((volatile unsigned long *) 0xFFFFF018)) +#define VICSoftIntClr (*((volatile unsigned long *) 0xFFFFF01C)) +#define VICProtection (*((volatile unsigned long *) 0xFFFFF020)) +#define VICVectAddr (*((volatile unsigned long *) 0xFFFFF030)) +#define VICDefVectAddr (*((volatile unsigned long *) 0xFFFFF034)) +#define VICVectAddr0 (*((volatile unsigned long *) 0xFFFFF100)) +#define VICVectAddr1 (*((volatile unsigned long *) 0xFFFFF104)) +#define VICVectAddr2 (*((volatile unsigned long *) 0xFFFFF108)) +#define VICVectAddr3 (*((volatile unsigned long *) 0xFFFFF10C)) +#define VICVectAddr4 (*((volatile unsigned long *) 0xFFFFF110)) +#define VICVectAddr5 (*((volatile unsigned long *) 0xFFFFF114)) +#define VICVectAddr6 (*((volatile unsigned long *) 0xFFFFF118)) +#define VICVectAddr7 (*((volatile unsigned long *) 0xFFFFF11C)) +#define VICVectAddr8 (*((volatile unsigned long *) 0xFFFFF120)) +#define VICVectAddr9 (*((volatile unsigned long *) 0xFFFFF124)) +#define VICVectAddr10 (*((volatile unsigned long *) 0xFFFFF128)) +#define VICVectAddr11 (*((volatile unsigned long *) 0xFFFFF12C)) +#define VICVectAddr12 (*((volatile unsigned long *) 0xFFFFF130)) +#define VICVectAddr13 (*((volatile unsigned long *) 0xFFFFF134)) +#define VICVectAddr14 (*((volatile unsigned long *) 0xFFFFF138)) +#define VICVectAddr15 (*((volatile unsigned long *) 0xFFFFF13C)) +#define VICVectCntl0 (*((volatile unsigned long *) 0xFFFFF200)) +#define VICVectCntl1 (*((volatile unsigned long *) 0xFFFFF204)) +#define VICVectCntl2 (*((volatile unsigned long *) 0xFFFFF208)) +#define VICVectCntl3 (*((volatile unsigned long *) 0xFFFFF20C)) +#define VICVectCntl4 (*((volatile unsigned long *) 0xFFFFF210)) +#define VICVectCntl5 (*((volatile unsigned long *) 0xFFFFF214)) +#define VICVectCntl6 (*((volatile unsigned long *) 0xFFFFF218)) +#define VICVectCntl7 (*((volatile unsigned long *) 0xFFFFF21C)) +#define VICVectCntl8 (*((volatile unsigned long *) 0xFFFFF220)) +#define VICVectCntl9 (*((volatile unsigned long *) 0xFFFFF224)) +#define VICVectCntl10 (*((volatile unsigned long *) 0xFFFFF228)) +#define VICVectCntl11 (*((volatile unsigned long *) 0xFFFFF22C)) +#define VICVectCntl12 (*((volatile unsigned long *) 0xFFFFF230)) +#define VICVectCntl13 (*((volatile unsigned long *) 0xFFFFF234)) +#define VICVectCntl14 (*((volatile unsigned long *) 0xFFFFF238)) +#define VICVectCntl15 (*((volatile unsigned long *) 0xFFFFF23C)) + +/* Pin Connect Block */ +#define PINSEL0 (*((volatile unsigned long *) 0xE002C000)) +#define PINSEL1 (*((volatile unsigned long *) 0xE002C004)) +#define PINSEL2 (*((volatile unsigned long *) 0xE002C014)) + +/* General Purpose Input/Output (GPIO) */ +#define IOPIN0 (*((volatile unsigned long *) 0xE0028000)) +#define IOSET0 (*((volatile unsigned long *) 0xE0028004)) +#define IODIR0 (*((volatile unsigned long *) 0xE0028008)) +#define IOCLR0 (*((volatile unsigned long *) 0xE002800C)) +#define IOPIN1 (*((volatile unsigned long *) 0xE0028010)) +#define IOSET1 (*((volatile unsigned long *) 0xE0028014)) +#define IODIR1 (*((volatile unsigned long *) 0xE0028018)) +#define IOCLR1 (*((volatile unsigned long *) 0xE002801C)) +#define IOPIN2 (*((volatile unsigned long *) 0xE0028020)) +#define IOSET2 (*((volatile unsigned long *) 0xE0028024)) +#define IODIR2 (*((volatile unsigned long *) 0xE0028028)) +#define IOCLR2 (*((volatile unsigned long *) 0xE002802C)) +#define IOPIN3 (*((volatile unsigned long *) 0xE0028030)) +#define IOSET3 (*((volatile unsigned long *) 0xE0028034)) +#define IODIR3 (*((volatile unsigned long *) 0xE0028038)) +#define IOCLR3 (*((volatile unsigned long *) 0xE002803C)) + +/* Phase Locked Loop (PLL) */ +#define PLLCON (*((volatile unsigned char *) 0xE01FC080)) +#define PLLCFG (*((volatile unsigned char *) 0xE01FC084)) +#define PLLSTAT (*((volatile unsigned short*) 0xE01FC088)) +#define PLLFEED (*((volatile unsigned char *) 0xE01FC08C)) + +/* VPB Divider */ +#define VPBDIV (*((volatile unsigned char *) 0xE01FC100)) + +/* Power Control */ +#define PCON (*((volatile unsigned char *) 0xE01FC0C0)) +#define PCONP (*((volatile unsigned long *) 0xE01FC0C4)) + +/* External Interrupts */ +#define EXTINT (*((volatile unsigned char *) 0xE01FC140)) +#define EXTWAKE (*((volatile unsigned char *) 0xE01FC144)) +#define EXTMODE (*((volatile unsigned char *) 0xE01FC148)) +#define EXTPOLAR (*((volatile unsigned char *) 0xE01FC14C)) + +/* Timer 0 */ +#define T0IR (*((volatile unsigned long *) 0xE0004000)) +#define T0TCR (*((volatile unsigned long *) 0xE0004004)) +#define T0TC (*((volatile unsigned long *) 0xE0004008)) +#define T0PR (*((volatile unsigned long *) 0xE000400C)) +#define T0PC (*((volatile unsigned long *) 0xE0004010)) +#define T0MCR (*((volatile unsigned long *) 0xE0004014)) +#define T0MR0 (*((volatile unsigned long *) 0xE0004018)) +#define T0MR1 (*((volatile unsigned long *) 0xE000401C)) +#define T0MR2 (*((volatile unsigned long *) 0xE0004020)) +#define T0MR3 (*((volatile unsigned long *) 0xE0004024)) +#define T0CCR (*((volatile unsigned long *) 0xE0004028)) +#define T0CR0 (*((volatile unsigned long *) 0xE000402C)) +#define T0CR1 (*((volatile unsigned long *) 0xE0004030)) +#define T0CR2 (*((volatile unsigned long *) 0xE0004034)) +#define T0CR3 (*((volatile unsigned long *) 0xE0004038)) +#define T0EMR (*((volatile unsigned long *) 0xE000403C)) + +/* Timer 1 */ +#define T1IR (*((volatile unsigned long *) 0xE0008000)) +#define T1TCR (*((volatile unsigned long *) 0xE0008004)) +#define T1TC (*((volatile unsigned long *) 0xE0008008)) +#define T1PR (*((volatile unsigned long *) 0xE000800C)) +#define T1PC (*((volatile unsigned long *) 0xE0008010)) +#define T1MCR (*((volatile unsigned long *) 0xE0008014)) +#define T1MR0 (*((volatile unsigned long *) 0xE0008018)) +#define T1MR1 (*((volatile unsigned long *) 0xE000801C)) +#define T1MR2 (*((volatile unsigned long *) 0xE0008020)) +#define T1MR3 (*((volatile unsigned long *) 0xE0008024)) +#define T1CCR (*((volatile unsigned long *) 0xE0008028)) +#define T1CR0 (*((volatile unsigned long *) 0xE000802C)) +#define T1CR1 (*((volatile unsigned long *) 0xE0008030)) +#define T1CR2 (*((volatile unsigned long *) 0xE0008034)) +#define T1CR3 (*((volatile unsigned long *) 0xE0008038)) +#define T1EMR (*((volatile unsigned long *) 0xE000803C)) + +/* Pulse Width Modulator (PWM) */ +#define PWMIR (*((volatile unsigned long *) 0xE0014000)) +#define PWMTCR (*((volatile unsigned long *) 0xE0014004)) +#define PWMTC (*((volatile unsigned long *) 0xE0014008)) +#define PWMPR (*((volatile unsigned long *) 0xE001400C)) +#define PWMPC (*((volatile unsigned long *) 0xE0014010)) +#define PWMMCR (*((volatile unsigned long *) 0xE0014014)) +#define PWMMR0 (*((volatile unsigned long *) 0xE0014018)) +#define PWMMR1 (*((volatile unsigned long *) 0xE001401C)) +#define PWMMR2 (*((volatile unsigned long *) 0xE0014020)) +#define PWMMR3 (*((volatile unsigned long *) 0xE0014024)) +#define PWMMR4 (*((volatile unsigned long *) 0xE0014040)) +#define PWMMR5 (*((volatile unsigned long *) 0xE0014044)) +#define PWMMR6 (*((volatile unsigned long *) 0xE0014048)) +#define PWMCCR (*((volatile unsigned long *) 0xE0014028)) +#define PWMCR0 (*((volatile unsigned long *) 0xE001402C)) +#define PWMCR1 (*((volatile unsigned long *) 0xE0014030)) +#define PWMCR2 (*((volatile unsigned long *) 0xE0014034)) +#define PWMCR3 (*((volatile unsigned long *) 0xE0014038)) +#define PWMEMR (*((volatile unsigned long *) 0xE001403C)) +#define PWMPCR (*((volatile unsigned long *) 0xE001404C)) +#define PWMLER (*((volatile unsigned long *) 0xE0014050)) + +/* Universal Asynchronous Receiver Transmitter 0 (UART0) */ +#define U0RBR (*((volatile unsigned char *) 0xE000C000)) +#define U0THR (*((volatile unsigned char *) 0xE000C000)) +#define U0IER (*((volatile unsigned char *) 0xE000C004)) +#define U0IIR (*((volatile unsigned char *) 0xE000C008)) +#define U0FCR (*((volatile unsigned char *) 0xE000C008)) +#define U0LCR (*((volatile unsigned char *) 0xE000C00C)) +#define U0MCR (*((volatile unsigned char *) 0xE000C010)) +#define U0LSR (*((volatile unsigned char *) 0xE000C014)) +#define U0MSR (*((volatile unsigned char *) 0xE000C018)) +#define U0SCR (*((volatile unsigned char *) 0xE000C01C)) +#define U0FDR (*((volatile unsigned char *) 0xE000C028)) +#define U0DLL (*((volatile unsigned char *) 0xE000C000)) +#define U0DLM (*((volatile unsigned char *) 0xE000C004)) + +/* Universal Asynchronous Receiver Transmitter 1 (UART1) */ +#define U1RBR (*((volatile unsigned char *) 0xE0010000)) +#define U1THR (*((volatile unsigned char *) 0xE0010000)) +#define U1IER (*((volatile unsigned char *) 0xE0010004)) +#define U1IIR (*((volatile unsigned char *) 0xE0010008)) +#define U1FCR (*((volatile unsigned char *) 0xE0010008)) +#define U1LCR (*((volatile unsigned char *) 0xE001000C)) +#define U1MCR (*((volatile unsigned char *) 0xE0010010)) +#define U1LSR (*((volatile unsigned char *) 0xE0010014)) +#define U1MSR (*((volatile unsigned char *) 0xE0010018)) +#define U1SCR (*((volatile unsigned char *) 0xE001001C)) +#define U1DLL (*((volatile unsigned char *) 0xE0010000)) +#define U1DLM (*((volatile unsigned char *) 0xE0010004)) + +/* I2C Interface */ +#define I2CONSET (*((volatile unsigned char *) 0xE001C000)) +#define I2STAT (*((volatile unsigned char *) 0xE001C004)) +#define I2DAT (*((volatile unsigned char *) 0xE001C008)) +#define I2ADR (*((volatile unsigned char *) 0xE001C00C)) +#define I2SCLH (*((volatile unsigned short*) 0xE001C010)) +#define I2SCLL (*((volatile unsigned short*) 0xE001C014)) +#define I2CONCLR (*((volatile unsigned char *) 0xE001C018)) + +/* SPI0 (Serial Peripheral Interface 0) */ +#define S0SPCR (*((volatile unsigned char *) 0xE0020000)) +#define S0SPSR (*((volatile unsigned char *) 0xE0020004)) +#define S0SPDR (*((volatile unsigned char *) 0xE0020008)) +#define S0SPCCR (*((volatile unsigned char *) 0xE002000C)) +#define S0SPTCR (*((volatile unsigned char *) 0xE0020010)) +#define S0SPTSR (*((volatile unsigned char *) 0xE0020014)) +#define S0SPTOR (*((volatile unsigned char *) 0xE0020018)) +#define S0SPINT (*((volatile unsigned char *) 0xE002001C)) + +/* SPI1 (Serial Peripheral Interface 1) */ +#define S1SPCR (*((volatile unsigned char *) 0xE0030000)) +#define S1SPSR (*((volatile unsigned char *) 0xE0030004)) +#define S1SPDR (*((volatile unsigned char *) 0xE0030008)) +#define S1SPCCR (*((volatile unsigned char *) 0xE003000C)) +#define S1SPTCR (*((volatile unsigned char *) 0xE0030010)) +#define S1SPTSR (*((volatile unsigned char *) 0xE0030014)) +#define S1SPTOR (*((volatile unsigned char *) 0xE0030018)) +#define S1SPINT (*((volatile unsigned char *) 0xE003001C)) + +/* Real Time Clock */ +#define ILR (*((volatile unsigned char *) 0xE0024000)) +#define CTC (*((volatile unsigned short*) 0xE0024004)) +#define CCR (*((volatile unsigned char *) 0xE0024008)) +#define CIIR (*((volatile unsigned char *) 0xE002400C)) +#define AMR (*((volatile unsigned char *) 0xE0024010)) +#define CTIME0 (*((volatile unsigned long *) 0xE0024014)) +#define CTIME1 (*((volatile unsigned long *) 0xE0024018)) +#define CTIME2 (*((volatile unsigned long *) 0xE002401C)) +#define SEC (*((volatile unsigned char *) 0xE0024020)) +#define MIN (*((volatile unsigned char *) 0xE0024024)) +#define HOUR (*((volatile unsigned char *) 0xE0024028)) +#define DOM (*((volatile unsigned char *) 0xE002402C)) +#define DOW (*((volatile unsigned char *) 0xE0024030)) +#define DOY (*((volatile unsigned short*) 0xE0024034)) +#define MONTH (*((volatile unsigned char *) 0xE0024038)) +#define YEAR (*((volatile unsigned short*) 0xE002403C)) +#define ALSEC (*((volatile unsigned char *) 0xE0024060)) +#define ALMIN (*((volatile unsigned char *) 0xE0024064)) +#define ALHOUR (*((volatile unsigned char *) 0xE0024068)) +#define ALDOM (*((volatile unsigned char *) 0xE002406C)) +#define ALDOW (*((volatile unsigned char *) 0xE0024070)) +#define ALDOY (*((volatile unsigned short*) 0xE0024074)) +#define ALMON (*((volatile unsigned char *) 0xE0024078)) +#define ALYEAR (*((volatile unsigned short*) 0xE002407C)) +#define PREINT (*((volatile unsigned short*) 0xE0024080)) +#define PREFRAC (*((volatile unsigned short*) 0xE0024084)) + +/* A/D Converter */ +#define ADCR (*((volatile unsigned long *) 0xE0034000)) +#define ADDR (*((volatile unsigned long *) 0xE0034004)) + +/* Watchdog */ +#define WDMOD (*((volatile unsigned char *) 0xE0000000)) +#define WDTC (*((volatile unsigned long *) 0xE0000004)) +#define WDFEED (*((volatile unsigned char *) 0xE0000008)) +#define WDTV (*((volatile unsigned long *) 0xE000000C)) + +/* Memory Mapping control register */ +#define MEMMAP (*((volatile unsigned long *) 0xE01FC040)) + +#endif /* __ASM_ARCH_HARDWARE_H */ diff --git a/lpctool/trunk/lpc2220.ld b/lpctool/trunk/lpc2220.ld new file mode 100644 index 0000000..c331351 --- /dev/null +++ b/lpctool/trunk/lpc2220.ld @@ -0,0 +1,60 @@ +/* identify the Entry Point */ + +ENTRY(Reset_Handler) + +/* specify the LPC2106 memory areas */ + +MEMORY +{ + flash : ORIGIN = 0x00000000, LENGTH = 128K /* free FLASH EPROM area */ + ram : ORIGIN = 0x40000200, LENGTH = 64K - 0x200 /* free RAM area */ +} + +/* define a global symbol _stack_end */ + +_stack_end = 0x4000FEDC; + +/* now define the output sections */ + +SECTIONS +{ + startup : + { + *(.startup) + } >ram /* the startup code goes into FLASH */ + + .text : /* collect all sections that should go into FLASH after startup */ + { + *(.text) /* all .text sections (code) */ + *(.rodata) /* all .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* all .glue_7 sections (no idea what these are) */ + *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ + _etext = .; /* define a global symbol _etext just after the last code byte */ + } >ram /* put all the above into FLASH */ + + .data : /* collect all initialized .data sections that go into RAM */ + { + _data = .; /* create a global symbol marking the start of the .data section */ + *(.data) /* all .data sections */ + _edata = .; /* define a global symbol marking the end of the .data section */ + } >ram /* put all the above into RAM (but load the LMA copy into FLASH) */ + + .bss : /* collect all uninitialized .bss sections that go into RAM */ + { + _bss_start = .; /* define a global symbol marking the start of the .bss section */ + *(.bss) /* all .bss sections */ + } >ram /* put all the above in RAM (it will be cleared in the startup code */ + + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + _bss_end = . ; /* define a global symbol marking the end of the .bss section */ + + _end = .; /* define a global symbol marking the end of application RAM */ +} + +PROVIDE( BCFG0 = 0xFFE00000); +PROVIDE( BCFG1 = 0xFFE00004); +PROVIDE( BCFG2 = 0xFFE00008); +PROVIDE( PINSEL0 = 0xE002C000); +PROVIDE( PINSEL2 = 0xE002C014); +PROVIDE( IO0PIN = 0xE0028000); diff --git a/lpctool/trunk/lpc2220_rom.ld b/lpctool/trunk/lpc2220_rom.ld new file mode 100644 index 0000000..557bbf7 --- /dev/null +++ b/lpctool/trunk/lpc2220_rom.ld @@ -0,0 +1,61 @@ +/* identify the Entry Point */ + +ENTRY(_startup) + +/* specify the LPC2106 memory areas */ + +MEMORY +{ + flash : ORIGIN = 0x80000000, LENGTH = 1M /* FLASH ROM */ + ram : ORIGIN = 0x40000200, LENGTH = 64K - 0x220 /* free RAM area */ +} + +/* define a global symbol _stack_end */ + +_stack_end = 0x4000FEDC; + +/* now define the output sections */ + +SECTIONS +{ + . = 0; /* set location counter to address zero */ + + startup : + { + *(.startup) + } >flash /* the startup code goes into FLASH */ + + .text : /* collect all sections that should go into FLASH after startup */ + { + *(.text) /* all .text sections (code) */ + *(.rodata) /* all .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* all .glue_7 sections (no idea what these are) */ + *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ + _etext = .; /* define a global symbol _etext just after the last code byte */ + } >flash /* put all the above into FLASH */ + + .data : /* collect all initialized .data sections that go into RAM */ + { + _data = .; /* create a global symbol marking the start of the .data section */ + *(.data) /* all .data sections */ + _edata = .; /* define a global symbol marking the end of the .data section */ + } >ram AT >flash /* put all the above into RAM (but load the LMA copy into FLASH) */ + + .bss : /* collect all uninitialized .bss sections that go into RAM */ + { + _bss_start = .; /* define a global symbol marking the start of the .bss section */ + *(.bss) /* all .bss sections */ + } >ram /* put all the above in RAM (it will be cleared in the startup code */ + + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + _bss_end = . ; /* define a global symbol marking the end of the .bss section */ +} + _end = .; /* define a global symbol marking the end of application RAM */ + +PROVIDE( BCFG0 = 0xFFE00000); +PROVIDE( BCFG1 = 0xFFE00004); +PROVIDE( BCFG2 = 0xFFE00008); +PROVIDE( PINSEL0 = 0xE002C000); +PROVIDE( PINSEL2 = 0xE002C014); +PROVIDE( IO0PIN = 0xE0028000); diff --git a/lpctool/trunk/lpctool.c b/lpctool/trunk/lpctool.c new file mode 100644 index 0000000..8a23a4a --- /dev/null +++ b/lpctool/trunk/lpctool.c @@ -0,0 +1,485 @@ +#include "infohelper.h" +#include "lpctool_serial.h" +#include "bootcom.h" +#include "toolcom.h" + +#define VERSION_MAJOR 0 +#define VERSION_MINOR 9 + +#include +#include +#include +#include +#include +#include +#include + +unsigned long radr, f0adr, f1adr, gadr; + +void printHeader(void) +{ + printf("\nlpctool V%i.%i\n\n", VERSION_MAJOR, VERSION_MINOR); + printf("This Software is free Software under GNU GPL 3 or later\n"); + printf("(c) 2007 Ch. Klippel \n\n"); +} + +void printUsage(void) +{ + printf("usage: lpctool [-d NAME] [-i] [-r [NAME]] [-R ADDRESS] [-X [ADDRESS]] [-a [NAME] [-A ADRDESS]] [-e] [-b [NAME] [-B ADDRESS]] [-E] [-s] [-S] [-c] [-C] [-v] [-V]\n\n"); + printf(" -d NAME specify serial device, default is /dev/ttyS0\n"); + printf(" -i use compiled-in flash-tool instead of external ram image file\n"); + printf(" -r NAME specify file for ram, default is ramtool.bin\n"); + printf(" -R ADDRESS optionally specifies the start-address to load into ram\n"); + printf(" default is 0x40000200 - must be specified in hex\n"); + printf(" -X ADDRESS set the execution address for the uploaded ram image\n"); + printf(" defualt is 0x40000200, omiting the address disables execution\n"); + printf(" -a NAME specify file for flash #0, default is flash0.bin\n"); + printf(" -A ADDRESS optionally specifies the start-address to load into flash #0\n"); + printf(" default is 0x80000000 - must be specified in hex\n"); + printf(" -e completely erase the first flash before writing\n"); + printf(" default is no erase\n"); + printf(" -b NAME specify file for flash #1, default is flash1.bin\n"); + printf(" -B ADDRESS optionally specifies the start-address to load into flash #1\n"); + printf(" default is 0x82000000 - must be specified in hex\n"); + printf(" -E completely erase the second flash before writing\n"); + printf(" defualt is no erase\n"); + printf(" -S only erase the first sector in flash before writing\n"); + printf(" this is a lot faster if only the first sector is used\n"); + printf(" -c write flash0 in chunk mode instead of write-all\n"); + printf(" -C write flash1 in chunk mode instead of write-all\n"); + printf(" in chunk mode, parts with 4 consectuive 0xFFFFFFFF or more\n"); + printf(" in the image are skipped. speeds upload when the image has\n"); + printf(" gaps. defualt is off\n"); + printf(" -N do not reset the device after uploading to flash\n"); + printf(" by default the device gets reset after upload\n"); + printf(" -? print this help\n"); + printf(" -v print version\n"); + printf(" -V be more verbose\n"); + printf("\n"); + printf("at least -r or -i must be given to be usefull. everything in [] is optional\n"); + printf("examples:\n"); + printf("\n"); + printf("to just load ramtool.bin, starting at 0x40000200, using serial device /dev/ttyS0 :\n"); + printf("lpcload -r\n\n"); + printf("to do the same, but using serial device /dev/ttyS1 instead :\n"); + printf("lpcload -r -d /dev/ttyS1\n\n"); + printf("using the file image.bin as source for the ram, use /dev/ttyS1 as serial device :\n"); + printf("lpcload -r image.bin -d /dev/ttyS1\n"); +} + +unsigned long parseHex(char *buf) +{ + unsigned char cnt; + unsigned long adr; + + cnt = 0; + adr = 0; + + while(buf[cnt]) + { + adr <<= 4; + if(buf[cnt] >= '0' && buf[cnt] <= '9') + { + adr += (buf[cnt] - '0'); + } + else if(buf[cnt] >= 'A' && buf[cnt] <= 'F') + { + adr += (buf[cnt] - 'A' + 10); + } + else if(buf[cnt] >= 'a' && buf[cnt] <= 'f') + { + adr += (buf[cnt] - 'a' + 10); + } + else if(buf[cnt] == 'x' || buf[cnt] == 'X') + { + adr = 0; + } + else + { + } + cnt++; + } + return adr; +} + +const char hval[] = { "0123456789ABCDEF" }; + +void printHexC(unsigned char num) +{ + printf("%c%c", hval[(num&0xF0)>>4], hval[num&0x0F]); +} + +void printHexS(unsigned short num) +{ + printHexC((num & 0xFF00) >> 8); + printHexC(num & 0x00FF); +} + +void printHexW(unsigned long num) +{ + printHexS((num & 0xFFFF0000) >> 16); + printHexS(num & 0x0000FFFF); +} +/* +void enterBootLD(void) +{ + setDTR(1); + usleep(10); + setRTS(1); + usleep(100); + setRTS(0); + usleep(10); + setDTR(0); + usleep(100); +} + +void resetFB(void) +{ + setRTS(1); + usleep(100); + setRTS(0); +} +*/ +void enterBootLD(void) +{ + setRTS(1); + usleep(10); + setDTR(1); + usleep(100); + setDTR(0); + usleep(10); + setRTS(0); + usleep(100); +} + +void resetFB(void) +{ + setDTR(1); + usleep(100); + setDTR(0); +} + +int main(int argc,char **argv) +{ + char sname[256]; + char rname[256]; + char f0name[256]; + char f1name[256]; + unsigned char i, cmd; + unsigned int uflags; + int fd; + + sprintf(sname,"/dev/ttyS0"); + sprintf(rname,"ramtool.bin"); + sprintf(f0name,"flash0.bin"); + sprintf(f1name,"flash1.bin"); + + verbosity = 0; + uflags = 0; + + radr = 0x40000200; + f0adr = 0x80000000; + f1adr = 0x82000000; + gadr = radr; + + printHeader(); + + for(i=1;i i+1) && (argv[i+1][0] != '-')) + { + strncpy(sname,argv[++i],256); + printInfoS(1,"using serial device",sname); + } + else + { + printError("Error in device argument"); + goto bailout; + } + break; + case 'r': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + strncpy(rname,argv[++i],256); + printInfoS(1,"using ram image",rname); + } + uflags |= 0x01; + break; + case 'R': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + radr = parseHex(argv[++i]); + printInfoH(1,"loading ram @",radr); + } + else + printInfoH(1,"used -R but no address given, using default", radr); + break; + case 'a': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + strncpy(f0name,argv[++i],256); + printInfoS(1,"using flash #0 image",f0name); + } + uflags |= 0x02; + break; + case 'A': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + f0adr = parseHex(argv[++i]); + printInfoH(1,"setting address for flash #0 @",f0adr); + } + else + printInfoH(1,"used -A but no address given, using default",f0adr); + break; + case 'b': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + strncpy(f1name,argv[++i],256); + printInfoS(1,"using flash #1 image",f1name); + } + uflags |= 0x04; + break; + case 'B': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + f1adr = parseHex(argv[++i]); + printInfoH(1,"setting address for flash #1 @",f1adr); + } + else + printInfoH(1,"used -B but no address given, using default",f1adr); + break; + case 'X': + if((argc > i+1) && (argv[i+1][0] != '-')) + { + gadr = parseHex(argv[++i]); + printInfoH(1,"setting ram execute address @",gadr); + uflags |= 0x08; + } + else + printInfoS(1,"disabling auto-run",0); + break; + case 'e': + printInfoS(1,"erasing flash #0 before write",0); + uflags |= 0x10; + break; + case 'E': + printInfoS(1,"erasing flash #1 before write",0); + uflags |= 0x20; + break; + case 'S': + printInfoS(1,"only erasing start sector",0); + uflags |= 0x40; + break; + case 's': + printInfoS(1,"auto-erasing sectors as needed",0); + uflags |= 0x80; + break; + case 'N': + printInfoS(1,"dont reset after flash upload is done",0); + uflags |= 0x100; + break; + case 'c': + printInfoS(1,"using chunk mode for flash #0",0); + uflags |= 0x200; + break; + case 'C': + printInfoS(1,"using chunk mode for flash #1",0); + uflags |= 0x400; + break; + case 'i': + uflags |= 0x800; + break; + default: + goto bailout; + } + } + else + { +bailout: + printUsage(); + goto end; + } + } + + if(!uflags) + { + printUsage(); + printInfoS(0,"\nnothing to do!",0); + goto end; + } + + printInfoS(2,"opening serial device",sname); + if(openSerial(sname) <= 0) + { + printError("Error opening serial device"); + goto end; + } + + if((uflags & 0x01) || (uflags & 0x800)) + { + if(!(uflags & 0x800)) + { + printInfoS(2,"opening ram image",rname); + fd = open(rname,O_RDONLY); + if(fd < 0) + { + printErrorS("cant open",rname); + goto end; + } + } + else + { + fd = 0; + } + + printInfoS(2,"reset into bootmode",0); + enterBootLD(); + + printInfoS(2,"opening bootloader",0); + if(!openBootLoader(10000)) + { + printError("Error opening BootLoader"); + goto end; + } + + printInfoS(2,"unlocking bootloader",0); + if(!unlockBootLoader()) + { + printError("Error unlocking BootLoader"); + goto end; + } + if(!(uflags & 0x800)) + { + printInfoS(1,"uploading ram image",rname); + } + else + { + printInfoS(1,"uploading compiled-in ram image",0); + } + if(uploadRAM(fd, radr)) + { + printInfoS(1,"ram uploaded",0); + if(!(uflags&0x08)) + { + printInfoH(1,"executing code at ram address",gadr); + if(!goBootLoader(gadr)) + { + printError("Error starting from ram"); + goto end; + } + printInfoH(2,"code execution started",gadr); + } + } + if(fd) + { + close(fd); + } + } + + usleep(100000); + reconfSerial(TOOLBAUD, 0, 5); + +//while(1) +{}; + + if(uflags & 0x06) + { + printInfoS(2,"opening ram tool",0); + if(openRamTool()) + printInfoS(2,"opened ramtool",0); + else + goto end; + + if(uflags & 0x02) + { + printInfoS(2,"opening flash0 image",f0name); + fd = open(f0name,O_RDONLY); + if(fd < 0) + { + printErrorS("cant open",f0name); + goto end; + } + printInfoS(1,"uploading flash0 image",f0name); + if(uflags & 0x200) + { + if(uploadChunks(fd, f0adr, (uflags & 0x50))) + printInfoS(1,"flash #0 uploaded",0); + else + goto end; + } + else + { + if(uploadFlash(fd, f0adr, (uflags & 0x50))) + printInfoS(1,"flash #0 uploaded",0); + else + goto end; + } + } + + close(fd); + + if(uflags & 0x04) + { + printInfoS(2,"opening flash1 image",f1name); + fd = open(f1name,O_RDONLY); + if(fd < 0) + { + printErrorS("cant open",f1name); + goto end; + } + printInfoS(1,"uploading flash1 image",f1name); + if(uflags & 0x400) + { + if(uploadChunks(fd, f1adr, (uflags & 0x60))) + printInfoS(1,"flash #1 uploaded",0); + else + goto end; + } + else + { + if(uploadFlash(fd, f1adr, (uflags & 0x60))) + printInfoS(1,"flash #1 uploaded",0); + else + goto end; + } + + } + close(fd); + if((uflags & 06) && !(uflags & 0x100)) + { + printInfoS(2,"reset device",0); + resetFB(); + } + } + +end: + if(fd) + { + printInfoS(2,"closing file descriptor",0); + close(fd); + } + printInfoS(2,"closing serial device",sname); + closeSerial(); + printf("\n"); + return 0; +} diff --git a/lpctool/trunk/lpctool_serial.c b/lpctool/trunk/lpctool_serial.c new file mode 100644 index 0000000..2f4cb3e --- /dev/null +++ b/lpctool/trunk/lpctool_serial.c @@ -0,0 +1,247 @@ +#include "lpctool_serial.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "infohelper.h" + +#define MAX(x,y) ((x) > (y) ? (x) : (y)) +#define MIN(x,y) ((x) < (y) ? (x) : (y)) + +static int serialDev = -1; +static struct termios term; + +void setBaud(unsigned int baud) +{ + // change baudrate + switch(baud) + { + case 2400: + cfsetispeed(&term,B2400); + cfsetospeed(&term,B2400); + break; + case 4800: + cfsetispeed(&term,B4800); + cfsetospeed(&term,B4800); + break; + case 9600: + cfsetispeed(&term,B9600); + cfsetospeed(&term,B9600); + break; + case 19200: + cfsetispeed(&term,B19200); + cfsetospeed(&term,B19200); + break; + case 38400: + cfsetispeed(&term,B38400); + cfsetospeed(&term,B38400); + break; + case 57600: + cfsetispeed(&term,B57600); + cfsetospeed(&term,B57600); + break; + case 115200: + cfsetispeed(&term,B115200); + cfsetospeed(&term,B115200); + break; + case 230400: + cfsetispeed(&term,B230400); + cfsetospeed(&term,B230400); + break; + default: + break; + } +} + +void setFlow(unsigned char flow) +{ + if(flow == 0) + { + term.c_iflag&=~(IXON|IXOFF|IXANY|INLCR|ICRNL); + } + else + { + term.c_iflag&=~(INLCR|ICRNL|IXANY); + term.c_iflag|=(IXON|IXOFF); + } +} + +void setTimeout(unsigned int tout) +{ + term.c_cc[VMIN]=0; + term.c_cc[VTIME]=tout; // 10 seconds timeout +} + +int openSerial(char *dev) +{ + + serialDev=open(dev,O_RDWR); + if(serialDev<0) { + printf("cannot acces %s\n",dev); + return serialDev; + } + + setDTR(0); + setRTS(0); + + tcgetattr(serialDev,&term); + + setBaud(19200); + + term.c_cflag = (term.c_cflag & ~CSIZE) | CS8; + term.c_cflag |= CLOCAL | CREAD; + + term.c_cflag &= ~(PARENB | PARODD); + term.c_cflag &= ~CSTOPB; + term.c_iflag=IGNBRK; + + term.c_iflag |= IXON | IXOFF; + + term.c_lflag=0; + + term.c_oflag=0; + + + setTimeout(30); + + if (tcsetattr(serialDev, TCSANOW, &term)!=0) + return printError("setattr stage 1 failed"); + + + if (tcgetattr(serialDev, &term)!=0) + return printError("getattr failed"); + + + term.c_cflag &= ~CRTSCTS; + + if (tcsetattr(serialDev, TCSANOW, &term)!=0) + return printError("setattr stage 2 failed"); + + return serialDev; +} + +int closeSerial(void) +{ + if(serialDev) + { + tcflush(serialDev, TCIOFLUSH); + close(serialDev); + return 0; + } + else + return serialDev; +} + +int reconfSerial(unsigned int baud, unsigned char flow, unsigned char tout) +{ + if(serialDev > 0) + { + + setBaud(baud); + setFlow(flow); + setTimeout(tout); + return tcsetattr(serialDev,TCSANOW,&term); + } + else + return serialDev; +} + +#define XFERSIZE 16 + +int sendBuf(unsigned int len, char *buf) +{ + unsigned int boff; + int ret; + + if(serialDev > 0) + { + boff = 0; + while (boff < len) + { + ret = write (serialDev, buf+boff, MIN (len - boff, XFERSIZE)); + if (ret < 0 && errno != EAGAIN) + { + perror ("error writing to serial port"); + return 0; + } + boff += ret; + } + return boff; + } + return 0; +} + +int sendBufE(unsigned int len, char *buf) +{ + return(getBuf(sendBuf(len,buf), buf)); +} + +int getBuf(unsigned int len, char *buf) +{ + unsigned int boff; + int ret; + + if(serialDev > 0) + { + boff = 0; + while (boff < len) + { + ret = read (serialDev, buf+boff, MIN (len - boff, XFERSIZE)); + if (ret < 0 && errno != EAGAIN) + { + perror ("error reading from serial port"); + return 0; + } + boff += ret; + } + return boff; + } + return 0; +} + +void setDTR(unsigned char val) +{ + int mcs; + if(serialDev) + { + ioctl (serialDev, TIOCMGET, &mcs); + if(val) + { + mcs |= TIOCM_DTR; + ioctl (serialDev, TIOCMSET, &mcs); + } + else + { + mcs &= ~TIOCM_DTR; + ioctl (serialDev, TIOCMSET, &mcs); + } + } +} + +void setRTS(unsigned char val) +{ + int mcs; + if(serialDev) + { + ioctl (serialDev, TIOCMGET, &mcs); + if(val) + { + mcs |= TIOCM_RTS; + ioctl (serialDev, TIOCMSET, &mcs); + } + else + { + mcs &= ~TIOCM_RTS; + ioctl (serialDev, TIOCMSET, &mcs); + } + } +} + diff --git a/lpctool/trunk/lpctool_serial.h b/lpctool/trunk/lpctool_serial.h new file mode 100644 index 0000000..f3ab6e0 --- /dev/null +++ b/lpctool/trunk/lpctool_serial.h @@ -0,0 +1,15 @@ +#ifndef LPCTOOL_SERIAL_H +#define LPCTOOL_SERIAL_H + + +#define TOOLBAUD 115200 + +int openSerial(char *dev); +int closeSerial(void); +int reconfSerial(unsigned int baud, unsigned char flow, unsigned char tout); +int sendBuf(unsigned int len, char *buf); +int getBuf(unsigned int len, char *buf); +void setDTR(unsigned char val); +void setRTS(unsigned char val); + +#endif diff --git a/lpctool/trunk/ramtool.c b/lpctool/trunk/ramtool.c new file mode 100644 index 0000000..e87ed45 --- /dev/null +++ b/lpctool/trunk/ramtool.c @@ -0,0 +1,357 @@ +void IRQ_Routine (void) __attribute__ ((interrupt("IRQ"))); +void FIQ_Routine (void) __attribute__ ((interrupt("FIQ"))); +void SWI_Routine (void) __attribute__ ((interrupt("SWI"))); +void UNDEF_Routine (void) __attribute__ ((interrupt("UNDEF"))); + +typedef volatile unsigned int *reg32_t; + + +#include "lpc2220.h" +#include "serial.h" +#include "flash.h" +#include "lcd.h" +#include "toolcmd.h" +#include "fonty.h" + +union +{ + unsigned long wbuf[128]; + unsigned short sbuf[256]; + unsigned char bbuf[512]; +} buf; + +unsigned long checksum; +unsigned short count; +unsigned long adr; +unsigned long numBytes; + +void putHN(unsigned char pos, unsigned long hn) +{ + draw_string(33,pos,"0x",3,DRAW_PUT); + draw_hexW(45,pos,hn,3,DRAW_PUT); +} + +void putInfoVal(unsigned char pos, char *name, unsigned long val) +{ + draw_block(0, pos, 128, 8, 3, DRAW_ERASE); + + draw_string(0,pos,name,3,DRAW_PUT); + putHN(pos, val); +} + +void ACK(void) +{ + serial_puts(ACKTOKEN); +} + +void BACK(void) +{ + serial_puts(BACKTOKEN); +} + +void NACK(void) +{ + serial_puts(NACKTOKEN); +} + +int receiveBuf(void) +{ + unsigned long ccheck; + unsigned short cnt, cnt2, cnt3; + + cnt = count<<2; + + if(cnt > 512) + return 0; + + checksum = 0; + ccheck = 0; + cnt2 = 0; + +#define XFERSIZE 16 + + while(cnt >= XFERSIZE) + { + cnt3=XFERSIZE; + while(cnt3--) + { + buf.bbuf[cnt2] = serial_getc(); + checksum += buf.bbuf[cnt2++]; + } + BACK(); + cnt -= XFERSIZE; + } + + if(cnt) + { + while(cnt--) + { + buf.bbuf[cnt2] = serial_getc(); + checksum += buf.bbuf[cnt2++]; + } + BACK(); + } + + ccheck = serial_getc() << 24; + ccheck += serial_getc() << 16; + ccheck += serial_getc() << 8; + ccheck += serial_getc(); + + if(ccheck == checksum) + { + return 1; + } + drawStatus("Wrong Checksum"); + + return 0; +} + +int main(void) +{ + unsigned char i; + + count = 0; + adr = 0x00000000; + timer = TIMEOUT+1; + numBytes = 0; + + lcd_init(0); + + IODIR0|=0x10; + IOCLR0=0x10; + + serial_init(); + + set_font(1); +#ifdef RESIDENT + draw_string(0, 0,">> FlashTool V0.2-r",3,DRAW_PUT); +#else + draw_string(0, 0,">> FlashTool V0.2",3,DRAW_PUT); +#endif + set_font(0); + draw_string(0,14,"This tool is licensed under",3,DRAW_PUT); + draw_string(0,22,"the GNU GPL 3 or later",3,DRAW_PUT); + draw_string(0,34,"(c) 2007 Ch. Klippel",3,DRAW_PUT); + draw_string(0,42,"",3,DRAW_PUT); + + drawStatus("FlashTool ready!"); + + adr = 0x00000000; + while (1) + { + i = serial_getc(); + if(i==HELO_CMD) + { + serial_puts(HELOTOKEN); + drawStatus("Sent HELO"); + } + else if(i==BULKENABLE_CMD) + { + putInfoVal(80, "Bulk:", 1); + if((adr & 0xFF000000) == 0x80000000 || (adr & 0xFF000000) == 0x82000000) + { + prepareBulk(adr); + drawStatus("Enabled bulk write"); + draw_string(100,80,ACKTOKEN,3,DRAW_PUT); + ACK(); + } + else + { + draw_string(100,80,NACKTOKEN,3,DRAW_PUT); + NACK(); + } + } + else if(i==SKIP_CMD) + { + adr += (serial_getc() << 16); + adr += serial_getc(); + ACK(); + } + else if(i==BULKDISABLE_CMD) + { + putInfoVal(80, "Bulk:", 0); + if((adr & 0xFF000000) == 0x80000000 || (adr & 0xFF000000) == 0x82000000) + { + endBulk(adr); + drawStatus("Disabled bulk write"); + draw_string(100,80,ACKTOKEN,3,DRAW_PUT); + ACK(); + } + else + { + draw_string(100,80,NACKTOKEN,3,DRAW_PUT); + NACK(); + } + } + else if(i==SETADR_CMD) + { + adr = serial_getc() << 24; + adr += serial_getc() << 16; + adr += serial_getc() << 8; + adr += serial_getc(); + + putInfoVal(72, "Addr:", adr); + + if((adr & 0xFF000000) == 0x40000000 || (adr & 0xFF000000) == 0x80000000 || (adr & 0xFF000000) == 0x82000000) + { + drawStatus("Address changed"); + draw_string(100,72,ACKTOKEN,3,DRAW_PUT); + ACK(); + } + else + { + draw_string(100,72,NACKTOKEN,3,DRAW_PUT); + adr = 0x00000000; + NACK(); + } + } + else if(i==FILLBUF_CMD) + { + count = serial_getc(); + putInfoVal(88, "Buf:", count<<2); + if(count > 0 && count <= 128) + { + if(receiveBuf()) + { + ACK(); + } + else + { + goto fail_f; + } + } + else + { +fail_f: + draw_string(100,88,NACKTOKEN,3,DRAW_PUT); + count = 0; + NACK(); + } + } + else if(i==WRITE_CMD) + { + putInfoVal(96, "Write:", adr); + i = serial_getc(); + if(i==WRITEGO_CMD && count > 0) + { + if(writeBulk((unsigned long) &buf.bbuf, adr, count<<1) == 0) + { + adr += (count<<2); + ACK(); + } + else + { + draw_string(100,96,NACKTOKEN,3,DRAW_PUT); + NACK(); + } + } + } + else if(i==SECTERASE_CMD) + { + + drawStatus("Erasing Flash Sector"); + if(eraseSectorAt(adr) == 0) + { + drawStatus("Erased Flash Sector"); + ACK(); + } + else + { + drawStatus("Erase Sector FAILED!!"); + NACK(); + } + } + else if(i==FULLERASE_CMD) + { + unsigned char w; + w = 0xFF; + if((adr & 0xFF000000) == 0x82000000) + { + drawStatus("Erasing Flash #1"); + w = 1; + } + else + { + drawStatus("Erasing Flash #0"); + w = 0; + } + if(eraseFlash(w) == 0) + { + if(w==1) + { + drawStatus("Erased Flash #1"); + } + else if(w==0) + { + drawStatus("Erased Flash #0"); + } + ACK(); + } + else + { + if(w) + { + drawStatus("Flash #1 Erase FAILED!!"); + } + else + { + drawStatus("Flash #0 Erase FAILED!!"); + } + NACK(); + } + } + else if(i==SETNUMBYTES_CMD) + { + numBytes = serial_getc() << 24; + numBytes += serial_getc() << 16; + numBytes += serial_getc() << 8; + numBytes += serial_getc(); + putInfoVal(104, "NumB:", numBytes); + if(numBytes <= 0x00100000) + { + draw_string(100,104,ACKTOKEN,3,DRAW_PUT); + ACK(); + } + else + { + draw_string(100,104,NACKTOKEN,3,DRAW_PUT); + NACK(); + } + } + else if(i==READ_CMD) + { + for(adr = 0x40000200; adr < 0x40000210; adr+=4) + { + putHexW((unsigned long)(*(volatile unsigned long *)(adr))); + serial_putc('\n'); + } + for(adr = 0x80000000; adr < 0x80000010; adr+=4) + { + putHexW((unsigned long)(*(volatile unsigned long *)(adr))); + serial_putc('\n'); + } + } + } + return 0; +} + +/* Stubs for various interrupts (may be replaced later) */ +/* ---------------------------------------------------- */ + +void IRQ_Routine (void) { + while (1) ; +} + +void FIQ_Routine (void) { + while (1) ; +} + + +void SWI_Routine (void) { + while (1) ; +} + + +void UNDEF_Routine (void) { + while (1) ; +} diff --git a/lpctool/trunk/serial.c b/lpctool/trunk/serial.c new file mode 100644 index 0000000..7b4e731 --- /dev/null +++ b/lpctool/trunk/serial.c @@ -0,0 +1,246 @@ +/* + * minor changes (c) 2007 ch.klippel + * + * (C) Copyright 2004 + * DAVE Srl + * http://www.dave-tech.it + * http://www.wawnet.biz + * mailto:info@wawnet.biz + * + * (C) Copyright 2002-2004 + * Wolfgang Denk, DENX Software Engineering, + * + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH + * Marius Groeger + * + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH + * Alex Zuepke + * + * Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "lpc2220.h" +#include "serial.h" +#include "lcd.h" + +unsigned long timer; + + +/* flush serial input queue. returns 0 on success or negative error + * number otherwise + */ +int serial_flush_input(void) +{ + volatile unsigned int tmp; + + /* keep on reading as long as the receiver is not empty */ + while(RX_DATA(U0LSR)) { + tmp = GET_CHAR(U0RBR); + } + + return 0; +} + + +/* flush output queue. returns 0 on success or negative error number + * otherwise + */ +int serial_flush_output(void) +{ + /* wait until the transmitter is no longer busy */ + while(TX_READY(U0LSR)==0) { + } + + return 0; +} + + +void serial_setbrg (unsigned int baudrate) +{ + + /* get correct divisor */ + U0LCR = 0x83; + + switch(baudrate) { + + case 75: + U0DLL = 161; + U0DLM = 1; + U0FDR = (1 << 4) + 14; + break; + + case 150: + U0DLL = 195; + U0DLM = 0; + U0FDR = (1 << 4) + 15; + break; + + case 300: + U0DLL = 184; + U0DLM = 0; + U0FDR = (2 << 4) + 15; + break; + + case 600: + U0DLL = 156; + U0DLM = 0; + U0FDR = (1 << 4) + 4; + break; + + case 1200: + U0DLL = 130; + U0DLM = 0; + U0FDR = (7 << 4) + 14; + break; + + case 2400: + U0DLL = 180; + U0DLM = 0; + U0FDR = (12 << 4) + 1; + break; + + case 4800: + U0DLL = 90; + U0DLM = 0; + U0FDR = (1 << 4) + 4; + break; + + case 9600: + U0DLL = 23; + U0DLM = 0; + U0FDR = (8 << 4) + 9; + break; + + case 19200: + U0DLL = 11; + U0DLM = 0; + U0FDR = (9 << 4) + 11; + break; + + case 38400: + U0DLL = 5; + U0DLM = 0; + U0FDR = (9 << 4) + 13; + break; + + case 57600: + U0DLL = 6; + U0DLM = 0; + U0FDR = (14 << 4) + 5; + break; + + case 115200: + U0DLL = 3; + U0DLM = 0; + U0FDR = (14 << 4) + 5; + break; + } + U0LCR = 0x03; + + serial_flush_output(); + serial_flush_input(); +} + + +/* + * Initialise the serial port with the given baudrate. The settings + * are always 8 data bits, no parity, 1 stop bit, no start bits. + * + */ +int serial_init (void) +{ + PINSEL0=0x05; // pin select -> tx, rx + serial_setbrg (115200); + U0FCR = 0x07; // enable fifo + timer = TIMEOUT+1; + return (0); +} + + +/* + * Output a single byte to the serial port. + */ +void serial_putc (const char c) +{ + /* wait for room in the transmit FIFO */ + while(TX_READY(U0LSR)==0); + + PUT_CHAR(U0THR,c); +} + +/* + * Read a single byte from the serial port. Returns 1 on success, 0 + * otherwise. When the function is succesfull, the character read is + * written into its argument c. + */ +int serial_tstc (void) +{ + return (RX_DATA(U0LSR)); +} + +/* + * Read a single byte from the serial port. Returns 1 on success, 0 + * otherwise. When the function is succesfull, the character read is + * written into its argument c. + */ + +int serial_getc (void) +{ + while(((U0LSR) & USRRxData) <= 0) + { + if(timer == TIMEOUT) + { + clearStatus(); + timer++; + } + else if(timer < TIMEOUT) + { + timer++; + } + } + return (U0RBR); +} + +void serial_puts (const char *s) +{ + while (*s != 0) { + serial_putc (*s++); + } +} + +const char hval[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; + +void putHexC(const unsigned char v) +{ + serial_putc(hval[v>>4]); + serial_putc(hval[v & 0x0F]); +} + +void putHexS(const unsigned short v) +{ + putHexC(v >> 8); + putHexC(v & 0xFF); +} + +void putHexW(const unsigned long v) +{ + putHexS(v >> 16); + putHexS(v & 0xFFFF); +} diff --git a/lpctool/trunk/serial.h b/lpctool/trunk/serial.h new file mode 100644 index 0000000..d49e396 --- /dev/null +++ b/lpctool/trunk/serial.h @@ -0,0 +1,24 @@ +#ifndef BOOP_SERIAL_H +#define BOOP_SERIAL_H + +#define USRRxData (1 << 0) +#define USRTxHoldEmpty (1 << 6) +#define GET_CHAR(p) p +#define PUT_CHAR(p,c) (p= (unsigned )(c)) +#define TX_READY(s) ((s) & USRTxHoldEmpty) +#define RX_DATA(s) ((s) & USRRxData) + +int serial_flush_input(void); +int serial_flush_output(void); +void serial_setbrg (unsigned int baudrate); +int serial_init (void); +void serial_putc (const char c); +int serial_tstc (void); +int serial_getc (void); +void serial_puts (const char *s); + +void putHexC(const unsigned char v); +void putHexS(const unsigned short v); +void putHexW(const unsigned long v); + +#endif /* BOOP_SERIAL_H */ diff --git a/lpctool/trunk/toolcmd.h b/lpctool/trunk/toolcmd.h new file mode 100644 index 0000000..065ddd9 --- /dev/null +++ b/lpctool/trunk/toolcmd.h @@ -0,0 +1,31 @@ +#ifndef TOOLCMD_H +#define TOOLCMD_H + +#define HELO_CMD '.' +#define BULKENABLE_CMD 'B' +#define BULKDISABLE_CMD 'X' +#define SETADR_CMD 'A' +#define FILLBUF_CMD 'F' +#define WRITE_CMD 'W' +#define WRITEGO_CMD '!' +#define SECTERASE_CMD 'P' +#define FULLERASE_CMD 'E' +#define SETNUMBYTES_CMD 'S' +#define READ_CMD 'R' +#define SKIP_CMD '>' +#define HELOTOKEN "HELO" +#define ACKTOKEN "ACK!" +#define NACKTOKEN "NACK" +#define BACKTOKEN "!" + +#define MIN_GAP 0x10 + +typedef struct t_chunk +{ + unsigned long start; + unsigned long len; + struct t_chunk *prev; + struct t_chunk *next; +} t_chunk; + +#endif diff --git a/lpctool/trunk/toolcom.c b/lpctool/trunk/toolcom.c new file mode 100644 index 0000000..7db575b --- /dev/null +++ b/lpctool/trunk/toolcom.c @@ -0,0 +1,528 @@ +#include "infohelper.h" +#include "lpctool_serial.h" +#include "toolcom.h" +#include "toolcmd.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +const unsigned long secinfo[20] = +{ 0x00000, + 0x04000, + 0x06000, + 0x08000, + 0x10000, + 0x20000, + 0x30000, + 0x40000, + 0x50000, + 0x60000, + 0x70000, + 0x80000, + 0x90000, + 0xA0000, + 0xB0000, + 0xC0000, + 0xD0000, + 0xE0000, + 0xF0000, + 0x100000 }; + + +struct t_chunk *chunklist = NULL; + +union { + unsigned char cbuf[MAXBUF]; + unsigned short sbuf[MAXBUF/2]; + unsigned long lbuf[MAXBUF/4]; +} buffs; + +int makeList(unsigned long *buf, unsigned long len) +{ + unsigned long mlen; + t_chunk *mlist; + int cnt; + unsigned long gap, pos; + if(chunklist) + freeList(); + + mlen = len>>2; + gap = 0; + pos = 0; + cnt = 1; + + if(mlen) + { + printInfoS(2,"creating list of chunks",0); + + chunklist = malloc(sizeof(t_chunk)); + + mlist = chunklist; + + if(mlist) + { + mlist->start = 0x80000000; + mlist->len = 0; + mlist->prev = NULL; + mlist->next = NULL; + } + + while(mlen) + { + gap = 0; + if(buf[pos] != 0xFFFFFFFF) + { + mlist->len += 4; + mlen --; + pos ++; + } + else while(buf[pos] == 0xFFFFFFFF) + { + gap += 4; + pos ++; + mlen --; + } + if(gap) + { + if(gap >= MIN_GAP) + { + mlist->next = malloc(sizeof(t_chunk)); + if(mlist->next) + { + cnt++; + mlist->next->start = chunklist->start + (pos*4); + mlist->next->prev = mlist; + mlist->next->next = NULL; + mlist->next->len = 0; + mlist = mlist->next; + } + + } + else + { + mlist->len += gap; + } + } + } + } + printInfoH(2, "chunk entries created:",cnt); + return(cnt); +} + +void freeList(void) +{ + t_chunk *mlist; + int cnt; + + if(chunklist) + { + mlist = chunklist; + cnt = 0; + + while(mlist->next != NULL) + { + mlist = mlist->next; + cnt++; + free(mlist->prev); + } + cnt++; + free(mlist); + } +} + + +int getRESULT(unsigned char acktype) +{ + char buf[4]; + unsigned char q; + + switch(acktype) + { + case ACK: + q = getBuf(4, buf); + if(strncmp(buf, ACKTOKEN, 4)) + { + return printError("wrong response, expected ACK!"); + } + return 1; + break; + + case HELO: + q = getBuf(4, buf); + if(strncmp(buf, HELOTOKEN, 4)) + { + return printError("wrong response, expected HELO"); + } + return 1; + break; + case BACK: + q = getBuf(1, buf); + if(strncmp(buf, BACKTOKEN, 1)) + { + return printError("wrong response, expected !"); + } + return 1; + break; + } +} + +int openRamTool() +{ + char buf[1]; + unsigned char q; + + buf[0] = HELO_CMD; + + sendBuf(1, buf); + + reconfSerial(TOOLBAUD, 0, 50); + q = getRESULT(HELO); + reconfSerial(TOOLBAUD, 0, 5); + + return q; +} + +int setToolAdr(unsigned long adr) +{ + char buf[5]; + + buf[0] = SETADR_CMD; + buf[1] =(adr & 0xFF000000) >> 24; + buf[2] =(adr & 0x00FF0000) >> 16; + buf[3] =(adr & 0x0000FF00) >> 8; + buf[4] = adr & 0x000000FF; + + sendBuf(5, buf); + + return getRESULT(ACK); +} + +int eraseFlash(void) +{ + char buf[1]; + + printInfoS(0,"erasing flash", 0); + + buf[0] = FULLERASE_CMD; + + sendBuf(1, buf); + + return getRESULT(ACK); +} + +int eraseFlashSector(void) +{ + char buf[1]; + + buf[0] = SECTERASE_CMD; + + sendBuf(1, buf); + + return getRESULT(ACK); +} + +int enableBulk(unsigned char b) +{ + char buf[1]; + + if(b) + { + buf[0] = BULKENABLE_CMD; + } + else + { + buf[0] = BULKDISABLE_CMD; + } + + sendBuf(1, buf); + + return getRESULT(ACK); +} + +int setNumBytes(unsigned long numBytes) +{ + char buf[5]; + + buf[0] = SETNUMBYTES_CMD; + buf[1] =(numBytes & 0xFF000000) >> 24; + buf[2] =(numBytes & 0x00FF0000) >> 16; + buf[3] =(numBytes & 0x0000FF00) >> 8; + buf[4] = numBytes & 0x000000FF; + + sendBuf(5, buf); + + return getRESULT(ACK); +} + +int writeFlash(void) +{ + char buf[2]; + + buf[0] = WRITE_CMD; + buf[1] = WRITEGO_CMD; + + sendBuf(2, buf); + + return getRESULT(ACK); +} + +int uploadBuf(unsigned char nwords, unsigned char* buf) +{ + unsigned short cnt,cnt2, cnt3; + unsigned long checksum; + char tbuf[6]; + checksum = 0; + tbuf[0] = FILLBUF_CMD; + tbuf[1] = nwords; + + if(!sendBuf(2,tbuf)) + return 0; + + cnt = nwords << 2; + cnt2 = 0; + +#define XFERSIZE 16 + + while(cnt >= XFERSIZE) + { + + cnt3=XFERSIZE; + while(cnt3--) + checksum += buf[cnt2++]; + + if(!sendBuf(XFERSIZE, (char*)buf+cnt2-XFERSIZE)) + return 0; + + if(!getRESULT(BACK)) + return 0; + + cnt -= XFERSIZE; + } + + if(cnt) + { + cnt3 = cnt; + while(cnt--) + checksum += buf[cnt2++]; + + if(!sendBuf(cnt3, (char*)buf+cnt2-cnt3)) + return 0; + + if(!getRESULT(BACK)) + return 0; + + } + + + tbuf[0] = (checksum >> 24) & 0xFF; + tbuf[1] = (checksum >> 16) & 0xFF; + tbuf[2] = (checksum >> 8) & 0xFF; + tbuf[3] = checksum & 0xFF; + if(!sendBuf(4, tbuf)) + return 0; + + return getRESULT(ACK); +} + +int uploadChunks(int fd, unsigned long loc, unsigned int erase) +{ + unsigned long fsize, cnt, total, csize; + unsigned char buf[MAXBUF]; + unsigned int numChunks; + t_chunk *curr_chunk; + + if(!setToolAdr(loc)) + { + freeList(); + return printError("failed to set address"); + } + + if(erase & 0x40) + { + printInfoS(2,"erasing flash sector", 0); + if(!eraseFlashSector()) + return printError("failed to erase start sector"); + printInfoS(2,"flash sector erased", 0); + } + else if((erase & 0x20) || (erase & 0x10)) + { + printInfoS(2,"erasing whole flash", 0); + reconfSerial(TOOLBAUD, 0, 200); + + if(!eraseFlash()) + return printError("failed to erase whole flash"); + reconfSerial(TOOLBAUD, 0, 5); + + printInfoS(2,"whole flash erased", 0); + } + + printInfoS(2,"enabling bulk write",0); + if(!enableBulk(1)) + return printError("bulk write enable failed"); + + fsize = read(fd, buf, MAXBUF); + total = fsize; + cnt = 0; + + printInfoH(2,"setting total number of bytes to", fsize); + if(!setNumBytes(fsize)) + return printError("cannot set total number of bytes"); + + printInfoS(0,"starting flash upload (chunk mode)", 0); + + numChunks = makeList((unsigned long*)buf, fsize); + curr_chunk = chunklist; + + printProgress(0,"Flash",cnt,total); + + while(numChunks--) + { + if(!setToolAdr(curr_chunk->start)) + { + freeList(); + return printError("failed to set address"); + } + + csize = curr_chunk->len; + cnt = curr_chunk->start & 0x00FFFFFF; + + while(csize >= 512) + { + if(!uploadBuf(128, buf+cnt)) + { + freeList(); + return printError("buffer upload failed");; + } + else + { + if(!writeFlash()) + { + freeList(); + return printError("flash write failed");; + } + } + csize -= 512; + cnt += 512; + printProgress(0,"Flash",cnt,total); + } + if(csize) + { + if(!uploadBuf(csize>>2, buf+cnt)) + { + freeList(); + return printError("buffer upload failed");; + } + else + { + if(!writeFlash()) + { + freeList(); + return printError("flash write failed");; + } + } + csize = 0; + printProgress(0,"Flash",cnt,total); + } + + curr_chunk = curr_chunk->next; + } + + printProgress(0,"Flash",total,total); + + freeList(); + + if(!enableBulk(0)) + return printError("bulk write disable failed");; + + printInfoH(0,"flash upload (chunk mode) complete, total bytes:", total); + return 1; +} + +int uploadFlash(int fd, unsigned long loc, unsigned int erase) +{ + unsigned long fsize, cnt, total; + unsigned char buf[MAXBUF]; + + printInfoH(2,"setting address to", loc); + if(!setToolAdr(loc)) + return printError("failed to set address"); + + if(erase & 0x40) + { + printInfoS(2,"erasing flash sector", 0); + if(!eraseFlashSector()) + return printError("failed to erase start sector"); + printInfoS(2,"flash sector erased", 0); + } + else if((erase & 0x20) || (erase & 0x10)) + { + printInfoS(2,"erasing whole flash", 0); + reconfSerial(TOOLBAUD, 0, 200); + + if(!eraseFlash()) + return printError("failed to erase whole flash"); + reconfSerial(TOOLBAUD, 0, 5); + + printInfoS(2,"whole flash erased", 0); + } + + printInfoS(2,"enabling bulk write",0); + if(!enableBulk(1)) + return printError("bulk write enable failed"); + + fsize = read(fd, buf, MAXBUF); + + printInfoH(2,"setting total number of bytes to", fsize); + if(!setNumBytes(fsize)) + return printError("cannot set total number of bytes"); + + cnt = 0; + total = fsize; + + printInfoS(0,"starting flash upload", 0); + printProgress(0,"Flash",cnt,total); + + while(fsize >= 512) + { + if(!uploadBuf(128, buf+cnt)) + { + return printError("buffer upload failed");; + } + else + { + if(!writeFlash()) + return printError("flash write failed");; + } + fsize -= 512; + cnt += 512; + printProgress(0,"Flash",cnt,total); + } + if(fsize) + { + if(!uploadBuf(fsize>>2, buf+cnt)) + { + return printError("buffer upload failed");; + } + else + { + if(!writeFlash()) + return printError("flash write failed");; + } + fsize = 0; + printProgress(0,"Flash",total,total); + } + + if(!enableBulk(0)) + return printError("bulk write disable failed");; + + printInfoH(0,"flash upload complete, total bytes:", total); + return 1; +} + + diff --git a/lpctool/trunk/toolcom.h b/lpctool/trunk/toolcom.h new file mode 100644 index 0000000..30eb47d --- /dev/null +++ b/lpctool/trunk/toolcom.h @@ -0,0 +1,21 @@ +#ifndef TOOLCOM_H +#define TOOLCOM_H + +#define ACK 0x00 +#define HELO 0x01 +#define BACK 0x02 + +#define MAXBUF 0x00100000 + +int makeList(unsigned long *buf, unsigned long len); +void freeList(void); +int openRamTool(); +int setToolAdr(unsigned long adr); +int eraseFlash(void); +int writeFlash(void); +int enableBulk(unsigned char b); +int setNumBytes(unsigned long numBytes); +int uploadFlash(int fd, unsigned long loc, unsigned int erase); +int uploadChunks(int fd, unsigned long loc, unsigned int erase); + +#endif