*.elf
*.a
pngdump
-conv2aas
+mmutil
tungen
*.ppm
*.png
+*.sav
+disasm
+data
+*.tar.gz
+*.zip
+pushdata
src = $(wildcard src/*.c)
ssrc = $(wildcard src/*.s)
-obj = $(src:.c=.o) $(ssrc:.s=.o) $(dataobj)
+obj = $(src:.c=.o) $(ssrc:.s=.o)
dep = $(src:.c=.d)
name = gbajam21
elf = $(name).elf
data/tun.map
audata = data/audio/popcorn.mod
-dataobj = data/aas_data.o
-libs = libs/aas/libaas.a
+libs = libs/maxmod/libmm.a
TCPREFIX = arm-none-eabi-
opt = -O3 -fomit-frame-pointer -mcpu=arm7tdmi -mtune=arm7tdmi -mthumb -mthumb-interwork
dbg = -g
-inc = -I. -Ilibs/aas
+inc = -I. -Ilibs/maxmod
CFLAGS = $(opt) $(dbg) -pedantic -Wall -MMD $(def) $(inc)
ASFLAGS = -mthumb-interwork
$(OBJCOPY) -O binary $(elf) $(bin)
gbafix -r0 $(bin)
-$(elf): data/aas_data.h $(obj) $(libs)
+$(elf): data/snd.h $(obj) $(libs)
$(CC) -o $(elf) $(obj) -specs=gba.specs $(LDFLAGS)
-include $(dep)
tools/pngdump/pngdump:
$(MAKE) -C tools/pngdump
-tools/conv2aas/conv2aas:
- $(MAKE) -C tools/conv2aas
-
tools/tungen: tools/tungen.c
cc -o $@ $< -lm
+tools/mmutil/mmutil:
+ $(MAKE) -C tools/mmutil
+
#data/sprites.raw: data/sprites1.png data/sprites2.png data/sprites3.png data/sprites4.png data/sprites5.png data/sprites6.png
# tools/pngdump/pngdump -o $@ -n $^
data/tun.map: tools/tungen
tools/tungen -s 240x160 >$@
-data/aas_data.h: data/aas_data.s
+data/snd.bin: $(audata) tools/mmutil/mmutil
+ tools/mmutil/mmutil -o$@ -hdata/snd.h $(audata)
-data/aas_data.s: $(audata) tools/conv2aas/conv2aas
- tools/conv2aas/conv2aas data/audio
+data/snd.h: data/snd.bin
.PHONY: clean
clean:
.PHONY: cleanlibs
cleanlibs:
- $(MAKE) -C libs/aas clean
+ $(MAKE) -C libs/maxmod clean
.PHONY: install
install: $(bin)
.PHONY: libs
libs: $(libs)
-libs/aas/libaas.a:
- $(MAKE) -C libs/aas
+libs/maxmod/libmm.a:
+ $(MAKE) -C libs/maxmod
+++ /dev/null
-/* Copyright (c) 2003-2021 James Daniels */
-/* Distributed under the MIT License */
-/* license terms: see LICENSE file in root or http://opensource.org/licenses/MIT */
-
-/* Main AAS include */
-/* */
-/* See API documentation for more information. */
-
-#ifndef __AAS__
-#define __AAS__
-
-#ifdef __cplusplus
-#define AAS_BEGIN_DECLS extern "C" {
-#define AAS_END_DECLS }
-#else
-#define AAS_BEGIN_DECLS
-#define AAS_END_DECLS
-#endif
-
-AAS_BEGIN_DECLS
-
-#define AAS_VERSION 0x111 /* v1.11 */
-
-/* Types */
-#define AAS_u32 unsigned int
-#define AAS_s32 signed int
-#define AAS_u16 unsigned short
-#define AAS_s16 signed short
-#define AAS_u8 unsigned char
-#define AAS_s8 signed char
-#define AAS_BOOL unsigned char
-#define AAS_TRUE 1
-#define AAS_FALSE 0
-#define AAS_NULL 0
-
-/* Return values */
-#define AAS_OK 0
-#define AAS_ERROR_VOLUME_OUT_OF_RANGE -1
-#define AAS_ERROR_CHANNEL_NOT_AVAILABLE -2
-#define AAS_ERROR_FREQUENCY_OUT_OF_RANGE -3
-#define AAS_ERROR_MOD_DOES_NOT_EXIST -4
-#define AAS_ERROR_CALL_SET_CONFIG_FIRST -5
-#define AAS_ERROR_INVALID_CONFIG -6
-#define AAS_ERROR_INVALID_SAMPLE_ADDRESS -7
-#define AAS_ERROR_NO_MOD_PLAYING -8
-#define AAS_ERROR_NOT_ENOUGH_CHANNELS -9
-#define AAS_ERROR_CHANNEL_ACTIVE -10
-#define AAS_ERROR_CHANNEL_UNRESUMEABLE -11
-#define AAS_ERROR_INVALID_SONG_POS -12
-
-/* AAS_SetConfig() mix settings */
-#define AAS_CONFIG_MIX_32KHZ 1
-#define AAS_CONFIG_MIX_28KHZ 2
-#define AAS_CONFIG_MIX_24KHZ 3
-#define AAS_CONFIG_MIX_20KHZ 4
-#define AAS_CONFIG_MIX_16KHZ 5
-#define AAS_CONFIG_MIX_12KHZ 6
-#define AAS_CONFIG_MIX_8KHZ 7
-
-/* AAS_SetConfig() channel settings */
-#define AAS_CONFIG_CHANS_16_LOUD 6
-#define AAS_CONFIG_CHANS_8_LOUD 5
-#define AAS_CONFIG_CHANS_4_LOUD 4
-#define AAS_CONFIG_CHANS_16 3
-#define AAS_CONFIG_CHANS_8 2
-#define AAS_CONFIG_CHANS_4 1
-
-/* AAS_SetConfig() spatial settings */
-#define AAS_CONFIG_SPATIAL_STEREO 2
-#define AAS_CONFIG_SPATIAL_MONO 1
-
-/* AAS_SetConfig() dynamic mixing settings */
-#define AAS_CONFIG_DYNAMIC_OFF 0
-#define AAS_CONFIG_DYNAMIC_ON 1
-
-/* General commands */
-int AAS_SetConfig( int config_mix, int config_chans, int config_spatial, int config_dynamic ); /* Must call at least once before doing anything else */
-void AAS_DoDMA3( void* source, void* dest, AAS_u32 flags_and_length );
-void AAS_ShowLogo();
-
-/* Interrupt handling commands */
-void AAS_Timer1InterruptHandler(); /* Use when there are no other CPU-intensive interrupts */
-void AAS_FastTimer1InterruptHandler(); /* Use when there are other CPU-intensive interrupts */
-void AAS_DoWork(); /* Must be called at least 50 times/sec if using AAS_FastTimer1InterruptHandler() */
-
-/* Sample playing commands */
-int AAS_SFX_Play( int channel, int sample_volume, int sample_frequency, const AAS_s8* sample_start, const AAS_s8* sample_end, const AAS_s8* sample_restart );
-AAS_BOOL AAS_SFX_ChannelExists( int channel ); /* returns AAS_TRUE only if AAS_SFX_Play will succeed for this channel */
-AAS_BOOL AAS_SFX_IsActive( int channel ); /* returns AAS_TRUE if channel is valid and active, AAS_FALSE otherwise */
-int AAS_SFX_EndLoop( int channel ); /* If sample was looping, will stop at end of current iteration */
-int AAS_SFX_SetFrequency( int channel, int sample_frequency );
-int AAS_SFX_SetVolume( int channel, int sample_volume );
-int AAS_SFX_Stop( int channel );
-int AAS_SFX_Resume( int channel );
-int AAS_SFX_GetNumChannels(); /* returns number of SFX channels */
-
-/* MOD commands */
-int AAS_MOD_Play( int song_num ); /* loops by default */
-int AAS_MOD_SetLoop( AAS_BOOL loop ); /* specify whether current song will loop */
-void AAS_MOD_Stop();
-AAS_BOOL AAS_MOD_IsPlaying(); /* is a song playing? */
-AAS_BOOL AAS_MOD_HasLooped(); /* has the current song looped? */
-int AAS_MOD_GetVolume(); /* 0: silent, 256 = max */
-int AAS_MOD_SetVolume( int vol ); /* 0: silent, 256 = max (do not set above 256 or below 0!) */
-int AAS_MOD_GetSongPos();
-int AAS_MOD_SetSongPos( int song_pos ); /* Immediately jumps to the specified song position. */
-int AAS_MOD_QueueSongPos( int song_pos ); /* Jumps to the specified song position when the current pattern finishes. */
-int AAS_MOD_GetLineNum();
-int AAS_MOD_GetLastFilterValue(); /* Returns the value specified by the most recent "E0: Set Filter" effect */
-void AAS_MOD_Pause(); /* Stops the MOD in a way that allows it to be safely resumed */
-void AAS_MOD_Resume(); /* Should only be used after AAS_MOD_Pause() */
-int AAS_MOD_GetNumChannels(); /* Returns number of channels currently being reserved by the MOD */
-
-/* Misc commands */
-const AAS_s8* AAS_GetOutputBufferAddress( int buffer ); /* buffer should be 0 or 1, otherwise will return AAS_NULL */
-int AAS_GetOutputBufferLength();
-int AAS_GetActualMixRate();
-
-AAS_END_DECLS
-
-#endif
+++ /dev/null
-@ Copyright (c) 2003-2021 James Daniels
-@ Distributed under the MIT License
-@ license terms: see LICENSE file in root or http://opensource.org/licenses/MIT
-
-.TEXT
-.SECTION .text,"ax",%progbits
-.ALIGN
-.ARM
-
-.GLOBAL AAS_DoDMA3
-
-.GLOBAL AAS_MixAudio_SetMode_Normal
-.GLOBAL AAS_MixAudio_SetMode_Boost
-.GLOBAL AAS_MixAudio_SetMode_BoostAndClip
-
-.GLOBAL AAS_MixAudio_SetMaxChans_2
-.GLOBAL AAS_MixAudio_SetMaxChans_4
-.GLOBAL AAS_MixAudio_SetMaxChans_8
-
-.GLOBAL _AAS_vol_lookup
-
-
-@ Volume lookup table. -1 means use multiply, 0 to 7 means use bit shift.
-
-_AAS_vol_lookup:
- .byte 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, 4
- .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5
- .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
- .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6
- .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
- .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
- .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
- .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7
-
-_ma_mul_r5_r0_r3:
- .word 0x00000010
- mul r5,r0,r3
-_ma_mov_r5_r0_lsl_0:
- .word 0x00000001
- mov r5,r0,lsl #0
-_ma_mlane_r5_r0_r3_r5:
- .word 0x00000011
- mlane r5,r0,r3,r5
-_ma_add_r5_r5_r0_lsl_0:
- .word 0x00000011
- add r5,r5,r0,lsl #0
-
-
-_ma_merge_noclip_start:
- @ ma_again:
-
- @ Merge
- ldr r14,[sp,#24]
- and r5,r14,r5,lsr #8
- and r6,r14,r6,lsr #8
- and r7,r14,r7,lsr #8
- and r8,r14,r8,lsr #8
- and r9,r14,r9,lsr #8
- and r10,r14,r10,lsr #8
- and r11,r14,r11,lsr #8
- and r12,r14,r12,lsr #8
- add r5,r5,r6,lsl #8
- add r6,r7,r8,lsl #8
- add r7,r9,r10,lsl #8
- add r8,r11,r12,lsl #8
-
- @ Store
- stmia r4!,{r5-r8}
-
- @ Loop
- subs r14,r14,#0x2000000
- .word 0xdaffffa5 @ ble ma_end
-
- @ ma_start:
- str r14,[sp,#24]
-_ma_merge_noclip_end:
-
-
-_ma_merge_boostnoclip_start:
- @ ma_again:
-
- @ Merge
- ldr r14,[sp,#24]
- and r5,r14,r5,lsr #7
- and r6,r14,r6,lsr #7
- and r7,r14,r7,lsr #7
- and r8,r14,r8,lsr #7
- and r9,r14,r9,lsr #7
- and r10,r14,r10,lsr #7
- and r11,r14,r11,lsr #7
- and r12,r14,r12,lsr #7
- add r5,r5,r6,lsl #8
- add r6,r7,r8,lsl #8
- add r7,r9,r10,lsl #8
- add r8,r11,r12,lsl #8
-
- @ Store
- stmia r4!,{r5-r8}
-
- @ Loop
- subs r14,r14,#0x2000000
- .word 0xdaffffa5 @ ble ma_end
-
- @ ma_start:
- str r14,[sp,#24]
-_ma_merge_boostnoclip_end:
-
-
-_ma_merge_clip_start:
- _ma_mask_0x80808080: .word 0x80808080
-
- .word 0,0 @ padding
-
- @ ma_again:
- @ Merge
- ldr r14,[sp,#24]
- .word 0xe51f2018 @ ldr r2,_ma_mask_0x80808080
-
- and r0,r14,r5,lsr #8
- and r1,r14,r6,lsr #8
- add r0,r0,r1,lsl #8
- and r5,r14,r5,lsr #7
- and r6,r14,r6,lsr #7
- add r5,r5,r6,lsl #8
- eor r0,r0,r5
- ands r0,r2,r0
- beq no_clip1 @ perhaps not worthwhile?
- and r1,r2,r5
- sub r1,r2,r1,lsr #7
- sub r0,r0,r0,lsr #7
- orr r0,r0,r0,lsl #1
- bic r5,r5,r0
- and r1,r1,r0
- orr r5,r5,r1
-no_clip1:
-
- and r0,r14,r7,lsr #8
- and r1,r14,r8,lsr #8
- add r0,r0,r1,lsl #8
- and r7,r14,r7,lsr #7
- and r8,r14,r8,lsr #7
- add r6,r7,r8,lsl #8
- eor r0,r0,r6
- ands r0,r2,r0
- beq no_clip2 @ perhaps not worthwhile?
- and r1,r2,r6
- sub r1,r2,r1,lsr #7
- sub r0,r0,r0,lsr #7
- orr r0,r0,r0,lsl #1
- bic r6,r6,r0
- and r1,r1,r0
- orr r6,r6,r1
-no_clip2:
-
- and r0,r14,r9,lsr #8
- and r1,r14,r10,lsr #8
- add r0,r0,r1,lsl #8
- and r9,r14,r9,lsr #7
- and r10,r14,r10,lsr #7
- add r7,r9,r10,lsl #8
- eor r0,r0,r7
- ands r0,r2,r0
- beq no_clip3 @ perhaps not worthwhile?
- and r1,r2,r7
- sub r1,r2,r1,lsr #7
- sub r0,r0,r0,lsr #7
- orr r0,r0,r0,lsl #1
- bic r7,r7,r0
- and r1,r1,r0
- orr r7,r7,r1
-no_clip3:
-
- and r0,r14,r11,lsr #8
- and r1,r14,r12,lsr #8
- add r0,r0,r1,lsl #8
- and r11,r14,r11,lsr #7
- and r12,r14,r12,lsr #7
- add r8,r11,r12,lsl #8
- eor r0,r0,r8
- ands r0,r2,r0
- beq no_clip4 @ perhaps not worthwhile?
- and r1,r2,r8
- sub r1,r2,r1,lsr #7
- sub r0,r0,r0,lsr #7
- orr r0,r0,r0,lsl #1
- bic r8,r8,r0
- and r1,r1,r0
- orr r8,r8,r1
-no_clip4:
-
- @ Store
- stmia r4!,{r5-r8}
-
- @ Loop
- subs r14,r14,#0x2000000
- .word 0xdaffff6d @ ble ma_end
-
- @ ma_start:
- str r14,[sp,#24]
-_ma_merge_clip_end:
-
-_ma_clip:
-add r12,pc,#0x540 @ adr r12,ma_buffer_start
-.word 0xea000091 @ b ma_start
-add r0,pc,#0x248 @ adr r0,ma_again
-
-_ma_noclip:
-add r12,pc,#0x460 @ adr r12,ma_buffer_start
-.word 0xea000059 @ b ma_start
-add r0,pc,#0x23c @ adr r0,ma_again
-
-
-AAS_MixAudio_SetMode_BoostAndClip:
- adr r12,_ma_clip
- adr r0,_ma_merge_clip_start
- mov r2,#((_ma_merge_clip_end-_ma_merge_clip_start)/4)
-
-do_mods:
- ldr r1,=_AAS_MixAudio_mod4
- add r2,r2,#0x84000000
- mov r3,#0x04000000
- add r3,r3,#0xd4
- stmia r3,{r0-r2}
- ldmia r12,{r1-r3}
- ldr r0,=_AAS_MixAudio_mod1
- str r1,[r0]
- ldr r0,=_AAS_MixAudio_mod2
- str r2,[r0]
- ldr r0,=_AAS_MixAudio_mod3
- str r3,[r0]
- bx lr
-
-
-AAS_MixAudio_SetMode_Normal:
- adr r12,_ma_noclip
- adr r0,_ma_merge_noclip_start
- mov r2,#((_ma_merge_noclip_end-_ma_merge_noclip_start)/4)
- b do_mods
-
-
-AAS_MixAudio_SetMode_Boost:
- adr r12,_ma_noclip
- adr r0,_ma_merge_boostnoclip_start
- mov r2,#((_ma_merge_boostnoclip_end-_ma_merge_boostnoclip_start)/4)
- b do_mods
-
-
-_ma_2ch:
-mov r6,#0x10000000
-mov r10,#2
-mov r14,#2
-sub r1,r1,#(20*2)
-
-_ma_4ch:
-mov r6,#0x30000000
-mov r10,#4
-mov r14,#4
-sub r1,r1,#(20*4)
-
-_ma_8ch:
-mov r6,#0x70000000
-mov r10,#8
-mov r14,#8
-sub r1,r1,#(20*8)
-
-
-AAS_MixAudio_SetMaxChans_4:
- adr r12,_ma_4ch
-
-do_mods2:
- ldmia r12,{r0-r3}
- ldr r12,=_AAS_MixAudio_mod5
- str r0,[r12]
- ldr r12,=_AAS_MixAudio_mod6
- str r1,[r12]
- ldr r12,=_AAS_MixAudio_mod7
- str r2,[r12]
- ldr r12,=_AAS_MixAudio_mod8
- str r3,[r12]
- bx lr
-
-
-AAS_MixAudio_SetMaxChans_8:
- adr r12,_ma_8ch
- b do_mods2
-
-
-AAS_MixAudio_SetMaxChans_2:
- adr r12,_ma_2ch
- b do_mods2
-
-.pool
-
-
-AAS_DoDMA3:
- mov r3,#0x04000000
- orr r3,r3,#0xd4
- stmia r3,{r0-r2}
- bx lr
+++ /dev/null
-/* Copyright (c) 2003-2021 James Daniels */
-/* Distributed under the MIT License */
-/* license terms: see LICENSE file in root or http://opensource.org/licenses/MIT */
-
-#include "AAS_Shared.h"
-
-AAS_s16 AAS_mod_num AAS_IN_EWRAM = -1;
-AAS_u8 AAS_mod_num_chans AAS_IN_EWRAM = 0;
-
-static AAS_s16 AAS_mod_num_store AAS_IN_EWRAM = -2;
-static AAS_u16 AAS_mod_song_pos AAS_IN_EWRAM;
-static AAS_u16 AAS_mod_line_num AAS_IN_EWRAM;
-
-struct AAS_MOD_Channel {
- AAS_u32 *pattern;
- const AAS_u8 *samp_start;
- AAS_u16 effect;
- AAS_u16 period;
- AAS_u16 slide_target_period;
- AAS_u8 samp_num;
- AAS_u8 slide_rate;
- AAS_u8 volume;
- AAS_u8 vibrato_rate;
- AAS_u8 vibrato_depth;
- AAS_u8 vibrato_pos;
- AAS_u8 tremolo_rate;
- AAS_u8 tremolo_depth;
- AAS_u8 tremolo_pos;
- AAS_s8 trigger;
- AAS_u8 arpeggio_pos;
- AAS_u8 note;
-}; /* 28 bytes */
-
-static struct AAS_MOD_Channel AAS_mod_chan[AAS_MAX_CHANNELS] AAS_IN_EWRAM;
-
-static AAS_s32 AAS_mod_timer AAS_IN_EWRAM;
-static AAS_u32 AAS_mod_tempo AAS_IN_EWRAM;
-static AAS_u8 AAS_mod_bpm AAS_IN_EWRAM;
-static AAS_u8 AAS_mod_speed AAS_IN_EWRAM;
-static AAS_BOOL AAS_mod_looped AAS_IN_EWRAM = AAS_FALSE;
-static AAS_s16 AAS_mod_overall_volume AAS_IN_EWRAM = 256;
-static AAS_u8 AAS_mod_loop_start AAS_IN_EWRAM = 0;
-static AAS_s8 AAS_mod_loop_counter AAS_IN_EWRAM = 0;
-static AAS_BOOL AAS_mod_loop AAS_IN_EWRAM = AAS_TRUE;
-static AAS_u8 AAS_mod_last_filter_value AAS_IN_EWRAM = 0;
-static AAS_BOOL AAS_mod_active_effects AAS_IN_EWRAM = AAS_FALSE;
-static AAS_s8 AAS_mod_next_song_pos AAS_IN_EWRAM = -1;
-
-int AAS_MOD_GetNumChannels()
-{
- return AAS_mod_num_chans;
-}
-
-int AAS_MOD_GetLastFilterValue()
-{
- return AAS_mod_last_filter_value;
-}
-
-int AAS_MOD_QueueSongPos(int song_pos)
-{
- if(AAS_mod_num >= 0) {
- if((song_pos >= 0) && (song_pos < 128)) {
- if(AAS_Sequence[AAS_mod_num][song_pos][0] == -1) {
- return AAS_ERROR_INVALID_SONG_POS;
- } else {
- AAS_mod_next_song_pos = song_pos;
-
- return AAS_OK;
- }
- } else {
- return AAS_ERROR_INVALID_SONG_POS;
- }
- } else {
- return AAS_ERROR_NO_MOD_PLAYING;
- }
-}
-
-int AAS_MOD_SetSongPos(int song_pos)
-{
- if(AAS_mod_num >= 0) {
- if((song_pos >= 0) && (song_pos < 128)) {
- if(AAS_Sequence[AAS_mod_num][song_pos][0] == -1) {
- return AAS_ERROR_INVALID_SONG_POS;
- } else {
- struct AAS_MOD_Channel *mod_chan = AAS_mod_chan;
- int chan;
-
- for(chan = 0; chan < AAS_mod_num_chans; ++chan) {
- mod_chan->pattern =
- (AAS_u32 *) (AAS_PatternData +
- (((int)
- AAS_Sequence[AAS_mod_num][song_pos]
- [chan]) << 8));
- ++mod_chan;
- }
- AAS_mod_line_num = 0;
- AAS_mod_song_pos = song_pos;
-
- return AAS_OK;
- }
- } else {
- return AAS_ERROR_INVALID_SONG_POS;
- }
- } else {
- return AAS_ERROR_NO_MOD_PLAYING;
- }
-}
-
-int AAS_MOD_GetSongPos()
-{
- if(AAS_mod_num >= 0)
- return AAS_mod_song_pos;
- else
- return AAS_ERROR_NO_MOD_PLAYING;
-}
-
-int AAS_MOD_GetLineNum()
-{
- if(AAS_mod_num >= 0)
- return AAS_mod_line_num;
- else
- return AAS_ERROR_NO_MOD_PLAYING;
-}
-
-int AAS_MOD_GetVolume()
-{
- return AAS_mod_overall_volume;
-}
-
-int AAS_MOD_SetVolume(int vol)
-{
- if((vol >= 0) && (vol <= 256)) {
- int i;
-
- for(i = AAS_mod_num_chans - 1; i >= 0; --i)
- AAS_channels[AAS_chan_rearrange[i]].volume = (AAS_mod_chan[i].volume * vol) >> AAS_volscale;
-
- AAS_mod_overall_volume = vol;
-
- return AAS_OK;
- } else {
- return AAS_ERROR_VOLUME_OUT_OF_RANGE;
- }
-}
-
-void AAS_MOD_Pause()
-{
- int i;
-
- AAS_mod_num_store = AAS_mod_num;
- AAS_mod_num = -1;
-
- for(i = 0; i < AAS_mod_num_chans; ++i) {
- AAS_channels[AAS_chan_rearrange[i]].active = AAS_FALSE;
- }
-}
-
-void AAS_MOD_Resume()
-{
- if(AAS_mod_num_store != -2) {
- struct AAS_Channel *ch;
- int i;
-
- for(i = 0; i < AAS_mod_num_chans; ++i) {
- ch = &AAS_channels[AAS_chan_rearrange[i]];
-
- if(!ch->active) {
- if(ch->loop_length) {
- ch->active = AAS_TRUE;
- } else {
- if(ch->pos < ((ch->end - (ch->delta >> 6)) - 1)) {
- ch->active = AAS_TRUE;
- }
- }
- }
- }
-
- AAS_mod_num = AAS_mod_num_store;
- }
-}
-
-void AAS_MOD_Stop()
-{
- int i;
- struct AAS_Channel *ch;
-
- AAS_mod_num_store = -2;
- AAS_mod_num = -1;
- AAS_mod_next_song_pos = -1;
-
- for(i = 0; i < AAS_mod_num_chans; ++i) {
- ch = &AAS_channels[AAS_chan_rearrange[i]];
- ch->active = AAS_FALSE;
- ch->loop_length = 0;
- ch->pos = 0;
- ch->end = 0;
- ch->delta = 0;
- AAS_mod_chan[i].tremolo_pos = 0;
- AAS_mod_chan[i].vibrato_pos = 0;
- AAS_mod_chan[i].effect = 0;
- AAS_mod_chan[i].volume = 0;
- AAS_mod_chan[i].trigger = -1;
- AAS_mod_chan[i].note = 0;
- AAS_mod_chan[i].slide_target_period = 0;
- }
- AAS_mod_active_effects = AAS_FALSE;
- AAS_mod_looped = AAS_FALSE;
- AAS_mod_loop_counter = 0;
- AAS_mod_loop_start = 0;
- AAS_mod_last_filter_value = 0;
- AAS_mod_num_chans = 0;
-}
-
-AAS_BOOL AAS_MOD_HasLooped()
-{
- return AAS_mod_looped;
-}
-
-AAS_BOOL AAS_MOD_IsPlaying()
-{
- return (AAS_mod_num >= 0);
-}
-
-int AAS_MOD_Play(int song_num)
-{
- AAS_MOD_Stop();
-
- if(AAS_initialised) {
- if((song_num >= 0) && (song_num < AAS_DATA_NUM_MODS) && AAS_NumChans[song_num]) {
- int i;
-
- if(AAS_volscale == 9)
- i = 16;
- else if(AAS_volscale == 8)
- i = 8;
- else
- i = 4;
-
- if(AAS_NumChans[song_num] > i) {
- return AAS_ERROR_NOT_ENOUGH_CHANNELS;
- } else {
- /*AAS_mod_num = 0; */
- AAS_mod_loop = AAS_TRUE;
- AAS_mod_num_store = -2;
- AAS_mod_song_pos = 0;
- AAS_mod_num_chans = AAS_NumChans[song_num];
-
- for(i = 0; i < AAS_mod_num_chans; ++i)
- AAS_mod_chan[i].pattern = (AAS_u32 *) (AAS_PatternData + (((int)AAS_Sequence[song_num][0][i]) << 8));
-
- AAS_mod_line_num = 0;
- AAS_mod_speed = 6;
- AAS_mod_bpm = 125;
- AAS_mod_tempo = AAS_DivTable[AAS_mod_speed] * AAS_mod_bpm;
- AAS_mod_timer = 0x7d0000 - AAS_mod_tempo;
- AAS_mod_num = song_num;
- return AAS_OK;
- }
- } else {
- return AAS_ERROR_MOD_DOES_NOT_EXIST;
- }
- } else {
- return AAS_ERROR_CALL_SET_CONFIG_FIRST;
- }
-}
-
-int AAS_MOD_SetLoop(AAS_BOOL loop)
-{
- if(AAS_initialised) {
- if(AAS_mod_num >= 0) {
- AAS_mod_loop = loop;
- return AAS_OK;
- } else {
- return AAS_ERROR_NO_MOD_PLAYING;
- }
- } else {
- return AAS_ERROR_CALL_SET_CONFIG_FIRST;
- }
-}
-
-void AAS_MOD_Interrupt()
-{
- if(AAS_mod_num >= 0) {
- AAS_mod_timer += AAS_mod_tempo;
-
- if(AAS_mod_timer < 0x7d0000) {
- if(AAS_mod_active_effects) {
- const AAS_u8 *chan_rearrange = AAS_chan_rearrange;
- struct AAS_MOD_Channel *mod_chan = AAS_mod_chan;
- int chan, num_chans;
-
- num_chans = AAS_mod_num_chans;
-
- for(chan = 0; chan < num_chans; ++chan) {
- int effect;
-
- effect = mod_chan->effect;
-
- if(effect) {
- int val, tmp, output;
- struct AAS_Channel *out_chan;
-
- tmp = chan_rearrange[chan];
- out_chan = &AAS_channels[tmp];
- output = tmp >> 3;
-
- switch (effect >> 8) {
- case 0xe: /* extended effects */
- switch (effect & 0xf0) {
- case 0xc0: /* note cut */
- val = effect & 0xf;
- --val;
- if(val <= 0) {
- mod_chan->effect = 0;
- out_chan->active = AAS_FALSE;
-
- AAS_changed[output] = AAS_TRUE;
- } else {
- mod_chan->effect = (effect & 0xff0) + val;
- }
- break;
-
- case 0x90: /* retrigger sample */
- case 0xd0: /* delay sample */
- if(mod_chan->trigger >= 0) {
- --mod_chan->trigger;
- if(mod_chan->trigger < 0) {
- const struct AAS_ModSample *samp = &AAS_ModSamples[AAS_mod_num][mod_chan->samp_num];
- int repeat = samp->repeat;
- int length = samp->length;
- const AAS_s8 *data = AAS_SampleData + samp->data;
-
- mod_chan->samp_start = data;
- out_chan->pos = data;
- out_chan-> pos_fraction = 0;
- if(repeat == 65535)
- out_chan->loop_length = 0;
- else
- out_chan->loop_length = ((AAS_u32) (length - repeat)) << 1;
- out_chan->end = data + (length << 1);
- out_chan->frequency = AAS_MOD_period_conv_table[mod_chan->period];
- out_chan->delta = AAS_Min(4095, ((out_chan->frequency * AAS_mix_scale) + 32768) >> 16);
- out_chan->active = AAS_TRUE;
-
- AAS_changed[output] = AAS_TRUE;
- }
- }
- break;
-
- default:
- break;
- }
- break;
-
- case 0x6: /* vibrato + volume slide */
- val = mod_chan->vibrato_pos;
- val += mod_chan->vibrato_rate;
- if(val >= 64)
- val -= 64;
- mod_chan->vibrato_pos = val;
- tmp = mod_chan->period + (((AAS_sin[val] * mod_chan->vibrato_depth) + 32) >> 6);
- if(tmp < 113)
- tmp = 113;
- if(tmp > 856)
- tmp = 856;
- out_chan->frequency = AAS_MOD_period_conv_table[tmp];
- out_chan->delta = AAS_Min(4095, ((out_chan->frequency * AAS_mix_scale) + 32768) >> 16);
- /* Intentionally no "break;" */
-
- case 0xa: /* volume slide */
- val = effect & 0xf0;
- if(val)
- val >>= 4;
- else
- val = -(effect & 0xf);
- tmp = mod_chan->volume;
- tmp += val;
- if(tmp > 64)
- tmp = 64;
- else if(tmp < 0)
- tmp = 0;
- mod_chan->volume = tmp;
- out_chan->volume = (tmp * AAS_mod_overall_volume) >> AAS_volscale;
-
- AAS_changed[output] = AAS_TRUE;
- break;
-
- case 0x1: /* slide up */
- val = effect & 0xff;
- tmp = mod_chan->period - val;
- if(tmp < 113)
- tmp = 113;
- mod_chan->period = tmp;
- out_chan->frequency = AAS_MOD_period_conv_table[tmp];
- out_chan->delta = AAS_Min(4095, ((out_chan->frequency * AAS_mix_scale) + 32768) >> 16);
-
- AAS_changed[output] = AAS_TRUE;
- break;
-
- case 0x2: /* slide down */
- val = effect & 0xff;
- tmp = mod_chan->period + val;
- if(tmp > 856)
- tmp = 856;
- mod_chan->period = tmp;
- out_chan->frequency = AAS_MOD_period_conv_table[tmp];
- out_chan->delta = AAS_Min(4095, ((out_chan->frequency * AAS_mix_scale) + 32768) >> 16);
-
- AAS_changed[output] = AAS_TRUE;
- break;
-
- case 0x3: /* tone portamento */
- val = mod_chan->period;
- tmp = mod_chan->slide_target_period;
- if(val < tmp) {
- val += mod_chan->slide_rate;
- if(val >= tmp) {
- mod_chan->effect = 0;
- val = tmp;
- }
- } else if(val > tmp) {
- val -= mod_chan->slide_rate;
- if(val <= tmp) {
- mod_chan->effect = 0;
- val = tmp;
- }
- } else if(val == tmp) {
- mod_chan->effect = 0;
- }
- mod_chan->period = val;
- out_chan->frequency = AAS_MOD_period_conv_table[val];
- out_chan->delta = AAS_Min(4095, ((out_chan->frequency * AAS_mix_scale) + 32768) >> 16);
-
- AAS_changed[output] = AAS_TRUE;
- break;
-
- case 0x5: /* tone portamento + volume slide */
- val = mod_chan->period;
- tmp = mod_chan->slide_target_period;
- if(val < tmp) {
- val += mod_chan->slide_rate;
- if(val >= tmp)
- val = tmp;
- } else if(val > tmp) {
- val -= mod_chan->slide_rate;
- if(val <= tmp)
- val = tmp;
- }
- mod_chan->period = val;
- out_chan->frequency = AAS_MOD_period_conv_table[val];
- out_chan->delta = AAS_Min(4095, ((out_chan->frequency * AAS_mix_scale) + 32768) >> 16);
-
- val = effect & 0xf0;
- if(val)
- val >>= 4;
- else
- val = -(effect & 0xf);
- tmp = mod_chan->volume;
- tmp += val;
- if(tmp > 64)
- tmp = 64;
- else if(tmp < 0)
- tmp = 0;
- mod_chan->volume = tmp;
- out_chan->volume = (tmp * AAS_mod_overall_volume) >> AAS_volscale;
-
- AAS_changed[output] = AAS_TRUE;
- break;
-
- case 0x4: /* vibrato */
- val = mod_chan->vibrato_pos;
- val += mod_chan->vibrato_rate;
- if(val >= 64)
- val -= 64;
- mod_chan->vibrato_pos = val;
- tmp = mod_chan->period + (((AAS_sin[val] * mod_chan->vibrato_depth) + 32) >> 6);
- if(tmp < 113)
- tmp = 113;
- else if(tmp > 856)
- tmp = 856;
- out_chan->frequency = AAS_MOD_period_conv_table[tmp];
- out_chan->delta = AAS_Min(4095, ((out_chan->frequency * AAS_mix_scale) + 32768) >> 16);
-
- AAS_changed[output] = AAS_TRUE;
- break;
-
- case 0x7: /* tremolo */
- val = mod_chan->tremolo_pos;
- val += mod_chan->tremolo_rate;
- if(val >= 64)
- val -= 64;
- mod_chan->tremolo_pos = val;
- tmp = mod_chan->volume + (((AAS_sin[val] * mod_chan->tremolo_depth) + 32) >> 6);
- if(tmp < 0)
- tmp = 0;
- else if(tmp > 64)
- tmp = 64;
- out_chan->volume = (tmp * AAS_mod_overall_volume) >> AAS_volscale;
-
- AAS_changed[output] = AAS_TRUE;
- break;
-
- case 0x0: /* possible arpeggio */
- tmp = effect & 0xff;
- if(tmp) /* definite arpeggio */
- {
- ++mod_chan->arpeggio_pos;
- val = mod_chan->note;
- switch (mod_chan->arpeggio_pos) {
- case 0:
- break;
-
- case 1:
- val += tmp >> 4;
- break;
-
- case 2:
- val += tmp & 0xf;
- /* Intentionally no "break;" to allow AAS_mod_arpeggio_pos[chan] to be restarted */
-
- default:
- mod_chan->arpeggio_pos = 0;
- break;
- }
-
- if(val) {
- out_chan->frequency = AAS_MOD_period_conv_table[AAS_period_table[AAS_ModSamples[AAS_mod_num][mod_chan->samp_num].finetune][val - 1]];
- out_chan->delta = AAS_Min(4095, ((out_chan-> frequency * AAS_mix_scale) + 32768) >> 16);
-
- AAS_changed[output] = AAS_TRUE;
- }
- }
- break;
-
- default:
- break;
- }
- }
-
- ++mod_chan;
- }
- }
- } else {
- const AAS_u8 *chan_rearrange = AAS_chan_rearrange;
- struct AAS_MOD_Channel *mod_chan = AAS_mod_chan;
- int chan, num_chans;
- int samp_num, effect, period, speed, tmp;
- int jump_ahead = -1;
- int jump_song_pos = -1;
- AAS_BOOL active_effects = AAS_FALSE;
- const struct AAS_ModSample *mod_samp = AAS_ModSamples[AAS_mod_num];
-
- num_chans = AAS_mod_num_chans;
-
- AAS_mod_timer -= 0x7d0000;
-
- for(chan = 0; chan < num_chans; ++chan) {
- int output;
- struct AAS_Channel *out_chan;
- AAS_u32 dat;
-
- tmp = chan_rearrange[chan];
- out_chan = &AAS_channels[tmp];
- output = tmp >> 3;
-
- /* Tidy up after arpeggio */
- effect = mod_chan->effect;
- if(effect) {
- if(effect < 0x100) {
- tmp = mod_chan->note;
- if(tmp) {
- out_chan->frequency = AAS_MOD_period_conv_table[AAS_period_table[mod_samp[mod_chan->samp_num].finetune][tmp - 1]];
- out_chan->delta = AAS_Min(4095, ((out_chan->frequency * AAS_mix_scale) + 32768) >> 16);
-
- AAS_changed[output] = AAS_TRUE;
- }
- }
- }
-
- dat = *mod_chan->pattern++;
- samp_num = (dat >> 24) - 1;
- period = (dat >> 12) & 0xfff;
- effect = dat & 0xfff;
-
- if(samp_num >= 0) {
- mod_chan->samp_num = samp_num;
- mod_chan->volume = tmp = mod_samp[samp_num].volume;
- out_chan->volume = (tmp * AAS_mod_overall_volume) >> AAS_volscale;
-
- AAS_changed[output] = AAS_TRUE;
- } else {
- samp_num = mod_chan->samp_num;
- }
-
- if(period) {
- if(samp_num >= 0) {
- const struct AAS_ModSample *samp = &mod_samp[samp_num];
-
- mod_chan->note = period;
- period = AAS_period_table[samp->finetune][period - 1];
-
- if((effect > 0xed0) && (effect < 0xee0)) /* delay sample */
- {
- mod_chan->period = period;
- mod_chan->trigger = (effect & 0xf) - 1;
- } else {
- tmp = effect >> 8;
-
- if((tmp != 0x3) && (tmp != 0x5)) {
- int repeat = samp->repeat;
- int length = samp->length;
- const AAS_s8 *data = AAS_SampleData + samp->data;
-
- mod_chan->samp_start = data;
- out_chan->pos = data;
- out_chan->pos_fraction = 0;
- mod_chan->period = period;
- if(repeat == 65535)
- out_chan->loop_length = 0;
- else
- out_chan->loop_length = ((AAS_u32) (length - repeat)) << 1;
- out_chan->end = data + (length << 1);
- out_chan->frequency = AAS_MOD_period_conv_table[period];
- out_chan->delta = AAS_Min(4095, ((out_chan->frequency * AAS_mix_scale) + 32768) >> 16);
- out_chan->active = AAS_TRUE;
-
- AAS_changed[output] = AAS_TRUE;
- }
- }
- }
- }
-
- if(effect) {
- switch (effect >> 8) {
- case 0xf: /* set speed */
- speed = effect & 0xff;
- if(speed > 0) {
- if(speed > 31)
- AAS_mod_bpm = speed;
- else
- AAS_mod_speed = speed;
-
- /*AAS_mod_tempo = (((1<<15)*AAS_mod_bpm*24)/(3000*AAS_mod_speed))<<13; // use LUT */
-
- /* approximately: */
- /*AAS_mod_tempo = AAS_DivTable[AAS_mod_speed]*AAS_mod_bpm*33; */
- AAS_mod_tempo = AAS_DivTable[AAS_mod_speed] * AAS_mod_bpm;
- }
- effect = 0; /* No need to process this effect again */
- break;
-
- case 0xe: /* extended effects */
- switch (effect & 0xf0) {
- case 0x00: /* set filter (used to send messages to code instead) */
- AAS_mod_last_filter_value = effect & 0xf;
- effect = 0; /* No need to process this effect again */
- break;
-
- case 0x10: /* fine slide up */
- tmp = mod_chan->period - (effect & 0xf);
- if(tmp < 113)
- tmp = 113;
- mod_chan->period = tmp;
- out_chan->frequency = AAS_MOD_period_conv_table[tmp];
- out_chan->delta = AAS_Min(4095, ((out_chan->frequency * AAS_mix_scale) + 32768) >> 16);
- effect = 0; /* No need to process this effect again */
-
- AAS_changed[output] = AAS_TRUE;
- break;
-
- case 0x20: /* fine slide down */
- tmp = mod_chan->period + (effect & 0xf);
- if(tmp > 856)
- tmp = 856;
- mod_chan->period = tmp;
- out_chan->frequency = AAS_MOD_period_conv_table[tmp];
- out_chan->delta = AAS_Min(4095, ((out_chan->frequency * AAS_mix_scale) + 32768) >> 16);
- effect = 0; /* No need to process this effect again */
-
- AAS_changed[output] = AAS_TRUE;
- break;
-
- case 0x60: /* set/jump to loop */
- tmp = effect & 0xf;
- if(tmp) {
- if(AAS_mod_loop_counter)
- --AAS_mod_loop_counter;
- else
- AAS_mod_loop_counter = tmp;
-
- if(AAS_mod_loop_counter) {
- int i;
- struct AAS_MOD_Channel
- *mod_chan2 = AAS_mod_chan;
-
- for(i = 0; i < num_chans; ++i) {
- mod_chan2->pattern = (AAS_u32 *)(AAS_PatternData + (((int)AAS_Sequence[AAS_mod_num][AAS_mod_song_pos][i]) << 8));
- mod_chan2-> pattern += AAS_mod_loop_start;
- ++mod_chan2;
- }
- AAS_mod_line_num = AAS_mod_loop_start;
- }
- } else {
- AAS_mod_loop_start = AAS_mod_line_num;
- }
- effect = 0; /* No need to process this effect again */
- break;
-
- case 0x90: /* retrigger sample */
- mod_chan->trigger = (effect & 0xf) - 1;
- break;
-
- case 0xa0: /* fine volume slide up */
- tmp = mod_chan->volume;
- tmp += effect & 0xf;
- if(tmp > 64)
- tmp = 64;
- mod_chan->volume = tmp;
- out_chan->volume = (tmp * AAS_mod_overall_volume) >> AAS_volscale;
- effect = 0; /* No need to process this effect again */
-
- AAS_changed[output] = AAS_TRUE;
- break;
-
- case 0xb0: /* fine volume slide down */
- tmp = mod_chan->volume;
- tmp -= effect & 0xf;
- if(tmp < 0)
- tmp = 0;
- mod_chan->volume = tmp;
- out_chan->volume = (tmp * AAS_mod_overall_volume) >> AAS_volscale;
- effect = 0; /* No need to process this effect again */
-
- AAS_changed[output] = AAS_TRUE;
- break;
-
- case 0xc0: /* note cut */
- if((effect & 0xf) == 0) {
- effect = 0;
- out_chan->active = AAS_FALSE;
- AAS_changed[output] = AAS_TRUE;
- }
- break;
-
- case 0xe0: /* pattern delay */
- AAS_mod_timer -= (effect & 0xf) * 0x7d0000;
- effect = 0; /* No need to process this effect again */
- break;
-
- default:
- break;
- }
- break;
-
- case 0xd: /* pattern break */
- /*jump_ahead = (((effect>>4)&0xf)*10)+(effect&0xf); */
- jump_ahead = effect & 0xff;
- effect = 0; /* No need to process this effect again */
- break;
-
- case 0xc: /* set volume */
- mod_chan->volume = tmp = effect & 0xff;
- out_chan->volume = (tmp * AAS_mod_overall_volume) >> AAS_volscale;
- effect = 0; /* No need to process this effect again */
-
- AAS_changed[output] = AAS_TRUE;
- break;
-
- case 0xb: /* position jump */
- jump_song_pos = effect & 0xff;
- effect = 0; /* No need to process this effect again */
- break;
-
- case 0x9: /* set sample offset */
- tmp = effect & 0xff;
- if(tmp) {
- const AAS_s8 *new_pos = mod_chan->samp_start + (tmp << 8);
-
- if(new_pos >= out_chan->end) {
- out_chan->active = AAS_FALSE;
-
- AAS_changed[output] = AAS_TRUE;
- } else
- out_chan->pos = new_pos;
- }
- effect = 0; /* No need to process this effect again */
- break;
-
- case 0x7: /* tremolo */
- if(effect & 0xf0)
- mod_chan->tremolo_rate = (effect & 0xf0) >> 4;
- if(effect & 0xf)
- mod_chan->tremolo_depth = effect & 0xf;
- if(effect & 0xff)
- mod_chan->tremolo_pos = 0;
- break;
-
- case 0x4: /* vibrato */
- if(effect & 0xf0)
- mod_chan->vibrato_rate = (effect & 0xf0) >> 4;
- if(effect & 0xf)
- mod_chan->vibrato_depth = effect & 0xf;
- if(effect & 0xff)
- mod_chan->vibrato_pos = 0;
- break;
-
- case 0x3: /* tone portamento */
- tmp = effect & 0xff;
- if(tmp)
- mod_chan->slide_rate = tmp;
-
- if(period)
- mod_chan->slide_target_period = period;
- else if(mod_chan->slide_target_period == 0)
- effect = 0;
- break;
-
- case 0x0: /* possible arpeggio */
- tmp = effect & 0xff;
- if(tmp) /* definite arpeggio */
- {
- tmp = mod_chan->note;
- mod_chan->arpeggio_pos = 0;
- if(tmp) {
- out_chan->frequency = AAS_MOD_period_conv_table[AAS_period_table[mod_samp[mod_chan->samp_num].finetune][tmp - 1]];
- out_chan->delta = AAS_Min(4095, ((out_chan->frequency * AAS_mix_scale) + 32768) >> 16);
-
- AAS_changed[output] = AAS_TRUE;
- }
- }
- break;
-
- default:
- /*printf_special( "effect:%p period:%d samp:%d\n", effect, period, samp_num ); */
- break;
- }
- }
-
- mod_chan->effect = effect;
- if(effect)
- active_effects = AAS_TRUE;
- ++mod_chan;
- }
-
- AAS_mod_active_effects = active_effects;
-
- if(jump_ahead >= 0) {
- AAS_mod_loop_start = 0;
- ++AAS_mod_song_pos;
- if(AAS_Sequence[AAS_mod_num][AAS_mod_song_pos][0] == -1) {
- AAS_mod_looped = AAS_TRUE;
- AAS_mod_song_pos = 0;
- mod_chan = AAS_mod_chan;
- for(chan = num_chans; chan > 0; --chan) {
- mod_chan->slide_target_period = 0;
- ++mod_chan;
- }
- }
-
- mod_chan = AAS_mod_chan;
- for(chan = 0; chan < num_chans; ++chan) {
- mod_chan->pattern = (AAS_u32 *) (AAS_PatternData + (((int)AAS_Sequence[AAS_mod_num][AAS_mod_song_pos][chan]) << 8));
- mod_chan->pattern += jump_ahead;
- ++mod_chan;
- }
- AAS_mod_line_num = jump_ahead;
- } else if(jump_song_pos >= 0) {
- AAS_mod_loop_start = 0;
- if(jump_song_pos < 128) {
- AAS_mod_song_pos = jump_song_pos;
- if(AAS_Sequence[AAS_mod_num][AAS_mod_song_pos][0] == -1) {
- AAS_mod_looped = AAS_TRUE;
- mod_chan = AAS_mod_chan;
- for(chan = num_chans; chan > 0; --chan) {
- mod_chan->slide_target_period = 0;
- ++mod_chan;
- }
- AAS_mod_song_pos = 0;
- }
- } else {
- AAS_mod_looped = AAS_TRUE;
- mod_chan = AAS_mod_chan;
- for(chan = num_chans; chan > 0; --chan) {
- mod_chan->slide_target_period = 0;
- ++mod_chan;
- }
- AAS_mod_song_pos = 0;
- }
-
- mod_chan = AAS_mod_chan;
- for(chan = 0; chan < num_chans; ++chan) {
- mod_chan->pattern = (AAS_u32*)(AAS_PatternData + (((int)AAS_Sequence[AAS_mod_num][AAS_mod_song_pos][chan]) << 8));
- ++mod_chan;
- }
- AAS_mod_line_num = 0;
- } else {
- ++AAS_mod_line_num;
- if(AAS_mod_line_num > 63) {
- AAS_mod_line_num = 0;
- AAS_mod_loop_start = 0;
-
- if(AAS_mod_next_song_pos == -1) {
- ++AAS_mod_song_pos;
- } else {
- AAS_mod_song_pos = AAS_mod_next_song_pos;
- AAS_mod_next_song_pos = -1;
- }
-
- if(AAS_Sequence[AAS_mod_num][AAS_mod_song_pos][0] == -1) {
- AAS_mod_looped = AAS_TRUE;
- mod_chan = AAS_mod_chan;
- for(chan = num_chans; chan > 0; --chan) {
- mod_chan->slide_target_period = 0;
- ++mod_chan;
- }
- AAS_mod_song_pos = AAS_RestartPos[AAS_mod_num];
- }
-
- mod_chan = AAS_mod_chan;
- for(chan = 0; chan < num_chans; ++chan) {
- mod_chan->pattern = (AAS_u32*)(AAS_PatternData + (((int)AAS_Sequence[AAS_mod_num][AAS_mod_song_pos][chan]) << 8));
- ++mod_chan;
- }
- }
- }
-
- if(AAS_mod_looped)
- if(!AAS_mod_loop)
- AAS_MOD_Stop();
- }
- }
-}
+++ /dev/null
-/* Copyright (c) 2003-2021 James Daniels */
-/* Distributed under the MIT License */
-/* license terms: see LICENSE file in root or http://opensource.org/licenses/MIT */
-
-#include "AAS_Shared.h"
-#include "../../src/debug.h"
-
-extern const int AAS_data_v111;
-int AAS_lib_v111 AAS_IN_EWRAM;
-
-static AAS_BOOL AAS_da_active AAS_IN_EWRAM;
-static AAS_BOOL AAS_db_active AAS_IN_EWRAM;
-static AAS_BOOL AAS_dynamic_mix_rate AAS_IN_EWRAM;
-
-/* 0 = 0 Hz mix rate */
-/* 1 = 800 Hz mix rate, 16 byte mix buffer */
-/* 2 = 1600 Hz mix rate, 32 byte mix buffer */
-/* n = 800n Hz mix rate, 16n byte mix buffer */
-/* n <= 40 */
-/* REG_TM1D = 0x10000 - 16n; */
-/* REG_TM0D = AAS_tick_rate[n]; // 0x10000 - ((int)(16777216/800n)); */
-static AAS_u8 AAS_req_mix_rate AAS_IN_EWRAM;
-static AAS_u8 AAS_next_mix_rate AAS_IN_EWRAM;
-
-static AAS_u8 *AAS_next_mixing_buffer AAS_IN_EWRAM;
-
-static AAS_BOOL AAS_DSA_first AAS_IN_EWRAM = AAS_TRUE;
-
-static AAS_u8 AAS_MaxChans AAS_IN_EWRAM = 4;
-
-static AAS_BOOL AAS_Loud AAS_IN_EWRAM = AAS_FALSE;
-static AAS_u8 AAS_MixAudio_Mode AAS_IN_EWRAM = AAS_MIXAUDIO_MODE_NORMAL;
-
-
-void AAS_MixAudio_SetMode_Normal();
-void AAS_MixAudio_SetMode_Boost();
-void AAS_MixAudio_SetMode_BoostAndClip();
-void AAS_MOD_Interrupt();
-
-
-void AAS_MixAudio_SetMode(int mode)
-{
- if(mode != AAS_MixAudio_Mode) {
- switch (mode) {
- case AAS_MIXAUDIO_MODE_NORMAL:
- AAS_MixAudio_SetMode_Normal();
- AAS_MixAudio_Mode = AAS_MIXAUDIO_MODE_NORMAL;
- AAS_changed[0] = AAS_TRUE;
- AAS_changed[1] = AAS_TRUE;
- break;
-
- case AAS_MIXAUDIO_MODE_BOOST:
- AAS_MixAudio_SetMode_Boost();
- AAS_MixAudio_Mode = AAS_MIXAUDIO_MODE_BOOST;
- AAS_changed[0] = AAS_TRUE;
- AAS_changed[1] = AAS_TRUE;
- break;
-
- case AAS_MIXAUDIO_MODE_BOOSTANDCLIP:
- AAS_MixAudio_SetMode_BoostAndClip();
- AAS_MixAudio_Mode = AAS_MIXAUDIO_MODE_BOOSTANDCLIP;
- AAS_changed[0] = AAS_TRUE;
- AAS_changed[1] = AAS_TRUE;
- break;
-
- default:
- break;
- }
- }
-}
-
-static void AAS_DoConfig(int mix_rate, int volscale, AAS_BOOL stereo, AAS_BOOL dynamic,
- AAS_BOOL loud, int chans)
-{
- struct AAS_Channel *ch;
- int i;
-
- AAS_MOD_Stop();
-
- if(!AAS_initialised) {
- REG_SOUNDCNT_X = 0x0080; /* turn sound chip on */
-
- REG_DMA1SAD = (AAS_u32) AAS_mix_buffer; /*dma1 source */
- REG_DMA1DAD = 0x040000a0; /*write to FIFO A address */
- REG_DMA1CNT_H = 0xb600; /*dma control: DMA enabled+ start on FIFO+32bit+repeat+increment source&dest */
-
- REG_DMA2SAD = (AAS_u32) (AAS_mix_buffer + 160); /*dma2 source */
- REG_DMA2DAD = 0x040000a4; /*write to FIFO B address */
- REG_DMA2CNT_H = 0xb600; /*dma control: DMA enabled+ start on FIFO+32bit+repeat+increment source&dest */
-
- AAS_next_mixing_buffer = ((AAS_u8 *) AAS_mix_buffer) + 1280;
-
- REG_IE |= 0x10; /* Enable irq for timer 1 */
- REG_IME = 1; /* Enable all interrupts */
-
- AAS_da_active = AAS_FALSE;
- AAS_db_active = AAS_FALSE;
- }
-
- REG_TM0CNT = 0x0;
- REG_TM1CNT = 0x0;
-
- if(chans != AAS_MaxChans) {
- switch (chans) {
- case 8:
- AAS_MixAudio_SetMaxChans_8();
- break;
-
- case 4:
- AAS_MixAudio_SetMaxChans_4();
- break;
-
- default:
- AAS_MixAudio_SetMaxChans_2();
- break;
- }
- AAS_MaxChans = chans;
- }
-
- AAS_next_mix_rate = AAS_req_mix_rate = mix_rate;
- AAS_mix_scale = ((AAS_DivTable[mix_rate] * 82) + 128) >> 6;
- AAS_dynamic_mix_rate = dynamic;
-
- if(stereo) {
- const AAS_u8 chan_rearrange[AAS_MAX_CHANNELS] =
- { 0, 8, 9, 1, 2, 10, 11, 3, 4, 12, 13, 5, 6, 14, 15, 7 };
-
- for(i = 0; i < AAS_MAX_CHANNELS; ++i) {
- AAS_chan_rearrange[i] = chan_rearrange[i];
- }
-
- REG_SOUNDCNT_H = 0x9a0d; /*enable DS A&B + fifo reset + use timer0 + 100% volume to L and R */
- } else {
- int a, b;
-
- a = 0;
- for(b = 0; b < chans; ++b) {
- AAS_chan_rearrange[a] = b;
- ++a;
- }
- for(b = 0; b < chans; ++b) {
- AAS_chan_rearrange[a] = b + 8;
- ++a;
- }
-
- REG_SOUNDCNT_H = 0xbb0d; /*enable DS A&B + fifo reset + use timer0 + 100% volume to L and R */
- }
-
- ch = &AAS_channels[0];
- for(i = 16; i > 0; --i) {
- ch->active = AAS_FALSE;
- ch->loop_length = 0;
- ch->pos = 0;
- ch->end = 0;
- ch->delta = 0;
- ++ch;
- }
-
- AAS_volscale = volscale;
-
- AAS_Loud = loud;
- if(!loud)
- AAS_MixAudio_SetMode(AAS_MIXAUDIO_MODE_NORMAL);
-
- REG_TM0D = AAS_tick_rate[mix_rate];
- REG_TM0CNT = 0x0080; /* Enable timer0 */
-
- REG_TM1D = 0x10000 - (mix_rate << 4);
- REG_TM1CNT = 0xC4; /*enable timer1 + irq and cascade from timer 0 */
-
- AAS_lib_v111 = AAS_data_v111;
-}
-
-int AAS_SetConfig(int config_mix, int config_chans, int config_spatial, int config_dynamic)
-{
- int i, chans, mix_rate, volscale, ret;
- AAS_BOOL stereo;
- AAS_BOOL dynamic;
- AAS_BOOL loud;
-
- ret = AAS_OK;
-
- switch (config_mix) {
- case AAS_CONFIG_MIX_32KHZ:
- mix_rate = 40;
- break;
-
- case AAS_CONFIG_MIX_28KHZ:
- mix_rate = 35;
- break;
-
- case AAS_CONFIG_MIX_24KHZ:
- mix_rate = 30;
- break;
-
- case AAS_CONFIG_MIX_20KHZ:
- mix_rate = 25;
- break;
-
- case AAS_CONFIG_MIX_16KHZ:
- mix_rate = 20;
- break;
-
- case AAS_CONFIG_MIX_12KHZ:
- mix_rate = 15;
- break;
-
- case AAS_CONFIG_MIX_8KHZ:
- mix_rate = 10;
- break;
-
- default:
- ret = AAS_ERROR_INVALID_CONFIG;
- break;
- }
-
- switch (config_chans) {
- case AAS_CONFIG_CHANS_16_LOUD:
- volscale = 9;
- loud = AAS_TRUE;
- chans = 8;
- break;
-
- case AAS_CONFIG_CHANS_8_LOUD:
- volscale = 8;
- loud = AAS_TRUE;
- chans = 4;
- break;
-
- case AAS_CONFIG_CHANS_4_LOUD:
- volscale = 7;
- loud = AAS_TRUE;
- chans = 2;
- break;
-
- case AAS_CONFIG_CHANS_16:
- volscale = 9;
- loud = AAS_FALSE;
- chans = 8;
- break;
-
- case AAS_CONFIG_CHANS_8:
- volscale = 8;
- loud = AAS_FALSE;
- chans = 4;
- break;
-
- case AAS_CONFIG_CHANS_4:
- volscale = 7;
- loud = AAS_FALSE;
- chans = 2;
- break;
-
- default:
- ret = AAS_ERROR_INVALID_CONFIG;
- break;
- }
-
- switch (config_spatial) {
- case AAS_CONFIG_SPATIAL_MONO:
- stereo = AAS_FALSE;
- break;
-
- case AAS_CONFIG_SPATIAL_STEREO:
- stereo = AAS_TRUE;
- break;
-
- default:
- ret = AAS_ERROR_INVALID_CONFIG;
- break;
- }
-
- switch (config_dynamic) {
- case AAS_CONFIG_DYNAMIC_ON:
- dynamic = AAS_TRUE;
- break;
-
- case AAS_CONFIG_DYNAMIC_OFF:
- dynamic = AAS_FALSE;
- break;
-
- default:
- ret = AAS_ERROR_INVALID_CONFIG;
- break;
- }
-
- if(ret == AAS_OK) {
- AAS_DoConfig(mix_rate, volscale, stereo, dynamic, loud, chans);
-
- AAS_initialised = AAS_TRUE;
- }
-
- return ret;
-}
-
-const AAS_s8 *AAS_GetOutputBufferAddress(int buffer)
-{
- switch (buffer) {
- case 0:
- if(AAS_da_active)
- return AAS_next_mixing_buffer;
- else
- return AAS_NULL;
- break;
-
- case 1:
- if(AAS_db_active)
- return AAS_next_mixing_buffer + 640;
- else
- return AAS_NULL;
- break;
-
- default:
- return AAS_NULL;
- break;
- }
-}
-
-int AAS_GetOutputBufferLength()
-{
- return AAS_next_mix_rate * 16;
-}
-
-const AAS_u32 AAS_zero_vols[160] = { 0 };
-
-static AAS_BOOL AAS_interrupt_occured AAS_IN_EWRAM = AAS_FALSE;
-
-void AAS_FastTimer1InterruptHandler()
-{
- if(AAS_dynamic_mix_rate) {
- REG_TM0CNT = 0x0;
- REG_TM0D = AAS_tick_rate[AAS_next_mix_rate];
- REG_TM0CNT = 0x0080; /* Enable timer0 */
- REG_TM1CNT = 0x0;
- REG_TM1D = 0x10000 - (AAS_next_mix_rate << 4);
- REG_TM1CNT = 0xC4; /* Enable timer1 + irq and cascade from timer 0 */
- }
-
- REG_DMA1CNT = 0x84400004;
- REG_DMA2CNT = 0x84400004;
- REG_DMA1CNT_H = 0x0440;
- REG_DMA2CNT_H = 0x0440;
- if(AAS_da_active)
- REG_DMA1SAD = (unsigned long)AAS_next_mixing_buffer; /* DMA1 source */
- else
- REG_DMA1SAD = (unsigned long)AAS_zero_vols;
- REG_DMA1CNT_H = 0xb600; /* DMA control: DMA enabled+start on FIFO+32bit+repeat+increment source&dest */
- /* Get click on hardware when switch off DMA on Direct Sound B, so have to do it this way instead */
- if(AAS_db_active)
- REG_DMA2SAD = (unsigned long)AAS_next_mixing_buffer + 640; /* DMA2 source */
- else
- REG_DMA2SAD = (unsigned long)AAS_zero_vols; /* DMA2 source */
- REG_DMA2CNT_H = 0xb600; /* DMA control: DMA enabled+start on FIFO+32bit+repeat+increment source&dest */
-
- AAS_interrupt_occured = AAS_TRUE;
-}
-
-#define READCH1 \
- if ( ch->active ) \
- { \
- int vol = ch->volume; \
- if ( vol == 0 ) \
- { \
- int delta = ch->delta; \
- const AAS_s8* end_addr; \
- addr = ch->pos + ((delta*curr_mix_rate)>>6); \
- end_addr = (ch->end - (delta>>6)) - 1; \
- if ( addr >= end_addr ) \
- { \
- int ll = ch->loop_length; \
- if ( ll ) \
- { \
- while( addr >= end_addr ) \
- { \
- addr -= ll; \
- } \
- } \
- else \
- { \
- ch->active = AAS_FALSE; \
- } \
- } \
- ch->pos = addr; \
- } \
- else \
- { \
- tmp1 += vol; \
- } \
- ch->effective_volume = vol; \
- } \
- else \
- { \
- ch->effective_volume = 0; \
- } \
-
-#define READCH2 \
- if ( ch->active ) \
- { \
- int vol = ch->volume; \
- if ( vol == 0 ) \
- { \
- int delta = ch->delta; \
- const AAS_s8* end_addr; \
- addr = ch->pos + ((delta*curr_mix_rate)>>6); \
- end_addr = (ch->end - (delta>>6)) - 1; \
- if ( addr >= end_addr ) \
- { \
- int ll = ch->loop_length; \
- if ( ll ) \
- { \
- while( addr >= end_addr ) \
- { \
- addr -= ll; \
- } \
- } \
- else \
- { \
- ch->active = AAS_FALSE; \
- } \
- } \
- ch->pos = addr; \
- } \
- else \
- { \
- tmp2 += vol; \
- } \
- ch->effective_volume = vol; \
- } \
- else \
- { \
- ch->effective_volume = 0; \
- } \
-
-void AAS_DoWork()
-{
- if(AAS_interrupt_occured) {
- AAS_interrupt_occured = AAS_FALSE;
-
- if(AAS_next_mixing_buffer == (AAS_u8 *) AAS_mix_buffer)
- AAS_next_mixing_buffer = ((AAS_u8 *) AAS_mix_buffer) + 1280;
- else
- AAS_next_mixing_buffer = ((AAS_u8 *) AAS_mix_buffer);
-
- AAS_MOD_Interrupt();
-
- {
- int tmp1, tmp2, val, curr_mix_rate;
- struct AAS_Channel *ch;
- const AAS_s8 *addr;
-
- curr_mix_rate = AAS_req_mix_rate;
-
- if(AAS_dynamic_mix_rate) {
- val = 0;
- ch = &AAS_channels[0];
- for(tmp2 = AAS_MaxChans; tmp2 > 0; --tmp2) {
- if(ch->active && (ch->volume > 0)) {
- tmp1 = ch->frequency;
- if(tmp1 > val)
- val = tmp1;
- }
- ++ch;
- }
-
- ch = &AAS_channels[8];
- for(tmp2 = AAS_MaxChans; tmp2 > 0; --tmp2) {
- if(ch->active && (ch->volume > 0)) {
- tmp1 = ch->frequency;
- if(tmp1 > val)
- val = tmp1;
- }
- ++ch;
- }
-
- val = ((val * 82) >> 16) + 1;
- if(val < curr_mix_rate)
- curr_mix_rate = val;
-
- if(AAS_next_mix_rate != curr_mix_rate) {
- AAS_next_mix_rate = curr_mix_rate;
- AAS_mix_scale = val = ((AAS_DivTable[curr_mix_rate] * 82) + 128) >> 6;
- ch = &AAS_channels[0];
- for(tmp2 = AAS_MaxChans; tmp2 > 0; --tmp2) {
- if(ch->active)
- ch->delta = AAS_Min(4095, ((ch->frequency * val) + 32768) >> 16);
- ++ch;
- }
-
- ch = &AAS_channels[8];
- for(tmp2 = AAS_MaxChans; tmp2 > 0; --tmp2) {
- if(ch->active)
- ch->delta = AAS_Min(4095, ((ch->frequency * val) + 32768) >> 16);
- ++ch;
- }
-
- AAS_changed[0] = AAS_TRUE;
- AAS_changed[1] = AAS_TRUE;
- }
- }
-
- tmp1 = 0;
- tmp2 = 0;
-
- ch = &AAS_channels[0];
- switch (AAS_MaxChans) {
- case 8:
- READCH1++ ch;
- READCH1++ ch;
- READCH1++ ch;
- READCH1++ ch;
- READCH1++ ch;
- READCH1++ ch;
- READCH1++ ch;
- READCH1++ ch;
- READCH2++ ch;
- READCH2++ ch;
- READCH2++ ch;
- READCH2++ ch;
- READCH2++ ch;
- READCH2++ ch;
- READCH2++ ch;
- READCH2 break;
-
- case 4:
- READCH1++ ch;
- READCH1++ ch;
- READCH1++ ch;
- READCH1 ch = &AAS_channels[8];
- READCH2++ ch;
- READCH2++ ch;
- READCH2++ ch;
- READCH2 break;
-
- case 2:
- default:
- READCH1++ ch;
- READCH1 ch = &AAS_channels[8];
- READCH2++ ch;
- READCH2 break;
- }
-
- if(AAS_Loud) {
- if(AAS_DSA_first) {
- /* Direct Sound A */
- if(tmp1) {
- if(tmp1 > 128) {
- AAS_MixAudio_SetMode(AAS_MIXAUDIO_MODE_BOOSTANDCLIP);
- } else {
- AAS_MixAudio_SetMode(AAS_MIXAUDIO_MODE_BOOST);
- }
-
- if(AAS_changed[0]) {
- AAS_INIT_BRANCH
- AAS_BRANCH(AAS_MixAudio, AAS_next_mixing_buffer, &AAS_channels[0], curr_mix_rate);
- } else {
- AAS_INIT_BRANCH
- AAS_BRANCH(AAS_MixAudio_NoChange, AAS_next_mixing_buffer, &AAS_channels[0], curr_mix_rate);
- }
- AAS_da_active = AAS_TRUE;
- } else {
- AAS_da_active = AAS_FALSE;
- }
-
- /* Direct Sound B */
- if(tmp2) {
- if(tmp2 > 128) {
- AAS_MixAudio_SetMode(AAS_MIXAUDIO_MODE_BOOSTANDCLIP);
- } else {
- AAS_MixAudio_SetMode(AAS_MIXAUDIO_MODE_BOOST);
- }
-
- {
- AAS_INIT_BRANCH
- AAS_BRANCH(AAS_MixAudio, AAS_next_mixing_buffer + 640, &AAS_channels[8], curr_mix_rate);
- }
-
- AAS_db_active = AAS_TRUE;
- } else {
- AAS_db_active = AAS_FALSE;
- }
-
- AAS_DSA_first = AAS_FALSE;
- } else {
- /* Direct Sound B */
- if(tmp2) {
- if(tmp2 > 128) {
- AAS_MixAudio_SetMode(AAS_MIXAUDIO_MODE_BOOSTANDCLIP);
- } else {
- AAS_MixAudio_SetMode(AAS_MIXAUDIO_MODE_BOOST);
- }
-
- if(AAS_changed[1]) {
- AAS_INIT_BRANCH
- AAS_BRANCH(AAS_MixAudio, AAS_next_mixing_buffer + 640, &AAS_channels[8], curr_mix_rate);
- } else {
- AAS_INIT_BRANCH
- AAS_BRANCH(AAS_MixAudio_NoChange, AAS_next_mixing_buffer + 640, &AAS_channels[8], curr_mix_rate);
- }
- AAS_db_active = AAS_TRUE;
- } else {
- AAS_db_active = AAS_FALSE;
- }
-
- /* Direct Sound A */
- if(tmp1) {
- if(tmp1 > 128) {
- AAS_MixAudio_SetMode(AAS_MIXAUDIO_MODE_BOOSTANDCLIP);
- } else {
- AAS_MixAudio_SetMode(AAS_MIXAUDIO_MODE_BOOST);
- }
-
- {
- AAS_INIT_BRANCH
- AAS_BRANCH(AAS_MixAudio, AAS_next_mixing_buffer, &AAS_channels[0], curr_mix_rate);
- }
-
- AAS_da_active = AAS_TRUE;
- } else {
- AAS_da_active = AAS_FALSE;
- }
-
- AAS_DSA_first = AAS_TRUE;
- }
- } else {
- if(AAS_DSA_first) {
- /* Direct Sound A */
- if(tmp1) {
- if(AAS_changed[0]) {
- AAS_INIT_BRANCH
- AAS_BRANCH(AAS_MixAudio, AAS_next_mixing_buffer, &AAS_channels[0], curr_mix_rate);
- } else {
- AAS_INIT_BRANCH
- AAS_BRANCH(AAS_MixAudio_NoChange, AAS_next_mixing_buffer, &AAS_channels[0], curr_mix_rate);
- }
- AAS_da_active = AAS_TRUE;
- } else {
- AAS_da_active = AAS_FALSE;
- }
-
- /* Direct Sound B */
- if(tmp2) {
- {
- AAS_INIT_BRANCH
- AAS_BRANCH(AAS_MixAudio, AAS_next_mixing_buffer + 640, &AAS_channels[8], curr_mix_rate);
- }
- AAS_db_active = AAS_TRUE;
- } else {
- AAS_db_active = AAS_FALSE;
- }
-
- AAS_DSA_first = AAS_FALSE;
- } else {
- /* Direct Sound B */
- if(tmp2) {
- if(AAS_changed[1]) {
- AAS_INIT_BRANCH
- AAS_BRANCH(AAS_MixAudio, AAS_next_mixing_buffer + 640, &AAS_channels[8], curr_mix_rate);
- } else {
- AAS_INIT_BRANCH
- AAS_BRANCH(AAS_MixAudio_NoChange, AAS_next_mixing_buffer + 640, &AAS_channels[8], curr_mix_rate);
- }
- AAS_db_active = AAS_TRUE;
- } else {
- AAS_db_active = AAS_FALSE;
- }
-
- /* Direct Sound A */
- if(tmp1) {
- {
- AAS_INIT_BRANCH
- AAS_BRANCH(AAS_MixAudio, AAS_next_mixing_buffer, &AAS_channels[0], curr_mix_rate);
- }
-
- AAS_da_active = AAS_TRUE;
- } else {
- AAS_da_active = AAS_FALSE;
- }
-
- AAS_DSA_first = AAS_TRUE;
- }
- }
-
- AAS_changed[0] = AAS_FALSE;
- AAS_changed[1] = AAS_FALSE;
- }
- }
-}
-
-void AAS_Timer1InterruptHandler()
-{
- AAS_FastTimer1InterruptHandler();
- AAS_DoWork();
-}
-
-int AAS_GetActualMixRate()
-{
- return AAS_next_mix_rate * 800;
-}
+++ /dev/null
-/* Copyright (c) 2003-2021 James Daniels */
-/* Distributed under the MIT License */
-/* license terms: see LICENSE file in root or http://opensource.org/licenses/MIT */
-
-/* Mixer-specific AAS include */
-/* */
-/* The functions and variables declared here should only be used if you need */
-/* to directly access AAS_MixAudio(). This is not recommended and doing so */
-/* will make it unsafe to use any other AAS functions except AAS_ShowLogo() */
-/* and AAS_DoDMA3(). See the "Mixer" section of the documentation for more */
-/* information. */
-
-#ifndef __AAS_MIXER__
-#define __AAS_MIXER__
-
-#include "AAS.h"
-
-AAS_BEGIN_DECLS
-
-#define AAS_IN_IWRAM __attribute__ ((section (".iwram")))
-#define AAS_IN_EWRAM __attribute__ ((section (".ewram")))
-
-struct AAS_Channel
-{
- AAS_u8 effective_volume; /* 0 : effective_volume = (active&volume)?volume:0 */
- AAS_BOOL active; /* 1 : 0 = Channel inactive, 1 = channel active */
- AAS_u8 volume; /* 2 : Total vol of chan set must be <= 256, each vol usually in range 0-64 */
- AAS_u8 pos_fraction; /* 3 : Fraction component of pos */
- AAS_u16 frequency; /* 4 : Frequency (Hz) */
- AAS_u16 delta; /* 6 : Delta */
- const AAS_s8* pos; /* 8 : Current sample address, fraction component in pos_fraction */
- const AAS_s8* end; /* 12 : Address of end of sample */
- AAS_u32 loop_length; /* 16 : 0 = No repeat, Other value = Bytes from end back to restart point */
-}; /* Length = 20 bytes */
-
-extern struct AAS_Channel AAS_channels[16] AAS_IN_EWRAM;
-extern AAS_u32 AAS_mix_buffer[640] AAS_IN_EWRAM;
-
-#define AAS_INIT_BRANCH void (*ptr2Function)();
-#define AAS_BRANCH(a,b...) ({ ptr2Function = a; ptr2Function(b); })
-
-/* AAS_MixAudio() is in IWRAM, call from ROM as follows: (same for AAS_MixAudio_NoChange()) */
-/* AAS_INIT_BRANCH */
-/* AAS_BRANCH( AAS_MixAudio, mix_buffer, chans, iterations ); */
-
-void AAS_MixAudio( AAS_s8* mix_buffer, struct AAS_Channel chans[], int iterations );
-void AAS_MixAudio_NoChange( AAS_s8* mix_buffer, struct AAS_Channel chans[], int iterations ); /* Only call if no changes to chans[] since previous call to AAS_MixAudio(). Do not call twice in a row. */
-
-#define AAS_MIXAUDIO_MODE_NORMAL 0 /* Total vol must be <= 256, normal vol - default */
-#define AAS_MIXAUDIO_MODE_BOOST 1 /* Total vol must be <= 128, double vol */
-#define AAS_MIXAUDIO_MODE_BOOSTANDCLIP 2 /* Total vol must be <= 256, double vol */
-
-void AAS_MixAudio_SetMode( int mode ); /* Set mixer mode, only call if 100% sure AAS_MixAudio won't interrupt */
-
-/* Set maximum number of channels in set (lower=faster), only call if 100% sure AAS_MixAudio won't interrupt */
-void AAS_MixAudio_SetMaxChans_2();
-void AAS_MixAudio_SetMaxChans_4(); /* Default */
-void AAS_MixAudio_SetMaxChans_8();
-
-AAS_END_DECLS
-
-#endif
+++ /dev/null
-@ Copyright (c) 2003-2021 James Daniels
-@ Distributed under the MIT License
-@ license terms: see LICENSE file in root or http://opensource.org/licenses/MIT
-
-.TEXT
-.SECTION .iwram,"ax",%progbits
-.ALIGN
-.ARM
-
-.GLOBAL AAS_MixAudio
-.GLOBAL AAS_MixAudio_NoChange
-.EXTERN AAS_DivTable
-
-.GLOBAL _AAS_MixAudio_mod1
-.GLOBAL _AAS_MixAudio_mod2
-.GLOBAL _AAS_MixAudio_mod3
-.GLOBAL _AAS_MixAudio_mod4
-.GLOBAL _AAS_MixAudio_mod5
-.GLOBAL _AAS_MixAudio_mod6
-.GLOBAL _AAS_MixAudio_mod7
-.GLOBAL _AAS_MixAudio_mod8
-
-.pool
-
-_ma_mov_r3_0: mov r3,#0
-_ma_add_r0_r0_0: add r0,r0,#0
-
-_ma_ldr_pc_0: .word 0xe51f0000+8 @ sort of equivalent to opcode(ldr r0,[pc,#-0])
-_ma_mov_r14_r0_lsr_6: mov r14,r0,lsr #6
-_ma_ldrsb_r0_r14_shifted: .word 0x3e1fe00d @ (opcode("ldrsb r0,[r14,#+0]!")>>4) + (3<<28)
-_ma_add_r0_r0_r0_lsl_16: adds r0,r0,r0,lsl #16 @ change regs as appropriate
-_ma_vol_lookup_addr: .word _AAS_vol_lookup-1
-_ma_total_iterations: .word 0x0
-_ma_total_delta: .word 0x0
-_ma_bytes_available: .word 0x0
-_ma_no_skip: .word 0x0
-
-
- @ AAS_CODE_IN_IWRAM void AAS_MixAudio_NoChange( AAS_s8* mix_buffer, struct AAS_Channel chans[], int iterations );
-
-AAS_MixAudio_NoChange:
- stmfd sp!,{r4-r11,r14}
- sub sp,sp,#16
- stmfd sp!,{r0-r2}
-
- mov r9,#0
- str r9,_ma_no_skip
- ldr r10,_ma_bytes_available
- ldr r9,_ma_total_iterations
- cmp r9,r2
- movhi r9,r2
- mov r11,r9
- ldr r2,_ma_total_delta
-
- b ma_quickstart
-
-
- @ AAS_CODE_IN_IWRAM void AAS_MixAudio( AAS_s8* mix_buffer, struct AAS_Channel chans[], int iterations );
-
-AAS_MixAudio:
- stmfd sp!,{r4-r11,r14}
- sub sp,sp,#16
- stmfd sp!,{r0-r2}
-
- @ [sp] = _ma_mix_buffer
- @ [sp,#4] = _ma_chans
- @ [sp,#8] = _ma_to_go
- @ [sp,#12] = _ma_iterations_loop
- @ [sp,#16] = _ma_iterations_buffer
- @ [sp,#20] = _ma_iterations_scale_buffer
- @ [sp,#24] = _ma_loop_counter
-
- @ r0 = temp
- @ r1 = chans
- @ r2 = iterations in main loop
- @ r3 = _ma_add_r0_r0_r0_lsl_16
- @ r4 = temp
- @ r5 = temp
- @ r6 = outer loop counter/active channels found/total delta>>2
- @ r7 = temp
- @ r8 = temp
- @ r9 = temp
- @ r10 = temp
- @ r11 = temp
- @ r12 = dest address
- @ r14 = temp
-
-ma_do_setup:
-_AAS_MixAudio_mod1:
- adr r12,ma_buffer_start
- ldr r3,_ma_add_r0_r0_r0_lsl_16
-_AAS_MixAudio_mod5:
- mov r6,#0x70000000 @ was #0x30000000
- mov r2,#256
-
-
-ma_setup_loop:
- ldrb r14,[r1],#20 @ effective_volume
-
- cmp r14,#0
- beq ma_skip @ skip if effective_volume == 0
-
-
- @ Setup volume registers:
- @ r11 = increment for r4
- @ r14 = "mul r5,r0,r3"/"mov r5,r0,lsl #0"/"mlane r5,r0,r3,r5"/"add r5,r5,r0,lsl #0"
- @adr r10,_ma_vol_lookup-1
- ldr r10,_ma_vol_lookup_addr
- add r4,r10,#129 @ 129 = 1+_ma_mul_r5_r0_r3-_ma_vol_lookup
- ldrsb r10,[r10,r14]
- ands r5,r6,#0x0f000000 @ test if this is first active channel
- addne r4,r4,#16 @ 16 = _ma_mlane_r5_r0_r3_r5-_ma_mul_r5_r0_r3
- @adreq r4,_ma_mul_r5_r0_r3 @ use mul/mov if this is first non-zero chan
- @adrne r4,_ma_mlane_r5_r0_r3_r5 @ use mlane/add if this is first non-zero chan
- cmp r10,#0
- ldrlt r11,_ma_mov_r3_0 @ read "mov r3,#vol" if vol not power of 2
- addlt r11,r11,r14 @ set #vol in "mov r3,#vol" if vol not power of 2
- strlt r11,[r12],#4 @ write "mov r3,#vol" if vol not power of 2
- addge r4,r4,#8 @ increment if vol is power of 2
- ldmia r4,{r11,r14} @ read mul/mlane/mov/add and increment
- addge r14,r14,r10,lsl #7 @ set lsl #val for mov/add if vol power of 2
-
-
- @ r0,r4,r5,r7,r8,r9,r10 available
- @ r3 = _ma_add_r0_r0_0
- @ r5 = delta/increment for r14
- @ r8 = _ma_divide_table
- @ r11 = temp (was increment for r14)
- @ r12 = dest address
- @ r14 = "mul r5,r0,r3"/"mov r5,r0,lsl #0"/"mlane r5,r0,r3,r5"/"add r5,r5,r0,lsl #0"
-
- @ Setup delta registers, write delta increment instructions:
- @ r5 = delta/increment for r14
- adr r7,_ma_chan_cache @ could remove
- add r7,r7,r5,lsr #22 @ could remove
- ldr r10,_ma_ldr_pc_0 @ could pre-subtract _ma_chan_cache from _ma_ldr_pc_0 (would need to set at runtime)
- sub r10,r10,r7 @ could change to sub r10,r10,r5,lsr #22
- add r0,r10,r12
- eor r10,r10,#0x00100000 @ switch to str
- ldr r7,_ma_mov_r14_r0_lsr_6
- ldrh r5,[r1,#6-20] @ delta
- and r9,r5,#0xff
- ldr r4,_ma_add_r0_r0_0
- add r9,r4,r9
- stmia r12!,{r0,r7,r9}
- add r7,r4,#0xc00
- add r7,r7,r5,lsr #8
- tst r7,#0xff
- strne r7,[r12],#4
- add r6,r6,r5,lsr #2
- add r7,r10,r12
- str r7,[r12],#4
- add r5,r11,r5,lsl #20
-
-
- @ Final setup:
- @ r0 = delta_pos
- @ r8 = x
- @ r9 = x_history
- @ r10 = local outer loop counter/_ma_ldrsb_r0_r14_shifted
- mov r0,#0x200 @ delta_pos = 0.5 (was 0)
- ldr r10,_ma_ldrsb_r0_r14_shifted
- mov r8,#0
- mov r9,#0
-
-
- @ r0 = delta_pos
- @ r1 = chans
- @ r2 = iterations in main loop
- @ r3 = _ma_add_r0_r0_r0_lsl_16
- @ r4 = temp
- @ r5 = delta/increment for r14
- @ r6 = outer loop counter/total delta<<1
- @ r7 = temp
- @ r8 = x
- @ r9 = x_history
- @ r10 = local outer loop counter/_ma_ldrsb_r0_r14_shifted
- @ r11 = temp (was increment for r14)
- @ r12 = dest address
- @ r14 = "mul r5,r0,r3"/"mov r5,r0,lsl #0"/"mlane r5,r0,r3,r5"/"add r5,r5,r0,lsl #0"
-
- @ Write instructions:
- mov r7,r10,lsl #4
- str r7,[r12],#4
- b ma_setup_inner_loop_first
- .word 0,0,0 @ padding
-ma_setup_outer_loop:
-
- @ Write delta:
- add r0,r0,r5,lsr #20
- movs r4,r0,lsr #10
- beq ma_setup_inner_loop_skip1
- sub r0,r0,r4,lsl #10
- add r4,r4,r10,lsl #4
- mov r8,r7
- add r4,r4,r8,lsl #4
- str r4,[r12],#4
-ma_setup_inner_loop_skip1:
- add r9,r8,r9,lsl #8
-
-ma_setup_inner_loop_first:
-
- @ Write delta:
- add r0,r0,r5,lsr #20
- movs r4,r0,lsr #10
- beq ma_setup_inner_loop_skip2
- sub r0,r0,r4,lsl #10
- add r4,r4,r10,lsl #4
- subs r8,r8,#0x100
- movlt r8,#0x200
- add r4,r4,r8,lsl #4
- str r4,[r12],#4
-ma_setup_inner_loop_skip2:
- add r9,r8,r9,lsl #8
-
- @ Write delta:
- add r0,r0,r5,lsr #20
- movs r4,r0,lsr #10
- beq ma_setup_inner_loop_skip3
- sub r0,r0,r4,lsl #10
- add r4,r4,r10,lsl #4
- subs r8,r8,#0x100
- movlt r8,#0x200
- add r4,r4,r8,lsl #4
- str r4,[r12],#4
-ma_setup_inner_loop_skip3:
- add r9,r8,r9,lsl #8
-
- @ Write merge and mul/mla/mov/add:
- subs r11,r8,#0x100
- movlt r11,#0x200
- add r7,r14,r11,lsr #8
- add r4,r3,r11,lsl #4
- bic r11,r9,#0x00ff0000
- add r4,r4,r11,lsr #8
- stmia r12!,{r4,r7}
- add r14,r14,r5,lsl #12
-
- @ Write delta:
- add r0,r0,r5,lsr #20
- movs r4,r0,lsr #10
- beq ma_setup_inner_loop_skip4
- sub r0,r0,r4,lsl #10
- add r4,r4,r10,lsl #4
- subs r8,r8,#0x100
- movlt r8,#0x200
- add r4,r4,r8,lsl #4
- str r4,[r12],#4
-ma_setup_inner_loop_skip4:
- add r9,r8,r9,lsl #8
-
- @ Write merge: (skips if unnecessary)
- subs r7,r8,#0x100
- movlt r7,#0x200
- bic r4,r9,#0x00ff0000
- cmp r4,r11
- addne r11,r3,r4,lsr #8
- addne r11,r11,r7,lsl #4
- strne r11,[r12],#4
-
- @ Write mul/mla/mov/add:
- add r4,r14,r7,lsr #8
- str r4,[r12],#4
- add r14,r14,r5,lsl #12
-
- subs r10,r10,#0x10000000
- bge ma_setup_outer_loop
-
-
- @ Calculate iterations until end of sample:
- ldr r10,[r1,#8-20] @ pos
- ldr r0,[r1,#12-20] @ end
- sub r0,r0,r10
- mov r5,r5,lsr #19
- ldr r8,_ma_divide_table
- ldrh r5,[r8,r5]
- mul r0,r5,r0
- cmp r2,r0,lsr #10
- movhi r2,r0,lsr #10
-
- add r6,r6,#0x01000000 @ increment active channels found
-
-ma_skip:
- subs r6,r6,#0x10000000
- bge ma_setup_loop
-
- @ Write "b ma_again"
-_AAS_MixAudio_mod3:
- adr r0,ma_again
- sub r0,r0,r12
- mov r0,r0,asr #2
- sub r0,r0,#2
- @bic r0,r0,#0xff000000
- @add r0,r0,#0xea000000
- adr r4,ma_buffer_end
- bic r0,r0,#0x15000000 @ offset always negative, so this is equivalent to above
- str r0,[r12],#4
-
- sub r10,r4,r12
- and r4,r6,#0x0f000000
- sub r10,r10,r4,lsr #21 @ r10 -= 8*used_channels
- @str r10,_ma_iterations_scale_buffer
- @str r10,[sp,#20]
- str r10,_ma_bytes_available
-
- ldr r11,[sp,#8]
- subs r9,r2,r11
- str r9,_ma_total_iterations
- @cmp r2,r11
- mov r9,#1
- movhi r9,#0
- str r9,_ma_no_skip
- movhi r2,r11
-
- mov r11,r2
- mov r9,r2
- bic r2,r6,#0xff000000
- str r2,_ma_total_delta
-
- @ r2 = total_delta>>2
- @ r9 = r11 = total_iterations - i.e. iterations until loop - argh! need to recalculate each call!
- @ r10 = ((bytes_available-(8*channels_used))<<4)
-
- @ Could remove need to recalc total_iterations each call by not doing "total_iterations = min( iterations, total_iterations )" - do min below instead and sub "iterations" from "total_iterations" afterwards. Problem: Need to accurately calculate "total_iterations" even when it is large. (Although only need to cope with total_iterations being twice as large as it is now because only ever re-use config once.)
-
-ma_quickstart:
- @ldr r4,_ma_mix_buffer
- ldr r4,[sp]
-
-
- @ r1 = &_ma_mix_buffer
- @ r2 = total_delta>>2
- @ r3 = refill iterations<<3
- @ r4 = _ma_mix_buffer
- @ r5 = temp
- @ r6 = temp
- @ r7 = temp
- @ r8 = #0x04000000
- @ r9 = total iterations
- @ r10 = ((bytes_available-(8*channels_used))<<4)
- @ r11 = total iterations
- @ r12 = temp
- @ r14 = dest
-
- @ Calc iterations
- @ iterations = ((bytes_available-(8*channels_used))<<4)/(total_delta>>2)
- ldr r3,_ma_divide_table
-ma_begin: @ called from process loop
- mov r2,r2,lsl #1
- ldrh r3,[r3,r2]
- mul r3,r10,r3
- @str r3,_ma_iterations_buffer
- str r3,[sp,#16]
-ma_begin2:
- cmp r9,r3,lsr #12 @ was asr #3
- movgt r9,r3,lsr #12 @ was asr #3
-
- sub r3,r11,r9
- @str r3,_ma_iterations_loop
- str r3,[sp,#12]
-
- cmp r9,#0
- ble ma_end
-
-
- @ r0 = temp
- @ r1 = temp
- @ r2 = 0xc0
- @ r3 = chans
- @ r4 = _ma_mix_buffer
- @ r5 = DMA address
- @ r6 = 2
- @ r7 = temp
- @ r8 = &_ma_chan_cache
- @ r9 = iterations
- @ r10 = loop counter
- @ r11 = temp
- @ r12 = buffer address
- @ r14 = temp
-
- @ Fill buffer
- adr r8,_ma_chan_cache
- mov r5,#0x04000000
- add r5,r5,#0xd4
- mov r6,#2
-_AAS_MixAudio_mod6:
- mov r10,#8 @ was #4 - could perhaps set according to max # of channels / 2?
- mov r2,#0xc0
- adr r12,ma_buffer_end
- @ldr r3,_ma_chans
- ldr r3,[sp,#4]
-
-ma_fill_buffer_loop:
- ldrb r14,[r3],#20 @ effective_volume
- cmp r14,#0
- beq ma_fill_buffer_skip
- ldr r7,[r3,#8-20] @ pos
- bic r0,r7,#0x3
- ldrb r11,[r3,#3-20] @ pos_fraction
- and r1,r2,r7,lsl #6
- add r1,r1,r11,lsr #2
- ldrh r14,[r3,#6-20] @ delta
- mul r14,r9,r14
- add r11,r11,r14,lsl #2
- strb r11,[r3,#3-20] @ pos_fraction
- add r7,r7,r11,lsr #8
- str r7,[r3,#8-20] @ pos
- add r7,r6,r14,lsr #8 @ words to copy
- sub r12,r12,r7,lsl #2
- add r1,r1,r12,lsl #6
- str r1,[r8],#4 @ IWRAM pos
- add r14,r7,#0x84000000
- stmia r5,{r0,r12,r14}
-ma_fill_buffer_skip:
- subs r10,r10,#1
- bgt ma_fill_buffer_loop
-
- @ Setup registers for main loop
- @ldr r3,_ma_to_go
- ldr r3,[sp,#8]
- sub r3,r3,r9
- @str r3,_ma_to_go
- str r3,[sp,#8]
-
- @ Setup registers for main loop
- @mvn r14,#0xff00
- @add r14,r14,r9,lsl #24
- mvn r14,#0xff00
- bic r14,r14,#0x1000000
- add r14,r14,r9,lsl #25
-_AAS_MixAudio_mod2:
- b ma_start
-
-ma_end:
- @ldr r9,_ma_iterations_loop
- ldr r9,[sp,#12]
- movs r11,r9
- @ldrne r3,_ma_iterations_buffer
- ldrne r3,[sp,#16]
- bne ma_begin2
-
- @ldr r1,_ma_chans
- ldr r1,[sp,#4]
- @ should be after ble below?
-
- @ldr r9,_ma_to_go
- ldr r9,[sp,#8]
- cmp r9,#0
- ldrle r3,_ma_no_skip
- cmple r3,#0
- ble ma_chan_finished
-
- @ change so only branch if done all iterations and no samples have ended
-
- @ r0 = redo setup
- @ r1 = chans[] (was loop)
- @ r2 = total_delta>>2
- @ r3 = divide_table
- @ r4 = _ma_mix_buffer
- @ r5 = temp
- @ r6 = delta
- @ r7 = end
- @ r8 = unused
- @ r9 = loops to go
- @ r10 = _ma_specific_first
- @ r11 = &ma_chan0_start
- @ r12 = temp
- @ r13 = unused
- @ r14 = loop (was chans[])
-
- ldr r3,_ma_divide_table
-_AAS_MixAudio_mod7:
- mov r14,#8 @ was #4
- mov r2,#0
- mov r0,#0
-
-ma_check_chan_loop:
- ldrb r7,[r1],#20
- cmp r7,#0
- beq ma_chan_done
-
- ldrh r7,[r1,#6-20] @ delta
- ldr r12,[r1,#8-20] @ pos
- ldr r6,[r1,#12-20] @ end
- sub r5,r6,r7,lsr #6
- sub r5,r5,#1
- cmp r5,r12
- ble ma_chan_do_loop
-
-ma_chan_ok:
- add r2,r2,r7,lsr #2
- sub r5,r6,r12
- mov r7,r7,lsl #1
- ldrh r7,[r3,r7]
- mul r5,r7,r5
- cmp r9,r5,lsr #10
- movhi r9,r5,lsr #10
-
-ma_chan_done:
- subs r14,r14,#1
- bgt ma_check_chan_loop
-
- cmp r0,#0
- bne ma_chan_has_finished
-
- movs r11,r9
- @ldrgt r10,_ma_iterations_scale_buffer
- @ldrgt r10,[sp,#20]
- ldrgt r10,_ma_bytes_available
- bgt ma_begin
-
-ma_chan_finished:
- add sp,sp,#28
- ldmfd sp!, {r4-r11, r14}
- bx lr @ Thumb interwork friendly.
-
-ma_chan_has_finished:
- cmp r2,#0
- beq ma_chan_all_zeroes
- @ldr r2,_ma_to_go
- @ldr r2,[sp,#8]
-_AAS_MixAudio_mod8:
- sub r1,r1,#(20*8) @ was #(20*4)
- @str r4,_ma_mix_buffer
- str r4,[sp]
- b ma_do_setup
-
-ma_chan_all_zeroes: @ very rare - only happens if last active channel finished during this period
- @ldr r5,_ma_to_go
- ldr r5,[sp,#8] @ can be 0 sometimes
- movs r5,r5,lsl #2
- add r5,r5,#0x85000000
- adr r2,_ma_empty
- mov r6,#0x04000000
- add r6,r6,#0xd4
- stmneia r6,{r2,r4,r5} @ r5(_ma_to_go) can be 0 sometimes
- b ma_chan_finished
-
-
-
-ma_chan_do_loop:
- ldr r5,[r1,#16-20] @ loop_length
- cmp r5,#0
-
- mov r0,#1 @ redo setup !!moved!!
-
- @ Loop sample
- subne r12,r12,r5
- strne r12,[r1,#8-20] @ pos
- bne ma_chan_ok
-
- @ Set inactive
- strh r5,[r1,#0-20] @ effective_volume + active
- @mov r0,#1 @ redo setup !!was here!!
- b ma_chan_done
-
-
-_ma_chan_cache:
- .word 0,0,0,0,0,0,0,0 @ IWRAM pos, chan: 0,1,2,3,4,5,6,7
-
-_ma_divide_table: .word AAS_DivTable
-
-_ma_empty: .word 0
-.word 0,0 @ padding
-
-_AAS_MixAudio_mod4:
-
- @ r0-r2 : temp
- @ r3 : volume
- @ r4 : output address
- @ r5-r12 : output buffer
- @ r14 : sample address/loop/mask
-
-ma_again:
-
- @ r0 = temp
- @ r1 = temp2
- @ r2 = mask_0x80808080
- @@ r3 free
-
- @ Make sure algo is as efficient as possible
-
- @ Merge
- @ldr r14,_ma_loop_counter
- ldr r14,[sp,#24]
- and r5,r14,r5,lsr #8
- and r6,r14,r6,lsr #8
- and r7,r14,r7,lsr #8
- and r8,r14,r8,lsr #8
- and r9,r14,r9,lsr #8
- and r10,r14,r10,lsr #8
- and r11,r14,r11,lsr #8
- and r12,r14,r12,lsr #8
- add r5,r5,r6,lsl #8
- add r6,r7,r8,lsl #8
- add r7,r9,r10,lsl #8
- add r8,r11,r12,lsl #8
-
- @ Store
- stmia r4!,{r5-r8}
-
- @ Loop
- subs r14,r14,#0x2000000
- ble ma_end
-
-ma_start:
- @str r14,_ma_loop_counter
- str r14,[sp,#24]
-
-ma_buffer_start: @ 2048 bytes (1152 bytes would be equivalent to previous cache size)
-
- .word 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 @ 128 bytes
- .word 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 @ 128 bytes
- .word 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 @ 128 bytes
- .word 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 @ 128 bytes
-
- .word 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 @ 128 bytes
- .word 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 @ 128 bytes
- .word 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 @ 128 bytes
- .word 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 @ 128 bytes
-
- .word 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 @ 128 bytes
- .word 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 @ 128 bytes
- .word 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 @ 128 bytes
- .word 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 @ 128 bytes
-
- .word 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 @ 128 bytes
- .word 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 @ 128 bytes
- .word 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 @ 128 bytes
- .word 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 @ 128 bytes
-
-ma_buffer_end:
+++ /dev/null
-/* Copyright (c) 2003-2021 James Daniels */
-/* Distributed under the MIT License */
-/* license terms: see LICENSE file in root or http://opensource.org/licenses/MIT */
-
-#include "AAS_Shared.h"
-
-int AAS_SFX_GetNumChannels()
-{
- if(AAS_initialised) {
- if(AAS_volscale == 9)
- return 16 - AAS_MOD_GetNumChannels();
- else if(AAS_volscale == 8)
- return 8 - AAS_MOD_GetNumChannels();
- else
- return 4 - AAS_MOD_GetNumChannels();
- } else {
- return 0;
- }
-}
-
-struct AAS_Channel *AAS_SFX_GetChannel(int channel)
-{
- if(AAS_volscale == 9)
- return &AAS_channels[AAS_chan_rearrange[15 - channel]];
- else if(AAS_volscale == 8)
- return &AAS_channels[AAS_chan_rearrange[7 - channel]];
- else
- return &AAS_channels[AAS_chan_rearrange[3 - channel]];
-}
-
-int AAS_SFX_GetOutput(int channel)
-{
- if(AAS_volscale == 9)
- return AAS_chan_rearrange[15 - channel] >> 3;
- else if(AAS_volscale == 8)
- return AAS_chan_rearrange[7 - channel] >> 3;
- else
- return AAS_chan_rearrange[3 - channel] >> 3;
-}
-
-AAS_BOOL AAS_SFX_ChannelExists(int channel)
-{
- if((channel >= 0) && (channel < AAS_SFX_GetNumChannels())) {
- return AAS_TRUE;
- } else {
- return AAS_FALSE;
- }
-}
-
-int AAS_SFX_Play(int channel, int sample_volume, int sample_frequency, const AAS_s8 * sample_start,
- const AAS_s8 * sample_end, const AAS_s8 * sample_restart)
-{
- if(AAS_initialised) {
- if(AAS_SFX_ChannelExists(channel)) {
- if((sample_frequency >= 1) && (sample_frequency <= 65535)) {
- if((sample_volume >= 0) && (sample_volume <= 64)) {
- if(sample_start && (sample_end > sample_start) &&
- (sample_restart < sample_end)) {
- struct AAS_Channel *ch;
-
- ch = AAS_SFX_GetChannel(channel);
- ch->active = AAS_FALSE;
- ch->volume = (sample_volume << 8) >> AAS_volscale;
- ch->frequency = sample_frequency;
- ch->delta = AAS_Min(4095, ((sample_frequency * AAS_mix_scale) + 32768) >> 16);
- ch->pos = sample_start;
- ch->pos_fraction = 0;
- if(sample_restart)
- ch->loop_length = sample_end - sample_restart;
- else
- ch->loop_length = 0;
- ch->end = sample_end;
- ch->active = AAS_TRUE;
-
- AAS_changed[AAS_SFX_GetOutput(channel)] = AAS_TRUE;
-
- return AAS_OK;
- } else {
- return AAS_ERROR_INVALID_SAMPLE_ADDRESS;
- }
- } else {
- return AAS_ERROR_VOLUME_OUT_OF_RANGE;
- }
- } else {
- return AAS_ERROR_FREQUENCY_OUT_OF_RANGE;
- }
- } else {
- return AAS_ERROR_CHANNEL_NOT_AVAILABLE;
- }
- } else {
- return AAS_ERROR_CALL_SET_CONFIG_FIRST;
- }
-}
-
-AAS_BOOL AAS_SFX_IsActive(int channel)
-{
- if(AAS_SFX_ChannelExists(channel)) {
- return AAS_SFX_GetChannel(channel)->active;
- } else {
- return AAS_FALSE;
- }
-}
-
-int AAS_SFX_EndLoop(int channel)
-{
- if(AAS_initialised) {
- if(AAS_SFX_ChannelExists(channel)) {
- AAS_SFX_GetChannel(channel)->loop_length = 0;
-
- return AAS_OK;
- } else {
- return AAS_ERROR_CHANNEL_NOT_AVAILABLE;
- }
- } else {
- return AAS_ERROR_CALL_SET_CONFIG_FIRST;
- }
-}
-
-int AAS_SFX_SetFrequency(int channel, int sample_frequency)
-{
- if(AAS_initialised) {
- if(AAS_SFX_ChannelExists(channel)) {
- if((sample_frequency >= 1) && (sample_frequency <= 65535)) {
- struct AAS_Channel *ch;
-
- ch = AAS_SFX_GetChannel(channel);
- ch->frequency = sample_frequency;
- ch->delta = AAS_Min(4095, ((sample_frequency * AAS_mix_scale) + 32768) >> 16);
-
- AAS_changed[AAS_SFX_GetOutput(channel)] = AAS_TRUE;
-
- return AAS_OK;
- } else {
- return AAS_ERROR_FREQUENCY_OUT_OF_RANGE;
- }
- } else {
- return AAS_ERROR_CHANNEL_NOT_AVAILABLE;
- }
- } else {
- return AAS_ERROR_CALL_SET_CONFIG_FIRST;
- }
-}
-
-int AAS_SFX_SetVolume(int channel, int sample_volume)
-{
- if(AAS_initialised) {
- if(AAS_SFX_ChannelExists(channel)) {
- if((sample_volume >= 0) && (sample_volume <= 64)) {
- AAS_SFX_GetChannel(channel)->volume = (sample_volume << 8) >> AAS_volscale;
-
- AAS_changed[AAS_SFX_GetOutput(channel)] = AAS_TRUE;
-
- return AAS_OK;
- } else {
- return AAS_ERROR_VOLUME_OUT_OF_RANGE;
- }
- } else {
- return AAS_ERROR_CHANNEL_NOT_AVAILABLE;
- }
- } else {
- return AAS_ERROR_CALL_SET_CONFIG_FIRST;
- }
-}
-
-int AAS_SFX_Stop(int channel)
-{
- if(AAS_initialised) {
- if(AAS_SFX_ChannelExists(channel)) {
- AAS_SFX_GetChannel(channel)->active = AAS_FALSE;
-
- AAS_changed[AAS_SFX_GetOutput(channel)] = AAS_TRUE;
-
- return AAS_OK;
- } else {
- return AAS_ERROR_CHANNEL_NOT_AVAILABLE;
- }
- } else {
- return AAS_ERROR_CALL_SET_CONFIG_FIRST;
- }
-}
-
-int AAS_SFX_Resume(int channel)
-{
- if(AAS_initialised) {
- if(AAS_SFX_ChannelExists(channel)) {
- struct AAS_Channel *ch;
-
- ch = AAS_SFX_GetChannel(channel);
-
- if(!ch->active) {
- if(ch->loop_length) {
- ch->active = AAS_TRUE;
-
- AAS_changed[AAS_SFX_GetOutput(channel)] = AAS_TRUE;
-
- return AAS_OK;
- } else {
- if(ch->pos < ((ch->end - (ch->delta >> 6)) - 1)) {
- ch->active = AAS_TRUE;
-
- AAS_changed[AAS_SFX_GetOutput(channel)] = AAS_TRUE;
-
- return AAS_OK;
- } else {
- return AAS_ERROR_CHANNEL_UNRESUMEABLE;
- }
- }
- } else {
- return AAS_ERROR_CHANNEL_ACTIVE;
- }
- } else {
- return AAS_ERROR_CHANNEL_NOT_AVAILABLE;
- }
- } else {
- return AAS_ERROR_CALL_SET_CONFIG_FIRST;
- }
-}
+++ /dev/null
-/* Copyright (c) 2003-2021 James Daniels */
-/* Distributed under the MIT License */
-/* license terms: see LICENSE file in root or http://opensource.org/licenses/MIT */
-
-#include "AAS_Shared.h"
-
-const AAS_u16 AAS_DivTable[8192] = {
- 65535, 65535, 32768, 21845, 16384, 13107, 10922, 9362, 8192, 7281, 6553,
- 5957, 5461, 5041, 4681, 4369, 4096, 3855, 3640, 3449, 3276, 3120, 2978,
- 2849, 2730, 2621, 2520, 2427, 2340, 2259, 2184, 2114, 2048, 1985, 1927,
- 1872, 1820, 1771, 1724, 1680, 1638, 1598, 1560, 1524, 1489, 1456, 1424,
- 1394, 1365, 1337, 1310, 1285, 1260, 1236, 1213, 1191, 1170, 1149, 1129,
- 1110, 1092, 1074, 1057, 1040, 1024, 1008, 992, 978, 963, 949, 936, 923,
- 910, 897, 885, 873, 862, 851, 840, 829, 819, 809, 799, 789, 780, 771, 762,
- 753, 744, 736, 728, 720, 712, 704, 697, 689, 682, 675, 668, 661, 655, 648,
- 642, 636, 630, 624, 618, 612, 606, 601, 595, 590, 585, 579, 574, 569, 564,
- 560, 555, 550, 546, 541, 537, 532, 528, 524, 520, 516, 512, 508, 504, 500,
- 496, 492, 489, 485, 481, 478, 474, 471, 468, 464, 461, 458, 455, 451, 448,
- 445, 442, 439, 436, 434, 431, 428, 425, 422, 420, 417, 414, 412, 409, 407,
- 404, 402, 399, 397, 394, 392, 390, 387, 385, 383, 381, 378, 376, 374, 372,
- 370, 368, 366, 364, 362, 360, 358, 356, 354, 352, 350, 348, 346, 344, 343,
- 341, 339, 337, 336, 334, 332, 330, 329, 327, 326, 324, 322, 321, 319, 318,
- 316, 315, 313, 312, 310, 309, 307, 306, 304, 303, 302, 300, 299, 297, 296,
- 295, 293, 292, 291, 289, 288, 287, 286, 284, 283, 282, 281, 280, 278, 277,
- 276, 275, 274, 273, 271, 270, 269, 268, 267, 266, 265, 264, 263, 262, 261,
- 260, 259, 258, 257, 256, 255, 254, 253, 252, 251, 250, 249, 248, 247, 246,
- 245, 244, 243, 242, 241, 240, 240, 239, 238, 237, 236, 235, 234, 234, 233,
- 232, 231, 230, 229, 229, 228, 227, 226, 225, 225, 224, 223, 222, 222, 221,
- 220, 219, 219, 218, 217, 217, 216, 215, 214, 214, 213, 212, 212, 211, 210,
- 210, 209, 208, 208, 207, 206, 206, 205, 204, 204, 203, 202, 202, 201, 201,
- 200, 199, 199, 198, 197, 197, 196, 196, 195, 195, 194, 193, 193, 192, 192,
- 191, 191, 190, 189, 189, 188, 188, 187, 187, 186, 186, 185, 185, 184, 184,
- 183, 183, 182, 182, 181, 181, 180, 180, 179, 179, 178, 178, 177, 177, 176,
- 176, 175, 175, 174, 174, 173, 173, 172, 172, 172, 171, 171, 170, 170, 169,
- 169, 168, 168, 168, 167, 167, 166, 166, 165, 165, 165, 164, 164, 163, 163,
- 163, 162, 162, 161, 161, 161, 160, 160, 159, 159, 159, 158, 158, 157, 157,
- 157, 156, 156, 156, 155, 155, 154, 154, 154, 153, 153, 153, 152, 152, 152,
- 151, 151, 151, 150, 150, 149, 149, 149, 148, 148, 148, 147, 147, 147, 146,
- 146, 146, 145, 145, 145, 144, 144, 144, 144, 143, 143, 143, 142, 142, 142,
- 141, 141, 141, 140, 140, 140, 140, 139, 139, 139, 138, 138, 138, 137, 137,
- 137, 137, 136, 136, 136, 135, 135, 135, 135, 134, 134, 134, 134, 133, 133,
- 133, 132, 132, 132, 132, 131, 131, 131, 131, 130, 130, 130, 130, 129, 129,
- 129, 129, 128, 128, 128, 128, 127, 127, 127, 127, 126, 126, 126, 126, 125,
- 125, 125, 125, 124, 124, 124, 124, 123, 123, 123, 123, 122, 122, 122, 122,
- 122, 121, 121, 121, 121, 120, 120, 120, 120, 120, 119, 119, 119, 119, 118,
- 118, 118, 118, 118, 117, 117, 117, 117, 117, 116, 116, 116, 116, 115, 115,
- 115, 115, 115, 114, 114, 114, 114, 114, 113, 113, 113, 113, 113, 112, 112,
- 112, 112, 112, 112, 111, 111, 111, 111, 111, 110, 110, 110, 110, 110, 109,
- 109, 109, 109, 109, 109, 108, 108, 108, 108, 108, 107, 107, 107, 107, 107,
- 107, 106, 106, 106, 106, 106, 106, 105, 105, 105, 105, 105, 105, 104, 104,
- 104, 104, 104, 104, 103, 103, 103, 103, 103, 103, 102, 102, 102, 102, 102,
- 102, 101, 101, 101, 101, 101, 101, 100, 100, 100, 100, 100, 100, 100, 99,
- 99, 99, 99, 99, 99, 98, 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97,
- 96, 96, 96, 96, 96, 96, 96, 95, 95, 95, 95, 95, 95, 95, 94, 94, 94, 94, 94,
- 94, 94, 94, 93, 93, 93, 93, 93, 93, 93, 92, 92, 92, 92, 92, 92, 92, 92, 91,
- 91, 91, 91, 91, 91, 91, 91, 90, 90, 90, 90, 90, 90, 90, 90, 89, 89, 89, 89,
- 89, 89, 89, 89, 88, 88, 88, 88, 88, 88, 88, 88, 87, 87, 87, 87, 87, 87, 87,
- 87, 87, 86, 86, 86, 86, 86, 86, 86, 86, 86, 85, 85, 85, 85, 85, 85, 85, 85,
- 85, 84, 84, 84, 84, 84, 84, 84, 84, 84, 83, 83, 83, 83, 83, 83, 83, 83, 83,
- 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 81, 81, 81, 81, 81, 81, 81, 81, 81,
- 81, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 77, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 75, 75, 75,
- 75, 75, 75, 75, 75, 75, 75, 75, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
- 74, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 72, 72, 72, 72, 72, 72,
- 72, 72, 72, 72, 72, 72, 72, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
- 71, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 69, 69, 69, 69, 69,
- 69, 69, 69, 69, 69, 69, 69, 69, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 66,
- 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 65, 65, 65, 65, 65, 65,
- 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
- 63, 63, 63, 63, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
- 62, 62, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
- 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 59,
- 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 58, 58,
- 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 57, 57,
- 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 56,
- 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
- 55, 55, 55, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
- 54, 54, 54, 54, 54, 54, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
- 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 52, 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
- 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43,
- 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
- 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 42, 42, 42, 42, 42, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41,
- 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
- 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 39, 39, 39,
- 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
- 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 38, 38,
- 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
- 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
- 38, 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
- 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
- 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
- 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
- 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
- 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8
-};
-
-const AAS_u16 AAS_MOD_period_conv_table[2048] = {
- 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
- 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
- 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
- 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
- 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535,
- 65535, 65535, 65535, 65535, 65535, 64488, 63337, 62226, 61153, 60116,
- 59114, 58145, 57207, 56299, 55420, 54567, 53740, 52938, 52160, 51404,
- 50669, 49956, 49262, 48587, 47931, 47291, 46669, 46063, 45473, 44897,
- 44336, 43788, 43254, 42733, 42224, 41728, 41242, 40768, 40305, 39852,
- 39409, 38976, 38553, 38138, 37732, 37335, 36946, 36565, 36192, 35827,
- 35468, 35117, 34773, 34435, 34104, 33779, 33461, 33148, 32841, 32540,
- 32244, 31954, 31668, 31388, 31113, 30842, 30576, 30315, 30058, 29805,
- 29557, 29313, 29072, 28836, 28603, 28375, 28149, 27928, 27710, 27495,
- 27283, 27075, 26870, 26668, 26469, 26273, 26080, 25889, 25702, 25517,
- 25334, 25155, 24978, 24803, 24631, 24461, 24293, 24128, 23965, 23804,
- 23645, 23489, 23334, 23182, 23031, 22883, 22736, 22591, 22448, 22307,
- 22168, 22030, 21894, 21760, 21627, 21496, 21366, 21238, 21112, 20987,
- 20864, 20742, 20621, 20502, 20384, 20267, 20152, 20038, 19926, 19815,
- 19704, 19596, 19488, 19381, 19276, 19172, 19069, 18967, 18866, 18766,
- 18667, 18570, 18473, 18377, 18282, 18189, 18096, 18004, 17913, 17823,
- 17734, 17646, 17558, 17472, 17386, 17301, 17217, 17134, 17052, 16970,
- 16889, 16809, 16730, 16652, 16574, 16497, 16420, 16345, 16270, 16195,
- 16122, 16049, 15977, 15905, 15834, 15763, 15694, 15625, 15556, 15488,
- 15421, 15354, 15288, 15222, 15157, 15093, 15029, 14965, 14902, 14840,
- 14778, 14717, 14656, 14596, 14536, 14477, 14418, 14359, 14301, 14244,
- 14187, 14131, 14074, 14019, 13964, 13909, 13855, 13801, 13747, 13694,
- 13641, 13589, 13537, 13486, 13435, 13384, 13334, 13284, 13234, 13185,
- 13136, 13088, 13040, 12992, 12944, 12897, 12851, 12804, 12758, 12712,
- 12667, 12622, 12577, 12533, 12489, 12445, 12401, 12358, 12315, 12272,
- 12230, 12188, 12146, 12105, 12064, 12023, 11982, 11942, 11902, 11862,
- 11822, 11783, 11744, 11705, 11667, 11629, 11591, 11553, 11515, 11478,
- 11441, 11404, 11368, 11331, 11295, 11259, 11224, 11188, 11153, 11118,
- 11084, 11049, 11015, 10981, 10947, 10913, 10880, 10846, 10813, 10780,
- 10748, 10715, 10683, 10651, 10619, 10587, 10556, 10524, 10493, 10462,
- 10432, 10401, 10371, 10340, 10310, 10280, 10251, 10221, 10192, 10163,
- 10133, 10105, 10076, 10047, 10019, 9991, 9963, 9935, 9907, 9879, 9852,
- 9825, 9798, 9771, 9744, 9717, 9690, 9664, 9638, 9612, 9586, 9560, 9534,
- 9509, 9483, 9458, 9433, 9408, 9383, 9358, 9333, 9309, 9285, 9260, 9236,
- 9212, 9188, 9165, 9141, 9117, 9094, 9071, 9048, 9025, 9002, 8979, 8956,
- 8934, 8911, 8889, 8867, 8845, 8823, 8801, 8779, 8757, 8736, 8714, 8693,
- 8672, 8650, 8629, 8608, 8588, 8567, 8546, 8526, 8505, 8485, 8465, 8444,
- 8424, 8404, 8385, 8365, 8345, 8326, 8306, 8287, 8267, 8248, 8229, 8210,
- 8191, 8172, 8153, 8135, 8116, 8097, 8079, 8061, 8042, 8024, 8006, 7988,
- 7970, 7952, 7934, 7917, 7899, 7881, 7864, 7847, 7829, 7812, 7795, 7778,
- 7761, 7744, 7727, 7710, 7693, 7677, 7660, 7644, 7627, 7611, 7595, 7578,
- 7562, 7546, 7530, 7514, 7498, 7482, 7467, 7451, 7435, 7420, 7404, 7389,
- 7374, 7358, 7343, 7328, 7313, 7298, 7283, 7268, 7253, 7238, 7223, 7209,
- 7194, 7179, 7165, 7150, 7136, 7122, 7108, 7093, 7079, 7065, 7051, 7037,
- 7023, 7009, 6995, 6982, 6968, 6954, 6941, 6927, 6914, 6900, 6887, 6873,
- 6860, 6847, 6834, 6820, 6807, 6794, 6781, 6768, 6755, 6743, 6730, 6717,
- 6704, 6692, 6679, 6667, 6654, 6642, 6629, 6617, 6605, 6592, 6580, 6568,
- 6556, 6544, 6532, 6520, 6508, 6496, 6484, 6472, 6460, 6448, 6437, 6425,
- 6413, 6402, 6390, 6379, 6367, 6356, 6345, 6333, 6322, 6311, 6299, 6288,
- 6277, 6266, 6255, 6244, 6233, 6222, 6211, 6200, 6190, 6179, 6168, 6157,
- 6147, 6136, 6125, 6115, 6104, 6094, 6083, 6073, 6063, 6052, 6042, 6032,
- 6021, 6011, 6001, 5991, 5981, 5971, 5961, 5951, 5941, 5931, 5921, 5911,
- 5901, 5891, 5882, 5872, 5862, 5852, 5843, 5833, 5824, 5814, 5805, 5795,
- 5786, 5776, 5767, 5757, 5748, 5739, 5730, 5720, 5711, 5702, 5693, 5684,
- 5675, 5665, 5656, 5647, 5638, 5629, 5621, 5612, 5603, 5594, 5585, 5576,
- 5568, 5559, 5550, 5542, 5533, 5524, 5516, 5507, 5499, 5490, 5482, 5473,
- 5465, 5456, 5448, 5440, 5431, 5423, 5415, 5406, 5398, 5390, 5382, 5374,
- 5365, 5357, 5349, 5341, 5333, 5325, 5317, 5309, 5301, 5293, 5285, 5278,
- 5270, 5262, 5254, 5246, 5239, 5231, 5223, 5216, 5208, 5200, 5193, 5185,
- 5177, 5170, 5162, 5155, 5147, 5140, 5132, 5125, 5118, 5110, 5103, 5096,
- 5088, 5081, 5074, 5066, 5059, 5052, 5045, 5038, 5031, 5023, 5016, 5009,
- 5002, 4995, 4988, 4981, 4974, 4967, 4960, 4953, 4946, 4939, 4933, 4926,
- 4919, 4912, 4905, 4899, 4892, 4885, 4878, 4872, 4865, 4858, 4852, 4845,
- 4838, 4832, 4825, 4819, 4812, 4806, 4799, 4793, 4786, 4780, 4773, 4767,
- 4760, 4754, 4748, 4741, 4735, 4729, 4722, 4716, 4710, 4704, 4697, 4691,
- 4685, 4679, 4673, 4666, 4660, 4654, 4648, 4642, 4636, 4630, 4624, 4618,
- 4612, 4606, 4600, 4594, 4588, 4582, 4576, 4570, 4564, 4558, 4553, 4547,
- 4541, 4535, 4529, 4524, 4518, 4512, 4506, 4501, 4495, 4489, 4484, 4478,
- 4472, 4467, 4461, 4455, 4450, 4444, 4439, 4433, 4428, 4422, 4417, 4411,
- 4406, 4400, 4395, 4389, 4384, 4378, 4373, 4368, 4362, 4357, 4352, 4346,
- 4341, 4336, 4330, 4325, 4320, 4314, 4309, 4304, 4299, 4294, 4288, 4283,
- 4278, 4273, 4268, 4263, 4257, 4252, 4247, 4242, 4237, 4232, 4227, 4222,
- 4217, 4212, 4207, 4202, 4197, 4192, 4187, 4182, 4177, 4172, 4167, 4163,
- 4158, 4153, 4148, 4143, 4138, 4133, 4129, 4124, 4119, 4114, 4109, 4105,
- 4100, 4095, 4090, 4086, 4081, 4076, 4072, 4067, 4062, 4058, 4053, 4048,
- 4044, 4039, 4035, 4030, 4025, 4021, 4016, 4012, 4007, 4003, 3998, 3994,
- 3989, 3985, 3980, 3976, 3971, 3967, 3963, 3958, 3954, 3949, 3945, 3940,
- 3936, 3932, 3927, 3923, 3919, 3914, 3910, 3906, 3901, 3897, 3893, 3889,
- 3884, 3880, 3876, 3872, 3867, 3863, 3859, 3855, 3851, 3846, 3842, 3838,
- 3834, 3830, 3826, 3822, 3817, 3813, 3809, 3805, 3801, 3797, 3793, 3789,
- 3785, 3781, 3777, 3773, 3769, 3765, 3761, 3757, 3753, 3749, 3745, 3741,
- 3737, 3733, 3729, 3725, 3721, 3717, 3714, 3710, 3706, 3702, 3698, 3694,
- 3690, 3687, 3683, 3679, 3675, 3671, 3667, 3664, 3660, 3656, 3652, 3649,
- 3645, 3641, 3637, 3634, 3630, 3626, 3622, 3619, 3615, 3611, 3608, 3604,
- 3600, 3597, 3593, 3589, 3586, 3582, 3579, 3575, 3571, 3568, 3564, 3561,
- 3557, 3554, 3550, 3546, 3543, 3539, 3536, 3532, 3529, 3525, 3522, 3518,
- 3515, 3511, 3508, 3504, 3501, 3497, 3494, 3491, 3487, 3484, 3480, 3477,
- 3473, 3470, 3467, 3463, 3460, 3457, 3453, 3450, 3446, 3443, 3440, 3436,
- 3433, 3430, 3426, 3423, 3420, 3417, 3413, 3410, 3407, 3403, 3400, 3397,
- 3394, 3390, 3387, 3384, 3381, 3377, 3374, 3371, 3368, 3365, 3361, 3358,
- 3355, 3352, 3349, 3346, 3342, 3339, 3336, 3333, 3330, 3327, 3324, 3321,
- 3317, 3314, 3311, 3308, 3305, 3302, 3299, 3296, 3293, 3290, 3287, 3284,
- 3281, 3278, 3275, 3272, 3269, 3266, 3263, 3260, 3257, 3254, 3251, 3248,
- 3245, 3242, 3239, 3236, 3233, 3230, 3227, 3224, 3221, 3218, 3215, 3212,
- 3209, 3206, 3204, 3201, 3198, 3195, 3192, 3189, 3186, 3183, 3181, 3178,
- 3175, 3172, 3169, 3166, 3164, 3161, 3158, 3155, 3152, 3149, 3147, 3144,
- 3141, 3138, 3136, 3133, 3130, 3127, 3125, 3122, 3119, 3116, 3114, 3111,
- 3108, 3105, 3103, 3100, 3097, 3095, 3092, 3089, 3086, 3084, 3081, 3078,
- 3076, 3073, 3070, 3068, 3065, 3062, 3060, 3057, 3055, 3052, 3049, 3047,
- 3044, 3041, 3039, 3036, 3034, 3031, 3028, 3026, 3023, 3021, 3018, 3016,
- 3013, 3010, 3008, 3005, 3003, 3000, 2998, 2995, 2993, 2990, 2988, 2985,
- 2983, 2980, 2978, 2975, 2973, 2970, 2968, 2965, 2963, 2960, 2958, 2955,
- 2953, 2950, 2948, 2945, 2943, 2941, 2938, 2936, 2933, 2931, 2928, 2926,
- 2924, 2921, 2919, 2916, 2914, 2912, 2909, 2907, 2904, 2902, 2900, 2897,
- 2895, 2893, 2890, 2888, 2886, 2883, 2881, 2878, 2876, 2874, 2871, 2869,
- 2867, 2865, 2862, 2860, 2858, 2855, 2853, 2851, 2848, 2846, 2844, 2842,
- 2839, 2837, 2835, 2832, 2830, 2828, 2826, 2823, 2821, 2819, 2817, 2814,
- 2812, 2810, 2808, 2806, 2803, 2801, 2799, 2797, 2795, 2792, 2790, 2788,
- 2786, 2784, 2781, 2779, 2777, 2775, 2773, 2771, 2768, 2766, 2764, 2762,
- 2760, 2758, 2755, 2753, 2751, 2749, 2747, 2745, 2743, 2741, 2738, 2736,
- 2734, 2732, 2730, 2728, 2726, 2724, 2722, 2720, 2717, 2715, 2713, 2711,
- 2709, 2707, 2705, 2703, 2701, 2699, 2697, 2695, 2693, 2691, 2689, 2687,
- 2685, 2682, 2680, 2678, 2676, 2674, 2672, 2670, 2668, 2666, 2664, 2662,
- 2660, 2658, 2656, 2654, 2652, 2650, 2648, 2646, 2644, 2642, 2641, 2639,
- 2637, 2635, 2633, 2631, 2629, 2627, 2625, 2623, 2621, 2619, 2617, 2615,
- 2613, 2611, 2609, 2608, 2606, 2604, 2602, 2600, 2598, 2596, 2594, 2592,
- 2590, 2588, 2587, 2585, 2583, 2581, 2579, 2577, 2575, 2573, 2572, 2570,
- 2568, 2566, 2564, 2562, 2560, 2559, 2557, 2555, 2553, 2551, 2549, 2548,
- 2546, 2544, 2542, 2540, 2538, 2537, 2535, 2533, 2531, 2529, 2528, 2526,
- 2524, 2522, 2520, 2519, 2517, 2515, 2513, 2511, 2510, 2508, 2506, 2504,
- 2503, 2501, 2499, 2497, 2496, 2494, 2492, 2490, 2489, 2487, 2485, 2483,
- 2482, 2480, 2478, 2476, 2475, 2473, 2471, 2469, 2468, 2466, 2464, 2463,
- 2461, 2459, 2458, 2456, 2454, 2452, 2451, 2449, 2447, 2446, 2444, 2442,
- 2441, 2439, 2437, 2436, 2434, 2432, 2431, 2429, 2427, 2426, 2424, 2422,
- 2421, 2419, 2417, 2416, 2414, 2412, 2411, 2409, 2407, 2406, 2404, 2403,
- 2401, 2399, 2398, 2396, 2394, 2393, 2391, 2390, 2388, 2386, 2385, 2383,
- 2382, 2380, 2378, 2377, 2375, 2374, 2372, 2370, 2369, 2367, 2366, 2364,
- 2363, 2361, 2359, 2358, 2356, 2355, 2353, 2352, 2350, 2348, 2347, 2345,
- 2344, 2342, 2341, 2339, 2338, 2336, 2335, 2333, 2331, 2330, 2328, 2327,
- 2325, 2324, 2322, 2321, 2319, 2318, 2316, 2315, 2313, 2312, 2310, 2309,
- 2307, 2306, 2304, 2303, 2301, 2300, 2298, 2297, 2295, 2294, 2292, 2291,
- 2289, 2288, 2286, 2285, 2283, 2282, 2280, 2279, 2278, 2276, 2275, 2273,
- 2272, 2270, 2269, 2267, 2266, 2264, 2263, 2262, 2260, 2259, 2257, 2256,
- 2254, 2253, 2251, 2250, 2249, 2247, 2246, 2244, 2243, 2242, 2240, 2239,
- 2237, 2236, 2234, 2233, 2232, 2230, 2229, 2227, 2226, 2225, 2223, 2222,
- 2220, 2219, 2218, 2216, 2215, 2214, 2212, 2211, 2209, 2208, 2207, 2205,
- 2204, 2203, 2201, 2200, 2198, 2197, 2196, 2194, 2193, 2192, 2190, 2189,
- 2188, 2186, 2185, 2184, 2182, 2181, 2180, 2178, 2177, 2176, 2174, 2173,
- 2172, 2170, 2169, 2168, 2166, 2165, 2164, 2162, 2161, 2160, 2158, 2157,
- 2156, 2154, 2153, 2152, 2150, 2149, 2148, 2147, 2145, 2144, 2143, 2141,
- 2140, 2139, 2137, 2136, 2135, 2134, 2132, 2131, 2130, 2128, 2127, 2126,
- 2125, 2123, 2122, 2121, 2120, 2118, 2117, 2116, 2115, 2113, 2112, 2111,
- 2109, 2108, 2107, 2106, 2104, 2103, 2102, 2101, 2099, 2098, 2097, 2096,
- 2095, 2093, 2092, 2091, 2090, 2088, 2087, 2086, 2085, 2083, 2082, 2081,
- 2080, 2079, 2077, 2076, 2075, 2074, 2072, 2071, 2070, 2069, 2068, 2066,
- 2065, 2064, 2063, 2062, 2060, 2059, 2058, 2057, 2056, 2054, 2053, 2052,
- 2051, 2050, 2049, 2047, 2046, 2045, 2044, 2043, 2041, 2040, 2039, 2038,
- 2037, 2036, 2034, 2033, 2032, 2031, 2030, 2029, 2027, 2026, 2025, 2024,
- 2023, 2022, 2021, 2019, 2018, 2017, 2016, 2015, 2014, 2012, 2011, 2010,
- 2009, 2008, 2007, 2006, 2005, 2003, 2002, 2001, 2000, 1999, 1998, 1997,
- 1996, 1994, 1993, 1992, 1991, 1990, 1989, 1988, 1987, 1985, 1984, 1983,
- 1982, 1981, 1980, 1979, 1978, 1977, 1975, 1974, 1973, 1972, 1971, 1970,
- 1969, 1968, 1967, 1966, 1965, 1963, 1962, 1961, 1960, 1959, 1958, 1957,
- 1956, 1955, 1954, 1953, 1952, 1950, 1949, 1948, 1947, 1946, 1945, 1944,
- 1943, 1942, 1941, 1940, 1939, 1938, 1937, 1936, 1935, 1933, 1932, 1931,
- 1930, 1929, 1928, 1927, 1926, 1925, 1924, 1923, 1922, 1921, 1920, 1919,
- 1918, 1917, 1916, 1915, 1914, 1913, 1912, 1911, 1910, 1908, 1907, 1906,
- 1905, 1904, 1903, 1902, 1901, 1900, 1899, 1898, 1897, 1896, 1895, 1894,
- 1893, 1892, 1891, 1890, 1889, 1888, 1887, 1886, 1885, 1884, 1883, 1882,
- 1881, 1880, 1879, 1878, 1877, 1876, 1875, 1874, 1873, 1872, 1871, 1870,
- 1869, 1868, 1867, 1866, 1865, 1864, 1863, 1862, 1861, 1860, 1859, 1858,
- 1857, 1857, 1856, 1855, 1854, 1853, 1852, 1851, 1850, 1849, 1848, 1847,
- 1846, 1845, 1844, 1843, 1842, 1841, 1840, 1839, 1838, 1837, 1836, 1835,
- 1834, 1833, 1833, 1832, 1831, 1830, 1829, 1828, 1827, 1826, 1825, 1824,
- 1823, 1822, 1821, 1820, 1819, 1818, 1817, 1817, 1816, 1815, 1814, 1813,
- 1812, 1811, 1810, 1809, 1808, 1807, 1806, 1805, 1805, 1804, 1803, 1802,
- 1801, 1800, 1799, 1798, 1797, 1796, 1795, 1794, 1794, 1793, 1792, 1791,
- 1790, 1789, 1788, 1787, 1786, 1785, 1785, 1784, 1783, 1782, 1781, 1780,
- 1779, 1778, 1777, 1777, 1776, 1775, 1774, 1773, 1772, 1771, 1770, 1769,
- 1769, 1768, 1767, 1766, 1765, 1764, 1763, 1762, 1761, 1761, 1760, 1759,
- 1758, 1757, 1756, 1755, 1755, 1754, 1753, 1752, 1751, 1750, 1749, 1748,
- 1748, 1747, 1746, 1745, 1744, 1743, 1742, 1742, 1741, 1740, 1739, 1738,
- 1737, 1736, 1736, 1735, 1734, 1733, 1732
-};
-
-const AAS_u16 AAS_period_table[16][60] =
-{
- {
- 1712, 1616, 1524, 1440, 1356, 1280, 1208, 1140, 1076, 1016, 960 , 906,
- 856 , 808 , 762 , 720 , 678 , 640 , 604 , 570 , 538 , 508 , 480 , 453,
- 428 , 404 , 381 , 360 , 339 , 320 , 302 , 285 , 269 , 254 , 240 , 226,
- 214 , 202 , 190 , 180 , 170 , 160 , 151 , 143 , 135 , 127 , 120 , 113,
- 107 , 101 , 95 , 90 , 85 , 80 , 75 , 71 , 67 , 63 , 60 , 56
- },{
- 1700, 1604, 1514, 1430, 1348, 1274, 1202, 1134, 1070, 1010, 954 , 900,
- 850 , 802 , 757 , 715 , 674 , 637 , 601 , 567 , 535 , 505 , 477 , 450,
- 425 , 401 , 379 , 357 , 337 , 318 , 300 , 284 , 268 , 253 , 239 , 225,
- 213 , 201 , 189 , 179 , 169 , 159 , 150 , 142 , 134 , 126 , 119 , 113,
- 106 , 100 , 94 , 89 , 84 , 79 , 75 , 71 , 67 , 63 , 59 , 56
- },{
- 1688, 1592, 1504, 1418, 1340, 1264, 1194, 1126, 1064, 1004, 948 , 894,
- 844 , 796 , 752 , 709 , 670 , 632 , 597 , 563 , 532 , 502 , 474 , 447,
- 422 , 398 , 376 , 355 , 335 , 316 , 298 , 282 , 266 , 251 , 237 , 224,
- 211 , 199 , 188 , 177 , 167 , 158 , 149 , 141 , 133 , 125 , 118 , 112,
- 105 , 99 , 94 , 88 , 83 , 79 , 74 , 70 , 66 , 62 , 59 , 56
- },{
- 1676, 1582, 1492, 1408, 1330, 1256, 1184, 1118, 1056, 996 , 940 , 888,
- 838 , 791 , 746 , 704 , 665 , 628 , 592 , 559 , 528 , 498 , 470 , 444,
- 419 , 395 , 373 , 352 , 332 , 314 , 296 , 280 , 264 , 249 , 235 , 222,
- 209 , 198 , 187 , 176 , 166 , 157 , 148 , 140 , 132 , 125 , 118 , 111,
- 104 , 99 , 93 , 88 , 83 , 78 , 74 , 70 , 66 , 62 , 59 , 55
- },{
- 1664, 1570, 1482, 1398, 1320, 1246, 1176, 1110, 1048, 990 , 934 , 882,
- 832 , 785 , 741 , 699 , 660 , 623 , 588 , 555 , 524 , 495 , 467 , 441,
- 416 , 392 , 370 , 350 , 330 , 312 , 294 , 278 , 262 , 247 , 233 , 220,
- 208 , 196 , 185 , 175 , 165 , 156 , 147 , 139 , 131 , 124 , 117 , 110,
- 104 , 98 , 92 , 87 , 82 , 78 , 73 , 69 , 65 , 62 , 58 , 55
- },{
- 1652, 1558, 1472, 1388, 1310, 1238, 1168, 1102, 1040, 982 , 926 , 874,
- 826 , 779 , 736 , 694 , 655 , 619 , 584 , 551 , 520 , 491 , 463 , 437,
- 413 , 390 , 368 , 347 , 328 , 309 , 292 , 276 , 260 , 245 , 232 , 219,
- 206 , 195 , 184 , 174 , 164 , 155 , 146 , 138 , 130 , 123 , 116 , 109,
- 103 , 97 , 92 , 87 , 82 , 77 , 73 , 69 , 65 , 61 , 58 , 54
- },{
- 1640, 1548, 1460, 1378, 1302, 1228, 1160, 1094, 1032, 974 , 920 , 868,
- 820 , 774 , 730 , 689 , 651 , 614 , 580 , 547 , 516 , 487 , 460 , 434,
- 410 , 387 , 365 , 345 , 325 , 307 , 290 , 274 , 258 , 244 , 230 , 217,
- 205 , 193 , 183 , 172 , 163 , 154 , 145 , 137 , 129 , 122 , 115 , 109,
- 102 , 96 , 91 , 86 , 81 , 77 , 72 , 68 , 64 , 61 , 57 , 54
- },{
- 1628, 1536, 1450, 1368, 1292, 1220, 1150, 1086, 1026, 968 , 914 , 862,
- 814 , 768 , 725 , 684 , 646 , 610 , 575 , 543 , 513 , 484 , 457 , 431,
- 407 , 384 , 363 , 342 , 323 , 305 , 288 , 272 , 256 , 242 , 228 , 216,
- 204 , 192 , 181 , 171 , 161 , 152 , 144 , 136 , 128 , 121 , 114 , 108,
- 102 , 96 , 90 , 85 , 80 , 76 , 72 , 68 , 64 , 60 , 57 , 54
- },{
- 1814, 1712, 1616, 1524, 1440, 1356, 1280, 1208, 1140, 1076, 1016, 960,
- 907 , 856 , 808 , 762 , 720 , 678 , 640 , 604 , 570 , 538 , 508 , 480,
- 453 , 428 , 404 , 381 , 360 , 339 , 320 , 302 , 285 , 269 , 254 , 240,
- 226 , 214 , 202 , 190 , 180 , 170 , 160 , 151 , 143 , 135 , 127 , 120,
- 113 , 107 , 101 , 95 , 90 , 85 , 80 , 75 , 71 , 67 , 63 , 60
- },{
- 1800, 1700, 1604, 1514, 1430, 1350, 1272, 1202, 1134, 1070, 1010, 954,
- 900 , 850 , 802 , 757 , 715 , 675 , 636 , 601 , 567 , 535 , 505 , 477,
- 450 , 425 , 401 , 379 , 357 , 337 , 318 , 300 , 284 , 268 , 253 , 238,
- 225 , 212 , 200 , 189 , 179 , 169 , 159 , 150 , 142 , 134 , 126 , 119,
- 112 , 106 , 100 , 94 , 89 , 84 , 79 , 75 , 71 , 67 , 63 , 59
- },{
- 1788, 1688, 1592, 1504, 1418, 1340, 1264, 1194, 1126, 1064, 1004, 948,
- 894 , 844 , 796 , 752 , 709 , 670 , 632 , 597 , 563 , 532 , 502 , 474,
- 447 , 422 , 398 , 376 , 355 , 335 , 316 , 298 , 282 , 266 , 251 , 237,
- 223 , 211 , 199 , 188 , 177 , 167 , 158 , 149 , 141 , 133 , 125 , 118,
- 111 , 105 , 99 , 94 , 88 , 83 , 79 , 74 , 70 , 66 , 62 , 59
- },{
- 1774, 1676, 1582, 1492, 1408, 1330, 1256, 1184, 1118, 1056, 996 , 940,
- 887 , 838 , 791 , 746 , 704 , 665 , 628 , 592 , 559 , 528 , 498 , 470,
- 444 , 419 , 395 , 373 , 352 , 332 , 314 , 296 , 280 , 264 , 249 , 235,
- 222 , 209 , 198 , 187 , 176 , 166 , 157 , 148 , 140 , 132 , 125 , 118,
- 111 , 104 , 99 , 93 , 88 , 83 , 78 , 74 , 70 , 66 , 62 , 59
- },{
- 1762, 1664, 1570, 1482, 1398, 1320, 1246, 1176, 1110, 1048, 988 , 934,
- 881 , 832 , 785 , 741 , 699 , 660 , 623 , 588 , 555 , 524 , 494 , 467,
- 441 , 416 , 392 , 370 , 350 , 330 , 312 , 294 , 278 , 262 , 247 , 233,
- 220 , 208 , 196 , 185 , 175 , 165 , 156 , 147 , 139 , 131 , 123 , 117,
- 110 , 104 , 98 , 92 , 87 , 82 , 78 , 73 , 69 , 65 , 61 , 58
- },{
- 1750, 1652, 1558, 1472, 1388, 1310, 1238, 1168, 1102, 1040, 982 , 926,
- 875 , 826 , 779 , 736 , 694 , 655 , 619 , 584 , 551 , 520 , 491 , 463,
- 437 , 413 , 390 , 368 , 347 , 328 , 309 , 292 , 276 , 260 , 245 , 232,
- 219 , 206 , 195 , 184 , 174 , 164 , 155 , 146 , 138 , 130 , 123 , 116,
- 109 , 103 , 97 , 92 , 87 , 82 , 77 , 73 , 69 , 65 , 61 , 58
- },{
- 1736, 1640, 1548, 1460, 1378, 1302, 1228, 1160, 1094, 1032, 974 , 920,
- 868 , 820 , 774 , 730 , 689 , 651 , 614 , 580 , 547 , 516 , 487 , 460,
- 434 , 410 , 387 , 365 , 345 , 325 , 307 , 290 , 274 , 258 , 244 , 230,
- 217 , 205 , 193 , 183 , 172 , 163 , 154 , 145 , 137 , 129 , 122 , 115,
- 108 , 102 , 96 , 91 , 86 , 81 , 77 , 72 , 68 , 64 , 61 , 57
- },{
- 1724, 1628, 1536, 1450, 1368, 1292, 1220, 1150, 1086, 1026, 968 , 914,
- 862 , 814 , 768 , 725 , 684 , 646 , 610 , 575 , 543 , 513 , 484 , 457,
- 431 , 407 , 384 , 363 , 342 , 323 , 305 , 288 , 272 , 256 , 242 , 228,
- 216 , 203 , 192 , 181 , 171 , 161 , 152 , 144 , 136 , 128 , 121 , 114,
- 108 , 101 , 96 , 90 , 85 , 80 , 76 , 72 , 68 , 64 , 60 , 57
- }
-};
-
-const AAS_u16 AAS_tick_rate[41] = {
- 65535, 44565, 55051, 58546, 60294, 61342, 62041, 62541, 62915, 63206,
- 63439, 63630, 63789, 63923, 64039, 64138, 64226, 64303, 64371, 64433,
- 64488, 64538, 64583, 64625, 64663, 64698, 64730, 64760, 64788, 64813,
- 64837, 64860, 64881, 64901, 64920, 64937, 64954, 64970, 64985, 64999, 65012
-};
-
-const AAS_s8 AAS_sin[64] = {
- 0, -12, -24, -37, -48, -60, -71, -81, -90, -98, -106, -112, -118, -122,
- -125, -127, -127, -127, -125, -122, -118, -112, -106, -99, -90, -81, -71,
- -60, -49, -37, -25, -12, 0, 12, 24, 36, 48, 60, 70, 81, 90, 98, 106, 112,
- 118, 122, 125, 127, 127, 127, 125, 122, 118, 113, 106, 99, 90, 81, 71, 60,
- 49, 37, 25, 12
-};
-
-AAS_BOOL AAS_initialised AAS_IN_EWRAM = AAS_FALSE;
-AAS_u8 AAS_volscale AAS_IN_EWRAM;
-AAS_u16 AAS_mix_scale AAS_IN_EWRAM;
-AAS_BOOL AAS_changed[2] AAS_IN_IWRAM;
-
-AAS_u8 AAS_chan_rearrange[AAS_MAX_CHANNELS] AAS_IN_EWRAM;
-
-struct AAS_Channel AAS_channels[16] AAS_IN_EWRAM;
-
-/* 2560 bytes, must be aligned to 4 byte boundary, could be just 640 bytes if mix rate was 8KHz */
-AAS_u32 AAS_mix_buffer[640] AAS_IN_EWRAM;
+++ /dev/null
-/* Copyright (c) 2003-2021 James Daniels */
-/* Distributed under the MIT License */
-/* license terms: see LICENSE file in root or http://opensource.org/licenses/MIT */
-
-#ifndef __AAS_SHARED__
-#define __AAS_SHARED__
-
-#include "AAS.h"
-#include "AAS_Mixer.h"
-
-#define AAS_MAX_CHANNELS 16
-
-#define REG_SOUNDCNT_L (*(volatile AAS_u16 *)0x4000080)
-#define REG_SOUNDCNT_H (*(volatile AAS_u16 *)0x4000082)
-#define REG_SOUNDCNT_X (*(volatile AAS_u16 *)0x4000084)
-
-#define REG_DMA1SAD (*(volatile AAS_u32 *)0x40000BC)
-#define REG_DMA1DAD (*(volatile AAS_u32 *)0x40000C0)
-#define REG_DMA1CNT_H (*(volatile AAS_u16 *)0x40000C6)
-#define REG_DMA1CNT (*(volatile AAS_u32 *)0x40000C4)
-
-#define REG_DMA2SAD (*(volatile AAS_u32 *)0x40000C8)
-#define REG_DMA2DAD (*(volatile AAS_u32 *)0x40000CC)
-#define REG_DMA2CNT_H (*(volatile AAS_u16 *)0x40000D2)
-#define REG_DMA2CNT (*(volatile AAS_u32 *)0x40000d0)
-
-#define REG_TM0CNT (*(volatile AAS_u16 *)0x4000102)
-#define REG_TM0D (*(volatile AAS_u16 *)0x4000100)
-
-#define REG_TM1CNT (*(volatile AAS_u16 *)0x4000106)
-#define REG_TM1D (*(volatile AAS_u16 *)0x4000104)
-
-#define REG_IE (*(volatile AAS_u16 *)0x4000200)
-#define REG_IME (*(volatile AAS_u16 *)0x4000208)
-#define REG_IF (*(volatile AAS_u16 *)0x4000202)
-
-#define DISPCNT (*(volatile AAS_u16 *)0x4000000)
-#define REG_VCOUNT (*(volatile AAS_u16 *)0x4000006)
-
-struct AAS_ModSample
-{
- AAS_u32 data; /* offset in bytes */
- AAS_u16 repeat; /* in halfwords */
- AAS_u16 length; /* in halfwords */
- AAS_u8 finetune;
- AAS_u8 volume;
- AAS_u16 padding;
-};
-
-extern const AAS_u16 AAS_DATA_NUM_MODS;
-extern const struct AAS_ModSample AAS_ModSamples[][31];
-extern const AAS_s16 AAS_Sequence[][128][16];
-extern const AAS_u8 AAS_NumChans[];
-extern const AAS_u8 AAS_RestartPos[];
-extern const AAS_u8 AAS_PatternData[];
-extern const AAS_s8 AAS_SampleData[];
-
-extern const AAS_u16 AAS_DivTable[8192];
-extern const AAS_u16 AAS_MOD_period_conv_table[2048];
-extern const AAS_u16 AAS_period_table[16][60];
-
-extern const AAS_u16 AAS_tick_rate[41];
-
-extern const AAS_s8 AAS_sin[64];
-
-extern AAS_s16 AAS_mod_num AAS_IN_EWRAM;
-extern AAS_BOOL AAS_initialised AAS_IN_EWRAM;
-extern AAS_u8 AAS_volscale AAS_IN_EWRAM;
-extern AAS_u8 AAS_mod_num_chans AAS_IN_EWRAM;
-extern AAS_u16 AAS_mix_scale AAS_IN_EWRAM;
-extern AAS_BOOL AAS_changed[2] AAS_IN_IWRAM;
-
-extern AAS_u8 AAS_chan_rearrange[AAS_MAX_CHANNELS] AAS_IN_EWRAM;
-
-__inline static int AAS_Min( int a, int b )
-{
- if ( a < b )
- return a;
- else
- return b;
-}
-
-#endif
+++ /dev/null
-obj = AAS_ASM.o AAS_Main.o AAS_MOD.o AAS_Shared.o AAS_SFX.o AAS_Mixer.o
-lib_a = libaas.a
-
-TCPREFIX = arm-none-eabi-
-CC = $(TCPREFIX)gcc
-AS = $(TCPREFIX)as
-AR = $(TCPREFIX)ar
-
-CFLAGS = -mthumb -O3 -g -funroll-loops -mcpu=arm7tdmi -ffast-math \
- -fno-exceptions -mthumb-interwork -fomit-frame-pointer
-ASFLAGS = -mthumb-interwork
-
-$(lib_a): $(obj)
- $(AR) rcs $@ $(obj)
-
-%.o: %.s
- $(AS) $(ASFLAGS) -o $@ $<
-
-.PHONY: clean
-clean:
- rm -f $(obj) $(lib_a)
--- /dev/null
+src = $(wildcard *.S)
+obj = $(src:.S=.o)
+lib_a = libmm.a
+
+TCPREFIX ?= arm-none-eabi-
+CC = $(TCPREFIX)gcc
+AS = $(TCPREFIX)as
+AR = $(TCPREFIX)ar
+
+ASFLAGS = -mcpu=arm7tdmi -mtune=arm7tdmi -mthumb -mthumb-interwork -DSYS_GBA -DUSE_IWRAM
+
+$(lib_a): $(obj)
+ $(AR) rcs $@ $(obj)
+
+.PHONY: clean
+clean:
+ rm -f $(obj) $(lib_a)
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Nintendo DS & Gameboy Advance Sound System *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * GBA Definitions *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef MAXMOD_H
+#define MAXMOD_H
+
+#include <mm_types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// precalculated mix buffer lengths (in bytes)
+#define MM_MIXLEN_8KHZ 544 // (8121 hz)
+#define MM_MIXLEN_10KHZ 704 // (10512 hz)
+#define MM_MIXLEN_13KHZ 896 // (13379 hz)
+#define MM_MIXLEN_16KHZ 1056 // (15768 hz)
+#define MM_MIXLEN_18KHZ 1216 // (18157 hz)
+#define MM_MIXLEN_21KHZ 1408 // (21024 hz)
+#define MM_MIXLEN_27KHZ 1792 // (26758 hz)
+#define MM_MIXLEN_31KHZ 2112 // (31536 hz)
+
+// measurements of channel types (bytes)
+#define MM_SIZEOF_MODCH 40
+#define MM_SIZEOF_ACTCH 28
+#define MM_SIZEOF_MIXCH 24
+
+/****************************************************************************
+ * mmInitDefault( mm_addr soundbank, mm_word number_of_channels )
+ *
+ * Initialize Maxmod with default settings.
+ ****************************************************************************/
+
+void mmInitDefault( mm_addr soundbank, mm_word number_of_channels );
+
+/****************************************************************************
+ * mmInit( mm_gba_system* setup )
+ *
+ * Initialize system. Call once at startup.
+ ****************************************************************************/
+
+void mmInit( mm_gba_system* setup );
+
+/****************************************************************************
+ * mmVBlank()
+ *
+ * Must be linked to the VBlank IRQ.
+ ****************************************************************************/
+
+void mmVBlank( void );
+
+/****************************************************************************
+ * mmSetVBlankHandler( void* function )
+ *
+ * Install user vblank handler
+ *
+ * function : Pointer to your VBlank handler.
+ ****************************************************************************/
+
+void mmSetVBlankHandler( void* function );
+
+/****************************************************************************
+ * mmSetEventHandler( mm_callback handler )
+ *
+ * Install handler to receive song events.
+ ****************************************************************************/
+
+void mmSetEventHandler( mm_callback handler );
+
+/****************************************************************************
+ * mmFrame()
+ *
+ * Work routine. _Must_ be called every frame.
+ ****************************************************************************/
+
+void mmFrame( void ) __attribute((long_call));
+
+
+
+/****************************************************************************
+ *
+ * Module Playback
+ *
+ ****************************************************************************/
+
+
+
+/****************************************************************************
+ * mmStart( mm_word id, mm_pmode mode )
+ *
+ * Start module playback.
+ *
+ * id : ID of module to play.
+ * mode : Playback mode (loop/once)
+ ****************************************************************************/
+
+void mmStart( mm_word id, mm_pmode mode );
+
+/****************************************************************************
+ * mmPause()
+ *
+ * Pause module playback, resume with mmResume().
+ ****************************************************************************/
+
+void mmPause( void );
+
+/****************************************************************************
+ * mmResume()
+ *
+ * Resume module playback, pause with mmPause().
+ ****************************************************************************/
+
+void mmResume( void );
+
+/****************************************************************************
+ * mmStop()
+ *
+ * Stop module playback. start again with mmStart().
+ ****************************************************************************/
+
+void mmStop( void );
+
+/****************************************************************************
+ * mmGetPosition()
+ *
+ * Get playback position.
+ ****************************************************************************/
+
+mm_word mmGetPosition( void );
+
+/****************************************************************************
+ * mmPosition()
+ *
+ * Set playback position.
+ *
+ * position: New position in the module sequence.
+ ****************************************************************************/
+
+void mmPosition( mm_word position );
+
+/****************************************************************************
+ * mmSetPosition()
+ *
+ * Set playback position (alias for mmPosition()).
+ *
+ * position: New position in the module sequence.
+ ****************************************************************************/
+
+inline void mmSetPosition( mm_word position )
+{
+ mmPosition( position );
+}
+
+/****************************************************************************
+ * mmActive()
+ *
+ * Returns nonzero if module is playing.
+ ****************************************************************************/
+
+int mmActive( void );
+
+/****************************************************************************
+ * mmJingle( mm_word module_ID )
+ *
+ * Play module as jingle. Jingles are limited to 4 channels only.
+ *
+ * module_ID : ID of moudle (defined in soundbank header)
+ ****************************************************************************/
+
+void mmJingle( mm_word module_ID );
+
+/****************************************************************************
+ * mmActiveSub()
+ *
+ * Returns nonzero if a jingle is actively playing.
+ ****************************************************************************/
+
+int mmActiveSub( void );
+
+/****************************************************************************
+ * mmSetModuleVolume( mm_word volume )
+ * mmSetJingleVolume( mm_word volume )
+ *
+ * Set volume scaler for music/jingles.
+ *
+ * volume : 0->1024 = silent..normal
+ ****************************************************************************/
+
+void mmSetModuleVolume( mm_word volume );
+void mmSetJingleVolume( mm_word volume );
+
+/*****************************************************************
+ * mmSetModuleTempo( mm_word tempo )
+ *
+ * Set tempo of playback.
+ *
+ * tempo : Fixed point (Q10) value representing tempo.
+ * Range = 0x200 -> 0x800 = 0.5 -> 2.0
+ *****************************************************************/
+
+void mmSetModuleTempo( mm_word tempo );
+
+/*****************************************************************
+ * mmSetModulePitch( mm_word pitch )
+ *
+ * Set pitch of playback.
+ *
+ * pitch : Range = 0x200 -> 0x800 = 0.5 -> 2.0
+ *****************************************************************/
+
+void mmSetModulePitch( mm_word pitch );
+
+/****************************************************************************
+ * mmPlayModule( mm_word address, mm_word mode, mm_word layer )
+ *
+ * Play direct MAS file
+ ****************************************************************************/
+
+void mmPlayModule( mm_word address, mm_word mode, mm_word layer );
+
+
+
+/****************************************************************************
+ *
+ * Sound Effects
+ *
+ ****************************************************************************/
+
+
+
+/****************************************************************************
+ * mmEffect( mm_word sample_ID )
+ *
+ * Play a sound effect at its default frequency with full volume and
+ * centered panning.
+ *
+ * sample_ID : Sound effect ID. (defined in soundbank header)
+ ****************************************************************************/
+
+mm_sfxhand mmEffect( mm_word sample_ID );
+
+/****************************************************************************
+ * mmEffectEx( mm_sound_effect* sound )
+ *
+ * Play a sound effect with all parameters.
+ *
+ * sound : Sound effect attributes.
+ ****************************************************************************/
+
+mm_sfxhand mmEffectEx( mm_sound_effect* sound );
+
+/****************************************************************************
+ * mmEffectVolume( mm_sfxhand handle, mm_word volume )
+ *
+ * Set the volume of a sound effect.
+ *
+ * handle : Sound effect handle.
+ * volume : 0->65535
+ ****************************************************************************/
+
+void mmEffectVolume( mm_sfxhand handle, mm_word volume );
+
+/****************************************************************************
+ * mmEffectPanning( mm_sfxhand handle, mm_word panning )
+ *
+ * Set the panning of a sound effect.
+ *
+ * handle : Sound effect handle.
+ * panning : 0->255 = left..right
+ ****************************************************************************/
+
+void mmEffectPanning( mm_sfxhand handle, mm_byte panning );
+
+/****************************************************************************
+ * mmEffectRate( mm_sfxhand handle, mm_word rate )
+ *
+ * Set the playback rate of an effect.
+ *
+ * handle : Sound effect handle.
+ * rate: 6.10 factor
+ ****************************************************************************/
+
+void mmEffectRate( mm_sfxhand handle, mm_word rate );
+
+/****************************************************************************
+ * mmEffectScaleRate( mm_sfxhand handle, mm_word factor )
+ *
+ * Scale the playback rate of an effect.
+ *
+ * handle : Sound effect handle.
+ * factor : 6.10 fixed point factor.
+ ****************************************************************************/
+
+void mmEffectScaleRate( mm_sfxhand handle, mm_word factor );
+
+/****************************************************************************
+ * mmEffectActive( mm_sfxhand handle )
+ *
+ * Indicates if a sound effect is active or not.
+ *
+ * handle : Sound effect handle.
+ ****************************************************************************/
+
+mm_bool mmEffectActive( mm_sfxhand handle );
+
+/****************************************************************************
+ * mmEffectCancel( mm_sfxhand handle )
+ *
+ * Stop sound effect.
+ *
+ * handle : Sound effect handle.
+ ****************************************************************************/
+
+void mmEffectCancel( mm_sfxhand handle );
+
+/****************************************************************************
+ * mmEffectRelease( mm_sfxhand handle )
+ *
+ * Release sound effect (invalidate handle and allow interruption)
+ *
+ * handle : Sound effect handle.
+ ****************************************************************************/
+
+void mmEffectRelease( mm_sfxhand handle );
+
+/****************************************************************************
+ * mmSetEffectsVolume( mm_word volume )
+ *
+ * Set master volume scale for effect playback.
+ *
+ * volume : 0->1024 representing 0%->100% volume
+ ****************************************************************************/
+
+void mmSetEffectsVolume( mm_word volume );
+
+/****************************************************************************
+ * mmEffectCancelAll()
+ *
+ * Stop all sound effects
+ ****************************************************************************/
+
+void mmEffectCancelAll();
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/****************************************************************************
+ * Playback events
+ ****************************************************************************/
+
+//---------------------------------------------------------------------------
+// This happens when Maxmod reads a SFx (or mod/xm EFx) effect from a module
+// It will store 'x' in param_b
+//---------------------------------------------------------------------------
+#define MMCB_SONGMESSAGE 0x2A
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+// A module has finished playing
+// param == 0 if main module, ==1 otherwise
+//---------------------------------------------------------------------------
+#define MMCB_SONGFINISHED 0x2B
+//---------------------------------------------------------------------------
+
+/****************************************************************************
+ * etc...
+ ****************************************************************************/
+
+extern mm_byte mp_mix_seg; // current mixing segment
+extern mm_word mp_writepos; // mixer's write position
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * ARM7 Definitions *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifdef ARM9
+#error "maxmod7.h is for ARM7!"
+#endif
+
+//----------------------------------------------------------------
+#ifndef MAXMOD_H
+//----------------------------------------------------------------
+
+#define MAXMOD_H
+
+#include <mm_types.h>
+
+//----------------------------------------------------------------
+#ifdef __cplusplus
+extern "C" {
+#endif
+//----------------------------------------------------------------
+
+/*****************************************************************
+ * mmInstall( channel )
+ *
+ * Install Maxmod.
+ *
+ * channel : IPC/FIFO channel to use, usually 7.
+ *****************************************************************/
+
+void mmInstall( int fifo_channel );
+
+/*****************************************************************
+ * mmLockChannels( mm_word bitmask )
+ *
+ * Lock audio channels from being used by Maxmod.
+ *
+ * bitmask : Bitmask of which channels should be locked.
+ * (&1 = ch0, &2 = ch1, &4 = ch2, &8 = ch4, etc...)
+ *****************************************************************/
+
+void mmLockChannels( mm_word bitmask );
+
+/*****************************************************************
+ * mmUnlockChannels( mm_word bitmask )
+ *
+ * Unlock audio channels so Maxmod can use them.
+ *
+ * bitmask : Bitmask of which channels should be unlocked.
+ * (&1 = ch0, &2 = ch1, &4 = ch2, &8 = ch4, etc...)
+ *****************************************************************/
+
+void mmUnlockChannels( mm_word bitmask );
+
+/*****************************************************************
+ * mmIsInitialize()
+ *
+ * Returns whether or not the system is ready for playback.
+ *****************************************************************/
+
+mm_bool mmIsInitialized( void );
+
+/*****************************************************************
+ * mmSelectMode( mm_mode_enum mode )
+ *
+ * Select audio mode
+ *
+ * mode:
+ * MM_MODE_A : Hardware Mixing
+ * MM_MODE_B : Interpolated Mixing
+ * MM_MODE_C : Extended Mixing
+ *****************************************************************/
+
+void mmSelectMode( mm_mode_enum mode );
+
+/*****************************************************************
+ * mmFrame()
+ *
+ * Work routine (called automatically)
+ *****************************************************************/
+
+void mmFrame( void );
+
+// note about using sleep functions:
+// do not use during an interrupt!! it's not safe
+// and do not exit sleep unless it is already sleeping.
+
+
+
+/*****************************************************************
+ *
+ * Module Playback
+ *
+ *****************************************************************/
+
+
+
+/*****************************************************************
+ * mmStart( mm_word module_ID, mm_pmode mode )
+ *
+ * Start module playback
+ *
+ * module_ID : Index of module to play. (defined in soundbank header)
+ * mode : Mode of playback: MM_PLAY_ONCE or MM_PLAY_LOOP
+ *****************************************************************/
+
+void mmStart( mm_word module_ID, mm_pmode mode );
+
+/*****************************************************************
+ * mmPause()
+ *
+ * Pause module playback.
+ *****************************************************************/
+
+void mmPause( void );
+
+/*****************************************************************
+ * mmResume()
+ *
+ * Resume module playback
+ *****************************************************************/
+
+void mmResume( void );
+
+/*****************************************************************
+ * mmStop()
+ *
+ * Stop module playback. Start again (from the beginning)
+ * with mmStart(...).
+ *****************************************************************/
+
+void mmStop( void );
+
+/*****************************************************************
+ * mmPosition( mm_word position )
+ *
+ * Set playback position.
+ *
+ * position : New position in module sequence.
+ *****************************************************************/
+
+void mmPosition( mm_word position );
+
+/*****************************************************************
+ * mmActive()
+ *
+ * Returns nonzero if module is playing
+ *****************************************************************/
+
+mm_bool mmActive( void );
+
+/*****************************************************************
+ * mmJingle( mm_word module_ID )
+ *
+ * Play module as jingle. Jingles are limited to 4 channels only.
+ *
+ * module_ID : ID of module (defined in soundbank header)
+ *****************************************************************/
+
+void mmJingle( mm_word module_ID );
+
+/*****************************************************************
+ * mmActiveSub()
+ *
+ * Returns nonzero if a jingle is actively playing.
+ *****************************************************************/
+
+mm_bool mmActiveSub( void );
+
+/*****************************************************************
+ * mmSetModuleVolume( mm_word volume )
+ * mmSetJingleVolume( mm_word volume )
+ *
+ * Set volume scaler for music/jingles.
+ *
+ * volume : 0->1024 = silent..normal
+ *****************************************************************/
+
+void mmSetModuleVolume( mm_word volume );
+void mmSetJingleVolume( mm_word volume );
+
+/*****************************************************************
+ * mmPlayModule( mm_word address, mm_word mode, mm_word layer )
+ *
+ * Play direct MAS file
+ *****************************************************************/
+
+void mmPlayModule( mm_word address, mm_word mode, mm_word layer );
+
+
+
+/*****************************************************************
+ *
+ * Sound Effects
+ *
+ *****************************************************************/
+
+
+
+/*****************************************************************
+ * mmEffect( mm_word sample_ID )
+ *
+ * Play a sound effect at its default frequency with full volume
+ * and centered panning. Effect must be loaded first via
+ * mmLoadEffect.
+ *
+ * sample_ID : Sound effect ID. (defined in soundbank header)
+ *****************************************************************/
+
+mm_sfxhand mmEffect( mm_word sample_ID );
+
+/*****************************************************************
+ * mmEffectEx( mm_sound_effect* sound )
+ *
+ * Play a sound effect with the parameters supplied.
+ *
+ * sound : Sound effect attributes.
+ *****************************************************************/
+
+mm_sfxhand mmEffectEx( mm_sound_effect* sound );
+
+/*****************************************************************
+ * mmEffectVolume( mm_sfxhand handle, mm_word volume )
+ *
+ * Set the volume of a sound effect.
+ *
+ * handle : Sound effect handle.
+ * volume : 0->65535
+ *****************************************************************/
+
+void mmEffectVolume( mm_sfxhand handle, mm_word volume );
+
+/*****************************************************************
+ * mmEffectPanning( mm_sfxhand handle, mm_word panning )
+ *
+ * Set the panning of a sound effect.
+ *
+ * handle : Sound effect handle.
+ * panning : 0->255 = left..right
+ *****************************************************************/
+
+void mmEffectPanning( mm_sfxhand handle, mm_byte panning );
+
+/*****************************************************************
+ * mmEffectRate( mm_sfxhand handle, mm_word rate )
+ *
+ * Set the playback rate of an effect.
+ *
+ * handle : Sound effect handle.
+ * rate: 6.10 factor
+ *****************************************************************/
+
+void mmEffectRate( mm_sfxhand handle, mm_word rate );
+
+/*****************************************************************
+ * mmEffectScaleRate( mm_sfxhand handle, mm_word factor )
+ *
+ * Scale the playback rate of an effect.
+ *
+ * handle : Sound effect handle.
+ * factor : 6.10 fixed point factor.
+ *****************************************************************/
+
+void mmEffectScaleRate( mm_sfxhand handle, mm_word factor );
+
+/*****************************************************************
+ * mmEffectCancel( mm_sfxhand handle )
+ *
+ * Stop sound effect.
+ *
+ * handle : Sound effect handle.
+ *****************************************************************/
+
+void mmEffectCancel( mm_sfxhand handle );
+
+/*****************************************************************
+ * mmEffectRelease( mm_sfxhand handle )
+ *
+ * Release sound effect (invalidate handle and allow interruption)
+ *
+ * handle : Sound effect handle.
+ *****************************************************************/
+
+void mmEffectRelease( mm_sfxhand handle );
+
+/*****************************************************************
+ * mmSetEffectsVolume( mm_word volume )
+ *
+ * Set master volume scale for effect playback.
+ *
+ * volume : 0->1024 representing 0%->100% volume
+ *****************************************************************/
+
+void mmSetEffectsVolume( mm_word volume );
+
+/*****************************************************************
+ * mmEffectCancelAll()
+ *
+ * Stop all sound effects
+ *****************************************************************/
+
+void mmEffectCancelAll();
+
+
+
+/*****************************************************************
+ *
+ * Streaming
+ *
+ *****************************************************************/
+
+
+/*****************************************************************
+ * mmStreamOpen( mm_stream* stream, mm_addr wavebuffer, mm_addr workbuffer )
+ *
+ * Open audio stream.
+ *
+ * stream : Configuration struct
+ * wavebuffer : wave memory, must be aligned
+ * workbuffer : work memory, must be aligned
+ *****************************************************************/
+
+void mmStreamOpen( mm_stream* stream, mm_addr wavebuffer, mm_addr workbuffer );
+
+/*****************************************************************
+ * mmStreamUpdate()
+ *
+ * Fills the stream with wave data.
+ * This only needs to be called in 'manual' mode. It
+ * is called automatically in 'auto' mode.
+ *****************************************************************/
+
+void mmStreamUpdate( void );
+
+/*****************************************************************
+ * mmStreamClose()
+ *
+ * Close audio stream.
+ *****************************************************************/
+
+void mmStreamClose( void );
+
+/*****************************************************************
+ * mmStreamGetPosition()
+ *
+ * Get number of samples elapsed since the stream was opened.
+ * The 32-bit value will wrap every 36 hours or so (at 32khz)
+ *****************************************************************/
+
+mm_word mmStreamGetPosition();
+
+
+
+/*****************************************************************
+ *
+ * Reverb
+ *
+ *****************************************************************/
+
+
+
+/*****************************************************************
+ * mmReverbEnable()
+ *
+ * Enable reverb system. (use before configuring!)
+ *****************************************************************/
+
+void mmReverbEnable( void );
+
+/*****************************************************************
+ * mmReverbConfigure( mm_reverb_cfg* config )
+ *
+ * Configure reverb parameters.
+ * config : Configuration data.
+ *****************************************************************/
+
+void mmReverbConfigure( mm_reverb_cfg* config );
+
+/*****************************************************************
+ * mmReverbStart( mm_reverbch channels )
+ *
+ * Start reverb output.
+ *****************************************************************/
+
+void mmReverbStart( mm_reverbch channels );
+
+/*****************************************************************
+ * mmReverbStop( mm_reverch channels )
+ *
+ * Stop reverb output.
+ *****************************************************************/
+
+void mmReverbStop( mm_reverbch channels );
+
+/*****************************************************************
+ * mmReverbBufferSize( mm_word bit_depth, mm_word sampling_rate,
+ * mm_word delay )
+ *
+ * Calculate reverb buffer size based on bit depth, delay
+ * and sampling rate.
+ *
+ * bit_depth : Pass 8 or 16 for 8-bit/16-bit
+ * sampling_rate :
+ * delay : In milliseconds
+ *
+ * Returns size in WORDS.
+ *****************************************************************/
+
+static inline mm_word mmReverbBufferSize( mm_word bit_depth, mm_word sampling_rate, mm_word delay )
+{
+ if( bit_depth == 16 )
+ {
+ return ((((sampling_rate * delay * 2) / 1000) + 3) & (~3)) / 4;
+ }
+ else
+ {
+ return ((((sampling_rate * delay) / 1000) + 3) & (~3)) / 4;
+ }
+}
+
+/*****************************************************************
+ * mmReverbDisable()
+ *
+ * Disable reverb system.
+ *****************************************************************/
+
+void mmReverbDisable( void );
+
+
+
+//----------------------------------------------------------------
+#ifdef __cplusplus
+}
+#endif
+//----------------------------------------------------------------
+
+/*****************************************************************
+ * Playback events
+ *****************************************************************/
+
+//----------------------------------------------------------------
+// This happens when Maxmod reads an SFx (or mod/xm EFx) effect
+// from a module. It will pass 'x' in param.
+//----------------------------------------------------------------
+#define MMCB_SONGMESSAGE 0x2A
+//----------------------------------------------------------------
+
+//----------------------------------------------------------------
+// A module has finished playing.
+// param == 0 if main module, ==1 otherwise
+//----------------------------------------------------------------
+#define MMCB_SONGFINISHED 0x2B
+//----------------------------------------------------------------
+
+//=======================================================================================
+// misc definitions / references
+//=======================================================================================
+
+// main/sub layer attributes
+extern mm_modlayer mmLayerMain;
+extern mm_modlayer mmLayerSub;
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Sound Effect System *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#include "mp_defs.inc"
+#include "mp_mas.inc"
+#include "mp_mas_structs.inc"
+#include "mp_format_mas.inc"
+#include "mp_macros.inc"
+
+#ifdef SYS_GBA
+#include "mp_mixer_gba.inc"
+#endif
+
+#ifdef SYS_NDS
+#include "mp_mixer_ds.inc"
+#endif
+
+/***********************************************************************
+ *
+ * Definitions
+ *
+ ***********************************************************************/
+
+.struct 0 // mm_sound_effect
+MM_SFX_SOURCE: .space 4 // word: source
+MM_SFX_RATE: .space 2 // hword: rate
+MM_SFX_HANDLE: .space 2 // byte: handle
+MM_SFX_VOLUME: .space 1 // byte: volume
+MM_SFX_PANNING: .space 1 // byte: panning
+MM_SFX_SIZE: // 8 bytes total
+
+.equ channelCount, 16
+.equ releaseLevel, 200
+
+/***********************************************************************
+ *
+ * Memory
+ *
+ ***********************************************************************/
+
+ .BSS
+ .ALIGN 2
+ .GLOBAL mm_sfx_bitmask, mm_sfx_clearmask
+
+mm_sfx_mastervolume: .space 4
+mm_sfx_channels: .space 2*channelCount
+mm_sfx_bitmask: .space 4
+mm_sfx_clearmask: .space 4
+
+mm_sfx_counter: .space 1
+
+/***********************************************************************
+ *
+ * Program
+ *
+ ***********************************************************************/
+
+ .TEXT
+ .THUMB
+ .ALIGN 2
+
+/***********************************************************************
+ * mmResetEffects
+ ***********************************************************************/
+ .global mmResetEffects
+ .thumb_func
+mmResetEffects:
+
+ mov r0, #0
+ mov r1, #channelCount
+ ldr r2,=mm_sfx_channels
+
+1: strh r0, [r2]
+ add r2, #2
+ sub r1, #1
+ bne 1b
+
+ ldr r2,=mm_sfx_bitmask
+ str r0, [r2]
+
+ bx lr
+
+/***********************************************************************
+ * mmGetFreeEffectChannel()
+ *
+ * Return index to free effect channel
+ ***********************************************************************/
+ .thumb_func
+mmGetFreeEffectChannel:
+
+ ldr r0,=mm_sfx_bitmask // r0 = bitmask
+ ldr r0, [r0] //
+ mov r1, #1 // r1 = channel counter
+
+.channel_search: // shift out bits until we find a cleared one
+ lsr r0, #1 //
+ bcc .found_channel //
+ add r1, #1 // r1 = index value
+ b .channel_search //
+
+.found_channel:
+
+ cmp r1, #channelCount+1 // if r1 == cc+1 then r1 = 0 (no handles avail.)
+ bne .found_valid_channel //
+ mov r1, #0 //
+.found_valid_channel: //
+
+ mov r0, r1 // return value
+ bx lr //
+
+/***********************************************************************
+ * mmEffect( id )
+ *
+ * Play sound effect with default parameters
+ ***********************************************************************/
+ .global mmEffect
+ .thumb_func
+mmEffect:
+ push {lr}
+ // r0 = ssssssss
+ mov r1, #1 // r1 = hhhhrrrr
+ lsl r1, #10 //
+ ldr r2,=0x000080FF // r2 = ----ppvv
+
+ push {r0-r2} // mmEffectEx( sound )
+ mov r0, sp //
+ bl mmEffectEx //
+ add sp, #12 //
+ pop {r3} //
+ bx r3 //
+
+/***********************************************************************
+ * mmEffectEx( sound )
+ *
+ * Play sound effect with specified parameters
+ ***********************************************************************/
+ .global mmEffectEx
+ .thumb_func
+mmEffectEx:
+
+ push {r4-r6, lr}
+
+ mov r4, r0
+ ldrh r5, [r4, #MM_SFX_HANDLE] // test if handle was given
+
+ cmp r5, #255
+ bne 1f
+ mov r5, #0
+ b .got_handle
+
+1: cmp r5, #0 //
+ beq .generate_new_handle //
+
+ lsl r1, r5, #24 // check if channel is in use
+ lsr r1, #23 //
+ sub r1, #2 //
+ ldr r0,=mm_sfx_channels //
+ ldrb r0, [r0, r1] //
+ cmp r0, #0 //
+ beq .got_handle // [valid handle otherwise]
+
+ mov r0, r5
+ bl mmEffectCancel // attempt to stop active channel
+ cmp r0, #0 //
+ bne .got_handle //
+ // failure: generate new handle
+.generate_new_handle:
+
+ bl mmGetFreeEffectChannel // generate handle
+ mov r5, r0 //
+ beq .got_handle //-(no available channels)
+ //
+ ldr r0,=mm_sfx_counter // (counter = ((counter+1) & 255))
+ ldrb r1, [r0] //
+ add r1, #1 //
+ strb r1, [r0] //
+ lsl r1, #8
+ orr r5, r1
+ lsl r5, #16
+ lsr r5, #16
+
+.got_handle:
+
+ ldr r1,=mmAllocChannel // allocate new channel
+ bl mpp_call_r1 //
+ cmp r0, #255 //
+ bge .no_available_channels //
+
+ mov r6, r0
+
+ cmp r5, #0
+ beq 1f
+
+ ldr r1,=mm_sfx_channels // register data
+ sub r2, r5, #1 // r3 = bit
+ lsl r2, #24 //
+ lsr r2, #24 //
+ mov r3, #1 //
+ lsl r3, r2 //
+ lsl r2, #1 //
+ add r1, r2 //
+ add r2, r0, #1 //
+ strb r2, [r1, #0] //
+ lsr r2, r5, #8 //
+ strb r2, [r1, #1] //
+
+ ldr r1,=mm_sfx_bitmask // set bit
+ ldr r2, [r1] //
+ orr r2, r3 //
+ str r2, [r1] //
+
+1:
+
+ ldr r1,=mm_achannels // setup channel
+ ldr r1, [r1] //
+ mov r2, #MCA_SIZE //
+ mul r2, r0 //
+ add r1, r2 //
+ //
+ mov r2, #releaseLevel //
+ strb r2, [r1, #MCA_FVOL] //
+
+ cmp r5, #0 //
+ bne 1f //
+ mov r2, #ACHN_BACKGROUND //
+ b 2f //
+1: mov r2, #ACHN_CUSTOM //
+2: //
+ strb r2, [r1, #MCA_TYPE] //
+ mov r2, #MCAF_EFFECT //
+ strb r2, [r1, #MCA_FLAGS] //
+
+ GET_MIXCH r1 // setup voice
+ mov r2, #MIXER_CHN_SIZE //
+ mul r2, r0 //
+ add r3, r1, r2 //
+
+#ifdef SYS_GBA
+
+ ldr r0,=mp_solution // set sample data address
+ ldr r0, [r0] //
+ ldrh r1, [r4, #MM_SFX_SOURCE] //
+ lsl r1, #2 //
+ add r1, #12 //
+ ldr r1, [r0, r1] //
+ add r1, r0 //
+ ldrh r2, [r1, #8+C_SAMPLEC_DFREQ] //
+ add r1, #8+C_SAMPLE_DATA //
+ str r1, [r3, #MIXER_CHN_SRC] //
+
+ ldrh r0, [r4, #MM_SFX_RATE] // set pitch to original * pitch
+ mul r2, r0 //
+ lsr r2, #10-2 //
+ str r2, [r3, #MIXER_CHN_FREQ] //
+
+ mov r1, #0 // reset read position
+ str r1, [r3, #MIXER_CHN_READ] //
+
+ ldrb r0, [r4, #MM_SFX_VOLUME] // set volume
+
+ ldr r1,=mm_sfx_mastervolume
+ ldr r1, [r1]
+ mul r0, r1
+ lsr r0, #10
+
+ strb r0, [r3, #MIXER_CHN_VOL] //
+
+ ldrb r0, [r4, #MM_SFX_PANNING] // set panning
+ strb r0, [r3, #MIXER_CHN_PAN] //
+
+#else
+ ldr r1, [r4, #MM_SFX_SOURCE] // set sample address
+ lsr r0, r1, #16 // > 0x10000 = external sample
+ bne 1f //
+ ldr r0,=mmSampleBank // ID# otherwise
+ ldr r0, [r0] //
+ lsl r1, #2 //
+ ldr r1, [r0, r1] //
+ lsl r1, #8 //
+ lsr r1, #8 //
+ beq .invalid_sample
+ add r1, #8 //
+ ldr r0,=0x2000000 //
+ add r1, r0 //
+1: //
+ str r1, [r3, #MIXER_CHN_SAMP] //
+
+
+ ldrh r0, [r4, #MM_SFX_RATE] // set pitch to original * pitch
+ ldrh r1, [r1, #C_SAMPLEC_DFREQ] //
+ mul r1, r0 //
+ lsr r1, #10 //
+ strh r1, [r3, #MIXER_CHN_FREQ] //
+
+ mov r1, #0 // clear sample offset
+ str r1, [r3, #MIXER_CHN_READ] //
+
+ ldrb r1, [r4, #MM_SFX_PANNING] // set panning + startbit
+ lsr r1, #1 //
+ add r1, #0x80 //
+ strb r1, [r3, #MIXER_CHN_CNT] //
+
+ ldrb r1, [r4, #MM_SFX_VOLUME] // set volume
+ ldr r0,=mm_sfx_mastervolume
+ ldr r0, [r0]
+ mul r1, r0
+// lsr r0, #10
+ lsr r2, r1, #2
+// lsl r2, r1, #8
+
+ strh r2, [r3, #MIXER_CHN_VOL] //
+
+ b .valid_sample
+.invalid_sample:
+ mov r0, #0
+ str r0, [r3, #MIXER_CHN_SAMP]
+
+.valid_sample:
+
+#endif
+
+ mov r0, r5 // return handle
+ pop {r4-r6} //
+ ret1 //
+
+.no_available_channels:
+ mov r0, #0 // return bad
+ pop {r4-r6} //
+ ret1 //
+
+
+
+/***********************************************************************
+ * mme_get_channel_index
+ *
+ * Test handle and return mixing channel index
+ ***********************************************************************/
+ .thumb_func
+mme_get_channel_index:
+
+ lsl r1, r0, #24 // mask and test channel#
+ lsr r1, #24-1 //
+ cmp r1, #0 //
+ beq .invalid_handle //
+ cmp r1, #channelCount*2 //
+ bgt .invalid_handle //
+
+ ldr r2,=mm_sfx_channels-2 // check if instances match
+ ldrh r3, [r2, r1] //
+ lsr r1, r3, #8 //
+ lsr r2, r0, #8 //
+ cmp r1, r2 //
+ bne .invalid_handle //
+
+ lsl r3, #24 // mask channel#
+ lsr r3, #24 //
+ sub r3, #1 //
+ bx lr //
+
+.invalid_handle: // return invalid handle
+ mov r3, #0 //
+ mvn r3, r3 //
+ bx lr //
+
+/***********************************************************************
+ * mmEffectActive( handle )
+ *
+ * Indicates if a sound effect is active or not
+ ***********************************************************************/
+ .global mmEffectActive
+ .thumb_func
+mmEffectActive:
+ push {lr} //
+ bl mme_get_channel_index //
+ cmp r3, #0 // if r3 >= 0, it is active
+ bge .active //
+ mov r0, #0 // return false
+ pop {r3} //
+ bx r3 //
+
+.active: //
+ mov r0, #1 // return true
+ pop {r3} //
+ bx r3 //
+
+/***********************************************************************
+ * mme_clear_channel(ch)
+ *
+ * Clear channel entry and bitmask
+ * r3 preserved
+ ***********************************************************************/
+ .thumb_func
+mme_clear_channel:
+ mov r1, #0
+ ldr r2,=mm_sfx_channels // clear effect channel
+ lsl r0, #1 //
+ strh r1, [r2, r0] //
+
+ mov r1, #1 // clear effect bitmask
+ lsr r0, #1 //
+ lsl r1, r0 //
+ ldr r2,=mm_sfx_bitmask //
+ ldr r0, [r2, #4]
+ orr r0, r1
+ str r0, [r2, #4]
+ ldr r0, [r2] //
+ bic r0, r1 //
+ str r0, [r2] //
+ bx lr
+
+/***********************************************************************
+ * mmEffectVolume( handle, volume )
+ *
+ * Set effect volume
+ *
+ * volume 0..255
+ ***********************************************************************/
+ .global mmEffectVolume
+ .thumb_func
+mmEffectVolume:
+
+ push {r1, lr}
+
+ bl mme_get_channel_index
+ pop {r1}
+ bmi 1f
+
+ ldr r0,=mm_sfx_mastervolume
+ ldr r0, [r0]
+ mul r1, r0
+
+ #ifdef SYS_NDS
+
+ lsr r1, #2
+
+ #endif
+
+ #ifdef SYS_GBA
+
+ lsr r1, #10
+
+ #endif
+
+ mov r0, r3
+
+ bl mmMixerSetVolume
+
+1: ret0
+
+/***********************************************************************
+ * mmEffectPanning( handle, panning )
+ *
+ * Set effect panning
+ *
+ * panning 0..255
+ ***********************************************************************/
+ .global mmEffectPanning
+ .thumb_func
+mmEffectPanning:
+
+ push {r1, lr}
+ bl mme_get_channel_index
+ pop {r1}
+ bmi 1f
+
+ mov r0, r3
+ bl mmMixerSetPan
+
+1: ret0
+
+/***********************************************************************
+ * mmEffectRate( handle, rate )
+ *
+ * Set effect playback rate
+ ***********************************************************************/
+ .global mmEffectRate
+ .thumb_func
+mmEffectRate:
+
+ push {r1, lr}
+ bl mme_get_channel_index
+ pop {r1}
+ bmi 1f
+
+ mov r0, r3
+ bl mmMixerSetFreq
+
+1: ret0
+
+/***********************************************************************
+ * mmEffectCancel( handle )
+ *
+ * Stop sound effect
+ ***********************************************************************/
+ .global mmEffectCancel
+ .thumb_func
+mmEffectCancel:
+
+ push {r0, lr}
+
+ bl mme_get_channel_index
+
+ pop {r0}
+
+ bmi 1f
+
+ mov r1, #MCA_SIZE // free achannel
+ mul r1, r3 //
+ ldr r2,=mm_achannels //
+ ldr r2, [r2] //
+ add r2, r1 //
+ mov r1, #ACHN_BACKGROUND //
+ strb r1, [r2, #MCA_TYPE] //
+ mov r1, #0 //
+ strb r1, [r2, #MCA_FVOL] // clear volume for channel allocator
+
+ lsl r0, #24
+ lsr r0, #24
+ sub r0, #1
+ bl mme_clear_channel
+
+ mov r1, #0 // zero voice volume
+ mov r0, r3 //
+ bl mmMixerSetVolume //
+
+ mov r0, #1
+ ret1
+1:
+ mov r0, #0
+ ret1
+
+/***********************************************************************
+ * mmEffectRelease( channel )
+ *
+ * Release sound effect (allow interruption)
+ ***********************************************************************/
+ .global mmEffectRelease
+ .thumb_func
+mmEffectRelease:
+
+ push {r0, lr}
+
+ bl mme_get_channel_index
+ pop {r0}
+
+ bmi 1f
+
+ mov r1, #MCA_SIZE // release achannel
+ mul r1, r3 //
+ ldr r2,=mm_achannels //
+ ldr r2, [r2] //
+ add r2, r1 //
+ mov r1, #ACHN_BACKGROUND //
+ strb r1, [r2, #MCA_TYPE] //
+
+ lsl r0, #24
+ lsr r0, #24
+ sub r0, #1
+ bl mme_clear_channel
+
+1: ret0
+
+/***********************************************************************
+ * mmEffectScaleRate( channel, factor )
+ *
+ * Scale sampling rate by 6.10 factor
+ ***********************************************************************/
+ .global mmEffectScaleRate
+ .thumb_func
+mmEffectScaleRate:
+
+ push {r1,lr}
+
+ bl mme_get_channel_index
+ pop {r1}
+
+ bmi 1f
+
+ mov r0, r3
+ bl mmMixerMulFreq
+
+1: ret0
+
+/***********************************************************************
+ * mmSetEffectsVolume( volume )
+ *
+ * set master volume scale, 0->1024
+ ***********************************************************************/
+ .global mmSetEffectsVolume
+ .thumb_func
+mmSetEffectsVolume:
+
+ lsr r1, r0, #10
+ beq 1f
+ mov r0, #1
+ lsl r0, #10
+
+1: ldr r1,=mm_sfx_mastervolume
+ str r0, [r1]
+ bx lr
+
+/***********************************************************************
+ * mmEffectCancelAll()
+ *
+ * Stop all sound effects
+ ***********************************************************************/
+ .global mmEffectCancelAll
+ .thumb_func
+mmEffectCancelAll:
+
+ push {r4-r7,lr}
+
+ ldr r4,=mm_sfx_bitmask
+ ldr r4, [r4]
+ ldr r6,=mm_sfx_channels
+ mov r5, #0
+
+
+ lsr r4, #1
+ bcc .mmeca_next
+.mmeca_process:
+
+ ldrb r7, [r6, r5]
+ sub r7, #1
+ bmi .mmeca_next
+
+ mov r0, r7
+ mov r1, #0
+ bl mmMixerSetVolume
+
+ ldr r0,=mm_achannels // free achannel
+ ldr r0, [r0] //
+ mov r1, #MCA_SIZE //
+ mul r1, r7 //
+ add r0, r1 //
+ mov r1, #ACHN_BACKGROUND //
+ strb r1, [r0, #MCA_TYPE] //
+ mov r1, #0
+ strb r1, [r0, #MCA_FVOL] //
+
+.mmeca_next:
+ add r5, #2
+ lsr r4, #1
+ bcs .mmeca_process
+ bne .mmeca_next
+
+ bl mmResetEffects
+
+ POP {r4-r7}
+ pop {r3}
+ bx r3
+
+/***********************************************************************
+ * mmUpdateEffects()
+ *
+ * Update sound effects
+ ***********************************************************************/
+ .global mmUpdateEffects
+ .thumb_func
+mmUpdateEffects:
+
+ push {r4-r6,lr}
+
+ ldr r4,=mm_sfx_bitmask
+ ldr r4, [r4]
+ ldr r6,=mm_sfx_channels
+ mov r5, #0
+
+ lsr r4, #1
+ bcc .next_channel
+.process_channel:
+
+ ldrb r0, [r6, r5] // get channel index
+ sub r0, #1 //
+ bmi .next_channel //
+
+ GET_MIXCH r1
+
+ mov r2, #MIXER_CHN_SIZE // get mixing channel pointer
+ mul r2, r0 //
+ add r1, r2 //
+
+ #ifdef SYS_NDS // test if channel is still active
+ //
+ ldr r2, [r1, #MIXER_CHN_SAMP] //
+ lsl r2, #8 //
+ bne .next_channel //
+ //
+ #else //
+ //
+ ldr r2, [r1, #MIXER_CHN_SRC] //
+ asr r2, #31 //
+ beq .next_channel //
+ //
+ #endif //
+
+ ldr r1,=mm_achannels // free achannel
+ ldr r1, [r1] //
+ mov r2, #MCA_SIZE //
+ mul r2, r0 //
+ add r1, r2 //
+ mov r0, #0 //
+ strb r0, [r1, #MCA_TYPE] //
+ strb r0, [r1, #MCA_FLAGS] //
+ strb r0, [r6, r5]
+
+.next_channel:
+ add r5, #2 // look for another set bit
+ lsr r4, #1 //
+ bcs .process_channel //
+ add r5, #2 //
+ lsr r4, #1 //
+ bcs .process_channel //
+ bne .next_channel //
+
+ mov r4, #0
+ mov r5, #1
+ lsl r5, #32-channelCount
+ ldr r6,=mm_sfx_channels
+
+.build_new_bitmask:
+ ldrb r0, [r6]
+ add r6, #2
+ cmp r0, #0
+ beq 1f
+ orr r4, r5
+1: lsl r5, #1
+ bne .build_new_bitmask
+
+ lsr r4, #32-channelCount
+ ldr r0,=mm_sfx_bitmask
+ ldr r1, [r0] // r1 = bits that change from 1->0
+ mov r2, r1
+ eor r1, r4
+ and r1, r2
+
+ str r4, [r0]
+ ldr r4, [r0, #4]
+ orr r4, r1
+ str r4, [r0, #4] // write 1->0 mask
+
+ pop {r4-r6,pc}
+
+.pool
+
+.end
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Nintendo DS & Gameboy Advance Sound System *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+.global mmInitDefault
+
+@----------------------------------------------------------------------------
+
+#include "mp_defs.inc"
+
+.equ mixlen, 1056 // 16khz
+
+ .bss
+ .align 2
+
+__mixbuffer:
+ .space mixlen
+
+ .text
+ .thumb
+ .align 2
+
+#define MM_SIZEOF_MODCH 40
+#define MM_SIZEOF_ACTCH 28
+#define MM_SIZEOF_MIXCH 24
+
+/****************************************************************************
+ * mmInitDefault( soundbank, #channels )
+ *
+ * Init maxmod with default settings.
+ ****************************************************************************/
+ .thumb_func
+mmInitDefault:
+
+ push {r0,r4,r5,r6,r7,lr} // preserve regs, push soundbank
+
+ //0 mode (3)
+ //1 mchcount (#channels)
+ //2 achcount (#channels)
+ //3 modch
+ //4 actch
+ //5 mixch
+ //6 mixmem (__mixbuffer)
+ //7 wavemem
+
+ mov r6, r1 // r6=#channels
+ ldr r0,=MM_SIZEOF_MODCH+MM_SIZEOF_ACTCH+MM_SIZEOF_MIXCH
+ mul r0, r6
+ ldr r4,=mixlen
+ add r0, r4
+ bl malloc
+
+ mov r7, r0 // wavemem = beginning of buffer
+ add r3, r0, r4 // split up buffer into addresses [r3,r4,r5]
+ mov r0, #MM_SIZEOF_MODCH //
+ mul r0, r6 //
+ add r4, r3, r0 //
+ mov r0, #MM_SIZEOF_ACTCH //
+ mul r0, r6 //
+ add r5, r4, r0 //
+ mov r0, #3 //
+ mov r1, r6 //
+ mov r2, r6 //
+ ldr r6,=__mixbuffer // r6 = mixbuffer (iwram)
+
+ push {r0-r7}
+
+ mov r0, sp // init maxmod, pass init struct
+ bl mmInit //
+
+ add sp, #MM_GBA_SYSTEM_SIZE // restore stack
+
+ pop {r4-r7} // return
+ pop {r0} //
+ bx r0 //
+
+.pool
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+/******************************************************************************
+ *
+ * Definitions
+ *
+ ******************************************************************************/
+
+#include "mp_defs.inc"
+#include "mp_mas.inc"
+#include "mp_mas_structs.inc"
+#include "mp_macros.inc"
+
+#ifdef SYS_GBA
+#include "mp_mixer_gba.inc"
+#endif
+
+#ifdef SYS_NDS
+#include "mp_mixer_ds.inc"
+#endif
+
+/******************************************************************************
+ *
+ * Memory
+ *
+ ******************************************************************************/
+
+ .BSS
+ .ALIGN 2
+
+/******************************************************************************
+ * mmCallback
+ *
+ * Function pointer to user event handler
+ ******************************************************************************/
+ .global mmCallback
+mmCallback: .space 4
+
+/******************************************************************************
+ * mmModuleCount
+ *
+ * Number of modules in soundbank
+ ******************************************************************************/
+ .global mmModuleCount
+mmModuleCount: .space 4
+
+/******************************************************************************
+ * mmModuleBank
+ *
+ * Address of module bank
+ ******************************************************************************/
+ .global mmModuleBank
+mmModuleBank: .space 4
+
+/******************************************************************************
+ * mmSampleBank
+ *
+ * Address of sample bank
+ ******************************************************************************/
+ .global mmSampleBank
+mmSampleBank: .space 4
+
+/******************************************************************************
+ * mm_ch_mask
+ *
+ * Bitmask to select which hardware/software channels can be used
+ ******************************************************************************/
+ .global mm_ch_mask
+mm_ch_mask: .space 4
+
+/******************************************************************************
+ * mm_vblank_function
+ *
+ * Pointer to a user function to be called during the vblank irq
+ ******************************************************************************/
+ .global mm_vblank_function
+mm_vblank_function: .space 4
+
+/******************************************************************************
+ * mm_rds_pchannels, mm_rds_achannels
+ *
+ * Memory for module/active channels for NDS system
+ ******************************************************************************/
+#ifdef SYS_NDS
+mm_rds_pchannels: .space MCH_SIZE*32
+mm_rds_achannels: .space MCA_SIZE*32
+#endif
+
+/******************************************************************************
+ * mmInitialized
+ *
+ * Variable that will be 'true' if we are ready for playback
+ ******************************************************************************/
+ .global mmInitialized
+mmInitialized: .space 1
+
+
+
+
+/******************************************************************************
+ *
+ * Program
+ *
+ ******************************************************************************/
+
+
+
+
+/******************************************************************************
+ * mpp_call_*
+ *
+ * Functions to branch to a register
+ ******************************************************************************/
+
+#ifdef SYS_GBA
+.section ".iwram", "ax", %progbits
+.thumb
+.align 2
+
+.global mpp_call_r7i, mpp_call_r2i, mpp_call_r1i
+
+ .thumb_func
+//-----------------------------------------------------------------------------
+mpp_call_r7i: bx r7
+//-----------------------------------------------------------------------------
+
+ .thumb_func
+//-----------------------------------------------------------------------------
+mpp_call_r2i: bx r2
+//-----------------------------------------------------------------------------
+
+ .thumb_func
+//-----------------------------------------------------------------------------
+mpp_call_r1i: bx r1
+//-----------------------------------------------------------------------------
+
+#endif
+
+//-----------------------------------------------------------------------------
+ .TEXT
+ .THUMB
+ .ALIGN 2
+//-----------------------------------------------------------------------------
+
+.global mpp_call_r7, mpp_call_r1, mpp_call_r2, mpp_call_r3
+
+ .thumb_func
+@------------------------------------------------------------------------------
+mpp_call_r7: bx r7
+@------------------------------------------------------------------------------
+
+ .thumb_func
+@------------------------------------------------------------------------------
+mpp_call_r1: bx r1
+@------------------------------------------------------------------------------
+
+ .thumb_func
+@------------------------------------------------------------------------------
+mpp_call_r2: bx r2
+@------------------------------------------------------------------------------
+
+ .thumb_func
+@------------------------------------------------------------------------------
+mpp_call_r3: bx r3
+@------------------------------------------------------------------------------
+
+/******************************************************************************
+ * mmSetEventHandler
+ *
+ * Set function for handling playback events
+ ******************************************************************************/
+ .global mmSetEventHandler
+ .thumb_func
+mmSetEventHandler:
+
+ ldr r1,=mmCallback
+ str r0, [r1]
+ bx lr
+
+#ifdef SYS_NDS
+/******************************************************************************
+ * mmLockChannels( mask )
+ *
+ * Lock audio channels to prevent the sequencer from using them.
+ ******************************************************************************/
+ .global mmLockChannels
+ .thumb_func
+mmLockChannels:
+ push {r4, r5, lr}
+ ldr r1,=mm_ch_mask // clear bits
+ ldr r2, [r1] //
+ bic r2, r0 //
+ str r2, [r1] //
+
+ mov r4, r0
+ mov r5, #0
+
+2: lsr r4, #1
+ bcc 1f
+ mov r0, r5
+ bl StopActiveChannel
+1: add r5, #1
+ cmp r4, #0
+ bne 2b
+
+ pop {r4,r5}
+ pop {r3}
+ bx r3
+
+/******************************************************************************
+ * StopActiveChannel( index )
+ *
+ * Stop active channel
+ ******************************************************************************/
+ .thumb_func
+StopActiveChannel:
+ push {r4}
+
+ GET_MIXCH r1 // stop mixing channel
+ mov r2, #MIXER_CHN_SIZE //
+ mul r2, r0 //
+ add r1, r2 //
+ //
+ //
+ #ifdef SYS_GBA //
+ //
+ mov r2, #0 //
+ sub r2, #1 //
+ str r2, [r1, #MIXER_CHN_SRC] //
+ //
+ #endif //
+ //
+ #ifdef SYS_NDS //
+ //
+ mov r2, #0 //
+ str r2, [r1, #MIXER_CHN_SAMP] //
+ strh r2, [r1, #MIXER_CHN_CVOL] //
+ strh r2, [r1, #MIXER_CHN_VOL] //
+ //
+ #endif //
+
+ ldr r1,=0x4000400 // stop hardware channel
+ lsl r2, r0, #4 //
+ mov r3, #0 //
+ str r3, [r1, r2] //
+
+ ldr r1,=mm_achannels // disable achn
+ ldr r1, [r1] //
+ mov r2, #MCA_SIZE //
+ mul r2, r0 //
+ add r1, r2 //
+ mov r2, #0 //
+ ldrb r4, [r1, #MCA_FLAGS] //
+ strb r2, [r1, #MCA_FLAGS] //
+ strb r2, [r1, #MCA_TYPE] //
+
+ lsr r1, r4, #8
+ bcs .iseffect
+
+ lsr r4, #7
+ bcs .issub
+
+ ldr r1,=mm_pchannels // stop hooked pchannel
+ ldr r1, [r1] //
+ ldr r2,=mm_num_mch //
+ ldr r2, [r2] //
+ //
+2: ldrb r3, [r1, #MCH_ALLOC] //
+ cmp r3, r0 //
+ bne 1f //
+ mov r3, #255 //
+ strb r3, [r1, #MCH_ALLOC] //
+ b .iseffect //
+1: sub r2, #1 //
+ bne 2b //
+
+ b .iseffect //
+
+.issub:
+ // stop sub pchannel
+ ldr r1,=mm_schannels
+ mov r2, #4
+
+2: ldrb r3, [r1, #MCH_ALLOC] //
+ cmp r3, r0 //
+ bne 1f //
+ mov r3, #255 //
+ strb r3, [r1, #MCH_ALLOC] //
+ b .iseffect //
+1: sub r2, #1 //
+ bne 2b //
+
+.iseffect:
+
+ // hope it works out for effects...
+
+ pop {r4}
+ bx lr
+
+
+/******************************************************************************
+ * mmUnlockChannels( mask )
+ *
+ * Unlock audio channels so they can be used by the sequencer.
+ ******************************************************************************/
+ .global mmUnlockChannels
+ .thumb_func
+mmUnlockChannels:
+
+#ifdef SYS_NDS
+ ldr r1,=mm_mixing_mode // can NOT unlock channels in mode b
+ ldrb r1, [r1] //
+ cmp r1, #1 //
+ beq 1f //
+#endif
+
+ ldr r1,=mm_ch_mask
+ ldr r2, [r1]
+ orr r2, r0
+ str r2, [r1]
+1: bx lr
+#endif
+
+
+
+/******************************************************************************
+ *
+ * GBA
+ *
+ ******************************************************************************/
+
+
+
+
+//-----------------------------------------------------------------------------
+#ifdef SYS_GBA
+//-----------------------------------------------------------------------------
+
+ .BSS
+ .ALIGN 2
+
+/******************************************************************************
+ * mp_solution
+ *
+ * Address of soundbank in memory/rom
+ ******************************************************************************/
+ .global mp_solution
+mp_solution: .space 4
+
+ .TEXT
+ .THUMB
+ .ALIGN 2
+
+/******************************************************************************
+ * mmInit(system)
+ *
+ * Initialize maxmod
+ ******************************************************************************/
+ .global mmInit
+ .thumb_func
+mmInit:
+ push {lr}
+
+ ldr r2,=mp_solution
+ mov r1, #MM_GBA_SYSTEM_SOUNDBANK
+ ldr r1, [r0,r1]
+ str r1, [r2]
+
+ ldr r2,=mm_achannels
+ ldr r1, [r0,#MM_GBA_SYSTEM_ACTCH]
+ str r1, [r2]
+ ldr r1, [r0,#MM_GBA_SYSTEM_MODCH]
+ str r1, [r2,#4]
+ ldr r1, [r0,#MM_GBA_SYSTEM_MCH_COUNT]
+ str r1, [r2,#8]
+ ldr r1, [r0,#MM_GBA_SYSTEM_ACH_COUNT]
+ str r1, [r2,#12]
+
+ bl mmMixerInit @ initialize software/hardware mixer
+
+ ldr r1,=mm_num_ach
+ ldr r1,[r1]
+ mov r0,#1
+ lsl r0, r1
+ sub r0,#1
+
+ ldr r1,=mm_ch_mask
+ str r0, [r1]
+
+ ldr r0,=0x400 //
+ bl mmSetModuleVolume
+ ldr r0,=0x400 //
+ bl mmSetJingleVolume
+ ldr r0,=0x400 //
+ bl mmSetEffectsVolume //
+
+
+ ldr r0,=0x400
+ bl mmSetModuleTempo
+
+ ldr r0,=0x400
+ bl mmSetModulePitch
+
+ bl mmResetEffects
+
+ ret0
+
+/******************************************************************************
+ * mmSetVBlankHandler
+ *
+ * Set function to be called during the vblank IRQ
+ ******************************************************************************/
+ .global mmSetVBlankHandler
+ .thumb_func
+mmSetVBlankHandler:
+
+ ldr r1,=mm_vblank_function
+ str r0, [r1]
+ bx lr
+
+/******************************************************************************
+ * mmFrame()
+ *
+ * Work routine, user _must_ call this every frame.
+ ******************************************************************************/
+ .global mmFrame
+ .thumb_func
+mmFrame:
+
+ push {lr}
+ push {r4-r7}
+
+@ update effects
+
+ ldr r7,=mmUpdateEffects
+ bl _call_via_r7
+
+@ update sub layer
+@ sub layer has 60hz accuracy
+
+ ldr r7,=mppUpdateSub
+ bl _call_via_r7
+
+@ update main layer and mix samples.
+@ main layer is sample-accurate.
+
+ ldr r0,=mpp_channels @ copy channels
+ ldr r1,=mm_pchannels
+ ldr r1,[r1]
+ str r1, [r0]
+ ldr r0,=mpp_nchannels @ copy #channels
+ ldr r1,=mm_num_mch
+ ldr r1,[r1]
+ strb r1, [r0]
+ ldr r0,=mpp_clayer @ layer=0 (main)
+ mov r1, #0
+ strb r1, [r0]
+
+ ldr r0,=mmLayerMain @mpp_layerA @ copy layer pointer
+ ldr r1,=mpp_layerp
+ str r0, [r1]
+
+ ldr r4,=mm_mixlen
+ ldr r4,[r4]
+ @ mixlen is divisible by 2
+
+ ldrb r1, [r0, #MPL_ISPLAYING] @ check if main layer is active
+ cmp r1, #0
+ beq .mpf_no_mainlayer @ skip processing if disabled (and just mix samples)
+
+.mpf_mix_advr:
+
+ ldr r0,=mpp_layerp @ get layer
+ ldr r0, [r0]
+
+ mov r1, #MPL_TICKRATE @ get samples/tick
+ ldrh r5, [r0, r1]
+
+ mov r1, #MPL_SAMPCOUNT @ get sample count
+ ldrh r6, [r0,r1]
+
+ sub r5, r6 @ calc tickrate-counter
+ cmp r5, #0
+ bge 1f
+ mov r5, #0
+1: cmp r5, r4 @ > mixlen?
+ blt .mpf_mix_adv @ no, mix and process tick
+ b .mpf_mix @ yes, mix the rest of samples
+
+.mpf_mix_adv:
+
+ mov r1, #MPL_SAMPCOUNT @ reset sample counter
+ mov r7, #0 @
+ strh r7, [r0,r1] @
+ sub r4, r5 @ subtract from #samples to mix
+
+ PROF_START
+
+ mov r0, r5
+ ldr r7,=mmMixerMix @ mix samples
+ bl _call_via_r7
+
+ PROF_END 0
+
+ ldr r7,=mppProcessTick
+ bl _call_via_r7
+
+ b .mpf_mix_advr @ process more samples
+.mpf_mix:
+
+@ add samples remaining to SAMPCOUNT
+@ and mix more samples
+
+ mov r1, #MPL_SAMPCOUNT
+ add r6, r4
+ strh r6, [r0, r1]
+ mov r0, r4
+ PROF_START
+ ldr r1,=mmMixerMix
+ bl _call_via_r1
+ PROF_END 0
+
+ pop {r4-r7}
+ ret1 @ return to user
+
+.mpf_no_mainlayer:
+
+@ main layer isn't active,
+@ mix full amount
+
+ mov r0, r4
+
+ PROF_START
+ ldr r1,=mmMixerMix
+ bl _call_via_r1
+ PROF_END 0
+
+ pop {r4-r7}
+ ret1
+
+.pool
+
+//-----------------------------------------------------------------------------
+#endif
+//-----------------------------------------------------------------------------
+
+
+
+/******************************************************************************
+ *
+ * NDS
+ *
+ ******************************************************************************/
+
+
+
+//-----------------------------------------------------------------------------
+#ifdef SYS_NDS
+//-----------------------------------------------------------------------------
+
+ .TEXT
+ .THUMB
+ .ALIGN 2
+
+/******************************************************************************
+ * mmSuspendIRQ_t
+ *
+ * Function to disable interrupts via the status register
+ ******************************************************************************/
+ .global mmSuspendIRQ_t
+ .thumb_func
+mmSuspendIRQ_t:
+ ldr r0,=1f
+ bx r0
+
+.arm
+.align 2
+1: mrs r0, cpsr
+ and r1, r0, #0x80
+ orr r0, #0x80
+ msr cpsr, r0
+ str r1, previous_irq_state
+ bx lr
+.thumb
+
+/******************************************************************************
+ * mmRestoreIRQ_t
+ *
+ * Function to enable interrupts via the status register
+ ******************************************************************************/
+ .global mmRestoreIRQ_t
+ .thumb_func
+mmRestoreIRQ_t:
+ ldr r0,=1f
+ bx r0
+
+.arm
+.align 2
+1: mrs r0, cpsr
+ ldr r1, previous_irq_state
+ bic r0, #0x80
+ orr r0, r1
+ msr cpsr, r0
+ bx lr
+
+.thumb
+
+previous_irq_state:
+ .space 4
+
+ .thumb_func
+/******************************************************************************
+ * mmIsInitialized()
+ *
+ * Returns true if the system is ready for playback
+ ******************************************************************************/
+ .global mmIsInitialized
+ .thumb_func
+mmIsInitialized:
+ ldr r0,=mmInitialized
+ ldrb r0, [r0]
+ bx lr
+
+/******************************************************************************
+ * mmInit7()
+ *
+ * Initialize system
+ ******************************************************************************/
+ .global mmInit7
+ .thumb_func
+mmInit7:
+ push {lr}
+ mov r0, #0x08
+ ldr r1,=mmFrame
+ bl irqSet
+
+ mov r0, #0x08
+ bl irqEnable
+
+ ldr r0,=0x400 // set volumes
+ bl mmSetModuleVolume //
+ ldr r0,=0x400 //
+ bl mmSetJingleVolume //
+ ldr r0,=0x400 //
+ bl mmSetEffectsVolume //
+
+ ldr r0,=mmInitialized // set initialized flag
+ mov r1, #42 //
+ strb r1, [r0] //
+
+ ldr r0,=0xFFFF // select all hardware channels
+ bl mmUnlockChannels //
+
+ ldr r0,=mm_achannels // setup channel addresses
+ ldr r1,=mm_rds_achannels //
+ str r1, [r0] //
+ ldr r1,=mm_rds_pchannels //
+ str r1, [r0,#4] //
+ mov r1, #32 // 32 channels
+ str r1, [r0,#8] //
+ str r1, [r0,#12] //
+
+ ldr r0,=0x400
+ bl mmSetModuleTempo
+
+ ldr r0,=0x400
+ bl mmSetModulePitch
+
+ bl mmResetEffects
+
+ bl mmMixerInit // setup mixer
+
+ ldr r0,=mmEventForwarder // forward events
+ bl mmSetEventHandler
+
+ ldr r0,=mmInitialized // set initialized flag
+ mov r1, #42 //
+ strb r1, [r0] //
+
+.exit_r3:
+ pop {r3}
+ bx r3
+
+/******************************************************************************
+ * mmInstall( channel )
+ *
+ * Install ARM7 system
+ ******************************************************************************/
+ .global mmInstall
+ .thumb_func
+mmInstall:
+ push {lr}
+
+ ldr r1,=mmInitialized // not initialized until we get soundbank data
+ mov r2, #0 //
+ strb r2, [r1] //
+
+ bl mmSetupComms // setup communication
+
+ b .exit_r3
+
+/******************************************************************************
+ * mmEventForwarder( msg, param )
+ *
+ * Forward event to arm9
+ ******************************************************************************/
+ .thumb_func
+mmEventForwarder:
+
+ push {lr}
+ lsl r1, #8
+ orr r0, r1
+ mov r1, #1
+ lsl r1, #20
+ orr r0, r1
+ bl mmARM9msg
+ pop {pc}
+
+/******************************************************************************
+ * mmGetSoundBank( n_songs, bank )
+ *
+ * Load sound bank address
+ ******************************************************************************/
+ .global mmGetSoundBank
+ .thumb_func
+mmGetSoundBank:
+ ldr r2,=mmModuleCount // save data
+ stmia r2!, {r0,r1} //
+
+ lsl r0, #2 // also sample bank address
+ add r1, r0 //
+ stmia r2!, {r1} //
+
+//------------------------------------------------
+// initialize system
+//------------------------------------------------
+
+ b mmInit7
+
+/******************************************************************************
+ * mmFrame()
+ *
+ * Routine function
+ ******************************************************************************/
+ .global mmFrame
+ .thumb_func
+mmFrame:
+
+ push {lr}
+
+ ldr r0,=mmInitialized // catch not-initialized
+ ldrb r0, [r0] //
+ cmp r0, #42 //
+ bne 1f //
+
+ bl mmMixerPre // <-- critical timing
+
+ ldr r0,=0x4000208 // enable irq
+ mov r1, #1 //
+ strh r1, [r0] //
+
+ bl mmUpdateEffects // update sound effects
+ bl mmPulse // update module playback
+ bl mmMixerMix // update audio
+
+
+ bl mmSendUpdateToARM9
+
+1: bl mmProcessComms // process communications
+
+ ret1
+
+.pool
+
+//-----------------------------------------------------------------------------
+#endif
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+.end
+//-----------------------------------------------------------------------------
+
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Module Processing *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#include "mp_format_mas.inc"
+#include "mp_mas_structs.inc"
+#include "mp_defs.inc"
+#include "mp_macros.inc"
+
+//-----------------------------------------------------------------------------
+#ifdef SYS_GBA
+//-----------------------------------------------------------------------------
+
+#include "mp_mixer_gba.inc"
+#include "swi_gba.inc"
+
+//-----------------------------------------------------------------------------
+#endif
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+#ifdef SYS_NDS
+//-----------------------------------------------------------------------------
+#include "mp_mixer_ds.inc"
+#include "swi_nds.inc"
+//-----------------------------------------------------------------------------
+#endif
+//-----------------------------------------------------------------------------
+
+
+.equ S3M_FREQ_DIVIDER ,57268224 // (s3m,xm,it)
+.equ MOD_FREQ_DIVIDER_PAL ,56750314 // (mod)
+.equ MOD_FREQ_DIVIDER_NTSC ,57272724 // (---)
+
+
+
+/******************************************************************************
+ *
+ * Memory
+ *
+ ******************************************************************************/
+
+
+
+ .BSS
+ .ALIGN 2
+
+/******************************************************************************
+ * mmLayerMain
+ *
+ * Layer data for module playback.
+ ******************************************************************************/
+ .global mmLayerMain
+mmLayerMain: .space MPL_SIZE
+
+/******************************************************************************
+ * mmLayerSub
+ *
+ * Layer data for jingle playback.
+ ******************************************************************************/
+ .global mmLayerSub
+mmLayerSub: .space MPL_SIZE
+
+/******************************************************************************
+ * mpp_vars
+ *
+ * Holds intermediate data during the module processing.
+ ******************************************************************************/
+ .global mpp_vars
+mpp_vars: .space MPV_SIZE
+
+ .ALIGN 2
+
+/******************************************************************************
+ * mpp_layerp
+ *
+ * Pointer to layer data during processing.
+ ******************************************************************************/
+ .global mpp_layerp
+mpp_layerp: .space 4
+
+/******************************************************************************
+ * mpp_channels
+ *
+ * Pointer to channel array during processing
+ ******************************************************************************/
+ .global mpp_channels
+mpp_channels: .space 4
+
+/******************************************************************************
+ * mpp_resolution
+ *
+ * Speed divider for DS timing.
+ ******************************************************************************/
+
+mpp_resolution: .space 4
+
+/******************************************************************************
+ * mm_mastertempo
+ *
+ * Master tempo scaler.
+ ******************************************************************************/
+
+mm_mastertempo: .space 4
+
+/******************************************************************************
+ * mm_masterpitch
+ *
+ * Master pitch scaler.
+ ******************************************************************************/
+
+mm_masterpitch: .space 4
+
+/******************************************************************************
+ * mpp_nchannels
+ *
+ * Number of channels in layer
+ ******************************************************************************/
+ .global mpp_nchannels
+mpp_nchannels: .space 1
+
+/******************************************************************************
+ * mpp_clayer
+ *
+ * Layer selection, 0 = main, 1 = sub
+ ******************************************************************************/
+ .global mpp_clayer
+mpp_clayer: .space 1
+
+/******************************************************************************
+ * mm_achannels, mm_pchannels, mm_num_mch, mm_num_ach, mm_schannels
+ *
+ * Channel data/sizes, don't move these around--see mmInit first
+ ******************************************************************************/
+ .ALIGN 2
+
+.global mm_achannels, mm_pchannels, mm_num_mch, mm_num_ach, mm_schannels
+
+mm_achannels: .space 4
+mm_pchannels: .space 4
+mm_num_mch: .space 4
+mm_num_ach: .space 4
+mm_schannels: .space MP_SCHANNELS*MCH_SIZE
+
+
+
+/******************************************************************************
+ *
+ * Macros
+ *
+ ******************************************************************************/
+
+
+/******************************************************************************
+ * mpp_InstrumentPointer
+ *
+ * Calculate instrument address.
+ * Requires r8 = layer
+ * Returns in r0
+ * Trashes r1, r2
+ ******************************************************************************/
+.macro mpp_InstrumentPointer
+ mov r1, r8
+ ldr r2,[r1,#MPL_SONGADR]
+ ldr r1,[r1,#MPL_INSTTABLE]
+ lsl r0, #2
+ ldr r0,[r1,r0]
+ add r0, r2
+.endm
+
+/******************************************************************************
+ * mpp_SamplePointer
+ *
+ * Calculate sample address.
+ * Requires r8 = layer
+ * Returns in r0
+ * Trashes r1, r2
+ ******************************************************************************/
+.macro mpp_SamplePointer
+ mov r1, r8
+ ldr r2,[r1,#MPL_SONGADR]
+ ldr r1,[r1,#MPL_SAMPTABLE]
+ lsl r0, #2
+ ldr r0,[r1,r0]
+ add r0, r2
+.endm
+
+
+
+/******************************************************************************
+ *
+ * Program
+ *
+ ******************************************************************************/
+
+
+
+ .TEXT
+ .ALIGN 2
+
+/******************************************************************************
+ * mpp_resetchannels(...)
+ *
+ * Reset channel data, and any active channels linked to the layer.
+ * Requires r5 = layer, r6 = channels, r7 = #channels
+ ******************************************************************************/
+ .thumb_func
+mpp_resetchannels:
+
+ push {r4-r6}
+
+ mov r0, r6 // clear channel data to 0
+ mov r1, #MCH_SIZE/4 //
+ mul r1, r7 //
+ mov r2, #0 //
+1: stmia r0!, {r2} //
+ sub r1, #1 //
+ bne 1b //
+
+ mov r0, r6 // reset channel indexes
+ sub r0, #MCH_SIZE-MCH_ALLOC //
+ mov r1, #MCH_SIZE //
+ mul r1, r7 //
+ mov r2, #255 //
+1: strb r2, [r0, r1] //
+ sub r1, #MCH_SIZE //
+ bne 1b //
+
+ GET_MIXCH r4 // reset active channels linked to this layer
+ ldr r6,=mpp_clayer //
+ ldrb r6, [r6] //
+
+#ifdef SYS_GBA // disabled status differs between systems
+ ldr r5,=1<<31 //
+#endif //
+#ifdef SYS_NDS //
+ mov r5, #0 //
+#endif //
+
+ ldr r0,=mm_achannels // r0 = achannels
+ ldr r0, [r0] //
+ ldr r1,=mm_num_ach // r1 = #achannels
+ ldr r1, [r1] //
+ mov r2, #0 // r2 = 0 (for clearing)
+
+.mpic_loop3:
+ ldrb r3, [r0, #MCA_FLAGS] // test if layer matches
+ lsr r3, #6 //
+ cmp r3, r6 //
+ bne .mpic_l3_skip //
+
+ mov r3, #MCA_SIZE-4 // clear achannel data to zero
+.mpic_loop4: //
+ str r2, [r0, r3] //
+ sub r3, r3, #4 //
+ bpl .mpic_loop4 //
+
+ str r5, [r4] // disable mixer channel
+
+.mpic_l3_skip:
+
+ add r0, #MCA_SIZE // increment stuff and loop
+ add r4, #MIXER_CHN_SIZE //
+ //
+ sub r1, #1 //
+ bne .mpic_loop3 //
+
+ pop {r4-r6}
+ bx lr
+
+#ifdef SYS_NDS
+
+/******************************************************************************
+ * mm_reset_channels()
+ *
+ * Reset all channels.
+ ******************************************************************************/
+ .global mm_reset_channels
+ .thumb_func
+mm_reset_channels:
+
+ push {lr}
+
+ ldr r0,=mm_achannels // clear active channel data
+ ldr r0, [r0] //
+ mov r1, #0 //
+ ldr r2,=MCA_SIZE*32/4 //
+ //
+1: stmia r0!, {r1} //
+ sub r2, #1 //
+ bne 1b //
+
+ ldr r0,=mm_pchannels // reset channel allocation
+ ldr r0, [r0] //
+ mov r1, #255 //
+ mov r2, #32 //
+ //
+1: strb r1, [r0, #MCH_ALLOC] //
+ add r0, #MCH_SIZE //
+ sub r2, #1 //
+ bne 1b //
+
+ ldr r0,=mm_schannels // reset channel allocation
+ mov r2, #4 //
+ //
+1: strb r1, [r0, #MCH_ALLOC] //
+ add r0, #MCH_SIZE //
+ sub r2, #1 //
+ bne 1b //
+
+ bl mmResetEffects
+
+ pop {r3}
+ bx r3
+
+#endif
+
+/******************************************************************************
+ * mpp_suspend()
+ *
+ * Suspend main module and associated channels.
+ ******************************************************************************/
+ .thumb_func
+mpp_suspend:
+
+ push {r4,lr}
+ ldr r0,=mm_achannels
+ ldr r0, [r0]
+ GET_MIXCH r1
+ ldr r2,=mm_num_ach
+ ldr r2, [r2]
+ mov r4, #0
+.mpps_loop:
+ ldrb r3, [r0, #MCA_FLAGS]
+ lsr r3, #6
+ bne .mpps_next
+#ifdef SYS_GBA
+ str r4, [r1, #MIXER_CHN_FREQ]
+#else
+ strh r4, [r1, #MIXER_CHN_FREQ]
+ strh r4, [r1, #MIXER_CHN_VOL]
+#endif
+
+.mpps_next:
+ add r0, #MCA_SIZE
+ add r1, #MIXER_CHN_SIZE
+ sub r2, #1
+ bne .mpps_loop
+
+ pop {r4, pc}
+
+/******************************************************************************
+ *
+ * NDS System
+ *
+ ******************************************************************************/
+
+//-----------------------------------------------------------------------------
+#ifdef SYS_NDS
+//-----------------------------------------------------------------------------
+
+/******************************************************************************
+ * mmStart( module_ID, mode )
+ *
+ * Start module playback.
+ *
+ * module_ID : Index of module.
+ * mode : Playback mode.
+ ******************************************************************************/
+ .global mmStart
+ .thumb_func
+mmStart:
+
+ mov r2, #0
+.mpps_backdoor:
+ lsl r0, #2
+ ldr r3,=mmModuleBank
+ ldr r3, [r3]
+ ldr r0, [r3, r0]
+
+ cmp r0, #0
+ beq 1f
+ add r0, #8
+ b mmPlayModule
+1: bx lr
+
+/******************************************************************************
+ * mmJingle( module_ID )
+ *
+ * Play module as jingle.
+ *
+ * module_ID : Index of module
+ ******************************************************************************/
+ .global mmJingle
+ .thumb_func
+mmJingle:
+
+ mov r2, #1
+ mov r1, #MPP_PLAY_ONCE
+ b .mpps_backdoor
+
+//-----------------------------------------------------------------------------
+#endif
+//-----------------------------------------------------------------------------
+
+/******************************************************************************
+ *
+ * GBA System
+ *
+ ******************************************************************************/
+
+//-----------------------------------------------------------------------------
+#ifdef SYS_GBA
+//-----------------------------------------------------------------------------
+
+/******************************************************************************
+ * mmStart( module_ID, mode )
+ *
+ * Start module playback
+ *
+ * module_ID : id of module
+ * mode : mode of playback
+ ******************************************************************************/
+ .global mmStart
+ .thumb_func
+mmStart:
+
+ mov r2, #0
+.mpps_backdoor:
+ push {r2}
+ ldr r2,=mp_solution @ resolve song address
+ ldr r2, [r2]
+ ldrh r3, [r2, #0]
+ lsl r3, #2
+ add r3, #12
+ add r3, r2
+ lsl r0, #2
+ add r0, r3
+ ldr r0, [r0]
+ add r0, r2
+
+ pop {r2}
+
+ add r0, #8
+
+ b mmPlayModule
+1: bx lr
+
+/******************************************************************************
+ * mmJingle( module_ID )
+ *
+ * Start jingle playback
+ *
+ * module_ID : index of module
+ ******************************************************************************/
+ .global mmJingle
+ .thumb_func
+mmJingle:
+
+ mov r2, #1
+ mov r1, #MPP_PLAY_ONCE
+ b .mpps_backdoor
+
+//-----------------------------------------------------------------------------
+#endif
+//-----------------------------------------------------------------------------
+
+/******************************************************************************
+ * mmPlayModule( address, mode, layer )
+ *
+ * Start playing module.
+ ******************************************************************************/
+ .global mmPlayModule
+ .thumb_func
+mmPlayModule:
+
+ push {lr}
+ push {r4-r7}
+
+ ldr r3,=mpp_clayer
+ strb r2, [r3]
+
+ cmp r2, #0
+ bne 1f
+ ldr r5,=mmLayerMain
+ @ldr r6,=mpp_pchannels
+ ldr r6,=mm_pchannels
+ ldr r6,[r6]
+ @mov r7, #MP_MCHANNELS
+ ldr r7,=mm_num_mch
+ ldr r7,[r7]
+ b 2f
+1: ldr r5,=mmLayerSub
+ ldr r6,=mm_schannels
+ mov r7, #MP_SCHANNELS
+2:
+// push {r2}
+
+ mov r2, #MPL_MODE
+ strb r1, [r5, r2]
+
+ mov r4, r0
+ str r4, [r5, #MPL_SONGADR]
+
+ bl mpp_resetchannels
+
+ ldrb r3, [r4, #C_MAS_INSTN]
+ ldrb r2, [r4, #C_MAS_SAMPN]
+ lsl r3, #2
+ lsl r2, #2
+
+ mov r0, r4
+ add r0, #255
+ add r0, #C_MAS_TABLES-255
+
+ str r0, [r5, #MPL_INSTTABLE] @ setup instrument table
+ add r0, r3
+ str r0, [r5, #MPL_SAMPTABLE] @ setup sample table
+ add r0, r2
+ str r0, [r5, #MPL_PATTTABLE] @ setup pattern table
+
+ mov r0, #0 @ set pattern to 0
+
+ @ldr r1,=mpp_setposition
+ @bl mpp_call_r1
+ bl mpp_setposition
+
+ ldrb r0, [r4, #C_MAS_TEMPO] @ load initial tempo
+
+ bl mpp_setbpm
+
+ ldrb r0, [r4, #C_MAS_GV] @ load initial global volume
+
+
+ strb r0, [r5, #MPL_GV]
+
+ ldrb r0, [r4, #C_MAS_FLAGS] @ read song flags
+ strb r0, [r5, #MPL_FLAGS] @ save
+
+ lsl r0, #32-2
+ lsr r0, #32-2+1
+ strb r0, [r5, #MPL_OLDEFFECTS]
+
+ ldrb r0, [r4, #C_MAS_SPEED] @ speed
+ strb r0, [r5, #MPL_SPEED] @ and set
+
+ mov r0, #1 // mpp_playing=true
+ strb r0, [r5, #MPL_ISPLAYING]
+
+ mov r1, #MPL_VALID // set valid flag
+ strb r0, [r5, r1] //
+
+ bl mpp_resetvars
+
+ @ setup channel volumes
+ mov r0, r6
+ add r0, #MCH_CVOLUME
+ mov r3, r7
+ add r4, #C_MAS_CHANVOL
+.cvol_setup:
+ ldrb r1, [r4]
+ strb r1, [r0]
+ add r0, #MCH_SIZE
+ add r4, #1
+ sub r3, #1
+ bne .cvol_setup
+
+ add r4, #32
+ sub r4, r7
+
+ mov r0, r6
+ add r0, #MCH_PANNING
+ mov r3, r7
+.cpan_setup:
+ ldrb r1, [r4]
+ strb r1, [r0]
+ add r0, #MCH_SIZE
+ add r4, #1
+ sub r3, #1
+ bne .cpan_setup
+
+// pop {r2} @ <-- FIX.2 WHY WAS THIS PRESERVED
+
+ pop {r4-r7}
+ pop {r0} @ return
+
+ bx r0 @
+.pool
+
+/******************************************************************************
+ * mmPause()
+ *
+ * Pause module playback.
+ ******************************************************************************/
+ .global mmPause
+ .thumb_func
+mmPause:
+
+ push {lr}
+ push {r5}
+
+ ldr r5,=mmLayerMain
+
+ mov r0, #MPL_VALID
+ ldrb r0, [r5, r0]
+ cmp r0, #0
+ beq 1f
+
+ mov r0, #0
+ strb r0, [r5, #MPL_ISPLAYING]
+
+ bl mpp_suspend
+
+1: pop {r5}
+ ret0
+
+/******************************************************************************
+ * mmResume()
+ *
+ * Resume module playback.
+ ******************************************************************************/
+ .global mmResume
+ .thumb_func
+mmResume:
+
+ ldr r1,=mmLayerMain
+ mov r0, #MPL_VALID
+ ldrb r0, [r1, r0]
+ cmp r0, #0
+ beq 1f
+
+ mov r0, #1
+ strb r0, [r1, #MPL_ISPLAYING]
+1: bx lr
+
+/******************************************************************************
+ * mmActive()
+ *
+ * Returns true if module is playing.
+ ******************************************************************************/
+ .global mmActive
+ .thumb_func
+mmActive:
+
+ ldr r0,=mmLayerMain
+ ldrb r0, [r0, #MPL_ISPLAYING]
+ bx lr
+
+/******************************************************************************
+ * mmActiveSub()
+ *
+ * Returns true if a jingle is playing.
+ ******************************************************************************/
+ .global mmActiveSub
+ .thumb_func
+mmActiveSub:
+
+ ldr r0,=mmLayerSub
+ ldrb r0, [r0, #MPL_ISPLAYING]
+ bx lr
+
+/******************************************************************************
+ * mmSetModuleVolume( volume )
+ *
+ * Set master module volume.
+ *
+ * volume : 0->1024
+ ******************************************************************************/
+ .global mmSetModuleVolume
+ .thumb_func
+mmSetModuleVolume:
+
+@ clamp volume 0->1024
+ lsr r1, r0, #10
+ beq 1f
+ mov r0, #1
+ lsl r0, #10
+
+@ set volume
+1: ldr r1,=mmLayerMain
+ mov r2, #MPL_VOLUME
+ strh r0, [r1, r2]
+ bx lr
+
+/******************************************************************************
+ * mmSetJingleVolume( volume )
+ *
+ * Set master jingle volume.
+ *
+ * volume : 0->1024
+ ******************************************************************************/
+ .global mmSetJingleVolume
+ .thumb_func
+mmSetJingleVolume:
+
+@ clamp volume 0->1024
+ lsr r1, r0, #10
+ beq 1f
+ mov r0, #1
+ lsl r0, #10
+
+@ set volume
+1: ldr r1,=mmLayerSub @mpp_layerB
+ mov r2, #MPL_VOLUME
+ strh r0, [r1, r2]
+ bx lr
+
+/******************************************************************************
+ * mppStop() [[internal function]]
+ *
+ * Stop module playback.
+ ******************************************************************************/
+ .thumb_func
+mppStop:
+
+ push {lr}
+
+ ldr r0,=mpp_clayer
+ ldrb r0, [r0]
+
+ cmp r0, #0
+ beq 1f
+ ldr r5,=mmLayerSub
+ ldr r6,=mm_schannels
+ mov r7, #MP_SCHANNELS
+ b 2f
+1: ldr r5,=mmLayerMain
+ @ldr r6,=mpp_pchannels
+ ldr r6,=mm_pchannels
+ ldr r6,[r6]
+ @mov r7, #MP_MCHANNELS
+ ldr r7,=mm_num_mch
+ ldr r7,[r7]
+2:
+
+ mov r0, #0
+ strb r0, [r5, #MPL_ISPLAYING]
+
+ mov r1, #MPL_VALID
+ strb r0, [r5, r1]
+
+ bl mpp_resetchannels
+ pop {r0}
+ bx r0
+
+/******************************************************************************
+ * mmGetPosition()
+ *
+ * Get playback position
+ ******************************************************************************/
+ .global mmGetPosition
+ .thumb_func
+mmGetPosition:
+
+ ldr r1,=mmLayerMain
+ ldrb r0, [r1, #MPL_POSITION]
+ bx lr
+
+/******************************************************************************
+ * mmPosition( position )
+ *
+ * Set playback position
+ ******************************************************************************/
+ .global mmPosition
+ .thumb_func
+mmPosition:
+
+ push {r4-r7,lr}
+ ldr r5,=mmLayerMain
+ ldr r6,=mm_pchannels
+ ldr r6,[r6]
+ ldr r7,=mm_num_mch
+ ldr r7, [r7]
+
+ push {r0}
+// bl mpp_resetchannels
+
+ pop {r0}
+ bl mpp_setposition
+
+ pop {r4-r7}
+ pop {r3}
+ bx r3
+
+/******************************************************************************
+ * mmSetModuleTempo( tempo )
+ *
+ * Set master tempo
+ *
+ * tempo : x.10 fixed point tempo, 0.5->2.0
+ ******************************************************************************/
+ .global mmSetModuleTempo
+ .thumb_func
+mmSetModuleTempo:
+
+ push {r5,lr}
+
+ mov r1, #1 // clamp value: 512->2048
+ lsl r1, #11 //
+ cmp r0, r1 //
+ ble 1f //
+ mov r0, r1 //
+1: mov r1, #1 //
+ lsl r1, #9 //
+ cmp r0, r1 //
+ bge 1f //
+ mov r0, r1 //
+1:
+
+ ldr r1,=mm_mastertempo
+ str r0, [r1]
+
+ ldr r5,=mmLayerMain
+ ldr r0,=mpp_clayer
+ mov r1, #0
+ strb r1, [r0]
+
+ ldrb r0, [r5, #MPL_BPM]
+ cmp r0, #0
+ beq 1f
+ bl mpp_setbpm
+
+1: pop {r5}
+ pop {r3}
+ bx r3
+
+/******************************************************************************
+ * mmSetModulePitch( pitch )
+ *
+ * Set master pitch
+ *
+ * pitch : x.10 fixed point value, range = 0.5->2.0
+ ******************************************************************************/
+ .global mmSetModulePitch
+ .thumb_func
+mmSetModulePitch:
+ push {r5,lr}
+
+ mov r1, #1 // clamp value: 512->2048
+ lsl r1, #11 //
+ cmp r0, r1 //
+ ble 1f //
+ mov r0, r1 //
+1: mov r1, #1 //
+ lsl r1, #9 //
+ cmp r0, r1 //
+ bge 1f //
+ mov r0, r1 //
+1:
+
+ ldr r1,=mm_masterpitch
+ str r0, [r1]
+
+1: pop {r5}
+ pop {r3}
+ bx r3
+
+.pool
+
+//-----------------------------------------------------------------------------
+#ifdef SYS_NDS7
+//-----------------------------------------------------------------------------
+
+/******************************************************************************
+ * mmSetResolution( divider )
+ *
+ * Set update resolution
+ ******************************************************************************/
+ .global mmSetResolution
+ .thumb_func
+mmSetResolution:
+
+ push {r5, lr}
+
+ ldr r1,=mpp_resolution
+ str r0, [r1]
+
+ ldr r5,=mmLayerMain
+
+ ldr r0,=mpp_clayer
+ mov r1, #0
+ strb r1, [r0]
+
+ ldrb r0, [r5, #MPL_BPM]
+ cmp r0, #0
+ beq 1f
+ bl mpp_setbpm
+1: ldr r5,=mmLayerSub
+
+ ldr r0,=mpp_clayer
+ mov r1, #1
+ strb r1, [r0]
+
+ ldrb r0, [r5, #MPL_BPM]
+ cmp r0, #0
+ beq 1f
+ bl mpp_setbpm
+1: pop {r5}
+ pop {r3}
+ bx r3
+
+#endif
+
+/******************************************************************************
+ * mmStop()
+ *
+ * Stop module playback.
+ ******************************************************************************/
+ .global mmStop
+ .thumb_func
+mmStop:
+
+ push {r4-r7,lr}
+ ldr r1,=mpp_clayer
+ mov r0, #0
+ strb r0, [r1]
+ bl mppStop
+ pop {r4-r7}
+ ret3
+
+/******************************************************************************
+ * mpp_resetvars()
+ *
+ * Reset pattern variables
+ * Input r5 = layer
+ ******************************************************************************/
+ .thumb_func
+mpp_resetvars:
+
+ mov r0, #255
+ strb r0, [r5, #MPL_PATTJUMP]
+ mov r0, #0
+ strb r0, [r5, #MPL_PATTJUMP_ROW]
+ bx lr
+
+/******************************************************************************
+ * mpp_setbpm( bpm )
+ *
+ * Set BPM. bpm = 32..255
+ * Input r5 = layer
+ ******************************************************************************/
+ .thumb_func
+mpp_setbpm:
+
+ strb r0, [r5, #MPL_BPM]
+
+#ifdef SYS_GBA
+
+ ldr r1,=mpp_clayer
+ ldrb r1, [r1]
+ cmp r1, #0
+ bne 1f
+
+ ldr r1,=mm_mastertempo // multiply by master tempo
+ ldr r1, [r1] //
+ mul r1, r0 //
+ lsr r1, #10 //
+
+ ldr r0,=mm_bpmdv @ samples per tick ~= mixfreq / (bpm/2.5) ~= mixfreq*2.5/bpm
+ ldr r0,[r0]
+
+ swi SWI_DIVIDE @ SWI 07h, divide r1/r0
+ lsr r0, #1 @ multiple of two
+ lsl r0, #1 @ ---------------
+ mov r1, #MPL_TICKRATE
+ strh r0, [r5, r1] @
+ mov r1, #MPL_SAMPCOUNT
+// mov r0, #0
+// strh r0, [r5, r1]
+ bx lr @ return
+
+1: @ SUB LAYER, time using vsync (rate = bpm/2.5 / 59.7)
+
+ lsl r0, #15
+ mov r1, #149
+ swi SWI_DIVIDE
+ mov r1, #MPL_TICKRATE
+ strh r0, [r5, r1]
+ bx lr
+
+#endif
+
+#ifdef SYS_NDS
+
+@ vsync = ~59.8261 HZ (says GBATEK)
+@ divider = hz * 2.5 * 64
+
+ ldr r1,=mpp_clayer
+ ldrb r1, [r1]
+ cmp r1, #0
+ bne 1f
+ ldr r1,=mm_mastertempo // multiply by master tempo
+ ldr r1, [r1] //
+ mul r0, r1 //
+// lsr r1, #10 //
+
+ lsl r0, #16+6-10
+ b 2f
+1:
+ lsl r0, #16+6
+2:
+ @ using 60hz vsync for timing
+// lsl r0, #16+6
+ ldr r1,=mpp_resolution
+ ldr r1, [r1]
+ swi SWI_DIVIDE
+ lsr r0, #1
+ mov r1, #MPL_TICKRATE
+ strh r0, [r5, r1]
+ bx lr
+
+#endif
+
+.pool
+
+/******************************************************************************
+ * mpp_setposition( position )
+ *
+ * Set sequence position.
+ * Input r5 = layer
+ ******************************************************************************/
+ .thumb_func
+mpp_setposition:
+
+ push {lr}
+
+mpp_setpositionA:
+
+ strb r0, [r5, #MPL_POSITION]
+
+ ldr r1, [r5, #MPL_SONGADR]
+ mov r3, r1
+ add r1, #C_MAS_ORDER @ get sequence entry
+ ldrb r1, [r1, r0] @
+
+ cmp r1, #254
+ bne .mpsp_skippatt
+ add r0, #1
+ b mpp_setpositionA
+.mpsp_skippatt:
+
+ cmp r1, #255
+ bne .mpsp_endsong
+
+ @ END OF SONG!!! WOOPHEE!!!!
+
+
+ mov r0, #MPL_MODE @mpp_playmode
+ ldrb r0, [r5, r0]
+
+ cmp r0, #MPP_PLAY_ONCE
+ bge 1f
+@ @ its looping:
+ b 3f
+
+1: @ its playing once:
+
+ bl mppStop
+ mov r0, #MPCB_SONGFINISHED
+ ldr r2,=mmCallback
+ ldr r2,[r2]
+ cmp r2, #0
+ beq 3f
+ ldr r1,=mpp_clayer
+ ldrb r1, [r1]
+ bl mpp_call_r2
+
+3:
+
+ ldrb r0, [r5, #MPL_ISPLAYING]
+ cmp r0, #0
+ bne 1f
+
+ pop {pc}
+
+1:
+ ldr r0, [r5, #MPL_SONGADR] @ set position to 'restart'
+ ldrb r0, [r0, #C_MAS_REP]
+ b mpp_setpositionA
+.mpsp_endsong:
+
+ mov r0, r1
+
+ ldr r1, [r5, #MPL_PATTTABLE]
+ lsl r0, #2
+
+ @ r1 = pattern address( in table )
+
+ ldr r1, [r1, r0]
+ add r1, r3 @ add song address
+
+ @ r1 = pattern address
+
+ ldrb r2, [r1] @ set pattern size
+ strb r2, [r5, #MPL_NROWS] @
+
+ mov r2, #0 @ reset tick/row
+ strh r2, [r5, #MPL_TICK]
+ strb r2, [r5, #MPL_FPATTDELAY]
+ strb r2, [r5, #MPL_PATTDELAY]
+
+ mov r0, #MPL_PATTREAD
+ add r1, #1
+ str r1, [r5, r0] @ store pattern data address
+
+ mov r0, #MPL_PLOOP_ADR @ reset pattern loop
+ str r1, [r5, r0]
+ mov r0, #0
+ strb r0, [r5, #MPL_PLOOP_ROW]
+ strb r0, [r5, #MPL_PLOOP_TIMES]
+
+ pop {pc}
+
+//-----------------------------------------------------------------------------
+#ifdef SYS_NDS
+//-----------------------------------------------------------------------------
+
+/******************************************************************************
+ * mppUpdateLayer( layer )
+ *
+ * Update module layer
+ ******************************************************************************/
+ .thumb_func
+mppUpdateLayer:
+
+ push {lr}
+ ldr r1,=mpp_layerp
+ str r0, [r1]
+ mov r1, #MPL_TICKRATE
+ ldrh r1, [r0, r1]
+ mov r2, #MPL_TICKFRAC
+ ldrh r3, [r0, r2]
+ lsl r1, #1
+ add r3, r1
+ strh r3, [r0, r2]
+ lsr r3, #16
+ beq 1f
+2: push {r3}
+
+ bl mppProcessTick
+ pop {r3}
+ sub r3, #1
+ bne 2b
+1: pop {pc}
+
+/******************************************************************************
+ * mmPulse()
+ *
+ * NDS Work Routine
+ ******************************************************************************/
+ .global mmPulse
+ .thumb_func
+mmPulse:
+
+ push {lr}
+
+ ldr r0,=mpp_channels // update main layer
+ ldr r1,=mm_pchannels //
+ ldr r1,[r1] //
+ str r1, [r0] //
+ ldr r0,=mpp_nchannels //
+ ldr r1,=mm_num_mch //
+ ldr r1,[r1] //
+ strb r1, [r0] //
+ ldr r0,=mpp_clayer //
+ mov r1, #0 //
+ strb r1, [r0] //
+ //
+ ldr r0,=mmLayerMain //
+ bl mppUpdateLayer //
+
+ ldr r0,=mpp_channels // update sub layer
+ ldr r1,=mm_schannels //
+ str r1, [r0] //
+ ldr r0,=mpp_nchannels //
+ mov r1, #MP_SCHANNELS //
+ strb r1, [r0] //
+ ldr r0,=mpp_clayer //
+ mov r1, #1 //
+ strb r1, [r0] //
+ //
+ ldr r0,=mmLayerSub //
+ bl mppUpdateLayer //
+
+ pop {pc}
+
+//-----------------------------------------------------------------------------
+#endif
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+#ifdef SYS_GBA
+//-----------------------------------------------------------------------------
+
+/******************************************************************************
+ * mppUpdateSub()
+ *
+ * Update sub-module/jingle, this is bad for some reason...
+ ******************************************************************************/
+ .global mppUpdateSub
+ .thumb_func
+mppUpdateSub:
+
+ ldr r0,=mmLayerSub
+ ldrb r0, [r0, #MPL_ISPLAYING]
+ cmp r0, #0
+ bne .mppus_update
+ bx lr
+.mppus_update:
+
+ ldr r0,=mpp_channels
+ ldr r1,=mm_schannels
+ str r1, [r0]
+ ldr r0,=mpp_nchannels
+ mov r1, #MP_SCHANNELS
+ strb r1, [r0]
+ ldr r0,=mpp_clayer
+ mov r1, #1
+ strb r1, [r0]
+
+ push {lr}
+ ldr r0,=mmLayerSub
+ ldr r1,=mpp_layerp
+ str r0, [r1]
+
+ mov r1, #MPL_TICKRATE
+ ldrh r1, [r0, r1]
+ mov r2, #MPL_TICKFRAC
+ ldrh r3, [r0, r2]
+ lsl r1, #1
+ add r3, r1
+ strh r3, [r0, r2]
+ lsr r3, #16
+ beq 1f
+2: push {r3}
+ ldr r1,=mppProcessTick
+ bl mpp_call_r1
+ pop {r3}
+ sub r3, #1
+ bgt 2b
+1: pop {pc}
+
+//-----------------------------------------------------------------------------
+#endif
+//-----------------------------------------------------------------------------
+
+.pool
+
+//-----------------------------------------------------------------------------
+// IWRAM CODE
+//-----------------------------------------------------------------------------
+#ifdef USE_IWRAM
+ .SECTION ".iwram", "ax", %progbits
+ .ALIGN 2
+#endif
+//-----------------------------------------------------------------------------
+
+/******************************************************************************
+ * mppProcessTick()
+ *
+ * Process module tick.
+ ******************************************************************************/
+.global mppProcessTick @@@@@@@@@@@@@@@@@@
+.thumb_func @@@@ @@@ @@
+ @@@ @@ @@@@@@ @@
+mppProcessTick: @@ @@@ @ @@
+ @@ @@@@@@@ @@@
+ @@@@@@@@@@@@@@@@@
+
+ add r0,pc,#0 // switch to ARM to preserve regs
+ bx r0 //
+.arm //
+ stmfd sp!, {lr} //
+ stmfd sp!, {r4-r10} //
+
+ add r0,pc,#1 // switch back to THUMB
+ bx r0
+.thumb
+
+ ldr r0,=mpp_layerp // test if module is playing
+ ldr r0, [r0] //
+ mov r8, r0 //
+ ldrb r1, [r0, #MPL_ISPLAYING] //
+ cmp r1, #0 //
+ bne 1f //
+ ldr r1,=.mppt_exit //
+ mov pc,r1 //
+1:
+
+@---------------------------------------------------
+@ read pattern data
+@---------------------------------------------------
+
+ ldrb r1, [r0, #MPL_PATTDELAY]
+ cmp r1, #0
+ bne .mpp_pt_skippatternread
+ ldrb r0, [r0, #MPL_TICK]
+ cmp r0, #0
+ bne .mpp_pt_skippatternread
+
+ PROF_START
+ fjump2 mmReadPattern
+ //bl mpp_ReadPattern
+ PROF_END 4
+
+@-----------------------------------------
+.mpp_pt_skippatternread:
+
+ mov r0, r8
+ mov r4, #MPL_MCH_UPDATE
+ ldr r4, [r0, r4]
+
+@---------------------------------------------------
+@ loop through module channels
+@---------------------------------------------------
+
+ ldr r7,=mpp_channels
+ ldr r7, [r7]
+ mov r0, #0
+ mov r10, r0 @ use r10 as channel counter
+ mov r0, r8
+ ldrb r0, [r0, #MPL_TICK]
+ cmp r0, #0
+ bne pchannel_loop_other
+
+@---------------------------------------------------
+pchannel_loop_first:
+@---------------------------------------------------
+ lsr r4, #1
+ bcc pchannel_empty
+ fjump2 mmUpdateChannel_T0
+pchannel_empty:
+ mov r0, #1
+ add r10, r0
+ add r7, #MCH_SIZE
+ cmp r4, #0
+ bne pchannel_loop_first
+ b pchannel_loop_finished
+
+@---------------------------------------------------
+pchannel_loop_other:
+@---------------------------------------------------
+ lsr r4, #1
+ bcc pchannel_empty2
+ #ifdef FOO_UC
+ bl mpp_Update_Channel
+ #else
+ fjump2 mmUpdateChannel_TN
+ #endif
+
+pchannel_empty2:
+ mov r0, #1
+ add r10, r0
+ add r7, #MCH_SIZE
+ cmp r4, #0
+ bne pchannel_loop_other
+
+pchannel_loop_finished:
+
+@---------------------------------------------------
+@ loop through active channels
+@---------------------------------------------------
+ PROF_START
+ ldr r6,=mm_achannels
+ ldr r6, [r6]
+ @ldr r6,=mpp_achannels
+ mov r4, #0
+
+@---------------------------------------------------
+.mpp_pt_achn_loop:
+@---------------------------------------------------
+
+ ldrb r0, [r6, #MCA_TYPE]
+ cmp r0, #ACHN_DISABLED
+ beq .mpp_pt_achn_disabled
+ ldr r0,=mpp_clayer
+ ldrb r0, [r0]
+ ldrb r1, [r6, #MCA_FLAGS]
+ lsr r1, #6
+ cmp r1, r0
+ bne .mpp_pt_achn_next
+
+ ldr r1,=mpp_vars
+ ldrb r0, [r6, #MCA_VOLUME]
+ strb r0, [r1, #MPV_AFVOL]
+ mov r0, #0
+ strh r0, [r1, #MPV_PANPLUS]
+
+ ldr r5, [r6, #MCA_PERIOD]
+
+ bl mpp_Update_ACHN
+
+ b .mpp_pt_achn_next
+
+@---------------------------------------------------
+.mpp_pt_achn_disabled:
+@ mov r0, r4
+@ bl mp_Mixer_StopChannel
+
+@---------------------------------------------------
+.mpp_pt_achn_next:
+@---------------------------------------------------
+
+ ldrb r0, [r6, #MCA_FLAGS]
+ mov r1, #MCAF_UPDATED
+ bic r0, r1
+ strb r0, [r6, #MCA_FLAGS]
+ add r6, #MCA_SIZE
+ add r4, #1
+ ldr r0,=mm_num_ach
+ ldr r0,[r0]
+
+ cmp r4, r0
+@ cmp r4, #MP_NCHANNELS
+ bne .mpp_pt_achn_loop
+@---------------------------------------------------
+ PROF_END 6
+
+
+
+ ldr r1,=mppProcessTick_incframe
+ mov pc,r1
+
+.pool
+
+//-----------------------------------------------------------------------------
+// TEXT Code
+//-----------------------------------------------------------------------------
+ .TEXT
+ .THUMB
+ .ALIGN 2
+//-----------------------------------------------------------------------------
+
+/******************************************************************************
+ * mppProcessTick_incframe [[internal]]
+ ******************************************************************************/
+ .thumb_func
+mppProcessTick_incframe:
+
+@---------------------------------------------------
+@ update tick/row/position
+@---------------------------------------------------
+
+ mov r5, r8 @ get tick#
+ ldrb r1, [r5, #MPL_TICK] @ ..
+ add r1, #1 @ increment
+
+ ldrb r2, [r5, #MPL_SPEED] @ compare with speed
+ cmp r1, r2 @ ..
+ blt .mppt_continuerow @ if less than, continue this row
+
+ ldrb r2, [r5, #MPL_FPATTDELAY]
+ cmp r2, #0
+ beq .mppt_nofpd
+ sub r2, #1
+ strb r2, [r5, #MPL_FPATTDELAY]
+ b .mppt_continuerow
+.mppt_nofpd:
+
+ mov r1, #0 @ .. otherwise clear tick count
+ b .mppt_nextrow @ and advance to next row
+
+.mppt_continuerow: @ continue current row:
+ strb r1, [r5, #MPL_TICK] @ save tick#
+ b .mppt_exit @ exit
+
+.mppt_nextrow: @ advance row
+
+ ldrb r2, [r5, #MPL_PATTDELAY]
+ cmp r2, #0
+ beq .mppt_nopd
+ sub r2, #1
+ strb r2, [r5, #MPL_PATTDELAY]
+ beq .mppt_nopd
+ b .mppt_continuerow
+.mppt_nopd:
+
+ strb r1, [r5, #MPL_TICK] @ save tick# (0)
+ ldrb r1, [r5, #MPL_PATTJUMP]
+ cmp r1, #255
+ beq .mppt_no_pj
+
+ mov r2, #255
+ strb r2, [r5, #MPL_PATTJUMP]
+ mov r0, r1
+ bl mpp_setposition
+
+ ldrb r1, [r5, #MPL_PATTJUMP_ROW]
+ cmp r1, #0
+ beq .mppt_pj_no_offset
+ mov r2, #0
+ strb r2, [r5, #MPL_PATTJUMP_ROW]
+ bl mpph_FastForward
+.mppt_pj_no_offset:
+
+ b .mppt_exit
+
+.mppt_no_pj:
+
+ mov r3, #MPL_PLOOP_JUMP
+ ldrb r1, [r5, r3]
+ cmp r1, #0
+ beq .mppt_no_ploop
+ mov r1, #0
+ strb r1, [r5, r3]
+ ldrb r1, [r5, #MPL_PLOOP_ROW]
+ strb r1, [r5, #MPL_ROW]
+ mov r3, #MPL_PLOOP_ADR
+ ldr r1, [r5, r3]
+
+ mov r3, #MPL_PATTREAD
+ str r1, [r5, r3]
+ b .mppt_exit
+.mppt_no_ploop:
+ ldrb r1, [r5, #MPL_ROW] @ ..
+ add r1, #1 @ increment
+ ldrb r2, [r5, #MPL_NROWS] @
+ add r2, #1
+ cmp r1, r2 @ check with #rows for pattern
+ bne .mppt_continuepattern @ if !=, then continue playing this pattern
+
+.mppt_nextposition: @ advance position
+
+ ldrb r0, [r5, #MPL_POSITION] @ increment position
+ add r0, #1
+
+ bl mpp_setposition
+ b .mppt_exit
+
+.mppt_continuepattern:
+
+ strb r1, [r5, #MPL_ROW] @ save row count
+
+.thumb_func
+.mppt_exit:
+
+ @ switch to arm
+ ldr r0,=.mppt_exita
+ bx r0
+.arm
+.align 2
+.mppt_exita:
+
+ ldmfd sp!, {r4-r10}
+ ldmfd sp!, {r0}
+ bx r0
+.thumb
+
+.pool
+
+//-----------------------------------------------------------------------------
+// IWRAM CODE
+//-----------------------------------------------------------------------------
+#ifdef USE_IWRAM
+ .SECTION ".iwram", "ax", %progbits
+ .ALIGN 2
+#endif
+//-----------------------------------------------------------------------------
+
+/******************************************************************************
+ * mpp_Channel_NewNote()
+ *
+ * Process new note.
+ * Input r7 = pchannel address
+ ******************************************************************************/
+ .global mpp_Channel_NewNote
+ .thumb_func
+mpp_Channel_NewNote:
+
+ @ r7 = pchannel address
+ push {r4,lr}
+
+ ldrb r0, [r7, #MCH_INST] @ get instrument#
+ sub r0, #1
+ bcc .mppt_skipnna
+
+ bl mpp_Channel_GetACHN
+ cmp r6, #0
+ beq .mppt_alloc_channel
+
+ ldrb r0, [r7, #MCH_INST] @ get instrument#
+ sub r0, #1
+
+ mpp_InstrumentPointer
+
+ ldrb r1, [r7, #MCH_BFLAGS] @ fetch NNA
+ lsr r1, #6
+
+ beq .mppt_NNA_CUT @ skip if zero
+
+ ldrb r1, [r0, #C_MASI_DCT] @ otherwise check duplicate check type
+ lsl r1, #32-2
+ lsr r1, #32-2
+ lsl r1, #1 @ jump to mppt_DCT_TABLE[dct]
+ add r1, pc
+ mov pc, r1
+
+.mppt_DCT_TABLE:
+b .mppt_DCNA
+b .mppt_DCT_NOTE
+b .mppt_DCT_SAMP
+b .mppt_DCT_INST
+.mppt_DCT_NOTE: @ DCT note ---------------------
+ ldrb r1, [r7, #MCH_PNOTE] @ get pattern note
+ lsl r1, #1 @ translate to real note
+ add r1, #C_MASI_MAP @ with note/sample map
+ ldrb r1, [r0, r1] @ r1 = real note
+ ldrb r2, [r7, #MCH_NOTE] @ compare with last note
+ cmp r1, r2 @
+ beq .mppt_DCA @ equal? perform DCA
+ b .mppt_DCNA @ otherwise skip
+
+.mppt_DCT_SAMP: @ DCT sample -------------------
+
+ // **WARNING: code not functional with new instrument table
+ ldrb r1, [r7, #MCH_PNOTE] @ get pattern note
+ lsl r1, #1 @ translate to sample#
+ add r1, #C_MASI_MAP+1 @ with note/sample map
+ ldrb r1, [r0, r1] @ r1 = sample#
+ ldrb r2, [r6, #MCA_SAMPLE] @ compare with achn's sample
+ cmp r1, r2 @
+ beq .mppt_DCA @ equal? perform DCA
+ b .mppt_DCNA @ otherwise skip
+
+.mppt_DCT_INST: @ DCT instrument ---------------
+ ldrb r1, [r7, #MCH_INST] @ load instrument
+ ldrb r2, [r6, #MCA_INST] @ compare with active inst
+ cmp r1, r2 @
+ bne .mppt_DCNA @ not equal? skip DCA
+
+.mppt_DCA: @ DUPLICATE CHECK ACTION -------
+ ldrb r1, [r0, #C_MASI_DCA] @ read type
+ cmp r1, #IT_DCA_CUT @ cut?
+ beq .mppt_NNA_CUT @ branch
+ cmp r1, #IT_DCA_OFF @ note-off?
+ beq .mppt_NNA_OFF @ branch
+ b .mppt_NNA_FADE @ note-fade otherwise
+
+.mppt_DCNA:
+
+ ldrb r1, [r7, #MCH_BFLAGS]
+ lsr r1, #6 @ get NNA
+ lsl r1, #1 @ and jump to
+ add r1, pc @ NNA_TABLE[NNA]
+ mov pc, r1
+.mppt_NNA_TABLE:
+b .mppt_NNA_CUT
+b .mppt_NNA_CONTINUE
+b .mppt_NNA_OFF
+b .mppt_NNA_FADE
+
+@---------------------------------------------------------------------------------
+.mppt_NNA_CUT:
+@---------------------------------------------------------------------------------
+
+ #ifdef SYS_NDS // nds supports volume ramping
+
+ ldrb r1, [r6, #MCA_TYPE]
+ cmp r1, #0
+ BEQ .mppt_samechannel
+ mov r1, #ACHN_BACKGROUND
+ strb r1, [r6, #MCA_TYPE]
+ mov r1, #0
+ strb r1, [r6, #MCA_VOLUME]
+ b .mppt_NNA_FINISHED
+
+ #else
+ b .mppt_samechannel
+ #endif
+
+@---------------------------------------------------------------------------------
+.mppt_NNA_CONTINUE:
+@---------------------------------------------------------------------------------
+
+ mov r1, #ACHN_BACKGROUND @ use different channel
+ strb r1, [r6, #MCA_TYPE] @ set active channel to "background"
+ b .mppt_NNA_FINISHED @ finished
+
+@---------------------------------------------------------------------------------
+.mppt_NNA_OFF:
+@---------------------------------------------------------------------------------
+
+ ldrb r1, [r6, #MCA_FLAGS] @ clear KEYON in flags byte
+ mov r2, #MCAF_KEYON
+ bic r1, r2
+
+ strb r1, [r6, #MCA_FLAGS]
+ mov r1, #ACHN_BACKGROUND @ set type to "background"
+ strb r1, [r6, #MCA_TYPE]
+ b .mppt_NNA_FINISHED @ finished
+
+@---------------------------------------------------------------------------------
+.mppt_NNA_FADE:
+@---------------------------------------------------------------------------------
+
+ ldrb r1, [r6, #MCA_FLAGS] @ set NOTE FADE in flags byte
+ mov r2, #MCAF_FADE
+ orr r1, r2
+ strb r1, [r6, #MCA_FLAGS]
+ mov r1, #ACHN_BACKGROUND @ set type to "background"
+ strb r1, [r6, #MCA_TYPE] @
+
+.mppt_NNA_FINISHED:
+
+.mppt_alloc_channel:
+
+ mov r4, r6
+
+ ldr r1,=mmAllocChannel
+ jump1 @ find new active channel
+ strb r0, [r7, #MCH_ALLOC] @ save number
+
+ #ifdef SYS_NDS
+
+ cmp r4, #0
+ beq .mppt_samechannel
+
+ mov r1, #MCA_SIZE @ copy data from previous channel
+ mul r0, r1 @ (for volume ramping wierdness)
+ ldr r1,=mm_achannels @
+ ldr r1,[r1] @
+ add r0, r1 @
+ @
+ mov r2, #MCA_SIZE/4
+1: ldmia r4!, {r1}
+ stmia r0!, {r1}
+ sub r2, #1
+ bne 1b
+
+/* ldr r1, [r4, #MCA_FADE] @
+ str r1, [r0, #MCA_FADE] @
+ ldr r1, [r4, #MCA_ENVC_PAN] @
+ str r1, [r0, #MCA_ENVC_PAN] @
+ ldr r1, [r4, #MCA_AVIB_DEP] @
+ str r1, [r0, #MCA_AVIB_DEP] @
+ ldrb r1, [r4, #MCA_FLAGS] @
+ strb r1, [r0, #MCA_FLAGS] @
+ ldrb r1, [r4, #MCA_VOLUME]
+ strb r1, [r0, #MCA_VOLUME]
+ ldrb r1, [r4, #MCA_PANNING]
+ strb r1, [r0, #MCA_PANNING]
+ ldrb r1, [r4, #MCA_SAMPLE]
+ strb r1, [r0, #MCA_SAMPLE]
+ ldrb r1, [r4, #MCA_INST]
+ strb r1, [r0, #MCA_INST]*/
+
+ #endif
+
+.mppt_samechannel:
+
+.mppt_skipnna:
+ pop {r4}
+ pop {r3}
+ bx r3
+
+.pool
+
+.align 2
+.thumb_func
+@------------------------------------------------------------------------------------------------------
+mpp_Channel_GetACHN:
+@------------------------------------------------------------------------------------------------------
+
+ @ gets the active channel pointer
+ @ and stores in r6
+ @ gives 0 if N/A
+
+ ldrb r0, [r7, #MCH_ALLOC]
+ cmp r0, #255
+ bge 1f
+ ldr r6,=mm_achannels
+ ldr r6,[r6]
+ mov r1, #MCA_SIZE
+ mul r0, r1
+ add r6, r0
+ bx lr
+
+1: mov r6, #0
+ bx lr
+.pool
+
+.align 2
+.thumb_func
+@----------------------------------------------------------------------------------------------------
+mpp_Update_ACHN:
+@----------------------------------------------------------------------------------------------------
+
+@ r5 = affected period
+@ r6 = achannel address
+
+ push {lr} @ enter subroutine
+
+@ check updated flag & exit if already updated
+
+ ldrb r0, [r6, #MCA_FLAGS]
+ mov r1, #MCAF_UPDATED
+ tst r0, r1
+ beq .mpp_achn_update
+ pop {pc}
+
+@--------------------------------------------
+
+ .global mpp_Update_ACHN_notest
+ .thumb_func
+@----------------------------------------------------------------------------------------------------
+mpp_Update_ACHN_notest:
+@----------------------------------------------------------------------------------------------------
+ push {lr}
+
+.mpp_achn_update:
+
+@------------------------------------------------------------------------
+@ Envelope Processing
+@------------------------------------------------------------------------
+
+ ldrb r0, [r6, #MCA_INST]
+ sub r0, #1
+ bCS 1f
+ b .mppt_achn_noinst
+1: mpp_InstrumentPointer
+
+@ get envelope flags
+
+ mov r1, r0
+ ldrb r2, [r1, #C_MASI_ENVFLAGS]
+ add r1, #C_MASI_ENVELOPES
+
+ lsr r2, #1 @ shift out volume envelope bit
+ bcc .mppt_no_volenv
+
+ ldrb r3, [r6, #MCA_FLAGS]
+ lsr r3, #6
+
+ bcs .mppt_achn_ve_enabled
+ ldrb r0, [r1]
+ add r1, r0
+ b .mppt_no_volenv
+.mppt_achn_ve_enabled:
+
+ push {r1, r2}
+
+ ldrh r0, [r6, #MCA_ENVC_VOL]
+ mov r2, r1
+ ldrb r1, [r6, #MCA_ENVN_VOL]
+ bl mpph_ProcessEnvelope
+ strb r1, [r6, #MCA_ENVN_VOL]
+ strh r0, [r6, #MCA_ENVC_VOL]
+ mov r1, r3
+
+ cmp r2, #1
+ bne .mpph_volenv_notend
+ ldrb r0, [r6, #MCA_FLAGS]
+
+ mov r3, r8 @ stupid xm doesn't fade out at envelope end
+ ldrb r3, [r3, #MPL_FLAGS]
+ lsr r3, #C_FLAGS_XS
+
+ mov r3, #MCAF_ENVEND
+ bcs 1f
+ mov r3, #MCAF_ENVEND+MCAF_FADE
+1:
+ orr r0, r3
+ strb r0, [r6, #MCA_FLAGS]
+.mpph_volenv_notend:
+
+ cmp r2, #1
+ blt .mpph_volenv_normal
+
+ @ check keyon and turn on fade...
+ ldrb r0, [r6, #MCA_FLAGS]
+ mov r2, #MCAF_KEYON
+ tst r0, r2
+ bne .mpph_volenv_normal
+.mpph_volenv_notefade:
+ mov r2, #MCAF_FADE
+ orr r0, r2
+ strb r0, [r6, #MCA_FLAGS]
+
+.mpph_volenv_normal:
+
+ ldr r0,=mpp_vars
+ ldrb r2, [r0, #MPV_AFVOL]
+ mul r2, r1
+ lsr r2, #6+6
+ strb r2, [r0, #MPV_AFVOL]
+ pop {r1, r2}
+ ldrb r0, [r1]
+ add r1, r0
+ b .mppt_has_volenv
+.mppt_no_volenv:
+
+ ldrb r0, [r6, #MCA_FLAGS]
+ mov r3, #MCAF_ENVEND
+ orr r0, r3
+ mov r3, #MCAF_KEYON
+ tst r0, r3
+ bne .mppt_has_volenv
+ mov r3, #MCAF_FADE
+ orr r0, r3
+ strb r0, [r6, #MCA_FLAGS]
+
+ mov r0, r8 @ check XM MODE and cut note
+ ldrb r0, [r0, #MPL_FLAGS]
+ lsr r0, #C_FLAGS_XS
+ bcc .mppt_has_volenv
+ mov r0, #0
+ strh r0, [r6, #MCA_FADE]
+.mppt_has_volenv:
+
+ lsr r2, #1
+ bcc .mppt_no_panenv
+ push {r1, r2}
+ ldrh r0, [r6, #MCA_ENVC_PAN]
+ mov r2, r1
+ ldrb r1, [r6, #MCA_ENVN_PAN]
+ bl mpph_ProcessEnvelope
+ strb r1, [r6, #MCA_ENVN_PAN]
+ strh r0, [r6, #MCA_ENVC_PAN]
+ mov r1, r3
+
+ ldr r0,=mpp_vars
+ mov r3, #MPV_PANPLUS
+ ldrsh r2, [r0,r3]
+ lsr r1, #4
+ sub r1, #128
+ add r2, r1
+ strh r2, [r0,r3]
+ pop {r1, r2}
+.mppt_no_panenv:
+
+ lsr r2, #1
+ bcc .mppt_no_pitchenv
+ ldrb r0, [r1, #C_MASIE_FILTER]
+ cmp r0, #0
+ bne .mppt_no_pitchenv
+ push {r1, r2}
+ ldrh r0, [r6, #MCA_ENVC_PIC]
+ mov r2, r1
+ ldrb r1, [r6, #MCA_ENVN_PIC]
+ bl mpph_ProcessEnvelope
+ strb r1, [r6, #MCA_ENVN_PIC]
+ strh r0, [r6, #MCA_ENVC_PIC]
+ mov r1, r3
+ lsr r1, #3
+ sub r1, #255
+ mov r0, r5
+ sub r1, #1
+ bmi .mppt_pitchenv_minus
+#ifdef USE_IWRAM
+ ldr r2,=mpph_LinearPitchSlide_Up
+ jump2
+#else
+ bl mpph_LinearPitchSlide_Up
+#endif
+ b .mppt_pitchenv_plus
+.mppt_pitchenv_minus:
+ neg r1, r1
+#ifdef USE_IWRAM
+ ldr r2,=mpph_LinearPitchSlide_Down
+ jump2
+#else
+ bl mpph_LinearPitchSlide_Down
+#endif
+.mppt_pitchenv_plus:
+ mov r5, r0
+ pop {r1, r2}
+.mppt_no_pitchenv:
+
+ ldrb r0, [r6, #MCA_FLAGS]
+ mov r1, #MCAF_FADE
+ tst r0, r1
+ beq .mppt_achn_nofade
+ ldrb r0, [r6, #MCA_INST]
+ sub r0, #1
+
+ mpp_InstrumentPointer
+ ldrb r0, [r0, #C_MASI_FADE]
+
+ ldrh r1, [r6, #MCA_FADE]
+
+ sub r1, r0
+ bcs .mppt_achn_fadeout_clip
+ mov r1, #0
+.mppt_achn_fadeout_clip:
+ strh r1, [r6, #MCA_FADE]
+
+.mppt_achn_nofade:
+
+.mppt_achn_keyon:
+
+
+@----------------------------------------------------------------------------------
+@ *** PROCESS AUTO VIBRATO
+@----------------------------------------------------------------------------------
+
+ ldrb r0, [r6, #MCA_SAMPLE]
+ sub r0, #1
+ bcc .mppt_achn_nostart @ no sample!!
+
+ @bl mpp_SamplePointer
+ mpp_SamplePointer
+ ldrh r1, [r0, #C_MASS_VIR] @ get av-rate
+ cmp r1, #0 @ 0?
+ beq .mppt_av_disabled @ if 0 then its disabled
+ ldrh r2, [r6, #MCA_AVIB_DEP] @ get depth counter
+ add r2, r1 @ add rate
+ lsr r1, r2, #15 @ check for 15-bit overflow
+ beq .mppt_av_depclip @ ..
+
+ ldr r2,=32768 @ and clamp to 32768
+.mppt_av_depclip:
+ strh r2, [r6, #MCA_AVIB_DEP] @ save depth counter
+ ldrb r1, [r0, #C_MASS_VID] @ get av-depth
+ mul r1, r2 @ multiply
+
+ ldrb r3, [r6, #MCA_AVIB_POS] @ get table position
+ ldrb r2, [r0, #C_MASS_VIS] @ get av-speed
+ add r3, r2 @ add to position
+ lsl r3, #32-8 @ wrap position to 0->255
+ lsr r3, #32-8 @ ..
+ strb r3, [r6, #MCA_AVIB_POS] @ save position
+ ldr r2,=mpp_TABLE_FineSineData @ get table pointer
+ ldrsb r2, [r2, r3] @ load table value at position
+ mul r2, r1 @ multiply with depth
+ asr r2, #23 @ shift value
+ bmi .mppt_av_minus @ and perform slide...
+.mppt_av_plus: @ --slide up
+ mov r1, r2 @ r1 = slide value
+ mov r0, r5 @ r0 = frequency
+#ifdef USE_IWRAM
+ fjump2 mpph_PitchSlide_Up
+#else
+ bl mpph_PitchSlide_Up @ pitch slide
+#endif
+ b .mppt_av_finished @
+.mppt_av_minus: @ --slide down
+ neg r1, r2 @ r1 = slide value
+ mov r0, r5 @ r0 = frequency
+#ifdef USE_IWRAM
+ ldr r2,=mpph_PitchSlide_Down
+ jump2
+#else
+ bl mpph_PitchSlide_Down @ pitch slide
+#endif
+
+.mppt_av_finished:
+ mov r5, r0 @ affect frequency
+.mppt_av_disabled:
+
+@---------------------------------------------------------------------------------
+
+.mppt_achn_noinst:
+
+ push {r4}
+ mov r0, #MIXER_CHN_SIZE
+ mul r4, r0
+ @ldr r0,=mp_channels
+@ ldr r0,=mm_mixchannels
+@ ldr r0,[r0]
+ GET_MIXCH r0
+ add r4, r0
+
+ @ *** UPDATE MIXING INFORMATION
+
+ ldrb r0, [r6, #MCA_FLAGS] @ read flags
+ mov r1, #MCAF_START @ test start bit
+ tst r0, r1 @ ..
+ beq .mppt_achn_nostart @
+.mppt_achn_start: @ START NOTE
+ bic r0, r1 @ clear bit
+ strb r0, [r6, #MCA_FLAGS] @ save flags
+ ldrb r0, [r6, #MCA_SAMPLE] @ get sample #
+
+ sub r0, #1 @ ..
+ bcc .mppt_achn_nostart @ quit if invalid
+ @bl mpp_SamplePointer @ get sample address
+ mpp_SamplePointer
+
+ ldrh r3, [r0, #C_MASS_MSLID]
+
+ add r1,r3,#1 @ msl id == 0xFFFF?
+ lsr r1, #17
+
+ bcc .mppt_achn_msl_sample
+
+.mppt_achn_direct_sample: @ then sample follows
+
+ add r0, #12
+
+//------------------------------------------------
+#ifdef SYS_GBA
+// ldr r1, [r0,#C_SAMPLE_LEN] @ setup mixer (GBA)
+// lsl r1, #MP_SAMPFRAC
+// str r1, [r4,#MIXER_CHN_LEN]
+// ldr r1, [r0,#C_SAMPLE_LOOP]
+// str r1, [r4,#MIXER_CHN_LOOP]
+ add r0, #C_SAMPLE_DATA
+ str r0, [r4,#MIXER_CHN_SRC]
+
+#else
+//-------------------------------------------
+
+ ldr r1,=0x2000000
+ sub r0, r1
+ str r0, [r4, #MIXER_CHN_SAMP]
+ ldrb r1, [r4, #MIXER_CHN_CNT]
+ mov r0, #MIXER_CF_START
+ orr r1, r0
+ strb r1, [r4, #MIXER_CHN_CNT]
+
+#endif
+//-------------------
+
+ b .mppt_achn_gotsample
+.mppt_achn_msl_sample: @ otherwise get from solution
+
+ #ifdef SYS_GBA
+
+ ldr r2,=mp_solution
+ ldr r2, [r2]
+ mov r1, r2
+ add r1, #12
+ lsl r3, #2
+ ldr r1, [r1, r3]
+ add r1, #8
+ add r0, r1, r2
+
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NOTICE, USE LDM HERE
+
+// ldr r1, [r0,#C_SAMPLE_LEN] @ setup mixer (GBA)
+// lsl r1, #MP_SAMPFRAC
+// str r1, [r4,#MIXER_CHN_LEN]
+// ldr r1, [r0,#C_SAMPLE_LOOP]
+// str r1, [r4,#MIXER_CHN_LOOP]
+ add r0, #C_SAMPLE_DATA
+ str r0, [r4,#MIXER_CHN_SRC]
+
+ #endif
+
+ #ifdef SYS_NDS
+
+ ldr r2,=mmSampleBank @ get samplebank pointer
+ ldr r2, [r2]
+ lsl r3, #2 @ add msl_id *4
+ ldr r1, [r2, r3]
+
+ lsl r1, #8 @ mask out counter value
+ lsr r1, #8
+ add r1, #8
+
+ str r1, [r4,#MIXER_CHN_SAMP]
+ ldrb r1, [r4,#MIXER_CHN_CNT] // read control **CNT was cleared, no need to read it
+ mov r0, #MIXER_CF_START // set start bit
+ orr r1, r0
+ strb r1, [r4,#MIXER_CHN_CNT] // save control
+
+ #endif
+
+.mppt_achn_gotsample:
+ ldr r1,=mpp_vars
+ ldrb r1, [r1, #MPV_SAMPOFF]
+#ifdef SYS_GBA
+ lsl r1, #MP_SAMPFRAC+8
+ str r1, [r4, #MIXER_CHN_READ]
+#else
+ str r1, [r4, #MIXER_CHN_READ]
+#endif
+
+.mppt_achn_nostart:
+ @ set pitch
+
+ ldrb r0, [r6, #MCA_SAMPLE] @ get sample#
+ sub r0, #1 @ ..
+ bcc .mppt_achn_setvolumeA
+ @bl mpp_SamplePointer @ quit if invalid
+ mpp_SamplePointer
+ push {r0}
+
+ mov r1, r8
+ ldrb r1, [r1, #MPL_FLAGS]
+ lsr r1, #C_FLAGS_SS
+ bcc .mppt_achn_amigafreqs
+.mppt_achn_linearfreqs:
+
+ ldrh r0, [r0, #C_MASS_FREQ] @ get C5SPEED
+ LSL R0, #2
+ lsr r1, r5, #8 @ do some stuff...
+ mul r1, r0 @ ... period * freq?
+
+ lsr r1, #8
+
+ ldr r0,=mpp_clayer
+ ldrb r0, [r0]
+ cmp r0, #0
+ bne 1f
+ ldr r0,=mm_masterpitch
+ ldr r0, [r0]
+ mul r1, r0
+ lsr r1, #10
+1:
+
+ #ifdef SYS_GBA
+
+
+// ldr r0,=mm_freqscalar
+// ldr r0, [r0]
+ ldr r0,=(4096*65536)/15768
+ mul r0, r1
+ lsr r0, #16
+ str r0, [r4, #MIXER_CHN_FREQ]
+
+ #else
+
+ ldr r0,=MIXER_SCALE
+ mul r0, r1
+ lsr r0, #16+1
+ strh r0, [r4, #MIXER_CHN_FREQ]
+
+ //strh r1, [r4, #MIXER_CHN_FREQ]
+ #endif
+
+ b .mppt_achn_setvolume
+
+.mppt_achn_amigafreqs:
+ ldr r0,=MOD_FREQ_DIVIDER_PAL
+ movs r1, r5
+
+ beq .mppt_achn_setvolume @ 0 is a bad period
+ swi SWI_DIVIDE
+
+ ldr r1,=mpp_clayer
+ ldrb r1, [r1]
+ cmp r1, #0
+ bne 1f
+ ldr r1,=mm_masterpitch
+ ldr r1, [r1]
+ mul r0, r1
+ lsr r0, #10
+1:
+
+ #ifdef SYS_GBA
+
+// ldr r1,=mm_freqscalar
+// ldr r1,[r1]
+ ldr r1,=(4096*65536)/15768
+ mul r0, r1
+ lsr r0, #16
+
+ str r0, [r4, #MIXER_CHN_FREQ]
+ #else
+// mov r1, r0
+// ldr r0,=16756991 @ calculate ds mixer timing
+// swi SWI_DIVIDE
+// neg r0,r0
+ //lsr r0, #5
+ ldr r1,=MIXER_SCALE
+ mul r0, r1
+ lsr r0, #16+1
+ strh r0, [r4, #MIXER_CHN_FREQ]
+ #endif
+
+@----------------------------------------------------------------------------------------------------
+.mppt_achn_setvolume:
+@----------------------------------------------------------------------------------------------------
+
+ @ set volume
+
+ pop {r0}
+ @ <-- stepped oct 28, 3:27pm
+ ldrb r3, [r0, #C_MASS_GV] @ SV, 6-bit
+ ldrb r0, [r6, #MCA_INST]
+ sub r0, #1
+ bcs 1f
+
+.thumb_func
+.mppt_achn_setvolumeA:
+ mov r1, #0
+ b .mppt_achn_badinstrument
+1:
+ mpp_InstrumentPointer
+ ldrb r0, [r0, #C_MASI_GVOL] @ IV, 7-bit
+ mul r3, r0
+
+ ldr r1,=mpp_vars
+ ldrb r0, [r1, #MPV_AFVOL] @ ((CV*VOL)/32*VEV/64) 7-bit
+
+ mul r3, r0
+
+ mov r1, r8 @ get global vollume
+ ldrb r0, [r1, #MPL_FLAGS]
+ lsr r0, #4
+ ldrb r0, [r1, #MPL_GV] @ .. 7-bit
+
+ bcc 1f
+ lsl r0, #1 @ xm mode global volume is only 0->64, shift to 0->128
+
+1: mul r3, r0 @ multiply
+
+ lsr r3, #10
+
+ ldrh r0, [r6, #MCA_FADE]
+
+
+ mul r3, r0
+
+ lsr r3, r3, #10
+
+ mov r0, r8
+ mov r1, #MPL_VOLUME
+ ldrh r0, [r0, r1]
+ mul r3, r0
+
+//------------------------------------------------
+#ifdef SYS_NDS
+ lsr r1, r3, #19-3-5 ///#19-3 (new 16-bit levels!)
+ ldr r3,=65535 //2047
+ cmp r1, r3 @ clip values over 255
+ blt 1f
+ mov r1, r3
+1:
+.mppt_achn_badinstrument:
+// lsr r3, r1, #3 (new 16-bit levels!)
+ lsr r3, r1, #8
+ strb r3, [r6, #MCA_FVOL]
+
+#else
+
+ lsr r1, r3, #19
+ cmp r1, #255 @ clip values over 255
+ blt 1f
+ mov r1, #255
+1:
+.mppt_achn_badinstrument:
+ strb r1, [r6, #MCA_FVOL]
+
+#endif
+
+ cmp r1, #0
+ bne .mppt_achn_audible
+
+ #ifdef SYS_NDS // nds has volume ramping!
+
+ ldrb r3, [r6, #MCA_TYPE]
+ cmp r3, #ACHN_BACKGROUND
+ bne 1f
+ ldrb r3, [r6, #MCA_VOLUME]
+ cmp r3, #0
+ bne 1f
+ ldrh r3, [r4, #MIXER_CHN_CVOL]
+ cmp r3, #0
+ beq .mppt_achn_not_audible
+ #endif
+
+1: ldrb r3, [r6, #MCA_FLAGS]
+ mov r2, #MCAF_ENVEND
+ tst r3, r2
+ beq .mppt_achn_audible
+ mov r2, #MCAF_KEYON
+ tst r3, r2
+ bne .mppt_achn_audible
+
+// #ifdef SYS_NDS
+// ldrh r3, [r4, #MIXER_CHN_CVOL] // nds has volume ramping!!
+// cmp r3, #0
+// bne .mppt_achn_audible
+// #endif
+
+.mppt_achn_not_audible:
+ @ STOP CHANNEL
+
+#ifdef SYS_GBA
+ ldr r0,=1<<31
+ str r0,[r4,#MIXER_CHN_SRC] @ stop mixer channel
+#else
+ mov r0,#0
+ str r0,[r4,#MIXER_CHN_SAMP] @ stop mixer channel
+#endif
+
+ ldrb r3, [r6, #MCA_TYPE]
+ cmp r3, #ACHN_FOREGROUND
+ bne .mpp_achn_noparent
+ ldrb r1, [r6, #MCA_PARENT]
+ mov r3, #MCH_SIZE
+ mul r1, r3
+ ldr r0,=mpp_channels
+ ldr r0, [r0]
+ add r0, r1
+ mov r1, #255
+ strb r1, [r0, #MCH_ALLOC]
+.mpp_achn_noparent:
+
+ mov r1, #ACHN_DISABLED
+ strb r1, [r6, #MCA_TYPE]
+ b .mpp_achn_updated
+.mppt_achn_audible:
+
+#ifdef SYS_NDS
+
+ strh r1, [r4, #MIXER_CHN_VOL]
+
+#else
+
+ strb r1, [r4, #MIXER_CHN_VOL]
+
+#endif
+
+#ifdef SYS_GBA // check if mixer channel has ended
+
+ ldr r0, [r4, #MIXER_CHN_SRC]
+ asr r0, #31
+ beq 1f
+
+#else
+
+ ldr r0, [r4, #MIXER_CHN_SAMP]
+ lsl r0, #8
+ bne 1f
+
+#endif
+
+ ldrb r3, [r6, #MCA_TYPE]
+ cmp r3, #ACHN_FOREGROUND
+ bne 2f
+
+ ldrb r1, [r6, #MCA_PARENT] // stop channel if channel ended
+ mov r3, #MCH_SIZE
+ mul r1, r3
+ ldr r0,=mpp_channels
+ ldr r0, [r0]
+ add r0, r1
+ mov r1, #255
+ strb r1, [r0, #MCH_ALLOC]
+2:
+
+#ifdef SYS_GBA
+ ldr r0,=1<<31
+ str r0,[r4,#MIXER_CHN_SRC] @ stop mixer channel
+#else
+ mov r0,#0
+ str r0,[r4,#MIXER_CHN_SAMP] @ stop mixer channel
+#endif
+
+ mov r1, #ACHN_DISABLED
+ strb r1, [r6, #MCA_TYPE]
+ b .mpp_achn_updated
+
+ @ set panning
+1: ldr r1,=mpp_vars
+ mov r3, #MPV_PANPLUS
+ ldrsh r0, [r1,r3]
+ ldrb r1, [r6, #MCA_PANNING]
+
+ add r1, r0
+
+ cmp r1, #0
+ bge .mpp_achn_clippan1
+ mov r1, #0
+.mpp_achn_clippan1:
+ cmp r1, #255
+ ble .mpp_achn_clippan2
+ mov r1, #255
+.mpp_achn_clippan2:
+
+ #ifdef SYS_NDS
+ lsr r1, #1
+ ldrb r0, [r4, #MIXER_CHN_CNT]
+ lsr r0, #7
+ lsl r0, #7
+ orr r0, r1
+ strb r0, [r4, #MIXER_CHN_CNT]
+ #endif
+
+ #ifdef SYS_GBA
+ strb r1, [r4, #MIXER_CHN_PAN]
+ #endif
+
+
+.mpp_achn_updated:
+ pop {r4}
+ pop {r0}
+ bx r0
+ //pop {pc} @ exit
+.pool
+
+.align 2
+.thumb_func
+@-------------------------------------------------------------------------
+mpph_ProcessEnvelope: @ params={count,node,address}
+@-------------------------------------------------------------------------
+
+@ processes the envelope at <address>
+@ returns:
+@ r0=count
+@ r1=node
+@ r2=exit_code
+@ r3=value*64
+
+ push {r4,r5}
+
+@ get node and base
+ lsl r4, r1, #2
+ add r4, #C_MASIE_NODES
+ add r4, r2
+
+ ldrh r3, [r4, #2]
+ lsl r3, #32-7
+ lsr r3, #32-7-6
+
+@ check for zero count
+
+ cmp r0, #0
+ bne .mpph_pe_between
+.mpph_pe_new:
+
+@ process envelope loop
+
+ ldrb r5, [r2, #C_MASIE_LEND]
+ cmp r1, r5
+ bne 1f
+ ldrb r1, [r2, #C_MASIE_LSTART]
+ mov r2, #2
+ b .mpph_pe_exit
+
+@ process envelope sustain loop
+
+1: ldrb r5, [r6, #MCA_FLAGS]
+ lsr r5, #1 @ locked
+ bcc 1f
+ ldrb r5, [r2, #C_MASIE_SEND]
+ cmp r1, r5
+ bne 1f
+ ldrb r1, [r2, #C_MASIE_SSTART]
+ mov r2, #0
+ b .mpph_pe_exit
+
+@ check for end
+
+1: ldrb r5, [r2, #C_MASIE_NODEC]
+ sub r5, #1
+ cmp r1, r5
+ bne .mpph_count
+ mov r2, #2
+ b .mpph_pe_exit
+
+.mpph_pe_between:
+
+@ delta * count
+@ formula : y = base*2^6 + -----------------
+@ 2^3
+ mov r5, #0
+ ldrsh r5, [r4,r5]
+ mul r5, r0
+ asr r5, #3
+ add r3, r5
+
+.mpph_count:
+
+@ increment count and check if == read count
+
+ add r0, #1
+ ldrh r5, [r4, #2]
+ lsr r5, #7
+ cmp r0, r5
+ bne .mpph_pe_exit
+
+@ increment node and reset counter
+
+ mov r0, #0
+ add r1, #1
+
+.mpph_pe_exit:
+
+ pop {r4,r5}
+ bx lr
+.pool
+
+/*
+.align 2
+.thumb_func
+@--------------------------------------------------------------------------------------------
+mpp_Alloc_Channel:
+@--------------------------------------------------------------------------------------------
+
+ @ find a channel to use
+ @ returns invalid channel if none available
+ push {r4,r5} @ preserve reg(s)
+ ldr r5,=mm_ch_mask
+ ldr r5, [r5]
+
+ @ldr r1,=mpp_achannels @ load pointer
+ ldr r1,=mm_achannels
+ ldr r1,[r1]
+ mov r0, #0 @ load counter
+ mov r2, #255 @ r2 = MAXVOL+1 (highest)
+ add r2, #1
+ mov r3, #255 @ r3 = 255 (none found)
+ b .mppac_start
+
+.mppac_next:
+ add r1, #MCA_SIZE @ change pointer
+ add r0, #1 @ count
+.mppac_start:
+ lsr r5, #1
+ bcs .mppac_check
+ bne .mppac_next
+.mppac_end:
+ mov r0, r3 @ if no disabled channels are found, use lowest volume channel
+.mppac_found:
+
+ pop {r4,r5}
+ bx lr
+
+.mppac_check:
+ ldrb r4, [r1, #MCA_TYPE] @ check active channel type
+ cmp r4, #ACHN_DISABLED @ disabled?
+ beq .mppac_found @ if so, use this channel
+ cmp r4, #ACHN_BACKGROUND @ check if its a background channel
+ bne .mppac_next
+
+ ldrb r4, [r1, #MCA_FVOL] @ compare volumes
+ cmp r4, r2 @
+ bge .mppac_next
+ mov r3, r0 @ save channel#
+ mov r2, r4 @ and volume
+ b .mppac_next
+*/
+
+.pool
+
+@........................................................................................
+
+.thumb_func
+mpp_PatternPointer:
+ mov r1, r8
+ ldr r2,[r1,#MPL_SONGADR]
+ ldr r1,[r1,#MPL_PATTTABLE]
+ lsl r0, #2
+ ldr r0,[r1,r0]
+ add r0, r2
+ bx lr
+.pool
+#ifdef FOO_UC
+.align 2
+.thumb_func
+mpp_GetPeriod:
+ @ r0 = note
+ @ r2 = tuning
+ @ CLOBBERS R1,R3
+ @ RETURN
+ @ r0 = IT/S3M PERIOD
+
+ mov r1, r8
+ ldrb r1, [r1, #MPL_FLAGS]
+ lsr r1, #C_FLAGS_SS
+ bcs .mpp_gp_linear
+.mpp_gp_amiga:
+
+ mov r3, r0
+ ldr r0,=note_table_mod
+ ldrb r1, [r0, r3]
+ sub r0, #3*10
+ lsr r3, #2
+ ldrb r0, [r0, r3]
+
+ @ r0 = octave
+ @ r1 = note
+ lsl r1, #1
+ ldr r3,=ST3_FREQTABLE
+ ldrh r1, [r3, r1]
+
+ ldr r3,=133808
+ mul r1, r3
+ lsr r1, r0
+
+ lsr r0, r1, #3
+ mov r1, r2
+
+ swi SWI_DIVIDE
+ lsl r0, #3
+
+ bx lr
+
+.mpp_gp_linear:
+ ldr r1,=IT_PitchTable
+ lsl r0, #2
+ ldr r0, [r1, r0]
+
+ bx lr
+
+#endif
+
+@=============================================================================
+@ EFFECT MEMORY
+@=============================================================================
+
+.text
+
+mpp_effect_memmap_xm:
+.byte 0,0,0,0,2,3,4,0,0,5,0,6,7,0,0,8,9,10,11,0,0,0,0,12,0,0,0,0,0,0,13
+@ /,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q, R, S,T,U,V,W, X,Y,Z,0,1,2,3
+
+.equ MPP_XM_VFX_MEM_VS, 12 @ $ud
+.equ MPP_XM_VFX_MEM_FVS, 13 @ $ud
+.equ MPP_XM_VFX_MEM_GLIS, 14 @ $0x
+.equ MPP_XM_VFX_MEM_PANSL, 7 @ $lr
+
+mpp_effect_memmap_it:
+.byte 0,0,0,0,2,3,3,0,0,4,5,2,2,0,6,7,8,9,10,11,12,0,0,13,0,14,0
+@ /,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R, S, T, U,V,W, X,Y, Z
+mpp_veffect_memmap_it:
+
+.equ MPP_IT_VFX_MEM, 14
+.equ MPP_GLIS_MEM, 0
+.equ MPP_IT_PORTAMEM, 2
+
+
+@ 0 means custom behavior, or disabled
+
+.align 2
+.thumb_func
+@-----------------------------------------------------------------------------
+mpp_Channel_ExchangeMemory:
+@-----------------------------------------------------------------------------
+
+ @ r0 = effect#
+ @ r1 = param
+
+@ check flags for XM mode
+
+ mov r2, r8
+ ldrb r2, [r2, #MPL_FLAGS]
+ lsr r2, #C_FLAGS_XS
+ bcs 1f
+
+@ IT effects
+
+ ldr r2,=mpp_effect_memmap_it
+ b 2f
+
+1:
+@ XM effects
+
+ ldr r2,=mpp_effect_memmap_xm
+2: ldrb r2, [r2, r0]
+ sub r2, #1
+ bcc 3f
+
+@ if param=0 then load memory value, otherwise save param to memory
+
+ add r2, #MCH_MEMORY
+ cmp r1, #0
+ bne 1f
+ ldrb r1, [r7, r2]
+ strb r1, [r7, #MCH_PARAM]
+1: strb r1, [r7, r2]
+
+3: bx lr
+
+@----------------------------------------------------------
+mpp_Channel_ExchangeGxx:
+@----------------------------------------------------------
+
+ @ r1 = param
+
+
+
+/******************************************************************************
+ *
+ * Volume Commands
+ *
+ ******************************************************************************/
+
+
+
+/******************************************************************************
+ * mpp_Process_VolumeCommand()
+ *
+ * Process volume command
+ ******************************************************************************/
+ .global mpp_Process_VolumeCommand
+ .thumb_func
+mpp_Process_VolumeCommand:
+
+ mov r0, r8
+ ldrb r2, [r0, #MPL_TICK]
+ ldr r0, [r0, #MPL_SONGADR]
+ ldrb r0, [r0, #C_MAS_FLAGS]
+ lsr r0, #4
+ ldrb r0, [r7, #MCH_VOLCMD]
+ bcc .mppuv_it
+ b .mppuv_xm
+.mppuv_it:
+
+@ determine which command to use
+
+ cmp r0, #64
+ ble .mppuv_setvol
+ cmp r0, #84
+ ble .mppuv_fvol
+ cmp r0, #104
+ ble .mppuv_volslide
+ cmp r0, #124
+ ble .mppuv_porta
+ cmp r0, #192
+ ble .mppuv_panning
+ cmp r0, #202
+ ble .mppuv_glissando
+ cmp r0, #212
+ ble .mppuv_vibrato
+.mppuv_exit1:
+ bx lr
+
+.align 2
+@-----------------------------------------------------------------------------------
+.mppuv_setvol: @ SET VOLUME
+@-----------------------------------------------------------------------------------
+
+@ sets volume on tick0
+
+ cmp r2, #0
+ bne .mppuv_setvol_exit
+ strb r0, [r7, #MCH_VOLUME]
+.mppuv_setvol_exit:
+ bx lr @ exit
+
+.align 2
+@-----------------------------------------------------------------------------------
+.mppuv_fvol: @ FINE VOLUME SLIDE UP/DOWN
+@-----------------------------------------------------------------------------------
+
+ cmp r2, #0 @ only slide on tick0
+ bne .mppuv_exit1 @ ..
+ ldrb r1, [r7, #MCH_VOLUME] @ load channel volume
+ mov r2, #MCH_MEMORY+MPP_IT_VFX_MEM
+ cmp r0, #75 @ check slide direction
+ bge .mppuv_fvoldown @ jump to slide down if value is 75+ (75-84 is slide down)
+.mppuv_fvolup: @ ------ slide up ----------
+ sub r0, #65 @ 65->74 , 0->9
+.mppuv_volup: @ ** entry for volume slide up
+ bne 1f @ is value 0?
+ ldrb r0, [r7, r2] @ then fetch value from memory
+1: strb r0, [r7, r2] @ save value
+.mppuv_volupA:
+ add r1, r0 @ add to volume
+ cmp r1, #64 @ clamp to 0->64
+ blt .mppuv_fvol_exit @ ..
+ mov r1, #64 @ ..
+ b .mppuv_fvol_exit @ ..
+.mppuv_fvoldown: @ ------ slide down --------
+ sub r0, #75 @ 75->84 , 0->9
+.mppuv_voldown: @ ** entry for volume slide down
+ bne 1f @ is value 0?
+ ldrb r0, [r7, r2] @ then fetch value from memory
+1: strb r0, [r7, r2] @ save value
+.mppuv_voldownA:
+ sub r1, r0 @ subtract from volume
+ bcs .mppuv_fvol_exit @ check overflow and clamp
+ mov r1, #0 @ ..
+.mppuv_fvol_exit: @ ..
+ strb r1, [r7, #MCH_VOLUME] @ store volume
+.mppuv_exit2:
+ bx lr @ exit function
+
+.align 2
+@----------------------------------------------------------------------------------
+.mppuv_volslide: @ VOLUME SLIDE UP/DOWN
+@----------------------------------------------------------------------------------
+
+ cmp r2, #0 @ only slide on other ticks
+ beq .mppuv_exit1 @ ..
+ ldrb r1, [r7, #MCH_VOLUME] @ get volume
+ cmp r0, #95 @ check slide direction
+ bge .mppuv_vs_down
+.mppuv_vs_up: @ slide up...
+ mov r2, #MCH_MEMORY+MPP_IT_VFX_MEM
+ sub r0, #85 @ 85->94 , 0->9
+ b .mppuv_volup @ branch to function (use fvol code)
+
+.mppuv_vs_down: @ slide down...
+ mov r2, #MCH_MEMORY+MPP_IT_VFX_MEM
+ sub r0, #95 @ 95->104 , 0->9
+ b .mppuv_voldown @ branch to function (use fvol code)
+
+.align 2
+@---------------------------------------------------------------------------------------
+.mppuv_porta: @ PORTAMENTO UP/DOWN
+@---------------------------------------------------------------------------------------
+
+ cmp r2, #0 @ only slide on other ticks
+ beq .mppuv_exit2
+
+ push {lr} @ save return address
+ mov r1, r0 @ get period value
+ mov r0, #MCH_PERIOD
+ ldr r0, [r7, r0]
+
+ cmp r1, #115 @ check slide direction
+ bge .mppuv_porta_up
+.mppuv_porta_down:
+ sub r1, #105 @ map value 0->9
+ lsl r1, #2 @ volume command slides are
+ bne 1f
+ ldrb r1, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
+1: strb r1, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
+ bl mpph_PitchSlide_Down @ equal to normal slides *4
+ b .mppuv_porta_set
+
+.mppuv_porta_up:
+ sub r1, #115 @ slide up...
+ lsl r1, #2
+ bne 1f
+ ldrb r1, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
+1: strb r1, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
+ bl mpph_PitchSlide_Up
+
+.mppuv_porta_set:
+ mov r2, #MCH_PERIOD @ store new period
+ ldr r1, [r7, r2]
+ str r0, [r7, r2]
+ sub r0, r1 @ and edit temp period
+ add r5, r0
+
+ pop {r0}
+ bx r0
+// pop {pc} @ exit
+
+.align 2
+@---------------------------------------------------------------------------------------
+.mppuv_panning: @ SET PANNING
+@---------------------------------------------------------------------------------------
+
+ cmp r2, #0 @ only set on tick 0
+ bne .mppuv_exit1 @ ..
+ sub r0, #128 @ map to 0->64
+ lsl r0, #2
+ cmp r0, #255
+ blt .mppuv_p_store
+ mov r0, #255
+.mppuv_p_store:
+ strb r0, [r7, #MCH_PANNING] @ save to active channel
+.mppuv_p_exit:
+ bx lr @ exit
+
+.align 2
+@---------------------------------------------------------------------------------------
+.mppuv_glissando: @ GLISSANDO
+@---------------------------------------------------------------------------------------
+
+ cmp r2, #0
+ beq .mppuv_p_exit
+
+ sub r0, #193
+ ldr r1,=vcmd_glissando_table
+ ldrb r0, [r1, r0]
+
+ mov r1, r8
+ ldrb r1, [r1, #MPL_FLAGS]
+ lsr r1, #C_FLAGS_GS
+ bcs 2f
+@ single gxx
+
+ cmp r0, #0
+ beq 1f
+ ldrb r0, [r7, #MCH_MEMORY+MPP_GLIS_MEM]
+1: strb r0, [r7, #MCH_MEMORY+MPP_GLIS_MEM]
+ b .mppe_glis_ot
+
+2: @ shared gxx
+
+ cmp r0, #0
+ beq 1f
+ ldrb r0, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
+1: strb r0, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
+ strb r0, [r7, #MCH_MEMORY+MPP_GLIS_MEM]
+
+ b .mppe_glis_ot
+.pool
+
+vcmd_glissando_table:
+.byte 0,1,4,8,16,32,64,96,128,255
+
+.align 2
+@---------------------------------------------------------------------------------------
+.mppuv_vibrato: @ VIBRATO (SPEED)
+@---------------------------------------------------------------------------------------
+
+ @ vibrato... sets speed
+ cmp r2, #0
+ beq .mppuv_vib_exit
+ sub r0, #203
+ beq 1f
+ lsl r0, #2
+ strb r0, [r7, #MCH_VIBSPD]
+1: b mppe_DoVibrato
+.mppuv_vib_exit:
+ bx lr
+
+
+
+/******************************************************************************
+ *
+ * XM Volume Commands
+ *
+ ******************************************************************************/
+
+
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------------
+.mppuv_xm:
+@---------------------------------------------------------------------------------------
+
+@ determine command type
+
+ cmp r0, #0 @ 0 = none
+ beq .mppuv_exit4
+ cmp r0, #0x50
+ ble .mppuv_xm_setvol
+ cmp r0, #0x80
+ blt .mppuv_xm_volslide
+ cmp r0, #0xA0
+ blt .mppuv_xm_fvolslide
+ cmp r0, #0xC0
+ blt .mppuv_xm_vibrato
+ cmp r0, #0xD0
+ blt .mppuv_xm_panning
+ cmp r0, #0xF0
+ blt .mppuv_xm_panslide
+ b .mppuv_xm_toneporta
+
+.align 2
+.thumb_func
+@----------------------------------------------------------------------------------------
+.mppuv_xm_setvol: @ Set Volume
+@----------------------------------------------------------------------------------------
+
+ cmp R2, #0
+ bne .mppuv_exit4
+ sub r0, #0x10
+ strb r0, [r7, #MCH_VOLUME]
+.mppuv_exit4:
+ bx lr
+
+.align 2
+.thumb_func
+@----------------------------------------------------------------------------------------
+.mppuv_xm_volslide: @ Volume Slide
+@----------------------------------------------------------------------------------------
+
+ cmp r2, #0
+ beq .mppuv_exit2
+ ldrb r1, [r7, #MCH_VOLUME]
+ mov r3, #MCH_MEMORY+MPP_XM_VFX_MEM_VS
+ ldrb r2, [r7, r3]
+ cmp r0, #0x70
+ bge .mppuv_xm_volslide_up
+ sub r0, #0x60
+.mppuv_xm_volslide_dn_check:
+ bne 1f
+ mov r0, r2
+ lsl r0, #32-4
+ lsr r0, #32-4
+ b 2f
+1: lsr r2, #4
+ lsl r2, #4
+ orr r2, r0
+ strb r2, [r7, r3]
+2: b .mppuv_voldownA
+
+.mppuv_xm_volslide_up:
+ sub r0, #0x70
+.mppuv_xm_volslide_up_check:
+ bne 1f
+ mov r0, r2
+ lsr r0, #4
+ b 2f
+1: lsl r2, #32-4
+ lsr r2, #32-4
+ lsl r0, #4
+ orr r2, r0
+ lsr r0, #4
+ strb r2, [r7, r3]
+2: b .mppuv_volupA
+
+.align 2
+.thumb_func
+@----------------------------------------------------------------------------------------
+.mppuv_xm_fvolslide: @ Fine Volume Slide
+@----------------------------------------------------------------------------------------
+
+ cmp r2, #0
+ bne .mppuv_exit4
+ ldrb r1, [r7, #MCH_VOLUME]
+ mov r3, #MCH_MEMORY+MPP_XM_VFX_MEM_FVS
+ ldrb r2, [r7, r3]
+ cmp r0, #0x90
+ bge .mppuv_xm_fvolslide_up
+ sub r0, #0x80
+ b .mppuv_xm_volslide_dn_check
+.mppuv_xm_fvolslide_up:
+ sub r0, #0x90
+ b .mppuv_xm_volslide_up_check
+
+.align 2
+.thumb_func
+@----------------------------------------------------------------------------------------
+.mppuv_xm_vibrato: @ Vibrato
+@----------------------------------------------------------------------------------------
+
+ @ xm vibrato
+ @ sets speed or depth
+
+ cmp r2, #0
+ beq .mppuv_xm_vibexit
+ cmp r0, #0xB0
+ bge .mppuv_xm_vibdepth
+
+.mppuv_xm_vibspd:
+ sub r0, #0xA0
+ lsl r0, #2
+ beq 1f
+ strb r0, [r7, #MCH_VIBSPD]
+1: b mppe_DoVibrato
+
+.mppuv_xm_vibdepth:
+ sub r0, #0xB0
+ lsl r0, #3
+ beq 1f
+ strb r0, [r7, #MCH_VIBDEP]
+1: b mppe_DoVibrato
+
+.mppuv_xm_vibexit:
+ bx lr
+
+.align 2
+.thumb_func
+@----------------------------------------------------------------------------------------
+.mppuv_xm_panning: @ Panning
+@----------------------------------------------------------------------------------------
+
+ cmp r2, #0
+ bne .mppuv_exit3
+ sub r0, #0xC0
+ lsl r0, #4
+ cmp r0, #240
+ beq .mppuv_xm_panhack
+ strb r0, [r7, #MCH_PANNING]
+ bx lr
+.mppuv_xm_panhack:
+ mov r0, #255
+ strb r0, [r7, #MCH_PANNING]
+.mppuv_exit3:
+ bx lr
+
+.align 2
+.thumb_func
+@----------------------------------------------------------------------------------------
+.mppuv_xm_panslide: @ Panning Slide
+@----------------------------------------------------------------------------------------
+
+ cmp r2, #0
+ beq .mppuv_exit3
+ ldrb r2, [r7, #MCH_PANNING]
+ ldrb r3, [r7, #MCH_MEMORY + MPP_XM_VFX_MEM_PANSL]
+ cmp r0, #0xE0
+ bge .mppuv_xm_panslide_right
+ sub r0, #0xD0
+ bne 1f
+ lsr r0, r3, #4
+ b 2f
+1: lsl r3, #32-4
+ lsr r3, #32-4
+ lsl r0, #4
+ orr r3, r0
+ lsr r0, #4
+ strb r3, [r7, #MCH_MEMORY + MPP_XM_VFX_MEM_PANSL]
+
+2: lsl r0, #2
+ sub r2, r0
+ bcs .mppuv_xm_panslide_set
+ mov r2, #0
+ b .mppuv_xm_panslide_set
+.mppuv_xm_panslide_right:
+ sub r0, #0xE0
+ bne 1f
+ lsl r0, r3, #32-4
+ lsr r0, #32-4
+ b 2f
+1: lsr r3, #4
+ lsl r3, #4
+ orr r3, r0
+ strb r3, [r7, #MCH_MEMORY + MPP_XM_VFX_MEM_PANSL]
+2: lsl r0, #2
+ add r2, r0
+ cmp r2, #255
+ blt .mppuv_xm_panslide_set
+ mov r2, #255
+.mppuv_xm_panslide_set:
+ strb r2, [r7, #MCH_PANNING]
+ bx lr
+
+.align 2
+.thumb_func
+@-------------------------------------------------------------------------------------
+.mppuv_xm_toneporta: @ Glissando
+@-------------------------------------------------------------------------------------
+
+ @ glissando...
+ @ on nonzero ticks, do a regular glissando slide at speed * 16
+ cmp r2, #0
+ beq 1f
+
+ sub r0, #0xF0
+ lsl r0, #4
+ beq 2f
+ mov r1, #MCH_MEMORY+MPP_XM_VFX_MEM_GLIS
+ strb r0, [r7, r1]
+2: ldrb r0, [r7, r1]
+ mov r1, r0
+
+ b .mppe_glis_backdoor
+
+1: bx lr
+
+
+
+/******************************************************************************
+ *
+ * Module Effects
+ *
+ ******************************************************************************/
+
+
+
+/******************************************************************************
+ * mpp_ProcessEffect()
+ *
+ * Process pattern effect.
+ ******************************************************************************/
+ .global mpp_Process_Effect
+ .thumb_func
+mpp_Process_Effect:
+
+ push {lr}
+ ldrb r0, [r7, #MCH_EFFECT] @ get effect#
+ ldrb r1, [r7, #MCH_PARAM] @ r1 = param
+ bl mpp_Channel_ExchangeMemory
+
+ lsl r0, #1
+
+ pop {r2}
+ mov lr, r2
+
+ mov r2, r8
+ ldrb r2, [r2, #MPL_TICK] @ r2 = tick#
+
+ cmp r2, #0 @ Z flag = tick0 :)
+ add r0, pc
+ mov pc, r0
+
+ b mppe_todo
+ b mppe_SetSpeed
+ b mppe_PositionJump
+ b mppe_PatternBreak
+ b mppe_VolumeSlide
+ b mppe_Portamento
+ b mppe_Portamento
+ b mppe_Glissando
+ b mppe_Vibrato
+ b mppe_todo
+ b mppe_Arpeggio
+ b mppe_VibratoVolume
+ b mppe_PortaVolume
+ b mppe_ChannelVolume
+ b mppe_ChannelVolumeSlide
+ b mppe_SampleOffset
+ b mppe_todo
+ b mppe_Retrigger
+ b mppe_Tremolo @ tremolo
+ b mppe_Extended
+ b mppe_SetTempo
+ b mppe_FineVibrato
+ b mppe_SetGlobalVolume
+ b mppe_GlobalVolumeSlide
+ b mppe_SetPanning
+ b mppe_Panbrello
+ b mppe_ZXX
+ b mppe_SetVolume
+ b mppe_KeyOff
+ b mppe_EnvelopePos
+ b mppe_OldTremor
+.pool
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------
+mppe_SetSpeed: @ EFFECT Axy: SET SPEED
+@---------------------------------------------------------------------------------
+
+ bne .mppe_ss_exit @ dont set on nonzero ticks
+ cmp r1, #0
+ beq .mppe_ss_exit
+ mov r0, r8
+
+ strb r1, [r0, #MPL_SPEED]
+.mppe_ss_exit:
+.thumb_func
+mppe_todo:
+ bx lr @ exit
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------
+mppe_PositionJump: @ EFFECT Bxy: SET POSITION
+@---------------------------------------------------------------------------------
+
+ bne .mppe_pj_exit @ skip nonzero ticks
+ mov r0, r8
+ strb r1, [r0, #MPL_PATTJUMP]
+.mppe_pj_exit:
+ bx lr @ exit
+.pool
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------
+mppe_PatternBreak: @ EFFECT Cxy: PATTERN BREAK
+@---------------------------------------------------------------------------------
+ bne .mppe_pb_exit @ skip nonzero ticks
+ mov r0, r8 @ get variables
+ strb r1, [r0, #MPL_PATTJUMP_ROW] @ save param to row value
+ ldrb r1, [r0, #MPL_PATTJUMP] @ check if pattjump=empty
+ cmp r1, #255 @ 255=empty
+ bne .mppe_pb_exit @ ...
+ ldrb r1, [r0, #MPL_POSITION] @ if empty, set pattjump=position+1
+ add r1, #1
+ strb r1, [r0, #MPL_PATTJUMP]
+.mppe_pb_exit:
+ bx lr @ finished
+.pool
+
+.align 2
+.thumb_func
+@------------------------------------------------------------------------------------------
+mppe_VolumeSlide: @ EFFECT Dxy: VOLUME SLIDE
+@------------------------------------------------------------------------------------------
+
+ push {lr}
+ ldrb r0, [r7, #MCH_VOLUME] @ load volume
+
+ bl mpph_VolumeSlide64
+
+ strb r0, [r7, #MCH_VOLUME] @ save volume
+.mppe_vs_zt:
+ pop {r0}
+ bx r0
+// pop {pc} @ exit
+
+.align 2
+.thumb_func
+@----------------------------------------------------------------------------------
+mppe_Portamento: @ EFFECT Exy/Fxy: Portamento
+@----------------------------------------------------------------------------------
+
+ push {lr}
+
+.mppe_pd_ot:
+ mov r3, #0
+ mov r0, r1
+ lsr r0, #4 @ test for Ex param (Extra fine slide)
+ cmp r0, #0xE @ ..
+.mppe_pd_checkE: @ ..
+ bne .mppe_pd_checkF @ ..
+ cmp r2, #0 @ Extra fine slide: only slide on tick0
+ bne .mppe_pd_exit @ ..
+ lsl r1, #32-4 @ mask out slide value
+ lsr r1, #32-4 @ ..
+ mov r3, #1
+ b .mppe_pd_otherslide @ skip the *4 multiplication
+.mppe_pd_checkF: @ ------------------------------------
+ cmp r0, #0xF @ test for Fx param (Fine slide)
+ bne .mppe_pd_regslide @ ..
+ cmp r2, #0 @ Fine slide: only slide on tick0
+ bne .mppe_pd_exit @ ..
+ lsl r1, #32-4 @ mask out slide value
+ lsr r1, #32-4 @ ..
+ b .mppe_pd_otherslide
+.mppe_pd_regslide:
+ cmp r2, #0
+ beq .mppe_pd_exit
+.mppe_pd_otherslide:
+
+ ldrb r0, [r7, #MCH_EFFECT] @ check slide direction
+ mov r2, #MCH_PERIOD
+ cmp r0, #5 @ .. (5 = portamento down)
+ ldr r0, [r7, r2] @ get period
+
+ bne .mppe_pd_slideup @ branch to function
+.mppe_pd_slidedown: @ -------SLIDE DOWN-------
+
+ cmp r3, #0
+ bne .mppe_pd_fineslidedown
+ bl mpph_PitchSlide_Down
+
+ b .mppe_pd_store @ store & exit
+
+.mppe_pd_fineslidedown:
+ bl mpph_FinePitchSlide_Down
+ b .mppe_pd_store
+
+.mppe_pd_slideup: @ ---------SLIDE UP---------
+
+ cmp r3, #0
+ bne .mppe_pd_fineslideup
+ bl mpph_PitchSlide_Up
+ b .mppe_pd_store
+.mppe_pd_fineslideup:
+ bl mpph_FinePitchSlide_Up
+
+.mppe_pd_store:
+ mov r2, #MCH_PERIOD
+ ldr r1, [r7, #MCH_PERIOD]
+ str r0, [r7, #MCH_PERIOD]
+ sub r0, r1
+ add r5, r0
+.mppe_pd_exit:
+ pop {r0}
+ bx r0 @ exit
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------
+mppe_Glissando: @ EFFECT Gxy: Glissando
+@---------------------------------------------------------------------------------
+
+ bne .mppe_glis_ot
+
+ mov r0, r8
+ ldrb r0, [r0, #MPL_FLAGS]
+ lsr r0, #C_FLAGS_GS
+ bcc 2f
+ @ gxx is shared, IT MODE ONLY!!
+ cmp r1, #0
+ bne 3f
+ ldrb r1, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
+ strb r1, [r7, #MCH_PARAM]
+3: strb r1, [r7, #MCH_MEMORY+MPP_IT_PORTAMEM]
+ strb r1, [r7, #MCH_MEMORY+MPP_GLIS_MEM] @ for simplification later
+ b .mppe_glis_ot
+
+2: @ gxx is separate
+ cmp r1, #0
+ bne 3f
+
+ ldrb r1, [r7, #MCH_MEMORY+MPP_GLIS_MEM]
+ strb r1, [r7, #MCH_PARAM]
+3: strb r1, [r7, #MCH_MEMORY+MPP_GLIS_MEM]
+
+ bx lr
+// b .mppe_glis_exit
+.mppe_glis_ot:
+
+ push {lr} // save return address
+
+ ldrb r1, [r7, #MCH_MEMORY+MPP_GLIS_MEM]
+
+.mppe_glis_backdoor:
+
+ push {r1}
+
+ cmp r6, #0 // exit if no active channel
+ bne 1f //
+ pop {r1,r3} //
+ bx r3 //
+1: //
+
+ ldrb r0, [r6, #MCA_SAMPLE] // get target period
+ sub r0, #1 //
+ mpp_SamplePointer //
+ ldrh r1, [r0, #C_MASS_FREQ] //
+ LSL R1, #2 //
+ ldrb r2, [r7, #MCH_NOTE] //
+ ldr r3,=mmGetPeriod //
+ bl mpp_call_r3 //
+
+ pop {r1} // r1 = parameter
+ push {r0} //
+
+ mov r3, r0 // r3 = target period
+ mov r2, #MCH_PERIOD // r0 = current period
+ ldr r0, [r7, r2] //
+ mov r2, r8 // test S flag
+ ldrb r2, [r2, #MPL_FLAGS] //
+ lsr r2, #C_FLAGS_SS //
+ bCC .mppe_glis_amiga
+ cmp r0, r3
+ blt .mppe_glis_slideup
+ bgt .mppe_glis_slidedown
+.mppe_glis_noslide:
+ pop {r0}
+ pop {r3}
+ bx r3
+
+.mppe_glis_slideup:
+ bl mpph_PitchSlide_Up
+ pop {r1}
+
+ cmp r0, r1
+ blt .mppe_glis_store
+ mov r0, r1
+ b .mppe_glis_store
+.mppe_glis_slidedown:
+ bl mpph_PitchSlide_Down
+ pop {r1}
+ cmp r0, r1
+ bgt .mppe_glis_store
+ mov r0, r1
+.mppe_glis_store:
+
+ mov r2, #MCH_PERIOD
+ ldr r1, [r7, r2] @#MCA_PERIOD]
+ str r0, [r7, r2] @#MCA_PERIOD]
+ sub r0, r1
+ add r5, r0
+
+.mppe_glis_exit:
+ pop {r3}
+ bx r3
+
+
+ //bx lr
+
+.mppe_glis_amiga:
+
+ cmp r0, r3
+ blt .mppe_glis_amiga_up
+ bgt .mppe_glis_amiga_down
+ pop {r0}
+ pop {r3}
+ bx r3
+
+.mppe_glis_amiga_down:
+ bl mpph_PitchSlide_Up
+ pop {r1}
+ cmp r0, r1
+ bgt .mppe_glis_store
+ mov r0, r1
+ b .mppe_glis_store
+.mppe_glis_amiga_up:
+ bl mpph_PitchSlide_Down
+ pop {r1}
+ cmp r0, r1
+ blt .mppe_glis_store
+ mov r0, r1
+ b .mppe_glis_store
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------
+mppe_Vibrato: @ EFFECT Hxy: Vibrato
+@---------------------------------------------------------------------------------
+
+ bne .mppe_v_ot
+ lsr r0, r1, #4 @ if (x != 0) {
+ beq .mppe_v_nospd @ speed = 4*x;
+ lsl r0, #2 @ ..
+ strb r0, [r7, #MCH_VIBSPD] @ ..
+.mppe_v_nospd:
+
+ lsl r0, r1, #32-4 @ if (y != 0) {
+ beq .mppe_v_nodep @ ..
+ lsr r0, #32-6 @ depth = y * 4;
+ mov r1, r8
+ ldrb r1, [r1, #MPL_OLDEFFECTS] @ if(OldEffects)
+ lsl r0, r1 @ depth <<= 1;
+ strb r0, [r7, #MCH_VIBDEP] @
+ b mppe_DoVibrato
+.mppe_v_nodep:
+ BX LR
+
+.align 2
+.thumb_func
+@-------------------------------------------------------
+mppe_DoVibrato:
+@-------------------------------------------------------
+
+.mppe_v_ot:
+ mov r0, r8
+ ldrb r1, [r0, #MPL_TICK]
+ ldrb r0, [r0, #MPL_OLDEFFECTS]
+
+ cmp r0, #0
+ beq .mppe_dv_update
+ cmp r1, #0
+ bne .mppe_dv_update
+
+ push {lr}
+ ldrb r1, [r7, #MCH_VIBPOS]
+ b .mppe_dv_notupdate
+.mppe_dv_update:
+ push {lr}
+ ldrb r0, [r7, #MCH_VIBSPD]
+ ldrb r1, [r7, #MCH_VIBPOS]
+ add r1, r0
+ lsl r1, #32-8
+ lsr r1, #32-8
+ strb r1, [r7, #MCH_VIBPOS]
+.mppe_dv_notupdate:
+ ldr r2,=mpp_TABLE_FineSineData
+ ldrsb r1, [r2, r1]
+ ldrb r0, [r7, #MCH_VIBDEP]
+ mul r1, r0
+ asr r1, #8
+ mov r0, r5
+ cmp r1, #0
+ blt .mppe_dv_negative
+ bl mpph_PitchSlide_Up
+ b .mppe_dv_store
+.mppe_dv_negative:
+ neg r1, r1
+ bl mpph_PitchSlide_Down
+.mppe_dv_store:
+ mov r5, r0
+ pop {r0}
+ bx r0
+// pop {pc} @ return THUMB
+.pool
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------
+mppe_Tremor: @ EFFECT Ixy: Tremor
+@---------------------------------------------------------------------------------
+ bx lr
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------
+mppe_Arpeggio: @ EFFECT Jxy: Arpeggio
+@---------------------------------------------------------------------------------
+
+ bne .mppe_arp_ot
+
+ mov r0, #0
+ strb r0, [r7, #MCH_FXMEM]
+.mppe_arp_ot:
+ cmp r6, #0
+ beq 1f
+ ldrb r0, [r7, #MCH_FXMEM]
+// ldrb r3, [r6, #MCA_SAMPLE] ? ???
+ cmp r0, #1
+ bgt .mppe_arp_2
+ beq .mppe_arp_1
+.mppe_arp_0:
+ mov r0, #1
+ strb r0, [r7, #MCH_FXMEM]
+ @ do nothing! :)
+1: bx lr
+
+.mppe_arp_1:
+
+ mov r0, #2 @ set next tick to '2'
+ strb r0, [r7, #MCH_FXMEM] @ save...
+ mov r0, r5
+ lsr r1, #4 @ mask out high nibble of param
+.mppe_arp_others:
+ mov r2, r5
+ cmp r1, #12 @ see if its >= 12
+ blt .mppea1_12 @ ..
+ add r2, r5 @ add period if so... (octave higher)
+.mppea1_12: @ ..
+ lsl r1, #4 @ *16*hword
+
+ mov r0, r5
+ push {lr}
+ bl mpph_LinearPitchSlide_Up
+
+ mov r5, r0
+ pop {r0}
+ bx r0
+// pop {pc}
+
+.mppe_arp_2:
+ mov r0, #0
+ strb r0, [r7, #MCH_FXMEM]
+ mov r0, r5
+ lsl r1, #32-4
+ lsr r1, #32-4
+ b .mppe_arp_others
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------
+mppe_VibratoVolume: @ EFFECT Kxy: Vibrato+Volume Slide
+@---------------------------------------------------------------------------------
+
+ push {lr}
+ push {r1,r2}
+ bl mppe_DoVibrato
+ pop {r1,r2}
+ cmp r2, #0
+ bl mppe_VolumeSlide
+ pop {r0}
+ bx r0
+// pop {pc}
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------
+mppe_PortaVolume: @ EFFECT Lxy: Portamento+Volume Slide
+@---------------------------------------------------------------------------------
+
+ push {lr}
+ push {r1,r2}
+ ldrb r1, [r7, #MCH_MEMORY+MPP_GLIS_MEM]
+ bl mppe_Glissando
+ pop {r1, r2}
+ cmp r2, #0
+ bl mppe_VolumeSlide
+ pop {r0}
+ bx r0
+// pop {pc}
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------
+mppe_ChannelVolume: @ EFFECT Mxy: Set Channel Volume
+@---------------------------------------------------------------------------------
+
+ bne .mppe_cv_exit @ quite simple...
+ cmp r1, #0x40
+ bgt .mppe_cv_exit @ ignore command if parameter is > 0x40
+ strb r1, [r7, #MCH_CVOLUME]
+.mppe_cv_exit:
+ bx lr
+
+.align 2
+.thumb_func
+@------------------------------------------------------------------------------------
+mppe_ChannelVolumeSlide: @ EFFECT Nxy: Channel Volume Slide
+@------------------------------------------------------------------------------------
+
+ push {lr}
+
+ ldrb r0, [r7, #MCH_CVOLUME] @ load volume
+ bl mpph_VolumeSlide64
+
+ strb r0, [r7, #MCH_CVOLUME] @ save volume
+ pop {r0}
+ bx r0
+// pop {pc} @ exit
+
+.align 2
+.thumb_func
+@----------------------------------------------------------------------------------
+mppe_SampleOffset: @ EFFECT Oxy Sample Offset
+@----------------------------------------------------------------------------------
+
+ bne .mppe_so_exit @ skip on other ticks
+
+ ldr r0,=mpp_vars
+ strb r1, [r0, #MPV_SAMPOFF] @ set offset
+.mppe_so_exit:
+ bx lr
+.pool
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------
+mppe_PanningSlide: @ EFFECT Pxy Panning Slide
+@---------------------------------------------------------------------------------
+
+ push {lr}
+
+ mov r0, #255
+ push {r0}
+ ldrb r0, [r7, #MCH_PANNING] @ load panning
+
+ bl mpph_VolumeSlide
+
+ strb r0, [r7, #MCH_PANNING] @ save panning
+ pop {r0}
+ bx r0
+// pop {pc} @ exit
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------
+mppe_Retrigger: @ EFFECT Qxy Retrigger Note
+@---------------------------------------------------------------------------------
+
+ ldrb r0, [r7, #MCH_FXMEM]
+ cmp r0, #0
+ bne .mppe_retrig_refillN
+.mppe_retrig_refill:
+ lsl r0, r1, #32-4
+ lsr r0, #32-4
+ add r0, #1
+.mppe_retrig_exitcount:
+ strb r0, [r7, #MCH_FXMEM]
+ bx lr
+.mppe_retrig_refillN:
+ sub r0, #1
+ cmp r0, #1
+ bne .mppe_retrig_exitcount
+.mppe_retrig_fire:
+
+ ldrb r2, [r7, #MCH_VOLUME]
+ lsr r0, r1, #4
+ beq .mppe_retrig_v_change0
+ cmp r0, #5
+ ble .mppe_retrig_v_change_sub
+ cmp r0, #6
+ beq .mppe_retrig_v_change_23
+ cmp r0, #7
+ beq .mppe_retrig_v_change_12
+ cmp r0, #8
+ beq .mppe_retrig_v_change0
+ cmp r0, #0xD
+ ble .mppe_retrig_v_change_add
+ cmp r0, #0xE
+ beq .mppe_retrig_v_change_32
+ cmp r0, #0xF
+ beq .mppe_retrig_v_change_21
+.mppe_retrig_v_change_21:
+ lsl r2, #1
+ cmp r2, #64
+ blt .mppe_retrig_finish
+ mov r2, #64
+.mppe_retrig_v_change0:
+ b .mppe_retrig_finish
+.mppe_retrig_v_change_sub:
+ sub r0, #1
+ mov r3, #1
+ lsl r3, r0
+ sub r2, r3
+ bcs .mppe_retrig_finish
+ mov r2, #0
+ b .mppe_retrig_finish
+.mppe_retrig_v_change_23:
+ mov r0, #171
+ mul r2, r0
+ lsr r2, #8
+ b .mppe_retrig_finish
+.mppe_retrig_v_change_12:
+ lsr r2, #1
+ b .mppe_retrig_finish
+.mppe_retrig_v_change_add:
+ sub r0, #9
+ mov r3, #1
+ lsl r3, r0
+ add r2, r3
+ cmp r2, #64
+ blt .mppe_retrig_finish
+ mov r2, #64
+ b .mppe_retrig_finish
+.mppe_retrig_v_change_32:
+ mov r0, #192
+ mul r2, r0
+ lsr r2, #7
+.mppe_retrig_finish:
+ strb r2, [r7, #MCH_VOLUME]
+ cmp r6, #0
+ beq .mppe_retrig_refill
+ ldrb r0, [r6, #MCA_FLAGS]
+ mov r2, #MCAF_START
+ orr r0, r2
+ strb r0, [r6, #MCA_FLAGS]
+ b .mppe_retrig_refill
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------
+mppe_Tremolo: @ EFFECT Rxy: Tremolo
+@---------------------------------------------------------------------------------
+
+@ r1 = param
+@ Z = tick0
+
+ beq .mppe_trem_zt @ skip this part on tick0
+.mppe_trem_ot:
+ @ X = speed, Y = depth
+ ldrb r0, [r7, #MCH_FXMEM] @ get sine position
+ lsr r3, r1, #4 @ mask out SPEED
+ lsl r3, #2 @ speed*4 to compensate for larger sine table
+ add r0, r3 @ add to position
+ strb r0, [r7, #MCH_FXMEM] @ save (value & 255)
+.mppe_trem_zt:
+ ldrb r0, [r7, #MCH_FXMEM] @ get sine position
+ ldr r3,=mpp_TABLE_FineSineData @ load sine table value
+ ldrsb r0, [r3, r0]
+ lsl r1, #32-4 @ mask out DEPTH
+ lsr r1, #32-4
+ mul r0, r1 @ SINE*DEPTH / 64
+ asr r0, #6
+ mov r1, r8
+ ldrb r1, [r1, #MPL_FLAGS]
+ lsr r1, #C_FLAGS_XS
+ bcs 1f
+ asr r0, #1
+1: ldr r1,=mpp_vars @ set volume addition variable
+ strb r0, [r1, #MPV_VOLPLUS]
+ bx lr
+.pool
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------
+mppe_Extended: @ EFFECT Sxy: Extended Effects
+@---------------------------------------------------------------------------------
+
+ lsr r0, r1, #4
+ lsl r0, #1
+ cmp r2, #0
+ add r0, pc
+ mov pc, r0
+
+ @ branch table...
+ b mppex_XM_FVolSlideUp @ S0x
+ b mppex_XM_FVolSlideDown @ S1x
+ b mppex_OldRetrig @ S2x
+ b mppex_VibForm @ S3x
+ b mppex_TremForm @ S4x
+ b mppex_PanbForm @ S5x
+ b mppex_FPattDelay @ S6x
+ b mppex_InstControl @ S7x
+ b mppex_SetPanning @ S8x
+ b mppex_SoundControl @ S9x
+ b mppex_HighOffset @ SAx
+ b mppex_PatternLoop @ SBx
+ b mppex_NoteCut @ SCx
+ b mppex_NoteDelay @ SDx
+ b mppex_PatternDelay @ SEy
+ b mppex_SongMessage @ SFx
+
+.mppe_ex_quit:
+
+@-------------------------------------------
+.thumb_func
+mppex_Unused:
+ bx lr
+
+@-------------------------------------------
+
+.thumb_func
+mppex_XM_FVolSlideUp:
+ bne 2f
+ ldrb r0, [r7, #MCH_VOLUME]
+ lsl r1, #32-4
+ lsr r1, #32-4
+ add r0, r1
+ cmp r0, #64
+ blt 1f
+ mov r0, #64
+1: strb r0, [r7, #MCH_VOLUME]
+2: bx lr
+
+.thumb_func
+mppex_XM_FVolSlideDown:
+ bne 2f
+ ldrb r0, [r7, #MCH_VOLUME]
+ lsl r1, #32-4
+ lsr r1, #32-4
+ sub r0, r1
+ bcs 1f
+ mov r0, #0
+1: strb r0, [r7, #MCH_VOLUME]
+2: bx lr
+
+@-------------------------------------------
+.thumb_func
+mppex_OldRetrig:
+ bne 1f
+ lsl r1, #32-4
+ lsr r1, #32-4
+ strb r1, [r7, #MCH_FXMEM]
+ bx lr
+
+1: ldrb r0, [r7, #MCH_FXMEM]
+ sub r0, #1
+
+ bne 1f
+
+ lsl r0, r1, #32-4
+ lsr r0, #32-4
+ strb r0, [r7, #MCH_FXMEM]
+
+ cmp r6, #0
+ beq 1f
+ ldrb r1, [r6, #MCA_FLAGS]
+ mov r2, #MCAF_START
+
+ orr r1, r2
+ strb r1, [r6, #MCA_FLAGS]
+
+1: strb r0, [r7, #MCH_FXMEM]
+ bx lr
+
+@-------------------------------------------
+.thumb_func
+mppex_VibForm:
+ bx lr
+
+@-------------------------------------------
+.thumb_func
+mppex_TremForm:
+ bx lr
+
+@-------------------------------------------
+.thumb_func
+mppex_PanbForm:
+ bx lr
+
+@-------------------------------------------
+.thumb_func
+mppex_FPattDelay:
+ bne .mppex_fpd_exit
+ lsl r1, #32-4
+ lsr r1, #32-4
+ mov r0, r8
+ strb r1, [r0, #MPL_FPATTDELAY]
+.mppex_fpd_exit:
+ bx lr
+
+@-------------------------------------------
+.thumb_func
+mppex_InstControl:
+ bne .mppex_ic_exit
+ lsl r1, #32-4
+ lsr r1, #32-4
+ cmp r1, #2
+ ble .mppex_ic_pastnotes
+ cmp r1, #6
+ ble .mppex_ic_nna
+ cmp r1, #8
+ ble .mppex_ic_envelope
+ bx lr
+.mppex_ic_pastnotes:
+ @ todo...
+ bx lr
+.mppex_ic_nna:
+ @ overwrite NNA
+ sub r1, #3
+ ldrb r2, [r7, #MCH_BFLAGS]
+ lsl r2, #32-6
+ lsr r2, #32-6
+ lsl r1, #6
+ orr r2, r1
+ strb r2, [r7, #MCH_BFLAGS]
+ bx lr
+.mppex_ic_envelope:
+ cmp r6, #0
+ beq .mppex_ic_exit
+ ldrb r2, [r6, #MCA_FLAGS]
+ mov r0, #32
+ bic r2, r0
+ sub r1, #7
+ lsl r1, #5
+ orr r2, r1
+ strb r2, [r6, #MCA_FLAGS]
+
+.mppex_ic_exit:
+ bx lr
+
+@-------------------------------------------
+.thumb_func
+mppex_SetPanning:
+ lsl r1, #4
+ strb r1, [r7, #MCH_PANNING]
+ bx lr
+
+@-------------------------------------------
+.thumb_func
+mppex_SoundControl:
+ cmp r1, #0x91
+ beq .mppex_sc_surround
+ bx lr
+.mppex_sc_surround:
+ @ set surround
+ bx lr
+
+@-------------------------------------------
+.thumb_func
+mppex_HighOffset:
+ @ todo...
+ bx lr
+
+@-------------------------------------------
+.thumb_func
+mppex_PatternLoop:
+ bne .mppex_pl_exit @ dont update on nonzero ticks
+ mov r2, r8
+
+ lsl r1, #32-4 @ mask low nibble of parameter
+ lsr r1, #32-4 @ ...
+ bne .mppex_pl_not0 @ is zero?
+
+ ldrb r1, [r2, #MPL_ROW] @ ...
+ strb r1, [r2, #MPL_PLOOP_ROW] @ ...
+ ldr r1,=mpp_vars @ ....
+ ldr r1, [r1, #MPV_PATTREAD_P] @ .. ...
+ mov r3, #MPL_PLOOP_ADR
+ str r1, [r2, r3] @ ... ...
+ bx lr @ ... ...
+.mppex_pl_not0: @ otherwise...
+ ldrb r0, [r2, #MPL_PLOOP_TIMES] @ get pattern loop counter
+ cmp r0, #0 @ zero?
+ bne .mppex_pl_active @ if not then its already active
+ strb r1, [r2, #MPL_PLOOP_TIMES] @ zero: save parameter to counter
+ b .mppex_pl_exit_enable @ exit & enable jump
+.mppex_pl_active: @ nonzero:
+ sub r0, #1 @ decrement counter
+ strb r0, [r2, #MPL_PLOOP_TIMES] @ save
+ beq .mppex_pl_exit @ enable jump if not 0
+.mppex_pl_exit_enable:
+ mov r0, #1 @ enable jump
+ mov r3, #MPL_PLOOP_JUMP
+ strb r0, [r2, r3] @ ..
+.mppex_pl_exit: @ exit
+ bx lr @ ....
+.pool
+
+@-------------------------------------------
+.thumb_func
+mppex_NoteCut:
+ lsl r1, #32-4 @ mask parameter
+ lsr r1, #32-4 @ ..
+ cmp r1, r2 @ compare with tick#
+ bne .mppex_nc_exit @ if equal:
+ mov r0, #0 @ cut volume
+ strb r0, [r7, #MCH_VOLUME] @ ..
+.mppex_nc_exit: @ exit
+ bx lr @ ..
+
+@-------------------------------------------
+.thumb_func
+mppex_NoteDelay:
+
+ mov r0, r8
+ ldrb r2, [r0, #MPL_TICK]
+ lsl r1, #32-4
+ lsr r1, #32-4
+ cmp r2, r1
+ bge 1f
+ ldr r0,=mpp_vars
+ strb r1, [r0, #MPV_NOTEDELAY]
+1: bx lr
+
+@-------------------------------------------
+.thumb_func
+mppex_PatternDelay:
+ bne .mppex_pd_quit @ update on tick0
+ lsl r1, #32-4 @ mask parameter
+ lsr r1, #32-4 @ ..
+ mov r0, r8
+ ldrb r2, [r0, #MPL_PATTDELAY] @ get patterndelay
+ cmp r2, #0 @ only update if it's 0
+ bne .mppex_pd_quit @ ..
+ add r1, #1 @ set to param+1
+ strb r1, [r0, #MPL_PATTDELAY] @ ..
+.mppex_pd_quit: @ exit
+ bx lr @ ..
+
+@-------------------------------------------
+.thumb_func
+mppex_SongMessage:
+
+ bne .mppex_pd_quit @ update on tick0
+ push {lr} @ save return address
+ lsl r1, #32-4 @ mask parameter
+ lsr r1, #32-4 @ ..
+ ldr r2,=mmCallback
+ ldr r2, [r2]
+ cmp r2, #0
+ beq 1f
+ mov r0, #MPCB_SONGMESSAGE
+
+ bl mpp_call_r2
+ @jump2
+1: //pop {pc}
+ pop {r0}
+ bx r0
+.pool
+
+.align 2
+.thumb_func
+@----------------------------------------------------------------------------------------
+mppe_SetTempo: @ EFFECT Txy: Set Tempo / Tempo Slide
+@----------------------------------------------------------------------------------------
+
+ @ 0x = slide down
+ @ 1x = slide up
+ @ 2x+ = set
+
+ // BUGGED???
+ // not using setbpm for slides???
+
+ cmp r1, #0x20
+ bge .mppe_st_set
+ cmp r2, #0
+ beq .mppe_st_exit
+
+ mov r0, r8
+ ldrb r2, [r0, #MPL_BPM]
+
+ cmp r1, #0x10
+ bge .mppe_st_slideup
+.mppe_st_slidedown:
+ sub r2, r1
+ cmp r2, #32
+ bge .mppe_st_save
+ mov r2, #32
+.mppe_st_save:
+ mov r0, r2
+ b .mppe_st_set2
+.mppe_st_slideup:
+
+ lsl r1, #32-4
+ lsr r1, #32-4
+
+ add r2, r1
+ cmp r2, #255
+ blt .mppe_st_save
+ mov r2, #255
+ b .mppe_st_save
+.mppe_st_set:
+ cmp r2, #0
+ bne .mppe_st_exit
+ mov r0, r1
+.mppe_st_set2:
+ push {r5,lr}
+ mov r5, r8
+ ldr r1,=mpp_setbpm
+ bl mpp_call_r1
+ @jump1
+ pop {r5}
+ pop {r3}
+ bx r3
+.mppe_st_exit:
+ bx lr
+.pool
+
+.align 2
+.thumb_func
+@----------------------------------------------------------------------------------------
+mppe_FineVibrato: @ EFFECT Uxy: Fine Vibrato
+@----------------------------------------------------------------------------------------
+
+ bne .mppe_fv_ot
+ lsr r0, r1, #4
+ beq .mppe_fv_nospd
+ lsl r0, #2
+ strb r0, [r7, #MCH_VIBSPD]
+.mppe_fv_nospd:
+
+ lsl r0, r1, #32-4
+ beq .mppe_fv_nodep
+// lsr r0, #32 heh...
+ lsr r0, #32-4
+ mov r1, r8
+ ldrb r1, [r1, #MPL_OLDEFFECTS]
+ lsl r0, r1
+ strb r0, [r7, #MCH_VIBDEP]
+.mppe_fv_nodep:
+
+.mppe_fv_ot:
+ b mppe_DoVibrato
+.pool
+
+.align 2
+.thumb_func
+@------------------------------------------------------------------------------------
+mppe_SetGlobalVolume: @ EFFECT Vxy: Set Global Volume
+@------------------------------------------------------------------------------------
+
+ bne .mppe_sgv_exit @ on tick0:
+ mov r0, r8
+ ldrb r2, [r0, #MPL_FLAGS]
+ mov r3, #(1<<(C_FLAGS_XS-1))+(1<<(C_FLAGS_LS-1))
+ tst r2, r3
+ beq 1f
+ mov r2, #0x40
+ b 2f
+1: mov r2, #0x80
+2:
+ cmp r1, r2
+ blt 1f
+ mov r1, r2
+1: strb r1, [r0, #MPL_GV] @ save param to global volume
+.mppe_sgv_exit:
+ bx lr
+.pool
+
+
+.align 2
+.thumb_func
+@----------------------------------------------------------------------------------
+mppe_GlobalVolumeSlide: @ EFFECT Wxy: Global Volume Slide
+@----------------------------------------------------------------------------------
+
+ push {lr}
+
+.mppe_gvs_ot:
+ mov r0, r8
+ ldrb r0, [r0, #MPL_FLAGS]
+ lsr r0, #C_FLAGS_XS
+ bcs 1f
+
+ mov r0, #128
+ b 2f
+
+1: mov r0, #64
+
+2: push {r0}
+ mov r0, r8
+ ldrb r0, [r0, #MPL_GV] @ load global volume
+
+ bl mpph_VolumeSlide @ slide..
+
+ mov r1, r8
+ strb r0, [r1, #MPL_GV] @ save global volume
+ pop {r0}
+ bx r0
+// pop {pc} @ exit
+.pool
+
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------------
+mppe_SetPanning: @ EFFECT Xxy: Set Panning
+@---------------------------------------------------------------------------------------
+
+ bne .mppe_sp_exit @ on tick0:
+ strb r1, [r7, #MCH_PANNING] @ set panning=param
+.mppe_sp_exit:
+ bx lr
+.pool
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------------
+mppe_Panbrello: @ EFFECT Yxy: Panbrello
+@---------------------------------------------------------------------------------------
+
+ @ todo
+ bx lr
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------------
+mppe_ZXX: @ EFFECT Zxy: Set Filter
+@---------------------------------------------------------------------------------
+
+@ ZXX IS NOT SUPPORTED
+ bx lr @ exit
+.pool
+
+@=======================================================================================
+@ OLD EFFECTS
+@=======================================================================================
+
+.align 2
+.thumb_func
+@-----------------------------------------------------------------------------------
+mppe_SetVolume: @ EFFECT 0xx: Set Volume
+@-----------------------------------------------------------------------------------
+
+ bne .mppe_sv_exit @ on tick0:
+ strb r1, [r7, #MCH_VOLUME] @ set volume=param
+.mppe_sv_exit:
+ bx lr
+
+.align 2
+.thumb_func
+@-----------------------------------------------------------------------------------
+mppe_KeyOff: @ EFFECT 1xx: Key Off
+@-----------------------------------------------------------------------------------
+ cmp r1, r2 @ if tick=param:
+ bne .mppe_ko_exit @
+ cmp r6, #0
+ beq .mppe_ko_exit
+ ldrb r0, [r6, #MCA_FLAGS] @ clear keyon from flags
+ mov r1, #MCAF_KEYON @
+ bic r0, r1 @
+ strb r0, [r6, #MCA_FLAGS] @
+.mppe_ko_exit:
+ bx lr @ finished
+.pool
+
+.align 2
+.thumb_func
+@-----------------------------------------------------------------------------------
+mppe_EnvelopePos: @ EFFECT 1xx: Envelope Position
+@-----------------------------------------------------------------------------------
+ bne .mppe_ep_ot @ on tick0:
+ cmp r6, #0
+ beq .mppe_ep_ot
+
+ @ - NOT SUPPORTED ANYMORE -
+
+@ strh r1, [r6, #MCA_ENVP_VOL] @ set volume envelope position
+@ strh r1, [r6, #MCA_ENVP_PAN] @ set panning envelope positin
+ @ pitch envelope wasn't invented yet
+.mppe_ep_ot:
+ bx lr @ finished
+
+.align 2
+.thumb_func
+@-----------------------------------------------------------------------------------
+mppe_OldTremor: @ EFFECT 3xy: Old Tremor
+@-----------------------------------------------------------------------------------
+
+ bne .mppe_ot_ot
+ bx lr
+.mppe_ot_ot:
+ ldrb r0, [r7, #MCH_FXMEM]
+ cmp r0, #0
+ bne .mppe_ot_old
+.mppe_ot_new:
+ ldrb r0, [r7, #MCH_BFLAGS+1]
+ mov r3, #0b110
+ eor r0, r3
+ strb r0, [r7, #MCH_BFLAGS+1]
+ lsr r0, #3
+ bcc .mppe_ot_low
+ lsr r1, #4
+ add r1, #1
+ strb r1, [r7, #MCH_FXMEM]
+ b .mppe_ot_apply
+.mppe_ot_low:
+ lsl r1, #32-4
+ lsr r1, #32-4
+ add r1, #1
+ strb r1, [r7, #MCH_FXMEM]
+ b .mppe_ot_apply
+
+.mppe_ot_old:
+ sub r0, #1
+ strb r0, [r7, #MCH_FXMEM]
+
+.mppe_ot_apply:
+ ldrb r2, [r7, #MCH_BFLAGS+1]
+
+ lsr r2, #3
+ bcs .mppe_ot_cut
+ mov r1, #-64&255
+ ldr r2,=mpp_vars
+ strb r1, [r2, #MPV_VOLPLUS]
+.mppe_ot_cut:
+ bx lr
+
+@===============================================================================
+@ FUNCTIONS!!
+@===============================================================================
+
+.align 2
+.thumb_func
+@--------------------------------------------------------------------------
+mpph_PitchSlide_Down: @ Linear/Amiga slide down
+@--------------------------------------------------------------------------
+
+ @ r0 = period
+ @ r1 = slide value (/4)
+ mov r2, r8
+ ldrb r2, [r2, #MPL_FLAGS]
+ lsr r2, #C_FLAGS_SS
+ bcc .mpph_psd_amiga
+ b .mpph_psd
+
+.thumb_func
+@--------------------------------------------------------------------------
+mpph_LinearPitchSlide_Down: @ Linear slide down
+@--------------------------------------------------------------------------
+
+ mov r2, r8
+ ldrb r2, [r2, #MPL_FLAGS]
+ lsr r2, #C_FLAGS_SS
+ bcc .mpph_psu
+.mpph_psd:
+ ldr r2,=mpp_TABLE_LinearSlideDownTable
+.mpph_psd_fine:
+ lsl r1, #1
+ ldrh r1, [r2, r1]
+ lsr r0, #5
+ mul r0, r1
+ lsr r0, #16 -5
+.mpph_psd_clip:
+ cmp r0, #0
+ bge .mpph_psd_clipdone
+ mov r0, #0
+.mpph_psd_clipdone:
+ bx lr
+.mpph_psd_amiga:
+ lsl r1, #4
+.mpph_psd_amiga_fine:
+ add r0, r1
+ lsr r1, r0, #16+5
+ beq .mpph_psd_clipdone
+ mov r0, #1
+ lsl r0, #16+5
+ b .mpph_psd_clip
+
+.align 2
+.thumb_func
+@--------------------------------------------------------------------------
+mpph_PitchSlide_Up: @ Linear/Amiga slide up
+@--------------------------------------------------------------------------
+
+ @ r0 = period
+ @ r1 = slide value (/4)
+
+ mov r2, r8
+ ldrb r2, [r2, #MPL_FLAGS]
+ lsr r2, #C_FLAGS_SS
+ bcc .mpph_psu_amiga
+ b .mpph_psu
+.thumb_func
+mpph_LinearPitchSlide_Up: @ Linear slide up
+ mov r2, r8
+ ldrb r2, [r2, #MPL_FLAGS]
+ lsr r2, #C_FLAGS_SS
+ bcc .mpph_psd
+.mpph_psu:
+ ldr r2,=mpp_TABLE_LinearSlideUpTable
+ mov r3, r0
+ cmp r1, #192
+ blt .mpph_psu_notdouble
+ add r3, r3
+.mpph_psu_notdouble:
+.mpph_psu_fine:
+ lsl r1, #1
+ ldrh r1, [r2, r1]
+ lsr r0, #5
+ mul r0, r1
+ lsr r0, #16-5
+ add r0, r3
+.mpph_psu_clip:
+ mov r1, r0
+ lsr r1, #16+5
+ beq .mpph_psu_clipped
+ mov r0, #1
+ lsl r0, #16+5
+.mpph_psu_clipped:
+ bx lr
+.mpph_psu_amiga:
+ lsl r1, #4
+.mpph_psu_amiga_fine:
+ sub r0, r1
+ bcs .mpph_psu_clipped
+ mov r0, #0
+ bx lr
+
+.align 2
+.thumb_func
+@---------------------------------------------------------------------------
+mpph_FinePitchSlide_Up:
+@---------------------------------------------------------------------------
+
+ @ r0 = period
+ @ r1 = slide value (0-15)
+ mov r2, r8
+ ldrb r2, [r2, #MPL_FLAGS]
+ lsr r2, #C_FLAGS_SS
+ bcc .mpph_fpsu_amiga
+ ldr r2,=mpp_TABLE_FineLinearSlideUpTable
+ mov r3, r0
+ b .mpph_psu_fine
+.mpph_fpsu_amiga:
+ lsl r1, #2
+ b .mpph_psu_amiga_fine
+
+.align 2
+.thumb_func
+@-----------------------------------------------------------------------------------
+mpph_FinePitchSlide_Down:
+@-----------------------------------------------------------------------------------
+
+ @ r0 = period
+ @ r1 = slide value (0-15)
+
+ mov r2, r8
+ ldrb r2, [r2, #MPL_FLAGS]
+ lsr r2, #C_FLAGS_SS
+ bcc .mpph_fpsd_amiga
+ ldr r2,=mpp_TABLE_FineLinearSlideDownTable
+ b .mpph_psd_fine
+.mpph_fpsd_amiga:
+ lsl r1, #2
+ b .mpph_psd_amiga_fine
+.pool
+
+@-----------------------------------------------------------------------------------
+
+.text
+.align 2
+.thumb_func
+@-----------------------------------------------------------------------------------
+mpph_FastForward:
+@-----------------------------------------------------------------------------------
+
+ @ r1 = #rows to skip
+ cmp r1, #0
+ bne .mpph_ff
+.mpph_ff_exitf:
+ bx lr
+.mpph_ff:
+
+ mov r0, r8
+ ldrb r2, [r0, #MPL_NROWS]
+ add r2, #1
+ cmp r1, r2
+ bge .mpph_ff_exitf
+ strb r1, [r0, #MPL_ROW]
+ push {r7,lr}
+ ldr r7,=mmReadPattern //mpp_ReadPattern
+.mpph_ff_loop:
+ push {r1,r7}
+ bl mpp_call_r7
+ pop {r1,r7}
+ sub r1, #1
+ bne .mpph_ff_loop
+
+ pop {r7}
+ pop {r0}
+ bx r0
+// pop {pc}
+.pool
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ IWRAM CODE @
+@ @
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+.align 2
+.thumb_func
+@-----------------------------------------------------------------------------
+mpph_VolumeSlide64:
+@-----------------------------------------------------------------------------
+
+ mov r3, #64
+ push {r3}
+
+.thumb_func
+@-----------------------------------------------------------------------------
+mpph_VolumeSlide:
+@-----------------------------------------------------------------------------
+
+ @ r0 = volume
+ @ r1 = paramter
+ @ r2 = tick#
+ @ stack:1 = max volume
+
+ mov r3, r8
+ ldrb r3, [r3, #MPL_FLAGS]
+ lsr r3, #C_FLAGS_XS
+ bcs .mpph_vs_XM
+
+ cmp r1, #0x0F @ is value 15?
+ bne .mpph_vs_hack1 @ then only slide on tick0
+ b .mpph_vs_fsub
+.mpph_vs_hack1:
+ cmp r1, #0xF0 @ is value 15?
+ bne .mpph_vs_hack2 @ then only slide on tick0
+ cmp r2, #0 @ ..
+ bne .mpph_vs_exit @ ..
+ b .mpph_vs_fadd
+.mpph_vs_hack2:
+
+ mov r3, r1 @ test for Dx0
+ lsl r3, #32-4 @ ..
+ bne .mpph_vs_next1 @ ..
+.mpph_vs_add: @ Dx0: (used for DxF too)
+ cmp r2, #0
+ beq .mpph_vs_exit
+.mpph_vs_fadd:
+ lsr r1, #4 @ fix value
+ add r0, r1 @ add to volume
+ pop {r1}
+ cmp r0, r1 @ clip values past 64
+ blt .mpph_vs_exit2 @ ..
+ mov r0, r1 @ ..
+ b .mpph_vs_exit2 @ ..
+.mpph_vs_next1: @---------------------
+ mov r3, r1 @ test for D0x
+ lsr r3, #4 @ ..
+ bne .mpph_vs_next2 @ ..
+.mpph_vs_sub: @ D0x:
+ cmp r2, #0
+ beq .mpph_vs_exit
+.mpph_vs_fsub:
+ lsl r1, #32-4 @ mask value
+ lsr r1, #32-4 @ ..
+
+ sub r0, r1 @ subtract from volume
+ bcs .mpph_vs_exit @ clip values under 0
+ mov r0, #0 @ ..
+ b .mpph_vs_exit @ ..
+.mpph_vs_next2: @---------------------
+ cmp r2, #0 @ fine slides now... only slide on tick0
+ bne .mpph_vs_exit @ ..
+
+ mov r3, r1 @ test for DxF
+ lsl r3, #32-4 @ ..
+ lsr r3, #32-4
+ cmp r3, #0x0F @ ..
+ beq .mpph_vs_fadd @ branch
+
+ mov r3, r1 @ test for DFx
+ lsr r3, #4 @ ..
+ cmp r3, #0x0F @ ..
+ beq .mpph_vs_fsub @ branch
+.mpph_vs_exit:
+
+ pop {r1}
+
+.mpph_vs_exit2:
+ bx lr @ exit if all fail
+
+.mpph_vs_XM:
+ cmp r2, #0
+ beq .mpph_vs_exit
+
+ lsr r3, r1, #4
+ lsl r1, #32-4
+ lsr r1, #32-4
+ sub r3, r1
+ add r0, r3
+ pop {r1}
+ cmp r0, r1
+ blt .mpph_vsxm_testlow
+ mov r0, r1
+.mpph_vsxm_testlow:
+ cmp r0, #0
+ bgt .mpph_vs_exit2
+ mov r0, #0
+ bx lr
+.pool
+
+@==========================================================================================
+@ TABLES
+@==========================================================================================
+
+.TEXT
+
+.align 2
+/******************************************************************************
+ * ST3_FREQTABLE
+ *
+ * LUT for amiga periods.
+ ******************************************************************************/
+ .global ST3_FREQTABLE
+ST3_FREQTABLE:
+
+.hword 1712*8, 1616*8, 1524*8, 1440*8, 1356*8, 1280*8, 1208*8, 1140*8, 1076*8, 1016*8, 960*8, 907*8 @ MORE ACCURACY SCALARS
+
+@middle octave is 4.
+@
+@ 133808 * ( period(NOTE) >> octave )
+@ note_st3period = --------------------------------------------
+@ middle_c_finetunevalue(INSTRUMENT)
+@
+
+.align 2
+@-------------------------------------------------------------------------------------------
+mpp_TABLE_LinearSlideUpTable: @ value = 2^(val/192), 16.16 fixed
+@-------------------------------------------------------------------------------------------
+
+.hword 0, 237, 475, 714, 953 @ 0->4 @ ADD 1.0
+.hword 1194, 1435, 1677, 1920, 2164 @ 5->9
+.hword 2409, 2655, 2902, 3149, 3397 @ 10->14
+.hword 3647, 3897, 4148, 4400, 4653 @ 15->19
+.hword 4907, 5157, 5417, 5674, 5932 @ 20->24
+.hword 6190, 6449, 6710, 6971, 7233 @ 25->29
+.hword 7496, 7761, 8026, 8292, 8559 @ 30->34
+.hword 8027, 9096, 9366, 9636, 9908 @ 35->39
+.hword 10181, 10455, 10730, 11006, 11283 @ 40->44
+.hword 11560, 11839, 12119, 12400, 12682 @ 45->49
+.hword 12965, 13249, 13533, 13819, 14106 @ 50->54
+.hword 14394, 14684, 14974, 15265, 15557 @ 55->59
+.hword 15850, 16145, 16440, 16737, 17034 @ 60->64
+.hword 17333, 17633, 17933, 18235, 18538 @ 65->69
+.hword 18842, 19147, 19454, 19761, 20070 @ 70->74
+.hword 20379, 20690, 21002, 21315, 21629 @ 75->79
+.hword 21944, 22260, 22578, 22897, 23216 @ 80->84
+.hword 23537, 23860, 24183, 24507, 24833 @ 85->89
+.hword 25160, 25488, 25817, 26148, 26479 @ 90->94
+.hword 26812, 27146, 27481, 27818, 28155 @ 95->99
+.hword 28494, 28834, 29175, 29518, 29862 @ 100->104
+.hword 30207, 30553, 30900, 31248, 31599 @ 105->109
+.hword 31951, 32303, 32657, 33012, 33369 @ 110->114
+.hword 33726, 34085, 34446, 34807, 35170 @ 115->119
+.hword 35534, 35900, 36267, 36635, 37004 @ 120->124
+.hword 37375, 37747, 38121, 38496, 38872 @ 125->129
+.hword 39250, 39629, 40009, 40391, 40774 @ 130->134
+.hword 41158, 41544, 41932, 42320, 42710 @ 135->139
+.hword 43102, 43495, 43889, 44285, 44682 @ 140->144
+.hword 45081, 45481, 45882, 46285, 46690 @ 145->149
+.hword 47095, 47503, 47917, 48322, 48734 @ 150->154
+.hword 49147, 49562, 49978, 50396, 50815 @ 155->159
+.hword 51236, 51658, 52082, 52507, 52934 @ 160->164
+.hword 53363, 53793, 54224, 54658, 55092 @ 165->169
+.hword 55529, 55966, 56406, 56847, 57289 @ 170->174
+.hword 57734, 58179, 58627, 59076, 59527 @ 175->179
+.hword 59979, 60433, 60889, 61346, 61805 @ 180->184
+.hword 62265, 62727, 63191, 63657, 64124 @ 185->189
+.hword 64593, 65064, 0, 474, 950 @ 190->194 @ ADD 2.0 w/ 192+
+.hword 1427, 1906, 2387, 2870, 3355 @ 195->199
+.hword 3841, 4327, 4818, 5310, 5803 @ 200->204
+.hword 6298, 6795, 7294, 7794, 8296 @ 205->209
+.hword 8800, 9306, 9814, 10323, 10835 @ 210->214
+.hword 11348, 11863, 12380, 12899, 13419 @ 215->219
+.hword 13942, 14467, 14993, 15521, 16051 @ 220->224
+.hword 16583, 17117, 17653, 18191, 18731 @ 225->229
+.hword 19273, 19817, 20362, 20910, 21460 @ 230->234
+.hword 22011, 22565, 23121, 23678, 24238 @ 235->239
+.hword 24800, 25363, 25929, 25497, 27067 @ 240->244
+.hword 27639, 28213, 28789, 29367, 29947 @ 245->249
+.hword 30530, 31114, 31701, 32289, 32880 @ 250->254
+.hword 33473, 34068 @ 255->256
+
+.align 2
+@-------------------------------------------------------------------------------------
+mpp_TABLE_LinearSlideDownTable: @ value = 2^(-val/192), 16.16 fixed
+@-------------------------------------------------------------------------------------
+
+.hword 65535, 65300, 65065, 64830, 64596, 64364, 64132, 63901 @ 0->7
+.hword 63670, 63441, 63212, 62984, 62757, 62531, 62306, 62081 @ 8->15
+.hword 61858, 61635, 61413, 61191, 60971, 60751, 60532, 60314 @ 16->23
+.hword 60097, 59880, 59664, 59449, 59235, 59022, 58809, 58597 @ 24->31
+.hword 58386, 58176, 57966, 57757, 57549, 57341, 57135, 56929 @ 32->39
+.hword 56724, 56519, 56316, 56113, 55911, 55709, 55508, 55308 @ 40->47
+.hword 55109, 54910, 54713, 54515, 54319, 54123, 53928, 53734 @ 48->55
+.hword 53540, 53347, 53155, 52963, 52773, 52582, 52393, 52204 @ 56->63
+.hword 52016, 51829, 51642, 51456, 51270, 51085, 50901, 50718 @ 64->71
+.hword 50535, 50353, 50172, 49991, 49811, 49631, 49452, 49274 @ 72->79
+.hword 49097, 48920, 48743, 48568, 48393, 48128, 48044, 47871 @ 80->87
+.hword 47699, 47527, 47356, 47185, 47015, 46846, 46677, 46509 @ 88->95
+.hword 46341, 46174, 46008, 45842, 45677, 45512, 45348, 45185 @ 96->103
+.hword 45022, 44859, 44698, 44537, 44376, 44216, 44057, 43898 @104->111
+.hword 43740, 43582, 43425, 43269, 43113, 42958, 42803, 42649 @112->119
+.hword 42495, 42342, 42189, 42037, 41886, 41735, 41584, 41434 @120->127
+.hword 41285, 41136, 40988, 40840, 40639, 40566, 40400, 40253 @128->135
+.hword 40110, 39965, 39821, 39678, 39535, 39392, 39250, 39109 @136->143
+.hword 38968, 38828, 38688, 38548, 38409, 38271, 38133, 37996 @144->151
+.hword 37859, 37722, 37586, 37451, 37316, 37181, 37047, 36914 @152->159
+.hword 36781, 36648, 36516, 36385, 36254, 36123, 35993, 35863 @160->167
+.hword 35734, 35605, 35477, 35349, 35221, 35095, 34968, 34842 @168->175
+.hword 34716, 34591, 34467, 34343, 34219, 34095, 33973, 33850 @176->183
+.hword 33728, 33607, 33486, 33365, 33245, 33125, 33005, 32887 @184->191
+.hword 32768, 32650, 32532, 32415, 32298, 32182, 32066, 31950 @192->199
+.hword 31835, 31720, 31606, 31492, 31379, 31266, 31153, 31041 @200->207
+.hword 30929, 30817, 30706, 30596, 30485, 30376, 30226, 30157 @208->215
+.hword 30048, 29940, 29832, 29725, 29618, 29511, 29405, 29299 @216->223
+.hword 29193, 29088, 28983, 28879, 28774, 28671, 28567, 28464 @224->231
+.hword 28362, 28260, 28158, 28056, 27955, 27855, 27754, 27654 @232->239
+.hword 27554, 27455, 27356, 27258, 27159, 27062, 26964, 26867 @240->247
+.hword 26770, 26674, 26577, 26482, 26386, 26291, 26196, 26102 @248->255
+.hword 26008 @ 256
+
+/******************************************************************************
+ * IT_PitchTable
+ *
+ * LUT for linear periods.
+ ******************************************************************************/
+ .global IT_PitchTable
+ .align 2
+IT_PitchTable:
+
+.hword 2048, 0, 2170, 0, 2299, 0, 2435, 0, 2580, 0, 2734, 0 @ C-0
+.hword 2896, 0, 3069, 0, 3251, 0, 3444, 0, 3649, 0, 3866, 0 @>B-0
+
+.hword 4096, 0, 4340, 0, 4598, 0, 4871, 0, 5161, 0, 5468, 0 @ C-1
+.hword 5793, 0, 6137, 0, 6502, 0, 6889, 0, 7298, 0, 7732, 0 @>B-1
+
+.hword 8192, 0, 8679, 0, 9195, 0, 9742, 0, 10321, 0, 10935, 0 @ octave 2
+.hword 11585, 0, 12274, 0, 13004, 0, 13777, 0, 14596, 0, 15464, 0
+
+.hword 16384, 0, 17358, 0, 18390, 0, 19484, 0, 20643, 0, 21870, 0 @ octave 3
+.hword 23170, 0, 24548, 0, 26008, 0, 27554, 0, 29193, 0, 30929, 0
+
+.hword 32768, 0, 34716, 0, 36781, 0, 38968, 0, 41285, 0, 43740, 0 @ octave 4
+.hword 46341, 0, 49097, 0, 52016, 0, 55109, 0, 58386, 0, 61858, 0
+
+.hword 0, 1, 3897, 1, 8026, 1, 12400, 1, 17034, 1, 21944, 1 @ octave 5
+.hword 27146, 1, 32657, 1, 38496, 1, 44682, 1, 51236, 1, 58179, 1
+
+.hword 0, 2, 7794, 2, 16051, 2, 24800, 2, 34068, 2, 43888, 2 @ octave 6
+.hword 54292, 2, 65314, 2, 11456, 3, 23828, 3, 36936, 3, 50823, 3
+
+.hword 0, 4, 15588, 4, 32103, 4, 49600, 4, 2601, 5, 22240, 5 @ octave 7
+.hword 43048, 5, 65092, 5, 22912, 6, 47656, 6, 8336, 7, 36110, 7
+
+.hword 0, 8, 31176, 8, 64205, 8, 33663, 9, 5201, 10, 44481, 10 @ octave 8
+.hword 20559, 11, 64648, 11, 45823, 12, 29776, 13, 16671, 14, 6684, 15
+
+.hword 0, 16, 62352, 16, 62875, 17, 1790, 19, 10403, 20, 23425, 21 @ octave 9
+.hword 41118, 22, 63761, 23, 26111, 25, 59552, 26, 33342, 28, 13368, 30
+
+.align 2
+@-------------------------------------------------------------------------------------
+mpp_TABLE_FineLinearSlideUpTable:
+@-------------------------------------------------------------------------------------
+
+.hword 0, 59, 118, 178, 237 @ 0->4 ADD 1x
+.hword 296, 356, 415, 475, 535 @ 5->9
+.hword 594, 654, 714, 773, 833 @ 10->14
+.hword 893 @ 15
+
+.align 2
+@-------------------------------------------------------------------------------------
+mpp_TABLE_FineLinearSlideDownTable:
+@-------------------------------------------------------------------------------------
+
+.hword 65535, 65477, 65418, 65359, 65300, 65241, 65182, 65359 @ 0->7
+.hword 65065, 65006, 64947, 64888, 64830, 64772, 64713, 64645 @ 8->15
+
+@-------------------------------------------------------------------------------------
+mpp_TABLE_FineSineData:
+@-------------------------------------------------------------------------------------
+
+.byte 0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 16, 17, 19, 20, 22, 23
+.byte 24, 26, 27, 29, 30, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44
+.byte 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59
+.byte 59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 64
+.byte 64, 64, 64, 64, 64, 64, 63, 63, 63, 62, 62, 62, 61, 61, 60, 60
+.byte 59, 59, 58, 57, 56, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46
+.byte 45, 44, 43, 42, 41, 39, 38, 37, 36, 34, 33, 32, 30, 29, 27, 26
+.byte 24, 23, 22, 20, 19, 17, 16, 14, 12, 11, 9, 8, 6, 5, 3, 2
+.byte 0, -2, -3, -5, -6, -8, -9,-11,-12,-14,-16,-17,-19,-20,-22,-23
+.byte -24,-26,-27,-29,-30,-32,-33,-34,-36,-37,-38,-39,-41,-42,-43,-44
+.byte -45,-46,-47,-48,-49,-50,-51,-52,-53,-54,-55,-56,-56,-57,-58,-59
+.byte -59,-60,-60,-61,-61,-62,-62,-62,-63,-63,-63,-64,-64,-64,-64,-64
+.byte -64,-64,-64,-64,-64,-64,-63,-63,-63,-62,-62,-62,-61,-61,-60,-60
+.byte -59,-59,-58,-57,-56,-56,-55,-54,-53,-52,-51,-50,-49,-48,-47,-46
+.byte -45,-44,-43,-42,-41,-39,-38,-37,-36,-34,-33,-32,-30,-29,-27,-26
+.byte -24,-23,-22,-20,-19,-17,-16,-14,-12,-11, -9, -8, -6, -5, -3, -2
+
+.end
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Module Processing (ARM segment) *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+@=============================================================
+@ DEFINITIONS
+@=============================================================
+
+#include "mp_format_mas.inc"
+#include "mp_mas_structs.inc"
+#include "mp_defs.inc"
+#include "mp_macros.inc"
+
+#ifdef SYS_GBA
+#include "mp_mixer_gba.inc"
+#include "swi_gba.inc"
+#endif
+
+#ifdef SYS_NDS
+#include "mp_mixer_ds.inc"
+#include "swi_nds.inc"
+#endif
+
+__SECTION_IWRAM
+
+.arm
+.align 2
+
+.global mmAllocChannel
+@********************************************************
+mmAllocChannel:
+@********************************************************
+// finds a channel to use
+// returns invalid channel [255] if none available
+ push {r4,r5,r6} // preserve regs
+ ldr r5,=mm_ch_mask // read channel mask
+ ldr r5, [r5]
+ ldr r1,=mm_achannels // pointer to active channels
+ ldr r1, [r1]
+ add r1, #MCA_FVOL
+ mov r0, #0 // r0 = counter
+ mov r2, #0x80000000 // r2 = min vol
+ mov r3, #255 // r3 = best channel [255=none]
+ mov r6, #ACHN_BACKGROUND
+ b .mppac_start
+.mppac_skip:
+ add r1, #MCA_SIZE
+.mppac_next_test:
+ cmp r5, #0
+.mppac_next_notest:
+ beq .mppac_finished
+ add r0, #1
+.mppac_start:
+ movs r5, r5, lsr#1 // 1 shift out channel bit
+ bcc .mppac_skip // 1/3 skip if cleared
+ ldrh r4, [r1], #MCA_SIZE // 5 read type setting & increment pointer
+ cmp r6, r4, lsr #8 // 1 compare background/disabled
+ blt .mppac_next_test // 1/3 if > background then its important, dont use this channel
+ bgt .mppac_found // 1/3 if < background then its disabled, use this channel
+
+ cmp r2, r4, lsl#23 // 1 compare volume with our record
+ bls .mppac_next_test // 1/3 goto next if not less
+ mov r3, r0 // 1 otherwise save this channel
+ movs r2, r4, lsl#23 // 1 and volume level
+// beq .mppac_finished // 1/3 exit immediately if volume is zero
+ b .mppac_next_test // 3 loop
+ // 17
+.mppac_finished:
+ mov r0, r3
+// cmp r0, #255 //trap
+// 5: bge 5b
+.mppac_found:
+ pop {r4,r5,r6}
+ bx lr
+
+.global mmReadPattern
+@****************************************************
+mmReadPattern:
+@****************************************************
+ push {r10-r12}
+ ldr r11, [r8, #MPL_SONGADR]
+ ldrb r12, [r11, #C_MAS_INSTN] // read instr count
+ ldrb r11, [r8, #MPL_FLAGS] // read flags
+ mov r10, #1 // for various things
+
+ ldr r0,=mpp_channels
+ ldr r9, [r0]
+ ldr r7, [r8, #MPL_PATTREAD]
+ ldr r0,=mpp_vars
+ str r7, [r0, #MPV_PATTREAD_P]
+
+ mov r1, #0
+
+@----------------------------------------------------------------
+readpattern:
+@----------------------------------------------------------------
+
+ mov r5, #0 // clear flags
+ ldrb r3, [r7], #1 // read pattern byte
+ movs r3, r3, lsl#32-7 // mask channel#
+ beq end_of_row // 0 = end of row
+ rsb r3, r10, r3, lsr#32-7 // get channel number
+ orr r1, r10, lsl r3
+ mov r0, #MCH_SIZE
+ mla r6, r3, r0, r9 // get channel pointer
+ ldrcsb r2, [r7], #1 // read new maskvariable if bit was set
+ strcsb r2, [r6, #MCH_CFLAGS] // and save it
+ ldrccb r2, [r6, #MCH_CFLAGS] // otherwise read previous flags
+
+ tst r2, #1 // test note bit
+ beq no_note
+ ldrb r0, [r7], #1 // read note value
+ cmp r0, #254 // test if < 254
+ strltb r0, [r6, #MCH_PNOTE] // [most common result]
+ blt no_note
+ orreq r5, #MF_NOTECUT // 254 is note-cut
+ orrgt r5, #MF_NOTEOFF // 255 is note-off
+no_note:
+
+ tst r2, #2 // shift out instrument bit
+ beq no_instrument
+ ldrb r0, [r7], #1 // read instrument value
+ tst r5, #MF_NOTEOFF|MF_NOTECUT
+ bne no_instrument // skip if note-off or cut is set
+ cmp r0, r12 // check if value > max instruments
+ movgt r0, #0 // zero if so
+ ldrb r3, [r6, #MCH_INST] // test if instrument is the same
+ cmp r0, r3
+ beq same_instrument
+ movs r3, r11, lsr#C_FLAGS_LS // shift out 'mod/s3m' flag
+ orrcs r5, #MF_START // set start flag if old
+ orr r5, #MF_NEWINSTR // set new instrument flag
+same_instrument:
+ strb r0, [r6, #MCH_INST]
+no_instrument:
+
+ tst r10, r2, lsr#3 // test volume & effect bits
+ ldrcsb r0, [r7], #1 // copy vcmd
+ strcsb r0, [r6, #MCH_VOLCMD]
+no_vcmd:
+ beq no_effect
+ ldrb r0, [r7], #1 // copy effect
+ ldrb r3, [r7], #1 // copy param
+ orr r0, r3, lsl#8
+ strh r0, [r6, #MCH_EFFECT] // write effect+param
+no_effect:
+ orr r5, r2, lsr#4 // orr in the new flags
+ strb r5, [r6, #MCH_FLAGS] // save flags
+ b readpattern // loop
+end_of_row:
+ str r7, [r8, #MPL_PATTREAD] // save read position
+ str r1, [r8, #MPL_MCH_UPDATE] // save update bits
+ pop {r10-r12}
+ bx lr // return
+
+.macro get_channel branch
+ ldrb r0, [r7, #MCH_ALLOC] // get channel
+ cmp r0, #255 //
+ bge \branch // no channel!
+ ldr r6,=mm_achannels //
+ ldr r6, [r6] //
+ mov r1, #MCA_SIZE //
+ mla r6, r0, r1, r6 //
+.endm
+
+.global mmUpdateChannel_T0, mmUpdateChannel_TN
+@***************************************************************************
+mmUpdateChannel_T0: // for tick 0
+@***************************************************************************
+ push {lr}
+
+ ldrb r5, [r7, #MCH_FLAGS] // read channel flags
+ tst r5, #MF_START // test start flag
+ beq dont_start_channel // skip section if cleared
+
+ tst r5, #MF_HASFX // test effect flag
+ beq no_channel_effect
+ ldrh r0, [r7, #MCH_EFFECT] // read effect
+ and r1, r0, #0xFF
+// cmp r1, #19 // test for 'SDx' (note delay)
+// lsreq r2, r0, #12
+// cmpeq r2, #0xD
+// beq dont_start_channel // dont start channel if delayed
+
+ // test for glissando
+ tst r5, #MF_NEWINSTR
+ bne start_channel // always start channel if it's a new instrument
+ cmp r1, #0x7 // test if effect is Gxx
+ beq glissando_affected
+
+no_channel_effect:
+ tst r5, #MF_NEWINSTR // copeee
+ bne start_channel // always start channel if it's a new instrument
+
+ tst r5, #MF_HASVCMD // test for volume commmand
+ beq start_channel // none = start channel
+ ldrb r0, [r8, #MPL_FLAGS] // read mod flags
+ movs r0, r0, lsr#C_FLAGS_XS // test for XM mode
+ ldrb r0, [r7, #MCH_VOLCMD] // read volume command
+ bcs xm_vcmd // branch
+it_vcmd: // using IT effects:
+ cmp r0, #193 // glissando is 193..202
+ blt start_channel
+ cmp r0, #202
+ bgt start_channel
+ b glissando_affected
+xm_vcmd: // using XM effects:
+ cmp r0, #0xF0 // glissando is Fx
+ bge glissando_affected
+ b start_channel
+no_channel_vcmd:
+
+glissando_affected:
+
+ get_channel start_channel
+/* ldrb r0, [r7, #MCH_ALLOC] // if channel is invalid
+ cmp r0, #255 // then skip this
+ bge start_channel
+
+ ldr r6,=mm_achannels // get channel
+ ldr r6, [r6] //
+ mov r1, #MCA_SIZE //
+ mla r6, r0, r1, r6 //
+*/
+ bl mmChannelStartACHN // start achn
+ bic r5, #MF_START // clear start flag
+ strb r5, [r7, #MCH_FLAGS]
+ b dont_start_channel
+
+start_channel: // ok start channel...
+
+ ldr r2,=mpp_Channel_NewNote
+ mov lr, pc
+ bx r2
+ get_channel mmUpdateChannel_TN_
+
+// cmp r6, #0
+// beq mmUpdateChannel_TN_
+
+ bl mmChannelStartACHN // start achn
+//----------------------------------------------
+ // r2 = note, calculate period
+ ldrb r0, [r6, #MCA_SAMPLE]
+ subs r0, #1
+ bcc no_sample_to_make_period
+
+ ldrb r1, [r8, #MPL_FLAGS]
+ lsrs r1, #C_FLAGS_SS
+ bcs linear_periods
+
+ ldr r3, [r8, #MPL_SONGADR] // read song addr
+ ldr r1, [r8, #MPL_SAMPTABLE]// get sample table
+ ldr r0, [r1, r0, lsl#2] // get sample address
+ add r0, r3 // add module base
+
+ ldrh r1, [r0, #C_MASS_FREQ] // read tuning freq
+ lsl r1, #2 // shift ...
+// mov r0, r2 // move this.
+ bl get_amiga_period
+ b got_period
+linear_periods:
+ LDR R1,=IT_PitchTable
+ LDR R0, [R1, R2, LSL#2]
+ //bl get_linear_period
+got_period:
+//--------------------------------
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+ str r0, [r7, #MCH_PERIOD] // save period
+ ldrb r0, [r6, #MCA_FLAGS] // set start flag
+ orr r0, #MCAF_START
+ strb r0, [r6, #MCA_FLAGS]
+no_sample_to_make_period:
+//----------------------------------------------------
+
+ b channel_started
+
+dont_start_channel:
+
+ get_channel mmUpdateChannel_TN___
+
+channel_started:
+ tst r5, #MF_DVOL
+ beq dvol_skip
+ ldrb r0, [r7, #MCH_INST]
+ subs r0, #1
+ bcc dvol_no_instrument
+
+ ldr r2, [r8, #MPL_SONGADR] // get instrument pointer
+ ldr r1, [r8, #MPL_INSTTABLE]
+ ldr r0, [r1, r0, lsl#2]
+ add r0, r2
+
+ ldr r1, [r0, #C_MASI_NNA] // read nna,envflags,pan
+ ldrb r2, [r7, #MCH_BFLAGS] // read bflags
+ bic r2, #0b11000000 // clear old nna
+ orr r2, r1, lsl#6 // set new nna
+ strb r2, [r7, #MCH_BFLAGS]
+
+ ldrb r2, [r6, #MCA_FLAGS] // read achn flags
+ bic r2, #MCAF_VOLENV
+ tst r1, #ENVFLAG_A<<8
+ orrne r2, #MCAF_VOLENV
+ strb r2, [r6, #MCA_FLAGS]
+
+ movs r1, r1, lsl#8+1 // shift out panning MSB
+ movcs r1, r1, lsr#24 // if set, use new panning value
+ strcsb r1, [r7, #MCH_PANNING]
+dvol_no_instrument:
+
+ ldrb r0, [r6, #MCA_SAMPLE] // read sample#
+ subs r0, #1
+ bcc dvol_no_sample // exit if invalid
+
+ ldr r2, [r8, #MPL_SONGADR] // get sample address
+ ldr r1, [r8, #MPL_SAMPTABLE]
+ ldr r0, [r1, r0, lsl#2]
+ //add r0, r2
+
+ ldrh r1, [r0, r2]
+ //ldrh r1, [r0, #C_MASS_DV] // read dvol & pan
+ strb r1, [r7, #MCH_VOLUME] // copy volume
+ movs r1, r1, lsl#24-7
+ mov r1, r1, lsr#24
+ strcsb r1, [r7, #MCH_PANNING]
+dvol_skip:
+dvol_no_sample:
+
+ tst r5, #MF_START|MF_DVOL
+ beq dont_reset_volume
+
+ ldrb r0, [r8, #MPL_FLAGS]
+ tst r0, #C_FLAGS_X
+ beq 1f
+ tst r5, #MF_DVOL
+ beq dont_reset_volume // xm stuff
+1:
+reset_volume:
+ mov r0, #(1<<10) // [1]
+ mov r1, #0 // [1]
+ mov r2, #0 // [1]
+ add r12, r6, #MCA_FADE // [1]
+ stmia r12, {r0-r2} // [19]
+ // [23]
+ strh r1, [r6, #MCA_ENVN_VOL]
+ strb r1, [r6, #MCA_ENVN_PIC]
+
+ // the last bit of code sets fade to (1<<10)
+ // and clears ENVC_VOL,ENVC_PAN,ENVC_PIC,
+ // AVIB_DEP, and AVIB_POS
+ // second bit clears ENVN vars
+
+ strb r1, [r7, #MCH_FXMEM] // clear fx memory
+
+ ldrb r1, [r6, #MCA_FLAGS] // set keyon
+ orr r1, #MCAF_KEYON // and clear envend+fade
+ bic r1, #MCAF_ENVEND | MCAF_FADE
+ strb r1, [r6, #MCA_FLAGS]
+
+dont_reset_volume:
+
+ tst r5, #MF_NOTEOFF // test noteoff bit
+ beq skip_noteoff
+
+ ldrb r1, [r6, #MCA_FLAGS] // read flags
+ bic r1, #MCAF_KEYON // clear key-on
+ ldrb r0, [r8, #MPL_FLAGS] // read mod flags
+ tst r0, #C_FLAGS_X // test xm mode
+ orrne r1, #MCAF_FADE // XM starts fade immediately on note-off
+ strb r1, [r6, #MCA_FLAGS]
+skip_noteoff:
+
+ tst r5, #MF_NOTECUT // test notecut bit
+ movne r0, #0 // clear volume
+ strneb r0, [r7, #MCH_VOLUME] // on note-cut
+
+ bic r5, #MF_START // clear start flag
+ strb r5, [r7, #MCH_FLAGS] // save flags
+ b mmUpdateChannel_TN_
+@************************************************************
+mmUpdateChannel_TN: // for other ticks
+@************************************************************
+ push {lr}
+
+mmUpdateChannel_TN_:
+ ldrb r0, [r7, #MCH_ALLOC] // get channel
+ cmp r0, #255 //
+ bge mmUpdateChannel_TN___ // no channel!
+ ldr r6,=mm_achannels //
+ ldr r6, [r6] //
+ mov r1, #MCA_SIZE //
+ mla r6, r0, r1, r6 //
+
+mmUpdateChannel_TN___:
+
+ movge r6, #0
+
+ ldr r5, [r7, #MCH_PERIOD] // r5 will be used to hold the period
+ ldr r1,=mpp_vars
+ mov r0, #0
+ strb r0, [r1, #MPV_SAMPOFF] // clear variables
+ strb r0, [r1, #MPV_VOLPLUS]
+ strb r0, [r1, #MPV_PANPLUS]
+ strb r0, [r1, #MPV_NOTEDELAY]
+
+//---------------------------------------------
+// Update Volume Commands
+//---------------------------------------------
+
+ ldrb r0, [r7, #MCH_FLAGS]
+ tst r0, #MF_HASVCMD
+ ldrne r1,=mpp_Process_VolumeCommand
+ movne lr, pc
+ bxne r1
+ //blne mpp_Process_VolumeCommand
+
+//---------------------------------------------
+// Update Effects
+//---------------------------------------------
+
+ ldrb r0, [r7, #MCH_FLAGS]
+ tst r0, #MF_HASFX
+ ldrne r1,=mpp_Process_Effect
+ movne lr, pc
+ bxne r1
+ //blne mpp_Process_Effect
+
+//---------------------------------------------
+
+ cmp r6, #0
+ beq no_achn
+ ldrh r0, [r7, #MCH_VOLUME] // read volume & cvolume
+ and r1, r0, #255 // mask volume
+ mov r0, r0, lsr#8 // mask cvolume
+ mul r0, r1, r0 // multiply together
+ mov r0, r0, lsr#5 // shift
+ strb r0, [r6, #MCA_VOLUME] // save in achn volume
+
+ ldr r1,=mpp_vars //
+ ldrsb r2, [r1, #MPV_VOLPLUS] // read volume addition
+ adds r0, r2, lsl#3 // add to volume
+ movmi r0, #0
+ cmp r0, #129
+ movcs r0, #128
+ strb r0, [r1, #MPV_AFVOL] // store in immediate vol
+
+ ldrb r0, [r1, #MPV_NOTEDELAY]// read note delay
+ cmp r0, #0 // dont update if nonzero
+ beq channel_update_achn
+
+ ldrb r0, [r6, #MCA_FLAGS]
+ orr r0, #MCAF_UPDATED
+ strb r0, [r6, #MCA_FLAGS]
+ b no_achn
+
+channel_update_achn:
+
+ ldrb r0, [r7, #MCH_PANNING] // copy panning
+ strb r0, [r6, #MCA_PANNING]
+ ldr r0, [r7, #MCH_PERIOD] // copy period
+ str r0, [r6, #MCA_PERIOD]
+ mov r0, #0
+ strh r0, [r1, #MPV_PANPLUS] // WHAT IS THIS??? "@ <---- RESERVED FOR LATER USE, CLEAR TO ZERO TEMPORARILY"
+
+ ldrb r0, [r6, #MCA_FLAGS]
+ orr r0, #MCAF_UPDATED
+ strb r0, [r6, #MCA_FLAGS]
+
+ push {r4}
+ ldrb r4, [r7, #MCH_ALLOC]
+ ldr r1,=mpp_Update_ACHN_notest
+ mov lr, pc
+ bx r1
+
+ pop {r4}
+no_achn:
+ pop {lr}
+ bx lr
+
+@***********************************************************
+mmChannelStartACHN: // returns r2=note
+@***********************************************************
+ ldrb r2, [r7, #MCH_BFLAGS+1] // clear tremor/cutvol
+ bic r2, #0b110
+ strb r2, [r7, #MCH_BFLAGS+1]
+
+ cmp r6, #0 // achn==0?
+ beq 1f // then skip this part
+
+ mov r0, #ACHN_FOREGROUND // set foreground type
+ strb r0, [r6, #MCA_TYPE]
+
+ ldrb r0, [r6, #MCA_FLAGS] // read flags
+ bic r0, #0b11000000 // clear SUB, EFFECT
+ ldr r1,=mpp_clayer // get layer
+ ldrb r1, [r1]
+ orr r0, r1, lsl#6 // orr into flags
+ orr r0, r10, r0, lsl#8 // orr PARENT
+ strh r0, [r6, #MCA_PARENT] // store parent/flags
+ ldrb r0, [r7, #MCH_INST] // copy instrument
+ strb r0, [r6, #MCA_INST]
+1: ldreqb r0, [r7, #MCH_INST]
+ subs r0, #1
+ bcc invalid_instrument
+
+ ldr r2, [r8, #MPL_SONGADR] // get instrument pointer
+ ldr r1, [r8, #MPL_INSTTABLE]
+ ldr r0, [r1, r0, lsl#2]
+ add r0, r2
+
+ ldrb r2, [r7, #MCH_PNOTE] // get pattern note
+
+ ldrh r1, [r0, #C_MASI_MAP] // read notemap offset
+ tst r1, #0x8000 // test MSB
+ beq full_notemap // if set: notemap doesnt exist!
+ // use single entry
+ cmp r6, #0 // if channel is valid
+ strneb r1, [r6, #MCA_SAMPLE] // write sample value
+ strb r2, [r7, #MCH_NOTE] // write note value (without notemap, all entries == PNOTE)
+ bx lr // return
+
+full_notemap:
+
+ add r0, r2, lsl#1 // add note offset
+ ldrh r2, [r0, r1] // read notemap entry [instr+note*2+notemap_offset]
+ strb r2, [r7, #MCH_NOTE] // write note value
+ cmp r6, #0 // if channel is valid
+ mov r0, r2, lsr#8 // write sample value
+ strneb r0, [r6, #MCA_SAMPLE] // ..
+ and r2, #255
+invalid_instrument:
+ bx lr // return
+
+/**********
+
+ cmp r6, #0 // read notemap [sample]
+ ldrneb r2, [r0, #C_MASI_MAP+1]
+ strneb r2, [r6, #MCA_SAMPLE]
+
+//invalid_instrument: // BUG???
+ ldrb r2, [r0, #C_MASI_MAP] // read notemap [note]
+ strb r2, [r7, #MCH_NOTE]
+invalid_instrument:
+
+ bx lr
+**************/
+
+.global mmGetPeriod
+@***********************************************************
+mmGetPeriod:
+@***********************************************************
+
+ ldrb r0, [r8, #MPL_FLAGS]
+ lsrs r0, #C_FLAGS_SS
+ bcs get_linear_period // tuning not used here with linear periods
+
+get_amiga_period:
+ adr r3, note_table_mod // get octave/mod from note
+ ldrb r0, [r3, r2]
+ sub r3, #3*10
+ ldrb r2, [r3, r2, lsr#2]
+
+ // r0 = (note mod 12) << 1
+ // r1 = tuning
+ // r2 = (note / 12)
+
+ ldr r3,=ST3_FREQTABLE // read st3 table entry
+ ldrh r0, [r3, r0]
+
+ mov r3, #0x00AB0 // r3 = 133808
+ orr r3, #0x20000
+ mul r0, r3, r0 // multiply by magic number...
+ mov r0, r0, lsr r2 // shift by octave
+ cmp r1, #0
+ beq 1f
+ swi SWI_DIVIDE<<16 // divide value / tuning
+1: bx lr
+
+.global note_table_oct // remove this, make this static
+.global note_table_mod // remove this, make this staic
+note_table_oct:
+.byte 0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5,5,5, 6,6,6 ,7,7,7,8,8,8,9,9,9
+note_table_mod:
+.byte 0,2,4,6,8,10,12,14,16,18,20,22,0,2,4,6,8,10,12,14,16,18,20,22,0,2,4,6,8,10,12,14,16,18,20,22,0,2,4,6,8,10,12,14,16,18,20,22,0,2,4,6,8,10,12,14,16,18,20,22,0,2,4,6,8,10,12,14,16,18,20,22,0,2,4,6,8,10,12,14,16,18,20,22,0,2,4,6,8,10,12,14,16,18,20,22,0,2,4,6,8,10,12,14,16,18,20,22,0
+.align 2
+
+get_linear_period:
+ ldr r1,=IT_PitchTable
+ ldr r0, [r1, r2, lsl#2]
+ bx lr
+
+.pool
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * GBA Audio System *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+@ DEFINITIONS
+
+#include "mp_macros.inc"
+#include "mp_format_mas.inc"
+#include "mp_defs.inc"
+
+@ timer freq = 2^24 / mixfreq
+@ mixlen ~= mixfreq * 0.01673
+@ recommended mixing frequencies: 5734,7884,10512,13379,15768,18157,21024,26758,31536,36314,40137,42048
+@ other mixing frequencies may cause clicks
+@ mixlen must be divisible by 2
+
+@==================================================================
+@ GLOBAL SYMBOLS
+@==================================================================
+
+
+ .global mmVBlank
+ .type mmVBlank STT_FUNC
+ .global mmMixerMix
+ .type mmMixerMix STT_FUNC
+
+ .global mmMixerSetSource
+ .type mmMixerSetSource STT_FUNC
+ .global mmMixerSetRead
+ .type mmMixerSetRead STT_FUNC
+ .global mmMixerSetFreq
+ .type mmMixerSetFreq STT_FUNC
+ .global mmMixerStopChannel
+ .type mmMixerStopChannel STT_FUNC
+ .global mmMixerInit
+ .type mmMixerInit STT_FUNC
+ .global mmMixerChannelActive
+ .type mmMixerChannelActive STT_FUNC
+ .global mmMixerMulFreq
+ .type mmMixerMulFreq STT_FUNC
+ .global mmMixerSetVolume
+ .type mmMixerSetVolume STT_FUNC
+ .global mmMixerSetPan
+ .type mmMixerSetPan STT_FUNC
+
+// .global mm_freqscalar
+ .global mm_mixlen
+ .global mm_bpmdv
+ .global mp_mix_seg
+ .global mp_writepos
+ .global mm_mixchannels
+
+@===============================================
+@ more definitions
+@===============================================
+
+.EQU REG_SOUNDCNT_L, 0x4000080
+.EQU REG_SOUNDCNT_H, 0x4000082
+.EQU REG_SOUNDCNT_X, 0x4000084
+
+.EQU REG_TM0CNT, 0x4000100
+
+.EQU REG_DMA1SAD, 0x40000BC
+.EQU REG_DMA1DAD, 0x40000C0
+.EQU REG_DMA1CNT, 0x40000C4
+
+.EQU REG_DMA2SAD, 0x40000C8
+.EQU REG_DMA2DAD, 0x40000CC
+.EQU REG_DMA2CNT, 0x40000D0
+
+.EQU REG_DMA3SAD, 0x40000D4
+.EQU REG_DMA3DAD, 0x40000D8
+.EQU REG_DMA3CNT, 0x40000DC
+
+.EQU REG_SGFIFOA, 0x40000A0
+.EQU REG_SGFIFOB, 0x40000A4
+.EQU REG_VCOUNT, 0x4000006
+
+@ MIXER CHANNEL FORMAT
+
+.equ CHN_SIZE, 24
+
+.equ CHN_SRC,0
+.equ CHN_READ,4
+.equ CHN_VOL,8
+.equ CHN_PAN,9
+// 10
+// 11
+.equ CHN_FREQ,12
+.equ CHN_SIZE,16
+
+/////////////////////.equ CHN_LOOP,8
+/////////////////////.equ CHN_LEN,16
+
+@-------------------------------------
+
+.equ FETCH_SIZE, 384
+.equ FETCH_THRESHOLD, (6016)//7040 // frequency threshold (dont use fetch for high freqs!)
+
+@======================================================================
+@ MEMORY
+@======================================================================
+
+.section .bss
+.align 2
+
+mp_writepos: .space 4 @ wavebuffer write position
+
+mm_mixbuffer: .space 4 @ dont move (see init)
+mm_mixchannels: .space 4 @ dont move
+mm_wavebuffer: .space 4 @ dont move
+mm_mixlen: .space 4 @ dont move
+mm_mixch_count: .space 4 @ dont move
+mm_mixch_end: .space 4 @ dont move
+mm_ratescale: .space 4 @ dont move
+mm_timerfreq: .space 4 @ dont move
+
+mm_bpmdv: .space 4
+
+mp_mix_seg: .space 1 @ mixing segment select
+
+.align 2
+
+mm_fetch: .space FETCH_SIZE+16
+
+@ 11-bit mixed sample buffer
+@ data is interleaved
+@ left,left,right,right,left,left,etc...
+
+@===========================================================================
+@ PROGRAM
+@===========================================================================
+
+.section .iwram, "ax", %progbits
+
+.ARM
+.ALIGN 2
+
+mpm_nullsample:
+.byte 128
+
+.align 2
+@-----------------------------------------------------------------------------------------------------
+mmVBlank: @ vblank wrapper, used to reset dma...HIGH PRIORITY PLEASE!
+@-----------------------------------------------------------------------------------------------------
+
+ b .mpvb_disabled @ disable until ready.. (overwrite this area with NOP)
+
+ ldr r0,=mp_mix_seg @ swap mixing segmentl
+ ldrsb r1, [r0]
+ mvns r1, r1
+ strb r1, [r0]
+ beq .mpvb_exit
+
+ ldr r1,=0x040000c6 @ dma control RESTART DMA
+ ldr r0,=0x0440 @ disable dma
+ strh r0, [r1]
+ strh r0, [r1,#12]
+ ldr r0,=0xB600 @ restart dma
+ strh r0, [r1]
+ strh r0, [r1,#12]
+
+ b .mpvb_dontreset
+.mpvb_exit:
+ ldr r0,=mp_writepos @ restart write position
+@ ldr r1,=mp_playbuffer_l @ ...
+ ldr r1,=mm_wavebuffer
+ ldr r1, [r1]
+ str r1, [r0] @ ...
+.mpvb_dontreset:
+
+.mpvb_disabled:
+ ldr r0,=0x3007FF8 @ acknowledge interrupt
+ ldrh r2, [r0]
+ orr r2, r2, #0x1
+ strh r2, [r0]
+
+ ldr r0,=mm_vblank_function
+ ldr r0, [r0]
+ cmp r0, #0
+ bxeq lr
+ bx r0
+.pool
+
+.align 2
+@-------------------------------------------------------------------------
+mmMixerMix: @ params={ samples_count }
+@-------------------------------------------------------------------------
+
+@ exit function if samples == 0
+@ it will malfunction.
+
+ cmp r0, #0
+ bne .mp_zerocheck
+ bx lr
+
+.mp_zerocheck:
+
+@ preserve registers
+
+ stmfd sp!, {r4-r11,lr}
+
+ stmfd sp!, {r0} @ preserve mixing count
+
+@------------------------------------------------------------------------
+@ SECTOR 0, INITIALIZATION
+@------------------------------------------------------------------------
+
+@ clear mixing buffers
+
+ and r10, r0, #7
+ mov r2, r0, lsr#3 @ clearing samps*2*2 bytes (hword*stereo) 32 bytes at a time
+ ldr r0,=mm_mixbuffer
+ ldr r0,[r0]
+ mov r1, #0 @ zero variable
+ mov r3, r1
+ mov r4, r1
+ mov r5, r1
+ mov r6, r1
+ mov r7, r1
+ mov r8, r1
+ mov r9, r1
+
+ cmp r2, #0
+ beq 2f
+
+@ clear 32 bytes/write
+
+1: stmia r0!, {r1,r3-r9}
+ subs r2, r2, #1
+ bne 1b
+2:
+
+@ clear remainder
+ cmp r10, #0
+ beq 2f
+
+1: str r1, [r0], #4
+ subs r10, r10, #1
+ bne 1b
+2:
+
+@----------------------------------------------------------------------------------
+@ BEGIN MIXING ROUTINE
+@----------------------------------------------------------------------------------
+
+ ldr r12,=mm_mixchannels
+ ldr r12,[r12]
+ mov r11, #0 @ volume addition
+
+@--------------------
+.mpm_cloop:
+@--------------------
+
+@----------------------------------------------------------------------
+@ SECTOR 1, CALCULATIONS
+@----------------------------------------------------------------------
+
+@ aliases
+#define rchan r12
+#define rvolA r11
+#define rsrc r10
+#define rfreq r9
+#define rmixb r8
+#define rread r7
+#define rvolL r5
+#define rvolR r6
+#define rmixc r4
+#define rmixcc r3
+
+@ read source address
+
+ ldr rsrc, [rchan, #CHN_SRC]
+ cmp rsrc, #0
+ bmi .mpm_next @ EXIT if MSB is set ------------>
+
+@ read frequency value
+
+ ldr rfreq, [rchan, #CHN_FREQ]
+ cmp rfreq, #0
+ beq .mpm_next @ EXIT if zero ----------------=->
+
+ ldr r0,=mm_ratescale
+ ldr r0, [r0]
+ mul rfreq, r0
+ lsr rfreq, #14
+
+@ load mixing buffers
+
+ ldr rmixb,=mm_mixbuffer
+ ldr rmixb,[rmixb]
+
+@ get read position
+
+ ldr rread, [rchan, #CHN_READ]
+
+@ calculate volume
+
+ ldrb rvolR,[rchan, #CHN_VOL] @ volume = 0-255
+ ldrb r0, [rchan, #CHN_PAN] @ pan = 0-255
+
+ rsb r0, r0, #256
+ mul rvolL, r0, rvolR @ (vol*pan) = right volume
+ mov rvolL, rvolL, lsr#8
+ add rvolA, rvolA, rvolL @ add to volume counter
+ rsb r0, r0, #256
+ mul rvolR, r0, rvolR @ calc left volume (256-pan)*vol
+ mov rvolR, rvolR, lsr#8
+ add rvolA, rvolA, rvolR, lsl#16
+
+ ldr rmixc, [sp] @ get mix count
+
+@****************************************************************
+.mpm_remix_test:
+@****************************************************************
+
+ mov r2, #0
+ mul r1, rmixc, rfreq // get number of samples that will be read
+
+ cmp rfreq, #FETCH_THRESHOLD
+ bge 1f
+
+ cmp r1, #FETCH_SIZE<<12 // check if its > fetch size
+ movhi r1, #FETCH_SIZE<<12 // if so: clamp to fetch size and set flag
+ movhi r2, #1
+
+1:
+// ldr r0, [rchan, #CHN_LEN] // now subtract length - read to get # samples remaining
+ ldr r0, [rsrc, #-C_SAMPLE_DATA+C_SAMPLE_LEN]
+ rsb r0, rread, r0, lsl#SAMPFRAC
+// sub r0, r0, rread // in the source
+ cmp r1, r0 // clamp mix count
+ movhi r1, r0
+ bhi .calc_mix
+ cmp r2, #0
+ beq .mpm_mix_full
+
+.calc_mix:
+
+
+ push {r1} // preserve sample count
+
+
+//--------------------------------
+.macro DIV_ITER shift
+//--------------------------------
+ cmp r0, rfreq, lsl#\shift
+ subcs r0, rfreq, lsl#\shift
+ addcs r2, #1<<\shift
+.endm
+//--------------------------------
+.macro DIVIDER shift
+//--------------------------------
+ DIV_ITER \shift
+.if \shift != 0
+ DIVIDER (\shift-1)
+.endif
+.endm
+//--------------------------------
+
+ mov r0, r1 // divide samples / frequency (24bit/16bit)
+ mov r2, #0
+
+1: subs r0, rfreq, lsl#16 // divide top part
+ addcs r2, #1<<16
+ bcs 1b
+ add r0, rfreq, lsl#16
+
+ DIVIDER 15 // divide the rest...
+
+ cmp r0, #1 // round up result
+ adc r0, r2, #0
+
+// mov r0,r1
+// mov r1,rfreq
+// swi 0x060000
+// cmp r1, #0
+// addne r0, #1
+
+ pop {r1} // restore sample count
+ sub rmixc, r0 // subtract from mixcount
+ mov rmixcc, r0
+ b .mpm_mix_short
+
+@------------------------------------------------------------------------
+@ SECTOR 2, MIXING
+@------------------------------------------------------------------------
+
+@-----------------------------------------
+.mpm_mix_full:
+@-----------------------------------------
+
+@ mix all samples
+
+ mov rmixcc, rmixc @ <-- move mixing count
+ mov rmixc, #0 @ clear mixing count
+.mpm_mix_short:
+
+@------------------------------------------------------
+.mpm_remix:
+@------------------------------------------------------
+
+@ mix samples...
+@ preserve registers
+ stmfd sp!, {rmixc,rvolA,rchan}
+
+@ zero mixing count??
+ cmp rmixcc, #0
+ beq .mpm_mix_complete @ exit -------->
+
+ cmp rfreq, #FETCH_THRESHOLD
+ bge .dont_use_fetch
+
+ /*
+ ldr r0,=mm_fetch // transfer samples from ROM to RAM
+ add r1, #2<<14 // add threshold for safety
+ ldr r2,=REG_DMA3SAD
+ str r0, [r2, #4]
+ add r0, r10, rread, lsr#12
+ bic r0, #0b11
+ str r0, [r2, #0]
+ mov r0, #(1<<31)+(1<<26)
+ add r0, r1, lsr#14
+ str r0, [r2, #8]
+ b fooo
+ */
+
+ // [cycle timings assume 3,1 ROM waitstates]
+
+ push {r3-r12}
+ // r10 is SRC!
+ ldr r0,=mm_fetch // destination
+ add r10, r10, rread, lsr#12 // add read offset to source
+ bic r10, #0b11 // align to 32 bits
+ add r1, #4<<12 // add safety threshold
+ subs r1, #40<<12 // subtract 36
+
+ bcc .exit_fetch // skip large fetch if negative
+.fetch: ldmia r10!, {r2-r9,r11,r14} // read 40 samples [44 cycles]
+ stmia r0!, {r2-r9,r11,r14} // write 40 samples [11 cycles]
+ subs r1, #40<<12 // count [1 cycle ]
+ bcc .exit_fetch // exit if done [1 cycle ]
+ ldmia r10!, {r2-r9,r11,r14} // read 40 samples [44 cycles]
+ stmia r0!, {r2-r9,r11,r14} // write 40 samples [11 cycles]
+ subs r1, #40<<12 // count [1 cycle ]
+ bcc .exit_fetch // exit if done [1 cycle ]
+ ldmia r10!, {r2-r9,r11,r14} // read 40 samples [44 cycles]
+ stmia r0!, {r2-r9,r11,r14} // write 40 samples [11 cycles]
+ subs r1, #40<<12 // count [1 cycle ]
+ bcs .fetch // loop if remaining [3 cycles]
+ // [173 cycles/120 samples]
+.exit_fetch:
+
+ adds r1, #(40<<12)-(24<<12)
+ bmi .end_medfetch
+.medfetch:
+ ldmia r10!, {r2-r7} // read 24 samples [26]
+ stmia r0!, {r2-r7} // write 24 samples [7 ]
+ subs r1, #24<<12 // count [1 ]
+ bcc .end_medfetch // exit if done [1 ]
+ ldmia r10!, {r2-r7} // read 24 samples [26]
+ stmia r0!, {r2-r7} // write 24 samples [7 ]
+ subs r1, #24<<12 // count [1 ]
+ bcc .end_medfetch // exit if done [1 ]
+ ldmia r10!, {r2-r7} // read 24 samples [26]
+ stmia r0!, {r2-r7} // write 24 samples [7 ]
+ subs r1, #24<<12 // count [1 ]
+ bcs .medfetch // loop [3 ]
+.end_medfetch: // [107]
+
+ adds r1, #24<<12 // add 24 back
+ bmi .end_fetch // exit if <= 0
+.fetchsmall:
+ ldr r2, [r10], #4 // read 4 samples [8]
+ str r2, [r0], #4 // write 4 samples [2]
+ subs r1, #4<<12 // count [1]
+ ble .end_fetch // exit maybe [1]
+ ldr r2, [r10], #4 // read 4 samples [8]
+ str r2, [r0], #4 // write 4 samples [2]
+ subs r1, #4<<12 // count [1]
+ bgt .fetchsmall // exit maybe [3]
+.end_fetch:
+
+ pop {r3-r12} // restore regs
+
+fooo:
+
+ mov r0, rread, lsr#12 // get read integer
+ push {r0, rsrc} // preserve regs
+ bic rread, r0, lsl#12 // clear integer
+ and r0, #0b11 // mask low bits
+ ldr rsrc,=mm_fetch //
+ add rsrc, rsrc, r0 // offset source (fetch is word aligned!)
+
+.dont_use_fetch:
+
+ tst rmixb, #0b11 // test alignment of work output
+ beq .mpm_aligned
+
+#define rsamp1 r1
+#define rsampa r0
+#define rsampb r2
+ @ routine to WORD align mixing sector
+ ldrb rsampa, [rsrc, rread, lsr#SAMPFRAC] @ load sample
+ add rread, rread, rfreq @ add frequency
+ mul rsampb, rsampa, rvolL @ multiply by left volume
+ ldrh rsamp1, [rmixb] @ add to mixing buffer (left)
+ add rsamp1, rsamp1, rsampb, lsr#5
+ strh rsamp1, [rmixb], #4
+ mul rsampb, rsampa, rvolR @ multiply by right volume
+ ldrh rsamp1, [rmixb] @ add to mixing buffer (right)
+ add rsamp1, rsamp1, rsampb, lsr#5
+ strh rsamp1, [rmixb], #2
+ sub rmixcc, rmixcc, #1 @ decrement mix count
+
+#undef rsamp1
+#undef rsampa
+#undef rsampb
+
+.mpm_aligned:
+ // determine mixing mode
+ cmp rvolL, rvolR // if volume_left == volume_right then assume 'center' mixing
+ beq .mpm_mix_ac
+ cmp rvolL, #0 // if left volume is zero, do 'right' mixing
+ beq .mpm_mix_ar
+ cmp rvolR, #0 // if right volume is zero, do 'left' mixing
+ beq .mpm_mix_al
+ b mmMix_ArbPanning // otherwise do arb mixing
+.mpm_mix_al:
+ b mmMix_HardLeft
+.mpm_mix_ar:
+ b mmMix_HardRight
+
+@ center mixing------------
+.mpm_mix_ac:
+ cmp rvolL, #0 // check if volume is zero
+ bne mmMix_CenteredPanning // mix samples if not zero
+ b mmMix_Skip // skip samples if zero
+.mpm_mix_complete:
+
+ cmp rfreq, #FETCH_THRESHOLD
+ poplt {r0, rsrc} // restore regs
+ addlt rread, rread, r0, lsl#12 // add old integer to read
+ ldmfd sp!, {rmixc,rvolA,rchan} // restore more regs
+
+ ldr r1, [rsrc, #-C_SAMPLE_DATA+C_SAMPLE_LEN]
+ lsl r1, #SAMPFRAC
+ //ldr r1, [rchan, #CHN_LEN] // check length against position
+ cmp r1, rread
+ bgt .mpm_channelfinished
+
+// ldr r1, [rchan, #CHN_LOOP] // read channel loop
+
+ ldr r1, [rsrc, #-C_SAMPLE_DATA+C_SAMPLE_LOOP]
+ cmp r1, #0
+// movs r1, r1, lsl#8 // mask out high byte (that is VOLUME)
+ bmi .mpm_channel_stop // MSB = no loop, stop channel ->
+
+
+ sub rread,rread,r1,lsl#(SAMPFRAC) // subtract loop length (<<SAMPFRAC) from position
+
+ cmp rmixc, #0 // mix more samples?
+ ble .mpm_channelfinished // no ->
+ b .mpm_remix_test // yes: loop
+
+@----------------------------------------------------------------
+.mpm_channel_stop:
+@----------------------------------------------------------------
+
+@ *** END OF SAMPLE
+ mov r1, #1<<31 // disable channel
+ str r1, [rchan, #CHN_SRC]
+
+@ mix zero into the rest of the buffer
+ ldr rsrc,=mpm_nullsample // mix zero into the rest of the buffer
+ mov rfreq, #0 // zero freq
+ mov rread, #0 // zero freq
+ movs rmixcc, rmixc // mix remaining amount
+ ble .mpm_channelfinished // (exit if zero)
+ mov rmixc, #0
+ mov r1, #0
+ b .mpm_remix // mix 'zero' into the rest of the data
+
+@---------------------------------------------------------------
+.mpm_channelfinished:
+@---------------------------------------------------------------
+
+ cmp rmixc, #0 // mix more samples?
+ bne .mpm_remix_test // yes: loop
+
+@ *** END OF MIXING ***
+
+ str rread, [rchan, #CHN_READ] // save read position
+
+@-----------------------
+.mpm_next:
+@-----------------------
+
+ add rchan, rchan, #CHN_SIZE // seek to next channel
+ ldr r0,=mm_mixch_end // compare with ending
+ ldr r0,[r0]
+ cmp rchan, r0
+ bne .mpm_cloop // loop if !=
+
+@----------------------------------------------------------------------------------
+@ SECTOR 3, POST-PROCESSING
+@----------------------------------------------------------------------------------
+
+#define prmixl r0
+#define prwritel r2
+#define prwriter r3
+#define prcount r4
+#define prvolR r12
+#define prvolL r11
+#define prsamp1 r6
+#define prsamp2 r5
+#define prsamp3 r7
+
+ ldr prmixl,=mm_mixbuffer
+ ldr prmixl,[prmixl]
+
+ ldr prwritel,=mp_writepos
+ ldr prwritel, [prwritel]
+ ldr prwriter,=mm_mixlen
+ ldr prwriter, [prwriter]
+ add prwriter, prwritel, prwriter, lsl#1 @#MP_MIXLEN*2
+ ldmfd sp!, {prcount}
+
+@ get volume accumulators
+
+ mov prvolR, rvolA, lsr#16+1
+ mov prvolR, prvolR, lsl#3
+
+ mov prvolL, rvolA, lsl#16
+ mov prvolL, prvolL, lsr#16+1
+ mov prvolL, prvolL, lsl#3
+
+ subs prcount, prcount, #1
+ ble .mpm_copy2_end
+
+@--------------------------------------------------
+.mpm_copy2:
+@--------------------------------------------------
+
+@ ***************** LEFT OUTPUT ******************
+
+ ldr prsamp1, [prmixl], #4 @ get 2 mixed samples
+ sub prsamp2, prsamp1, prvolL @ convert to signed
+
+ mov prsamp2, prsamp2, lsl#16 @ mask low hword with sign extension
+ movs prsamp2, prsamp2, asr#16+3 @ and convert 11-bit to 8-bit
+
+ cmp prsamp2, #-128 @ clamp
+ movlt prsamp2, #-128 @
+ cmp prsamp2, #127 @
+ movgt prsamp2, #127 @
+
+ @ next sample...
+ rsbs prsamp3, prvolL, prsamp1,lsr#16 @ convert to signed
+ movs prsamp3, prsamp3, asr#3 @ convert 11-bit to 8-bit
+
+ cmp prsamp3, #-128 @ clamp
+ movlt prsamp3, #-128 @
+ cmp prsamp3, #127 @
+ movgt prsamp3, #127 @
+
+ and prsamp2, prsamp2, #255 @ write to output
+ orr prsamp2, prsamp3, lsl#8 @
+ strh prsamp2, [prwritel], #2 @
+
+@ **************** RIGHT OUTPUT ******************
+
+ ldr prsamp1, [prmixl], #4 @ get 2 mixed samples
+ sub prsamp2, prsamp1, prvolR @ convert to signed
+
+ mov prsamp2, prsamp2, lsl#16 @ mask low hword and convert 11-bit to 8-bit
+ movs prsamp2, prsamp2, asr#16+3 @
+
+ cmp prsamp2, #-128 @ clamp value
+ movlt prsamp2, #-128 @
+ cmp prsamp2, #127 @
+ movgt prsamp2, #127 @
+
+ @ next sample...
+ rsbs prsamp3, prvolR, prsamp1,lsr#16 @ convert to signed
+ movs prsamp3, prsamp3, asr#3 @ convert 11-bit to 8-bit
+
+ cmp prsamp3, #-128 @ clamp value
+ movlt prsamp3, #-128 @
+ cmp prsamp3, #127 @
+ movgt prsamp3, #127 @
+
+ and prsamp2, prsamp2, #255 @ write to output
+ orr prsamp2, prsamp3, lsl#8 @
+ strh prsamp2, [prwriter], #2 @
+
+ subs prcount, prcount, #2 @ loop
+ bgt .mpm_copy2 @
+
+@------------------------------------------------------------------
+
+.mpm_copy2_end:
+ ldr r0,=mp_writepos @ store new write position
+ str prwritel, [r0]
+
+@------------------------------------------------------------------
+
+ ldmfd sp!, {r4-r11,lr} // restore registers
+ bx lr // phew!
+
+.pool
+
+@================================================================================
+@ MIXING ROUTINES
+@================================================================================
+
+.macro READ_AND_INCREMENT reg
+ ldrb \reg, [rsrc, rread, lsr#SAMPFRAC]
+ add rread, rread, rfreq
+.endm
+
+.macro READ_D reg, tmp
+ READ_AND_INCREMENT \reg
+ READ_AND_INCREMENT \tmp
+ orr \reg, \tmp, lsl#16
+.endm
+
+.macro MIX_D vol, tmp1, tmp2
+ READ_D \tmp1, \tmp2 // load&combine 2 samples
+ mul \tmp2, \tmp1, \vol // multiply by volume
+ bic \tmp2, \tmp2, #0x1F0000 // prepare for shift
+.endm
+
+.macro MIX_DA vol, target, tmp1, tmp2
+ MIX_D \vol, \tmp1, \tmp2
+ add \target, \target, \tmp2, lsr#5 // add 11-bit values
+.endm
+
+.macro MIX_DC vol, target_a, target_b, tmp1, tmp2
+ MIX_D \vol, \tmp1, \tmp2
+ add \target_a, \target_a, \tmp2, lsr#5 // add 11-bit values
+ add \target_b, \target_b, \tmp2, lsr#5
+.endm
+
+.macro MIX_DB vol_l, vol_r, target_a, target_b, tmp1, tmp2
+ READ_D \tmp1, \tmp2
+
+.if \target_a != 0
+ mul \tmp2, \tmp1, \vol_l // multiply by volume
+ bic \tmp2, \tmp2, #0x1F0000 // prepare for shift
+ add \target_a, \target_a, \tmp2, lsr#5 // add 11-bit values
+.endif
+.if \target_b != 0
+ mul \tmp2, \tmp1, \vol_r // multiply by volume
+ bic \tmp2, \tmp2, #0x1F0000 // prepare for shift
+ add \target_b, \target_b, \tmp2, lsr#5 // add 11-bit values
+.endif
+.endm
+
+@-----------------------------------------------------------------------------------
+mmMix_Skip:
+@-----------------------------------------------------------------------------------
+
+@ mix nothing
+ mul r0, rmixcc, rfreq @ read += samples * frequency
+ add rread, rread, r0
+ b .mpm_mix_complete
+
+@-----------------------------------------------------------------------------------
+mmMix_HardLeft:
+@-----------------------------------------------------------------------------------
+@ mix hard panned left
+
+ bl mmMix_SingleChannel // mix left channel
+ bgt mmMix_Remainder // mix remaining amount
+ b .mpm_mix_complete // return
+
+@-----------------------------------------------------------------------------------
+mmMix_HardRight:
+@-----------------------------------------------------------------------------------
+@ hard panned right
+
+ mov rvolL, rvolR // move volume
+ add rmixb, rmixb, #4 // offset to 'right' data
+ bl mmMix_SingleChannel // mix routine
+ mov rvolL, #0 // clear left volume again
+ sub rmixb, rmixb, #4 // remove offet
+ bgt mmMix_Remainder // mix remaining count
+ b .mpm_mix_complete // return
+
+@----------------------------------------
+mmMix_SingleChannel:
+@----------------------------------------
+
+#define rsamp1 r1
+#define rsamp2 r2
+#define rsamp3 r11
+#define rsamp4 r12
+#define rsampa r0
+#define rsampb r4
+
+@ hard panned mixing (single channel mono)
+@ interleaving really cuts this method's effectiveness :(
+
+@ mix 8 samples/loop
+
+ subs rmixcc, rmixcc, #8
+ bmi .mpmah_8e
+.mpmah_8:
+ ldmia rmixb, {rsamp1, rsamp2, rsamp3} // load data [2nd word not used]
+ MIX_DA rvolL, rsamp1, rsampa, rsampb // mix data
+ str rsamp1, [rmixb], #8 // store mixed word
+ MIX_DA rvolL, rsamp3, rsampa, rsampb // mix data
+ str rsamp3, [rmixb], #8 // store mixed word
+ ldmia rmixb, {rsamp1, rsamp2, rsamp3} // load data [2nd word not used]
+ MIX_DA rvolL, rsamp1, rsampa, rsampb // mix data
+ str rsamp1, [rmixb], #8 // store mixed word
+ MIX_DA rvolL, rsamp3, rsampa, rsampb // mix data
+ str rsamp3, [rmixb], #8 // store mixed word
+ subs rmixcc, rmixcc, #8 // decrement 8 samples
+ bpl .mpmah_8 // loop if >= 0
+.mpmah_8e:
+
+@ mix remainder samples
+
+ adds rmixcc, rmixcc, #8 // fix mixing count
+ bx lr // return
+
+#undef rsamp1
+#undef rsamp2
+#undef rsamp3
+#undef rsamp4
+#undef rsampa
+#undef rsampb
+
+@----------------------------------------------------------
+mmMix_CenteredPanning:
+@----------------------------------------------------------
+
+#define rsamp1 r1
+#define rsamp2 r2
+#define rsamp3 r4
+#define rsamp4 r6
+#define rsamp5 r11
+#define rsamp6 r12
+#define rsampa r0
+#define rsampb lr
+
+@ mix center panning (double channel mono)
+
+ subs rmixcc, rmixcc, #6
+ bmi .mpmac_6e
+.mpmac_6:
+
+ ldmia rmixb, {rsamp1,rsamp2,rsamp3,rsamp4,rsamp5,rsamp6} // read words
+ MIX_DC rvolL, rsamp1, rsamp2, rsampa, rsampb // mix data
+ MIX_DC rvolL, rsamp3, rsamp4, rsampa, rsampb
+ MIX_DC rvolL, rsamp5, rsamp6, rsampa, rsampb
+ stmia rmixb!, {rsamp1,rsamp2,rsamp3,rsamp4,rsamp5,rsamp6} // write words
+ subs rmixcc, rmixcc, #6 // count
+ bpl .mpmac_6 // loop
+.mpmac_6e:
+
+ mov rvolR, rvolL // restore right volume (same as left)
+ adds rmixcc, rmixcc, #6 // fix mix count
+ bgt mmMix_Remainder // mix remaining amount
+ b .mpm_mix_complete // finished mixing segment
+
+#undef rsamp1
+#undef rsamp2
+#undef rsamp3
+#undef rsamp4
+#undef rsamp5
+#undef rsamp6
+#undef rsampa
+#undef rsampb
+
+@---------------------------------------------------
+mmMix_ArbPanning: // SLOWEST!
+@---------------------------------------------------
+
+#define rsamp1 r1
+#define rsamp2 r2
+#define rsamp3 r4
+#define rsamp4 r11
+#define rsampa r0
+#define rsampb r12
+#define rsamp5 r14
+
+ subs r3, r3, #10
+ bmi .mpmaa_10e
+.mpmaa_10:
+
+ ldmia rmixb, {rsamp1,rsamp2,rsamp3,rsamp4,rsamp5} // load bufferdata
+ MIX_DB rvolL, rvolR, rsamp1, rsamp2, rsampa, rsampb // mix
+ MIX_DB rvolL, rvolR, rsamp3, rsamp4, rsampa, rsampb // mix
+ MIX_DB rvolL, rvolR, rsamp5, 0, rsampa, rsampb // mix half
+ stmia rmixb!, {rsamp1,rsamp2,rsamp3,rsamp4,rsamp5} // store bufferdata
+ ldmia rmixb, {rsamp1,rsamp2,rsamp3,rsamp4,rsamp5} // load bufferdata
+ mul rsampb, rsampa, rvolR // mix other half
+ bic rsampb, rsampb, #0x1F0000 // ..
+ add rsamp1, rsamp1, rsampb, lsr#5 // ..
+ MIX_DB rvolL, rvolR, rsamp2, rsamp3, rsampa, rsampb // mix
+ MIX_DB rvolL, rvolR, rsamp4, rsamp5, rsampa, rsampb // mix
+ stmia rmixb!, {rsamp1,rsamp2,rsamp3,rsamp4,rsamp5} // store bufferdata
+ subs rmixcc, rmixcc, #10 // count
+ bpl .mpmaa_10 // loop
+.mpmaa_10e:
+
+ adds rmixcc, rmixcc, #10
+ bgt mmMix_Remainder
+ b .mpm_mix_complete
+
+.pool
+
+#undef rsamp1
+#undef rsamp2
+#undef rsamp3
+#undef rsamp4
+#undef rsampa
+#undef rsampb
+
+//---------------------------------------------------------------------------
+mmMix_Remainder:
+//---------------------------------------------------------------------------
+// (slow function to mix remaining amount of samples)
+// assumes mix count isn't zero!
+
+#define rsamp1 r1
+#define rsamp2 r2
+#define rvol r11
+#define rsampa r0
+#define rsampb r4
+
+ orr rvol, rvolL, rvolR, lsl#16
+
+.mix_remaining:
+/* ldrb rsampa, [rsrc, rread, lsr#SAMPFRAC] @ 3 load sample
+ add rread, rread, rfreq @ 1 add frequency
+ mul rsampb, rsampa, rvolL @ 2 multiply by volume
+ ldrh rsamp1, [rmixb] @ 3 load mix buffer entry
+ add rsamp1, rsamp1, rsampb, lsr#5 @ 1 add
+ strh rsamp1, [rmixb], #2 @ 2 store
+ ldrh rsamp1, [rmixb, #2] @ 3
+ mul rsampb, rsampa, rvolR @ 2
+ add rsamp1, rsamp1, rsampb, lsr#5 @ 1
+ strh rsamp1, [rmixb, #2] @ 2
+*/
+
+ ldrb rsampa, [rsrc, rread, lsr#SAMPFRAC] @ 3 load sample
+ add rread, rread, rfreq @ 1 add frequency
+ mul rsampb, rvol, rsampa @ 2 multiply by volume
+ ldrh rsamp1, [rmixb] @ 3 load mix buffer entry (left)
+ bic rsamp2, rsampb, #0xFF0000 @ 1 prep for shift
+ add rsamp1, rsamp1, rsamp2, lsr#5 @ 1 add
+ strh rsamp1, [rmixb], #2 @ 2 store (left)
+ ldrh rsamp1, [rmixb, #2] @ 3 load (right)
+ add rsamp1, rsamp1, rsampb, lsr#16+5 @ 1 add values
+ strh rsamp1, [rmixb, #2] @ 2 store (right)
+
+ subs rmixcc, rmixcc, #2 @ 2
+ blt .end_mix_remaining @ 1/exit
+
+/* ldrb rsampa, [rsrc, rread, lsr#SAMPFRAC] @ load sample
+ add rread, rread, rfreq @ add frequency
+ mul rsampb, rsampa, rvolL @ multiply by volume
+ ldrh rsamp1, [rmixb] @ load mix buffer entry
+ add rsamp1, rsamp1, rsampb, lsr#5 @ add
+ strh rsamp1, [rmixb], #4 @ store
+ ldrh rsamp1, [rmixb]
+ mul rsampb, rsampa, rvolR
+ add rsamp1, rsamp1, rsampb, lsr#5
+ strh rsamp1, [rmixb], #2
+*/
+
+ ldrb rsampa, [rsrc, rread, lsr#SAMPFRAC] @ 3 load sample
+ add rread, rread, rfreq @ 1 add frequency
+ mul rsampb, rvol, rsampa @ 2 multiply by volume
+ ldrh rsamp1, [rmixb] @ 3 load mix buffer entry (left)
+ bic rsamp2, rsampb, #0xFF0000 @ 1 prep for shift
+ add rsamp1, rsamp1, rsamp2, lsr#5 @ 1 add
+ strh rsamp1, [rmixb], #4 @ 2 store (left)
+ ldrh rsamp1, [rmixb] @ 3 load (right)
+ add rsamp1, rsamp1, rsampb, lsr#16+5 @ 1 add values
+ strh rsamp1, [rmixb], #2 @ 2 store (right)
+
+ bgt .mix_remaining
+.end_mix_remaining:
+
+ b .mpm_mix_complete
+
+#undef rsamp1
+#undef rsamp2
+#undef rvol
+#undef rsampa
+#undef rsampb
+
+@============================================================================
+@ END OF MIXER
+@============================================================================
+
+ .TEXT
+ .THUMB
+ .ALIGN 2
+
+/****************************************************************************
+ * mmMixerSetSource( channel, p_sample )
+ *
+ * Set channel source
+ ****************************************************************************/
+ .thumb_func
+mmMixerSetSource:
+
+ mov r2, #CHN_SIZE // get channel pointer from index
+ mul r0, r2 //
+ ldr r2,=mm_mixchannels //
+ ldr r2, [r2] //
+ add r0, r2 //
+
+ add r1, #C_SAMPLE_DATA // set sample data address
+ str r1, [r0, #CHN_SRC] //
+
+ mov r1, #0 // reset read position
+ str r1, [r0, #CHN_READ] //
+
+ bx lr
+
+/****************************************************************************
+ * mmMixerSetRead( channel, value )
+ *
+ * Set channel read position
+ ****************************************************************************/
+ .thumb_func
+mmMixerSetRead:
+
+ mov r2, #CHN_SIZE // get channel pointer from index
+ mul r0, r2 //
+ ldr r2,=mm_mixchannels //
+ ldr r2,[r2] //
+ add r0, r2 //
+
+ str r1, [r0, #CHN_READ] // store new offset
+ bx lr //
+
+/****************************************************************************
+ * mmMixerSetFreq
+ *
+ * Set channel mixing rate
+ ****************************************************************************/
+ .thumb_func
+mmMixerSetFreq:
+
+// push {r3, r4} // FIXME: why would you preserve r3?
+
+ mov r2, #CHN_SIZE // get channel pointer from index
+ mul r0, r2, r0 //
+ ldr r2,=mm_mixchannels //
+ ldr r2,[r2] //
+ add r0, r0, r2 //
+
+ lsl r1, #2 // ...
+
+ strh r1, [r0, #CHN_FREQ]
+ bx lr
+
+/*
+ ldr r4,=mm_freqscalar // r4=scale
+ ldr r4,[r4] //
+
+ add r2, pc, #0 // switch to arm for a nice long multiply
+ bx r2
+
+ .ARM
+
+ //------------------------------------
+ // fix frequency to match mixing rate
+ // a = specified frequency
+ // hz = a*2y13 / pr
+ //------------------------------------
+
+ umull r3, r2, r1, r4 // long multiply
+ add r3, r3, #32768 // shift, etc..
+ mov r3, r3, lsr#16 //
+ orr r3, r3, r2, lsl#16 //
+
+ str r3, [r0, #CHN_FREQ] // set chan frequency
+
+ ldmfd sp!, {r3,r4} // pop registers
+ bx lr // return
+ */
+ .THUMB
+
+/****************************************************************************
+ * mmMixerMulFreq( channel, value )
+ *
+ * Scale mixing frequency
+ ****************************************************************************/
+ .thumb_func
+mmMixerMulFreq:
+
+ mov r2, #CHN_SIZE // get channel pointer from index
+ mul r0, r2 //
+ ldr r2,=mm_mixchannels //
+ ldr r2, [r2] //
+ add r0, r2 //
+
+ ldr r3, [r0, #CHN_FREQ] // scale
+ mul r3, r1 //
+ lsr r3, #10 //
+ str r3, [r0, #CHN_FREQ] //
+ bx lr
+
+/****************************************************************************
+ * mmMixerStopChannel( channel )
+ *
+ * Stop mixing channel
+ ****************************************************************************/
+ .thumb_func
+mmMixerStopChannel:
+
+ mov r1, #CHN_SIZE // get channel pointer from index
+ mul r0, r1 //
+ ldr r1,=mm_mixchannels //
+ ldr r1,[r1] //
+ add r0, r1 //
+
+ mov r1, #1 // set MSB (disable) of source
+ lsl r1, #31 //
+ str r1, [r0] //
+ bx lr
+
+/****************************************************************************
+ * mmMixerChannelActive( channel )
+ *
+ * Test if mixing channel is active
+ ****************************************************************************/
+ .thumb_func
+mmMixerChannelActive:
+
+ mov r1, #CHN_SIZE // get channel pointer from index
+ mul r0, r1 //
+ ldr r1,=mm_mixchannels //
+ ldr r1,[r1] //
+ add r0, r1 //
+
+mp_Mixer_ChannelEnabledA:
+ ldr r0, [r0, #CHN_SRC] // nonzero (-1) = enabled
+ asr r0, #31 // zero = disabled
+ mvn r0, r0 //
+ bx lr
+
+/****************************************************************************
+ * mmMixerSetVolume( channel, volume )
+ *
+ * Set channel volume
+ ****************************************************************************/
+ .thumb_func
+mmMixerSetVolume:
+
+ mov r2, #CHN_SIZE // get channel pointer from index
+ mul r0, r2 //
+ ldr r2,=mm_mixchannels //
+ ldr r2,[r2] //
+ add r0, r2 //
+
+ strb r1, [r0, #CHN_VOL] // set volume
+
+ bx lr
+
+/****************************************************************************
+ * mmMixerSetPan( channel, panning )
+ *
+ * Set channel panning
+ ****************************************************************************/
+ .thumb_func
+mmMixerSetPan:
+
+ mov r2, #CHN_SIZE // get channel pointer from index
+ mul r0, r2 //
+ ldr r2,=mm_mixchannels //
+ ldr r2,[r2] //
+ add r0, r2 //
+
+ strb r1, [r0, #CHN_PAN] // set panning
+ bx lr
+
+/****************************************************************************
+ * mmMixerInit( system )
+ *
+ * Initialize mixer
+ ****************************************************************************/
+ .thumb_func
+mmMixerInit:
+
+ ldr r2,=mm_mixbuffer
+ ldr r1, [r0,#MM_GBA_SYSTEM_ACH_COUNT]
+ str r1, [r2,#16]
+
+ mov r3, #CHN_SIZE
+ mul r1, r3
+ ldr r3, [r0,#MM_GBA_SYSTEM_MIXCH]
+ str r3, [r2,#4]
+ add r3, r1
+ str r3, [r2,#20]
+ ldr r1, [r0,#MM_GBA_SYSTEM_MIXMEM]
+ str r1, [r2,#0]
+ ldr r1, [r0,#MM_GBA_SYSTEM_WAVEMEM]
+ str r1, [r2,#8]
+ ldr r1, [r0,#MM_GBA_SYSTEM_MODE]
+ lsl r1, #1
+ adr r3, mp_mixing_lengths
+ ldrh r3, [r3,r1]
+ str r3, [r2,#12]
+ adr r3, mp_rate_scales
+ ldrh r3, [r3, r1]
+ str r3, [r2, #24]
+ adr r3, mp_timing_sheet
+ ldrh r3, [r3, r1]
+ str r3, [r2, #28]
+ adr r3, mp_bpm_divisors
+ lsl r1, #1
+ ldr r3, [r3,r1]
+
+ ldr r2,=mm_bpmdv
+ str r3, [r2,#0]
+
+
+ ldr r0,=mm_wavebuffer @ clear wave buffer
+ ldr r0,[r0]
+ ldr r1,=mm_mixlen
+ ldr r1, [r1]
+ mov r2, #0 @ ..
+.mpi_loop1: @ ..
+ stmia r0!, {r2} @ ..
+ sub r1, r1, #1 @ ..
+ bne .mpi_loop1 @ ..
+
+ ldr r0,=mp_mix_seg @ reset mixing segment
+ strb r2, [r0] @ ..
+
+ ldr r0,=mm_mixchannels @ disable mixing channels
+ ldr r1,[r0,#12]@ nchannels
+ ldr r0,[r0]
+ ldr r3,=1<<31
+.mpi_loop2:
+ str r3, [r0, #CHN_SRC]
+ add r0, #CHN_SIZE
+ sub r1, #1
+ bne .mpi_loop2
+
+ ldr r0,=mmVBlank @ enable vblank routine
+ ldr r1,=0xE1A00000 @ ..
+ str r1, [r0] @ ..
+
+ ldr r0,=REG_SGFIFOA @ clear fifo data
+ str r2, [r0] @ ..
+ str r2, [r0, #4] @ ..
+ ldr r0,=REG_SOUNDCNT_H @ reset direct sound
+ strh r2, [r0] @ ..
+ ldr r1,=0x9A0C @ setup sound [DIRECT SOUND A/B reset,timer0,A=left,B=right,volume=100%]
+ strh r1, [r0] @ ..
+ ldr r0,=REG_DMA1SAD @ setup DMA source addresses (playback buffers)
+ ldr r1,=mm_wavebuffer
+ ldr r2, [r1, #4]@mixlen
+ ldr r1, [r1]
+
+ @ldr r1,=mp_playbuffer_l @ ..
+ str r1, [r0] @ ..
+
+ add r1,r2
+ add r1,r2
+
+@ ldr r1,=mp_playbuffer_r @ ..
+ str r1, [r0, #12] @ ..
+
+ ldr r1,=REG_SGFIFOA @ setup DMA destination (sound fifo)
+ str r1, [r0, #4] @ ..
+ add r1, #4 @ ..
+ str r1, [r0, #16] @ ..
+
+ ldr r1,=0xB6000000 @ enable DMA (enable,fifo request,32-bit,repeat)
+ str r1, [r0, #8] @ ..
+ str r1, [r0, #20] @ ..
+
+ ldr r0,=REG_SOUNDCNT_X @ master sound enable
+ mov r1, #0x80 @ ..
+ strh r1, [r0] @ ..
+
+ ldr r0,=REG_VCOUNT @ wait for new frame
+.mpi_vsync: @ ..
+ ldrh r1, [r0] @ skip current vblank period
+ cmp r1, #160 @ ..
+ bge .mpi_vsync @ ..
+.mpi_vsync2:
+ ldrh r1, [r0] @ wait for new one
+ cmp r1, #160 @ ..
+ blt .mpi_vsync2 @ ..
+
+.mpi_vsync_2: @ pass#2
+ ldrh r1, [r0] @ skip current vblank period
+ cmp r1, #160 @ ..
+ bge .mpi_vsync_2 @ ..
+.mpi_vsync2_2:
+ ldrh r1, [r0] @ wait for new one
+ cmp r1, #160 @ ..
+ blt .mpi_vsync2_2 @ ..
+
+ ldr r0,=REG_TM0CNT @ enable sampling timer
+ ldr r1,=mm_timerfreq
+ ldr r1,[r1]
+ mov r2, #0x80
+ lsl r2, #16
+ orr r1, r2
+ @ldr r1,=(-MP_TIMERFREQ&0xFFFF) | (0x80<<16) @ ..
+ str r1, [r0] @ ..
+ bx lr @ finished
+
+
+// round(rate / 59.737)
+.align 2
+mp_mixing_lengths:
+ .hword 136, 176, 224, 264, 304, 352, 448, 528
+ @ 8khz,10khz,13khz,16khz,18khz,21khz,27khz,32khz
+
+.align 2
+//mp_freq_scales: @ (16khz -> real)
+// .hword 33056, 25536, 20064, 17024, 14784, 12768
+
+// 15768*16384 / rate
+mp_rate_scales:
+ .hword 31812, 24576, 19310, 16384, 14228, 12288, 9655, 8192
+ @ 8khz, 10khz, 13khz, 16khz, 18khz, 21khz, 27khz, 32khz
+ @ 8121, 10512, 13379, 15768, 18157, 21024, 26758, 31536,
+
+.align 2
+// gbaclock / rate
+mp_timing_sheet:
+ .hword -2066,-1596,-1254,-1064, -924, -798, -627, -532
+ @ 8khz,10khz,13khz,16khz,18khz,21khz,27khz,32khz
+
+.align 2
+// rate * 2.5
+mp_bpm_divisors:
+ .word 20302,26280,33447,39420,45393,52560,66895,78840
+
+
+.end
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+// TYPE DEFINITIONS
+
+#ifndef MM_TYPES_H
+#define MM_TYPES_H
+
+typedef unsigned int mm_word; // 32 bits
+typedef unsigned short mm_hword; // 16 bits
+typedef unsigned char mm_byte; // 8 bits
+
+typedef unsigned short mm_sfxhand; // sound effect handle
+
+typedef unsigned char mm_bool; // boolean value
+
+typedef void* mm_addr; // pointer
+typedef void* mm_reg; // hardware register
+
+typedef enum
+{
+ MM_MODE_A,
+ MM_MODE_B,
+ MM_MODE_C
+} mm_mode_enum;
+
+typedef enum
+{
+ MM_STREAM_8BIT_MONO = 0x0, // 000b
+ MM_STREAM_8BIT_STEREO = 0x1, // 001b
+
+ MM_STREAM_16BIT_MONO = 0x2, // 010b
+ MM_STREAM_16BIT_STEREO = 0x3, // 011b
+
+// MM_STREAM_ADPCM_MONO = 0x4, // 100b
+// MM_STREAM_ADPCM_STEREO = 0x5, // 101b
+
+// adpcm streaming is not supported by the ds hardware
+// (the loop point data gets recorded so ring buffers are not possible)
+
+//-----------------------------------------------------------------------------
+} mm_stream_formats;
+//-----------------------------------------------------------------------------
+
+typedef mm_word (*mm_callback)( mm_word msg, mm_word param );
+typedef mm_word (*mm_stream_func)( mm_word length, mm_addr dest, mm_stream_formats format );
+
+typedef enum
+{
+ MMRF_MEMORY =0x01,
+ MMRF_DELAY =0x02,
+ MMRF_RATE =0x04,
+ MMRF_FEEDBACK =0x08,
+ MMRF_PANNING =0x10,
+ MMRF_LEFT =0x20,
+ MMRF_RIGHT =0x40,
+ MMRF_BOTH =0x60,
+
+ MMRF_INVERSEPAN =0x80,
+ MMRF_NODRYLEFT =0x100,
+ MMRF_NODRYRIGHT =0x200,
+ MMRF_8BITLEFT =0x400,
+ MMRF_16BITLEFT =0x800,
+ MMRF_8BITRIGHT =0x1000,
+ MMRF_16BITRIGHT =0x2000,
+ MMRF_DRYLEFT =0x4000,
+ MMRF_DRYRIGHT =0x8000
+//-----------------------------------------------------------------------------
+} mm_reverbflags;
+//-----------------------------------------------------------------------------
+
+typedef enum
+{
+ MMRC_LEFT = 1,
+ MMRC_RIGHT = 2,
+ MMRC_BOTH = 3
+//-----------------------------------------------------------------------------
+} mm_reverbch;
+//-----------------------------------------------------------------------------
+
+
+typedef struct mmreverbcfg
+{
+ mm_word flags;
+ mm_addr memory;
+ mm_hword delay;
+ mm_hword rate;
+ mm_hword feedback;
+ mm_byte panning;
+//-----------------------------------------------------------------------------
+} mm_reverb_cfg;
+//-----------------------------------------------------------------------------
+
+typedef enum
+{
+ MM_PLAY_LOOP,
+ MM_PLAY_ONCE
+//-----------------------------------------------------------------------------
+} mm_pmode;
+//-----------------------------------------------------------------------------
+
+typedef enum
+{
+ MM_MIX_8KHZ,
+ MM_MIX_10KHZ,
+ MM_MIX_13KHZ,
+ MM_MIX_16KHZ,
+ MM_MIX_18KHZ,
+ MM_MIX_21KHZ,
+ MM_MIX_27KHZ,
+ MM_MIX_31KHZ
+//-----------------------------------------------------------------------------
+} mm_mixmode;
+//-----------------------------------------------------------------------------
+
+typedef enum
+{
+ MM_TIMER0, // hardware timer 0
+ MM_TIMER1, // hardware timer 1
+ MM_TIMER2, // hardware timer 2
+ MM_TIMER3 // hardware timer 3
+
+//-----------------------------------------------------------------------------
+} mm_stream_timer;
+//-----------------------------------------------------------------------------
+
+typedef struct t_mmdssample
+{
+ mm_word loop_start;
+ union {
+ mm_word loop_length;
+ mm_word length;
+ };
+ mm_byte format;
+ mm_byte repeat_mode;
+ mm_hword base_rate;
+ mm_addr data;
+//-----------------------------------------------------------------------------
+} mm_ds_sample;
+//-----------------------------------------------------------------------------
+
+typedef struct t_mmsoundeffect
+{
+ union {
+// sample ID (defined in soundbank header)
+ mm_word id;
+
+// external sample address, not valid on GBA system
+ mm_ds_sample* sample;
+ };
+
+// playback rate
+ mm_hword rate;
+
+// sound handle
+ mm_sfxhand handle;
+
+// volume, 0..255
+ mm_byte volume;
+
+// panning, 0..255
+ mm_byte panning;
+
+//-----------------------------------------------------------------------------
+} mm_sound_effect;
+//-----------------------------------------------------------------------------
+
+typedef struct t_mmgbasystem
+{
+ mm_mixmode mixing_mode;
+ mm_word mod_channel_count;
+ mm_word mix_channel_count;
+ mm_addr module_channels;
+ mm_addr active_channels;
+ mm_addr mixing_channels;
+ mm_addr mixing_memory;
+ mm_addr wave_memory;
+ mm_addr soundbank;
+//-----------------------------------------------------------------------------
+} mm_gba_system;
+//-----------------------------------------------------------------------------
+
+typedef struct t_mmdssystem
+{
+
+// give MSL_NSONGS
+ mm_word mod_count;
+
+// pass MSL_NSAMPS
+ mm_word samp_count;
+
+// pass pointer to memory buffer
+// (mm_word mem_bank[MSL_BANKSIZE])
+ mm_word* mem_bank;
+
+// fifo channel to use (usually 7)
+ mm_word fifo_channel;
+
+//-----------------------------------------------------------------------------
+} mm_ds_system;
+//-----------------------------------------------------------------------------
+
+typedef struct t_mmstream
+{
+// sampling rate. 1024->32768 (HZ)
+ mm_word sampling_rate;
+
+// number of samples to buffer
+ mm_word buffer_length;
+
+// pointer to filling routine
+ mm_stream_func callback;
+
+// stream format (mm_stream_formats)
+ mm_word format;
+
+// hardware timer selection (mm_stream_timers)
+ mm_word timer;
+
+// if set, user must call mmStreamUpdate manually
+ mm_bool manual;
+
+//-----------------------------------------------------------------------------
+} mm_stream;
+//-----------------------------------------------------------------------------
+
+typedef struct t_mmlayer
+{
+
+// current tick count
+ mm_byte tick;
+
+// current row being played
+ mm_byte row;
+
+// module sequence position
+ mm_byte position;
+
+// number of rows in current pattern
+ mm_byte nrows;
+
+// global volume multiplier
+ mm_byte global_volume;
+
+// speed of module (ticks/row)
+ mm_byte speed;
+
+// module is active
+ mm_byte active;
+
+// tempo of module
+ mm_byte bpm;
+
+//-----------------------------------------------------------------------------
+} mm_modlayer;
+//-----------------------------------------------------------------------------
+
+typedef struct tmm_voice
+{
+
+// data source information
+ mm_addr source; // address to sample data
+ mm_word length; // length of sample data OR loop length (expressed in WORDS)
+ mm_hword loop_start; // loop start position (expressed in WORDS)
+
+// frequency divider
+ mm_hword timer;
+
+// update flags
+ mm_byte flags;
+
+// source format
+ mm_byte format; // 0: 8-bit
+ // 1: 16-bit
+ // 2: adpcm
+// repeat mode
+ mm_byte repeat; // 0: manual
+ // 1: forward loop
+ // 2: one shot
+
+// volume + divider setting
+ mm_byte volume; // 0->127
+ mm_byte divider; // 0->3 = /1, /2, /4, /16
+
+// panning setting
+ mm_byte panning; // 0->127
+
+// index of voice
+ mm_byte index; // 0->15
+
+// pad to 20 bytes
+ mm_byte reserved[1];
+
+//-----------------------------------------------------------------------------
+} mm_voice;
+//-----------------------------------------------------------------------------
+
+enum {
+ MMVF_FREQ =2, // update frequency when this flag is set
+ MMVF_VOLUME =4, // update volume
+ MMVF_PANNING =8, // update panning
+ MMVF_SOURCE =16, // update source and start note
+ MMVF_STOP =32 // stop voice (cut sound)
+};
+
+//-----------------------------------------------------------------------------
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef MP_DEFS_INC
+#define MP_DEFS_INC
+
+@ song 'mode' can be one of the following:
+.equ MPP_PLAY_LOOP ,0
+.equ MPP_PLAY_ONCE ,1
+.equ MPP_PLAY_JINGLE ,2
+
+@ other definitions
+#ifdef SYS_GBA
+
+.struct 0
+MM_GBA_SYSTEM_MODE: .space 4
+MM_GBA_SYSTEM_MCH_COUNT: .space 4
+MM_GBA_SYSTEM_ACH_COUNT: .space 4
+MM_GBA_SYSTEM_MODCH: .space 4
+MM_GBA_SYSTEM_ACTCH: .space 4
+MM_GBA_SYSTEM_MIXCH: .space 4
+MM_GBA_SYSTEM_MIXMEM: .space 4
+MM_GBA_SYSTEM_WAVEMEM: .space 4
+MM_GBA_SYSTEM_SOUNDBANK: .space 4
+MM_GBA_SYSTEM_SIZE:
+
+.equ SAMPFRAC, 12 @ # of bits used in fractional part of sample reading
+#endif
+
+.equ MP_SCHANNELS ,4
+
+@ callback parameters
+
+.equ MMCB_SONGREQUEST ,0x1A @ nds9
+.equ MMCB_SAMPREQUEST ,0x1B @ nds9
+.equ MMCB_DELETESONG ,0x1C @ nds9
+.equ MMCB_DELETESAMPLE ,0x1D @ nds9
+
+@.equ MPCB_SAMPMEMORY ,0x1E @ ---
+@.equ MPCB_SONGMEMORY ,0x1F @ ---
+.equ MMCB_BANKMEMORY ,0x1E @ nds9
+
+.equ MPCB_SONGMESSAGE ,0x2A @ gba/nds7 song playback
+.equ MPCB_SONGFINISHED ,0x2B @ gba/nds7
+
+.struct 0
+mms_rate: .space 4
+mms_len: .space 4
+mms_function: .space 4
+mms_format: .space 4
+mms_timer: .space 4
+mms_manual: .space 1
+mms_size:
+
+.struct 0 // reverb cfg struct
+mmrc_flags: .space 4
+mmrc_memory: .space 4
+mmrc_delay: .space 2
+mmrc_rate: .space 2
+mmrc_feedback: .space 2
+mmrc_panning: .space 1
+
+.equ MMRFS_MEMORY, 0
+.equ MMRFS_DELAY, 1
+.equ MMRFS_RATE, 2
+.equ MMRFS_FEEDBACK, 3
+.equ MMRFS_PANNING, 4
+.equ MMRFS_LEFT, 5
+.equ MMRFS_RIGHT, 6
+.equ MMRFS_INVERSEPAN, 7
+.equ MMRFS_NODRYLEFT, 8
+.equ MMRFS_NODRYRIGHT, 9
+.equ MMRFS_8BITLEFT, 10
+.equ MMRFS_16BITLEFT, 11
+.equ MMRFS_8BITRIGHT, 12
+.equ MMRFS_16BITRIGHT, 13
+.equ MMRFS_DRYLEFT, 14
+.equ MMRFS_DRYRIGHT, 15
+
+// reverbcfg flags
+.equ MMRF_MEMORY, 1<<MMRFS_MEMORY
+.equ MMRF_DELAY, 1<<MMRFS_DELAY
+.equ MMRF_RATE, 1<<MMRFS_RATE
+.equ MMRF_FEEDBACK, 1<<MMRFS_FEEDBACK
+.equ MMRF_PANNING, 1<<MMRFS_PANNING
+.equ MMRF_LEFT, 1<<MMRFS_LEFT
+.equ MMRF_RIGHT, 1<<MMRFS_RIGHT
+.equ MMRF_INVERSEPAN,1<<MMRFS_INVERSEPAN
+.equ MMRF_NODRYLEFT, 1<<MMRFS_DRYLEFT
+.equ MMRF_NODRYRIGHT,1<<MMRFS_DRYRIGHT
+.equ MMRF_8BITLEFT, 1<<MMRFS_8BITLEFT
+.equ MMRF_16BITLEFT, 1<<MMRFS_16BITLEFT
+.equ MMRF_8BITRIGHT, 1<<MMRFS_8BITRIGHT
+.equ MMRF_16BITRIGHT,1<<MMRFS_16BITRIGHT
+.equ MMRF_DRYLEFT, 1<<MMRFS_DRYLEFT
+.equ MMRF_DRYRIGHT, 1<<MMRFS_DRYRIGHT
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+.ifndef MP_FORMAT_MAS_INC
+.equ MP_FORMAT_MAS_INC, 1
+
+@ MAS header structure..................................
+.equ C_MAS_LEN ,0
+.equ C_MAS_INSTN ,1
+.equ C_MAS_SAMPN ,2
+.equ C_MAS_PATTN ,3
+.equ C_MAS_FLAGS ,4
+.equ C_MAS_GV ,5
+.equ C_MAS_SPEED ,6
+.equ C_MAS_TEMPO ,7
+.equ C_MAS_REP ,8
+
+.equ C_MAS_CHANVOL ,12
+.equ C_MAS_CHANPAN ,44
+.equ C_MAS_ORDER ,76
+.equ C_MAS_TABLES ,276
+
+.equ C_FLAGS_GS ,1
+.equ C_FLAGS_OS ,2
+.equ C_FLAGS_SS ,3
+.equ C_FLAGS_XS ,4
+.equ C_FLAGS_DS ,5
+///////.equ C_FLAGS_LS ,5 HUH???
+.equ C_FLAGS_LS ,6
+
+.equ C_FLAGS_X, (1<<3)
+
+@ instrument struct.....................................
+.equ C_MASI_GVOL ,0
+.equ C_MASI_FADE ,1
+.equ C_MASI_RANDVOL ,2
+.equ C_MASI_DCT ,3
+.equ C_MASI_NNA ,4
+.equ C_MASI_ENVFLAGS ,5
+.equ C_MASI_PAN ,6
+.equ C_MASI_DCA ,7
+.equ C_MASI_MAP ,8
+.equ C_MASI_ENVELOPES,12
+//.equ C_MASI_ENVELOPES,248
+
+.equ C_MASIE_SIZE ,0
+.equ C_MASIE_LSTART ,1
+.equ C_MASIE_LEND ,2
+.equ C_MASIE_SSTART ,3
+.equ C_MASIE_SEND ,4
+.equ C_MASIE_NODEC ,5
+.equ C_MASIE_FILTER ,6
+.equ C_MASIE_NODES ,8
+
+.EQU ENVFLAG_A, 0b1000
+
+@ sample structure......................................
+.equ C_MASS_DV ,0
+.equ C_MASS_PAN ,1
+.equ C_MASS_FREQ ,2
+.equ C_MASS_VIT ,4
+.equ C_MASS_VID ,5
+.equ C_MASS_VIS ,6
+.equ C_MASS_VIR ,8
+.equ C_MASS_GV ,7
+
+.equ C_MASS_MSLID ,10
+
+@ pattern structure.....................................
+.equ C_MASP_NROWS ,0
+.equ C_MASP_DATA ,1
+
+@ sample structure......................................
+.equ C_SAMPLE_LEN ,0
+.equ C_SAMPLE_LOOP ,4
+.equ C_SAMPLE_POINT ,12
+.equ C_SAMPLE_DATA ,16
+
+.equ C_SAMPLEN_LSTART,0
+.equ C_SAMPLEN_LEN ,4
+.equ C_SAMPLEN_FORMAT,8
+.equ C_SAMPLEN_REP ,9
+.equ C_SAMPLEN_POINT ,12
+.equ C_SAMPLEN_DATA ,16
+
+.equ C_SAMPLEC_DFREQ ,10
+
+
+.endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * MACROS TO MAKE LIFE EASY *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifdef SYS_NDS9
+
+.macro ret0 @ arm9 pop {pc} has mode change
+ pop {pc}
+.endm
+.macro ret1 @ arm9 pop {pc} has mode change
+ pop {pc}
+.endm
+.macro ret2 @ arm9 pop {pc} has mode change
+ pop {pc}
+.endm
+.macro ret3 @ arm9 pop {pc} has mode change
+ pop {pc}
+.endm
+
+.macro jump7
+ blx r7
+.endm
+
+
+.macro jump2
+ blx r2
+.endm
+
+.macro jump1
+ blx r1
+.endm
+
+.macro fjump2 function
+ ldr r2,=function
+ blx r2
+.endm
+
+#else
+
+.macro ret0 @ arm7 requires pop/bx combo
+ pop {r0}
+ bx r0
+.endm
+.macro ret1
+ pop {r1}
+ bx r1
+.endm
+.macro ret2
+ pop {r2}
+ bx r2
+.endm
+.macro ret3
+ pop {r3}
+ bx r3
+.endm
+
+
+.macro jump7
+#ifdef USE_IWRAM
+ bl mpp_call_r7i
+#else
+ bl mpp_call_r7
+#endif
+.endm
+
+.macro jump2
+#ifdef USE_IWRAM
+ bl mpp_call_r2i
+#else
+ bl mpp_call_r2
+#endif
+.endm
+
+.macro fjump2 function
+ ldr r2,=\function
+ jump2
+.endm
+
+.macro jump1
+#ifdef USE_IWRAM
+ bl mpp_call_r1i
+#else
+ bl mpp_call_r1
+#endif
+.endm
+
+#endif
+
+.macro break9
+9: b 9b
+.endm
+
+.macro breakp
+mov r11,r11
+.endm
+
+.macro GET_MIXCH reg
+#ifdef SYS_NDS
+ ldr \reg,=mm_mix_channels
+#endif
+#ifdef SYS_GBA
+ ldr \reg,=mm_mixchannels
+ ldr \reg, [\reg]
+#endif
+.endm
+
+//#define ENABLE_PROFILE
+
+.macro PROF_START mode
+
+#ifdef ENABLE_PROFILE
+
+ push {r0-r3}
+ push {lr}
+ ldr r1,=profile_start
+ mov r2, pc
+ add r2, #5
+ mov lr, r2
+ bx r1
+ pop {r0}
+ mov lr, r0
+ pop {r0-r3}
+#endif
+
+.endm
+
+.macro PROF_END mode
+
+#ifdef ENABLE_PROFILE
+ push {r0-r3}
+ push {lr}
+ mov r0, #\mode
+ ldr r1,=profile_take
+ mov r2, pc
+ add r2, #5
+ mov lr, r2
+ bx r1
+ pop {r0}
+ mov lr, r0
+ pop {r0-r3}
+
+#endif
+
+.endm
+
+.macro __SECTION_IWRAM
+#ifdef SYS_GBA
+ .section ".iwram", "ax", %progbits
+#else
+ .text
+#endif
+.endm
+
+//------------------------------
+.macro nocash_msg msg
+//------------------------------
+ mov r12,r12
+ b 9f
+ .hword 0x6464
+ .hword 0
+ .string "\msg"
+ .align 2
+9:
+.endm
+//------------------------------
+.macro nocash_reset_clks
+//------------------------------
+ nocash_msg %zeroclks%
+.endm
+//------------------------------
+.macro nocash_print_clks
+//------------------------------
+ nocash_msg %lastclks%
+.endm
+//------------------------------
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef MP_MAS_INC
+#define MP_MAS_INC
+
+@#ifdef SYS_NDS
+@.equ MP_MCHANNELS ,16
+@#else
+@.equ MP_MCHANNELS ,32
+@#endif
+
+.extern mpp_vars
+.extern mpp_pattread
+.extern mpp_sm_handle
+
+.extern mpp_resetchannels
+.extern mpp_PlaySong
+.extern mpp_processtick
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+@ Layer Information
+@ -----------------
+
+.equ MPL_TICK ,0
+.equ MPL_ROW ,1
+.equ MPL_POSITION ,2
+.equ MPL_NROWS ,3
+.equ MPL_GV ,4
+.equ MPL_SPEED ,5
+.equ MPL_ISPLAYING ,6
+.equ MPL_BPM ,7
+.equ MPL_INSTTABLE ,8
+.equ MPL_SAMPTABLE ,12
+.equ MPL_PATTTABLE ,16
+.equ MPL_SONGADR ,20
+.equ MPL_FLAGS ,24
+.equ MPL_OLDEFFECTS ,25
+.equ MPL_PATTJUMP ,26
+.equ MPL_PATTJUMP_ROW,27
+.equ MPL_FPATTDELAY ,28
+.equ MPL_PATTDELAY ,29
+
+.equ MPL_PLOOP_ROW ,30
+.equ MPL_PLOOP_TIMES ,31
+.equ MPL_PLOOP_ADR ,32
+.equ MPL_PATTREAD ,36
+.equ MPL_PLOOP_JUMP ,40
+.equ MPL_VALID ,41
+
+.equ MPL_TICKRATE ,42 @ 1.15 fixed point OR sample count
+.equ MPL_SAMPCOUNT ,44 @ sample timing
+.equ MPL_TICKFRAC ,44 @ vsync timing 0.16 fixed point
+
+.equ MPL_MODE ,46
+.equ mpl_reserved2 ,47
+.equ MPL_MCH_UPDATE ,48
+.equ MPL_VOLUME ,52
+.equ mpl_reserved3 ,54
+.equ MPL_SIZE ,56
+
+@ active information
+@--------------------
+
+.equ MPV_PATTREAD_P ,4
+.equ MPV_AFVOL ,8
+.equ MPV_SAMPOFF ,9
+.equ MPV_VOLPLUS ,10
+.equ MPV_NOTEDELAY ,11
+.equ MPV_PANPLUS ,12
+.equ MPV_SIZE ,14
+
+@ Module Channel
+@ --------------
+
+.EQU MCH_ALLOC, 0 @ ALLOCATED ACTIVE CHANNEL#
+.EQU MCH_CFLAGS, 1 @ PATTERN COMRESSION FLAGS, called "maskvariable" in ITTECH.TXT
+.EQU MCH_PANNING, 2
+.EQU MCH_VOLCMD, 3 @ VOLUME COLUMN COMMAND
+.EQU MCH_EFFECT, 4 @ EFFECT# } COMBINED
+.EQU MCH_PARAM, 5 @ EFFECT PARAMETER }
+.EQU MCH_FXMEM, 6 @ EFFECT MEMORY
+.EQU MCH_NOTE, 7 @ TRANSLATED NOTE
+.EQU MCH_FLAGS, 8 @ CHANNEL FLAGS
+.EQU MCH_INST, 9 @ INSTRUMENT#
+//.EQU MCH_PFLAGS, 10 @ PLAYBACK FLAGS (???)
+.EQU MCH_VIBDEP, 11
+.EQU MCH_VIBSPD, 12
+.EQU MCH_VIBPOS, 13
+.EQU MCH_VOLUME, 14 //}combined
+.EQU MCH_CVOLUME, 15 //}
+.EQU MCH_PERIOD, 16
+.EQU MCH_BFLAGS, 20
+.EQU MCH_PNOTE, 22 @ PATTERN NOTE
+.EQU MCH_MEMORY, 23 @ 15 bytes
+.EQU MCH_SIZE, 40 @ sizeof( module_channel ) @ 2 extra bytes
+
+@ Active Channel
+@ --------------
+
+.EQU MCA_PERIOD, 0 @ internal period
+.EQU MCA_FADE, 4 // }
+.EQU MCA_ENVC_VOL, 6 // }
+.EQU MCA_ENVC_PAN, 8 // } COMBINED
+.EQU MCA_ENVC_PIC, 10 // } during volume reset
+.EQU MCA_AVIB_DEP, 12 // } AND NEWNOTE, CHECK NEWNOTE ON CHANGES
+.EQU MCA_AVIB_POS, 14 // }
+.EQU MCA_FVOL, 16 // } COMBINED for SPEED
+.EQU MCA_TYPE, 17 // }
+.EQU MCA_INST, 18
+.EQU MCA_PANNING, 19
+.EQU MCA_VOLUME, 20
+.EQU MCA_SAMPLE, 21
+.EQU MCA_PARENT, 22 // } COMBINED
+.EQU MCA_FLAGS, 23 // }
+.EQU MCA_ENVN_VOL, 24
+.EQU MCA_ENVN_PAN, 25
+.EQU MCA_ENVN_PIC, 26
+.EQU MCA_SFX, 27 @ can store this anywhere
+.EQU MCA_SIZE, 28
+
+@ Active Channel Flags
+@ --------------------
+
+.EQU MCAF_KEYON ,1 @ key is on... LOCKED
+.EQU MCAF_FADE ,2 @ note-fade is activated
+.EQU MCAF_START ,4 @ [re]start sample
+.EQU MCAF_UPDATED ,8 @ already updated by pchannel routine
+.EQU MCAF_ENVEND ,16 @ end of envelope
+.EQU MCAF_VOLENV ,32 @ volume envelope enabled
+.EQU MCAF_SUB ,64 @ sublayer.................locked..
+.EQU MCAF_EFFECT ,128 @ subsublayer.............................LOCKED (mpEffect)
+
+@ Active Channel Types
+@ --------------------
+
+.EQU ACHN_DISABLED ,0 @ LOCKED (multiple routines)
+.EQU ACHN_RESERVED ,1 @ (can't be used [alloc channel])
+.EQU ACHN_BACKGROUND ,2 @ LOCKED (alloc channel)
+.EQU ACHN_FOREGROUND ,3
+.EQU ACHN_CUSTOM ,4
+
+@ Module Channel Flags
+@ --------------------
+
+.equ MF_START ,1
+.equ MF_DVOL ,2
+.equ MF_HASVCMD ,4
+.equ MF_HASFX ,8
+.equ MF_NEWINSTR ,16
+
+.EQU MF_NOTEOFF ,64 @ LOCKED
+.EQU MF_NOTECUT ,128 @ LOCKED
+
+@.equ MF_NEWINSTR ,1 @ new instrument
+@.EQU MF_DVOL ,2
+@.EQU MF_START ,4
+@.EQU MF_HASFX ,8
+@.EQU MF_HASVCMD ,16
+@.EQU MF_NOTEOFF ,64 @ LOCKED
+@.EQU MF_NOTECUT ,128 @ LOCKED
+
+@ Other Definitions
+@ -----------------
+
+.equ IT_NNA_CUT ,0 @ New note actions
+.equ IT_NNA_CONT ,1
+.equ IT_NNA_OFF ,2
+.equ IT_NNA_FADE ,3
+
+.equ IT_DCA_CUT ,0 @ Duplicate check actions
+.equ IT_DCA_OFF ,1
+.equ IT_DCA_FADE ,2
+
+@ Misc Reference
+@ --------------
+
+@ BFLAGS:
+@ /////ctv nnppttvv
+@ nn...............new note action
+@ pp...............panbrello waveform
+@ tt...............tremolo waveform
+@ vv...............vibrato waveform
+@ dd...............duplicate check type
+@ v................volume envelope enabled
+@ t................tremor variable...
+@ c................cut channel volume
+@ //////...........reserved
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef MP_MIXER_GBA_INC
+#define MP_MIXER_GBA_INC
+
+@ definitions
+
+.equ MP_SAMPFRAC ,12
+
+.equ MIXER_CHN_SRC ,0
+.equ MIXER_CHN_READ ,4
+.equ MIXER_CHN_VOL ,8
+.equ MIXER_CHN_PAN ,9
+// 10
+// 11
+.equ MIXER_CHN_FREQ ,12
+.equ MIXER_CHN_SIZE ,16
+
+//////////////////////////////////.equ MIXER_CHN_LOOP ,8
+/////////////////////////////////////.equ MIXER_CHN_LEN ,16
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+.equ SWI_DIVIDE, 0x06
#define DATA_H_
#include <stdint.h>
-#include "data/aas_data.h"
+#include "data/snd.h"
#define CONV_RGB24_RGB15(r, g, b) \
(((r) >> 3) | (((uint16_t)(g) & 0xf8) << 2) | (((uint16_t)(b) & 0xf8) << 7))
extern uint32_t tunmap[];
+extern unsigned char sound_data[];
+
#endif /* DATA_H_ */
.globl tuncross_pixels
.globl tuncross_cmap
.globl tunmap
+ .globl sound_data
.align 1
tuncross_pixels:
.align 2
tunmap: .incbin "data/tun.map"
+
+ .align 2
+sound_data: .incbin "data/snd.bin"
0x3e0, 0xf863, 0xffc0, 0x3ff, 0x1ff, 0x001f, 0xf81f, 0x1e0, 0xf81f, 0xf81f, 0xf81f
};
-static void vblperf_intr(void)
-{
- vblperf_count++;
-}
-
-void vblperf_start(int palidx)
+void vblperf_setcolor(int palidx)
{
vblperf_palptr = (uint16_t*)CRAM_BG_ADDR + palidx;
- intr_disable();
- REG_DISPSTAT |= DISPSTAT_IEN_VBLANK;
- interrupt(INTR_VBLANK, vblperf_intr);
- unmask(INTR_VBLANK);
- intr_enable();
}
-void vblperf_stop(void)
-{
- intr_disable();
- REG_DISPSTAT &= ~DISPSTAT_IEN_VBLANK;
- interrupt(INTR_VBLANK, 0);
- mask(INTR_VBLANK);
- intr_enable();
-}
uint32_t panic_regs[16];
void get_panic_regs(void);
y = dbg_drawstr(0, y, " r8 %08x r9 %08x\nr10 %08x r11 %08x\n ip %08x sp %08x\n lr %08x pc %08x\n",
reg[8], reg[9], reg[10], reg[11], reg[12], reg[13], reg[14], reg[15]);
+ /* stop any sound/music playback */
+ REG_SOUNDCNT_H = SCNT_DSA_CLRFIFO | SCNT_DSB_CLRFIFO;
+ REG_TMCNT_H(1) &= ~TMCNT_EN;
+ REG_DMA1CNT_H = 0;
+ REG_DMA2CNT_H = 0;
+
for(;;);
}
uint16_t *vblperf_palptr;
volatile int vblperf_count;
-void vblperf_start(int palidx);
-void vblperf_stop(void);
+void vblperf_setcolor(int palidx);
#define vblperf_begin() \
do { \
REG_DISPCNT = 4 | DISPCNT_BG2 | DISPCNT_FB1;
- vblperf_start(0xff);
+ vblperf_setcolor(0xff);
cdst = (uint16_t*)CRAM_BG_ADDR;
csrc = tuncross_cmap;
#include "intr.h"
#include "debug.h"
#include "game.h"
-
-#include "AAS.h"
#include "data.h"
+#include "maxmod.h"
-#define RGB15(r, g, b) \
- (((uint16_t)(r) & 0x1f) | \
- (((uint16_t)(g) & 0x1f) << 5) | \
- (((uint16_t)(b) & 0x1f) << 10))
+static void vblank(void);
int main(void)
{
REG_WAITCNT = WAITCNT_PREFETCH | WAITCNT_ROM_2_1;
#ifndef NOSOUND
- interrupt(INTR_TIMER1, AAS_Timer1InterruptHandler);
- AAS_SetConfig(AAS_CONFIG_MIX_24KHZ, AAS_CONFIG_CHANS_8, AAS_CONFIG_SPATIAL_STEREO, AAS_CONFIG_DYNAMIC_ON);
- unmask(INTR_TIMER1);
- intr_enable();
-
- AAS_MOD_Play(AAS_DATA_MOD_popcorn);
-#else
- intr_enable();
+ mmInitDefault(sound_data, 8);
+ mmStart(MOD_POPCORN, MM_PLAY_LOOP);
#endif
+ intr_disable();
+ interrupt(INTR_VBLANK, vblank);
+ REG_DISPSTAT |= DISPSTAT_IEN_VBLANK;
+ unmask(INTR_VBLANK);
+
+ intr_enable();
gamescr();
for(;;);
return 0;
}
+
+static void vblank(void)
+{
+ vblperf_count++;
+
+#ifndef NOSOUND
+ mmVBlank();
+ mmFrame();
+#endif
+}
+++ /dev/null
-obj = conv2aas.o
-bin = conv2aas
-
-CFLAGS = -pedantic -Wall -g
-
-$(bin): $(obj)
- $(CC) -o $@ $(obj) $(LDFLAGS)
-
-.PHONY: clean
-clean:
- rm -f $(obj) $(bin)
+++ /dev/null
-/* Copyright (c) 2003-2021 James Daniels */
-/* Distributed under the MIT License */
-/* license terms: see LICENSE file in root or http://opensource.org/licenses/MIT */
-
-/* Notes: */
-/* + Max number of MODs = 256 */
-/* + Max total size of all samples = 33,554,432 bytes */
-/* + Max total size of all patterns = 33,554,432 bytes */
-/* + All functions declared static to work around problem with GCC */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <dirent.h>
-
-#define BYTE signed char
-#define UBYTE unsigned char
-#define BOOL unsigned char
-#define UWORD unsigned short
-#define ULONG unsigned int
-#define WORD signed short
-#define TRUE 1
-#define FALSE 0
-
-__inline static int Min(int a, int b)
-{
- if (a < b)
- return a;
- else
- return b;
-}
-
-__inline static UWORD SwapUWORD( UWORD a )
-{
- return (a>>8)+((a&0xff)<<8);
-}
-
-static int memcmp_new( UBYTE* a, UBYTE* b, int length )
-{
- for(; length > 0; --length )
- if ( *a++ != *b++ )
- return 1;
-
- return 0;
-}
-
-static void memcpy_new( UBYTE* dest, UBYTE* source, int length )
-{
- for(; length > 0; --length )
- *dest++ = *source++;
-}
-
-#define MAX_DATA_LENGTH 33554432
-typedef struct data_pack
-{
- const char* chunk_name;
- int chunk_data_length;
- int chunk_unique;
- int chunk_actual;
- unsigned char chunk_data[MAX_DATA_LENGTH];
-} DATAPACK;
-
-static DATAPACK* DATA_Create( const char* name )
-{
- DATAPACK* new_data = (DATAPACK*)malloc(sizeof(DATAPACK));
-
- if ( new_data )
- {
- /*printf( "DATA_Create( %s ): addr:%p\n", name, new_data ); */
-
- new_data->chunk_name = name;
- new_data->chunk_data_length = 0;
- new_data->chunk_unique = 0;
- new_data->chunk_actual = 0;
- }
- else
- {
- printf( "DATA_Create( %s ): Failed (address:%p length:%d)...\n", name, (void*)new_data, (int)sizeof(DATAPACK) );
- }
-
- return new_data;
-}
-
-static int DATA_AppendAligned( DATAPACK* curr_data, unsigned char* data, int length, int block_length )
-{
- ++curr_data->chunk_actual;
-
- if ( (block_length*((int)(length/block_length))) != length )
- {
- printf( "DATA_AppendAligned( %p, %p, %d, %d ): Warning length not exactly divisible by block_length!\n",
- (void*)curr_data, data, length, block_length );
- return 0;
- }
- else if ( length == 0 )
- {
- return 0;
- }
- else
- {
- int offset = 0;
-
- while ( (offset + block_length) <= curr_data->chunk_data_length )
- {
- if ( memcmp( data, curr_data->chunk_data + offset, length ) == 0 )
- {
- return offset/block_length;
- }
-
- offset += block_length;
- };
-
- if ( curr_data->chunk_data_length <= (MAX_DATA_LENGTH-length) )
- {
- memcpy( curr_data->chunk_data + offset, data, length );
- curr_data->chunk_data_length += length;
- ++curr_data->chunk_unique;
- return offset/block_length;
- }
- else
- {
- --curr_data->chunk_actual;
- printf( "DATA_AppendAligned( %p, %p, %d, %d ): Data >%d bytes!\n",
- (void*)curr_data, data, length, block_length, MAX_DATA_LENGTH );
- return 0;
- }
- }
-}
-
-static int DATA_Append( DATAPACK* curr_data, unsigned char* data, int length )
-{
- ++curr_data->chunk_actual;
-
- if ( length == 0 )
- {
- return 0;
- }
- else
- {
- int offset = 0;
-
- while ( (offset + length) <= curr_data->chunk_data_length )
- {
- if ( memcmp_new( data, curr_data->chunk_data + offset, length ) == 0 )
- return offset;
- ++offset;
- };
-
- if ( curr_data->chunk_data_length <= (MAX_DATA_LENGTH-length) )
- {
- offset = curr_data->chunk_data_length;
- memcpy_new( curr_data->chunk_data + offset, data, length );
- curr_data->chunk_data_length += length;
- ++curr_data->chunk_unique;
- return offset;
- }
- else
- {
- --curr_data->chunk_actual;
- printf( "DATA_Append( %p, %d ): Data >%d bytes!\n", data, length, MAX_DATA_LENGTH );
- return 0;
- }
- }
-}
-
-static void DATA_Write( DATAPACK* curr_data, FILE* out_file )
-{
- int i, len;
- UBYTE val;
-
- len = curr_data->chunk_data_length;
- if ( len & 0x3 )
- {
- len &= ~0x3;
- len += 0x4;
- }
-
- printf( "Writing %s (Unique:%d Actual:%d Length:%d)...", curr_data->chunk_name, curr_data->chunk_unique, curr_data->chunk_actual, len );
-
- fprintf( out_file, "\n.ALIGN\n.GLOBAL %s\n%s:\n.byte", curr_data->chunk_name, curr_data->chunk_name );
-
- if ( len > 0 )
- {
- for( i = 0; i < len; ++i )
- {
- if ( i >= curr_data->chunk_data_length )
- val = 0;
- else
- val = *(curr_data->chunk_data + i);
- if ( i == 0 )
- fprintf( out_file, " %d", val );
- else
- fprintf( out_file, ", %d", val );
- }
- fprintf( out_file, "\n" );
- }
- else
- {
- fprintf( out_file, " 0\n" );
- }
-
- printf( "Done!\n" );
-
- free( curr_data );
-}
-
-struct ModSampleTemp
-{
- UWORD repeat; /* in halfwords */
- UWORD length; /* in halfwords */
- UWORD truelen; /* in halfwords */
- UBYTE volume;
- UBYTE finetune;
-};
-
-struct ModSample
-{
- ULONG data; /* offset in bytes */
- UWORD repeat; /* in halfwords */
- UWORD length; /* in halfwords */
- UBYTE finetune;
- UBYTE volume;
-};
-
-static void MISC_ProcessSound( BYTE* data, int length )
-{
- for(; length > 0; --length )
- {
- int val = *data;
-
- if ( val == -128 )
- val = -127;
-
- *data++ = val;
- }
-}
-
-static void MISC_ConvSoundToSigned( UBYTE* data, int length )
-{
- BYTE* bdata = (BYTE*)data;
- for(; length > 0; --length )
- {
- int val = *data;
- val -= 128;
- *bdata++ = val;
- }
-}
-
-static void MOD_LoadSound( struct ModSample* smp, FILE* in_file, DATAPACK* samples, int length, int truelen, int repeat )
-{
- BYTE* samp = malloc( (length<<1)+16 );
- int data;
-
- fread( samp+16, (length<<1), 1, in_file );
-
- if ( truelen > 0 )
- {
- memset( samp, 0, 16 );
- if ( (repeat < 65535) && (truelen > repeat) )
- memcpy( samp+(repeat<<1), samp+(truelen<<1), 16 ); /* should really merge, also wasteful of memory */
- MISC_ProcessSound( samp, (truelen<<1)+16 );
- data = DATA_Append( samples, (UBYTE*)samp, (truelen<<1)+16 );
- smp->data = data+16;
- }
- else
- {
- smp->data = 0;
- }
- smp->length = truelen;
-
- free( samp );
-}
-
-#define MAX_MODS 256
-
-static struct ModSample samps[MAX_MODS][31];
-static WORD patts[MAX_MODS][128][16]; /* [mod][pattern][channel] */
-static UBYTE mod_num_chans[MAX_MODS];
-static UBYTE mod_song_restart_pos[MAX_MODS];
-static int max_song_length = 0;
-
-static const char* effect_name[32] = { "*0: Arpeggio", "*1: Slide Up", "*2: Slide Down", "*3: Tone Portamento", "*4: Vibrato", "*5: Tone Portamento + Volume Slide", "*6: Vibrato + Volume Slide", "*7: Tremolo", "8: Set Panning Position", "*9: Set Sample Offset", "*A: Volume Slide", "*B: Position Jump", "*C: Set Volume", "*D: Pattern Break", "*F: Set Speed (BPM)", "*F: Set Speed (Ticks)", "*E0: Set Filter", "*E1: Fine Slide Up", "*E2: Fine Slide Down", "E3: Glissando Control", "E4: Set Vibrato Waveform", "E5: Set FineTune", "*E6: Set/Jump to Loop", "E7: Set Tremolo Waveform", "E8: Illegal", "*E9: Retrigger Note", "*EA: Fine Volume Slide Up", "*EB: Fine Volume Slide Down", "*EC: Note Cut", "*ED: Note Delay", "*EE: Pattern Delay", "EF: Invert Loop" };
-
-static int MOD_FindNote( int period )
-{
- const int period_table[61] =
- {
- 0,
- 1712, 1616, 1524, 1440, 1356, 1280, 1208, 1140, 1076, 1016, 960 , 906,
- 856, 808 , 762 , 720 , 678 , 640 , 604 , 570 , 538 , 508 , 480 , 453,
- 428, 404 , 381 , 360 , 339 , 320 , 302 , 285 , 269 , 254 , 240 , 226,
- 214, 202 , 190 , 180 , 170 , 160 , 151 , 143 , 135 , 127 , 120 , 113,
- 107, 101 , 95 , 90 , 85 , 80 , 75 , 71 , 67 , 63 , 60 , 56
- };
- int i, d, r;
- int closest = 1000000000;
-
- r = -1;
-
- for( i = 0; i < 61; ++i )
- {
- d = abs( period_table[i] - period );
- if ( d < closest )
- {
- r = i;
- closest = d;
- }
- }
-
- if ( r == -1 )
- {
- printf( "Can't find note with period:%d...\n", period );
- }
-
- return r;
-}
-
-#define FOUR_CHAR_CODE( ch0, ch1, ch2, ch3 ) \
- ( (long)(unsigned char)(ch0) | ( (long)(unsigned char)(ch1) << 8 ) | \
- ( (long)(unsigned char)(ch2) << 16 ) | ( (long)(unsigned char)(ch3) << 24 ) )
-
-static int MOD_GetNumChans( ULONG file_format )
-{
- switch( file_format )
- {
- case FOUR_CHAR_CODE( 'T', 'D', 'Z', '1'):
- return 1;
- break;
-
- case FOUR_CHAR_CODE( '2', 'C', 'H', 'N'):
- case FOUR_CHAR_CODE( 'T', 'D', 'Z', '2'):
- return 2;
- break;
-
- case FOUR_CHAR_CODE( 'T', 'D', 'Z', '3'):
- return 3;
- break;
-
- case FOUR_CHAR_CODE( 'M', '.', 'K', '.'):
- case FOUR_CHAR_CODE( 'F', 'L', 'T', '4'):
- case FOUR_CHAR_CODE( 'M', '!', 'K', '!'):
- return 4;
- break;
-
- case FOUR_CHAR_CODE( '5', 'C', 'H', 'N'):
- return 5;
- break;
-
- case FOUR_CHAR_CODE( '6', 'C', 'H', 'N'):
- return 6;
- break;
-
- case FOUR_CHAR_CODE( '7', 'C', 'H', 'N'):
- return 7;
- break;
-
- case FOUR_CHAR_CODE( '8', 'C', 'H', 'N'):
- case FOUR_CHAR_CODE( 'O', 'C', 'T', 'A'):
- case FOUR_CHAR_CODE( 'C', 'D', '8', '1'):
- return 8;
- break;
-
- case FOUR_CHAR_CODE( 'F', 'L', 'T', '8'):
- return -2; /* Unsupported MOD type */
- break;
-
- case FOUR_CHAR_CODE( '9', 'C', 'H', 'N'):
- return 9;
- break;
-
- case FOUR_CHAR_CODE( '1', '0', 'C', 'H'):
- return 10;
- break;
-
- case FOUR_CHAR_CODE( '1', '1', 'C', 'H'):
- return 11;
- break;
-
- case FOUR_CHAR_CODE( '1', '2', 'C', 'H'):
- return 12;
- break;
-
- case FOUR_CHAR_CODE( '1', '3', 'C', 'H'):
- return 13;
- break;
-
- case FOUR_CHAR_CODE( '1', '4', 'C', 'H'):
- return 14;
- break;
-
- case FOUR_CHAR_CODE( '1', '5', 'C', 'H'):
- return 15;
- break;
-
- case FOUR_CHAR_CODE( '1', '6', 'C', 'H'):
- return 16;
- break;
-
- case FOUR_CHAR_CODE( '1', '7', 'C', 'H'):
- case FOUR_CHAR_CODE( '1', '8', 'C', 'H'):
- case FOUR_CHAR_CODE( '1', '9', 'C', 'H'):
- case FOUR_CHAR_CODE( '2', '0', 'C', 'H'):
- case FOUR_CHAR_CODE( '2', '1', 'C', 'H'):
- case FOUR_CHAR_CODE( '2', '2', 'C', 'H'):
- case FOUR_CHAR_CODE( '2', '3', 'C', 'H'):
- case FOUR_CHAR_CODE( '2', '4', 'C', 'H'):
- case FOUR_CHAR_CODE( '2', '5', 'C', 'H'):
- case FOUR_CHAR_CODE( '2', '6', 'C', 'H'):
- case FOUR_CHAR_CODE( '2', '7', 'C', 'H'):
- case FOUR_CHAR_CODE( '2', '8', 'C', 'H'):
- case FOUR_CHAR_CODE( '2', '9', 'C', 'H'):
- case FOUR_CHAR_CODE( '3', '0', 'C', 'H'):
- case FOUR_CHAR_CODE( '3', '1', 'C', 'H'):
- case FOUR_CHAR_CODE( '3', '2', 'C', 'H'):
- case FOUR_CHAR_CODE( '3', '3', 'C', 'H'):
- case FOUR_CHAR_CODE( '3', '4', 'C', 'H'):
- case FOUR_CHAR_CODE( '3', '5', 'C', 'H'):
- case FOUR_CHAR_CODE( '3', '6', 'C', 'H'):
- case FOUR_CHAR_CODE( '3', '7', 'C', 'H'):
- case FOUR_CHAR_CODE( '3', '8', 'C', 'H'):
- case FOUR_CHAR_CODE( '3', '9', 'C', 'H'):
- case FOUR_CHAR_CODE( '4', '0', 'C', 'H'):
- case FOUR_CHAR_CODE( '4', '1', 'C', 'H'):
- case FOUR_CHAR_CODE( '4', '2', 'C', 'H'):
- case FOUR_CHAR_CODE( '4', '3', 'C', 'H'):
- case FOUR_CHAR_CODE( '4', '4', 'C', 'H'):
- case FOUR_CHAR_CODE( '4', '5', 'C', 'H'):
- case FOUR_CHAR_CODE( '4', '6', 'C', 'H'):
- case FOUR_CHAR_CODE( '4', '7', 'C', 'H'):
- case FOUR_CHAR_CODE( '4', '8', 'C', 'H'):
- case FOUR_CHAR_CODE( '4', '9', 'C', 'H'):
- case FOUR_CHAR_CODE( '5', '0', 'C', 'H'):
- case FOUR_CHAR_CODE( '5', '1', 'C', 'H'):
- case FOUR_CHAR_CODE( '5', '2', 'C', 'H'):
- case FOUR_CHAR_CODE( '5', '3', 'C', 'H'):
- case FOUR_CHAR_CODE( '5', '4', 'C', 'H'):
- case FOUR_CHAR_CODE( '5', '5', 'C', 'H'):
- case FOUR_CHAR_CODE( '5', '6', 'C', 'H'):
- case FOUR_CHAR_CODE( '5', '7', 'C', 'H'):
- case FOUR_CHAR_CODE( '5', '8', 'C', 'H'):
- case FOUR_CHAR_CODE( '5', '9', 'C', 'H'):
- case FOUR_CHAR_CODE( '6', '0', 'C', 'H'):
- case FOUR_CHAR_CODE( '6', '1', 'C', 'H'):
- case FOUR_CHAR_CODE( '6', '2', 'C', 'H'):
- case FOUR_CHAR_CODE( '6', '3', 'C', 'H'):
- case FOUR_CHAR_CODE( '6', '4', 'C', 'H'):
- return -3; /* Too many channels */
- break;
-
- default:
- return -1; /* Unrecognised MOD type */
- break;
- }
-
- /* 'FLT4', 'FLT8': Startrekker 4/8 channel file. ('FLT6' doesn't exist) */
- /* 'CD81' : Falcon 8 channel MODs */
- /* '2CHN' : FastTracker 2 Channel MODs */
- /* 'yyCH' where yy can be 10, 12, .. 30, 32: FastTracker yy Channel MODs */
- /* 'yyCH' where yy can be 11, 13, 15: TakeTracker 11, 13, 15 channel MODs */
- /* 'TDZx' where x can be 1, 2 or 3: TakeTracker 1, 2, 3 channel MODs */
- /* ModPlug Tracker saves 33-64 channel MODs as '33CH' to '64CH' */
-}
-
-static void MOD_ConvMod( FILE* out_file, DATAPACK* samples, DATAPACK* patterns, const char* filename, int mod_num )
-{
- FILE* in_file;
-
- mod_num_chans[mod_num] = 0;
-
- in_file = fopen( filename, "rb" );
- if ( in_file )
- {
- struct ModSampleTemp samps_temp[32];
- char temp[23];
- int i, tmp, line, chan;
- UBYTE song_length, last_pattern;
- UBYTE song_data[128];
- int pat[64][16];
- UWORD tmp_uword;
- UBYTE tmp_ubyte;
- ULONG notes_temp[16][64];
- int effect_count[32] = { 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 };
- BOOL first;
- ULONG new_temp;
- int num_chans;
- UBYTE song_restart_pos;
-
- /*printf( "\nMOD_ConvMod( %s ): Reading...\n", filename ); */
-
- fread( temp, 20, 1, in_file ); /* mod name */
-
- for( i = 1; i <= 31; ++i )
- {
- fread( temp, 22, 1, in_file ); /* sample name */
-
- fread( &tmp_uword, 2, 1, in_file ); /* sample length */
- samps_temp[i].length = SwapUWORD( tmp_uword );
-
- fread( &tmp_ubyte, 1, 1, in_file ); /* finetune */
- /*if ( tmp_ubyte & 8 ) */
- /* tmp_ubyte -= 8; */
- /*else */
- /* tmp_ubyte += 8; */
- samps_temp[i].finetune = tmp_ubyte;
- if ( tmp_ubyte > 15 )
- printf( "MOD_ConvMod( %s ): Error: finetune > 15...\n", filename );
-
- fread( &tmp_ubyte, 1, 1, in_file ); /* volume */
- samps_temp[i].volume = tmp_ubyte;
-
- if ( tmp_ubyte > 64 )
- {
- printf( "Failed! Reason: Sample vol > 64\n" );
- return;
- }
-
- fread( &tmp_uword, 2, 1, in_file );
- samps_temp[i].repeat = SwapUWORD( tmp_uword );
-
- fread( &tmp_uword, 2, 1, in_file );
- tmp = SwapUWORD( tmp_uword );
-
- /*samps_temp[i].truelen = samps_temp[i].length; */
-
- if ( tmp <= 1 )
- {
- samps_temp[i].repeat = 65535;
- samps_temp[i].truelen = samps_temp[i].length;
- }
- else
- {
- samps_temp[i].truelen = Min( samps_temp[i].repeat + tmp, samps_temp[i].length );
- }
-
- /*printf( "i:%d len:%d vol:%d rep:%d fine:%d\n", i, samps_temp[i].truelen, samps_temp[i].volume, samps_temp[i].repeat, samps_temp[i].finetune ); */
- }
-
- fread( &song_length, 1, 1, in_file );
- fread( &song_restart_pos, 1, 1, in_file );
-
- if ( (song_length < 1) || (song_length > 128) )
- printf( "MOD_ConvMod( %s ): song_length:%d\n", filename, song_length );
-
- last_pattern = 0;
- for( i = 0; i <= 127; ++i )
- {
- fread( &tmp_ubyte, 1, 1, in_file );
- song_data[i] = tmp_ubyte;
- if ( tmp_ubyte > last_pattern )
- last_pattern = tmp_ubyte;
- }
-
- if ( last_pattern > 63 )
- printf( "MOD_ConvMod( %s ): last_pattern:%d\n", filename, last_pattern );
-
- fread( &new_temp, 4, 1, in_file );
- num_chans = MOD_GetNumChans( new_temp );
- if ( num_chans <= 0 )
- {
- switch( num_chans )
- {
- case -2: /* Unsupported MOD type */
- printf( "Failed! Reason: Unsupported MOD type (%x)\n", new_temp );
- break;
-
- case -3: /* Too many channels */
- printf( "Failed! Reason: Too many channels\n" );
- break;
-
- default: /* Unrecognised MOD type */
- printf( "Failed! Reason: Unrecognised MOD type (%x)\n", new_temp );
- break;
- }
- return;
- }
- else
- {
- if ( num_chans == 1 )
- printf( "%d channel...", num_chans );
- else
- printf( "%d channels...", num_chans );
-
- mod_num_chans[mod_num] = num_chans;
- }
-
- for( i = 0; i <= last_pattern; ++i )
- {
- /*curr_note = ¬es_temp[0][0]; */
- for( line = 0; line < 64; ++line )
- {
- for( chan = 0; chan < num_chans; ++chan )
- {
- UBYTE byte1, byte2, byte3, byte4;
- int samp_num, period, effect;
-
- fread( &byte1, 1, 1, in_file );
- fread( &byte2, 1, 1, in_file );
- fread( &byte3, 1, 1, in_file );
- fread( &byte4, 1, 1, in_file );
-
- samp_num = (byte1&0xf0)+(byte3>>4);
- period = (((int)(byte1&0xf))<<8) + ((int)byte2);
- effect = (((int)(byte3&0xf))<<8) + byte4;
- if ( effect != 0 )
- {
- if ( (effect>>8) == 0xe )
- ++effect_count[((effect&0xf0)>>4)+16];
- else
- {
- if ( (effect>>8) == 0xf )
- {
- if ( (effect&0xff) > 31 )
- ++effect_count[14];
- else
- ++effect_count[15];
- }
- else
- {
- if ( (effect>>8) == 0xc )
- if ( (effect&0xff) > 64 )
- effect = 0xc40;
- if ( (effect>>8) == 0xd ) /* pattern break */
- effect = (effect&0xf00) + (((effect>>4)&0xf)*10)+(effect&0xf);
- ++effect_count[effect>>8];
- }
- }
- }
- notes_temp[chan][line] = (samp_num<<24) + (MOD_FindNote(period)<<12) + effect;
- }
- }
-
- for( chan = 0; chan < num_chans; ++chan )
- {
- pat[i][chan] = DATA_AppendAligned( patterns, (UBYTE*)(¬es_temp[chan][0]), 256, 256 );
- }
- }
-
- for( i = 0; i <= 127; ++i )
- {
- if ( i >= song_length )
- {
- for( chan = 0; chan < num_chans; ++chan )
- patts[mod_num][i][chan] = -1;
- }
- else
- {
- for( chan = 0; chan < num_chans; ++chan )
- patts[mod_num][i][chan] = pat[song_data[i]][chan];
- }
- }
-
- if ( song_length > max_song_length )
- max_song_length = song_length;
-
- if ( song_restart_pos < 127 )
- {
- if ( patts[mod_num][song_restart_pos][0] == -1 )
- song_restart_pos = 0;
- }
- else
- {
- song_restart_pos = 0;
- }
-
- mod_song_restart_pos[mod_num] = song_restart_pos;
-
- for( i = 1; i <= 31; ++i )
- {
- if ( samps_temp[i].length > 0 )
- {
- MOD_LoadSound( &samps[mod_num][i-1], in_file, samples, samps_temp[i].length, samps_temp[i].truelen, samps_temp[i].repeat );
- samps[mod_num][i-1].volume = samps_temp[i].volume;
- samps[mod_num][i-1].finetune = samps_temp[i].finetune;
- samps[mod_num][i-1].repeat = samps_temp[i].repeat;
- }
- }
-
- printf( "Done!\n" );
-
- first = TRUE;
- for( i = 0; i <= 31; ++i )
- if ( effect_count[i] > 0 )
- if ( *(effect_name[i]) != '*' )
- {
- if ( first )
- {
- printf( "Unsupported effects:\n" );
- first = FALSE;
- }
- printf( "%s (%d)\n", effect_name[i], effect_count[i] );
- }
-
- printf( "song_length:%d last_pattern:%d\n\n", song_length, last_pattern );
-
- fclose( in_file );
- }
- else
- {
- printf( "MOD_ConvMod( %s ): Unable to open file for reading...\n", filename );
- }
-}
-
-static void MOD_WriteSamples( FILE* out_file, int num_mods )
-{
- int i, s;
-
- fprintf( out_file, "\n.ALIGN\n.GLOBAL AAS_ModSamples\nAAS_ModSamples:" );
-
- for( i = 0; i < num_mods; ++i )
- {
- fprintf( out_file, "\n.word" );
- for( s = 0; s < 31; ++s )
- {
- if ( s == 0 )
- fprintf( out_file, " %u, %u, %u", samps[i][s].data, (samps[i][s].length<<16)+samps[i][s].repeat, ((samps[i][s].volume&0xff)<<8)+(samps[i][s].finetune&0xff) );
- else
- fprintf( out_file, ", %u, %u, %u", samps[i][s].data, (samps[i][s].length<<16)+samps[i][s].repeat, ((samps[i][s].volume&0xff)<<8)+(samps[i][s].finetune&0xff) );
- }
- }
-
- fprintf( out_file, "\n" );
-}
-
-static void MOD_WritePatterns( FILE* out_file, int num_mods )
-{
- int mod_num, pattern_num, channel_num;
- BOOL first;
-
- fprintf( out_file, "\n.ALIGN\n.GLOBAL AAS_Sequence\nAAS_Sequence:" );
-
- for( mod_num = 0; mod_num < num_mods; ++mod_num )
- {
- fprintf( out_file, "\n.short" );
- first = TRUE;
- for( pattern_num = 0; pattern_num < 128; ++pattern_num )
- {
- for( channel_num = 0; channel_num < 16; ++channel_num )
- {
- if ( first )
- {
- first = FALSE;
- fprintf( out_file, " %d", patts[mod_num][pattern_num][channel_num] );
- }
- else
- {
- fprintf( out_file, ", %d", patts[mod_num][pattern_num][channel_num] );
- }
- }
- }
- }
-
- fprintf( out_file, "\n" );
-}
-
-static void MOD_WriteNumChans( FILE* out_file, int num_mods )
-{
- int mod_num;
-
- fprintf( out_file, "\n.ALIGN\n.GLOBAL AAS_NumChans\nAAS_NumChans:\n.byte" );
-
- for( mod_num = 0; mod_num < num_mods; ++mod_num )
- {
- if ( mod_num )
- fprintf( out_file, ", %d", mod_num_chans[mod_num] );
- else
- fprintf( out_file, " %d", mod_num_chans[mod_num] );
- }
-
- fprintf( out_file, "\n" );
-}
-
-static void MOD_WriteSongRestartPos( FILE* out_file, int num_mods )
-{
- int mod_num;
-
- fprintf( out_file, "\n.ALIGN\n.GLOBAL AAS_RestartPos\nAAS_RestartPos:\n.byte" );
-
- for( mod_num = 0; mod_num < num_mods; ++mod_num )
- {
- if ( mod_num )
- fprintf( out_file, ", %d", mod_song_restart_pos[mod_num] );
- else
- fprintf( out_file, " %d", mod_song_restart_pos[mod_num] );
- }
-
- fprintf( out_file, "\n" );
-}
-
-/*
- static void MOD_WritePeriodConvTable( FILE* out_file, int mix_rate )
- {
- int i, freq;
-
- fprintf( out_file, "\nconst UWORD AAS_MOD_period_conv_table[2048] = { 65535" );
-
- for( i = 1; i < 2048; ++i )
- {
- freq = (int)((((double)7093789.2)/((double)(2*i))));
- if ( freq > 65535 )
- freq = 65535;
- fprintf( out_file, ", %d", freq );
- }
-
- fprintf( out_file, " };\n" );
- }
- */
-
-static int last_samp_length = 0;
-
-static int RAW_LoadSound( const char* filename, DATAPACK* sfx )
-{
- int data = -1;
- struct stat file_info;
-
- if ( stat( filename, &file_info ) == 0 )
- {
- FILE* in_file;
- int length;
- length = file_info.st_size;
-
- in_file = fopen( filename, "rb" );
- if ( in_file )
- {
- BYTE* samp = (BYTE*)malloc( length+16 );
-
- /*printf( "\nRAW_LoadSound( %s ): Reading...\n", filename ); */
-
- last_samp_length = length;
-
- fread( samp+16, 1, length, in_file );
- fclose( in_file );
-
- memcpy( samp, samp+length, 16 );
-
- MISC_ProcessSound( samp, length+16 );
-
- data = DATA_Append( sfx, (UBYTE*)samp, length+16 ) + 16;
-
- free( samp );
-
- printf( "Done!\n\n" );
- }
- else
- {
- printf( "\nRAW_LoadSound( %s ): Unable to open...\n", filename );
- }
- }
- else
- {
- printf( "\nRAW_LoadSound( %s ): Unable to open...\n", filename );
- }
-
- return data;
-}
-
-static int WAV_LoadSound( const char* filename, DATAPACK* sfx )
-{
- int data = -1;
- FILE* in_file;
-
- last_samp_length = 0;
-
- in_file = fopen( filename, "rb" );
- if ( in_file )
- {
- ULONG tmp;
-
- fread( &tmp, 4, 1, in_file );
-
- if ( tmp == 0x46464952 ) /* "RIFF" */
- {
- fread( &tmp, 4, 1, in_file );
- fread( &tmp, 4, 1, in_file );
-
- if ( tmp == 0x45564157 ) /* "WAVE" */
- {
- fread( &tmp, 4, 1, in_file );
-
- if ( tmp == 0x20746d66 ) /* "fmt " */
- {
- unsigned short format;
-
- fread( &tmp, 4, 1, in_file );
- fread( &format, 2, 1, in_file );
-
- if ( format == 1 ) /* PCM format */
- {
- unsigned short channels;
-
- fread( &channels, 2, 1, in_file );
-
- if ( channels == 1 ) /* mono */
- {
- unsigned short bits_per_sample;
-
- fread( &tmp, 4, 1, in_file ); /* sample rate in hz */
- fread( &tmp, 4, 1, in_file );
- fread( &tmp, 2, 1, in_file );
- fread( &bits_per_sample, 2, 1, in_file );
-
- if ( bits_per_sample == 8 )
- {
- int ret, length;
- BOOL done;
-
- done = FALSE;
- length = 0;
-
- do
- {
- ret = fread( &tmp, 4, 1, in_file );
-
- if ( ret == 1 )
- {
- if ( tmp == 0x61746164 ) /* "data" */
- {
- ret = fread( &length, 4, 1, in_file );
-
- if ( ret == 1 )
- {
- if ( length > 0 )
- {
- done = TRUE;
- }
- }
- else
- {
- done = TRUE;
- }
- }
- else
- {
- int size;
-
- ret = fread( &size, 4, 1, in_file );
-
- if ( ret == 1 )
- {
- fseek( in_file, size, SEEK_CUR );
- }
- else
- {
- done = TRUE;
- }
- }
- }
- else
- {
- done = TRUE;
- }
- }
- while ( !done );
-
- if ( length > 0 )
- {
- BYTE* samp = (BYTE*)malloc( length+16 );
-
- last_samp_length = length;
-
- fread( samp+16, 1, length, in_file );
-
- memcpy( samp, samp+length, 16 );
-
- MISC_ConvSoundToSigned( (UBYTE*)samp, length+16 );
-
- MISC_ProcessSound( samp, length+16 );
-
- data = DATA_Append( sfx, (UBYTE*)samp, length+16 ) + 16;
-
- free( samp );
-
- printf( "Done!\n\n" );
- }
- else
- {
- printf( "Failed: Unable to find valid data subchunk...\n" );
- }
- }
- else
- {
- printf( "\nWAV_LoadSound( %s ): Failed: Not 8 bit...\n", filename );
- }
- }
- else
- {
- printf( "\nWAV_LoadSound( %s ): Failed: Not mono...\n", filename );
- }
- }
- else
- {
- printf( "\nWAV_LoadSound( %s ): Failed: Not in PCM format...\n", filename );
- }
- }
- else
- {
- printf( "\nWAV_LoadSound( %s ): Failed: Missing fmt subchunk...\n", filename );
- }
- }
- else
- {
- printf( "\nWAV_LoadSound( %s ): Failed: Not a WAVE file...\n", filename );
- }
- }
- else
- {
- printf( "\nWAV_LoadSound( %s ): Failed: RIFF header missing...\n", filename );
- }
-
- fclose( in_file );
- }
- else
- {
- printf( "\nWAV_LoadSound( %s ): Failed: Unable to open...\n", filename );
- }
-
- return data;
-}
-
-__inline static char String_GetChar( const char* txt, int offset )
-{
- return *(txt+offset);
-}
-
-static BOOL String_EndsWithMOD( const char* txt )
-{
- int txt_len = strlen( txt );
-
- if ( txt_len > 4 )
- {
- if ( (String_GetChar( txt, txt_len-4 ) == '.') &&
- ((String_GetChar( txt, txt_len-3 ) == 'm') || (String_GetChar( txt, txt_len-3 ) == 'M')) &&
- ((String_GetChar( txt, txt_len-2 ) == 'o') || (String_GetChar( txt, txt_len-2 ) == 'O')) &&
- ((String_GetChar( txt, txt_len-1 ) == 'd') || (String_GetChar( txt, txt_len-1 ) == 'D')) )
- {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static BOOL String_EndsWithRAW( const char* txt )
-{
- int txt_len = strlen( txt );
-
- if ( txt_len > 4 )
- {
- if ( (String_GetChar( txt, txt_len-4 ) == '.') &&
- ((String_GetChar( txt, txt_len-3 ) == 'r') || (String_GetChar( txt, txt_len-3 ) == 'R')) &&
- ((String_GetChar( txt, txt_len-2 ) == 'a') || (String_GetChar( txt, txt_len-2 ) == 'A')) &&
- ((String_GetChar( txt, txt_len-1 ) == 'w') || (String_GetChar( txt, txt_len-1 ) == 'W')) )
- {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static BOOL String_EndsWithWAV( const char* txt )
-{
- int txt_len = strlen( txt );
-
- if ( txt_len > 4 )
- {
- if ( (String_GetChar( txt, txt_len-4 ) == '.') &&
- ((String_GetChar( txt, txt_len-3 ) == 'w') || (String_GetChar( txt, txt_len-3 ) == 'W')) &&
- ((String_GetChar( txt, txt_len-2 ) == 'a') || (String_GetChar( txt, txt_len-2 ) == 'A')) &&
- ((String_GetChar( txt, txt_len-1 ) == 'v') || (String_GetChar( txt, txt_len-1 ) == 'V')) )
- {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static void String_MakeSafe( char* temp )
-{
- char c;
-
- while( *temp != (char)0 )
- {
- c = *temp;
- if ( !(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || ((c >= '0') && (c <= '9'))) )
- *temp = '_';
- ++temp;
- }
-}
-
-static void ShowHelp()
-{
- printf( " Usage: Conv2AAS input_dir\n\n" );
- printf( " input_dir Directory containing all Protracker\n" );
- printf( " MODs & sample data\n\n" );
- printf( " Output goes to files AAS_Data.s & AAS_Data.h\n" );
-}
-
-int main( int argc, char *argv[] )
-{
- setbuf( stdout, 0 );
-
- printf( "\n" );
- printf( "/---------------------------------------------\\\n" );
- printf( "| Conv2AAS v1.11 WAV, RAW & MOD -> AAS |\n" );
- printf( "| Copyright (c) 2005, Apex Designs |\n" );
- printf( "\\---------------------------------------------/\n\n" );
-
- if ( argc < 2 )
- {
- ShowHelp();
- }
- else if ( (argc == 2) && ((strcmp( argv[1], "-help" ) == 0) || (strcmp( argv[1], "-?" ) == 0)) )
- {
- ShowHelp();
- }
- else
- {
- FILE* out_file_s;
-
- out_file_s = fopen( "data/aas_data.s", "w" );
- if ( out_file_s )
- {
- FILE* out_file_h;
-
- out_file_h = fopen( "data/aas_data.h", "w" );
- if ( out_file_h )
- {
- DIR* dir_info;
-
- dir_info = opendir( argv[1] );
- if ( dir_info )
- {
- int files_converted = 0;
- int mods_found = 0;
- DATAPACK* samples;
- DATAPACK* patterns;
- struct dirent* file_info;
-
- samples = DATA_Create( "AAS_SampleData" );
- patterns = DATA_Create( "AAS_PatternData" );
-
- fprintf( out_file_h, "#ifndef __AAS_DATA__\n#define __AAS_DATA__\n\n#include \"AAS.h\"\n\n#if AAS_VERSION != 0x111\n#error AAS version does not match Conv2AAS version\n#endif\n\nAAS_BEGIN_DECLS\n" );
-
- fprintf( out_file_s, ".TEXT\n.SECTION .rodata\n.ALIGN\n.ARM\n\n.ALIGN\n.EXTERN AAS_lib_v111\n.GLOBAL AAS_data_v111\nAAS_data_v111:\n.word AAS_lib_v111\n" );
-
- do
- {
- file_info = readdir( dir_info );
- if ( file_info )
- {
- char temp[512];
-
- strcpy( temp, argv[1] );
- strcat( temp, "/" );
- strcat( temp, file_info->d_name );
-
- if ( String_EndsWithMOD( file_info->d_name ) )
- {
- ++files_converted;
- printf( "Adding MOD %s...", file_info->d_name );
- MOD_ConvMod( out_file_h, samples, patterns, temp, mods_found );
- /*printf( "Done!\n" ); */
- strcpy( temp, file_info->d_name );
- *(temp + strlen(temp) - 4) = 0;
- String_MakeSafe( temp );
- fprintf( out_file_h, "\nextern const AAS_u8 AAS_DATA_MOD_%s;\n", temp );
- fprintf( out_file_s, "\n.ALIGN\n.GLOBAL AAS_DATA_MOD_%s\nAAS_DATA_MOD_%s:\n.byte %d\n", temp, temp, mods_found );
- ++mods_found;
- }
- else if ( String_EndsWithRAW( file_info->d_name ) )
- {
- int val;
- ++files_converted;
- printf( "Adding RAW %s...", file_info->d_name );
- val = RAW_LoadSound( temp, samples );
- if ( val >= 0 )
- {
- strcpy( temp, file_info->d_name );
- *(temp + strlen(temp) - 4) = 0;
- String_MakeSafe( temp );
- fprintf( out_file_h, "\nextern const AAS_s8* const AAS_DATA_SFX_START_%s;\n", temp );
- fprintf( out_file_s, "\n.ALIGN\n.GLOBAL AAS_DATA_SFX_START_%s\nAAS_DATA_SFX_START_%s:\n.word AAS_SampleData + %d\n", temp, temp, val );
- fprintf( out_file_h, "\nextern const AAS_s8* const AAS_DATA_SFX_END_%s;\n", temp );
- fprintf( out_file_s, "\n.ALIGN\n.GLOBAL AAS_DATA_SFX_END_%s\nAAS_DATA_SFX_END_%s:\n.word AAS_SampleData + %d\n", temp, temp, val+last_samp_length );
- }
- }
- else if ( String_EndsWithWAV( file_info->d_name ) )
- {
- int val;
- ++files_converted;
- printf( "Adding WAV %s...", file_info->d_name );
- val = WAV_LoadSound( temp, samples );
- if ( val >= 0 )
- {
- strcpy( temp, file_info->d_name );
- *(temp + strlen(temp) - 4) = 0;
- String_MakeSafe( temp );
- fprintf( out_file_h, "\nextern const AAS_s8* const AAS_DATA_SFX_START_%s;\n", temp );
- fprintf( out_file_s, "\n.ALIGN\n.GLOBAL AAS_DATA_SFX_START_%s\nAAS_DATA_SFX_START_%s:\n.word AAS_SampleData + %d\n", temp, temp, val );
- fprintf( out_file_h, "\nextern const AAS_s8* const AAS_DATA_SFX_END_%s;\n", temp );
- fprintf( out_file_s, "\n.ALIGN\n.GLOBAL AAS_DATA_SFX_END_%s\nAAS_DATA_SFX_END_%s:\n.word AAS_SampleData + %d\n", temp, temp, val+last_samp_length );
- }
- }
- }
- } while ( file_info );
-
- closedir( dir_info );
-
- fprintf( out_file_s, "\n.ALIGN\n.GLOBAL AAS_DATA_NUM_MODS\nAAS_DATA_NUM_MODS:\n.short %d\n", mods_found );
-
- MOD_WriteSamples( out_file_s, mods_found );
- MOD_WritePatterns( out_file_s, mods_found );
- MOD_WriteNumChans( out_file_s, mods_found );
- MOD_WriteSongRestartPos( out_file_s, mods_found );
-
- /*MOD_WritePeriodConvTable( out_file_h, 24002 ); */
-
- DATA_Write( samples, out_file_s );
- DATA_Write( patterns, out_file_s );
-
- printf( "\n" );
-
- fprintf( out_file_h, "\nAAS_END_DECLS\n\n#endif\n" );
- }
- else
- {
- printf( "Unable to open directory %s...\n", argv[1] );
- }
-
- fclose( out_file_h );
- }
- else
- {
- printf( "Unable to open AASData.h for writing...\n" );
- }
-
- fclose( out_file_s );
- }
- else
- {
- printf( "Unable to open AASData.s for writing...\n" );
- }
- }
-
- return 0;
-}
--- /dev/null
+Maxmod Utility
+
+Copyright (c) 2008, Mukunda Johnson
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of the owners nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
--- /dev/null
+src = $(wildcard *.c)
+obj = $(src:.c=.o)
+bin = mmutil
+
+CC = gcc
+CFLAGS = -Wno-multichar
+LDFLAGS = -lm
+
+$(bin): $(obj)
+ $(CC) -o $@ $(obj) $(LDFLAGS)
+
+.PHONY: clean
+clean:
+ rm -f $(obj) $(bin)
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+// thanks GBATEK for the ima-adpcm specification
+
+#include <stdlib.h>
+#include "defs.h"
+#include "deftypes.h"
+#include "mas.h"
+
+const s8 IndexTable[8] = {
+ -1, -1, -1, -1, 2, 4, 6, 8
+};
+
+const u16 AdpcmTable[89] = {
+ 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
+ 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
+ 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
+ 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
+ 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
+ 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
+ 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
+ 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
+ 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
+};
+
+static int read_sample( Sample* sample, int position )
+{
+ int s;
+ if( sample->format & SAMPF_16BIT )
+ {
+ s = ((s16*)sample->data)[position];
+ }
+ else
+ {
+ // expand 8-bit value
+ int a = ((s8*)sample->data)[position];
+ s = (a<<8);
+ }
+ if( s < -32767 ) s = -32767; // is this necessary?...
+ return s;
+}
+
+static int minmax( int value, int low, int high )
+{
+ if( value < low ) value = low;
+ if( value > high ) value = high;
+ return value;
+}
+
+static int calc_delta( int diff, int step )
+{
+ int delta = (step >> 3); // t/8
+
+ if( diff >= step ) { // t/1
+ diff -= step;
+ delta += step;
+ }
+ if( diff >= (step>>1) ) { // t/2
+ diff -= step>>1;
+ delta += step>>1;
+ }
+ if( diff >= (step>>2) ) { // t/4
+ diff -= step>>2;
+ delta += step>>2;
+ }
+ return delta;
+}
+
+//----------------------------------------------------------------------
+// Compresses a sample with IMA-ADPCM
+// Make sure the data has proper alignment/length!
+//----------------------------------------------------------------------
+void adpcm_compress_sample( Sample* sample )
+//----------------------------------------------------------------------
+{
+ u32 x;
+ u8* output;
+
+ int prev_value;
+ int curr_value;
+
+ int diff;
+ int data;
+ int delta;
+
+ int index;
+ int step;
+
+ // allocate space for sample (compressed size)
+ output = (u8*)malloc( sample->sample_length/2+4 );
+
+ prev_value = read_sample( sample, 0 );
+ index = 0;
+
+ { // determine best (or close to best) initial table value
+
+ int i;
+ int smallest_error;
+ int tmp_error;
+ smallest_error = 9999999;
+
+
+ diff = read_sample( sample, 1 ) - read_sample( sample, 0 );
+
+ for( i = 0; i < 88; i++ )
+ {
+ tmp_error = calc_delta( diff, i ) - diff;
+ if( tmp_error < smallest_error )
+ {
+ smallest_error = tmp_error;
+ index = i;
+ }
+ }
+ }
+
+ // set data header
+ (*((u32*)output)) = prev_value // initial PCM16 value
+ | (index << 16); // initial table index value
+
+ step = AdpcmTable[index];
+
+ for( x = 0; x < sample->sample_length; x++ )
+ {
+ curr_value = read_sample( sample, x );
+
+ diff = curr_value - prev_value;
+ if( diff < 0 )
+ {
+ // negate difference & set negative bit
+ diff = -diff;
+ data = 8;
+ }
+ else
+ {
+ // clear negative flag
+ data = 0;
+ }
+
+ /*
+ difference calculation:
+ Diff = AdpcmTable[Index]/8
+ IF (data4bit AND 1) THEN Diff = Diff + AdpcmTable[Index]/4
+ IF (data4bit AND 2) THEN Diff = Diff + AdpcmTable[Index]/2
+ IF (data4bit AND 4) THEN Diff = Diff + AdpcmTable[Index]/1
+ */
+
+ delta = (step >> 3); // t/8 (always)
+
+ if( diff >= step ) { // t/1
+ data |= 4;
+ diff -= step;
+ delta += step;
+ }
+ if( diff >= (step>>1) ) { // t/2
+ data |= 2;
+ diff -= step>>1;
+ delta += step>>1;
+ }
+ if( diff >= (step>>2) ) { // t/4
+ data |= 1;
+ diff -= step>>2;
+ delta += step>>2;
+ }
+
+ // add/subtract delta
+ prev_value += (data&8) ? -delta : delta;
+
+ // claamp output
+ prev_value = minmax( prev_value, -0x7FFF, 0x7FFF );
+
+ // add index table value (and clamp)
+ index = minmax( index + IndexTable[data & 7], 0, 88 );
+
+ // read new step value
+ step = AdpcmTable[index];
+
+ // write output
+ if( (x & 1) )
+ output[(x>>1)+4] |= (data) << 4;
+ else
+ output[(x>>1)+4] = (data);
+ }
+
+ // delete old sample
+ free( sample->data );
+
+ // assign new sample
+ sample->data = output;
+
+ // new format
+ sample->format = SAMP_FORMAT_ADPCM;
+
+ // new length/loop
+ sample->sample_length = (sample->sample_length/2) +4;
+ sample->loop_start /= 2;
+ sample->loop_end /= 2;
+
+ // step loop past adpcm header
+ sample->loop_start += 4;
+ sample->loop_end += 4;
+}
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef adpcm_h
+#define adpcm_h
+
+void adpcm_compress_sample( Sample* sample );
+
+#endif // adpcm_h
--- /dev/null
+const u8 arm7_bin[] = {
+0x1, 0x3, 0xA0, 0xE3, 0x8, 0x2, 0x80, 0xE5, 0x12, 0x0, 0xA0, 0xE3, 0x0, 0xF0, 0x29, 0xE1, 0x90, 0xD0, 0x9F, 0xE5, 0x13, 0x0, 0xA0, 0xE3, 0x0, 0xF0, 0x29, 0xE1, 0x88, 0xD0, 0x9F, 0xE5, 0x1F, 0x0, 0xA0,
+0xE3, 0x0, 0xF0, 0x29, 0xE1, 0x80, 0xD0, 0x9F, 0xE5, 0x80, 0x0, 0x9F, 0xE5, 0x80, 0x10, 0x9F, 0xE5, 0x0, 0x10, 0x41, 0xE0, 0x7, 0x0, 0x0, 0xEB, 0x78, 0x30, 0x9F, 0xE5, 0x95, 0x19, 0x0, 0xEB, 0x0, 0x0,
+0xA0, 0xE3, 0x0, 0x10, 0xA0, 0xE3, 0x6C, 0x30, 0x9F, 0xE5, 0x91, 0x19, 0x0, 0xEB, 0x2, 0x3, 0xA0, 0xE3, 0x10, 0xFF, 0x2F, 0xE1, 0x3, 0x20, 0xA0, 0xE3, 0x2, 0x10, 0x81, 0xE0, 0x2, 0x10, 0xD1, 0xE1, 0x1E,
+0xFF, 0x2F, 0x1, 0x0, 0x20, 0xA0, 0xE3, 0x4, 0x0, 0xA0, 0xE8, 0x4, 0x10, 0x51, 0xE2, 0xFC, 0xFF, 0xFF, 0x1A, 0x1E, 0xFF, 0x2F, 0xE1, 0x2, 0x30, 0x44, 0xE0, 0x3, 0x0, 0xA0, 0xE3, 0x0, 0x30, 0x83, 0xE0,
+0x0, 0x30, 0xD3, 0xE1, 0x1E, 0xFF, 0x2F, 0x1, 0x1, 0x0, 0xB1, 0xE8, 0x1, 0x0, 0xA2, 0xE8, 0x4, 0x30, 0x53, 0xE2, 0xFB, 0xFF, 0xFF, 0x1A, 0x1E, 0xFF, 0x2F, 0xE1, 0xA0, 0xFF, 0x80, 0x3, 0xA0, 0xFE, 0x80,
+0x3, 0xA0, 0xFD, 0x80, 0x3, 0x70, 0xE7, 0x7F, 0x3, 0x38, 0x21, 0x80, 0x3, 0xEC, 0xE5, 0x7F, 0x3, 0xDC, 0x82, 0x7F, 0x3, 0x0, 0x0, 0xA0, 0xE1, 0x0, 0x0, 0xA0, 0xE1, 0x0, 0x0, 0xA0, 0xE1, 0xD, 0xC0, 0xA0,
+0xE1, 0xF8, 0xDF, 0x2D, 0xE9, 0x4, 0xB0, 0x4C, 0xE2, 0x28, 0xD0, 0x4B, 0xE2, 0xF0, 0x6F, 0x9D, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x40, 0x2D, 0xE9, 0x28, 0x40,
+0x9F, 0xE5, 0x0, 0x30, 0xD4, 0xE5, 0x0, 0x0, 0x53, 0xE3, 0x5, 0x0, 0x0, 0x1A, 0x1C, 0x30, 0x9F, 0xE5, 0x0, 0x0, 0x53, 0xE3, 0x18, 0x0, 0x9F, 0x15, 0xFF, 0xFF, 0xFF, 0x1A, 0x1, 0x30, 0xA0, 0xE3, 0x0, 0x30,
+0xC4, 0xE5, 0x10, 0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x70, 0xE7, 0x7F, 0x3, 0x0, 0x0, 0x0, 0x0, 0x64, 0xE7, 0x7F, 0x3, 0x4, 0xE0, 0x2D, 0xE5, 0x3C, 0x30, 0x9F, 0xE5, 0x0, 0x0, 0x53, 0xE3, 0x4,
+0xD0, 0x4D, 0xE2, 0x34, 0x0, 0x9F, 0x15, 0x34, 0x10, 0x9F, 0x15, 0xFF, 0xFF, 0xFF, 0x1A, 0x30, 0x0, 0x9F, 0xE5, 0x0, 0x30, 0x90, 0xE5, 0x0, 0x0, 0x53, 0xE3, 0x3, 0x0, 0x0, 0xA, 0x24, 0x30, 0x9F, 0xE5,
+0x0, 0x0, 0x53, 0xE3, 0xF, 0xE0, 0xA0, 0x11, 0x13, 0xFF, 0x2F, 0x11, 0x4, 0xD0, 0x8D, 0xE2, 0x4, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x0, 0x0, 0x0, 0x0, 0x64, 0xE7, 0x7F, 0x3, 0x74, 0xE7, 0x7F,
+0x3, 0x68, 0xE7, 0x7F, 0x3, 0x0, 0x0, 0x0, 0x0, 0x58, 0x30, 0x9F, 0xE5, 0x58, 0x20, 0x9F, 0xE5, 0x0, 0x0, 0x83, 0xE5, 0x54, 0x30, 0x9F, 0xE5, 0x0, 0xC0, 0xA0, 0xE3, 0x4, 0x40, 0x2D, 0xE5, 0x1, 0x13, 0xA0,
+0xE3, 0x22, 0x4E, 0xE0, 0xE3, 0x1, 0x1C, 0x81, 0xE2, 0x2, 0x40, 0x44, 0xE2, 0x0, 0xC0, 0x82, 0xE5, 0x0, 0xC0, 0x83, 0xE5, 0x34, 0x20, 0x9F, 0xE5, 0x84, 0x30, 0xA0, 0xE3, 0xBE, 0xC0, 0xC1, 0xE1, 0xBA,
+0xC0, 0xC1, 0xE1, 0xBC, 0xC0, 0xC1, 0xE1, 0xB8, 0x40, 0xC1, 0xE1, 0xBE, 0x30, 0xC1, 0xE1, 0x80, 0x30, 0xA0, 0xE3, 0x0, 0xC0, 0x82, 0xE5, 0xBA, 0x30, 0xC1, 0xE1, 0x10, 0x0, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F,
+0xE1, 0x98, 0xE7, 0x7F, 0x3, 0x8C, 0xE7, 0x7F, 0x3, 0x90, 0xE7, 0x7F, 0x3, 0x94, 0xE7, 0x7F, 0x3, 0x1, 0x33, 0xA0, 0xE3, 0x1, 0x3C, 0x83, 0xE2, 0xBC, 0x10, 0xD3, 0xE1, 0x4, 0x20, 0x9F, 0xE5, 0x0, 0x10,
+0x82, 0xE5, 0x1E, 0xFF, 0x2F, 0xE1, 0x8C, 0xE7, 0x7F, 0x3, 0x1, 0x33, 0xA0, 0xE3, 0x1, 0x3C, 0x83, 0xE2, 0xF0, 0x41, 0x2D, 0xE9, 0xBC, 0x20, 0xD3, 0xE1, 0x9C, 0x70, 0x9F, 0xE5, 0x9C, 0x80, 0x9F, 0xE5,
+0x0, 0x10, 0x97, 0xE5, 0x2, 0x28, 0xA0, 0xE1, 0x22, 0x58, 0xA0, 0xE1, 0x0, 0x30, 0x98, 0xE5, 0x1, 0x60, 0x55, 0xE0, 0x1, 0x68, 0x86, 0x42, 0x41, 0x5, 0x53, 0xE1, 0x80, 0x40, 0x9F, 0x5, 0xA, 0x0, 0x0,
+0xA, 0x78, 0x40, 0x9F, 0xE5, 0x78, 0x30, 0x9F, 0xE5, 0x0, 0x0, 0x94, 0xE5, 0x0, 0xC0, 0x93, 0xE5, 0xF, 0xE0, 0xA0, 0xE1, 0x1C, 0xFF, 0x2F, 0xE1, 0x0, 0x20, 0x97, 0xE5, 0x0, 0x30, 0xA0, 0xE3, 0x42, 0x25,
+0xA0, 0xE1, 0x0, 0x30, 0x84, 0xE5, 0x0, 0x20, 0x88, 0xE5, 0x0, 0x20, 0x97, 0xE5, 0x0, 0x30, 0x94, 0xE5, 0x45, 0x75, 0xA0, 0xE1, 0x3, 0x0, 0x86, 0xE0, 0x42, 0x5, 0x57, 0xE1, 0x0, 0x0, 0x84, 0xE5, 0x9,
+0x0, 0x0, 0xA, 0x5, 0x4B, 0xA0, 0xE1, 0x24, 0x4B, 0xA0, 0xE1, 0x0, 0x0, 0x64, 0xE0, 0x28, 0x20, 0x9F, 0xE5, 0x0, 0xC0, 0x92, 0xE5, 0xF, 0xE0, 0xA0, 0xE1, 0x1C, 0xFF, 0x2F, 0xE1, 0x14, 0x30, 0x9F, 0xE5,
+0x0, 0x70, 0x88, 0xE5, 0x0, 0x40, 0x83, 0xE5, 0xF0, 0x41, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x8C, 0xE7, 0x7F, 0x3, 0x90, 0xE7, 0x7F, 0x3, 0x94, 0xE7, 0x7F, 0x3, 0x98, 0xE7, 0x7F, 0x3, 0x30, 0x40, 0x2D,
+0xE9, 0x1, 0x43, 0xA0, 0xE3, 0x3, 0x2C, 0x84, 0xE2, 0xB4, 0x30, 0xD2, 0xE1, 0x1, 0x30, 0x83, 0xE3, 0x4, 0xD0, 0x4D, 0xE2, 0xB4, 0x30, 0xC2, 0xE1, 0x0, 0x10, 0xA0, 0xE3, 0x80, 0x0, 0xA0, 0xE3, 0xE8, 0x18,
+0x0, 0xEB, 0x7, 0x10, 0xC0, 0xE3, 0x1, 0x10, 0x81, 0xE3, 0x0, 0x50, 0xA0, 0xE3, 0x5, 0x4C, 0x84, 0xE2, 0x0, 0x0, 0xA0, 0xE3, 0xE2, 0x18, 0x0, 0xEB, 0x38, 0x0, 0x9F, 0xE5, 0xB0, 0x50, 0xC4, 0xE1, 0x98,
+0xFF, 0xFF, 0xEB, 0xE1, 0x18, 0x0, 0xEB, 0xE3, 0x18, 0x0, 0xEB, 0x7, 0x0, 0xA0, 0xE3, 0xE4, 0x18, 0x0, 0xEB, 0x8, 0x0, 0xA0, 0xE3, 0x1C, 0x10, 0x9F, 0xE5, 0xE4, 0x18, 0x0, 0xEB, 0x5, 0x0, 0xA0, 0xE1,
+0x5, 0x10, 0xA0, 0xE1, 0xE4, 0x18, 0x0, 0xEB, 0x4, 0xD0, 0x8D, 0xE2, 0x30, 0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x64, 0x83, 0x7F, 0x3, 0x84, 0x83, 0x7F, 0x3, 0x4, 0xE0, 0x2D, 0xE5, 0x0, 0x10, 0xA0,
+0xE1, 0x4, 0xD0, 0x4D, 0xE2, 0xB, 0x0, 0xA0, 0xE3, 0xDD, 0x18, 0x0, 0xEB, 0x4, 0xD0, 0x8D, 0xE2, 0x4, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x4, 0xE0, 0x2D, 0xE5, 0x4, 0xD0, 0x4D, 0xE2, 0x9A, 0xFF,
+0xFF, 0xEB, 0xD9, 0x18, 0x0, 0xEB, 0x9F, 0xFF, 0xFF, 0xEB, 0x4, 0xD0, 0x8D, 0xE2, 0x4, 0xE0, 0x9D, 0xE4, 0x1E, 0xFF, 0x2F, 0xE1, 0x38, 0x47, 0x8, 0x47, 0x10, 0x47, 0x18, 0x47, 0x5F, 0x49, 0x8, 0x60, 0x70,
+0x47, 0x30, 0xB5, 0x5E, 0x49, 0xA, 0x68, 0x82, 0x43, 0xA, 0x60, 0x4, 0x1C, 0x0, 0x25, 0x64, 0x8, 0x2, 0xD3, 0x28, 0x1C, 0x0, 0xF0, 0x6, 0xF8, 0x1, 0x35, 0x0, 0x2C, 0xF7, 0xD1, 0x30, 0xBC, 0x8, 0xBC, 0x18,
+0x47, 0x10, 0xB4, 0x56, 0x49, 0x10, 0x22, 0x42, 0x43, 0x89, 0x18, 0x0, 0x22, 0xA, 0x60, 0x8A, 0x81, 0xCA, 0x80, 0x53, 0x49, 0x9, 0x68, 0x1C, 0x22, 0x42, 0x43, 0x89, 0x18, 0x0, 0x22, 0xCC, 0x7D, 0xCA,
+0x75, 0x4A, 0x74, 0x21, 0xA, 0x18, 0xD2, 0xE4, 0x9, 0xC, 0xD2, 0x4E, 0x49, 0x9, 0x68, 0x4E, 0x4A, 0x12, 0x68, 0xB, 0x78, 0x83, 0x42, 0x2, 0xD1, 0xFF, 0x23, 0xB, 0x70, 0xC, 0xE0, 0x1, 0x3A, 0xF7, 0xD1,
+0x9, 0xE0, 0x49, 0x49, 0x4, 0x22, 0xB, 0x78, 0x83, 0x42, 0x2, 0xD1, 0xFF, 0x23, 0xB, 0x70, 0x1, 0xE0, 0x1, 0x3A, 0xF7, 0xD1, 0x10, 0xBC, 0x70, 0x47, 0x44, 0x49, 0x9, 0x78, 0x1, 0x29, 0x3, 0xD0, 0x3C,
+0x49, 0xA, 0x68, 0x2, 0x43, 0xA, 0x60, 0x70, 0x47, 0xC0, 0x46, 0x40, 0x48, 0x0, 0x47, 0x0, 0x0, 0xF, 0xE1, 0x80, 0x10, 0x0, 0xE2, 0x80, 0x0, 0x80, 0xE3, 0x0, 0xF0, 0x29, 0xE1, 0x1C, 0x10, 0x8F, 0xE5,
+0x1E, 0xFF, 0x2F, 0xE1, 0x3A, 0x48, 0x0, 0x47, 0x0, 0x0, 0xF, 0xE1, 0xC, 0x10, 0x9F, 0xE5, 0x80, 0x0, 0xC0, 0xE3, 0x1, 0x0, 0x80, 0xE1, 0x0, 0xF0, 0x29, 0xE1, 0x1E, 0xFF, 0x2F, 0xE1, 0x0, 0x0, 0x0, 0x0,
+0x33, 0x48, 0x0, 0x78, 0x70, 0x47, 0x0, 0xB5, 0x6, 0xF0, 0xEE, 0xF8, 0x8, 0x20, 0x31, 0x49, 0x5, 0xF0, 0xE0, 0xFE, 0x8, 0x20, 0x5, 0xF0, 0x4F, 0xFF, 0x2D, 0x48, 0x0, 0x21, 0x1, 0x70, 0x2D, 0x48, 0x0,
+0xF0, 0x43, 0xF9, 0x2C, 0x48, 0x0, 0xF0, 0x48, 0xF9, 0x2A, 0x48, 0x4, 0xF0, 0x9C, 0xFC, 0x2A, 0x48, 0xFF, 0xF7, 0xBC, 0xFF, 0x1E, 0x48, 0x29, 0x49, 0x1, 0x60, 0x29, 0x49, 0x41, 0x60, 0x20, 0x21, 0x81,
+0x60, 0xC1, 0x60, 0x23, 0x48, 0x0, 0xF0, 0x60, 0xF9, 0x22, 0x48, 0x0, 0xF0, 0x76, 0xF9, 0x4, 0xF0, 0x7A, 0xFB, 0x3, 0xF0, 0x40, 0xFF, 0x22, 0x48, 0xFF, 0xF7, 0x63, 0xFF, 0x8, 0xBC, 0x18, 0x47, 0x0, 0xB5,
+0x9, 0x2, 0x8, 0x43, 0x1, 0x21, 0x9, 0x5, 0x8, 0x43, 0x6, 0xF0, 0xBD, 0xF8, 0x0, 0xBD, 0x1C, 0x4A, 0x3, 0xC2, 0x80, 0x0, 0x9, 0x18, 0x2, 0xC2, 0x13, 0x48, 0x2A, 0x21, 0x1, 0x70, 0x70, 0x47, 0x0, 0xB5,
+0x6, 0xF0, 0xB4, 0xF8, 0x6, 0xF0, 0xB6, 0xF8, 0x4, 0xF0, 0x90, 0xFC, 0x0, 0xF0, 0xFE, 0xF9, 0x6, 0xF0, 0xB4, 0xF8, 0x6, 0xF0, 0xB6, 0xF8, 0x2, 0xBC, 0x8, 0x47, 0x9C, 0xE7, 0x7F, 0x3, 0xAC, 0xE7, 0x7F,
+0x3, 0x8C, 0xF2, 0x7F, 0x3, 0xD0, 0xF0, 0x7F, 0x3, 0xD4, 0xF0, 0x7F, 0x3, 0xD8, 0xF0, 0x7F, 0x3, 0xE0, 0xF0, 0x7F, 0x3, 0xED, 0x15, 0x80, 0x3, 0x4C, 0x84, 0x7F, 0x3, 0x68, 0x84, 0x7F, 0x3, 0x34, 0xF0,
+0x7F, 0x3, 0xF, 0x85, 0x7F, 0x3, 0x0, 0x4, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x0, 0xB4, 0xEC, 0x7F, 0x3, 0xB4, 0xE7, 0x7F, 0x3, 0xEB, 0x84, 0x7F, 0x3, 0xA0, 0xE7, 0x7F, 0x3, 0x70, 0xB4, 0x30, 0x1C, 0xA, 0x21,
+0x79, 0x43, 0x0, 0x22, 0x4, 0xC0, 0x1, 0x39, 0xFC, 0xD1, 0x30, 0x1C, 0x28, 0x38, 0x28, 0x21, 0x79, 0x43, 0xFF, 0x22, 0x42, 0x54, 0x28, 0x39, 0xFC, 0xD1, 0x4E, 0x4C, 0x4F, 0x4E, 0x36, 0x78, 0x0, 0x25,
+0x4E, 0x48, 0x0, 0x68, 0x4E, 0x49, 0x9, 0x68, 0x0, 0x22, 0xC3, 0x7D, 0x9B, 0x9, 0xB3, 0x42, 0x4, 0xD1, 0x18, 0x23, 0xC2, 0x50, 0x4, 0x3B, 0xFC, 0xD5, 0x25, 0x60, 0x1C, 0x30, 0x10, 0x34, 0x1, 0x39, 0xF2,
+0xD1, 0x70, 0xBC, 0x70, 0x47, 0x0, 0xB5, 0x44, 0x48, 0x0, 0x68, 0x0, 0x21, 0xE0, 0x22, 0x2, 0xC0, 0x1, 0x3A, 0xFC, 0xD1, 0x42, 0x48, 0x0, 0x68, 0xFF, 0x21, 0x20, 0x22, 0x1, 0x70, 0x28, 0x30, 0x1, 0x3A,
+0xFB, 0xD1, 0x3F, 0x48, 0x4, 0x22, 0x1, 0x70, 0x28, 0x30, 0x1, 0x3A, 0xFB, 0xD1, 0x4, 0xF0, 0xEE, 0xFA, 0x8, 0xBC, 0x18, 0x47, 0x10, 0xB5, 0x37, 0x48, 0x0, 0x68, 0x34, 0x49, 0x36, 0x4A, 0x12, 0x68, 0x0,
+0x24, 0xC3, 0x7D, 0x9B, 0x9, 0x1, 0xD1, 0x8C, 0x80, 0xCC, 0x80, 0x1C, 0x30, 0x10, 0x31, 0x1, 0x3A, 0xF6, 0xD1, 0x10, 0xBD, 0x0, 0x22, 0x80, 0x0, 0x32, 0x4B, 0x1B, 0x68, 0x18, 0x58, 0x0, 0x28, 0x1, 0xD0,
+0x8, 0x30, 0x3, 0xE0, 0x70, 0x47, 0x1, 0x22, 0x1, 0x21, 0xF3, 0xE7, 0x0, 0xB5, 0xF0, 0xB4, 0x26, 0x4B, 0x1A, 0x70, 0x0, 0x2A, 0x5, 0xD1, 0x2A, 0x4D, 0x27, 0x4E, 0x36, 0x68, 0x2A, 0x4F, 0x3F, 0x68, 0x2,
+0xE0, 0x29, 0x4D, 0x25, 0x4E, 0x4, 0x27, 0x2E, 0x22, 0xA9, 0x54, 0x4, 0x1C, 0x6C, 0x61, 0xFF, 0xF7, 0x8B, 0xFF, 0x63, 0x78, 0xA2, 0x78, 0x9B, 0x0, 0x92, 0x0, 0x20, 0x1C, 0xFF, 0x30, 0x15, 0x30, 0xA8,
+0x60, 0xC0, 0x18, 0xE8, 0x60, 0x80, 0x18, 0x28, 0x61, 0x0, 0x20, 0x0, 0xF0, 0x6, 0xF9, 0xE0, 0x79, 0x0, 0xF0, 0xE7, 0xF8, 0x60, 0x79, 0x28, 0x71, 0x20, 0x79, 0x28, 0x76, 0x80, 0x7, 0xC0, 0xF, 0x68, 0x76,
+0xA0, 0x79, 0x68, 0x71, 0x1, 0x20, 0xA8, 0x71, 0x29, 0x21, 0x68, 0x54, 0x0, 0xF0, 0xD3, 0xF8, 0x30, 0x1C, 0xF, 0x30, 0x3B, 0x1C, 0xC, 0x34, 0x21, 0x78, 0x1, 0x70, 0x28, 0x30, 0x1, 0x34, 0x1, 0x3B, 0xF9,
+0xD1, 0x20, 0x34, 0xE4, 0x1B, 0x30, 0x1C, 0x2, 0x30, 0x3B, 0x1C, 0x21, 0x78, 0x1, 0x70, 0x28, 0x30, 0x1, 0x34, 0x1, 0x3B, 0xF9, 0xD1, 0xF0, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0x8C, 0xF2, 0x7F, 0x3, 0xCD, 0xF0,
+0x7F, 0x3, 0xD0, 0xF0, 0x7F, 0x3, 0xDC, 0xF0, 0x7F, 0x3, 0xD4, 0xF0, 0x7F, 0x3, 0xE0, 0xF0, 0x7F, 0x3, 0xA4, 0xE7, 0x7F, 0x3, 0x38, 0xF0, 0x7F, 0x3, 0xD8, 0xF0, 0x7F, 0x3, 0x70, 0xF0, 0x7F, 0x3, 0x0,
+0xB5, 0x20, 0xB4, 0x39, 0x4D, 0x29, 0x20, 0x28, 0x5C, 0x0, 0x28, 0x3, 0xD0, 0x0, 0x20, 0xA8, 0x71, 0xFF, 0xF7, 0x75, 0xFF, 0x20, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0x33, 0x49, 0x29, 0x20, 0x8, 0x5C, 0x0, 0x28,
+0x1, 0xD0, 0x1, 0x20, 0x88, 0x71, 0x70, 0x47, 0x2F, 0x48, 0x80, 0x79, 0x70, 0x47, 0x2F, 0x48, 0x80, 0x79, 0x70, 0x47, 0x81, 0xA, 0x1, 0xD0, 0x1, 0x20, 0x80, 0x2, 0x2A, 0x49, 0x34, 0x22, 0x88, 0x52, 0x70,
+0x47, 0x81, 0xA, 0x1, 0xD0, 0x1, 0x20, 0x80, 0x2, 0x27, 0x49, 0x34, 0x22, 0x88, 0x52, 0x70, 0x47, 0x0, 0xB5, 0x26, 0x48, 0x0, 0x78, 0x0, 0x28, 0x3, 0xD0, 0x23, 0x4D, 0x24, 0x4E, 0x4, 0x27, 0x4, 0xE0,
+0x20, 0x4D, 0x23, 0x4E, 0x36, 0x68, 0x23, 0x4F, 0x3F, 0x68, 0x0, 0x20, 0xA8, 0x71, 0x29, 0x21, 0x68, 0x54, 0xFF, 0xF7, 0xFE, 0xFE, 0x1, 0xBC, 0x0, 0x47, 0x30, 0xB5, 0x19, 0x4D, 0x1, 0xB4, 0xFF, 0xF7,
+0xF7, 0xFE, 0x1, 0xBC, 0x0, 0xF0, 0x7E, 0xF8, 0x30, 0xBC, 0x8, 0xBC, 0x18, 0x47, 0x20, 0xB5, 0x1, 0x21, 0xC9, 0x2, 0x88, 0x42, 0x0, 0xDD, 0x8, 0x1C, 0x1, 0x21, 0x49, 0x2, 0x88, 0x42, 0x0, 0xDA, 0x8, 0x1C,
+0x14, 0x49, 0x8, 0x60, 0xD, 0x4D, 0xF, 0x48, 0x0, 0x21, 0x1, 0x70, 0xE8, 0x79, 0x0, 0x28, 0x1, 0xD0, 0x0, 0xF0, 0x49, 0xF8, 0x20, 0xBC, 0x8, 0xBC, 0x18, 0x47, 0x20, 0xB5, 0x1, 0x21, 0xC9, 0x2, 0x88, 0x42,
+0x0, 0xDD, 0x8, 0x1C, 0x1, 0x21, 0x49, 0x2, 0x88, 0x42, 0x0, 0xDA, 0x8, 0x1C, 0x9, 0x49, 0x8, 0x60, 0x20, 0xBC, 0x8, 0xBC, 0x18, 0x47, 0x38, 0xF0, 0x7F, 0x3, 0x70, 0xF0, 0x7F, 0x3, 0xCD, 0xF0, 0x7F, 0x3,
+0xE0, 0xF0, 0x7F, 0x3, 0xD4, 0xF0, 0x7F, 0x3, 0xD8, 0xF0, 0x7F, 0x3, 0xC4, 0xF0, 0x7F, 0x3, 0xC8, 0xF0, 0x7F, 0x3, 0x20, 0xB5, 0x1B, 0x49, 0x8, 0x60, 0x1B, 0x4D, 0x1B, 0x48, 0x0, 0x21, 0x1, 0x70, 0xE8,
+0x79, 0x0, 0x28, 0x1, 0xD0, 0x0, 0xF0, 0x1A, 0xF8, 0x18, 0x4D, 0x17, 0x48, 0x1, 0x21, 0x1, 0x70, 0xE8, 0x79, 0x0, 0x28, 0x1, 0xD0, 0x0, 0xF0, 0x11, 0xF8, 0x20, 0xBC, 0x8, 0xBC, 0x18, 0x47, 0xF0, 0xB5,
+0x11, 0x49, 0x0, 0x20, 0x8, 0x70, 0xFF, 0xF7, 0x88, 0xFF, 0xF0, 0xBC, 0x8, 0xBC, 0x18, 0x47, 0xFF, 0x20, 0xA8, 0x76, 0x0, 0x20, 0xE8, 0x76, 0x70, 0x47, 0xE8, 0x71, 0xA, 0x49, 0x9, 0x78, 0x0, 0x29, 0x4,
+0xD1, 0xA, 0x49, 0x9, 0x68, 0x48, 0x43, 0x0, 0x3, 0x0, 0xE0, 0x80, 0x5, 0x3, 0x49, 0x9, 0x68, 0x9, 0xDF, 0x40, 0x8, 0x2A, 0x21, 0x68, 0x52, 0x70, 0x47, 0xC0, 0xF0, 0x7F, 0x3, 0x38, 0xF0, 0x7F, 0x3, 0xCD,
+0xF0, 0x7F, 0x3, 0x70, 0xF0, 0x7F, 0x3, 0xC4, 0xF0, 0x7F, 0x3, 0x0, 0xB5, 0xA8, 0x70, 0x69, 0x69, 0xB, 0x1C, 0x4C, 0x31, 0x9, 0x5C, 0xFE, 0x29, 0x1, 0xD1, 0x1, 0x30, 0xF6, 0xE7, 0xFF, 0x29, 0x16, 0xD1,
+0x2E, 0x20, 0x28, 0x5C, 0x1, 0x28, 0x0, 0xDA, 0xA, 0xE0, 0xFF, 0xF7, 0x51, 0xFF, 0x2B, 0x20, 0x28, 0x4A, 0x12, 0x68, 0x0, 0x2A, 0x3, 0xD0, 0x27, 0x49, 0x9, 0x78, 0xFF, 0xF7, 0x74, 0xFD, 0xA8, 0x79, 0x0,
+0x28, 0x0, 0xD1, 0x0, 0xBD, 0x68, 0x69, 0x0, 0x7A, 0xDD, 0xE7, 0x8, 0x1C, 0x29, 0x69, 0x80, 0x0, 0x9, 0x58, 0xC9, 0x18, 0xA, 0x78, 0xEA, 0x70, 0x0, 0x22, 0x2A, 0x80, 0x2A, 0x77, 0x6A, 0x77, 0x24, 0x20,
+0x1, 0x31, 0x29, 0x50, 0x20, 0x20, 0x29, 0x50, 0x0, 0x20, 0xA8, 0x77, 0xE8, 0x77, 0x0, 0xBD, 0x0, 0xB5, 0x18, 0x49, 0x8, 0x60, 0x2A, 0x21, 0x41, 0x5A, 0x2C, 0x22, 0x83, 0x5A, 0x49, 0x0, 0x5B, 0x18, 0x83,
+0x52, 0x1B, 0xC, 0x5, 0xD0, 0x8, 0xB4, 0x0, 0xF0, 0x34, 0xF8, 0x8, 0xBC, 0x1, 0x3B, 0xF9, 0xD1, 0x0, 0xBD, 0x0, 0xB5, 0x10, 0x48, 0x10, 0x49, 0x9, 0x68, 0x1, 0x60, 0x10, 0x48, 0x10, 0x49, 0x9, 0x68, 0x1,
+0x70, 0xA, 0x48, 0x0, 0x21, 0x1, 0x70, 0xE, 0x48, 0xFF, 0xF7, 0xDE, 0xFF, 0x9, 0x48, 0xD, 0x49, 0x1, 0x60, 0x9, 0x48, 0x4, 0x21, 0x1, 0x70, 0x4, 0x48, 0x1, 0x21, 0x1, 0x70, 0xA, 0x48, 0xFF, 0xF7, 0xD2,
+0xFF, 0x0, 0xBD, 0x9C, 0xE7, 0x7F, 0x3, 0xCD, 0xF0, 0x7F, 0x3, 0xB8, 0xF0, 0x7F, 0x3, 0xBC, 0xF0, 0x7F, 0x3, 0xD4, 0xF0, 0x7F, 0x3, 0xCC, 0xF0, 0x7F, 0x3, 0xD8, 0xF0, 0x7F, 0x3, 0x38, 0xF0, 0x7F, 0x3,
+0xE0, 0xF0, 0x7F, 0x3, 0x70, 0xF0, 0x7F, 0x3, 0x0, 0xA0, 0x0, 0x47, 0x0, 0x40, 0x2D, 0xE9, 0xF0, 0x7, 0x2D, 0xE9, 0x1, 0x0, 0x8F, 0xE2, 0x10, 0xFF, 0x2F, 0xE1, 0x28, 0x48, 0x0, 0x68, 0x80, 0x46, 0x81,
+0x79, 0x0, 0x29, 0x1, 0xD1, 0x26, 0x49, 0x8F, 0x46, 0x41, 0x7F, 0x0, 0x29, 0x5, 0xD1, 0x0, 0x78, 0x0, 0x28, 0x2, 0xD1, 0x23, 0x4A, 0xFF, 0xF7, 0xFB, 0xFC, 0x40, 0x46, 0x30, 0x24, 0x4, 0x59, 0x21, 0x4F,
+0x3F, 0x68, 0x0, 0x20, 0x82, 0x46, 0x40, 0x46, 0x0, 0x78, 0x0, 0x28, 0xA, 0xD1, 0x64, 0x8, 0x2, 0xD3, 0x1D, 0x4A, 0xFF, 0xF7, 0xEB, 0xFC, 0x1, 0x20, 0x82, 0x44, 0x28, 0x37, 0x0, 0x2C, 0xF5, 0xD1, 0x9,
+0xE0, 0x64, 0x8, 0x2, 0xD3, 0x19, 0x4A, 0xFF, 0xF7, 0xE0, 0xFC, 0x1, 0x20, 0x82, 0x44, 0x28, 0x37, 0x0, 0x2C, 0xF5, 0xD1, 0x16, 0x4E, 0x36, 0x68, 0x0, 0x24, 0x70, 0x7C, 0x0, 0x28, 0xE, 0xD0, 0x14, 0x48,
+0x0, 0x78, 0xF1, 0x7D, 0x89, 0x9, 0x81, 0x42, 0x8, 0xD1, 0x12, 0x49, 0x30, 0x7D, 0x8, 0x72, 0x0, 0x20, 0x88, 0x81, 0x35, 0x68, 0x0, 0xF0, 0xED, 0xF8, 0xFF, 0xE7, 0xF0, 0x7D, 0x8, 0x21, 0x88, 0x43, 0xF0,
+0x75, 0x1C, 0x36, 0x1, 0x34, 0xB, 0x48, 0x0, 0x68, 0x84, 0x42, 0xE3, 0xD1, 0xA, 0x49, 0x8F, 0x46, 0xB8, 0xF0, 0x7F, 0x3, 0xE3, 0x8A, 0x7F, 0x3, 0x38, 0xA1, 0x7F, 0x3, 0xBC, 0xF0, 0x7F, 0x3, 0x24, 0xA2,
+0x7F, 0x3, 0x64, 0xA4, 0x7F, 0x3, 0xD0, 0xF0, 0x7F, 0x3, 0xCD, 0xF0, 0x7F, 0x3, 0xA8, 0xF0, 0x7F, 0x3, 0xDC, 0xF0, 0x7F, 0x3, 0x61, 0x8A, 0x7F, 0x3, 0x45, 0x46, 0x29, 0x78, 0x1, 0x31, 0x6A, 0x79, 0x91,
+0x42, 0x7, 0xDB, 0x2A, 0x7F, 0x0, 0x2A, 0x2, 0xD0, 0x1, 0x3A, 0x2A, 0x77, 0x1, 0xE0, 0x0, 0x21, 0x1, 0xE0, 0x29, 0x70, 0x30, 0xE0, 0x6A, 0x7F, 0x0, 0x2A, 0x3, 0xD0, 0x1, 0x3A, 0x6A, 0x77, 0x0, 0xD0, 0xF6,
+0xE7, 0x29, 0x70, 0xA9, 0x7E, 0xFF, 0x29, 0xC, 0xD0, 0xFF, 0x22, 0xAA, 0x76, 0x8, 0x1C, 0xFF, 0xF7, 0xF4, 0xFE, 0xE9, 0x7E, 0x0, 0x29, 0x3, 0xD0, 0x0, 0x22, 0xEA, 0x76, 0x0, 0xF0, 0x13, 0xFF, 0x18, 0xE0,
+0x28, 0x23, 0xE9, 0x5C, 0x0, 0x29, 0x8, 0xD0, 0x0, 0x21, 0xE9, 0x54, 0xA9, 0x7F, 0x69, 0x70, 0x20, 0x23, 0xE9, 0x58, 0x24, 0x23, 0xE9, 0x50, 0xB, 0xE0, 0x69, 0x78, 0x1, 0x31, 0xEA, 0x78, 0x1, 0x32, 0x91,
+0x42, 0x4, 0xD1, 0xA8, 0x78, 0x1, 0x30, 0xFF, 0xF7, 0xD5, 0xFE, 0x0, 0xE0, 0x69, 0x70, 0x4, 0x48, 0x0, 0x47, 0x0, 0x0, 0xF0, 0x7, 0xBD, 0xE8, 0x1, 0x0, 0xBD, 0xE8, 0x10, 0xFF, 0x2F, 0xE1, 0xE8, 0x8A,
+0x7F, 0x3, 0x10, 0xB5, 0x78, 0x7A, 0x1, 0x38, 0x64, 0xD3, 0x0, 0xF0, 0x6A, 0xF8, 0x0, 0x2E, 0x4F, 0xD0, 0x78, 0x7A, 0x1, 0x38, 0x41, 0x46, 0x4A, 0x69, 0x89, 0x68, 0x80, 0x0, 0x8, 0x58, 0x80, 0x18, 0x39,
+0x7D, 0x89, 0x9, 0x2C, 0xD0, 0xC1, 0x78, 0x89, 0x7, 0x89, 0xF, 0x49, 0x0, 0x79, 0x44, 0x8F, 0x46, 0x1C, 0xE0, 0x1, 0xE0, 0x8, 0xE0, 0xF, 0xE0, 0xB9, 0x7D, 0x49, 0x0, 0x8, 0x31, 0x41, 0x5C, 0xFA, 0x79,
+0x91, 0x42, 0xC, 0xD0, 0x11, 0xE0, 0xB9, 0x7D, 0x49, 0x0, 0x9, 0x31, 0x41, 0x5C, 0x72, 0x7D, 0x91, 0x42, 0x4, 0xD0, 0x9, 0xE0, 0x79, 0x7A, 0xB2, 0x7C, 0x91, 0x42, 0x5, 0xD1, 0xC1, 0x79, 0x0, 0x29, 0xB,
+0xD0, 0x1, 0x29, 0x14, 0xD0, 0x1A, 0xE0, 0x39, 0x7D, 0x89, 0x9, 0x49, 0x0, 0x79, 0x44, 0x8F, 0x46, 0x2, 0xE0, 0x9, 0xE0, 0xB, 0xE0, 0x11, 0xE0, 0x71, 0x7C, 0x0, 0x29, 0x25, 0xD0, 0x2, 0x21, 0x71, 0x74,
+0x0, 0x21, 0x31, 0x75, 0xF, 0xE0, 0x2, 0x21, 0x71, 0x74, 0xC, 0xE0, 0xF1, 0x7D, 0x1, 0x22, 0x91, 0x43, 0xF1, 0x75, 0x2, 0x21, 0x71, 0x74, 0x5, 0xE0, 0xF1, 0x7D, 0x2, 0x22, 0x11, 0x43, 0xF1, 0x75, 0x2,
+0x21, 0x71, 0x74, 0x34, 0x1C, 0x9, 0x49, 0xFF, 0xF7, 0xFB, 0xFB, 0x38, 0x70, 0x0, 0x2C, 0x9, 0xD0, 0x1C, 0x21, 0x48, 0x43, 0x6, 0x49, 0x9, 0x68, 0x40, 0x18, 0x7, 0x22, 0x2, 0xCC, 0x2, 0xC0, 0x1, 0x3A,
+0xFB, 0xD1, 0x10, 0xBC, 0x8, 0xBC, 0x18, 0x47, 0xC4, 0xA0, 0x7F, 0x3, 0xD0, 0xF0, 0x7F, 0x3, 0x38, 0x78, 0xFF, 0x28, 0x5, 0xDA, 0x4, 0x4E, 0x36, 0x68, 0x1C, 0x21, 0x48, 0x43, 0x36, 0x18, 0x70, 0x47, 0x0,
+0x26, 0x70, 0x47, 0x0, 0x0, 0xD0, 0xF0, 0x7F, 0x3, 0x0, 0xB5, 0xF0, 0x7D, 0x8, 0x21, 0x8, 0x42, 0x1, 0xD0, 0x0, 0xBD, 0x0, 0xB5, 0xB0, 0x7C, 0x1, 0x38, 0x0, 0xD2, 0xAE, 0xE0, 0x41, 0x46, 0x4A, 0x69, 0x89,
+0x68, 0x80, 0x0, 0x8, 0x58, 0x80, 0x18, 0x1, 0x1C, 0x4A, 0x79, 0xC, 0x31, 0x52, 0x8, 0x2B, 0xD3, 0xF3, 0x7D, 0x9B, 0x9, 0x2, 0xD2, 0x8, 0x78, 0x9, 0x18, 0x25, 0xE0, 0x6, 0xB4, 0xF0, 0x88, 0xA, 0x1C, 0x31,
+0x7E, 0x0, 0xF0, 0x82, 0xF9, 0x31, 0x76, 0xF0, 0x80, 0x19, 0x1C, 0x1, 0x2A, 0x8, 0xD1, 0xF0, 0x7D, 0x43, 0x46, 0x1B, 0x7E, 0x1B, 0x9, 0x10, 0x23, 0x0, 0xD2, 0x12, 0x23, 0x18, 0x43, 0xF0, 0x75, 0x1, 0x2A,
+0x6, 0xDB, 0xF0, 0x7D, 0x1, 0x22, 0x10, 0x42, 0x2, 0xD1, 0x2, 0x22, 0x10, 0x43, 0xF0, 0x75, 0xA9, 0x48, 0x2, 0x7A, 0x4A, 0x43, 0x12, 0xB, 0x2, 0x72, 0x6, 0xBC, 0x8, 0x78, 0x9, 0x18, 0xE, 0xE0, 0xF0, 0x7D,
+0x10, 0x23, 0x18, 0x43, 0x1, 0x23, 0x18, 0x42, 0x8, 0xD1, 0x2, 0x23, 0x18, 0x43, 0xF0, 0x75, 0x40, 0x46, 0x0, 0x7E, 0x0, 0x9, 0x1, 0xD3, 0x0, 0x20, 0xB0, 0x80, 0x52, 0x8, 0x10, 0xD3, 0x6, 0xB4, 0x30,
+0x89, 0xA, 0x1C, 0x71, 0x7E, 0x0, 0xF0, 0x4B, 0xF9, 0x71, 0x76, 0x30, 0x81, 0x19, 0x1C, 0x97, 0x48, 0xC, 0x23, 0xC2, 0x5E, 0x9, 0x9, 0x80, 0x39, 0x52, 0x18, 0xC2, 0x52, 0x6, 0xBC, 0x52, 0x8, 0x18, 0xD3,
+0x88, 0x79, 0x0, 0x28, 0x15, 0xD1, 0x6, 0xB4, 0x70, 0x89, 0xA, 0x1C, 0xB1, 0x7E, 0x0, 0xF0, 0x35, 0xF9, 0xB1, 0x76, 0x70, 0x81, 0x19, 0x1C, 0xC9, 0x8, 0xFF, 0x39, 0x28, 0x1C, 0x1, 0x39, 0x2, 0xD4, 0x0,
+0xF0, 0xC0, 0xFD, 0x2, 0xE0, 0x49, 0x42, 0x0, 0xF0, 0xA2, 0xFD, 0x5, 0x1C, 0x6, 0xBC, 0xF0, 0x7D, 0x2, 0x21, 0x8, 0x42, 0xD, 0xD0, 0xB0, 0x7C, 0x1, 0x38, 0x41, 0x46, 0x4A, 0x69, 0x89, 0x68, 0x80, 0x0,
+0x8, 0x58, 0x80, 0x18, 0x40, 0x78, 0xB1, 0x88, 0x9, 0x1A, 0x0, 0xD2, 0x0, 0x21, 0xB1, 0x80, 0x70, 0x7D, 0x1, 0x38, 0x55, 0xD3, 0x41, 0x46, 0x4A, 0x69, 0xC9, 0x68, 0x80, 0x0, 0x8, 0x58, 0x80, 0x18, 0x1,
+0x89, 0x0, 0x29, 0x1C, 0xD0, 0xB2, 0x89, 0x52, 0x18, 0xD1, 0xB, 0x0, 0xD0, 0x76, 0x4A, 0xB2, 0x81, 0x41, 0x79, 0x51, 0x43, 0xB3, 0x7B, 0x82, 0x79, 0x9B, 0x18, 0x1B, 0x6, 0x1B, 0xE, 0xB3, 0x73, 0x72, 0x4A,
+0xD2, 0x56, 0x4A, 0x43, 0xD2, 0x15, 0x4, 0xD4, 0x11, 0x1C, 0x28, 0x1C, 0x0, 0xF0, 0x80, 0xFD, 0x3, 0xE0, 0x51, 0x42, 0x28, 0x1C, 0x0, 0xF0, 0x61, 0xFD, 0x5, 0x1C, 0x10, 0xB4, 0x10, 0x20, 0x44, 0x43, 0x6A,
+0x48, 0x24, 0x18, 0xF0, 0x7D, 0x4, 0x21, 0x8, 0x42, 0x26, 0xD0, 0x88, 0x43, 0xF0, 0x75, 0x70, 0x7D, 0x1, 0x38, 0x21, 0xD3, 0x41, 0x46, 0x4A, 0x69, 0xC9, 0x68, 0x80, 0x0, 0x8, 0x58, 0x80, 0x18, 0x43, 0x89,
+0x59, 0x1C, 0x49, 0xC, 0x8, 0xD3, 0xC, 0x30, 0x60, 0x49, 0x40, 0x1A, 0x20, 0x60, 0xE1, 0x78, 0x80, 0x20, 0x1, 0x43, 0xE1, 0x70, 0xB, 0xE0, 0x5D, 0x4A, 0x12, 0x68, 0x9B, 0x0, 0xD1, 0x58, 0x9, 0x2, 0x9,
+0xA, 0x8, 0x31, 0x21, 0x60, 0xE1, 0x78, 0x80, 0x20, 0x1, 0x43, 0xE1, 0x70, 0x52, 0x49, 0x49, 0x7A, 0xA1, 0x60, 0x70, 0x7D, 0x1, 0x38, 0x31, 0xD3, 0x41, 0x46, 0x4A, 0x69, 0xC9, 0x68, 0x80, 0x0, 0x8, 0x58,
+0x80, 0x18, 0x1, 0xB4, 0x41, 0x46, 0x9, 0x7E, 0xC9, 0x8, 0x11, 0xD3, 0x40, 0x88, 0x80, 0x0, 0x29, 0xA, 0x41, 0x43, 0x9, 0xA, 0x4D, 0x48, 0x0, 0x78, 0x0, 0x28, 0x3, 0xD1, 0x4C, 0x48, 0x0, 0x68, 0x41, 0x43,
+0x89, 0xA, 0x4B, 0x48, 0x48, 0x43, 0x40, 0xC, 0xA0, 0x80, 0xF, 0xE0, 0x49, 0x48, 0x29, 0x1C, 0xC, 0xD0, 0x9, 0xDF, 0x44, 0x49, 0x9, 0x78, 0x0, 0x29, 0x3, 0xD1, 0x43, 0x49, 0x9, 0x68, 0x48, 0x43, 0x80,
+0xA, 0x42, 0x49, 0x48, 0x43, 0x40, 0xC, 0xA0, 0x80, 0x1, 0xBC, 0xC3, 0x79, 0xB0, 0x7C, 0x1, 0x38, 0x1, 0xD2, 0x0, 0x21, 0x1E, 0xE0, 0x41, 0x46, 0x4A, 0x69, 0x89, 0x68, 0x80, 0x0, 0x8, 0x58, 0x80, 0x18,
+0x0, 0x78, 0x43, 0x43, 0x31, 0x49, 0x8, 0x7A, 0x43, 0x43, 0x41, 0x46, 0x8, 0x7E, 0x0, 0x9, 0x8, 0x79, 0x0, 0xD3, 0x40, 0x0, 0x43, 0x43, 0x9B, 0xA, 0xB0, 0x88, 0x43, 0x43, 0x9B, 0xA, 0x40, 0x46, 0x34,
+0x21, 0x40, 0x5A, 0x43, 0x43, 0xD9, 0xA, 0x31, 0x4B, 0x99, 0x42, 0x0, 0xDB, 0x19, 0x1C, 0xB, 0xA, 0x33, 0x74, 0x0, 0x29, 0x1F, 0xD1, 0x73, 0x7C, 0x2, 0x2B, 0x5, 0xD1, 0x33, 0x7D, 0x0, 0x2B, 0x2, 0xD1,
+0xA3, 0x89, 0x0, 0x2B, 0x6, 0xD0, 0xF3, 0x7D, 0x10, 0x22, 0x13, 0x42, 0x12, 0xD0, 0x1, 0x22, 0x13, 0x42, 0xF, 0xD1, 0x0, 0x20, 0x20, 0x60, 0x73, 0x7C, 0x3, 0x2B, 0x7, 0xD1, 0xB1, 0x7D, 0x28, 0x23, 0x59,
+0x43, 0x22, 0x48, 0x0, 0x68, 0x40, 0x18, 0xFF, 0x21, 0x1, 0x70, 0x0, 0x21, 0x71, 0x74, 0x24, 0xE0, 0xE1, 0x80, 0x20, 0x68, 0x0, 0x2, 0xF, 0xD1, 0x73, 0x7C, 0x3, 0x2B, 0x7, 0xD1, 0xB1, 0x7D, 0x28, 0x23,
+0x59, 0x43, 0x19, 0x48, 0x0, 0x68, 0x40, 0x18, 0xFF, 0x21, 0x1, 0x70, 0x0, 0x20, 0x20, 0x60, 0x0, 0x21, 0x71, 0x74, 0x10, 0xE0, 0x9, 0x49, 0xC, 0x23, 0xC8, 0x5E, 0xF1, 0x7C, 0x9, 0x18, 0x0, 0x29, 0x0,
+0xDA, 0x0, 0x21, 0xFF, 0x29, 0x0, 0xDD, 0xFF, 0x21, 0x49, 0x8, 0xE0, 0x78, 0xC0, 0x9, 0xC0, 0x1, 0x8, 0x43, 0xE0, 0x70, 0x10, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0xA8, 0xF0, 0x7F, 0x3, 0x0, 0x80, 0x0, 0x0, 0xC4,
+0x9F, 0x7F, 0x3, 0x8C, 0xF2, 0x7F, 0x3, 0x0, 0x0, 0x0, 0x2, 0xA8, 0xE7, 0x7F, 0x3, 0xCD, 0xF0, 0x7F, 0x3, 0xC8, 0xF0, 0x7F, 0x3, 0x0, 0x10, 0x0, 0x0, 0xEA, 0xF0, 0x61, 0x3, 0xFF, 0xFF, 0x0, 0x0, 0xBC,
+0xF0, 0x7F, 0x3, 0x30, 0xB4, 0x8C, 0x0, 0x8, 0x34, 0xA4, 0x18, 0x63, 0x88, 0x5B, 0x6, 0xDB, 0xC, 0x0, 0x28, 0x14, 0xD1, 0x95, 0x78, 0xA9, 0x42, 0x2, 0xD1, 0x51, 0x78, 0x2, 0x22, 0x1A, 0xE0, 0xF5, 0x7D,
+0x6D, 0x8, 0x5, 0xD3, 0x15, 0x79, 0xA9, 0x42, 0x2, 0xD1, 0xD1, 0x78, 0x0, 0x22, 0x11, 0xE0, 0x55, 0x79, 0x1, 0x3D, 0xA9, 0x42, 0x6, 0xD1, 0x2, 0x22, 0xB, 0xE0, 0x0, 0x25, 0x65, 0x5F, 0x45, 0x43, 0xED,
+0x10, 0x5B, 0x19, 0x1, 0x30, 0x65, 0x88, 0xED, 0x9, 0xA8, 0x42, 0x1, 0xD1, 0x0, 0x20, 0x1, 0x31, 0x30, 0xBC, 0x70, 0x47, 0x41, 0x46, 0x4A, 0x69, 0x9, 0x69, 0x80, 0x0, 0x8, 0x58, 0x80, 0x18, 0x70, 0x47,
+0x0, 0x0, 0x0, 0x0, 0x2, 0x3, 0x4, 0x0, 0x0, 0x5, 0x0, 0x6, 0x7, 0x0, 0x0, 0x8, 0x9, 0xA, 0xB, 0x0, 0x0, 0x0, 0x0, 0xC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xD, 0x0, 0x0, 0x0, 0x0, 0x2, 0x3, 0x3, 0x0, 0x0,
+0x4, 0x5, 0x2, 0x2, 0x0, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0x0, 0x0, 0xD, 0x0, 0xE, 0x0, 0x42, 0x46, 0x12, 0x7E, 0x12, 0x9, 0x1, 0xD2, 0x43, 0x4A, 0x0, 0xE0, 0x43, 0x4A, 0x12, 0x5C, 0x1, 0x3A, 0x5, 0xD3,
+0x17, 0x32, 0x0, 0x29, 0x1, 0xD1, 0xB9, 0x5C, 0x79, 0x71, 0xB9, 0x54, 0x70, 0x47, 0x40, 0x46, 0x2, 0x78, 0x40, 0x69, 0x0, 0x79, 0x0, 0x9, 0xF8, 0x78, 0x0, 0xD3, 0x86, 0xE0, 0x40, 0x28, 0xC, 0xDD, 0x54,
+0x28, 0xE, 0xDD, 0x68, 0x28, 0x24, 0xDD, 0x7C, 0x28, 0x2E, 0xDD, 0xC0, 0x28, 0x4A, 0xDD, 0xCA, 0x28, 0x52, 0xDD, 0xD4, 0x28, 0x70, 0xDD, 0x70, 0x47, 0x0, 0x2A, 0x0, 0xD1, 0xB8, 0x73, 0x70, 0x47, 0x0,
+0x2A, 0xF8, 0xD1, 0xB9, 0x7B, 0x25, 0x22, 0x4B, 0x28, 0x8, 0xDA, 0x41, 0x38, 0x0, 0xD1, 0xB8, 0x5C, 0xB8, 0x54, 0x9, 0x18, 0x40, 0x29, 0x8, 0xDB, 0x40, 0x21, 0x6, 0xE0, 0x4B, 0x38, 0x0, 0xD1, 0xB8, 0x5C,
+0xB8, 0x54, 0x9, 0x1A, 0x0, 0xD2, 0x0, 0x21, 0xB9, 0x73, 0x70, 0x47, 0x0, 0x2A, 0xE0, 0xD0, 0xB9, 0x7B, 0x5F, 0x28, 0x2, 0xDA, 0x25, 0x22, 0x55, 0x38, 0xE6, 0xE7, 0x25, 0x22, 0x5F, 0x38, 0xEC, 0xE7, 0xC0,
+0x46, 0x0, 0x2A, 0xF0, 0xD0, 0x0, 0xB5, 0x1, 0x1C, 0x10, 0x20, 0x38, 0x58, 0x73, 0x29, 0x7, 0xDA, 0x69, 0x39, 0x89, 0x0, 0x0, 0xD1, 0x79, 0x7E, 0x79, 0x76, 0x0, 0xF0, 0xC7, 0xFB, 0x6, 0xE0, 0x73, 0x39,
+0x89, 0x0, 0x0, 0xD1, 0x79, 0x7E, 0x79, 0x76, 0x0, 0xF0, 0xD9, 0xFB, 0x10, 0x22, 0xB9, 0x58, 0xB8, 0x50, 0x40, 0x1A, 0x2D, 0x18, 0x1, 0xBC, 0x0, 0x47, 0x0, 0x2A, 0xB6, 0xD1, 0x80, 0x38, 0x80, 0x0, 0xFF,
+0x28, 0x0, 0xDB, 0xFF, 0x20, 0xB8, 0x70, 0x70, 0x47, 0xC0, 0x46, 0x0, 0x2A, 0xFB, 0xD0, 0xC1, 0x38, 0xA, 0x49, 0x8, 0x5C, 0x41, 0x46, 0x9, 0x7E, 0x49, 0x8, 0x4, 0xD2, 0x0, 0x28, 0x0, 0xD0, 0xF8, 0x7D,
+0xF8, 0x75, 0x31, 0xE1, 0x0, 0x28, 0x0, 0xD0, 0x78, 0x7E, 0x78, 0x76, 0xF8, 0x75, 0x2B, 0xE1, 0xC1, 0x8F, 0x7F, 0x3, 0xA2, 0x8F, 0x7F, 0x3, 0x0, 0x91, 0x7F, 0x3, 0x0, 0x1, 0x4, 0x8, 0x10, 0x20, 0x40,
+0x60, 0x80, 0xFF, 0xC0, 0x46, 0x0, 0x2A, 0x4, 0xD0, 0xCB, 0x38, 0x1, 0xD0, 0x80, 0x0, 0x38, 0x73, 0x72, 0xE1, 0x70, 0x47, 0x0, 0x28, 0x11, 0xD0, 0x50, 0x28, 0xB, 0xDD, 0x80, 0x28, 0xF, 0xDB, 0xA0, 0x28,
+0x2B, 0xDB, 0xC0, 0x28, 0x35, 0xDB, 0xD0, 0x28, 0x43, 0xDB, 0xF0, 0x28, 0x4D, 0xDB, 0x72, 0xE0, 0xC0, 0x46, 0x0, 0x2A, 0x1, 0xD1, 0x10, 0x38, 0xB8, 0x73, 0x70, 0x47, 0xC0, 0x46, 0x0, 0x2A, 0x8A, 0xD0,
+0xB9, 0x7B, 0x23, 0x23, 0xFA, 0x5C, 0x70, 0x28, 0xA, 0xDA, 0x60, 0x38, 0x3, 0xD1, 0x10, 0x1C, 0x0, 0x7, 0x0, 0xF, 0x3, 0xE0, 0x12, 0x9, 0x12, 0x1, 0x2, 0x43, 0xFA, 0x54, 0x76, 0xE7, 0x70, 0x38, 0x2, 0xD1,
+0x10, 0x1C, 0x0, 0x9, 0x5, 0xE0, 0x12, 0x7, 0x12, 0xF, 0x0, 0x1, 0x2, 0x43, 0x0, 0x9, 0xFA, 0x54, 0x61, 0xE7, 0x0, 0x2A, 0xDD, 0xD1, 0xB9, 0x7B, 0x24, 0x23, 0xFA, 0x5C, 0x90, 0x28, 0x1, 0xDA, 0x80, 0x38,
+0xE0, 0xE7, 0x90, 0x38, 0xE9, 0xE7, 0xC0, 0x46, 0x0, 0x2A, 0xB, 0xD0, 0xB0, 0x28, 0x4, 0xDA, 0xA0, 0x38, 0x80, 0x0, 0x0, 0xD0, 0x38, 0x73, 0x28, 0xE1, 0xB0, 0x38, 0xC0, 0x0, 0x0, 0xD0, 0xF8, 0x72, 0x23,
+0xE1, 0x70, 0x47, 0xC0, 0x46, 0x0, 0x2A, 0x7, 0xD1, 0xC0, 0x38, 0x0, 0x1, 0xF0, 0x28, 0x1, 0xD0, 0xB8, 0x70, 0x70, 0x47, 0xFF, 0x20, 0xB8, 0x70, 0x70, 0x47, 0xC0, 0x46, 0x0, 0x2A, 0xFB, 0xD0, 0xBA, 0x78,
+0xBB, 0x7F, 0xE0, 0x28, 0xE, 0xDA, 0xD0, 0x38, 0x1, 0xD1, 0x18, 0x9, 0x5, 0xE0, 0x1B, 0x7, 0x1B, 0xF, 0x0, 0x1, 0x3, 0x43, 0x0, 0x9, 0xBB, 0x77, 0x80, 0x0, 0x12, 0x1A, 0xF, 0xD2, 0x0, 0x22, 0xD, 0xE0,
+0xE0, 0x38, 0x2, 0xD1, 0x18, 0x7, 0x0, 0xF, 0x3, 0xE0, 0x1B, 0x9, 0x1B, 0x1, 0x3, 0x43, 0xBB, 0x77, 0x80, 0x0, 0x12, 0x18, 0xFF, 0x2A, 0x0, 0xDB, 0xFF, 0x22, 0xBA, 0x70, 0x70, 0x47, 0xC0, 0x46, 0x0, 0x2A,
+0x7, 0xD0, 0xF0, 0x38, 0x0, 0x1, 0x1, 0xD0, 0x25, 0x21, 0x78, 0x54, 0x78, 0x5C, 0x1, 0x1C, 0x8D, 0xE0, 0x70, 0x47, 0x0, 0xB5, 0x38, 0x79, 0x79, 0x79, 0xFF, 0xF7, 0xCE, 0xFE, 0x40, 0x0, 0x4, 0xBC, 0x96,
+0x46, 0x42, 0x46, 0x12, 0x78, 0x0, 0x2A, 0x78, 0x44, 0x87, 0x46, 0x23, 0xE0, 0x1D, 0xE0, 0x22, 0xE0, 0x25, 0xE0, 0x2E, 0xE0, 0x35, 0xE0, 0x34, 0xE0, 0x63, 0xE0, 0xC0, 0xE0, 0x1A, 0xE0, 0xF4, 0xE0, 0x15,
+0xE1, 0x1E, 0xE1, 0x29, 0xE1, 0x2E, 0xE1, 0x35, 0xE1, 0x13, 0xE0, 0x43, 0xE1, 0x84, 0xE1, 0x9D, 0xE1, 0x4C, 0xE2, 0x6F, 0xE2, 0x7C, 0xE2, 0x89, 0xE2, 0x9A, 0xE2, 0x9D, 0xE2, 0x9E, 0xE2, 0x9F, 0xE2, 0xA2,
+0xE2, 0xAB, 0xE2, 0xAE, 0xE2, 0xC0, 0x46, 0x3, 0xD1, 0x0, 0x29, 0x1, 0xD0, 0x40, 0x46, 0x41, 0x71, 0x70, 0x47, 0x1, 0xD1, 0x40, 0x46, 0x81, 0x76, 0x70, 0x47, 0x7, 0xD1, 0x40, 0x46, 0xC1, 0x76, 0x81, 0x7E,
+0xFF, 0x29, 0x2, 0xD1, 0x81, 0x78, 0x1, 0x31, 0x81, 0x76, 0x70, 0x47, 0x0, 0xB5, 0xB8, 0x7B, 0x0, 0xF0, 0x20, 0xFB, 0xB8, 0x73, 0x1, 0xBC, 0x0, 0x47, 0xC0, 0x46, 0x0, 0xB5, 0x0, 0x23, 0x8, 0x1C, 0x0,
+0x9, 0xE, 0x28, 0x5, 0xD1, 0x0, 0x2A, 0x25, 0xD1, 0x9, 0x7, 0x9, 0xF, 0x1, 0x23, 0x8, 0xE0, 0xF, 0x28, 0x4, 0xD1, 0x0, 0x2A, 0x1D, 0xD1, 0x9, 0x7, 0x9, 0xF, 0x1, 0xE0, 0x0, 0x2A, 0x18, 0xD0, 0x38, 0x79,
+0x10, 0x22, 0x5, 0x28, 0xB8, 0x58, 0x7, 0xD1, 0x0, 0x2B, 0x2, 0xD1, 0x0, 0xF0, 0x92, 0xFA, 0x9, 0xE0, 0x0, 0xF0, 0xD3, 0xFA, 0x6, 0xE0, 0x0, 0x2B, 0x2, 0xD1, 0x0, 0xF0, 0xA4, 0xFA, 0x1, 0xE0, 0x0, 0xF0,
+0xC1, 0xFA, 0x10, 0x22, 0x39, 0x69, 0x38, 0x61, 0x40, 0x1A, 0x2D, 0x18, 0x1, 0xBC, 0x0, 0x47, 0x10, 0xD1, 0x40, 0x46, 0x0, 0x7E, 0x40, 0x8, 0x6, 0xD3, 0x0, 0x29, 0x1, 0xD1, 0x79, 0x7E, 0x79, 0x71, 0x79,
+0x76, 0xF9, 0x75, 0x5, 0xE0, 0x0, 0x29, 0x1, 0xD1, 0xF9, 0x7D, 0x79, 0x71, 0xF9, 0x75, 0x70, 0x47, 0x0, 0xB5, 0xF9, 0x7D, 0x2, 0xB4, 0x0, 0x2E, 0x1, 0xD1, 0xA, 0xBC, 0x18, 0x47, 0x70, 0x7D, 0x1, 0x38,
+0x41, 0x46, 0x4A, 0x69, 0xC9, 0x68, 0x80, 0x0, 0x8, 0x58, 0x80, 0x18, 0x41, 0x88, 0x89, 0x0, 0xFA, 0x79, 0x34, 0x4B, 0xFF, 0xF7, 0x1A, 0xF8, 0x2, 0xBC, 0x1, 0xB4, 0x3, 0x1C, 0x10, 0x22, 0xB8, 0x58, 0x42,
+0x46, 0x12, 0x7E, 0xD2, 0x8, 0x19, 0xD3, 0x98, 0x42, 0x3, 0xDB, 0x9, 0xDC, 0x1, 0xBC, 0x8, 0xBC, 0x18, 0x47, 0x0, 0xF0, 0x62, 0xFA, 0x2, 0xBC, 0x88, 0x42, 0x7, 0xDB, 0x8, 0x1C, 0x5, 0xE0, 0x0, 0xF0, 0x41,
+0xFA, 0x2, 0xBC, 0x88, 0x42, 0x0, 0xDC, 0x8, 0x1C, 0x10, 0x22, 0xB9, 0x58, 0xB8, 0x50, 0x40, 0x1A, 0x2D, 0x18, 0x8, 0xBC, 0x18, 0x47, 0x98, 0x42, 0xA, 0xDB, 0x2, 0xDC, 0x1, 0xBC, 0x8, 0xBC, 0x18, 0x47,
+0x0, 0xF0, 0x48, 0xFA, 0x2, 0xBC, 0x88, 0x42, 0xED, 0xDC, 0x8, 0x1C, 0xEB, 0xE7, 0x0, 0xF0, 0x27, 0xFA, 0x2, 0xBC, 0x88, 0x42, 0xE6, 0xDB, 0x8, 0x1C, 0xE4, 0xE7, 0xC, 0xD1, 0x8, 0x9, 0x1, 0xD0, 0x80,
+0x0, 0x38, 0x73, 0x8, 0x7, 0x5, 0xD0, 0x80, 0xE, 0x41, 0x46, 0x49, 0x7E, 0x88, 0x40, 0xF8, 0x72, 0x0, 0xE0, 0x70, 0x47, 0x40, 0x46, 0x1, 0x78, 0x40, 0x7E, 0x0, 0x28, 0x4, 0xD0, 0x0, 0x29, 0x2, 0xD1, 0x0,
+0xB5, 0x79, 0x7B, 0x6, 0xE0, 0x0, 0xB5, 0x38, 0x7B, 0x79, 0x7B, 0x9, 0x18, 0x9, 0x6, 0x9, 0xE, 0x79, 0x73, 0x9, 0x4A, 0x51, 0x56, 0xF8, 0x7A, 0x41, 0x43, 0x9, 0x12, 0x28, 0x1C, 0x0, 0x29, 0x2, 0xDB, 0x0,
+0xF0, 0x13, 0xFA, 0x2, 0xE0, 0x49, 0x42, 0x0, 0xF0, 0xF5, 0xF9, 0x5, 0x1C, 0x1, 0xBC, 0x0, 0x47, 0x0, 0xA6, 0x7F, 0x3, 0xC4, 0x9F, 0x7F, 0x3, 0x70, 0x47, 0xC0, 0x46, 0x1, 0xD1, 0x0, 0x20, 0xB8, 0x71,
+0x0, 0x2E, 0x5, 0xD0, 0xB8, 0x79, 0x1, 0x28, 0x13, 0xDC, 0x2, 0xD0, 0x1, 0x20, 0xB8, 0x71, 0x70, 0x47, 0x2, 0x20, 0xB8, 0x71, 0x28, 0x1C, 0x9, 0x9, 0x2A, 0x1C, 0xC, 0x29, 0x0, 0xDB, 0x52, 0x19, 0x9, 0x1,
+0x28, 0x1C, 0x0, 0xB5, 0x0, 0xF0, 0xF2, 0xF9, 0x5, 0x1C, 0x1, 0xBC, 0x0, 0x47, 0x0, 0x20, 0xB8, 0x71, 0x28, 0x1C, 0x9, 0x7, 0x9, 0xF, 0xED, 0xE7, 0x0, 0xB5, 0x6, 0xB4, 0xFF, 0xF7, 0xB2, 0xFF, 0x6, 0xBC,
+0x0, 0x2A, 0xFF, 0xF7, 0xA, 0xFF, 0x1, 0xBC, 0x0, 0x47, 0x0, 0xB5, 0x6, 0xB4, 0xF9, 0x7D, 0xFF, 0xF7, 0x3B, 0xFF, 0x6, 0xBC, 0x0, 0x2A, 0xFF, 0xF7, 0xFF, 0xFE, 0x1, 0xBC, 0x0, 0x47, 0xC0, 0x46, 0x2, 0xD1,
+0x40, 0x29, 0x0, 0xDC, 0xF9, 0x73, 0x70, 0x47, 0xC0, 0x46, 0x0, 0xB5, 0xF8, 0x7B, 0x0, 0xF0, 0x16, 0xFA, 0xF8, 0x73, 0x1, 0xBC, 0x0, 0x47, 0xC0, 0x46, 0x1, 0xD1, 0x1, 0x48, 0x41, 0x72, 0x70, 0x47, 0xA8,
+0xF0, 0x7F, 0x3, 0x0, 0xB5, 0xFF, 0x20, 0x1, 0xB4, 0xB8, 0x78, 0x0, 0xF0, 0x8, 0xFA, 0xB8, 0x70, 0x1, 0xBC, 0x0, 0x47, 0xC0, 0x46, 0xB8, 0x79, 0x0, 0x28, 0x4, 0xD1, 0x8, 0x7, 0x0, 0xF, 0x1, 0x30, 0xB8,
+0x71, 0x70, 0x47, 0x1, 0x38, 0x1, 0x28, 0xFA, 0xD1, 0xBA, 0x7B, 0x8, 0x9, 0x11, 0xD0, 0x5, 0x28, 0x10, 0xDD, 0x6, 0x28, 0x15, 0xD0, 0x7, 0x28, 0x17, 0xD0, 0x8, 0x28, 0x9, 0xD0, 0xD, 0x28, 0x15, 0xDD,
+0xE, 0x28, 0x1B, 0xD0, 0xF, 0x28, 0xFF, 0xD0, 0x52, 0x0, 0x40, 0x2A, 0x19, 0xDB, 0x40, 0x22, 0x17, 0xE0, 0x1, 0x38, 0x1, 0x23, 0x83, 0x40, 0xD2, 0x1A, 0x12, 0xD2, 0x0, 0x22, 0x10, 0xE0, 0xAB, 0x20, 0x42,
+0x43, 0x12, 0xA, 0xC, 0xE0, 0x52, 0x8, 0xA, 0xE0, 0x9, 0x38, 0x1, 0x23, 0x83, 0x40, 0xD2, 0x18, 0x40, 0x2A, 0x4, 0xDB, 0x40, 0x22, 0x2, 0xE0, 0xC0, 0x20, 0x42, 0x43, 0xD2, 0x9, 0xBA, 0x73, 0x0, 0x2E,
+0xC6, 0xD0, 0xF0, 0x7D, 0x4, 0x22, 0x10, 0x43, 0xF0, 0x75, 0xC1, 0xE7, 0xC0, 0x46, 0x4, 0xD0, 0xB8, 0x79, 0xB, 0x9, 0x9B, 0x0, 0xC0, 0x18, 0xB8, 0x71, 0xB8, 0x79, 0x7, 0x4B, 0x18, 0x56, 0x9, 0x7, 0x9,
+0xF, 0x48, 0x43, 0x80, 0x11, 0x41, 0x46, 0x9, 0x7E, 0x9, 0x9, 0x0, 0xD2, 0x40, 0x10, 0x2, 0x49, 0x88, 0x72, 0x70, 0x47, 0x0, 0x0, 0xC4, 0x9F, 0x7F, 0x3, 0xA8, 0xF0, 0x7F, 0x3, 0x8, 0x9, 0x40, 0x0, 0x0,
+0x2A, 0x78, 0x44, 0x87, 0x46, 0xF, 0xE0, 0x18, 0xE0, 0x20, 0xE0, 0x32, 0xE0, 0x32, 0xE0, 0x32, 0xE0, 0x32, 0xE0, 0x37, 0xE0, 0x53, 0xE0, 0x55, 0xE0, 0x58, 0xE0, 0x58, 0xE0, 0x71, 0xE0, 0x77, 0xE0, 0x7F,
+0xE0, 0x88, 0xE0, 0x70, 0x47, 0x7, 0xD1, 0xB8, 0x7B, 0x9, 0x7, 0x9, 0xF, 0x40, 0x18, 0x40, 0x28, 0x0, 0xDB, 0x40, 0x20, 0xB8, 0x73, 0x70, 0x47, 0x6, 0xD1, 0xB8, 0x7B, 0x9, 0x7, 0x9, 0xF, 0x40, 0x1A, 0x0,
+0xD2, 0x0, 0x20, 0xB8, 0x73, 0x70, 0x47, 0x3, 0xD1, 0x9, 0x7, 0x9, 0xF, 0xB9, 0x71, 0x70, 0x47, 0xB8, 0x79, 0x1, 0x38, 0x8, 0xD1, 0x8, 0x7, 0x0, 0xF, 0xB8, 0x71, 0x0, 0x2E, 0x3, 0xD0, 0xF1, 0x7D, 0x4,
+0x22, 0x11, 0x43, 0xF1, 0x75, 0xB8, 0x71, 0x70, 0x47, 0x70, 0x47, 0x70, 0x47, 0x70, 0x47, 0x3, 0xD1, 0x9, 0x7, 0x9, 0xF, 0x40, 0x46, 0x1, 0x77, 0x70, 0x47, 0x1A, 0xD1, 0x9, 0x7, 0x9, 0xF, 0x2, 0x29, 0x4,
+0xDD, 0x6, 0x29, 0x3, 0xDD, 0x8, 0x29, 0x9, 0xDD, 0x70, 0x47, 0x70, 0x47, 0x3, 0x39, 0x3A, 0x7D, 0x92, 0x6, 0x92, 0xE, 0x89, 0x1, 0xA, 0x43, 0x3A, 0x75, 0x70, 0x47, 0x0, 0x2E, 0x6, 0xD0, 0xF2, 0x7D, 0x20,
+0x20, 0x82, 0x43, 0x7, 0x39, 0x49, 0x1, 0xA, 0x43, 0xF2, 0x75, 0x70, 0x47, 0x9, 0x1, 0xB9, 0x70, 0x70, 0x47, 0x91, 0x29, 0x0, 0xD0, 0x70, 0x47, 0x70, 0x47, 0x70, 0x47, 0x15, 0xD1, 0x42, 0x46, 0x9, 0x7,
+0x9, 0xF, 0x6, 0xD1, 0x51, 0x78, 0x91, 0x77, 0x8, 0x49, 0x49, 0x68, 0x20, 0x23, 0xD1, 0x50, 0x70, 0x47, 0xD0, 0x7F, 0x0, 0x28, 0x1, 0xD1, 0xD1, 0x77, 0x2, 0xE0, 0x1, 0x38, 0xD0, 0x77, 0x2, 0xD0, 0x1,
+0x20, 0x28, 0x23, 0xD0, 0x54, 0x70, 0x47, 0xA8, 0xF0, 0x7F, 0x3, 0x9, 0x7, 0x9, 0xF, 0x91, 0x42, 0x1, 0xD1, 0x0, 0x20, 0xB8, 0x73, 0x70, 0x47, 0x40, 0x46, 0x2, 0x78, 0x9, 0x7, 0x9, 0xF, 0x8A, 0x42, 0x1,
+0xDA, 0xD, 0x48, 0xC1, 0x72, 0x70, 0x47, 0x7, 0xD1, 0x9, 0x7, 0x9, 0xF, 0x40, 0x46, 0x42, 0x7F, 0x0, 0x2A, 0x1, 0xD1, 0x1, 0x31, 0x41, 0x77, 0x70, 0x47, 0xFD, 0xD1, 0x0, 0xB5, 0x9, 0x7, 0x9, 0xF, 0x5,
+0x4A, 0x12, 0x68, 0x0, 0x2A, 0x2, 0xD0, 0x2A, 0x20, 0xFE, 0xF7, 0x51, 0xFE, 0x1, 0xBC, 0x0, 0x47, 0x0, 0x0, 0xA8, 0xF0, 0x7F, 0x3, 0x9C, 0xE7, 0x7F, 0x3, 0x20, 0x29, 0x12, 0xDA, 0x0, 0x2A, 0x1B, 0xD0,
+0x40, 0x46, 0xC2, 0x79, 0x10, 0x29, 0x5, 0xDA, 0x52, 0x1A, 0x20, 0x2A, 0x0, 0xDA, 0x20, 0x22, 0x10, 0x1C, 0x9, 0xE0, 0x9, 0x7, 0x9, 0xF, 0x52, 0x18, 0xFF, 0x2A, 0xF8, 0xDB, 0xFF, 0x22, 0xF6, 0xE7, 0x0,
+0x2A, 0x8, 0xD1, 0x8, 0x1C, 0x20, 0xB5, 0x45, 0x46, 0x3, 0x49, 0xFE, 0xF7, 0x2C, 0xFE, 0x20, 0xBC, 0x8, 0xBC, 0x18, 0x47, 0x70, 0x47, 0x0, 0x0, 0x51, 0x88, 0x7F, 0x3, 0xA, 0xD1, 0x8, 0x9, 0x1, 0xD0, 0x80,
+0x0, 0x38, 0x73, 0x8, 0x7, 0x4, 0xD0, 0x0, 0xF, 0x41, 0x46, 0x49, 0x7E, 0x88, 0x40, 0xF8, 0x72, 0x44, 0xE6, 0xC0, 0x46, 0xB, 0xD1, 0x40, 0x46, 0x2, 0x7E, 0x28, 0x23, 0x1A, 0x42, 0x1, 0xD0, 0x40, 0x22,
+0x0, 0xE0, 0x80, 0x22, 0x91, 0x42, 0x0, 0xDB, 0x11, 0x1C, 0x1, 0x71, 0x70, 0x47, 0x0, 0xB5, 0x40, 0x46, 0x0, 0x7E, 0x0, 0x9, 0x1, 0xD2, 0x80, 0x20, 0x0, 0xE0, 0x40, 0x20, 0x1, 0xB4, 0x40, 0x46, 0x0, 0x79,
+0x0, 0xF0, 0xAB, 0xF8, 0x41, 0x46, 0x8, 0x71, 0x1, 0xBC, 0x0, 0x47, 0xC0, 0x46, 0x0, 0xD1, 0xB9, 0x70, 0x70, 0x47, 0xC0, 0x46, 0x70, 0x47, 0xC0, 0x46, 0x70, 0x47, 0xC0, 0x46, 0x0, 0xD1, 0xB9, 0x73, 0x70,
+0x47, 0xC0, 0x46, 0x91, 0x42, 0x5, 0xD1, 0x0, 0x2E, 0x3, 0xD0, 0xF0, 0x7D, 0x1, 0x21, 0x88, 0x43, 0xF0, 0x75, 0x70, 0x47, 0xC0, 0x46, 0x1, 0xD1, 0x0, 0x2E, 0xFF, 0xD0, 0x70, 0x47, 0x0, 0xD1, 0x70, 0x47,
+0xB8, 0x79, 0x0, 0x28, 0xE, 0xD1, 0x78, 0x7D, 0x6, 0x23, 0x58, 0x40, 0x78, 0x75, 0xC0, 0x8, 0x3, 0xD3, 0x9, 0x9, 0x1, 0x31, 0xB9, 0x71, 0x6, 0xE0, 0x9, 0x7, 0x9, 0xF, 0x1, 0x31, 0xB9, 0x71, 0x1, 0xE0,
+0x1, 0x38, 0xB8, 0x71, 0x7A, 0x7D, 0xD2, 0x8, 0x2, 0xD2, 0xC0, 0x21, 0x27, 0x4A, 0x91, 0x72, 0x70, 0x47, 0xC0, 0x46, 0x42, 0x46, 0x12, 0x7E, 0xD2, 0x8, 0xE, 0xD3, 0x3, 0xE0, 0x42, 0x46, 0x12, 0x7E, 0xD2,
+0x8, 0x19, 0xD3, 0x22, 0x4A, 0x49, 0x0, 0x51, 0x5A, 0x40, 0x9, 0x48, 0x43, 0xC0, 0xA, 0x0, 0x28, 0x0, 0xDA, 0x0, 0x20, 0x70, 0x47, 0x9, 0x1, 0x40, 0x18, 0x41, 0xD, 0xFA, 0xD0, 0x1, 0x20, 0x40, 0x5, 0xF4,
+0xE7, 0x42, 0x46, 0x12, 0x7E, 0xD2, 0x8, 0x15, 0xD3, 0x3, 0xE0, 0x42, 0x46, 0x12, 0x7E, 0xD2, 0x8, 0xE5, 0xD3, 0x16, 0x4A, 0x3, 0x1C, 0xC0, 0x29, 0x0, 0xDB, 0xDB, 0x18, 0x49, 0x0, 0x51, 0x5A, 0x40, 0x9,
+0x48, 0x43, 0xC0, 0xA, 0xC0, 0x18, 0x1, 0x1C, 0x49, 0xD, 0x1, 0xD0, 0x1, 0x20, 0x40, 0x5, 0x70, 0x47, 0x9, 0x1, 0x40, 0x1A, 0xFB, 0xD2, 0x0, 0x20, 0x70, 0x47, 0xC0, 0x46, 0x42, 0x46, 0x12, 0x7E, 0xD2,
+0x8, 0x2, 0xD3, 0x9, 0x4A, 0x3, 0x1C, 0xE6, 0xE7, 0x89, 0x0, 0xF1, 0xE7, 0xC0, 0x46, 0x42, 0x46, 0x12, 0x7E, 0xD2, 0x8, 0x1, 0xD3, 0x5, 0x4A, 0xBF, 0xE7, 0x89, 0x0, 0xC7, 0xE7, 0xA8, 0xF0, 0x7F, 0x3,
+0xA0, 0x9B, 0x7F, 0x3, 0x9C, 0x99, 0x7F, 0x3, 0x84, 0x9F, 0x7F, 0x3, 0xA4, 0x9F, 0x7F, 0x3, 0x0, 0x29, 0x0, 0xD1, 0x70, 0x47, 0x40, 0x46, 0xC2, 0x78, 0x1, 0x32, 0x91, 0x42, 0xF9, 0xDA, 0x41, 0x70, 0x80,
+0xB5, 0x4, 0x4F, 0x2, 0xB4, 0xFE, 0xF7, 0x5A, 0xFD, 0x2, 0xBC, 0x1, 0x39, 0xF9, 0xD1, 0x1, 0xBC, 0x0, 0x47, 0x0, 0x0, 0x38, 0xA1, 0x7F, 0x3, 0x40, 0x23, 0x8, 0xB4, 0x43, 0x46, 0x1B, 0x7E, 0x1B, 0x9, 0x2B,
+0xD2, 0xF, 0x29, 0x0, 0xD1, 0x15, 0xE0, 0xF0, 0x29, 0x2, 0xD1, 0x0, 0x2A, 0x22, 0xD1, 0x4, 0xE0, 0xB, 0x1C, 0x1B, 0x7, 0x8, 0xD1, 0x0, 0x2A, 0x1C, 0xD0, 0x9, 0x9, 0x40, 0x18, 0x2, 0xBC, 0x88, 0x42, 0x18,
+0xDB, 0x8, 0x1C, 0x16, 0xE0, 0xB, 0x1C, 0x1B, 0x9, 0x7, 0xD1, 0x0, 0x2A, 0x10, 0xD0, 0x9, 0x7, 0x9, 0xF, 0x40, 0x1A, 0xC, 0xD2, 0x0, 0x20, 0xA, 0xE0, 0x0, 0x2A, 0x8, 0xD1, 0xB, 0x1C, 0x1B, 0x7, 0x1B,
+0xF, 0xF, 0x2B, 0xE6, 0xD0, 0xB, 0x1C, 0x1B, 0x9, 0xF, 0x2B, 0xEE, 0xD0, 0x2, 0xBC, 0x70, 0x47, 0x0, 0x2A, 0xFB, 0xD0, 0xB, 0x9, 0x9, 0x7, 0x9, 0xF, 0x5B, 0x1A, 0xC0, 0x18, 0x2, 0xBC, 0x88, 0x42, 0x0,
+0xDB, 0x8, 0x1C, 0x0, 0x28, 0xF1, 0xDC, 0x0, 0x20, 0x70, 0x47, 0xC0, 0x46, 0x80, 0x35, 0x80, 0x32, 0xA0, 0x2F, 0x0, 0x2D, 0x60, 0x2A, 0x0, 0x28, 0xC0, 0x25, 0xA0, 0x23, 0xA0, 0x21, 0xC0, 0x1F, 0x0, 0x1E,
+0x58, 0x1C, 0x0, 0x0, 0xED, 0x0, 0xDB, 0x1, 0xCA, 0x2, 0xB9, 0x3, 0xAA, 0x4, 0x9B, 0x5, 0x8D, 0x6, 0x80, 0x7, 0x74, 0x8, 0x69, 0x9, 0x5F, 0xA, 0x56, 0xB, 0x4D, 0xC, 0x45, 0xD, 0x3F, 0xE, 0x39, 0xF, 0x34,
+0x10, 0x30, 0x11, 0x2D, 0x12, 0x2B, 0x13, 0x25, 0x14, 0x29, 0x15, 0x2A, 0x16, 0x2C, 0x17, 0x2E, 0x18, 0x31, 0x19, 0x36, 0x1A, 0x3B, 0x1B, 0x41, 0x1C, 0x48, 0x1D, 0x51, 0x1E, 0x5A, 0x1F, 0x64, 0x20, 0x6F,
+0x21, 0x5B, 0x1F, 0x88, 0x23, 0x96, 0x24, 0xA4, 0x25, 0xB4, 0x26, 0xC5, 0x27, 0xD7, 0x28, 0xEA, 0x29, 0xFE, 0x2A, 0x13, 0x2C, 0x28, 0x2D, 0x3F, 0x2E, 0x57, 0x2F, 0x70, 0x30, 0x8A, 0x31, 0xA5, 0x32, 0xC1,
+0x33, 0xDD, 0x34, 0xFB, 0x35, 0x1A, 0x37, 0x3A, 0x38, 0x5C, 0x39, 0x7E, 0x3A, 0xA1, 0x3B, 0xC5, 0x3C, 0xEA, 0x3D, 0x11, 0x3F, 0x38, 0x40, 0x61, 0x41, 0x8A, 0x42, 0xB5, 0x43, 0xE1, 0x44, 0xD, 0x46, 0x3B,
+0x47, 0x6A, 0x48, 0x9A, 0x49, 0xCB, 0x4A, 0xFE, 0x4B, 0x31, 0x4D, 0x66, 0x4E, 0x9B, 0x4F, 0xD2, 0x50, 0xA, 0x52, 0x43, 0x53, 0x7D, 0x54, 0xB8, 0x55, 0xF4, 0x56, 0x32, 0x58, 0x71, 0x59, 0xB0, 0x5A, 0xF1,
+0x5B, 0x34, 0x5D, 0x77, 0x5E, 0xBB, 0x5F, 0x1, 0x61, 0x48, 0x62, 0x90, 0x63, 0xD9, 0x64, 0x24, 0x66, 0x6F, 0x67, 0xBC, 0x68, 0xA, 0x6A, 0x59, 0x6B, 0xAA, 0x6C, 0xFB, 0x6D, 0x4E, 0x6F, 0xA2, 0x70, 0xF7,
+0x71, 0x4E, 0x73, 0xA6, 0x74, 0xFF, 0x75, 0x59, 0x77, 0xB4, 0x78, 0x10, 0x7A, 0x6F, 0x7B, 0xCF, 0x7C, 0x2F, 0x7E, 0x91, 0x7F, 0xF4, 0x80, 0x59, 0x82, 0xBE, 0x83, 0x25, 0x85, 0x8E, 0x86, 0xF7, 0x87, 0x62,
+0x89, 0xCE, 0x8A, 0x3C, 0x8C, 0xAB, 0x8D, 0x1B, 0x8F, 0x8C, 0x90, 0xFF, 0x91, 0x73, 0x93, 0xE9, 0x94, 0x60, 0x96, 0xD8, 0x97, 0x52, 0x99, 0xCD, 0x9A, 0x49, 0x9C, 0xC7, 0x9D, 0x46, 0x9F, 0xC6, 0xA0, 0x48,
+0xA2, 0xCC, 0xA3, 0x50, 0xA5, 0xD6, 0xA6, 0x5E, 0xA8, 0xE7, 0xA9, 0x71, 0xAB, 0xFD, 0xAC, 0x8A, 0xAE, 0x19, 0xB0, 0xA9, 0xB1, 0x3A, 0xB3, 0xCD, 0xB4, 0x62, 0xB6, 0xF7, 0xB7, 0x8F, 0xB9, 0x2D, 0xBB, 0xC2,
+0xBC, 0x5E, 0xBE, 0xFB, 0xBF, 0x9A, 0xC1, 0x3A, 0xC3, 0xDC, 0xC4, 0x7F, 0xC6, 0x24, 0xC8, 0xCA, 0xC9, 0x72, 0xCB, 0x1B, 0xCD, 0xC6, 0xCE, 0x73, 0xD0, 0x21, 0xD2, 0xD0, 0xD3, 0x82, 0xD5, 0x34, 0xD7, 0xE9,
+0xD8, 0x9E, 0xDA, 0x56, 0xDC, 0xF, 0xDE, 0xC9, 0xDF, 0x86, 0xE1, 0x43, 0xE3, 0x3, 0xE5, 0xC4, 0xE6, 0x87, 0xE8, 0x4B, 0xEA, 0x11, 0xEC, 0xD9, 0xED, 0xA2, 0xEF, 0x6D, 0xF1, 0x39, 0xF3, 0x7, 0xF5, 0xD7,
+0xF6, 0xA9, 0xF8, 0x7C, 0xFA, 0x51, 0xFC, 0x28, 0xFE, 0x0, 0x0, 0xDA, 0x1, 0xB6, 0x3, 0x93, 0x5, 0x72, 0x7, 0x53, 0x9, 0x36, 0xB, 0x1B, 0xD, 0x1, 0xF, 0xE7, 0x10, 0xD2, 0x12, 0xBE, 0x14, 0xAB, 0x16, 0x9A,
+0x18, 0x8B, 0x1A, 0x7E, 0x1C, 0x72, 0x1E, 0x68, 0x20, 0x60, 0x22, 0x5A, 0x24, 0x56, 0x26, 0x53, 0x28, 0x53, 0x2A, 0x54, 0x2C, 0x57, 0x2E, 0x5C, 0x30, 0x63, 0x32, 0x6B, 0x34, 0x76, 0x36, 0x83, 0x38, 0x91,
+0x3A, 0xA1, 0x3C, 0xB3, 0x3E, 0xC7, 0x40, 0xDD, 0x42, 0xF5, 0x44, 0xF, 0x47, 0x2B, 0x49, 0x49, 0x4B, 0x69, 0x4D, 0x8A, 0x4F, 0xAE, 0x51, 0xD4, 0x53, 0xFB, 0x55, 0x25, 0x58, 0x51, 0x5A, 0x7E, 0x5C, 0xAE,
+0x5E, 0xE0, 0x60, 0x13, 0x63, 0x49, 0x65, 0x99, 0x63, 0xBB, 0x69, 0xF7, 0x6B, 0x35, 0x6E, 0x75, 0x70, 0xB7, 0x72, 0xFB, 0x74, 0x42, 0x77, 0x8A, 0x79, 0xD5, 0x7B, 0x21, 0x7E, 0x70, 0x80, 0xC1, 0x82, 0x14,
+0x85, 0xC0, 0x46, 0xFF, 0xFF, 0x14, 0xFF, 0x29, 0xFE, 0x3E, 0xFD, 0x54, 0xFC, 0x6C, 0xFB, 0x84, 0xFA, 0x9D, 0xF9, 0xB6, 0xF8, 0xD1, 0xF7, 0xEC, 0xF6, 0x8, 0xF6, 0x25, 0xF5, 0x43, 0xF4, 0x62, 0xF3, 0x81,
+0xF2, 0xA2, 0xF1, 0xC3, 0xF0, 0xE5, 0xEF, 0x7, 0xEF, 0x2B, 0xEE, 0x4F, 0xED, 0x74, 0xEC, 0x9A, 0xEB, 0xC1, 0xEA, 0xE8, 0xE9, 0x10, 0xE9, 0x39, 0xE8, 0x63, 0xE7, 0x8E, 0xE6, 0xB9, 0xE5, 0xE5, 0xE4, 0x12,
+0xE4, 0x40, 0xE3, 0x6E, 0xE2, 0x9D, 0xE1, 0xCD, 0xE0, 0xFD, 0xDF, 0x2F, 0xDF, 0x61, 0xDE, 0x94, 0xDD, 0xC7, 0xDC, 0xFC, 0xDB, 0x31, 0xDB, 0x67, 0xDA, 0x9D, 0xD9, 0xD4, 0xD8, 0xC, 0xD8, 0x45, 0xD7, 0x7E,
+0xD6, 0xB9, 0xD5, 0xF3, 0xD4, 0x2F, 0xD4, 0x6B, 0xD3, 0xA8, 0xD2, 0xE6, 0xD1, 0x24, 0xD1, 0x63, 0xD0, 0xA3, 0xCF, 0xE3, 0xCE, 0x25, 0xCE, 0x66, 0xCD, 0xA9, 0xCC, 0xEC, 0xCB, 0x30, 0xCB, 0x75, 0xCA, 0xBA,
+0xC9, 0x0, 0xC9, 0x46, 0xC8, 0x8D, 0xC7, 0xD5, 0xC6, 0x1E, 0xC6, 0x67, 0xC5, 0xB1, 0xC4, 0xFC, 0xC3, 0x47, 0xC3, 0x93, 0xC2, 0xDF, 0xC1, 0x2C, 0xC1, 0x7A, 0xC0, 0xC9, 0xBF, 0x18, 0xBF, 0x67, 0xBE, 0xB8,
+0xBD, 0x9, 0xBD, 0x0, 0xBC, 0xAC, 0xBB, 0xFF, 0xBA, 0x53, 0xBA, 0xA7, 0xB9, 0xFC, 0xB8, 0x51, 0xB8, 0xA7, 0xB7, 0xFE, 0xB6, 0x55, 0xB6, 0xAD, 0xB5, 0x5, 0xB5, 0x5E, 0xB4, 0xB8, 0xB3, 0x12, 0xB3, 0x6D,
+0xB2, 0xC8, 0xB1, 0x24, 0xB1, 0x81, 0xB0, 0xDE, 0xAF, 0x3B, 0xAF, 0x9A, 0xAE, 0xF9, 0xAD, 0x58, 0xAD, 0xB8, 0xAC, 0x19, 0xAC, 0x7A, 0xAB, 0xDC, 0xAA, 0x3E, 0xAA, 0xA1, 0xA9, 0x5, 0xA9, 0x69, 0xA8, 0xCE,
+0xA7, 0x33, 0xA7, 0x99, 0xA6, 0xFF, 0xA5, 0x66, 0xA5, 0xCD, 0xA4, 0x35, 0xA4, 0x9E, 0xA3, 0x7, 0xA3, 0x70, 0xA2, 0xDA, 0xA1, 0x45, 0xA1, 0xB0, 0xA0, 0x1C, 0xA0, 0x88, 0x9F, 0xBF, 0x9E, 0x76, 0x9E, 0xD0,
+0x9D, 0x3D, 0x9D, 0xAE, 0x9C, 0x1D, 0x9C, 0x8D, 0x9B, 0xFE, 0x9A, 0x6F, 0x9A, 0xE0, 0x99, 0x52, 0x99, 0xC5, 0x98, 0x38, 0x98, 0xAC, 0x97, 0x20, 0x97, 0x94, 0x96, 0x9, 0x96, 0x7F, 0x95, 0xF5, 0x94, 0x6C,
+0x94, 0xE3, 0x93, 0x5A, 0x93, 0xD2, 0x92, 0x4B, 0x92, 0xC4, 0x91, 0x3D, 0x91, 0xB7, 0x90, 0x32, 0x90, 0xAD, 0x8F, 0x28, 0x8F, 0xA4, 0x8E, 0x21, 0x8E, 0x9E, 0x8D, 0x1B, 0x8D, 0x99, 0x8C, 0x17, 0x8C, 0x96,
+0x8B, 0x15, 0x8B, 0x95, 0x8A, 0x15, 0x8A, 0x95, 0x89, 0x17, 0x89, 0x98, 0x88, 0x1A, 0x88, 0x9C, 0x87, 0x1F, 0x87, 0xA3, 0x86, 0x27, 0x86, 0xAB, 0x85, 0x2F, 0x85, 0xB5, 0x84, 0x3A, 0x84, 0xC0, 0x83, 0x47,
+0x83, 0xCE, 0x82, 0x55, 0x82, 0xDD, 0x81, 0x65, 0x81, 0xED, 0x80, 0x77, 0x80, 0x0, 0x80, 0x8A, 0x7F, 0x14, 0x7F, 0x9F, 0x7E, 0x2A, 0x7E, 0xB6, 0x7D, 0x42, 0x7D, 0xCE, 0x7C, 0x5B, 0x7C, 0xE8, 0x7B, 0x76,
+0x7B, 0x4, 0x7B, 0x93, 0x7A, 0x22, 0x7A, 0xB1, 0x79, 0x41, 0x79, 0xD1, 0x78, 0x61, 0x78, 0xF2, 0x77, 0x84, 0x77, 0x15, 0x77, 0xA8, 0x76, 0x12, 0x76, 0xCD, 0x75, 0x60, 0x75, 0xF4, 0x74, 0x88, 0x74, 0x1D,
+0x74, 0xB2, 0x73, 0x47, 0x73, 0xDD, 0x72, 0x73, 0x72, 0x9, 0x72, 0xA0, 0x71, 0x37, 0x71, 0xCF, 0x70, 0x66, 0x70, 0xFF, 0x6F, 0x97, 0x6F, 0x30, 0x6F, 0xCA, 0x6E, 0x64, 0x6E, 0xFE, 0x6D, 0x98, 0x6D, 0x33,
+0x6D, 0xCF, 0x6C, 0x6A, 0x6C, 0x6, 0x6C, 0xA2, 0x6B, 0x3F, 0x6B, 0xDC, 0x6A, 0x7A, 0x6A, 0x17, 0x6A, 0xB6, 0x69, 0x54, 0x69, 0xF3, 0x68, 0x92, 0x68, 0x32, 0x68, 0xD1, 0x67, 0x72, 0x67, 0x12, 0x67, 0xB3,
+0x66, 0x54, 0x66, 0xF6, 0x65, 0x98, 0x65, 0xC0, 0x46, 0x0, 0x8, 0x0, 0x0, 0x7A, 0x8, 0x0, 0x0, 0xFB, 0x8, 0x0, 0x0, 0x83, 0x9, 0x0, 0x0, 0x14, 0xA, 0x0, 0x0, 0xAE, 0xA, 0x0, 0x0, 0x50, 0xB, 0x0, 0x0,
+0xFD, 0xB, 0x0, 0x0, 0xB3, 0xC, 0x0, 0x0, 0x74, 0xD, 0x0, 0x0, 0x41, 0xE, 0x0, 0x0, 0x1A, 0xF, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0xF4, 0x10, 0x0, 0x0, 0xF6, 0x11, 0x0, 0x0, 0x7, 0x13, 0x0, 0x0, 0x29, 0x14,
+0x0, 0x0, 0x5C, 0x15, 0x0, 0x0, 0xA1, 0x16, 0x0, 0x0, 0xF9, 0x17, 0x0, 0x0, 0x66, 0x19, 0x0, 0x0, 0xE9, 0x1A, 0x0, 0x0, 0x82, 0x1C, 0x0, 0x0, 0x34, 0x1E, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0xE7, 0x21, 0x0,
+0x0, 0xEB, 0x23, 0x0, 0x0, 0xE, 0x26, 0x0, 0x0, 0x51, 0x28, 0x0, 0x0, 0xB7, 0x2A, 0x0, 0x0, 0x41, 0x2D, 0x0, 0x0, 0xF2, 0x2F, 0x0, 0x0, 0xCC, 0x32, 0x0, 0x0, 0xD1, 0x35, 0x0, 0x0, 0x4, 0x39, 0x0, 0x0,
+0x68, 0x3C, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0xCE, 0x43, 0x0, 0x0, 0xD6, 0x47, 0x0, 0x0, 0x1C, 0x4C, 0x0, 0x0, 0xA3, 0x50, 0x0, 0x0, 0x6E, 0x55, 0x0, 0x0, 0x82, 0x5A, 0x0, 0x0, 0xE4, 0x5F, 0x0, 0x0, 0x98,
+0x65, 0x0, 0x0, 0xA2, 0x6B, 0x0, 0x0, 0x9, 0x72, 0x0, 0x0, 0xD1, 0x78, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x9C, 0x87, 0x0, 0x0, 0xAD, 0x8F, 0x0, 0x0, 0x38, 0x98, 0x0, 0x0, 0x45, 0xA1, 0x0, 0x0, 0xDC, 0xAA,
+0x0, 0x0, 0x5, 0xB5, 0x0, 0x0, 0xC9, 0xBF, 0x0, 0x0, 0x30, 0xCB, 0x0, 0x0, 0x45, 0xD7, 0x0, 0x0, 0x12, 0xE4, 0x0, 0x0, 0xA2, 0xF1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x39, 0xF, 0x1, 0x0, 0x5A, 0x1F, 0x1, 0x0,
+0x70, 0x30, 0x1, 0x0, 0x8A, 0x42, 0x1, 0x0, 0xB8, 0x55, 0x1, 0x0, 0xA, 0x6A, 0x1, 0x0, 0x91, 0x7F, 0x1, 0x0, 0x60, 0x96, 0x1, 0x0, 0x8A, 0xAE, 0x1, 0x0, 0x24, 0xC8, 0x1, 0x0, 0x43, 0xE3, 0x1, 0x0, 0x0,
+0x0, 0x2, 0x0, 0x72, 0x1E, 0x2, 0x0, 0xB3, 0x3E, 0x2, 0x0, 0xE0, 0x60, 0x2, 0x0, 0x14, 0x85, 0x2, 0x0, 0x70, 0xAB, 0x2, 0x0, 0x14, 0xD4, 0x2, 0x0, 0x22, 0xFF, 0x2, 0x0, 0xC0, 0x2C, 0x3, 0x0, 0x14, 0x5D,
+0x3, 0x0, 0x48, 0x90, 0x3, 0x0, 0x87, 0xC6, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0xE4, 0x3C, 0x4, 0x0, 0x67, 0x7D, 0x4, 0x0, 0xC0, 0xC1, 0x4, 0x0, 0x29, 0xA, 0x5, 0x0, 0xE0, 0x56, 0x5, 0x0, 0x28, 0xA8, 0x5,
+0x0, 0x44, 0xFE, 0x5, 0x0, 0x80, 0x59, 0x6, 0x0, 0x28, 0xBA, 0x6, 0x0, 0x90, 0x20, 0x7, 0x0, 0xE, 0x8D, 0x7, 0x0, 0x0, 0x0, 0x8, 0x0, 0xC8, 0x79, 0x8, 0x0, 0xCD, 0xFA, 0x8, 0x0, 0x7F, 0x83, 0x9, 0x0,
+0x51, 0x14, 0xA, 0x0, 0xC1, 0xAD, 0xA, 0x0, 0x4F, 0x50, 0xB, 0x0, 0x88, 0xFC, 0xB, 0x0, 0xFF, 0xB2, 0xC, 0x0, 0x50, 0x74, 0xD, 0x0, 0x1F, 0x41, 0xE, 0x0, 0x1C, 0x1A, 0xF, 0x0, 0x0, 0x0, 0x10, 0x0, 0x90,
+0xF3, 0x10, 0x0, 0x9B, 0xF5, 0x11, 0x0, 0xFE, 0x6, 0x13, 0x0, 0xA3, 0x28, 0x14, 0x0, 0x81, 0x5B, 0x15, 0x0, 0x9E, 0xA0, 0x16, 0x0, 0x11, 0xF9, 0x17, 0x0, 0xFF, 0x65, 0x19, 0x0, 0xA0, 0xE8, 0x1A, 0x0,
+0x3E, 0x82, 0x1C, 0x0, 0x38, 0x34, 0x1E, 0x0, 0x0, 0x0, 0x3B, 0x0, 0x76, 0x0, 0xB2, 0x0, 0xED, 0x0, 0x28, 0x1, 0x64, 0x1, 0x9F, 0x1, 0xDB, 0x1, 0x17, 0x2, 0x52, 0x2, 0x8E, 0x2, 0xCA, 0x2, 0x5, 0x3, 0x41,
+0x3, 0x7D, 0x3, 0xFF, 0xFF, 0xC5, 0xFF, 0x8A, 0xFF, 0x4F, 0xFF, 0x14, 0xFF, 0xD9, 0xFE, 0x9E, 0xFE, 0x4F, 0xFF, 0x29, 0xFE, 0xEE, 0xFD, 0xB3, 0xFD, 0x78, 0xFD, 0x3E, 0xFD, 0x4, 0xFD, 0xC9, 0xFC, 0x85,
+0xFC, 0x0, 0x2, 0x3, 0x5, 0x6, 0x8, 0x9, 0xB, 0xC, 0xE, 0x10, 0x11, 0x13, 0x14, 0x16, 0x17, 0x18, 0x1A, 0x1B, 0x1D, 0x1E, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x27, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E,
+0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x38, 0x39, 0x3A, 0x3B, 0x3B, 0x3C, 0x3C, 0x3D, 0x3D, 0x3E, 0x3E, 0x3E, 0x3F, 0x3F, 0x3F, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
+0x40, 0x40, 0x3F, 0x3F, 0x3F, 0x3E, 0x3E, 0x3E, 0x3D, 0x3D, 0x3C, 0x3C, 0x3B, 0x3B, 0x3A, 0x39, 0x38, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2F, 0x2E, 0x2D, 0x2C, 0x2B, 0x2A, 0x29, 0x27,
+0x26, 0x25, 0x24, 0x22, 0x21, 0x20, 0x1E, 0x1D, 0x1B, 0x1A, 0x18, 0x17, 0x16, 0x14, 0x13, 0x11, 0x10, 0xE, 0xC, 0xB, 0x9, 0x8, 0x6, 0x5, 0x3, 0x2, 0x0, 0xFE, 0xFD, 0xFB, 0xFA, 0xF8, 0xF7, 0xF5, 0xF4,
+0xF2, 0xF0, 0xEF, 0xED, 0xEC, 0xEA, 0xE9, 0xE8, 0xE6, 0xE5, 0xE3, 0xE2, 0xE0, 0xDF, 0xDE, 0xDC, 0xDB, 0xDA, 0xD9, 0xD7, 0xD6, 0xD5, 0xD4, 0xD3, 0xD2, 0xD1, 0xD0, 0xCF, 0xCE, 0xCD, 0xCC, 0xCB, 0xCA, 0xC9,
+0xC8, 0xC8, 0xC7, 0xC6, 0xC5, 0xC5, 0xC4, 0xC4, 0xC3, 0xC3, 0xC2, 0xC2, 0xC2, 0xC1, 0xC1, 0xC1, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC1, 0xC1, 0xC1, 0xC2, 0xC2, 0xC2, 0xC3,
+0xC3, 0xC4, 0xC4, 0xC5, 0xC5, 0xC6, 0xC7, 0xC8, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD9, 0xDA, 0xDB, 0xDC, 0xDE, 0xDF, 0xE0, 0xE2, 0xE3, 0xE5,
+0xE6, 0xE8, 0xE9, 0xEA, 0xEC, 0xED, 0xEF, 0xF0, 0xF2, 0xF4, 0xF5, 0xF7, 0xF8, 0xFA, 0xFB, 0xFD, 0xFE, 0x70, 0x0, 0x2D, 0xE9, 0x4, 0x56, 0x9F, 0xE5, 0x0, 0x50, 0x95, 0xE5, 0x0, 0x16, 0x9F, 0xE5, 0x0, 0x10,
+0x91, 0xE5, 0x10, 0x10, 0x81, 0xE2, 0x0, 0x0, 0xA0, 0xE3, 0x2, 0x21, 0xA0, 0xE3, 0xFF, 0x30, 0xA0, 0xE3, 0x2, 0x60, 0xA0, 0xE3, 0x3, 0x0, 0x0, 0xEA, 0x1C, 0x10, 0x81, 0xE2, 0x0, 0x0, 0x55, 0xE3, 0xB,
+0x0, 0x0, 0xA, 0x1, 0x0, 0x80, 0xE2, 0xA5, 0x50, 0xB0, 0xE1, 0xF9, 0xFF, 0xFF, 0x3A, 0xBC, 0x41, 0xD1, 0xE0, 0x24, 0x4, 0x56, 0xE1, 0xF7, 0xFF, 0xFF, 0xBA, 0x5, 0x0, 0x0, 0xCA, 0x84, 0xB, 0x52, 0xE1,
+0xF4, 0xFF, 0xFF, 0x9A, 0x0, 0x30, 0xA0, 0xE1, 0x84, 0x2B, 0xB0, 0xE1, 0xF1, 0xFF, 0xFF, 0xEA, 0x3, 0x0, 0xA0, 0xE1, 0x70, 0x0, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x0, 0x1C, 0x2D, 0xE9, 0x14, 0xB0, 0x98,
+0xE5, 0x1, 0xC0, 0xDB, 0xE5, 0x18, 0xB0, 0xD8, 0xE5, 0x1, 0xA0, 0xA0, 0xE3, 0x88, 0x5, 0x9F, 0xE5, 0x0, 0x90, 0x90, 0xE5, 0x24, 0x70, 0x98, 0xE5, 0x80, 0x5, 0x9F, 0xE5, 0x4, 0x70, 0x80, 0xE5, 0x0, 0x10,
+0xA0, 0xE3, 0x0, 0x50, 0xA0, 0xE3, 0x1, 0x30, 0xD7, 0xE4, 0x83, 0x3C, 0xB0, 0xE1, 0x27, 0x0, 0x0, 0xA, 0xA3, 0x3C, 0x6A, 0xE0, 0x1A, 0x13, 0x81, 0xE1, 0x28, 0x0, 0xA0, 0xE3, 0x93, 0x90, 0x26, 0xE0, 0x1,
+0x20, 0xD7, 0x24, 0x1, 0x20, 0xC6, 0x25, 0x1, 0x20, 0xD6, 0x35, 0x1, 0x0, 0x12, 0xE3, 0x5, 0x0, 0x0, 0xA, 0x1, 0x0, 0xD7, 0xE4, 0xFE, 0x0, 0x50, 0xE3, 0x16, 0x0, 0xC6, 0xB5, 0x1, 0x0, 0x0, 0xBA, 0x80,
+0x50, 0x85, 0x3, 0x40, 0x50, 0x85, 0xC3, 0x2, 0x0, 0x12, 0xE3, 0xB, 0x0, 0x0, 0xA, 0x1, 0x0, 0xD7, 0xE4, 0xC0, 0x0, 0x15, 0xE3, 0x8, 0x0, 0x0, 0x1A, 0xC, 0x0, 0x50, 0xE1, 0x0, 0x0, 0xA0, 0xC3, 0x9, 0x30,
+0xD6, 0xE5, 0x3, 0x0, 0x50, 0xE1, 0x2, 0x0, 0x0, 0xA, 0x2B, 0x33, 0xB0, 0xE1, 0x1, 0x50, 0x85, 0x23, 0x10, 0x50, 0x85, 0xE3, 0x9, 0x0, 0xC6, 0xE5, 0xA2, 0x1, 0x1A, 0xE1, 0x1, 0x0, 0xD7, 0x24, 0x3, 0x0,
+0xC6, 0x25, 0x3, 0x0, 0x0, 0xA, 0x1, 0x0, 0xD7, 0xE4, 0x1, 0x30, 0xD7, 0xE4, 0x3, 0x4, 0x80, 0xE1, 0xB4, 0x0, 0xC6, 0xE1, 0x22, 0x52, 0x85, 0xE1, 0x8, 0x50, 0xC6, 0xE5, 0xD3, 0xFF, 0xFF, 0xEA, 0x24, 0x70,
+0x88, 0xE5, 0x30, 0x10, 0x88, 0xE5, 0x0, 0x1C, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x0, 0x40, 0x2D, 0xE9, 0x8, 0x50, 0xD7, 0xE5, 0x1, 0x0, 0x15, 0xE3, 0x42, 0x0, 0x0, 0xA, 0x8, 0x0, 0x15, 0xE3, 0x5, 0x0,
+0x0, 0xA, 0xB4, 0x0, 0xD7, 0xE1, 0xFF, 0x10, 0x0, 0xE2, 0x10, 0x0, 0x15, 0xE3, 0x1C, 0x0, 0x0, 0x1A, 0x7, 0x0, 0x51, 0xE3, 0xF, 0x0, 0x0, 0xA, 0x10, 0x0, 0x15, 0xE3, 0x18, 0x0, 0x0, 0x1A, 0x4, 0x0, 0x15,
+0xE3, 0x16, 0x0, 0x0, 0xA, 0x18, 0x0, 0xD8, 0xE5, 0x20, 0x2, 0xB0, 0xE1, 0x3, 0x0, 0xD7, 0xE5, 0x4, 0x0, 0x0, 0x2A, 0xC1, 0x0, 0x50, 0xE3, 0x10, 0x0, 0x0, 0xBA, 0xCA, 0x0, 0x50, 0xE3, 0xE, 0x0, 0x0, 0xCA,
+0x2, 0x0, 0x0, 0xEA, 0xF0, 0x0, 0x50, 0xE3, 0x0, 0x0, 0x0, 0xAA, 0xA, 0x0, 0x0, 0xEA, 0x0, 0x0, 0xD7, 0xE5, 0xFF, 0x0, 0x50, 0xE3, 0x7, 0x0, 0x0, 0xAA, 0x30, 0x64, 0x9F, 0xE5, 0x0, 0x60, 0x96, 0xE5, 0x1C,
+0x10, 0xA0, 0xE3, 0x90, 0x61, 0x26, 0xE0, 0xAC, 0x0, 0x0, 0xEB, 0x1, 0x50, 0xC5, 0xE3, 0x8, 0x50, 0xC7, 0xE5, 0x1F, 0x0, 0x0, 0xEA, 0x1C, 0x24, 0x9F, 0xE5, 0xF, 0xE0, 0xA0, 0xE1, 0x12, 0xFF, 0x2F, 0xE1,
+0x0, 0x0, 0xD7, 0xE5, 0xFF, 0x0, 0x50, 0xE3, 0x63, 0x0, 0x0, 0xAA, 0xF8, 0x63, 0x9F, 0xE5, 0x0, 0x60, 0x96, 0xE5, 0x1C, 0x10, 0xA0, 0xE3, 0x90, 0x61, 0x26, 0xE0, 0x9E, 0x0, 0x0, 0xEB, 0x15, 0x0, 0xD6,
+0xE5, 0x1, 0x0, 0x50, 0xE2, 0x10, 0x0, 0x0, 0x3A, 0x18, 0x10, 0xD8, 0xE5, 0xA1, 0x11, 0xB0, 0xE1, 0x7, 0x0, 0x0, 0x2A, 0x14, 0x30, 0x98, 0xE5, 0xC, 0x10, 0x98, 0xE5, 0x0, 0x1, 0x91, 0xE7, 0x3, 0x0, 0x80,
+0xE0, 0xB2, 0x10, 0xD0, 0xE1, 0x1, 0x11, 0xA0, 0xE1, 0xBA, 0x0, 0x0, 0xEB, 0x1, 0x0, 0x0, 0xEA, 0xBC, 0x13, 0x9F, 0xE5, 0x2, 0x1, 0x91, 0xE7, 0x10, 0x0, 0x87, 0xE5, 0x17, 0x0, 0xD6, 0xE5, 0x4, 0x0, 0x80,
+0xE3, 0x17, 0x0, 0xC6, 0xE5, 0x6, 0x0, 0x0, 0xEA, 0x0, 0x0, 0xD7, 0xE5, 0xFF, 0x0, 0x50, 0xE3, 0x4D, 0x0, 0x0, 0xAA, 0x84, 0x63, 0x9F, 0xE5, 0x0, 0x60, 0x96, 0xE5, 0x1C, 0x10, 0xA0, 0xE3, 0x90, 0x61,
+0x26, 0xE0, 0x2, 0x0, 0x15, 0xE3, 0x1E, 0x0, 0x0, 0xA, 0x9, 0x0, 0xD7, 0xE5, 0x1, 0x0, 0x50, 0xE2, 0x10, 0x0, 0x0, 0x3A, 0x14, 0x20, 0x98, 0xE5, 0x8, 0x10, 0x98, 0xE5, 0x0, 0x1, 0x91, 0xE7, 0x2, 0x0,
+0x80, 0xE0, 0x4, 0x10, 0x90, 0xE5, 0x14, 0x20, 0xD7, 0xE5, 0xC0, 0x20, 0xC2, 0xE3, 0x1, 0x23, 0x82, 0xE1, 0x14, 0x20, 0xC7, 0xE5, 0x17, 0x20, 0xD6, 0xE5, 0x20, 0x20, 0xC2, 0xE3, 0x2, 0xB, 0x11, 0xE3,
+0x20, 0x20, 0x82, 0x13, 0x17, 0x20, 0xC6, 0xE5, 0x81, 0x14, 0xB0, 0xE1, 0x21, 0x1C, 0xA0, 0x21, 0x2, 0x10, 0xC7, 0x25, 0x15, 0x0, 0xD6, 0xE5, 0x1, 0x0, 0x50, 0xE2, 0x7, 0x0, 0x0, 0x3A, 0x14, 0x20, 0x98,
+0xE5, 0xC, 0x10, 0x98, 0xE5, 0x0, 0x1, 0x91, 0xE7, 0xB2, 0x10, 0x90, 0xE1, 0xE, 0x10, 0xC7, 0xE5, 0x81, 0x18, 0xB0, 0xE1, 0x21, 0x1C, 0xA0, 0xE1, 0x2, 0x10, 0xC7, 0x25, 0x3, 0x0, 0x15, 0xE3, 0x10, 0x0,
+0x0, 0xA, 0x18, 0x0, 0xD8, 0xE5, 0x8, 0x0, 0x10, 0xE3, 0x1, 0x0, 0x0, 0xA, 0x2, 0x0, 0x15, 0xE3, 0xB, 0x0, 0x0, 0xA, 0x1, 0xB, 0xA0, 0xE3, 0x0, 0x10, 0xA0, 0xE3, 0x0, 0x20, 0xA0, 0xE3, 0x4, 0xC0, 0x86,
+0xE2, 0x7, 0x0, 0x8C, 0xE8, 0xB8, 0x11, 0xC6, 0xE1, 0x1A, 0x10, 0xC6, 0xE5, 0x6, 0x10, 0xC7, 0xE5, 0x17, 0x10, 0xD6, 0xE5, 0x1, 0x10, 0x81, 0xE3, 0x12, 0x10, 0xC1, 0xE3, 0x17, 0x10, 0xC6, 0xE5, 0x40,
+0x0, 0x15, 0xE3, 0x5, 0x0, 0x0, 0xA, 0x17, 0x10, 0xD6, 0xE5, 0x1, 0x10, 0xC1, 0xE3, 0x18, 0x0, 0xD8, 0xE5, 0x8, 0x0, 0x10, 0xE3, 0x2, 0x10, 0x81, 0x13, 0x17, 0x10, 0xC6, 0xE5, 0x80, 0x0, 0x15, 0xE3, 0x0,
+0x0, 0xA0, 0x13, 0xE, 0x0, 0xC7, 0x15, 0x1, 0x50, 0xC5, 0xE3, 0x8, 0x50, 0xC7, 0xE5, 0x0, 0x0, 0x0, 0xEA, 0x0, 0x40, 0x2D, 0xE9, 0x0, 0x0, 0xD7, 0xE5, 0xFF, 0x0, 0x50, 0xE3, 0x3, 0x0, 0x0, 0xAA, 0x5C,
+0x62, 0x9F, 0xE5, 0x0, 0x60, 0x96, 0xE5, 0x1C, 0x10, 0xA0, 0xE3, 0x90, 0x61, 0x26, 0xE0, 0x0, 0x60, 0xA0, 0xA3, 0x10, 0x50, 0x97, 0xE5, 0x4C, 0x12, 0x9F, 0xE5, 0x0, 0x0, 0xA0, 0xE3, 0x9, 0x0, 0xC1, 0xE5,
+0xA, 0x0, 0xC1, 0xE5, 0xC, 0x0, 0xC1, 0xE5, 0xB, 0x0, 0xC1, 0xE5, 0x8, 0x0, 0xD7, 0xE5, 0x4, 0x0, 0x10, 0xE3, 0x38, 0x12, 0x9F, 0x15, 0xF, 0xE0, 0xA0, 0x11, 0x11, 0xFF, 0x2F, 0x11, 0x8, 0x0, 0xD7, 0xE5,
+0x8, 0x0, 0x10, 0xE3, 0x28, 0x12, 0x9F, 0x15, 0xF, 0xE0, 0xA0, 0x11, 0x11, 0xFF, 0x2F, 0x11, 0x0, 0x0, 0x56, 0xE3, 0x22, 0x0, 0x0, 0xA, 0xBE, 0x0, 0xD7, 0xE1, 0xFF, 0x10, 0x0, 0xE2, 0x20, 0x4, 0xA0, 0xE1,
+0x91, 0x0, 0x0, 0xE0, 0xA0, 0x2, 0xA0, 0xE1, 0x14, 0x0, 0xC6, 0xE5, 0xEC, 0x11, 0x9F, 0xE5, 0xDA, 0x20, 0xD1, 0xE1, 0x82, 0x1, 0x90, 0xE0, 0x0, 0x0, 0xA0, 0x43, 0x81, 0x0, 0x50, 0xE3, 0x80, 0x0, 0xA0,
+0x23, 0x8, 0x0, 0xC1, 0xE5, 0xB, 0x0, 0xD1, 0xE5, 0x0, 0x0, 0x50, 0xE3, 0x3, 0x0, 0x0, 0xA, 0x17, 0x0, 0xD6, 0xE5, 0x8, 0x0, 0x80, 0xE3, 0x17, 0x0, 0xC6, 0xE5, 0xE, 0x0, 0x0, 0xEA, 0x2, 0x0, 0xD7, 0xE5,
+0x13, 0x0, 0xC6, 0xE5, 0x10, 0x0, 0x97, 0xE5, 0x0, 0x0, 0x86, 0xE5, 0x0, 0x0, 0xA0, 0xE3, 0xBC, 0x0, 0xC1, 0xE1, 0x17, 0x0, 0xD6, 0xE5, 0x8, 0x0, 0x80, 0xE3, 0x17, 0x0, 0xC6, 0xE5, 0x10, 0x0, 0x2D, 0xE9,
+0x0, 0x40, 0xD7, 0xE5, 0x9C, 0x11, 0x9F, 0xE5, 0xF, 0xE0, 0xA0, 0xE1, 0x11, 0xFF, 0x2F, 0xE1, 0x10, 0x0, 0xBD, 0xE8, 0x0, 0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x15, 0x20, 0xD7, 0xE5, 0x6, 0x20, 0xC2,
+0xE3, 0x15, 0x20, 0xC7, 0xE5, 0x0, 0x0, 0x56, 0xE3, 0xA, 0x0, 0x0, 0xA, 0x3, 0x0, 0xA0, 0xE3, 0x11, 0x0, 0xC6, 0xE5, 0x17, 0x0, 0xD6, 0xE5, 0xC0, 0x0, 0xC0, 0xE3, 0x64, 0x11, 0x9F, 0xE5, 0x0, 0x10, 0xD1,
+0xE5, 0x1, 0x3, 0x80, 0xE1, 0x0, 0x4, 0x8A, 0xE1, 0xB6, 0x1, 0xC6, 0xE1, 0x9, 0x0, 0xD7, 0xE5, 0x12, 0x0, 0xC6, 0xE5, 0x9, 0x0, 0xD7, 0x5, 0x1, 0x0, 0x50, 0xE2, 0x11, 0x0, 0x0, 0x3A, 0x14, 0x20, 0x98,
+0xE5, 0x8, 0x10, 0x98, 0xE5, 0x0, 0x1, 0x91, 0xE7, 0x2, 0x0, 0x80, 0xE0, 0x16, 0x20, 0xD7, 0xE5, 0xB8, 0x10, 0xD0, 0xE1, 0x2, 0x9, 0x11, 0xE3, 0x3, 0x0, 0x0, 0xA, 0x0, 0x0, 0x56, 0xE3, 0x15, 0x10, 0xC6,
+0x15, 0x7, 0x20, 0xC7, 0xE5, 0x1E, 0xFF, 0x2F, 0xE1, 0x82, 0x0, 0x80, 0xE0, 0xB1, 0x0, 0x90, 0xE1, 0x7, 0x0, 0xC7, 0xE5, 0x0, 0x0, 0x56, 0xE3, 0x20, 0x4, 0xA0, 0xE1, 0x15, 0x0, 0xC6, 0x15, 0x1E, 0xFF,
+0x2F, 0xE1, 0x18, 0x0, 0xD8, 0xE5, 0xA0, 0x1, 0xB0, 0xE1, 0x2E, 0x0, 0x0, 0x2A, 0x46, 0x30, 0x8F, 0xE2, 0x2, 0x0, 0xD3, 0xE7, 0x1E, 0x30, 0x43, 0xE2, 0x22, 0x21, 0xD3, 0xE7, 0xD8, 0x30, 0x9F, 0xE5, 0xB0,
+0x0, 0x93, 0xE1, 0xAB, 0x3E, 0xA0, 0xE3, 0x2, 0x38, 0x83, 0xE3, 0x93, 0x0, 0x0, 0xE0, 0x30, 0x2, 0xA0, 0xE1, 0x0, 0x0, 0x9, 0xEF, 0x1E, 0xFF, 0x2F, 0xE1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, 0x3,
+0x3, 0x3, 0x4, 0x4, 0x4, 0x5, 0x5, 0x5, 0x6, 0x6, 0x6, 0x7, 0x7, 0x7, 0x8, 0x8, 0x8, 0x9, 0x9, 0x9, 0x0, 0x2, 0x4, 0x6, 0x8, 0xA, 0xC, 0xE, 0x10, 0x12, 0x14, 0x16, 0x0, 0x2, 0x4, 0x6, 0x8, 0xA, 0xC, 0xE,
+0x10, 0x12, 0x14, 0x16, 0x0, 0x2, 0x4, 0x6, 0x8, 0xA, 0xC, 0xE, 0x10, 0x12, 0x14, 0x16, 0x0, 0x2, 0x4, 0x6, 0x8, 0xA, 0xC, 0xE, 0x10, 0x12, 0x14, 0x16, 0x0, 0x2, 0x4, 0x6, 0x8, 0xA, 0xC, 0xE, 0x10, 0x12,
+0x14, 0x16, 0x0, 0x2, 0x4, 0x6, 0x8, 0xA, 0xC, 0xE, 0x10, 0x12, 0x14, 0x16, 0x0, 0x2, 0x4, 0x6, 0x8, 0xA, 0xC, 0xE, 0x10, 0x12, 0x14, 0x16, 0x0, 0x2, 0x4, 0x6, 0x8, 0xA, 0xC, 0xE, 0x10, 0x12, 0x14, 0x16,
+0x0, 0x2, 0x4, 0x6, 0x8, 0xA, 0xC, 0xE, 0x10, 0x12, 0x14, 0x16, 0x0, 0x0, 0x18, 0x10, 0x9F, 0xE5, 0x2, 0x1, 0x91, 0xE7, 0x1E, 0xFF, 0x2F, 0xE1, 0xAC, 0xE7, 0x7F, 0x3, 0xD0, 0xF0, 0x7F, 0x3, 0xBC, 0xF0,
+0x7F, 0x3, 0xA8, 0xF0, 0x7F, 0x3, 0xF9, 0x8A, 0x7F, 0x3, 0xA4, 0x9D, 0x7F, 0x3, 0xFF, 0x8F, 0x7F, 0x3, 0x37, 0x92, 0x7F, 0x3, 0x1, 0x8C, 0x7F, 0x3, 0xCD, 0xF0, 0x7F, 0x3, 0x84, 0x99, 0x7F, 0x3, 0x1, 0x40,
+0x2D, 0xE9, 0x2C, 0x17, 0x9F, 0xE5, 0x0, 0x0, 0x81, 0xE5, 0x28, 0x7, 0x9F, 0xE5, 0x0, 0x10, 0xA0, 0xE3, 0x0, 0x20, 0xA0, 0xE3, 0x6, 0x0, 0x80, 0xE8, 0x0, 0x0, 0x9D, 0xE5, 0x18, 0x17, 0x9F, 0xE5, 0xF7,
+0xF, 0x0, 0xEB, 0x0, 0x0, 0x9D, 0xE5, 0x10, 0x17, 0x9F, 0xE5, 0x0, 0x20, 0xA0, 0xE3, 0xF6, 0xF, 0x0, 0xEB, 0x9, 0x0, 0xBD, 0xE8, 0x13, 0xFF, 0x2F, 0xE1, 0x0, 0x17, 0x9F, 0xE5, 0xF0, 0x26, 0x9F, 0xE5,
+0x4, 0x20, 0x92, 0xE5, 0x2, 0x2C, 0xA0, 0xE1, 0x20, 0x38, 0xA0, 0xE1, 0x3F, 0x30, 0x3, 0xE2, 0x22, 0x3C, 0xC1, 0xE7, 0x1, 0x24, 0x82, 0xE2, 0x3, 0x35, 0x0, 0xE2, 0x1, 0x5, 0x53, 0xE3, 0xB, 0x0, 0x0, 0xBA,
+0x22, 0xC, 0xC1, 0xE7, 0x1, 0x24, 0x82, 0xE2, 0x2, 0x5, 0x53, 0xE3, 0x7, 0x0, 0x0, 0xBA, 0x20, 0x4, 0xA0, 0xE1, 0x22, 0xC, 0xC1, 0xE7, 0x1, 0x24, 0x82, 0xE2, 0x3, 0x5, 0x53, 0xE3, 0x2, 0x0, 0x0, 0xBA,
+0x20, 0x8, 0xA0, 0xE1, 0x22, 0xC, 0xC1, 0xE7, 0x1, 0x24, 0x82, 0xE2, 0x22, 0x2C, 0xA0, 0xE1, 0x94, 0x6, 0x9F, 0xE5, 0x4, 0x20, 0x80, 0xE5, 0x1E, 0xFF, 0x2F, 0xE1, 0x10, 0x40, 0x2D, 0xE9, 0x20, 0xD0, 0x4D,
+0xE2, 0x0, 0x10, 0xA0, 0xE1, 0x78, 0x6, 0x9F, 0xE5, 0x0, 0x0, 0x90, 0xE5, 0xD, 0x20, 0xA0, 0xE1, 0xD5, 0xF, 0x0, 0xEB, 0x78, 0x16, 0x9F, 0xE5, 0x68, 0x26, 0x9F, 0xE5, 0x4, 0x20, 0x92, 0xE5, 0x2, 0x2C,
+0xA0, 0xE1, 0x0, 0x40, 0xDD, 0xE5, 0x1, 0x30, 0x8D, 0xE2, 0x1, 0x0, 0xD3, 0xE4, 0x22, 0xC, 0xC1, 0xE7, 0x1, 0x24, 0x82, 0xE2, 0x1, 0x40, 0x54, 0xE2, 0xFA, 0xFF, 0xFF, 0x1A, 0x40, 0x6, 0x9F, 0xE5, 0x22,
+0x2C, 0xA0, 0xE1, 0x4, 0x20, 0x80, 0xE5, 0x20, 0xD0, 0x8D, 0xE2, 0x10, 0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x38, 0x6, 0x9F, 0xE5, 0x6, 0x0, 0xD0, 0xE5, 0x0, 0x0, 0x50, 0xE3, 0x1, 0x8, 0xA0, 0x13,
+0x2C, 0x16, 0x9F, 0xE5, 0x0, 0x10, 0x91, 0xE5, 0x0, 0x10, 0x81, 0xE1, 0x8, 0x6, 0x9F, 0xE5, 0x0, 0x0, 0x90, 0xE5, 0x1C, 0x26, 0x9F, 0xE5, 0x12, 0xFF, 0x2F, 0xE1, 0x0, 0x10, 0xA0, 0xE1, 0xF4, 0x5, 0x9F,
+0xE5, 0x0, 0x0, 0x90, 0xE5, 0x8, 0x26, 0x9F, 0xE5, 0x12, 0xFF, 0x2F, 0xE1, 0x0, 0x0, 0xF, 0xE1, 0x80, 0x10, 0x0, 0xE2, 0x80, 0x0, 0xC0, 0xE3, 0x0, 0xF0, 0x29, 0xE1, 0x50, 0x10, 0x8F, 0xE5, 0x1E, 0xFF,
+0x2F, 0xE1, 0x0, 0x0, 0xF, 0xE1, 0x44, 0x10, 0x9F, 0xE5, 0x0, 0x10, 0x81, 0xE1, 0x0, 0xF0, 0x29, 0xE1, 0x1E, 0xFF, 0x2F, 0xE1, 0xF0, 0x40, 0x2D, 0xE9, 0xF2, 0xFF, 0xFF, 0xEB, 0xC0, 0x65, 0x9F, 0xE5, 0xB0,
+0x5, 0x9F, 0xE5, 0xA0, 0x0, 0x90, 0xE8, 0x0, 0x70, 0x80, 0xE5, 0xF3, 0xFF, 0xFF, 0xEB, 0x5, 0x70, 0x57, 0xE0, 0x5, 0x5C, 0xA0, 0xE1, 0x1, 0x7C, 0x87, 0x42, 0x24, 0x0, 0x0, 0xA, 0x25, 0xC, 0xD6, 0xE7,
+0x1, 0x54, 0x85, 0xE2, 0x7C, 0xE0, 0x8F, 0xE2, 0x0, 0xF1, 0x8F, 0xE0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0xEA, 0x30, 0x0, 0x0, 0xEA, 0x3B, 0x0, 0x0, 0xEA, 0x44, 0x0, 0x0, 0xEA, 0x45, 0x0, 0x0, 0xEA,
+0x46, 0x0, 0x0, 0xEA, 0x47, 0x0, 0x0, 0xEA, 0x4B, 0x0, 0x0, 0xEA, 0x52, 0x0, 0x0, 0xEA, 0x59, 0x0, 0x0, 0xEA, 0x60, 0x0, 0x0, 0xEA, 0x67, 0x0, 0x0, 0xEA, 0x6E, 0x0, 0x0, 0xEA, 0x75, 0x0, 0x0, 0xEA, 0x8E,
+0x0, 0x0, 0xEA, 0x8F, 0x0, 0x0, 0xEA, 0x93, 0x0, 0x0, 0xEA, 0xA7, 0x0, 0x0, 0xEA, 0xB0, 0x0, 0x0, 0xEA, 0xB9, 0x0, 0x0, 0xEA, 0xC5, 0x0, 0x0, 0xEA, 0xD1, 0x0, 0x0, 0xEA, 0xDF, 0x0, 0x0, 0xEA, 0x5, 0x0,
+0x0, 0xEA, 0xFF, 0x0, 0x0, 0xEA, 0x0, 0x1, 0x0, 0xEA, 0x1, 0x1, 0x0, 0xEA, 0x37, 0x1, 0x0, 0xEA, 0x3B, 0x1, 0x0, 0xEA, 0x3F, 0x1, 0x0, 0xEA, 0x1, 0x70, 0x57, 0xE2, 0xDA, 0xFF, 0xFF, 0x1A, 0xF0, 0x40,
+0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x5, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1, 0x25, 0x1C, 0xD6, 0xE7, 0x1,
+0x54, 0x85, 0xE2, 0x25, 0x2C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x2, 0x14, 0x81, 0xE1, 0x25, 0x2C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x2, 0x18, 0x81, 0xE1, 0x2, 0x14, 0x81, 0xE2, 0xD4, 0x24, 0x9F, 0xE5,
+0x12, 0xFF, 0x2F, 0xE1, 0x3, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85,
+0xE2, 0x0, 0x0, 0x51, 0xE3, 0xAC, 0x14, 0x9F, 0x5, 0xAC, 0x14, 0x9F, 0x15, 0x11, 0xFF, 0x2F, 0xE1, 0x3, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54,
+0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x88, 0x24, 0x9F, 0xE5, 0x12, 0xFF, 0x2F, 0xE1, 0x84, 0x4, 0x9F, 0xE5, 0x10, 0xFF, 0x2F, 0xE1, 0x80, 0x4, 0x9F, 0xE5, 0x10,
+0xFF, 0x2F, 0xE1, 0x7C, 0x4, 0x9F, 0xE5, 0x10, 0xFF, 0x2F, 0xE1, 0x1, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x6C, 0x14, 0x9F, 0xE5, 0x11, 0xFF, 0x2F, 0xE1, 0x2, 0x70, 0x47, 0xE2,
+0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1, 0x50, 0x14, 0x9F, 0xE5, 0x11, 0xFF, 0x2F, 0xE1, 0x2, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6,
+0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1, 0x34, 0x14, 0x9F, 0xE5, 0x11, 0xFF, 0x2F, 0xE1, 0x2, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54,
+0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1, 0x18, 0x14, 0x9F, 0xE5, 0x11, 0xFF, 0x2F, 0xE1, 0x2, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25,
+0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1, 0xFC, 0x13, 0x9F, 0xE5, 0x11, 0xFF, 0x2F, 0xE1, 0x2, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7,
+0x1, 0x54, 0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1, 0xE0, 0x13, 0x9F, 0xE5, 0x11, 0xFF, 0x2F, 0xE1, 0x2, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85,
+0xE2, 0x1, 0x4, 0x80, 0xE1, 0xC4, 0x13, 0x9F, 0xE5, 0x11, 0xFF, 0x2F, 0xE1, 0x9, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0x4,
+0x80, 0xE1, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0x8, 0x80, 0xE1, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0xC, 0x80, 0xE1, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25,
+0x2C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x2, 0x14, 0x81, 0xE1, 0x25, 0x2C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x3C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x3, 0x24, 0x82, 0xE1, 0x25, 0x3C, 0xD6, 0xE7,
+0x1, 0x54, 0x85, 0xE2, 0xFF, 0xE, 0x0, 0xEB, 0x7F, 0xFF, 0xFF, 0xEA, 0x58, 0x3, 0x9F, 0xE5, 0x10, 0xFF, 0x2F, 0xE1, 0x1, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x48, 0x13, 0x9F,
+0xE5, 0x11, 0xFF, 0x2F, 0xE1, 0x4, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1, 0x1, 0x1B, 0xA0, 0xE3, 0x25, 0x2C,
+0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x3C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x3, 0x24, 0x82, 0xE1, 0x2, 0x18, 0x81, 0xE1, 0x81, 0x2C, 0xA0, 0xE3, 0x1, 0x20, 0x42, 0xE2, 0x7, 0x0, 0x2D, 0xE9, 0xD,
+0x0, 0xA0, 0xE1, 0x0, 0x13, 0x9F, 0xE5, 0xE7, 0xE, 0x0, 0xEB, 0xC, 0xD0, 0x8D, 0xE2, 0x63, 0xFF, 0xFF, 0xEA, 0x3, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7,
+0x1, 0x54, 0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0xD4, 0x22, 0x9F, 0xE5, 0x12, 0xFF, 0x2F, 0xE1, 0x3, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85,
+0xE2, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0xB0, 0x22, 0x9F, 0xE5, 0x12, 0xFF, 0x2F, 0xE1, 0x4, 0x70, 0x47, 0xE2, 0x25, 0xC,
+0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x2C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x2,
+0x14, 0x81, 0xE1, 0x80, 0x22, 0x9F, 0xE5, 0x12, 0xFF, 0x2F, 0xE1, 0x4, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1,
+0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x2C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x2, 0x14, 0x81, 0xE1, 0x50, 0x22, 0x9F, 0xE5, 0x12, 0xFF, 0x2F, 0xE1, 0x3, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6,
+0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x0, 0x0, 0x51, 0xE3, 0x28, 0x22, 0x9F, 0x5, 0x12, 0xFF,
+0x2F, 0x1, 0x1, 0x0, 0x51, 0xE3, 0x20, 0x22, 0x9F, 0x5, 0x12, 0xFF, 0x2F, 0x1, 0xFE, 0xFF, 0xFF, 0xEA, 0xA, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7, 0x1,
+0x54, 0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0x8, 0x80, 0xE1, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0xC, 0x80, 0xE1, 0x25, 0x1C, 0xD6, 0xE7,
+0x1, 0x54, 0x85, 0xE2, 0x25, 0x2C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x2, 0x14, 0x81, 0xE1, 0x25, 0x2C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x2, 0x18, 0x81, 0xE1, 0x25, 0x2C, 0xD6, 0xE7, 0x1, 0x54, 0x85,
+0xE2, 0x2, 0x1C, 0x81, 0xE1, 0x25, 0x2C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x3C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x3, 0x24, 0x82, 0xE1, 0x7, 0x0, 0x2D, 0xE9, 0xD, 0x0, 0xA0, 0xE1, 0x84, 0x11,
+0x9F, 0xE5, 0x88, 0xE, 0x0, 0xEB, 0xC, 0xD0, 0x8D, 0xE2, 0x4, 0xFF, 0xFF, 0xEA, 0x90, 0x1, 0x9F, 0xE5, 0x10, 0xFF, 0x2F, 0xE1, 0x8C, 0x1, 0x9F, 0xE5, 0x10, 0xFF, 0x2F, 0xE1, 0x2, 0x70, 0x47, 0xE2, 0x18,
+0xD0, 0x4D, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x25, 0x1C, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0x1, 0x4, 0x80, 0xE1, 0xB0, 0x0, 0xCD, 0xE1, 0x1, 0x10, 0xA0, 0xE3, 0xA0, 0x0, 0x11, 0xE1,
+0x25, 0x3C, 0xD6, 0x27, 0x1, 0x54, 0x85, 0x22, 0x4, 0x30, 0xCD, 0x25, 0x25, 0x3C, 0xD6, 0x27, 0x1, 0x54, 0x85, 0x22, 0x5, 0x30, 0xCD, 0x25, 0x25, 0x3C, 0xD6, 0x27, 0x1, 0x54, 0x85, 0x22, 0x6, 0x30, 0xCD,
+0x25, 0x25, 0x3C, 0xD6, 0x27, 0x1, 0x54, 0x85, 0x22, 0x7, 0x30, 0xCD, 0x25, 0x4, 0x70, 0x47, 0x22, 0x25, 0x3C, 0xD6, 0x17, 0x1, 0x54, 0x85, 0x12, 0x8, 0x30, 0xCD, 0x15, 0x25, 0x3C, 0xD6, 0x17, 0x1, 0x54,
+0x85, 0x12, 0x9, 0x30, 0xCD, 0x15, 0x2, 0x70, 0x47, 0x12, 0xA0, 0x1, 0x11, 0xE1, 0x25, 0x3C, 0xD6, 0x27, 0x1, 0x54, 0x85, 0x22, 0xA, 0x30, 0xCD, 0x25, 0x25, 0x3C, 0xD6, 0x27, 0x1, 0x54, 0x85, 0x22, 0xB,
+0x30, 0xCD, 0x25, 0x2, 0x70, 0x47, 0x22, 0x25, 0x3C, 0xD6, 0x17, 0x1, 0x54, 0x85, 0x12, 0xC, 0x30, 0xCD, 0x15, 0x25, 0x3C, 0xD6, 0x17, 0x1, 0x54, 0x85, 0x12, 0xD, 0x30, 0xCD, 0x15, 0x2, 0x70, 0x47, 0x12,
+0xA0, 0x2, 0x11, 0xE1, 0x25, 0x3C, 0xD6, 0x27, 0x1, 0x54, 0x85, 0x22, 0xE, 0x30, 0xCD, 0x25, 0x1, 0x70, 0x47, 0x22, 0xD, 0x0, 0xA0, 0xE1, 0xBC, 0x10, 0x9F, 0xE5, 0x4D, 0xE, 0x0, 0xEB, 0x18, 0xD0, 0x8D,
+0xE2, 0xC9, 0xFE, 0xFF, 0xEA, 0x1, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54, 0x85, 0xE2, 0xA4, 0x10, 0x9F, 0xE5, 0x11, 0xFF, 0x2F, 0xE1, 0x1, 0x70, 0x47, 0xE2, 0x25, 0xC, 0xD6, 0xE7, 0x1, 0x54,
+0x85, 0xE2, 0x94, 0x10, 0x9F, 0xE5, 0x11, 0xFF, 0x2F, 0xE1, 0x90, 0x10, 0x9F, 0xE5, 0x11, 0xFF, 0x2F, 0xE1, 0x88, 0xF2, 0x7F, 0x3, 0x80, 0xF2, 0x7F, 0x3, 0x40, 0xA7, 0x7F, 0x3, 0xAC, 0xA7, 0x7F, 0x3,
+0x80, 0xF1, 0x7F, 0x3, 0x38, 0xF0, 0x7F, 0x3, 0x40, 0x16, 0x80, 0x3, 0x81, 0xD4, 0x7F, 0x3, 0xFD, 0x84, 0x7F, 0x3, 0x35, 0x84, 0x7F, 0x3, 0xB3, 0x83, 0x7F, 0x3, 0x1B, 0x86, 0x7F, 0x3, 0xF9, 0x86, 0x7F,
+0x3, 0x15, 0x87, 0x7F, 0x3, 0x35, 0x88, 0x7F, 0x3, 0x7D, 0x87, 0x7F, 0x3, 0x2F, 0x86, 0x7F, 0x3, 0x31, 0x87, 0x7F, 0x3, 0x41, 0x87, 0x7F, 0x3, 0x93, 0x87, 0x7F, 0x3, 0xC5, 0x87, 0x7F, 0x3, 0xEF, 0xCD,
+0x7F, 0x3, 0x7F, 0xCB, 0x7F, 0x3, 0x63, 0xC3, 0x7F, 0x3, 0x13, 0xCC, 0x7F, 0x3, 0x35, 0xCD, 0x7F, 0x3, 0x53, 0xCD, 0x7F, 0x3, 0x67, 0xCD, 0x7F, 0x3, 0xDB, 0xCD, 0x7F, 0x3, 0x7B, 0xCD, 0x7F, 0x3, 0xB5,
+0xCD, 0x7F, 0x3, 0x59, 0xC5, 0x7F, 0x3, 0x77, 0xC5, 0x7F, 0x3, 0xBB, 0xC5, 0x7F, 0x3, 0x17, 0xC7, 0x7F, 0x3, 0x5F, 0xC7, 0x7F, 0x3, 0xFD, 0xCD, 0x7F, 0x3, 0x10, 0x40, 0x2D, 0xE9, 0x68, 0x1C, 0x9F, 0xE5,
+0x20, 0x40, 0xA0, 0xE3, 0xB6, 0x20, 0xD1, 0xE1, 0xBC, 0x30, 0xD1, 0xE1, 0x2, 0x0, 0x53, 0xE1, 0x2, 0x0, 0x0, 0xCA, 0x3, 0x20, 0x42, 0xE0, 0x42, 0x31, 0x83, 0xE0, 0x2, 0x0, 0x0, 0xEA, 0x0, 0x30, 0x43,
+0xE0, 0x2, 0x0, 0x53, 0xE1, 0x2, 0x30, 0xA0, 0xB1, 0xBC, 0x30, 0xC1, 0xE1, 0x3, 0x20, 0xD1, 0xE5, 0x7F, 0x20, 0x2, 0xE2, 0x82, 0x24, 0xA0, 0xE1, 0xBE, 0x30, 0xD1, 0xE1, 0x2, 0x0, 0x53, 0xE1, 0x3, 0x0,
+0x0, 0xCA, 0x0, 0x30, 0x83, 0xE0, 0x2, 0x0, 0x53, 0xE1, 0x2, 0x30, 0xA0, 0xC1, 0x2, 0x0, 0x0, 0xEA, 0x0, 0x30, 0x43, 0xE0, 0x2, 0x0, 0x53, 0xE1, 0x2, 0x30, 0xA0, 0xB1, 0xBE, 0x30, 0xC1, 0xE1, 0x10, 0x10,
+0x81, 0xE2, 0x1, 0x40, 0x54, 0xE2, 0xE3, 0xFF, 0xFF, 0x1A, 0x10, 0x40, 0xBD, 0xE8, 0xF0, 0x40, 0x2D, 0xE9, 0xEC, 0xB, 0x9F, 0xE5, 0x0, 0x0, 0xD0, 0xE5, 0x1, 0x0, 0x50, 0xE3, 0xF0, 0x40, 0xBD, 0xB8, 0x1E,
+0xFF, 0x2F, 0xB1, 0xDC, 0x4B, 0x9F, 0xE5, 0xDC, 0x3B, 0x9F, 0xE5, 0xB0, 0x30, 0xD3, 0xE1, 0xC, 0x0, 0x0, 0xCA, 0xD4, 0x7B, 0x9F, 0xE5, 0xD4, 0x5B, 0x9F, 0xE5, 0x2, 0x0, 0x0, 0xEA, 0x4, 0x0, 0x95, 0xE4,
+0x2A, 0x3, 0x80, 0xE3, 0x10, 0x0, 0x84, 0xE4, 0xA3, 0x30, 0xB0, 0xE1, 0xFA, 0xFF, 0xFF, 0x2A, 0x10, 0x40, 0x84, 0xE2, 0x4, 0x50, 0x85, 0xE2, 0xFA, 0xFF, 0xFF, 0x1A, 0xF0, 0x40, 0xBD, 0xE8, 0x1E, 0xFF,
+0x2F, 0xE1, 0xA8, 0x5B, 0x9F, 0xE5, 0x9C, 0x7B, 0x9F, 0xE5, 0x13, 0x0, 0x0, 0xEA, 0x4, 0x10, 0x95, 0xE5, 0x0, 0x0, 0x51, 0xE3, 0x9, 0x0, 0x0, 0xA, 0x0, 0x0, 0xA0, 0xE3, 0x0, 0x0, 0x84, 0xE5, 0x4, 0x0,
+0x85, 0xE5, 0x4, 0x10, 0x84, 0xE5, 0xBA, 0x20, 0xD5, 0xE1, 0xBA, 0x20, 0xC4, 0xE1, 0xC, 0x20, 0x95, 0xE5, 0xC, 0x20, 0x84, 0xE5, 0x0, 0x10, 0x95, 0xE5, 0x0, 0x10, 0x84, 0xE5, 0xB8, 0x10, 0xD5, 0xE1, 0xB8,
+0x10, 0xC4, 0xE1, 0x10, 0x10, 0x95, 0xE4, 0x21, 0x8, 0xA0, 0xE1, 0x2, 0x0, 0xC4, 0xE5, 0xB0, 0x10, 0xC4, 0xE1, 0x10, 0x40, 0x84, 0xE2, 0xA3, 0x30, 0xB0, 0xE1, 0xE9, 0xFF, 0xFF, 0x2A, 0x10, 0x40, 0x84,
+0xE2, 0x10, 0x50, 0x85, 0xE2, 0xFA, 0xFF, 0xFF, 0x1A, 0xF0, 0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0xF0, 0x4F, 0x2D, 0xE9, 0x6, 0xB, 0xA0, 0xE3, 0xA7, 0xFF, 0xFF, 0xEB, 0xC, 0xCB, 0x9F, 0xE5, 0x14,
+0xAB, 0x9F, 0xE5, 0x0, 0xA0, 0x9A, 0xE5, 0x10, 0x7B, 0x9F, 0xE5, 0x0, 0xB, 0x9F, 0xE5, 0x0, 0x0, 0xD0, 0xE5, 0x1, 0x0, 0x50, 0xE3, 0x52, 0x0, 0x0, 0xA, 0x5C, 0x2, 0x0, 0xCA, 0xF0, 0xBA, 0x9F, 0xE5, 0xFF,
+0xA8, 0xCA, 0xE3, 0xFF, 0xA4, 0xCA, 0xE3, 0xAA, 0xA0, 0xB0, 0xE1, 0x45, 0x0, 0x0, 0x3A, 0x0, 0x10, 0x9C, 0xE5, 0xFF, 0x64, 0xD1, 0xE3, 0x0, 0x60, 0x8B, 0x5, 0x41, 0x0, 0x0, 0xA, 0x2, 0x64, 0x86, 0xE2,
+0x81, 0x10, 0xB0, 0xE1, 0x2B, 0x0, 0x0, 0x3A, 0xA1, 0x1C, 0xB0, 0xE1, 0x3, 0x10, 0xCC, 0xE5, 0x8, 0x40, 0xDC, 0xE5, 0x0, 0x0, 0x54, 0xE3, 0x4, 0x0, 0x0, 0xA, 0x8, 0x30, 0xD6, 0xE5, 0x1, 0x0, 0x53, 0xE3,
+0x0, 0x40, 0xA0, 0xC3, 0x84, 0x43, 0xA0, 0x1, 0x4, 0x43, 0xA0, 0x11, 0x0, 0x10, 0xA0, 0xE3, 0xC, 0x20, 0x96, 0xE5, 0x0, 0x0, 0x52, 0xE3, 0x10, 0x20, 0x86, 0x2, 0x4, 0x21, 0x82, 0xE0, 0x9, 0x30, 0xD6,
+0xE5, 0x1, 0x0, 0x53, 0xE3, 0x7, 0x0, 0x0, 0x1A, 0xB0, 0x30, 0xD6, 0xE1, 0x4, 0x30, 0x53, 0xE0, 0x3, 0x21, 0x82, 0x40, 0x0, 0x30, 0xA0, 0x43, 0x4, 0x40, 0x96, 0xE5, 0x3, 0x38, 0xA0, 0xE1, 0x1E, 0x0, 0x8B,
+0xE8, 0x5, 0x0, 0x0, 0xEA, 0x4, 0x50, 0x96, 0xE5, 0x4, 0xE0, 0x55, 0xE0, 0x4, 0x21, 0x42, 0x40, 0x5, 0xE0, 0xA0, 0x41, 0x0, 0x30, 0xA0, 0xE3, 0xE, 0x40, 0x8B, 0xE8, 0xB6, 0x0, 0xDC, 0xE1, 0x3, 0x10, 0xDC,
+0xE5, 0x81, 0xC, 0x80, 0xE1, 0xC, 0x0, 0x8C, 0xE5, 0xB8, 0x0, 0xD6, 0xE1, 0x20, 0x14, 0xA0, 0xE1, 0x0, 0xC, 0xA0, 0xE1, 0x20, 0x1B, 0x81, 0xE1, 0x81, 0x4D, 0xA0, 0xE1, 0x2, 0x41, 0x84, 0xE3, 0x0, 0x40,
+0x8B, 0xE5, 0x4, 0x0, 0x0, 0xEA, 0x0, 0x10, 0x9B, 0xE5, 0x2, 0x1, 0x11, 0xE3, 0x0, 0x10, 0xA0, 0x3, 0x0, 0x10, 0x8C, 0x5, 0xD, 0x0, 0x0, 0xA, 0x2, 0x7, 0xA0, 0xE3, 0xB4, 0x10, 0xDC, 0xE1, 0x0, 0x0, 0x51,
+0xE3, 0x0, 0x0, 0xA0, 0x3, 0x1, 0x0, 0x0, 0xA, 0x0, 0x0, 0x9, 0xEF, 0x0, 0x0, 0x60, 0xE2, 0xB8, 0x0, 0xCB, 0xE1, 0xBC, 0x0, 0xDC, 0xE1, 0xD, 0x2, 0x0, 0xEB, 0xB0, 0x0, 0xCB, 0xE1, 0xBE, 0x0, 0xDC, 0xE1,
+0xA0, 0x4, 0xA0, 0xE1, 0x2, 0x0, 0xCB, 0xE5, 0x10, 0xB0, 0x8B, 0xE2, 0x10, 0xC0, 0x8C, 0xE2, 0xAA, 0xA0, 0xB0, 0xE1, 0xB5, 0xFF, 0xFF, 0x2A, 0xFA, 0xFF, 0xFF, 0x1A, 0xF0, 0x4F, 0xBD, 0xE8, 0x1E, 0xFF,
+0x2F, 0xE1, 0xBC, 0x9, 0x9F, 0xE5, 0xBC, 0x19, 0x9F, 0xE5, 0x4, 0x10, 0x80, 0xE5, 0xA8, 0xB9, 0x9F, 0xE5, 0xFF, 0xA8, 0xCA, 0xE3, 0xFF, 0xA4, 0xCA, 0xE3, 0xAA, 0xA0, 0xB0, 0xE1, 0x20, 0x0, 0x0, 0x3A,
+0x0, 0x10, 0x9C, 0xE5, 0xFF, 0x64, 0xD1, 0xE3, 0x19, 0x0, 0x0, 0xA, 0x3, 0x0, 0xDC, 0xE5, 0x80, 0xC, 0xB0, 0xE1, 0xA, 0x0, 0x0, 0x3A, 0xA0, 0xC, 0xB0, 0xE1, 0x3, 0x0, 0xCC, 0xE5, 0xB6, 0x0, 0xDC, 0xE1,
+0x3, 0x10, 0xDC, 0xE5, 0x81, 0xC, 0x80, 0xE1, 0xC, 0x0, 0x8C, 0xE5, 0x8, 0x0, 0x9C, 0xE5, 0x0, 0x9, 0xA0, 0xE1, 0x8, 0x0, 0x8C, 0xE5, 0x1, 0x10, 0xA0, 0xE3, 0x0, 0x0, 0x0, 0xEA, 0x0, 0x10, 0xA0, 0xE3,
+0x2, 0x0, 0x2D, 0xE9, 0xBC, 0x0, 0xDC, 0xE1, 0xE5, 0x1, 0x0, 0xEB, 0xBE, 0x40, 0xDC, 0xE1, 0xA4, 0x44, 0xA0, 0xE1, 0x4, 0x48, 0x80, 0xE1, 0x0, 0x40, 0x8B, 0xE5, 0x13, 0x0, 0x0, 0xEB, 0x2, 0x0, 0xBD, 0xE8,
+0x19, 0x0, 0x0, 0xEB, 0x3, 0x0, 0x0, 0xEA, 0x1, 0x5, 0xA0, 0xE3, 0x0, 0x0, 0x8B, 0xE5, 0xD, 0x0, 0x0, 0xEB, 0xB8, 0x1, 0x0, 0xEB, 0x4, 0xB0, 0x8B, 0xE2, 0x10, 0xC0, 0x8C, 0xE2, 0xAA, 0xA0, 0xB0, 0xE1,
+0xDA, 0xFF, 0xFF, 0x2A, 0xFA, 0xFF, 0xFF, 0x1A, 0xC, 0x9, 0x9F, 0xE5, 0x0, 0x10, 0xD0, 0xE5, 0x0, 0x0, 0x51, 0xE3, 0x1, 0x10, 0xA0, 0x3, 0x0, 0x10, 0xA0, 0x13, 0x0, 0x10, 0xC0, 0xE5, 0xF0, 0x4F, 0xBD,
+0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0xF0, 0x8, 0x9F, 0xE5, 0xD8, 0x18, 0x9F, 0xE5, 0x1, 0x10, 0x4B, 0xE0, 0x81, 0x3, 0x80, 0xE0, 0xDC, 0x18, 0x9F, 0xE5, 0x0, 0x10, 0xD1, 0xE5, 0x1, 0x4, 0x80, 0xE0, 0x1E, 0xFF,
+0x2F, 0xE1, 0x0, 0x5C, 0x2D, 0xE9, 0x0, 0x50, 0x9C, 0xE5, 0xFF, 0x54, 0xC5, 0xE3, 0x2, 0x54, 0x85, 0xE2, 0xB4, 0x70, 0xDC, 0xE1, 0x8, 0x40, 0x9C, 0xE5, 0x0, 0xA0, 0xA0, 0xE1, 0x80, 0x60, 0xA0, 0xE3, 0x0,
+0x0, 0x51, 0xE3, 0x5, 0x0, 0x0, 0xA, 0x20, 0x60, 0x46, 0xE2, 0x0, 0x10, 0xA0, 0xE3, 0x10, 0x0, 0xA0, 0xE3, 0x2, 0x0, 0xAA, 0xE8, 0x1, 0x0, 0x50, 0xE2, 0xFC, 0xFF, 0xFF, 0x1A, 0x3, 0x0, 0x95, 0xE8, 0x1,
+0x30, 0x80, 0xE0, 0x8, 0x0, 0xD5, 0xE5, 0x0, 0x0, 0x50, 0xE3, 0x26, 0x0, 0x0, 0xA, 0x96, 0x7, 0x2, 0xE0, 0x2, 0x8, 0xA0, 0xE3, 0x83, 0x15, 0x64, 0xE0, 0x98, 0x1, 0x0, 0xEB, 0x60, 0x8, 0x9F, 0xE5, 0xC,
+0x10, 0x95, 0xE5, 0x0, 0x0, 0x51, 0xE3, 0x10, 0x10, 0x85, 0x2, 0x24, 0x15, 0x81, 0xE0, 0x24, 0x15, 0x81, 0xE0, 0x3, 0x10, 0xC1, 0xE3, 0x0, 0x10, 0x80, 0xE5, 0x21, 0x13, 0xA0, 0xE3, 0x1, 0x29, 0x82, 0xE2,
+0xA2, 0x15, 0x81, 0xE0, 0x8, 0x10, 0x80, 0xE5, 0x3B, 0x0, 0x0, 0xEB, 0x3, 0x0, 0x95, 0xE8, 0x1, 0x30, 0x80, 0xE0, 0x83, 0x5, 0x54, 0xE1, 0xC, 0x0, 0x0, 0x3A, 0x9, 0x0, 0xD5, 0xE5, 0x1, 0x0, 0x50, 0xE3,
+0x8, 0x0, 0x0, 0xA, 0x0, 0x40, 0xA0, 0xE3, 0x0, 0x40, 0x8C, 0xE5, 0x40, 0x0, 0xBD, 0xE8, 0x0, 0x0, 0x56, 0xE3, 0x8, 0x0, 0x0, 0xA, 0xB2, 0x40, 0xCA, 0xE0, 0x1, 0x60, 0x56, 0xE2, 0xFC, 0xFF, 0xFF, 0x1A,
+0x4, 0x0, 0x0, 0xEA, 0x81, 0x45, 0x44, 0xE0, 0x40, 0x0, 0xBD, 0xE8, 0x0, 0x0, 0x56, 0xE3, 0xDA, 0xFF, 0xFF, 0x1A, 0x8, 0x40, 0x8C, 0xE5, 0x0, 0x9C, 0xBD, 0xE8, 0x96, 0x7, 0x2, 0xE0, 0x1, 0x7, 0xA0, 0xE3,
+0x3, 0x16, 0x64, 0xE0, 0x71, 0x1, 0x0, 0xEB, 0xC4, 0x7, 0x9F, 0xE5, 0xC, 0x10, 0x95, 0xE5, 0x0, 0x0, 0x51, 0xE3, 0x10, 0x10, 0x85, 0x2, 0x24, 0x15, 0x81, 0xE0, 0x3, 0x10, 0xC1, 0xE3, 0x0, 0x10, 0x80,
+0xE5, 0x21, 0x13, 0xA0, 0xE3, 0x1, 0x29, 0x82, 0xE2, 0x22, 0x16, 0x81, 0xE0, 0x8, 0x10, 0x80, 0xE5, 0xBA, 0x0, 0x0, 0xEB, 0x3, 0x0, 0x95, 0xE8, 0x1, 0x30, 0x80, 0xE0, 0x3, 0x6, 0x54, 0xE1, 0xC, 0x0, 0x0,
+0x3A, 0x9, 0x0, 0xD5, 0xE5, 0x1, 0x0, 0x50, 0xE3, 0x8, 0x0, 0x0, 0xA, 0x0, 0x40, 0xA0, 0xE3, 0x0, 0x40, 0x8C, 0xE5, 0x40, 0x0, 0xBD, 0xE8, 0x0, 0x0, 0x56, 0xE3, 0x8, 0x0, 0x0, 0xA, 0xB2, 0x40, 0xCA, 0xE0,
+0x1, 0x60, 0x56, 0xE2, 0xFC, 0xFF, 0xFF, 0x1A, 0x4, 0x0, 0x0, 0xEA, 0x1, 0x46, 0x44, 0xE0, 0x40, 0x0, 0xBD, 0xE8, 0x0, 0x0, 0x56, 0xE3, 0xDB, 0xFF, 0xFF, 0x1A, 0x8, 0x40, 0x8C, 0xE5, 0x0, 0x9C, 0xBD,
+0xE8, 0x20, 0x50, 0x2D, 0xE9, 0x3C, 0x57, 0x9F, 0xE5, 0x24, 0x5, 0xA0, 0xE1, 0x0, 0x45, 0xC4, 0xE1, 0x1, 0x10, 0x0, 0xE2, 0x81, 0x50, 0x85, 0xE0, 0x21, 0x0, 0x2D, 0xE9, 0x1, 0xB, 0x57, 0xE3, 0x32, 0x0,
+0x0, 0xBA, 0x1, 0xB0, 0xE0, 0xE3, 0x3, 0x0, 0x1A, 0xE3, 0x5, 0x0, 0x0, 0xA, 0xA4, 0x4, 0xCB, 0xE1, 0xB0, 0x0, 0x95, 0xE1, 0x7, 0x40, 0x84, 0xE0, 0xB2, 0x0, 0xCA, 0xE0, 0x1, 0x60, 0x56, 0xE2, 0x8D, 0x0,
+0x0, 0xA, 0x8, 0x60, 0x56, 0xE2, 0x1E, 0x0, 0x0, 0x4A, 0xA4, 0x84, 0xB, 0xE0, 0xB8, 0x0, 0x95, 0xE1, 0x7, 0x40, 0x84, 0xE0, 0xA4, 0x94, 0xB, 0xE0, 0xB9, 0x90, 0x95, 0xE1, 0x7, 0x40, 0x84, 0xE0, 0x9, 0x8,
+0x80, 0xE1, 0xA4, 0x84, 0xB, 0xE0, 0xB8, 0x10, 0x95, 0xE1, 0x7, 0x40, 0x84, 0xE0, 0xA4, 0x94, 0xB, 0xE0, 0xB9, 0x90, 0x95, 0xE1, 0x7, 0x40, 0x84, 0xE0, 0x9, 0x18, 0x81, 0xE1, 0xA4, 0x84, 0xB, 0xE0, 0xB8,
+0x20, 0x95, 0xE1, 0x7, 0x40, 0x84, 0xE0, 0xA4, 0x94, 0xB, 0xE0, 0xB9, 0x90, 0x95, 0xE1, 0x7, 0x40, 0x84, 0xE0, 0x9, 0x28, 0x82, 0xE1, 0xA4, 0x84, 0xB, 0xE0, 0xB8, 0x30, 0x95, 0xE1, 0x7, 0x40, 0x84, 0xE0,
+0xA4, 0x94, 0xB, 0xE0, 0xB9, 0x90, 0x95, 0xE1, 0x7, 0x40, 0x84, 0xE0, 0x9, 0x38, 0x83, 0xE1, 0xF, 0x0, 0xAA, 0xE8, 0x8, 0x60, 0x56, 0xE2, 0xE0, 0xFF, 0xFF, 0x5A, 0x8, 0x60, 0x96, 0xE2, 0x6A, 0x0, 0x0,
+0xA, 0xA4, 0x84, 0xB, 0xE0, 0xB8, 0x0, 0x95, 0xE1, 0x7, 0x40, 0x84, 0xE0, 0xB2, 0x0, 0xCA, 0xE0, 0x1, 0x60, 0x56, 0xE2, 0xF9, 0xFF, 0xFF, 0x1A, 0x63, 0x0, 0x0, 0xEA, 0x4, 0x4B, 0xA0, 0xE1, 0x3, 0x0, 0x1A,
+0xE3, 0xA, 0x0, 0x0, 0xA, 0xF0, 0x80, 0xD5, 0xE1, 0xF2, 0x90, 0xD5, 0xE1, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xCC, 0xA0, 0xE1, 0x9C, 0xB, 0xB, 0xE0, 0x4B, 0x4, 0x88, 0xE0, 0xB2, 0x0, 0xCA, 0xE0, 0x7, 0x4B,
+0x94, 0xE0, 0x2, 0x50, 0x85, 0x22, 0x1, 0x60, 0x56, 0xE2, 0x53, 0x0, 0x0, 0xA, 0xF0, 0x80, 0xD5, 0xE1, 0xF2, 0x90, 0xF5, 0xE1, 0x7, 0x4B, 0x54, 0xE0, 0x2, 0x50, 0x45, 0x32, 0x8, 0x90, 0xA0, 0x31, 0x8,
+0x60, 0x56, 0xE2, 0x3E, 0x0, 0x0, 0x4A, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xF2, 0x90, 0xF5, 0x21, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xCC, 0xA0, 0xE1, 0x9B, 0xC, 0xC, 0xE0, 0x4C, 0x4, 0x88, 0xE0,
+0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xF2, 0x90, 0xF5, 0x21, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xCC, 0xA0, 0xE1, 0x9B, 0xC, 0xC, 0xE0, 0x4C, 0xB4, 0x88, 0xE0, 0xB, 0x8, 0x80, 0xE0, 0x7, 0x4B, 0x94,
+0xE0, 0x9, 0x80, 0xA0, 0x21, 0xF2, 0x90, 0xF5, 0x21, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xCC, 0xA0, 0xE1, 0x9B, 0xC, 0xC, 0xE0, 0x4C, 0x14, 0x88, 0xE0, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xF2, 0x90,
+0xF5, 0x21, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xCC, 0xA0, 0xE1, 0x9B, 0xC, 0xC, 0xE0, 0x4C, 0xB4, 0x88, 0xE0, 0xB, 0x18, 0x81, 0xE0, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xF2, 0x90, 0xF5, 0x21, 0x8,
+0xB0, 0x49, 0xE0, 0x24, 0xCC, 0xA0, 0xE1, 0x9B, 0xC, 0xC, 0xE0, 0x4C, 0x24, 0x88, 0xE0, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xF2, 0x90, 0xF5, 0x21, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xCC, 0xA0, 0xE1,
+0x9B, 0xC, 0xC, 0xE0, 0x4C, 0xB4, 0x88, 0xE0, 0xB, 0x28, 0x82, 0xE0, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xF2, 0x90, 0xF5, 0x21, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xCC, 0xA0, 0xE1, 0x9B, 0xC, 0xC,
+0xE0, 0x4C, 0x34, 0x88, 0xE0, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xF2, 0x90, 0xF5, 0x21, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xCC, 0xA0, 0xE1, 0x9B, 0xC, 0xC, 0xE0, 0x4C, 0xB4, 0x88, 0xE0, 0xB, 0x38,
+0x83, 0xE0, 0xF, 0x0, 0xAA, 0xE8, 0x8, 0x60, 0x56, 0xE2, 0xC0, 0xFF, 0xFF, 0x5A, 0x8, 0x60, 0x96, 0xE2, 0xA, 0x0, 0x0, 0xA, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xF2, 0x90, 0xF5, 0x21, 0x8, 0xB0,
+0x49, 0xE0, 0x24, 0xCC, 0xA0, 0xE1, 0x9B, 0xC, 0xC, 0xE0, 0x4C, 0x4, 0x88, 0xE0, 0xB2, 0x0, 0xCA, 0xE0, 0x1, 0x60, 0x56, 0xE2, 0xF5, 0xFF, 0xFF, 0x1A, 0xFF, 0xFF, 0xFF, 0xEA, 0x2, 0x50, 0x45, 0xE2, 0x24,
+0x4B, 0xB0, 0xE1, 0x7, 0x40, 0x84, 0xE0, 0x3, 0x0, 0xBD, 0xE8, 0x1, 0x10, 0x45, 0xE0, 0x0, 0x45, 0x84, 0xE0, 0x81, 0x44, 0x84, 0xE0, 0x20, 0x90, 0xBD, 0xE8, 0x20, 0x50, 0x2D, 0xE9, 0xA8, 0x54, 0x9F, 0xE5,
+0x24, 0x5, 0xA0, 0xE1, 0x0, 0x45, 0xC4, 0xE1, 0x3, 0x10, 0x0, 0xE2, 0x1, 0x50, 0x85, 0xE0, 0x21, 0x0, 0x2D, 0xE9, 0x1, 0xB, 0x57, 0xE3, 0x2D, 0x0, 0x0, 0xBA, 0x3, 0x0, 0x1A, 0xE3, 0x5, 0x0, 0x0, 0xA,
+0x24, 0x5, 0xD5, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x0, 0x4, 0xA0, 0xE1, 0xB2, 0x0, 0xCA, 0xE0, 0x1, 0x60, 0x56, 0xE2, 0x86, 0x0, 0x0, 0xA, 0x8, 0x60, 0x56, 0xE2, 0x1A, 0x0, 0x0, 0x4A, 0x24, 0x5, 0xD5, 0xE7,
+0x7, 0x40, 0x84, 0xE0, 0x24, 0x95, 0xD5, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x9, 0x8, 0x80, 0xE1, 0x0, 0x4, 0xA0, 0xE1, 0x24, 0x15, 0xD5, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x24, 0x95, 0xD5, 0xE7, 0x7, 0x40, 0x84,
+0xE0, 0x9, 0x18, 0x81, 0xE1, 0x1, 0x14, 0xA0, 0xE1, 0x24, 0x25, 0xD5, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x24, 0x95, 0xD5, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x9, 0x28, 0x82, 0xE1, 0x2, 0x24, 0xA0, 0xE1, 0x24, 0x35,
+0xD5, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x24, 0x95, 0xD5, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x9, 0x38, 0x83, 0xE1, 0x3, 0x34, 0xA0, 0xE1, 0xF, 0x0, 0xAA, 0xE8, 0x8, 0x60, 0x56, 0xE2, 0xE4, 0xFF, 0xFF, 0x5A, 0x8,
+0x60, 0x96, 0xE2, 0x67, 0x0, 0x0, 0xA, 0x24, 0x5, 0xD5, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x0, 0x4, 0xA0, 0xE1, 0xB2, 0x0, 0xCA, 0xE0, 0x1, 0x60, 0x56, 0xE2, 0xF9, 0xFF, 0xFF, 0x1A, 0x60, 0x0, 0x0, 0xEA, 0x4,
+0x4B, 0xA0, 0xE1, 0x3, 0x0, 0x1A, 0xE3, 0xA, 0x0, 0x0, 0xA, 0xD0, 0x80, 0xD5, 0xE1, 0xD1, 0x90, 0xD5, 0xE1, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xCC, 0xA0, 0xE1, 0x9C, 0xB, 0xB, 0xE0, 0x8, 0x4, 0x8B, 0xE0, 0xB2,
+0x0, 0xCA, 0xE0, 0x7, 0x4B, 0x94, 0xE0, 0x1, 0x50, 0x85, 0x22, 0x1, 0x60, 0x56, 0xE2, 0x50, 0x0, 0x0, 0xA, 0xD0, 0x80, 0xD5, 0xE1, 0xD1, 0x90, 0xF5, 0xE1, 0xFF, 0xE8, 0xA0, 0xE3, 0x7, 0x4B, 0x54, 0xE0,
+0x1, 0x50, 0x45, 0x32, 0x8, 0x90, 0xA0, 0x31, 0x8, 0x60, 0x56, 0xE2, 0x3A, 0x0, 0x0, 0x4A, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xD1, 0x90, 0xF5, 0x21, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xCC, 0xA0,
+0xE1, 0x9C, 0xB, 0xB, 0xE0, 0x8, 0x4, 0x8B, 0xE0, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xD1, 0x90, 0xF5, 0x21, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xC4, 0xE, 0xE0, 0x9C, 0xB, 0x20, 0xE0, 0x8, 0xC, 0x80,
+0xE0, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xD1, 0x90, 0xF5, 0x21, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xCC, 0xA0, 0xE1, 0x9C, 0xB, 0xB, 0xE0, 0x8, 0x14, 0x8B, 0xE0, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80,
+0xA0, 0x21, 0xD1, 0x90, 0xF5, 0x21, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xC4, 0xE, 0xE0, 0x9C, 0x1B, 0x21, 0xE0, 0x8, 0x1C, 0x81, 0xE0, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xD1, 0x90, 0xF5, 0x21, 0x8,
+0xB0, 0x49, 0xE0, 0x24, 0xCC, 0xA0, 0xE1, 0x9C, 0xB, 0xB, 0xE0, 0x8, 0x24, 0x8B, 0xE0, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xD1, 0x90, 0xF5, 0x21, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xC4, 0xE, 0xE0,
+0x9C, 0x2B, 0x22, 0xE0, 0x8, 0x2C, 0x82, 0xE0, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xD1, 0x90, 0xF5, 0x21, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xCC, 0xA0, 0xE1, 0x9C, 0xB, 0xB, 0xE0, 0x8, 0x34, 0x8B,
+0xE0, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xD1, 0x90, 0xF5, 0x21, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xC4, 0xE, 0xE0, 0x9C, 0x3B, 0x23, 0xE0, 0x8, 0x3C, 0x83, 0xE0, 0xF, 0x0, 0xAA, 0xE8, 0x8, 0x60,
+0x56, 0xE2, 0xC4, 0xFF, 0xFF, 0x5A, 0x8, 0x60, 0x96, 0xE2, 0xA, 0x0, 0x0, 0xA, 0x7, 0x4B, 0x94, 0xE0, 0x9, 0x80, 0xA0, 0x21, 0xD1, 0x90, 0xF5, 0x21, 0x8, 0xB0, 0x49, 0xE0, 0x24, 0xCC, 0xA0, 0xE1, 0x9C,
+0xB, 0xB, 0xE0, 0x8, 0x4, 0x8B, 0xE0, 0xB2, 0x0, 0xCA, 0xE0, 0x1, 0x60, 0x56, 0xE2, 0xF5, 0xFF, 0xFF, 0x1A, 0xFF, 0xFF, 0xFF, 0xEA, 0x1, 0x50, 0x45, 0xE2, 0x24, 0x4B, 0xB0, 0xE1, 0x7, 0x40, 0x84, 0xE0,
+0x3, 0x0, 0xBD, 0xE8, 0x1, 0x10, 0x45, 0xE0, 0x0, 0x45, 0x84, 0xE0, 0x1, 0x45, 0x84, 0xE0, 0x20, 0x90, 0xBD, 0xE8, 0x0, 0x5C, 0x2D, 0xE9, 0x0, 0xA0, 0xA0, 0xE1, 0x80, 0x60, 0xA0, 0xE3, 0x0, 0x0, 0xA0,
+0xE3, 0x0, 0x10, 0xA0, 0xE3, 0x0, 0x20, 0xA0, 0xE3, 0x0, 0x30, 0xA0, 0xE3, 0xF, 0x0, 0xAA, 0xE8, 0xF, 0x0, 0xAA, 0xE8, 0xF, 0x0, 0xAA, 0xE8, 0xF, 0x0, 0xAA, 0xE8, 0x20, 0x60, 0x56, 0xE2, 0xF9, 0xFF, 0xFF,
+0x1A, 0x0, 0x9C, 0xBD, 0xE8, 0x0, 0x30, 0xA0, 0xE3, 0x0, 0x0, 0x52, 0xE1, 0x0, 0x20, 0xA0, 0x81, 0x1, 0x30, 0xA0, 0x83, 0x1, 0x0, 0x52, 0xE1, 0x1, 0x20, 0xA0, 0x81, 0x1, 0x0, 0x0, 0x8A, 0x0, 0x0, 0x53,
+0xE3, 0x4, 0x0, 0x0, 0xA, 0x2, 0x0, 0xA0, 0xE1, 0x0, 0x40, 0x2D, 0xE9, 0x11, 0x2, 0x0, 0xEB, 0x0, 0x40, 0xBD, 0xE8, 0x0, 0x0, 0x0, 0xEA, 0x6, 0x0, 0xA0, 0xE1, 0x0, 0x60, 0x46, 0xE0, 0x40, 0x0, 0x2D, 0xE9,
+0x0, 0x60, 0xA0, 0xE1, 0x1E, 0xFF, 0x2F, 0xE1, 0xA4, 0x31, 0x9F, 0xE5, 0x20, 0x16, 0xD3, 0xE7, 0x1, 0x28, 0x80, 0xE2, 0x22, 0x26, 0xD3, 0xE7, 0x5, 0x20, 0x82, 0xE2, 0x1, 0x14, 0xB0, 0xE1, 0x30, 0x2, 0x81,
+0xE1, 0x1E, 0xFF, 0x2F, 0xE1, 0x8C, 0xB1, 0x9F, 0xE5, 0x1, 0x80, 0xA0, 0xE3, 0x8, 0x0, 0x1A, 0xE1, 0x4D, 0x0, 0x0, 0xA, 0x0, 0x10, 0x9C, 0xE5, 0xFF, 0x64, 0xD1, 0xE3, 0x51, 0x0, 0x0, 0xA, 0x2, 0x64, 0x86,
+0xE2, 0x3, 0x10, 0xDC, 0xE5, 0x80, 0x0, 0x11, 0xE3, 0x80, 0x10, 0xC1, 0xE3, 0x3, 0x10, 0xCC, 0xE5, 0x2D, 0x0, 0x0, 0xA, 0x8, 0x40, 0xDC, 0xE5, 0x4, 0x9, 0xA0, 0xE1, 0x8, 0x0, 0x8C, 0xE5, 0xB6, 0x0, 0xDC,
+0xE1, 0x3, 0x10, 0xDC, 0xE5, 0x81, 0xC, 0x80, 0xE1, 0xC, 0x0, 0x8C, 0xE5, 0x1, 0x8, 0x58, 0xE3, 0x3B, 0x0, 0x0, 0x2A, 0x0, 0x0, 0x54, 0xE3, 0x4, 0x0, 0x0, 0xA, 0x8, 0x30, 0xD6, 0xE5, 0x1, 0x0, 0x53, 0xE3,
+0x0, 0x40, 0xA0, 0xC3, 0x84, 0x43, 0xA0, 0x1, 0x4, 0x43, 0xA0, 0x11, 0xC, 0x20, 0x96, 0xE5, 0x0, 0x0, 0x52, 0xE3, 0x10, 0x20, 0x86, 0x2, 0x4, 0x21, 0x82, 0xE0, 0x9, 0x30, 0xD6, 0xE5, 0x1, 0x0, 0x53, 0xE3,
+0x6, 0x0, 0x0, 0x1A, 0xB0, 0x30, 0xD6, 0xE1, 0x4, 0x30, 0x53, 0xE0, 0x3, 0x21, 0x82, 0x40, 0x0, 0x30, 0xA0, 0x43, 0x4, 0x40, 0x96, 0xE5, 0xC, 0x40, 0x8B, 0xE5, 0x5, 0x0, 0x0, 0xEA, 0x4, 0x50, 0x96, 0xE5,
+0x4, 0xE0, 0x55, 0xE0, 0x4, 0x21, 0x42, 0x40, 0x5, 0xE0, 0xA0, 0x41, 0x0, 0x30, 0xA0, 0xE3, 0xC, 0xE0, 0x8B, 0xE5, 0x4, 0x20, 0x8B, 0xE5, 0xBA, 0x30, 0xCB, 0xE1, 0xB8, 0x0, 0xD6, 0xE1, 0x20, 0x14, 0xA0,
+0xE1, 0xFF, 0x0, 0x0, 0xE2, 0x0, 0x11, 0x81, 0xE1, 0x81, 0x11, 0xA0, 0xE1, 0x80, 0x10, 0x81, 0xE2, 0x3, 0x10, 0xCB, 0xE5, 0x8, 0x0, 0x0, 0xEA, 0x1, 0x8, 0x58, 0xE3, 0x14, 0x0, 0x0, 0x2A, 0x98, 0x10, 0x9F,
+0xE5, 0x1, 0x10, 0x4B, 0xE0, 0x1, 0x13, 0x81, 0xE2, 0x1, 0x1B, 0x81, 0xE2, 0x3, 0x10, 0xD1, 0xE5, 0x80, 0x0, 0x11, 0xE3, 0x14, 0x0, 0x0, 0xA, 0x2, 0x7, 0xA0, 0xE3, 0xB4, 0x10, 0xDC, 0xE1, 0x0, 0x0, 0x51,
+0xE3, 0x0, 0x0, 0xA0, 0x3, 0x1, 0x0, 0x0, 0xA, 0x0, 0x0, 0x9, 0xEF, 0x0, 0x0, 0x60, 0xE2, 0xB8, 0x0, 0xCB, 0xE1, 0xBC, 0x0, 0xDC, 0xE1, 0xA9, 0xFF, 0xFF, 0xEB, 0xB0, 0x0, 0xCB, 0xE1, 0xBE, 0x20, 0xDC,
+0xE1, 0xA2, 0x24, 0xA0, 0xE1, 0x2, 0x20, 0xCB, 0xE5, 0x10, 0xB0, 0x8B, 0xE2, 0x10, 0xC0, 0x8C, 0xE2, 0x88, 0x80, 0xB0, 0xE1, 0x1B, 0x0, 0x0, 0xA, 0x8, 0x0, 0x1A, 0xE1, 0xAB, 0xFF, 0xFF, 0x1A, 0xF8, 0xFF,
+0xFF, 0xEA, 0x1, 0x8, 0x58, 0xE3, 0xF6, 0xFF, 0xFF, 0x2A, 0x0, 0x0, 0xA0, 0xE3, 0x0, 0x0, 0x8B, 0xE5, 0x0, 0x0, 0x8C, 0xE5, 0xF2, 0xFF, 0xFF, 0xEA, 0x8C, 0xF2, 0x7F, 0x3, 0xED, 0x15, 0x80, 0x3, 0x0, 0x4,
+0x0, 0x4, 0xAC, 0xE7, 0x7F, 0x3, 0x6C, 0xBB, 0x7F, 0x3, 0xAC, 0x15, 0x80, 0x3, 0xDC, 0xFA, 0x7F, 0x3, 0xBC, 0x0, 0x0, 0x4, 0x8C, 0x14, 0x80, 0x3, 0xEC, 0x15, 0x80, 0x3, 0x8C, 0xF4, 0x7F, 0x3, 0x3, 0x2,
+0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x2, 0x3, 0x3, 0x3, 0x3, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x48, 0x99, 0x9F, 0xE5, 0xB2, 0x90, 0xD9, 0xE1, 0x44,
+0x9, 0x9F, 0xE5, 0x44, 0x19, 0x9F, 0xE5, 0x4, 0x10, 0x80, 0xE5, 0x1, 0x0, 0x0, 0xEB, 0xF0, 0x4F, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x0, 0x40, 0x2D, 0xE9, 0x30, 0x9, 0x9F, 0xE5, 0x0, 0x10, 0xA0, 0xE3,
+0xA1, 0x24, 0xA0, 0xE1, 0xA1, 0x37, 0xA0, 0xE1, 0x21, 0x4F, 0xA0, 0xE1, 0x21, 0x51, 0xA0, 0xE1, 0x21, 0x66, 0xA0, 0xE1, 0xA1, 0x7A, 0xA0, 0xE1, 0xA1, 0x89, 0xA0, 0xE1, 0x7, 0x90, 0xA0, 0xE3, 0xFE, 0x1,
+0xA0, 0xE8, 0xFE, 0x1, 0xA0, 0xE8, 0x1, 0x90, 0x59, 0xE2, 0xFB, 0xFF, 0xFF, 0x1A, 0xFC, 0xC8, 0x9F, 0xE5, 0xE8, 0xB8, 0x9F, 0xE5, 0xB2, 0xB0, 0xDB, 0xE1, 0x0, 0x0, 0xA0, 0xE3, 0xC, 0x3, 0x8F, 0xE5, 0xAB,
+0xB0, 0xB0, 0xE1, 0x87, 0x0, 0x0, 0x3A, 0x0, 0xA0, 0x9C, 0xE5, 0xFF, 0xA4, 0xDA, 0xE3, 0x84, 0x0, 0x0, 0xA, 0x2, 0xA4, 0x8A, 0xE2, 0xBE, 0x0, 0xDC, 0xE1, 0xA0, 0x4, 0xA0, 0xE1, 0xBC, 0x10, 0xDC, 0xE1,
+0xA1, 0x12, 0xA0, 0xE1, 0x90, 0x1, 0x9, 0xE0, 0x29, 0x95, 0xA0, 0xE1, 0x80, 0x0, 0x60, 0xE2, 0x90, 0x1, 0x8, 0xE0, 0x28, 0x85, 0xB0, 0xE1, 0x9, 0x88, 0x98, 0xE1, 0xC8, 0x2, 0x9F, 0x15, 0x8, 0x0, 0x80,
+0x10, 0xC0, 0x2, 0x8F, 0x15, 0x70, 0x60, 0xA0, 0xE3, 0x94, 0x58, 0x9F, 0xE5, 0xB4, 0x70, 0xDC, 0xE1, 0x94, 0x8, 0x9F, 0xE5, 0x90, 0x7, 0x7, 0xE0, 0xA7, 0x77, 0xA0, 0xE1, 0x8, 0x40, 0x9C, 0xE5, 0x6, 0x0,
+0x9A, 0xE8, 0x2, 0x30, 0x81, 0xE0, 0x96, 0x7, 0x2, 0xE0, 0x8, 0x0, 0xDA, 0xE5, 0x0, 0xE0, 0xA0, 0xE3, 0x0, 0x0, 0x50, 0xE3, 0x35, 0x0, 0x0, 0xA, 0x1, 0x0, 0x50, 0xE3, 0xFF, 0xFF, 0xFF, 0xA, 0x2, 0x8,
+0x52, 0xE3, 0x2, 0x28, 0xA0, 0x83, 0x1, 0xE0, 0xA0, 0x83, 0x83, 0x5, 0x64, 0xE0, 0x0, 0x0, 0x52, 0xE1, 0x0, 0x20, 0xA0, 0x81, 0x1, 0x0, 0x0, 0x8A, 0x0, 0x0, 0x5E, 0xE3, 0x2, 0x0, 0x0, 0xA, 0x2, 0x0, 0xA0,
+0xE1, 0x46, 0x1, 0x0, 0xEB, 0x0, 0x0, 0x0, 0xEA, 0x6, 0x0, 0xA0, 0xE1, 0x0, 0x60, 0x46, 0xE0, 0x40, 0x0, 0x2D, 0xE9, 0x0, 0x60, 0xA0, 0xE1, 0x10, 0x8, 0x9F, 0xE5, 0xC, 0x10, 0x9A, 0xE5, 0x0, 0x0, 0x51,
+0xE3, 0x10, 0x10, 0x8A, 0x2, 0xA4, 0x14, 0x81, 0xE0, 0x3, 0x10, 0xC1, 0xE3, 0x0, 0x10, 0x80, 0xE5, 0x21, 0x13, 0xA0, 0xE3, 0x2, 0x2A, 0x82, 0xE2, 0xA2, 0x15, 0x81, 0xE0, 0x8, 0x10, 0x80, 0xE5, 0xD8, 0x0,
+0x0, 0xEB, 0x3, 0x0, 0x9A, 0xE8, 0x1, 0x30, 0x80, 0xE0, 0x83, 0x5, 0x54, 0xE1, 0xB, 0x0, 0x0, 0x3A, 0x9, 0x0, 0xDA, 0xE5, 0x1, 0x0, 0x50, 0xE3, 0x7, 0x0, 0x0, 0xA, 0x0, 0x40, 0xA0, 0xE3, 0x0, 0x40, 0x8C,
+0xE5, 0x40, 0x0, 0xBD, 0xE8, 0x0, 0x70, 0xA0, 0xE3, 0xB8, 0x17, 0x9F, 0xE5, 0x0, 0x40, 0x81, 0xE5, 0x77, 0x0, 0x0, 0xEB, 0x6, 0x0, 0x0, 0xEA, 0x81, 0x45, 0x44, 0xE0, 0x40, 0x0, 0xBD, 0xE8, 0x0, 0x0, 0x56,
+0xE3, 0x2, 0x0, 0x0, 0xA, 0x96, 0x7, 0x2, 0xE0, 0x0, 0xE0, 0xA0, 0xE3, 0xCD, 0xFF, 0xFF, 0xEA, 0x8, 0x40, 0x8C, 0xE5, 0x32, 0x0, 0x0, 0xEA, 0x1, 0x7, 0x52, 0xE3, 0x1, 0x27, 0xA0, 0x83, 0x1, 0xE0, 0xA0,
+0x83, 0x3, 0x6, 0x64, 0xE0, 0x0, 0x0, 0x52, 0xE1, 0x0, 0x20, 0xA0, 0x81, 0x1, 0x0, 0x0, 0x8A, 0x0, 0x0, 0x5E, 0xE3, 0x2, 0x0, 0x0, 0xA, 0x2, 0x0, 0xA0, 0xE1, 0x12, 0x1, 0x0, 0xEB, 0x0, 0x0, 0x0, 0xEA,
+0x6, 0x0, 0xA0, 0xE1, 0x0, 0x60, 0x46, 0xE0, 0x40, 0x0, 0x2D, 0xE9, 0x0, 0x60, 0xA0, 0xE1, 0x40, 0x7, 0x9F, 0xE5, 0xC, 0x10, 0x9A, 0xE5, 0x0, 0x0, 0x51, 0xE3, 0x10, 0x10, 0x8A, 0x2, 0x24, 0x15, 0x81,
+0xE0, 0x3, 0x10, 0xC1, 0xE3, 0x0, 0x10, 0x80, 0xE5, 0x21, 0x13, 0xA0, 0xE3, 0x2, 0x2A, 0x82, 0xE2, 0x22, 0x16, 0x81, 0xE0, 0x8, 0x10, 0x80, 0xE5, 0x51, 0x0, 0x0, 0xEB, 0x3, 0x0, 0x9A, 0xE8, 0x1, 0x30,
+0x80, 0xE0, 0x3, 0x6, 0x54, 0xE1, 0xB, 0x0, 0x0, 0x3A, 0x9, 0x0, 0xDA, 0xE5, 0x1, 0x0, 0x50, 0xE3, 0x7, 0x0, 0x0, 0xA, 0x0, 0x40, 0xA0, 0xE3, 0x0, 0x40, 0x8C, 0xE5, 0x40, 0x0, 0xBD, 0xE8, 0x0, 0x70, 0xA0,
+0xE3, 0xE8, 0x16, 0x9F, 0xE5, 0x0, 0x40, 0x81, 0xE5, 0x43, 0x0, 0x0, 0xEB, 0x6, 0x0, 0x0, 0xEA, 0x1, 0x46, 0x44, 0xE0, 0x40, 0x0, 0xBD, 0xE8, 0x0, 0x0, 0x56, 0xE3, 0x2, 0x0, 0x0, 0xA, 0x96, 0x7, 0x2,
+0xE0, 0x0, 0xE0, 0xA0, 0xE3, 0xCD, 0xFF, 0xFF, 0xEA, 0x8, 0x40, 0x8C, 0xE5, 0x10, 0xC0, 0x8C, 0xE2, 0xAB, 0xB0, 0xB0, 0xE1, 0x74, 0xFF, 0xFF, 0x2A, 0xFB, 0xFF, 0xFF, 0x1A, 0xAC, 0x16, 0x9F, 0xE5, 0xB4,
+0x36, 0x9F, 0xE5, 0xB4, 0x26, 0x9F, 0xE5, 0x0, 0x20, 0xD2, 0xE5, 0x0, 0x0, 0x52, 0xE3, 0xE0, 0x30, 0x83, 0x12, 0x7, 0x7D, 0xA0, 0xE3, 0x1, 0xA8, 0xA0, 0xE3, 0x1, 0xA0, 0x4A, 0xE2, 0x2, 0x69, 0x2A, 0xE2,
+0xA8, 0x40, 0x9F, 0xE5, 0x24, 0xE8, 0xA0, 0xE1, 0x8E, 0xE1, 0xA0, 0xE1, 0x4, 0x48, 0xA0, 0xE1, 0xA4, 0x46, 0xA0, 0xE1, 0x70, 0x0, 0xA0, 0xE3, 0x0, 0x3, 0xB1, 0xE8, 0x4, 0xB0, 0x48, 0xE0, 0xB, 0xB8, 0xA0,
+0xE1, 0x4B, 0xB6, 0xA0, 0xE1, 0x6, 0x0, 0x5B, 0xE1, 0x6, 0xB0, 0xA0, 0xC1, 0x6, 0x0, 0x7B, 0xE1, 0x0, 0xB0, 0x66, 0xB2, 0x28, 0xC8, 0x6E, 0xE0, 0xC, 0xC2, 0xA0, 0xE1, 0x6, 0x0, 0x5C, 0xE1, 0x6, 0xC0,
+0xA0, 0xC1, 0x6, 0x0, 0x7C, 0xE1, 0x0, 0xC0, 0x66, 0xB2, 0xB7, 0xC0, 0x83, 0xE1, 0xB2, 0xB0, 0xC3, 0xE0, 0x4, 0xB0, 0x49, 0xE0, 0xB, 0xB8, 0xA0, 0xE1, 0x4B, 0xB6, 0xA0, 0xE1, 0x6, 0x0, 0x5B, 0xE1, 0x6,
+0xB0, 0xA0, 0xC1, 0x6, 0x0, 0x7B, 0xE1, 0x0, 0xB0, 0x66, 0xB2, 0x29, 0xC8, 0x6E, 0xE0, 0xC, 0xC2, 0xA0, 0xE1, 0x6, 0x0, 0x5C, 0xE1, 0x6, 0xC0, 0xA0, 0xC1, 0x6, 0x0, 0x7C, 0xE1, 0x0, 0xC0, 0x66, 0xB2,
+0xB7, 0xC0, 0x83, 0xE1, 0xB2, 0xB0, 0xC3, 0xE0, 0x2, 0x0, 0x50, 0xE2, 0xDE, 0xFF, 0xFF, 0x1A, 0xF8, 0x15, 0x9F, 0xE5, 0x0, 0x20, 0xD1, 0xE5, 0x1, 0x20, 0x22, 0xE2, 0x0, 0x20, 0xC1, 0xE5, 0x0, 0x80, 0xBD,
+0xE8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5C, 0x2D, 0xE9, 0x0, 0x0, 0x58, 0xE3, 0x97, 0x6, 0x0, 0x0, 0x0, 0x40, 0x84, 0x0, 0x0, 0x9C, 0xBD, 0x8, 0xB8, 0xA5, 0x9F, 0xE5, 0x24, 0x5, 0xA0, 0xE1, 0x0, 0x45, 0x44,
+0xE0, 0x3, 0x10, 0x0, 0xE2, 0x1, 0xA0, 0x8A, 0xE0, 0x1, 0x0, 0x2D, 0xE9, 0x7, 0x60, 0x56, 0xE2, 0x2D, 0x0, 0x0, 0x4A, 0xF, 0x1A, 0x95, 0xE8, 0x24, 0xE5, 0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x80, 0xE0,
+0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E, 0x2, 0x80, 0xE0, 0x24, 0xE5, 0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x80, 0xE0, 0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E,
+0x12, 0x81, 0xE0, 0x24, 0xE5, 0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x80, 0xE0, 0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E, 0x22, 0x82, 0xE0, 0x24, 0xE5, 0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0,
+0x80, 0xE0, 0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E, 0x32, 0x83, 0xE0, 0x24, 0xE5, 0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x80, 0xE0, 0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE,
+0xE3, 0x2E, 0x92, 0x89, 0xE0, 0x24, 0xE5, 0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x80, 0xE0, 0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E, 0xB2, 0x8B, 0xE0, 0x24, 0xE5, 0xDA, 0xE7, 0x7, 0x40,
+0x84, 0xE0, 0x80, 0xE0, 0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E, 0xC2, 0x8C, 0xE0, 0xF, 0x1A, 0xA5, 0xE8, 0x7, 0x60, 0x56, 0xE2, 0xD1, 0xFF, 0xFF, 0x5A, 0x7, 0x60, 0x96, 0xE2, 0x12,
+0x0, 0x0, 0xA, 0x0, 0x0, 0x95, 0xE5, 0x24, 0xE5, 0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x80, 0xE0, 0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E, 0x2, 0x80, 0xE0, 0x4, 0x0, 0x85, 0xE4, 0x2,
+0x60, 0x56, 0xE2, 0x8, 0x0, 0x0, 0x4A, 0x0, 0x0, 0x95, 0xE5, 0x24, 0xE5, 0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x80, 0xE0, 0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E, 0x2, 0x80, 0xE0,
+0x4, 0x0, 0x85, 0xE4, 0xEC, 0xFF, 0xFF, 0x1A, 0x1, 0x0, 0xBD, 0xE8, 0x0, 0x45, 0x84, 0xE0, 0x0, 0x9C, 0xBD, 0xE8, 0x0, 0x5C, 0x2D, 0xE9, 0x0, 0x0, 0x58, 0xE3, 0x97, 0x6, 0x0, 0x0, 0x0, 0x0, 0x87, 0x0,
+0x0, 0x9C, 0xBD, 0x8, 0x6C, 0xA4, 0x9F, 0xE5, 0x24, 0x5, 0xA0, 0xE1, 0x0, 0x45, 0x44, 0xE0, 0x1, 0x10, 0x0, 0xE2, 0x81, 0xA0, 0x8A, 0xE0, 0x1, 0x0, 0x2D, 0xE9, 0x1, 0xA0, 0x8A, 0xE2, 0x7, 0x60, 0x56,
+0xE2, 0x34, 0x0, 0x0, 0x4A, 0xF, 0x1A, 0x95, 0xE8, 0x24, 0xE5, 0xA0, 0xE1, 0x8E, 0xE0, 0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x80, 0xE0, 0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E, 0x2,
+0x80, 0xE0, 0x24, 0xE5, 0xA0, 0xE1, 0x8E, 0xE0, 0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x80, 0xE0, 0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E, 0x12, 0x81, 0xE0, 0x24, 0xE5, 0xA0, 0xE1,
+0x8E, 0xE0, 0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x80, 0xE0, 0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E, 0x22, 0x82, 0xE0, 0x24, 0xE5, 0xA0, 0xE1, 0x8E, 0xE0, 0xDA, 0xE7, 0x7, 0x40, 0x84,
+0xE0, 0x80, 0xE0, 0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E, 0x32, 0x83, 0xE0, 0x24, 0xE5, 0xA0, 0xE1, 0x8E, 0xE0, 0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x80, 0xE0, 0x2E, 0xE2, 0x98,
+0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E, 0x92, 0x89, 0xE0, 0x24, 0xE5, 0xA0, 0xE1, 0x8E, 0xE0, 0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x80, 0xE0, 0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3,
+0x2E, 0xB2, 0x8B, 0xE0, 0x24, 0xE5, 0xA0, 0xE1, 0x8E, 0xE0, 0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x80, 0xE0, 0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E, 0xC2, 0x8C, 0xE0, 0xF, 0x1A, 0xA5,
+0xE8, 0x7, 0x60, 0x56, 0xE2, 0xCA, 0xFF, 0xFF, 0x5A, 0x7, 0x60, 0x96, 0xE2, 0x14, 0x0, 0x0, 0xA, 0x1, 0x0, 0x95, 0xE8, 0x24, 0xE5, 0xA0, 0xE1, 0x8E, 0xE0, 0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x80, 0xE0,
+0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E, 0x2, 0x80, 0xE0, 0x1, 0x0, 0xA5, 0xE8, 0x2, 0x60, 0x56, 0xE2, 0x9, 0x0, 0x0, 0x4A, 0x1, 0x0, 0x95, 0xE8, 0x24, 0xE5, 0xA0, 0xE1, 0x8E, 0xE0,
+0xDA, 0xE7, 0x7, 0x40, 0x84, 0xE0, 0x80, 0xE0, 0x2E, 0xE2, 0x98, 0xE, 0xE, 0xE0, 0xF, 0xE8, 0xCE, 0xE3, 0x2E, 0x2, 0x80, 0xE0, 0x1, 0x0, 0xA5, 0xE8, 0xEA, 0xFF, 0xFF, 0x1A, 0x1, 0x0, 0xBD, 0xE8, 0x0,
+0x45, 0x84, 0xE0, 0x0, 0x9C, 0xBD, 0xE8, 0x0, 0x30, 0xA0, 0xE3, 0x7, 0x5, 0x50, 0xE1, 0x1D, 0x0, 0x0, 0x3A, 0x87, 0x9, 0x50, 0xE1, 0x87, 0x9, 0x40, 0x20, 0x2, 0x37, 0x83, 0x22, 0x7, 0x9, 0x50, 0xE1, 0x7,
+0x9, 0x40, 0x20, 0x1, 0x37, 0x83, 0x22, 0x87, 0x8, 0x50, 0xE1, 0x87, 0x8, 0x40, 0x20, 0x2, 0x38, 0x83, 0x22, 0x7, 0x8, 0x50, 0xE1, 0x7, 0x8, 0x40, 0x20, 0x1, 0x38, 0x83, 0x22, 0x87, 0x7, 0x50, 0xE1, 0x87,
+0x7, 0x40, 0x20, 0x2, 0x39, 0x83, 0x22, 0x7, 0x7, 0x50, 0xE1, 0x7, 0x7, 0x40, 0x20, 0x1, 0x39, 0x83, 0x22, 0x87, 0x6, 0x50, 0xE1, 0x87, 0x6, 0x40, 0x20, 0x2, 0x3A, 0x83, 0x22, 0x7, 0x6, 0x50, 0xE1, 0x7,
+0x6, 0x40, 0x20, 0x1, 0x3A, 0x83, 0x22, 0x87, 0x5, 0x50, 0xE1, 0x87, 0x5, 0x40, 0x20, 0x2, 0x3B, 0x83, 0x22, 0x7, 0x5, 0x50, 0xE1, 0x7, 0x5, 0x40, 0x20, 0x1, 0x3B, 0x83, 0x22, 0x87, 0x4, 0x50, 0xE1, 0x87,
+0x4, 0x40, 0x20, 0x2, 0x3C, 0x83, 0x22, 0x7, 0x4, 0x50, 0xE1, 0x7, 0x4, 0x40, 0x20, 0x1, 0x3C, 0x83, 0x22, 0x87, 0x3, 0x50, 0xE1, 0x87, 0x3, 0x40, 0x20, 0x80, 0x30, 0x83, 0x22, 0x7, 0x3, 0x50, 0xE1, 0x7,
+0x3, 0x40, 0x20, 0x40, 0x30, 0x83, 0x22, 0x87, 0x2, 0x50, 0xE1, 0x87, 0x2, 0x40, 0x20, 0x20, 0x30, 0x83, 0x22, 0x7, 0x2, 0x50, 0xE1, 0x7, 0x2, 0x40, 0x20, 0x10, 0x30, 0x83, 0x22, 0x87, 0x1, 0x50, 0xE1,
+0x87, 0x1, 0x40, 0x20, 0x8, 0x30, 0x83, 0x22, 0x7, 0x1, 0x50, 0xE1, 0x7, 0x1, 0x40, 0x20, 0x4, 0x30, 0x83, 0x22, 0x87, 0x0, 0x50, 0xE1, 0x87, 0x0, 0x40, 0x20, 0x2, 0x30, 0x83, 0x22, 0x7, 0x0, 0x50, 0xE1,
+0x7, 0x0, 0x40, 0x20, 0x1, 0x30, 0x83, 0x22, 0x1, 0x0, 0x50, 0xE3, 0x0, 0x0, 0xA3, 0xE2, 0x1E, 0xFF, 0x2F, 0xE1, 0x10, 0x22, 0x50, 0x43, 0x87, 0x4A, 0x80, 0x18, 0x9F, 0x46, 0x7B, 0x46, 0xF8, 0xE7, 0x2,
+0x22, 0x12, 0x6, 0x89, 0x1A, 0x1, 0x60, 0xC2, 0x78, 0x80, 0x23, 0x1A, 0x43, 0xC2, 0x70, 0x70, 0x47, 0x7B, 0x46, 0xED, 0xE7, 0x2, 0x68, 0x12, 0x2, 0x12, 0xA, 0x7F, 0x4B, 0xD2, 0x18, 0x53, 0x89, 0x59, 0x43,
+0x89, 0xA, 0x7D, 0x4A, 0x91, 0x42, 0x0, 0xDB, 0x11, 0x1C, 0x81, 0x80, 0x70, 0x47, 0x7B, 0x46, 0xDD, 0xE7, 0x83, 0x88, 0x4B, 0x43, 0xFF, 0x33, 0xFF, 0x33, 0x9B, 0xA, 0x77, 0x4A, 0x93, 0x42, 0x0, 0xDB,
+0x13, 0x1C, 0x83, 0x80, 0x70, 0x47, 0x7B, 0x46, 0xD0, 0xE7, 0x0, 0x21, 0x1, 0x60, 0x70, 0x47, 0x7B, 0x46, 0xCB, 0xE7, 0x0, 0x68, 0x0, 0x2, 0x70, 0x47, 0x7B, 0x46, 0xC6, 0xE7, 0xC1, 0x80, 0x70, 0x47, 0x7B,
+0x46, 0xC2, 0xE7, 0x49, 0x8, 0xC2, 0x78, 0xD2, 0x9, 0xD2, 0x1, 0x11, 0x43, 0xC1, 0x70, 0x70, 0x47, 0x0, 0x20, 0x30, 0xB5, 0x1, 0xB4, 0x68, 0x4C, 0x25, 0x88, 0x0, 0x20, 0x20, 0x80, 0xC0, 0x46, 0xC0, 0x46,
+0xC0, 0x46, 0xC0, 0x46, 0x61, 0x48, 0x20, 0x21, 0x0, 0x23, 0x3, 0x60, 0x10, 0x30, 0x1, 0x39, 0xFB, 0xD1, 0x61, 0x48, 0x55, 0x49, 0x9, 0x88, 0x0, 0x22, 0x49, 0x8, 0x3, 0xD3, 0x2, 0x60, 0x42, 0x60, 0x82,
+0x60, 0xC2, 0x60, 0x10, 0x30, 0x49, 0x8, 0xF8, 0xD2, 0xFB, 0xD1, 0xFC, 0xF7, 0x10, 0xF9, 0x1, 0xBC, 0x5A, 0x49, 0xA, 0x68, 0x7F, 0x23, 0x1B, 0x2, 0x1A, 0x40, 0xA, 0x80, 0x50, 0x49, 0x57, 0x4A, 0x0, 0x23,
+0x8, 0xC1, 0x1, 0x3A, 0xFC, 0xD1, 0x56, 0x49, 0x8, 0x70, 0x1, 0x28, 0xD, 0xD0, 0x13, 0xDC, 0x0, 0xF0, 0x2F, 0xF8, 0x0, 0xF0, 0x21, 0xF8, 0x52, 0x48, 0xFC, 0xF7, 0x17, 0xFA, 0x52, 0x48, 0x52, 0x49, 0x1,
+0x60, 0x0, 0xF0, 0x13, 0xF8, 0xC, 0xE0, 0x0, 0xF0, 0x22, 0xF8, 0x0, 0xF0, 0x14, 0xF8, 0x0, 0xF0, 0x27, 0xF8, 0x5, 0xE0, 0x0, 0xF0, 0xF, 0xF8, 0x0, 0xF0, 0x46, 0xF8, 0x0, 0xF0, 0x5, 0xF8, 0x42, 0x4C, 0x25,
+0x80, 0x30, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0x42, 0x49, 0xA, 0x68, 0x47, 0x4B, 0x1A, 0x43, 0xA, 0x60, 0x70, 0x47, 0x3E, 0x48, 0x31, 0x49, 0x9, 0x88, 0x0, 0x22, 0x49, 0x8, 0x0, 0xD3, 0x2, 0x60, 0x10, 0x30,
+0x49, 0x8, 0xFB, 0xD2, 0xFB, 0xD1, 0x70, 0x47, 0x0, 0xB5, 0x3F, 0x48, 0x2B, 0x49, 0xA, 0x68, 0x82, 0x43, 0xC0, 0x20, 0x2, 0x43, 0xA, 0x60, 0x0, 0xBD, 0xF0, 0xB5, 0x38, 0x4F, 0x0, 0x21, 0x39, 0x60, 0x35,
+0x48, 0xFC, 0xF7, 0xDD, 0xF9, 0x30, 0x48, 0x23, 0x49, 0x9, 0x88, 0x37, 0x4A, 0x28, 0x4B, 0x37, 0x4C, 0x80, 0x25, 0x80, 0x26, 0xB6, 0x0, 0x49, 0x8, 0x1, 0xD3, 0x3C, 0xC0, 0x10, 0x38, 0x9B, 0x19, 0x10,
+0x30, 0x49, 0x8, 0xF9, 0xD2, 0xFA, 0xD1, 0x22, 0x4C, 0x1, 0x25, 0x25, 0x70, 0x2B, 0x4C, 0xFF, 0xF7, 0xC6, 0xFF, 0x2F, 0x48, 0x1, 0x38, 0xFD, 0xD1, 0x3C, 0x60, 0xF0, 0xBD, 0x30, 0xB5, 0x26, 0x48, 0x2C,
+0x49, 0x1, 0x22, 0x1A, 0x4B, 0x1A, 0x70, 0x0, 0x22, 0xA, 0x60, 0xA, 0x61, 0x4A, 0x81, 0x4A, 0x83, 0x16, 0x4A, 0x4A, 0x60, 0x28, 0x4A, 0x4A, 0x61, 0x28, 0x4A, 0xA, 0x81, 0xA, 0x83, 0x70, 0x22, 0xCA, 0x60,
+0xCA, 0x61, 0x26, 0x4A, 0x26, 0x4B, 0xB, 0x61, 0xA, 0x60, 0x20, 0x4A, 0x1, 0x3A, 0xFD, 0xD1, 0x0, 0x21, 0x41, 0x80, 0x23, 0x49, 0x1, 0x60, 0x23, 0x48, 0xFC, 0xF7, 0x9D, 0xF9, 0x4, 0x48, 0x1, 0x68, 0xC0,
+0x22, 0x91, 0x43, 0x16, 0x4A, 0x11, 0x43, 0x1, 0x60, 0x30, 0xBD, 0x0, 0x0, 0xAC, 0xE7, 0x7F, 0x3, 0xBC, 0x0, 0x0, 0x4, 0xCC, 0xF9, 0x7F, 0x3, 0xC, 0xF8, 0x7F, 0x3, 0x8C, 0xF3, 0x7F, 0x3, 0x3C, 0xC0, 0x0,
+0x0, 0x8C, 0xF4, 0x7F, 0x3, 0xEC, 0x15, 0x80, 0x3, 0x8C, 0xF2, 0x7F, 0x3, 0x0, 0x0, 0x0, 0x2, 0xFF, 0x1F, 0x0, 0x0, 0x8, 0x2, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x5, 0x0, 0x4, 0x58, 0x8, 0x0, 0x0, 0xED,
+0x15, 0x80, 0x3, 0x0, 0xA0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4, 0x80, 0xFF, 0xC3, 0x0, 0x64, 0x80, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0xA8, 0x0, 0xFE, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x60, 0x4, 0x0,
+0x4, 0x4C, 0xF6, 0x7F, 0x3, 0x0, 0xFD, 0xFF, 0xFF, 0x7F, 0x0, 0x0, 0xA8, 0x7F, 0x0, 0x7F, 0xA8, 0x60, 0xFD, 0xC2, 0x0, 0xC2, 0x79, 0x0, 0x0, 0x93, 0x48, 0x1, 0x78, 0x0, 0x29, 0x0, 0xD0, 0x70, 0x47, 0x1,
+0x21, 0x1, 0x70, 0x0, 0xB5, 0xA, 0x20, 0xFB, 0xF7, 0x22, 0xFF, 0x0, 0xF0, 0x11, 0xF8, 0x8, 0xBC, 0x18, 0x47, 0x8C, 0x48, 0x1, 0x78, 0x0, 0x29, 0x0, 0xD1, 0x70, 0x47, 0x0, 0x21, 0x1, 0x70, 0x0, 0xB5, 0x0,
+0xF0, 0x5, 0xF8, 0xA, 0x20, 0xFB, 0xF7, 0x52, 0xFF, 0x8, 0xBC, 0x18, 0x47, 0x85, 0x48, 0x0, 0x22, 0x85, 0x4B, 0x0, 0x24, 0x85, 0x49, 0x1D, 0xC1, 0x10, 0x31, 0x1D, 0xC1, 0x0, 0x20, 0x84, 0x49, 0xA, 0x80,
+0x8, 0x31, 0x5, 0xC1, 0x5, 0xC1, 0x82, 0x49, 0xA, 0x80, 0x82, 0x49, 0xA, 0x80, 0x70, 0x47, 0x7B, 0x49, 0x9, 0x78, 0x0, 0x29, 0x0, 0xD1, 0x70, 0x47, 0x30, 0xB5, 0x1F, 0xC8, 0x1F, 0xB4, 0x6C, 0x46, 0x25,
+0x88, 0xA8, 0x9, 0x17, 0xD3, 0x20, 0x1C, 0x77, 0x49, 0x0, 0xF0, 0x64, 0xF8, 0x28, 0xA, 0x3, 0xD3, 0xA0, 0x7B, 0x80, 0x21, 0x9, 0x1A, 0xA1, 0x73, 0x74, 0x49, 0x68, 0x8, 0x1, 0xD3, 0x60, 0x68, 0x88, 0x60,
+0xA8, 0x8, 0x1, 0xD3, 0xA0, 0x68, 0x88, 0x81, 0x60, 0x68, 0x21, 0x89, 0x89, 0x0, 0x40, 0x18, 0x60, 0x60, 0xE8, 0x9, 0xC, 0xD3, 0x20, 0x1C, 0x6E, 0x49, 0x0, 0xF0, 0x4A, 0xF8, 0x6A, 0x49, 0x68, 0x8, 0x1,
+0xD3, 0x60, 0x68, 0x8, 0x61, 0xA8, 0x8, 0x1, 0xD3, 0xA0, 0x68, 0x88, 0x82, 0x64, 0x49, 0x65, 0x4A, 0xE8, 0xA, 0x5, 0xD3, 0x10, 0x78, 0x8, 0x23, 0x18, 0x43, 0x10, 0x70, 0x8, 0x20, 0xC8, 0x70, 0x28, 0xB,
+0x5, 0xD3, 0x10, 0x78, 0x8, 0x23, 0x98, 0x43, 0x10, 0x70, 0x28, 0x20, 0xC8, 0x70, 0x20, 0x31, 0x68, 0xB, 0x5, 0xD3, 0x50, 0x78, 0x8, 0x23, 0x18, 0x43, 0x50, 0x70, 0x8, 0x20, 0xC8, 0x70, 0xA8, 0xB, 0x5,
+0xD3, 0x50, 0x78, 0x8, 0x23, 0x98, 0x43, 0x50, 0x70, 0x28, 0x20, 0xC8, 0x70, 0x0, 0x23, 0x55, 0x4A, 0x1, 0x21, 0x68, 0xA, 0x1, 0xD3, 0x11, 0x70, 0x1, 0x23, 0xA8, 0xA, 0x1, 0xD3, 0x51, 0x70, 0x1, 0x23,
+0x0, 0x21, 0xE8, 0xB, 0x1, 0xD3, 0x11, 0x70, 0x1, 0x23, 0x28, 0xC, 0x1, 0xD3, 0x51, 0x70, 0x1, 0x23, 0x0, 0x2B, 0x1, 0xD0, 0x0, 0xF0, 0x26, 0xF8, 0x49, 0x48, 0x5, 0x80, 0x5, 0xB0, 0x30, 0xBC, 0x8, 0xBC,
+0x18, 0x47, 0x70, 0xB5, 0x2, 0x88, 0x52, 0x8, 0x1, 0xD3, 0x43, 0x68, 0x4B, 0x60, 0x52, 0x8, 0x1, 0xD3, 0x3, 0x89, 0x8B, 0x81, 0x52, 0x8, 0x2, 0xD3, 0x43, 0x89, 0x5B, 0x42, 0xB, 0x81, 0x52, 0x8, 0x9, 0xD3,
+0x83, 0x89, 0x40, 0x4C, 0xDD, 0x9, 0x66, 0x5D, 0x36, 0x2, 0x10, 0x35, 0x65, 0x5D, 0xEB, 0x40, 0x33, 0x43, 0xB, 0x80, 0x52, 0x8, 0x1, 0xD3, 0x83, 0x7B, 0x8B, 0x70, 0x70, 0xBD, 0x3A, 0x48, 0x0, 0x78, 0x0,
+0x28, 0x0, 0xD1, 0x70, 0x47, 0x38, 0x48, 0x0, 0x88, 0xF, 0x21, 0x9, 0x2, 0x88, 0x43, 0x32, 0x49, 0xA, 0x78, 0x0, 0x2A, 0x2, 0xD0, 0x1, 0x21, 0x9, 0x2, 0x8, 0x43, 0xA, 0x78, 0x0, 0x2A, 0x2, 0xD0, 0x2,
+0x21, 0x89, 0x2, 0x8, 0x43, 0x2F, 0x49, 0x8, 0x80, 0x70, 0x47, 0x10, 0xB5, 0x1, 0xB4, 0x0, 0xF0, 0x20, 0xF8, 0x1, 0xBC, 0x25, 0x4A, 0x24, 0x4B, 0x1, 0xB4, 0x40, 0x8, 0x6, 0xD3, 0x80, 0x21, 0x10, 0x78,
+0x8, 0x43, 0x10, 0x70, 0xD8, 0x78, 0x8, 0x43, 0xD8, 0x70, 0x1, 0xBC, 0x20, 0x33, 0x80, 0x8, 0x6, 0xD3, 0x80, 0x21, 0x50, 0x78, 0x8, 0x43, 0x50, 0x70, 0xD8, 0x78, 0x8, 0x43, 0xD8, 0x70, 0x1F, 0x48, 0x1,
+0x21, 0x1, 0x70, 0xFF, 0xF7, 0xC5, 0xFF, 0x10, 0xBC, 0x8, 0xBC, 0x18, 0x47, 0x30, 0xB4, 0x15, 0x4A, 0x14, 0x4B, 0x1A, 0x4C, 0x24, 0x88, 0x80, 0x21, 0x40, 0x8, 0x8, 0xD3, 0xDD, 0x78, 0x8D, 0x43, 0xDD,
+0x70, 0x15, 0x78, 0x8D, 0x43, 0x15, 0x70, 0x3, 0x25, 0x2D, 0x2, 0xAC, 0x43, 0x20, 0x33, 0x40, 0x8, 0x8, 0xD3, 0xDD, 0x78, 0x8D, 0x43, 0xDD, 0x70, 0x55, 0x78, 0x8D, 0x43, 0x55, 0x70, 0x3, 0x25, 0xAD, 0x2,
+0xAC, 0x43, 0xD, 0x48, 0x4, 0x80, 0xB, 0x48, 0x0, 0x21, 0x1, 0x70, 0x30, 0xBC, 0x70, 0x47, 0x0, 0x0, 0xF4, 0x15, 0x80, 0x3, 0x7F, 0x0, 0x40, 0x28, 0x0, 0xFE, 0x0, 0x0, 0x10, 0x4, 0x0, 0x4, 0x8, 0x5, 0x0,
+0x4, 0xF0, 0x15, 0x80, 0x3, 0xF2, 0x15, 0x80, 0x3, 0x30, 0x4, 0x0, 0x4, 0x6C, 0xBB, 0x7F, 0x3, 0xF5, 0x15, 0x80, 0x3, 0x0, 0x5, 0x0, 0x4, 0x70, 0xB5, 0xF2, 0x4E, 0x4, 0x1C, 0x30, 0x7F, 0x0, 0x28, 0x2,
+0xD0, 0x70, 0xBC, 0x8, 0xBC, 0x18, 0x47, 0x71, 0x60, 0xB2, 0x60, 0x1, 0x20, 0x30, 0x77, 0x20, 0x7C, 0xEC, 0x4D, 0x80, 0x0, 0x2D, 0x18, 0x35, 0x60, 0x0, 0x20, 0x28, 0x60, 0x21, 0x7C, 0x8, 0x20, 0x88, 0x40,
+0xE9, 0x49, 0x1, 0xF0, 0x28, 0xFD, 0x21, 0x7C, 0x8, 0x20, 0x88, 0x40, 0x1, 0xF0, 0x95, 0xFD, 0xE6, 0x48, 0x21, 0x68, 0x9, 0xDF, 0x40, 0x8, 0x40, 0x0, 0x70, 0x82, 0x60, 0x68, 0x0, 0x9, 0x0, 0x1, 0xF0,
+0x82, 0x21, 0x7B, 0x71, 0x77, 0x49, 0x8, 0x0, 0xD3, 0x40, 0x0, 0x0, 0x29, 0x4, 0xD0, 0x1, 0x29, 0x1, 0xD1, 0x40, 0x0, 0x0, 0xE0, 0x40, 0x8, 0x81, 0x8, 0x31, 0x83, 0x30, 0x8B, 0x71, 0x68, 0x0, 0x22, 0x4,
+0xC1, 0x1, 0x38, 0xFC, 0xD1, 0xA0, 0x68, 0xF0, 0x60, 0x0, 0x20, 0x30, 0x82, 0x70, 0x83, 0x20, 0x7D, 0xC0, 0x43, 0xB0, 0x77, 0x70, 0x8A, 0xF1, 0x8A, 0x48, 0x43, 0xC0, 0xA, 0xB0, 0x82, 0x0, 0x20, 0xD1,
+0x49, 0x8, 0x80, 0xF0, 0x8A, 0x10, 0x38, 0x0, 0xF0, 0x51, 0xF8, 0x70, 0x68, 0x71, 0x8A, 0x49, 0x8, 0xF2, 0x8A, 0x73, 0x7F, 0x0, 0xF0, 0x32, 0xF9, 0xB0, 0x7F, 0x0, 0x28, 0x2, 0xD1, 0x83, 0x20, 0x0, 0x4,
+0x6, 0xE0, 0xC3, 0x20, 0x0, 0x4, 0xB1, 0x8A, 0x49, 0x42, 0x9, 0x4, 0x9, 0xC, 0x8, 0x43, 0x28, 0x60, 0x70, 0xBC, 0x8, 0xBC, 0x18, 0x47, 0x70, 0xB5, 0xBD, 0x4C, 0x20, 0x7F, 0x0, 0x28, 0x2, 0xD1, 0x70, 0xBC,
+0x8, 0xBC, 0x18, 0x47, 0xA0, 0x7F, 0x0, 0x28, 0x9, 0xD1, 0x20, 0x68, 0x0, 0x88, 0xBB, 0x4A, 0x11, 0x88, 0x10, 0x80, 0x40, 0x1A, 0x3, 0xD5, 0xBA, 0x49, 0x40, 0x18, 0x0, 0xE0, 0xA0, 0x8A, 0x80, 0x2, 0x21,
+0x8A, 0x40, 0x18, 0x61, 0x8A, 0x9, 0xDF, 0x3, 0x22, 0x2, 0x40, 0x63, 0x8A, 0x5A, 0x43, 0x89, 0x18, 0x21, 0x82, 0x80, 0x8, 0x80, 0x0, 0x5, 0x1C, 0x28, 0x1C, 0xE1, 0x8A, 0x88, 0x42, 0x0, 0xDD, 0x8, 0x1C,
+0x2D, 0x1A, 0xA1, 0x68, 0x62, 0x7F, 0xE3, 0x68, 0x1, 0xB4, 0x1, 0xF0, 0x37, 0xFE, 0x1, 0xBC, 0xAB, 0x49, 0x1, 0xF0, 0x2F, 0xFE, 0x0, 0x2D, 0xED, 0xD1, 0x70, 0xBC, 0x8, 0xBC, 0x18, 0x47, 0x70, 0xB5, 0xA1,
+0x4C, 0xE4, 0xE7, 0x0, 0x0, 0xF0, 0x4F, 0x2D, 0xE9, 0x74, 0x42, 0x9F, 0xE5, 0x0, 0x50, 0xA0, 0xE1, 0x8, 0x60, 0x94, 0xE5, 0xB6, 0x81, 0xD4, 0xE1, 0xBA, 0x91, 0xD4, 0xE1, 0x9, 0x10, 0xA0, 0xE1, 0x9, 0x20,
+0x48, 0xE0, 0x5, 0x0, 0xA0, 0xE1, 0x2, 0x0, 0x55, 0xE1, 0x2, 0x0, 0xA0, 0xA1, 0x0, 0x90, 0xA0, 0xA3, 0x0, 0x90, 0x89, 0xB0, 0x0, 0x50, 0x45, 0xE0, 0x4, 0x30, 0x94, 0xE5, 0x1D, 0x70, 0xD4, 0xE5, 0x0, 0x0,
+0x50, 0xE3, 0x50, 0x0, 0x0, 0xA, 0x1, 0x0, 0x57, 0xE3, 0x1A, 0x0, 0x0, 0xBA, 0x1F, 0x0, 0x0, 0xA, 0x3, 0x0, 0x57, 0xE3, 0x31, 0x0, 0x0, 0xBA, 0x36, 0x0, 0x0, 0xA, 0x5, 0x0, 0x57, 0xE3, 0x6, 0x0, 0x0,
+0xA, 0xA1, 0x30, 0x83, 0xE0, 0xB, 0xB0, 0xA0, 0xE1, 0xB2, 0x10, 0xD6, 0xE0, 0x4, 0x0, 0x50, 0xE2, 0xB2, 0x10, 0xC3, 0xE0, 0xFB, 0xFF, 0xFF, 0x1A, 0x41, 0x0, 0x0, 0xEA, 0xA1, 0x30, 0x83, 0xE0, 0xC, 0x72,
+0x9F, 0xE5, 0xA8, 0x80, 0xA0, 0xE1, 0x4, 0x10, 0x96, 0xE4, 0x4, 0x0, 0x50, 0xE2, 0x21, 0xA4, 0x7, 0xE0, 0x2A, 0xA4, 0x8A, 0xE1, 0xB8, 0xA0, 0x83, 0xE1, 0x1, 0xA0, 0x7, 0xE0, 0x2A, 0xA4, 0x8A, 0xE1, 0xB2,
+0xA0, 0xC3, 0xE0, 0xF6, 0xFF, 0xFF, 0x1A, 0x88, 0x80, 0xA0, 0xE1, 0x33, 0x0, 0x0, 0xEA, 0x1, 0x30, 0x83, 0xE0, 0x4, 0x10, 0x96, 0xE4, 0x4, 0x0, 0x50, 0xE2, 0x4, 0x10, 0x83, 0xE4, 0xFB, 0xFF, 0xFF, 0x1A,
+0x2D, 0x0, 0x0, 0xEA, 0x1, 0x30, 0x83, 0xE0, 0xC0, 0x71, 0x9F, 0xE5, 0x6, 0x0, 0xB6, 0xE8, 0x1, 0xA4, 0x7, 0xE0, 0xA, 0xA4, 0x8A, 0xE1, 0x2, 0xB4, 0x7, 0xE0, 0xB, 0xB4, 0x8B, 0xE1, 0xFF, 0xBC, 0xCB, 0xE3,
+0x2A, 0xC8, 0x8B, 0xE1, 0x1, 0xA0, 0x7, 0xE0, 0xA, 0xA4, 0x8A, 0xE1, 0x2, 0xB0, 0x7, 0xE0, 0xB, 0xB4, 0x8B, 0xE1, 0xFF, 0xBC, 0xCB, 0xE3, 0x2A, 0xB8, 0x8B, 0xE1, 0x8, 0xB0, 0x83, 0xE7, 0x4, 0xC0, 0x83,
+0xE4, 0x4, 0x0, 0x50, 0xE2, 0xEE, 0xFF, 0xFF, 0x1A, 0x19, 0x0, 0x0, 0xEA, 0x81, 0x30, 0x83, 0xE0, 0x6, 0x0, 0xB6, 0xE8, 0x4, 0x0, 0x50, 0xE2, 0x6, 0x0, 0xA3, 0xE8, 0xFB, 0xFF, 0xFF, 0x1A, 0x13, 0x0, 0x0,
+0xEA, 0x81, 0x30, 0x83, 0xE0, 0x86, 0x4, 0xB6, 0xE8, 0x21, 0xB8, 0xA0, 0xE1, 0x22, 0xC8, 0xA0, 0xE1, 0xC, 0xB8, 0x8B, 0xE1, 0x88, 0xB0, 0x83, 0xE7, 0x1, 0xB8, 0xA0, 0xE1, 0x2, 0xC8, 0xA0, 0xE1, 0x2B,
+0xC8, 0x8C, 0xE1, 0x4, 0xC0, 0x83, 0xE4, 0x27, 0xB8, 0xA0, 0xE1, 0x2A, 0xC8, 0xA0, 0xE1, 0xC, 0xB8, 0x8B, 0xE1, 0x88, 0xB0, 0x83, 0xE7, 0x7, 0xB8, 0xA0, 0xE1, 0xA, 0xC8, 0xA0, 0xE1, 0x2B, 0xC8, 0x8C,
+0xE1, 0x4, 0xC0, 0x83, 0xE4, 0x4, 0x0, 0x50, 0xE2, 0xEC, 0xFF, 0xFF, 0x1A, 0x0, 0x0, 0x55, 0xE3, 0xA0, 0xFF, 0xFF, 0x1A, 0xBA, 0x91, 0xC4, 0xE1, 0xF0, 0x4F, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x0, 0xB5,
+0x37, 0x4B, 0x18, 0x7F, 0x0, 0x28, 0xC, 0xD0, 0x0, 0x20, 0x18, 0x77, 0x98, 0x77, 0x19, 0x68, 0x34, 0x48, 0x9, 0x1A, 0x89, 0x8, 0x8, 0x20, 0x88, 0x40, 0x1, 0xF0, 0x5A, 0xFC, 0x0, 0xF0, 0x4D, 0xF8, 0x8,
+0xBC, 0x18, 0x47, 0xF0, 0xB5, 0x2D, 0x4C, 0x60, 0x60, 0x61, 0x82, 0xE2, 0x82, 0x63, 0x77, 0x10, 0x20, 0x5B, 0x8, 0x0, 0xD3, 0x30, 0x20, 0xFB, 0xF7, 0x59, 0xFC, 0x30, 0x48, 0x0, 0x21, 0x1, 0x60, 0xA1,
+0x60, 0x65, 0x68, 0x45, 0x60, 0x66, 0x8A, 0x76, 0x42, 0x6, 0x81, 0x61, 0x7F, 0x4A, 0x8, 0x1, 0x2A, 0xE7, 0x8A, 0x4, 0xD0, 0x1, 0xDB, 0xFF, 0x8, 0x2, 0xE0, 0xBF, 0x8, 0x0, 0xE0, 0x7F, 0x8, 0xC7, 0x60,
+0x27, 0x83, 0x26, 0x4A, 0x2, 0x60, 0x49, 0x8, 0xD, 0xD3, 0x79, 0x0, 0x21, 0x83, 0x7F, 0x22, 0x2, 0x60, 0x0, 0x21, 0x1, 0x61, 0x81, 0x61, 0xB9, 0x0, 0x6D, 0x18, 0x45, 0x61, 0x6, 0x83, 0xC7, 0x61, 0x1F,
+0x4A, 0x2, 0x61, 0xFB, 0xF7, 0x7A, 0xFC, 0x1B, 0x48, 0x88, 0x21, 0x62, 0x7F, 0x53, 0x8, 0x5B, 0x1, 0x19, 0x43, 0xC1, 0x70, 0x52, 0x8, 0x0, 0xD3, 0xC1, 0x74, 0x60, 0x68, 0x21, 0x8B, 0x89, 0x0, 0x1, 0x39,
+0x0, 0x22, 0x42, 0x54, 0xFB, 0xF7, 0x76, 0xFC, 0xF0, 0xBC, 0x8, 0xBC, 0x18, 0x47, 0x30, 0xB5, 0xFB, 0xF7, 0x62, 0xFC, 0xF, 0x49, 0x0, 0x22, 0x5, 0x48, 0x60, 0x7F, 0x40, 0x8, 0x0, 0xD3, 0xA, 0x61, 0xA,
+0x60, 0x30, 0x20, 0xFB, 0xF7, 0x4D, 0xFC, 0x30, 0xBC, 0x8, 0xBC, 0x18, 0x47, 0xFC, 0x15, 0x80, 0x3, 0x0, 0x1, 0x0, 0x4, 0xA7, 0xC8, 0x7F, 0x3, 0x0, 0x0, 0x0, 0x2, 0xF8, 0x15, 0x80, 0x3, 0x0, 0x0, 0x1,
+0x0, 0x20, 0xC9, 0x7F, 0x3, 0xFF, 0x0, 0xFF, 0x0, 0x0, 0xFF, 0x0, 0xFF, 0x40, 0x4, 0x0, 0x4, 0x7F, 0x0, 0x40, 0x0, 0x7F, 0x0, 0x7F, 0x0, 0x0, 0x20, 0x10, 0x21, 0xB1, 0x4A, 0x10, 0x80, 0x2, 0x32, 0x1,
+0x39, 0xFB, 0xD1, 0xB0, 0x4A, 0x10, 0x60, 0x70, 0x47, 0xAE, 0x48, 0x0, 0x68, 0x1, 0x21, 0x40, 0x8, 0x1, 0xD3, 0x1, 0x31, 0xFB, 0xE7, 0x11, 0x29, 0x0, 0xD1, 0x0, 0x21, 0x8, 0x1C, 0x70, 0x47, 0x0, 0xB5,
+0x1, 0x21, 0x89, 0x2, 0xA8, 0x4A, 0x7, 0xB4, 0x68, 0x46, 0x0, 0xF0, 0x3, 0xF8, 0x3, 0xB0, 0x8, 0xBC, 0x18, 0x47, 0x70, 0xB5, 0x4, 0x1C, 0xE5, 0x88, 0xFF, 0x2D, 0x1, 0xD1, 0x0, 0x25, 0x19, 0xE0, 0x0, 0x2D,
+0xB, 0xD0, 0x29, 0x6, 0xC9, 0xD, 0x2, 0x39, 0x9C, 0x48, 0x40, 0x5C, 0x0, 0x28, 0x10, 0xD0, 0x28, 0x1C, 0x0, 0xF0, 0xA1, 0xF8, 0x0, 0x28, 0xB, 0xD1, 0xFF, 0xF7, 0xD2, 0xFF, 0x5, 0x1C, 0x7, 0xD0, 0x98,
+0x48, 0x1, 0x78, 0x1, 0x31, 0x1, 0x70, 0x9, 0x2, 0xD, 0x43, 0x2D, 0x4, 0x2D, 0xC, 0x95, 0x49, 0xFB, 0xF7, 0xA6, 0xFB, 0xFF, 0x28, 0x47, 0xDA, 0x6, 0x1C, 0x0, 0x2D, 0xF, 0xD0, 0x8D, 0x49, 0x6A, 0x1E, 0x12,
+0x6, 0x12, 0xE, 0x1, 0x23, 0x93, 0x40, 0x52, 0x0, 0x89, 0x18, 0x42, 0x1C, 0xA, 0x70, 0x2A, 0xA, 0x4A, 0x70, 0x88, 0x49, 0xA, 0x68, 0x1A, 0x43, 0xB, 0x60, 0x8A, 0x49, 0x9, 0x68, 0x1C, 0x22, 0x42, 0x43,
+0x89, 0x18, 0xC8, 0x22, 0xA, 0x74, 0x0, 0x2D, 0x1, 0xD1, 0x2, 0x22, 0x0, 0xE0, 0x4, 0x22, 0x4A, 0x74, 0x80, 0x22, 0xCA, 0x75, 0x84, 0x49, 0x10, 0x22, 0x42, 0x43, 0x8B, 0x18, 0x21, 0x68, 0x8, 0xC, 0x8,
+0xD1, 0x81, 0x48, 0x0, 0x68, 0x89, 0x0, 0x41, 0x58, 0x9, 0x2, 0x9, 0xA, 0x8, 0x31, 0x7F, 0x48, 0x9, 0x18, 0x19, 0x60, 0xA0, 0x88, 0x49, 0x89, 0x41, 0x43, 0x89, 0xA, 0x99, 0x80, 0x0, 0x21, 0x99, 0x60,
+0x61, 0x7A, 0x49, 0x8, 0x80, 0x31, 0xD9, 0x70, 0x21, 0x7A, 0x78, 0x48, 0x0, 0x68, 0x41, 0x43, 0x8A, 0x8, 0xDA, 0x80, 0x28, 0x1C, 0x70, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x0, 0x20, 0x70, 0xBC, 0x2, 0xBC, 0x8,
+0x47, 0x1, 0x6, 0xC9, 0xD, 0x0, 0x29, 0xB, 0xD0, 0x20, 0x29, 0x9, 0xDC, 0x70, 0x4A, 0x53, 0x5A, 0x19, 0xA, 0x2, 0xA, 0x91, 0x42, 0x3, 0xD1, 0x1B, 0x6, 0x1B, 0xE, 0x1, 0x3B, 0x70, 0x47, 0x0, 0x23, 0xDB,
+0x43, 0x70, 0x47, 0x0, 0x21, 0x5F, 0x4A, 0x40, 0x0, 0x11, 0x52, 0x1, 0x21, 0x40, 0x8, 0x81, 0x40, 0x5D, 0x4A, 0x10, 0x68, 0x88, 0x43, 0x10, 0x60, 0x70, 0x47, 0x2, 0xB5, 0xDB, 0x46, 0xFF, 0xF7, 0xDD, 0xFF,
+0x2, 0xBC, 0x6, 0xD4, 0x5F, 0x48, 0x0, 0x68, 0x41, 0x43, 0x89, 0x8, 0x18, 0x1C, 0xFF, 0xF7, 0xFC, 0xFA, 0x1, 0xBC, 0x0, 0x47, 0x2, 0xB5, 0xFF, 0xF7, 0xCF, 0xFF, 0x2, 0xBC, 0x2, 0xD4, 0x18, 0x1C, 0xFF,
+0xF7, 0xF6, 0xFA, 0x1, 0xBC, 0x0, 0x47, 0x2, 0xB5, 0xFF, 0xF7, 0xC5, 0xFF, 0x2, 0xBC, 0x2, 0xD4, 0x18, 0x1C, 0xFF, 0xF7, 0xC1, 0xFA, 0x1, 0xBC, 0x0, 0x47, 0x1, 0xB5, 0xFF, 0xF7, 0xBB, 0xFF, 0x1, 0xBC,
+0x14, 0xD4, 0x1C, 0x21, 0x59, 0x43, 0x49, 0x4A, 0x12, 0x68, 0x52, 0x18, 0x2, 0x21, 0x51, 0x74, 0x0, 0x21, 0x11, 0x74, 0x0, 0x6, 0x0, 0xE, 0x1, 0x38, 0xFF, 0xF7, 0xBE, 0xFF, 0x0, 0x21, 0x18, 0x1C, 0xFF,
+0xF7, 0xCF, 0xFA, 0x1, 0x20, 0x2, 0xBC, 0x8, 0x47, 0x0, 0x20, 0x2, 0xBC, 0x8, 0x47, 0x1, 0xB5, 0xFF, 0xF7, 0x9E, 0xFF, 0x1, 0xBC, 0xB, 0xD4, 0x1C, 0x21, 0x59, 0x43, 0x3B, 0x4A, 0x12, 0x68, 0x52, 0x18,
+0x2, 0x21, 0x51, 0x74, 0x0, 0x6, 0x0, 0xE, 0x1, 0x38, 0xFF, 0xF7, 0xA3, 0xFF, 0x1, 0xBC, 0x0, 0x47, 0x2, 0xB5, 0xFF, 0xF7, 0x8B, 0xFF, 0x2, 0xBC, 0x2, 0xD4, 0x18, 0x1C, 0xFF, 0xF7, 0x97, 0xFA, 0x1, 0xBC,
+0x0, 0x47, 0x81, 0xA, 0x1, 0xD0, 0x1, 0x20, 0x80, 0x2, 0x32, 0x49, 0x8, 0x60, 0x70, 0x47, 0xF0, 0xB5, 0x28, 0x4C, 0x24, 0x68, 0x26, 0x4E, 0x0, 0x25, 0x64, 0x8, 0xF, 0xD3, 0x77, 0x5D, 0x1, 0x3F, 0xC, 0xD4,
+0x38, 0x1C, 0x0, 0x21, 0xFF, 0xF7, 0x97, 0xFA, 0x25, 0x48, 0x0, 0x68, 0x1C, 0x21, 0x79, 0x43, 0x40, 0x18, 0x2, 0x21, 0x41, 0x74, 0x0, 0x21, 0x1, 0x74, 0x2, 0x35, 0x64, 0x8, 0xEC, 0xD2, 0xFB, 0xD1, 0xFF,
+0xF7, 0xCD, 0xFE, 0xF0, 0xBC, 0x8, 0xBC, 0x18, 0x47, 0x70, 0xB5, 0x18, 0x4C, 0x24, 0x68, 0x16, 0x4E, 0x0, 0x25, 0x64, 0x8, 0x12, 0xD3, 0x70, 0x5D, 0x1, 0x38, 0xF, 0xD4, 0x18, 0x49, 0x10, 0x22, 0x42, 0x43,
+0x89, 0x18, 0xA, 0x68, 0x12, 0x2, 0x8, 0xD1, 0x14, 0x49, 0x9, 0x68, 0x1C, 0x22, 0x42, 0x43, 0x89, 0x18, 0x0, 0x20, 0x48, 0x74, 0xC8, 0x75, 0x70, 0x55, 0x2, 0x35, 0x64, 0x8, 0xE9, 0xD2, 0x2, 0x35, 0x64,
+0x8, 0xE6, 0xD2, 0xF8, 0xD1, 0x0, 0x24, 0x1, 0x25, 0x2D, 0x4, 0x5, 0x4E, 0x30, 0x78, 0x2, 0x36, 0x0, 0x28, 0x0, 0xD0, 0x2C, 0x43, 0x6D, 0x0, 0xF8, 0xD1, 0x24, 0xC, 0x2, 0x48, 0x4, 0x60, 0x70, 0xBD, 0x20,
+0x16, 0x80, 0x3, 0x40, 0x16, 0x80, 0x3, 0xFF, 0x80, 0x0, 0x0, 0x44, 0x16, 0x80, 0x3, 0xC4, 0xA0, 0x7F, 0x3, 0xD0, 0xF0, 0x7F, 0x3, 0x8C, 0xF2, 0x7F, 0x3, 0xA8, 0xE7, 0x7F, 0x3, 0x0, 0x0, 0x0, 0x2, 0x1C,
+0x16, 0x80, 0x3, 0x1E, 0x16, 0x80, 0x3, 0x10, 0xB5, 0xC, 0x1C, 0x10, 0x49, 0x80, 0x22, 0xB, 0x88, 0x13, 0x42, 0xFC, 0xD1, 0xF, 0x4B, 0xF, 0x4A, 0xB, 0x80, 0x3, 0x4, 0x1B, 0xC, 0xB, 0x48, 0x13, 0x80, 0x80,
+0x22, 0x3, 0x88, 0x13, 0x42, 0xFC, 0xD1, 0xB, 0x4B, 0xA, 0x4A, 0x3, 0x80, 0x23, 0x4, 0x1B, 0xC, 0x6, 0x49, 0x13, 0x80, 0x80, 0x22, 0xB, 0x88, 0x13, 0x42, 0xFC, 0xD1, 0x5, 0x4B, 0x18, 0x88, 0xFF, 0x23,
+0x18, 0x40, 0x10, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xC0, 0x1, 0x0, 0x4, 0x2, 0x88, 0xFF, 0xFF, 0xC2, 0x1, 0x0, 0x4, 0x2, 0x80, 0xFF, 0xFF, 0xF0, 0xB5, 0x23, 0x4C, 0x15, 0x1C, 0x80, 0x22, 0x23, 0x88, 0x13,
+0x42, 0xFC, 0xD1, 0x21, 0x4B, 0x23, 0x80, 0x21, 0x4B, 0x3, 0x22, 0x1E, 0x4C, 0x1A, 0x80, 0x80, 0x22, 0x23, 0x88, 0x13, 0x42, 0xFC, 0xD1, 0x1D, 0x4A, 0x3, 0x2, 0x1B, 0xE, 0x19, 0x4C, 0x13, 0x80, 0x80,
+0x22, 0x23, 0x88, 0x13, 0x42, 0xFC, 0xD1, 0x18, 0x4A, 0x3, 0x4, 0x1B, 0xE, 0x15, 0x4C, 0x13, 0x80, 0x80, 0x22, 0x23, 0x88, 0x13, 0x42, 0xFC, 0xD1, 0xFF, 0x23, 0x2, 0x1C, 0x1A, 0x40, 0x12, 0x4B, 0x10,
+0x48, 0x1A, 0x80, 0x80, 0x22, 0x3, 0x88, 0x13, 0x42, 0xFC, 0xD1, 0x6A, 0x1E, 0x12, 0xD3, 0xC, 0x1C, 0xD, 0x4D, 0xB, 0x49, 0xD, 0x4F, 0x0, 0x26, 0x80, 0x20, 0x2E, 0x80, 0x0, 0x2A, 0x0, 0xD1, 0xF, 0x80,
+0xB, 0x88, 0x3, 0x42, 0xFC, 0xD1, 0x2B, 0x88, 0x23, 0x70, 0x1, 0x3A, 0x1, 0xD3, 0x1, 0x34, 0xF2, 0xE7, 0x2, 0x4B, 0x0, 0x22, 0x1A, 0x80, 0xF0, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0xC0, 0x1, 0x0, 0x4, 0x0, 0x89,
+0xFF, 0xFF, 0xC2, 0x1, 0x0, 0x4, 0x0, 0x81, 0xFF, 0xFF, 0x1, 0x4B, 0x18, 0x68, 0x70, 0x47, 0x0, 0x0, 0x58, 0x16, 0x80, 0x3, 0x0, 0xB5, 0x4, 0x4B, 0x1B, 0x68, 0x0, 0x20, 0x1, 0x33, 0x1, 0xD0, 0x2, 0xBC,
+0x8, 0x47, 0x1, 0x20, 0xFB, 0xE7, 0xA8, 0x1F, 0x80, 0x3, 0x0, 0xB5, 0x8, 0x49, 0x8, 0x68, 0x43, 0x1C, 0x6, 0xD0, 0x7, 0x4A, 0xC3, 0x0, 0x9A, 0x5A, 0x6, 0x4B, 0xA, 0x60, 0x9A, 0x42, 0x1, 0xD0, 0x2, 0xBC,
+0x8, 0x47, 0x1, 0x23, 0x5B, 0x42, 0xB, 0x60, 0xF9, 0xE7, 0x1C, 0x1F, 0x80, 0x3, 0x9C, 0x16, 0x80, 0x3, 0xFF, 0xFF, 0x0, 0x0, 0x10, 0xB5, 0x4, 0x1C, 0xFF, 0x28, 0x5, 0xD8, 0x4, 0x4A, 0x5, 0x48, 0x13, 0x88,
+0xE1, 0x0, 0xB, 0x50, 0x14, 0x60, 0x10, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0x0, 0x0, 0x1C, 0x1F, 0x80, 0x3, 0x9C, 0x16, 0x80, 0x3, 0x0, 0xB5, 0xB, 0x4A, 0x13, 0x68, 0x81, 0xB0, 0x0, 0x2B, 0xB, 0xDD, 0x1, 0x3B,
+0x13, 0x60, 0x0, 0x2B, 0x7, 0xD1, 0x7, 0x4B, 0x1A, 0x68, 0x1, 0x2A, 0x6, 0xD0, 0xC0, 0x20, 0xC0, 0x2, 0x1, 0xF0, 0x70, 0xF9, 0x1, 0xB0, 0x1, 0xBC, 0x0, 0x47, 0x3, 0x4B, 0x1A, 0x80, 0xF9, 0xE7, 0x4C, 0x16,
+0x80, 0x3, 0x54, 0x16, 0x80, 0x3, 0x8, 0x2, 0x0, 0x4, 0x10, 0xB5, 0xA, 0x4C, 0x22, 0x68, 0x0, 0x2A, 0x7, 0xD1, 0x9, 0x4B, 0x1B, 0x68, 0x1, 0x2B, 0x9, 0xD0, 0xC0, 0x20, 0xC0, 0x2, 0x1, 0xF0, 0x83, 0xF9,
+0x23, 0x68, 0x1, 0x33, 0x23, 0x60, 0x10, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0x3, 0x4B, 0x1A, 0x80, 0xF6, 0xE7, 0x4C, 0x16, 0x80, 0x3, 0x54, 0x16, 0x80, 0x3, 0x8, 0x2, 0x0, 0x4, 0x10, 0xB5, 0x4, 0x1C, 0xFF, 0xF7,
+0xE0, 0xFF, 0x14, 0x4B, 0x1B, 0x68, 0x5A, 0x1C, 0x20, 0xD0, 0x1, 0x3C, 0x0, 0x2C, 0x13, 0xDD, 0x12, 0x48, 0xDB, 0x0, 0x1A, 0x58, 0x11, 0x49, 0x13, 0x1C, 0xB, 0x40, 0x8B, 0x42, 0x8, 0xD1, 0xA, 0xE0, 0x13,
+0x1C, 0xB, 0x40, 0xDB, 0x0, 0x1A, 0x58, 0x13, 0x1C, 0xB, 0x40, 0x8B, 0x42, 0x2, 0xD0, 0x1, 0x3C, 0x0, 0x2C, 0xF4, 0xD1, 0xFF, 0xF7, 0xA5, 0xFF, 0x0, 0x20, 0x0, 0x2C, 0x2, 0xDD, 0x10, 0xBC, 0x2, 0xBC,
+0x8, 0x47, 0x1, 0x20, 0xFA, 0xE7, 0xFF, 0xF7, 0x9B, 0xFF, 0x0, 0x20, 0xF6, 0xE7, 0x0, 0x0, 0x1C, 0x1F, 0x80, 0x3, 0x9C, 0x16, 0x80, 0x3, 0xFF, 0xFF, 0x0, 0x0, 0xF0, 0xB5, 0x81, 0xB0, 0x7, 0x1C, 0xFF,
+0xF7, 0xAB, 0xFF, 0xFF, 0xF7, 0x61, 0xFF, 0x5, 0x1C, 0x43, 0x1C, 0x24, 0xD0, 0x14, 0x4E, 0x34, 0x68, 0x63, 0x1C, 0x16, 0xD0, 0x13, 0x48, 0x14, 0x4A, 0xEB, 0x0, 0x1A, 0x50, 0x1B, 0x18, 0x5F, 0x60, 0x12,
+0x4B, 0xE4, 0x0, 0x29, 0x1C, 0x19, 0x40, 0x11, 0x4A, 0x23, 0x58, 0x13, 0x40, 0x19, 0x43, 0x21, 0x50, 0x35, 0x60, 0xFF, 0xF7, 0x72, 0xFF, 0x1, 0x20, 0x1, 0xB0, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x8, 0x49,
+0x8, 0x4A, 0xC3, 0x0, 0x5A, 0x50, 0x5B, 0x18, 0x5F, 0x60, 0x9, 0x4B, 0x30, 0x60, 0x18, 0x60, 0xEE, 0xE7, 0xFF, 0xF7, 0x61, 0xFF, 0x0, 0x20, 0xED, 0xE7, 0x0, 0x0, 0x60, 0x1F, 0x80, 0x3, 0x9C, 0x16, 0x80,
+0x3, 0xFF, 0xFF, 0x0, 0x10, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0xA8, 0x1F, 0x80, 0x3, 0x70, 0xB5, 0xFF, 0xF7, 0x6D, 0xFF, 0x10, 0x4C, 0x20, 0x68, 0x43, 0x1C, 0x18, 0xD0, 0xF, 0x4B, 0xF, 0x4D,
+0xC2, 0x0, 0xD2, 0x18, 0x2B, 0x68, 0x56, 0x68, 0x98, 0x42, 0x9, 0xD0, 0x13, 0x88, 0x23, 0x60, 0xFF, 0xF7, 0x2D, 0xFF, 0xFF, 0xF7, 0x3D, 0xFF, 0x30, 0x1C, 0x70, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xFF, 0xF7,
+0x25, 0xFF, 0x1, 0x23, 0x5B, 0x42, 0x2B, 0x60, 0x23, 0x60, 0xF2, 0xE7, 0xFF, 0xF7, 0x30, 0xFF, 0x0, 0x26, 0xF0, 0xE7, 0xA8, 0x1F, 0x80, 0x3, 0x9C, 0x16, 0x80, 0x3, 0x60, 0x1F, 0x80, 0x3, 0x30, 0xB5, 0x15,
+0x4D, 0x1, 0x23, 0x81, 0xB0, 0x2B, 0x60, 0xFF, 0xF7, 0xEB, 0xFE, 0x0, 0x28, 0x8, 0xD0, 0x12, 0x4A, 0x0, 0x23, 0x13, 0x60, 0x0, 0x23, 0x1, 0xB0, 0x2B, 0x60, 0x30, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0xE, 0x4B,
+0xD, 0x4C, 0x1B, 0x88, 0x20, 0x60, 0x9A, 0x7, 0xF3, 0xD4, 0xFF, 0xF7, 0xD8, 0xFE, 0x0, 0x28, 0xEF, 0xD1, 0xFF, 0xF7, 0xB8, 0xFF, 0x9, 0x4B, 0x18, 0x60, 0x1, 0x23, 0x23, 0x60, 0x6, 0x4B, 0x1B, 0x88, 0x9A,
+0x7, 0xE5, 0xD4, 0xFF, 0xF7, 0xCA, 0xFE, 0x0, 0x28, 0xF1, 0xD0, 0xE0, 0xE7, 0x0, 0x0, 0x4C, 0x16, 0x80, 0x3, 0x50, 0x16, 0x80, 0x3, 0x84, 0x1, 0x0, 0x4, 0x88, 0x1, 0x0, 0x4, 0xF0, 0xB5, 0x81, 0xB0, 0x7,
+0x1C, 0xFF, 0xF7, 0xD, 0xFF, 0xFF, 0xF7, 0xC3, 0xFE, 0x5, 0x1C, 0x43, 0x1C, 0x24, 0xD0, 0x14, 0x4E, 0x34, 0x68, 0x63, 0x1C, 0x16, 0xD0, 0x13, 0x48, 0x14, 0x4A, 0xEB, 0x0, 0x1A, 0x50, 0x1B, 0x18, 0x5F,
+0x60, 0x12, 0x4B, 0xE4, 0x0, 0x29, 0x1C, 0x19, 0x40, 0x11, 0x4A, 0x23, 0x58, 0x13, 0x40, 0x19, 0x43, 0x21, 0x50, 0x35, 0x60, 0xFF, 0xF7, 0xD4, 0xFE, 0x1, 0x20, 0x1, 0xB0, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47,
+0x8, 0x49, 0x8, 0x4A, 0xC3, 0x0, 0x5A, 0x50, 0x5B, 0x18, 0x5F, 0x60, 0x9, 0x4B, 0x30, 0x60, 0x18, 0x60, 0xEE, 0xE7, 0xFF, 0xF7, 0xC3, 0xFE, 0x0, 0x20, 0xED, 0xE7, 0x0, 0x0, 0x2C, 0x20, 0x80, 0x3, 0x9C,
+0x16, 0x80, 0x3, 0xFF, 0xFF, 0x0, 0x20, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0x64, 0x1F, 0x80, 0x3, 0x10, 0xB5, 0xFF, 0xF7, 0xCF, 0xFE, 0x11, 0x4B, 0x1B, 0x68, 0x5A, 0x1C, 0x17, 0xD0, 0x10, 0x48,
+0xDB, 0x0, 0x1A, 0x58, 0xF, 0x49, 0x13, 0x1C, 0xB, 0x40, 0x8B, 0x42, 0x13, 0xD0, 0x1, 0x24, 0x13, 0x1C, 0xB, 0x40, 0xDB, 0x0, 0x1A, 0x58, 0x13, 0x1C, 0xB, 0x40, 0x1, 0x34, 0x8B, 0x42, 0xF6, 0xD1, 0xFF,
+0xF7, 0x99, 0xFE, 0x20, 0x1C, 0x10, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xFF, 0xF7, 0x93, 0xFE, 0x0, 0x24, 0xF7, 0xE7, 0x1, 0x24, 0xF3, 0xE7, 0x0, 0x0, 0x64, 0x1F, 0x80, 0x3, 0x9C, 0x16, 0x80, 0x3, 0xFF, 0xFF,
+0x0, 0x0, 0x70, 0xB5, 0xFF, 0xF7, 0xA3, 0xFE, 0x10, 0x4C, 0x20, 0x68, 0x43, 0x1C, 0x18, 0xD0, 0xF, 0x4B, 0xF, 0x4D, 0xC2, 0x0, 0xD2, 0x18, 0x2B, 0x68, 0x56, 0x68, 0x98, 0x42, 0x9, 0xD0, 0x13, 0x88, 0x23,
+0x60, 0xFF, 0xF7, 0x63, 0xFE, 0xFF, 0xF7, 0x73, 0xFE, 0x30, 0x1C, 0x70, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xFF, 0xF7, 0x5B, 0xFE, 0x1, 0x23, 0x5B, 0x42, 0x2B, 0x60, 0x23, 0x60, 0xF2, 0xE7, 0xFF, 0xF7, 0x66,
+0xFE, 0x0, 0x26, 0xF0, 0xE7, 0x64, 0x1F, 0x80, 0x3, 0x9C, 0x16, 0x80, 0x3, 0x2C, 0x20, 0x80, 0x3, 0x10, 0xB5, 0xFF, 0xF7, 0x79, 0xFE, 0x9, 0x4B, 0x1B, 0x68, 0x5A, 0x1C, 0x9, 0xD0, 0x8, 0x4A, 0xDB, 0x0,
+0x9B, 0x18, 0x5C, 0x68, 0xFF, 0xF7, 0x51, 0xFE, 0x20, 0x1C, 0x10, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xFF, 0xF7, 0x4B, 0xFE, 0x0, 0x24, 0xF7, 0xE7, 0x0, 0x0, 0x64, 0x1F, 0x80, 0x3, 0x9C, 0x16, 0x80, 0x3, 0x10,
+0xB5, 0xFF, 0xF7, 0x5F, 0xFE, 0xD, 0x4C, 0x23, 0x68, 0x0, 0x2B, 0x4, 0xD0, 0xFF, 0xF7, 0x3B, 0xFE, 0x10, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0xFF, 0xF7, 0x0, 0xFE, 0x0, 0x28, 0xF6, 0xD1, 0x7, 0x4B, 0x1B, 0x88,
+0x1, 0x22, 0x13, 0x42, 0x1, 0xD1, 0x22, 0x60, 0xEF, 0xE7, 0x22, 0x60, 0xFF, 0xF7, 0xD8, 0xFE, 0x3, 0x4B, 0x18, 0x60, 0xE9, 0xE7, 0x0, 0x0, 0x50, 0x16, 0x80, 0x3, 0x84, 0x1, 0x0, 0x4, 0x88, 0x1, 0x0, 0x4,
+0x70, 0xB5, 0x6, 0x1C, 0xD, 0x1C, 0x14, 0x1C, 0x0, 0x29, 0x1, 0xDD, 0x0, 0x2A, 0x1, 0xD0, 0x20, 0x2D, 0x3, 0xD9, 0x0, 0x20, 0x70, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xFF, 0xF7, 0x2E, 0xFE, 0x68, 0x1C, 0xFF,
+0xF7, 0x47, 0xFE, 0x0, 0x28, 0x3, 0xD1, 0xFF, 0xF7, 0x9, 0xFE, 0x0, 0x20, 0xF1, 0xE7, 0x30, 0x1C, 0xFF, 0xF7, 0x72, 0xFE, 0x0, 0x2D, 0x7, 0xDD, 0x26, 0x1C, 0x0, 0x24, 0x1, 0xCE, 0x1, 0x34, 0xFF, 0xF7,
+0x6A, 0xFE, 0xA5, 0x42, 0xF9, 0xD1, 0xFF, 0xF7, 0xB4, 0xFF, 0xFF, 0xF7, 0xF6, 0xFD, 0x1, 0x20, 0xDE, 0xE7, 0x0, 0xB5, 0x81, 0xB0, 0xF, 0x28, 0xC, 0xD8, 0x1F, 0x29, 0xA, 0xD8, 0x0, 0x29, 0x1, 0xDD, 0x0,
+0x2A, 0x6, 0xD0, 0x5, 0x4B, 0x0, 0x7, 0xB, 0x40, 0x18, 0x43, 0xFF, 0xF7, 0xC4, 0xFF, 0x0, 0xE0, 0x0, 0x20, 0x1, 0xB0, 0x2, 0xBC, 0x8, 0x47, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0xB5, 0x83, 0xB0, 0x2,
+0x1C, 0xF, 0x28, 0x1B, 0xD8, 0xF, 0x4B, 0x19, 0x42, 0xB, 0xD0, 0xC0, 0x23, 0x0, 0x7, 0xDB, 0x4, 0x1, 0x91, 0x18, 0x43, 0x1, 0x21, 0x1, 0xAA, 0xFF, 0xF7, 0xAB, 0xFF, 0x3, 0xB0, 0x2, 0xBC, 0x8, 0x47, 0x8,
+0x4B, 0x8, 0x1C, 0x18, 0x40, 0x80, 0x23, 0xDB, 0x4, 0x12, 0x7, 0x1A, 0x43, 0x10, 0x43, 0x0, 0x21, 0x0, 0x22, 0xFF, 0xF7, 0x9C, 0xFF, 0xEF, 0xE7, 0x0, 0x20, 0xED, 0xE7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFE, 0xFF,
+0xFF, 0xFF, 0x1, 0x10, 0xB5, 0x4, 0x1C, 0xF, 0x28, 0x6, 0xD8, 0xB, 0x4B, 0xA, 0x1C, 0x1A, 0x40, 0x80, 0x23, 0x9B, 0x4, 0x9A, 0x42, 0x3, 0xD0, 0x0, 0x20, 0x10, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x7, 0x4B, 0x8,
+0x1C, 0x18, 0x40, 0x80, 0x23, 0x22, 0x7, 0x1B, 0x5, 0x1A, 0x43, 0x10, 0x43, 0x0, 0x21, 0x0, 0x22, 0xFF, 0xF7, 0x79, 0xFF, 0xEF, 0xE7, 0x0, 0x0, 0xC0, 0xFF, 0xFF, 0xFF, 0x3F, 0x0, 0x10, 0xB5, 0xFF, 0xF7,
+0xAF, 0xFD, 0xE, 0x4B, 0x1B, 0x68, 0x5A, 0x1C, 0x6, 0xD1, 0xFF, 0xF7, 0x8B, 0xFD, 0x80, 0x20, 0x40, 0x0, 0x10, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x9, 0x49, 0x1, 0x24, 0x0, 0xE0, 0x13, 0x1C, 0xDB, 0x0, 0x5A,
+0x5A, 0x7, 0x4B, 0x9A, 0x42, 0x2, 0xD0, 0x1, 0x34, 0x0, 0x2C, 0xF6, 0xDC, 0xFF, 0xF7, 0x78, 0xFD, 0x80, 0x23, 0x5B, 0x0, 0x18, 0x1B, 0xEA, 0xE7, 0x1C, 0x1F, 0x80, 0x3, 0x9C, 0x16, 0x80, 0x3, 0xFF, 0xFF,
+0x0, 0x0, 0xF0, 0xB5, 0x5F, 0x46, 0x56, 0x46, 0x4D, 0x46, 0x44, 0x46, 0xF0, 0xB4, 0x81, 0xB0, 0x4, 0x1C, 0xF, 0x1C, 0x91, 0x46, 0xF, 0x28, 0x33, 0xD8, 0x0, 0x29, 0x2F, 0xDC, 0xFF, 0xF7, 0x7C, 0xFD, 0x4A,
+0x48, 0xA4, 0x0, 0x84, 0x46, 0x21, 0x1C, 0x61, 0x44, 0xD, 0x68, 0xA2, 0x46, 0x6A, 0x1C, 0x16, 0xD0, 0x47, 0x4B, 0x9D, 0x42, 0x13, 0xD0, 0x46, 0x4E, 0xEB, 0x0, 0x99, 0x59, 0xB, 0xF, 0x6C, 0x0, 0x5, 0x2B,
+0x7, 0xD1, 0x7C, 0xE0, 0xD3, 0x0, 0x99, 0x59, 0xB, 0xF, 0x54, 0x0, 0x5, 0x2B, 0x19, 0xD0, 0x15, 0x1C, 0x3E, 0x4B, 0xA, 0x1C, 0x1A, 0x40, 0x9A, 0x42, 0xF3, 0xD1, 0xFF, 0xF7, 0x3C, 0xFD, 0x0, 0x22, 0x90,
+0x46, 0x40, 0x46, 0x1, 0xB0, 0x3C, 0xBC, 0x90, 0x46, 0x99, 0x46, 0xA2, 0x46, 0xAB, 0x46, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x0, 0x2A, 0xCD, 0xD1, 0x1, 0x23, 0x58, 0x42, 0x80, 0x46, 0xEF, 0xE7, 0xAB, 0x46,
+0x15, 0x1C, 0xB, 0x1, 0x19, 0xD, 0xB8, 0x46, 0x88, 0x45, 0x3E, 0xDC, 0x1, 0x29, 0x51, 0xDD, 0x2D, 0x48, 0x2F, 0x1C, 0x1, 0x22, 0xFB, 0x0, 0x9B, 0x59, 0x1, 0x32, 0x1F, 0x1C, 0x7, 0x40, 0x91, 0x42, 0xF8,
+0xD1, 0x7C, 0x0, 0x59, 0x46, 0x1, 0x31, 0x30, 0xD0, 0x59, 0x46, 0xC8, 0x0, 0x83, 0x59, 0xA4, 0x0, 0x26, 0x4A, 0xA1, 0x5B, 0x13, 0x40, 0x19, 0x43, 0x81, 0x51, 0x21, 0x4A, 0xA3, 0x5B, 0x93, 0x42, 0x31,
+0xD0, 0x43, 0x46, 0x0, 0x2B, 0xC, 0xDD, 0x48, 0x46, 0x2B, 0x1C, 0x0, 0x21, 0x14, 0x1C, 0xDB, 0x0, 0x9B, 0x19, 0x5A, 0x68, 0x4, 0xC0, 0x1B, 0x68, 0x1, 0x31, 0x23, 0x40, 0x88, 0x45, 0xF6, 0xD1, 0x78, 0x1C,
+0xC, 0xD0, 0x16, 0x49, 0x8A, 0x46, 0x0, 0xE0, 0x25, 0x1C, 0xEB, 0x0, 0x9B, 0x59, 0x54, 0x46, 0x28, 0x1C, 0x1C, 0x40, 0xFF, 0xF7, 0xD7, 0xFC, 0xBD, 0x42, 0xF5, 0xD1, 0xFF, 0xF7, 0xE5, 0xFC, 0xA9, 0xE7,
+0x88, 0x46, 0xBE, 0xE7, 0xA4, 0x0, 0xA2, 0x5B, 0x53, 0x46, 0x63, 0x44, 0x1A, 0x60, 0xB, 0x4B, 0x9A, 0x42, 0xCF, 0xD1, 0x1, 0x23, 0x50, 0x46, 0x5B, 0x42, 0x60, 0x44, 0x3, 0x60, 0xC9, 0xE7, 0x9, 0x4B, 0x59,
+0x46, 0x50, 0x46, 0xC1, 0x50, 0xC8, 0xE7, 0x2F, 0x1C, 0xB6, 0xE7, 0x1, 0x23, 0x58, 0x42, 0x83, 0x46, 0xA0, 0xE7, 0x0, 0x0, 0x68, 0x1F, 0x80, 0x3, 0xFF, 0xFF, 0x0, 0x0, 0x9C, 0x16, 0x80, 0x3, 0x0, 0x0,
+0xFF, 0xFF, 0xEC, 0x1F, 0x80, 0x3, 0xF0, 0xB5, 0x5F, 0x46, 0x56, 0x46, 0x4D, 0x46, 0x44, 0x46, 0xF0, 0xB4, 0xD0, 0x48, 0x8B, 0xB0, 0x1, 0x23, 0xD0, 0x49, 0x4, 0x90, 0x3, 0x60, 0xCF, 0x4F, 0xD0, 0x4E,
+0x88, 0x46, 0xD0, 0x4B, 0x1B, 0x88, 0xD8, 0x5, 0x26, 0xD4, 0xCF, 0x4A, 0x80, 0x23, 0xDB, 0x2, 0x13, 0x60, 0x82, 0x23, 0xDB, 0x4, 0x1D, 0x68, 0xFF, 0xF7, 0x78, 0xFC, 0x4, 0x1C, 0x42, 0x1C, 0x0, 0xD1, 0xE3,
+0xE0, 0xC9, 0x4A, 0xC3, 0x0, 0xB9, 0x46, 0x30, 0x68, 0xDA, 0x51, 0x4B, 0x44, 0x5D, 0x60, 0x43, 0x1C, 0x0, 0xD1, 0xDE, 0xE0, 0xC5, 0x4B, 0xC0, 0x0, 0x4A, 0x46, 0x21, 0x1C, 0x19, 0x40, 0x83, 0x58, 0xC3,
+0x4A, 0x13, 0x40, 0x19, 0x43, 0x4B, 0x46, 0xC1, 0x50, 0xBD, 0x4B, 0x1B, 0x88, 0x34, 0x60, 0xD8, 0x5, 0xD8, 0xD5, 0xBF, 0x4A, 0x4, 0x99, 0x0, 0x23, 0xB, 0x60, 0x13, 0x68, 0x2, 0x92, 0x0, 0x2B, 0x4F, 0xD1,
+0x1, 0x23, 0xB, 0x60, 0xBB, 0x49, 0x13, 0x60, 0xA, 0x68, 0x80, 0x23, 0xDB, 0x2, 0x1A, 0x43, 0xA, 0x60, 0xAF, 0x4B, 0xAF, 0x4F, 0xB0, 0x49, 0x1, 0x22, 0xB3, 0x48, 0x52, 0x42, 0x3, 0x93, 0x1, 0x97, 0x6,
+0x91, 0x5, 0x92, 0x83, 0x46, 0x3, 0x99, 0xF, 0x68, 0x7A, 0x1C, 0x30, 0xD0, 0x7D, 0x0, 0x1, 0x9E, 0x6B, 0x1C, 0x9B, 0x0, 0x98, 0x59, 0xB1, 0x46, 0x98, 0x46, 0x3, 0x1, 0x37, 0xD5, 0xAD, 0x4B, 0x2, 0x1C,
+0x1A, 0x40, 0x80, 0x23, 0x9B, 0x4, 0x1A, 0x43, 0x92, 0x46, 0xFA, 0x0, 0x93, 0x59, 0x1, 0xF, 0x58, 0x46, 0x3, 0x40, 0x3, 0x98, 0x3, 0x60, 0x5B, 0x45, 0x0, 0xD1, 0xB9, 0xE0, 0xA5, 0x4D, 0x8C, 0x0, 0x63,
+0x59, 0x0, 0x2B, 0x0, 0xD1, 0x9E, 0xE0, 0x38, 0x1C, 0xFF, 0xF7, 0x2F, 0xFC, 0xFF, 0xF7, 0x3F, 0xFC, 0xA1, 0x4B, 0x50, 0x46, 0xE1, 0x58, 0x63, 0x59, 0x0, 0xF0, 0x43, 0xFD, 0xFF, 0xF7, 0x55, 0xFC, 0x3,
+0x99, 0xF, 0x68, 0x7A, 0x1C, 0xCE, 0xD1, 0x9C, 0x4A, 0x4, 0x9F, 0x2, 0x98, 0x0, 0x23, 0x13, 0x80, 0x3B, 0x60, 0x3, 0x60, 0xB, 0xB0, 0x3C, 0xBC, 0x90, 0x46, 0x99, 0x46, 0xA2, 0x46, 0xAB, 0x46, 0xF0, 0xBC,
+0x1, 0xBC, 0x0, 0x47, 0xC0, 0x23, 0x1B, 0x5, 0x1, 0x1C, 0x19, 0x40, 0x80, 0x23, 0xDB, 0x4, 0x99, 0x42, 0x0, 0xD1, 0x8F, 0xE0, 0x0, 0x29, 0x66, 0xD1, 0x8F, 0x4B, 0x3, 0x40, 0x9A, 0x46, 0x20, 0x2B, 0x0,
+0xDD, 0xB9, 0xE0, 0x0, 0x2B, 0x0, 0xDC, 0x7C, 0xE1, 0xFB, 0x0, 0x9B, 0x59, 0x5C, 0x46, 0x1C, 0x40, 0x5C, 0x45, 0xD5, 0xD0, 0x0, 0x21, 0x6, 0xE0, 0xE3, 0x0, 0x4A, 0x46, 0x9B, 0x58, 0x5C, 0x46, 0x1C, 0x40,
+0x5C, 0x45, 0xCC, 0xD0, 0x1, 0x31, 0x8A, 0x45, 0xF5, 0xD1, 0x7A, 0x4E, 0xB4, 0x42, 0xC6, 0xD0, 0x63, 0x0, 0x7, 0x93, 0x49, 0x46, 0xE3, 0x0, 0x5B, 0x58, 0x3, 0x9A, 0x33, 0x40, 0x13, 0x60, 0xB3, 0x42, 0x0,
+0xD1, 0x53, 0xE1, 0x0, 0xF, 0x52, 0x46, 0x8, 0x90, 0x0, 0x2A, 0x0, 0xD0, 0x6, 0xE1, 0x79, 0x4B, 0xAA, 0x0, 0x48, 0x46, 0x13, 0x50, 0x8, 0x9B, 0x42, 0x46, 0x77, 0x4D, 0x51, 0x46, 0x4A, 0x44, 0x9E, 0x0,
+0x11, 0x60, 0x71, 0x59, 0x48, 0x1C, 0x0, 0xD1, 0x43, 0xE1, 0xC9, 0x0, 0x48, 0x46, 0xB, 0x58, 0x68, 0x48, 0x5A, 0x46, 0x3, 0x40, 0x3A, 0x40, 0x1A, 0x43, 0x4B, 0x46, 0xCA, 0x50, 0x77, 0x51, 0x6E, 0x4C,
+0x33, 0x59, 0x0, 0x2B, 0x0, 0xD1, 0x61, 0xE7, 0xFF, 0xF7, 0xC8, 0xFB, 0x6B, 0x4B, 0x50, 0x46, 0xF1, 0x58, 0x33, 0x59, 0x0, 0xF0, 0xCC, 0xFC, 0xFF, 0xF7, 0xDE, 0xFB, 0x8, 0x98, 0x0, 0x21, 0x0, 0x22, 0xFF,
+0xF7, 0x4D, 0xFE, 0x51, 0xE7, 0x65, 0x4A, 0x13, 0x68, 0x1, 0x33, 0x13, 0x60, 0x5, 0xE7, 0x40, 0x46, 0x34, 0x60, 0x4, 0x60, 0x1, 0xE7, 0xFB, 0x0, 0x9B, 0x59, 0x59, 0x46, 0x3, 0x9A, 0xB, 0x40, 0x13, 0x60,
+0x5B, 0x45, 0x63, 0xD0, 0x38, 0x1C, 0xFF, 0xF7, 0x94, 0xFB, 0x3C, 0xE7, 0x5C, 0x4B, 0x57, 0x4D, 0x93, 0x51, 0x41, 0x46, 0x52, 0x46, 0x8A, 0x51, 0x61, 0x59, 0x4B, 0x1C, 0x5B, 0xD0, 0xC9, 0x0, 0x48, 0x46,
+0xB, 0x58, 0x49, 0x48, 0x5A, 0x46, 0x3, 0x40, 0x3A, 0x40, 0x1A, 0x43, 0x4B, 0x46, 0xCA, 0x50, 0x67, 0x51, 0x27, 0xE7, 0x5, 0x9B, 0x6, 0x98, 0x3, 0x60, 0x3, 0x98, 0x3, 0x60, 0x3F, 0xE7, 0x81, 0x1, 0x3C,
+0xD5, 0xFB, 0x0, 0x9B, 0x59, 0x5C, 0x46, 0x1C, 0x40, 0x5C, 0x45, 0x0, 0xD1, 0x4D, 0xE7, 0xE3, 0x0, 0x9B, 0x19, 0x5B, 0x68, 0x9, 0x93, 0x62, 0x0, 0x93, 0x0, 0x4A, 0x46, 0x9B, 0x58, 0x59, 0x46, 0x3, 0x9A,
+0xB, 0x40, 0x13, 0x60, 0x5B, 0x45, 0x53, 0xD0, 0x3, 0xF, 0x43, 0x4A, 0x9E, 0x0, 0xB3, 0x58, 0x92, 0x46, 0x0, 0x2B, 0x2F, 0xD0, 0x38, 0x1C, 0xFF, 0xF7, 0x57, 0xFB, 0xBC, 0x42, 0x2, 0xD0, 0x20, 0x1C, 0xFF,
+0xF7, 0x52, 0xFB, 0xFF, 0xF7, 0x62, 0xFB, 0x3C, 0x4B, 0x57, 0x46, 0xF1, 0x58, 0x9, 0x98, 0xF3, 0x59, 0x0, 0xF0, 0x65, 0xFC, 0xFF, 0xF7, 0x77, 0xFB, 0xEF, 0xE6, 0xFB, 0x0, 0x9B, 0x59, 0x58, 0x46, 0x3,
+0x99, 0x3, 0x40, 0xB, 0x60, 0x5B, 0x45, 0xA6, 0xD1, 0x5, 0x9A, 0x6, 0x9B, 0xA, 0x60, 0x1A, 0x60, 0xA1, 0xE7, 0x29, 0x4B, 0x3C, 0x1C, 0x3, 0x40, 0x2A, 0x1C, 0x9, 0x93, 0xC8, 0xE7, 0x5, 0x9B, 0x6, 0x98,
+0x13, 0x60, 0x3, 0x60, 0x96, 0xE7, 0x2C, 0x4B, 0x67, 0x51, 0xE7, 0x50, 0xD3, 0xE6, 0xBC, 0x42, 0x2, 0xD0, 0x20, 0x1C, 0xFF, 0xF7, 0x25, 0xFB, 0x29, 0x4B, 0xAA, 0x0, 0x48, 0x46, 0x13, 0x50, 0x9, 0x99,
+0x42, 0x46, 0x1E, 0x4D, 0x4A, 0x44, 0x11, 0x60, 0x71, 0x59, 0x4B, 0x1C, 0x10, 0xD0, 0xC9, 0x0, 0x48, 0x46, 0xB, 0x58, 0x10, 0x48, 0x5A, 0x46, 0x3, 0x40, 0x3A, 0x40, 0x1A, 0x43, 0x4B, 0x46, 0xCA, 0x50,
+0x77, 0x51, 0xB6, 0xE6, 0x5, 0x9B, 0x6, 0x99, 0x13, 0x60, 0xB, 0x60, 0xA6, 0xE7, 0x19, 0x4B, 0x77, 0x51, 0xF7, 0x50, 0xAD, 0xE6, 0x4C, 0x16, 0x80, 0x3, 0x64, 0x1F, 0x80, 0x3, 0x9C, 0x16, 0x80, 0x3, 0x2C,
+0x20, 0x80, 0x3, 0x84, 0x1, 0x0, 0x4, 0x14, 0x2, 0x0, 0x4, 0xFF, 0xFF, 0x0, 0x20, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0x54, 0x16, 0x80, 0x3, 0x10, 0x2, 0x0, 0x4, 0xFF, 0xFF, 0x3F, 0x0, 0xDC, 0x1E,
+0x80, 0x3, 0xAC, 0x1F, 0x80, 0x3, 0x8, 0x2, 0x0, 0x4, 0xFF, 0xFF, 0xFF, 0x1, 0xFF, 0xFF, 0x0, 0x50, 0xEC, 0x1F, 0x80, 0x3, 0x30, 0x20, 0x80, 0x3, 0x5C, 0x16, 0x80, 0x3, 0x58, 0x16, 0x80, 0x3, 0xFF, 0xFF,
+0x0, 0x30, 0x9C, 0x1E, 0x80, 0x3, 0x20, 0x1F, 0x80, 0x3, 0x68, 0x1F, 0x80, 0x3, 0xFF, 0xFF, 0x0, 0x40, 0xAB, 0x0, 0x48, 0x46, 0x1B, 0x58, 0x33, 0x40, 0x98, 0x46, 0x38, 0x1C, 0xFF, 0xF7, 0xC8, 0xFA, 0x42,
+0x46, 0xD0, 0x0, 0x4B, 0x46, 0xC2, 0x58, 0x25, 0x4D, 0x51, 0x46, 0xA0, 0x23, 0x29, 0x40, 0x32, 0x40, 0xDB, 0x5, 0x9, 0x4, 0x1A, 0x43, 0x11, 0x43, 0x4F, 0x46, 0xC1, 0x51, 0x50, 0x46, 0x1, 0x28, 0x13, 0xDD,
+0xAC, 0x46, 0xC0, 0x25, 0x31, 0x40, 0x1, 0x38, 0xED, 0x5, 0xC9, 0x0, 0x4F, 0x46, 0xCA, 0x59, 0x63, 0x46, 0x3, 0x40, 0x32, 0x40, 0x1B, 0x4, 0x2A, 0x43, 0x13, 0x43, 0xCB, 0x51, 0x1, 0x38, 0x19, 0x1C, 0x31,
+0x40, 0x0, 0x28, 0xF0, 0xD1, 0x7, 0x98, 0x49, 0x46, 0x82, 0x0, 0x53, 0x58, 0x13, 0x4F, 0x58, 0x46, 0x3B, 0x40, 0x3, 0x43, 0x53, 0x50, 0x8, 0x99, 0x11, 0x4D, 0x8E, 0x0, 0x73, 0x59, 0x5A, 0x1C, 0x14, 0xD0,
+0xDB, 0x0, 0x48, 0x46, 0x1A, 0x58, 0xC, 0x49, 0x47, 0x46, 0xA, 0x40, 0x3A, 0x43, 0x1A, 0x50, 0x74, 0x51, 0xCB, 0xE6, 0x5, 0x9B, 0x6, 0x99, 0x13, 0x60, 0xB, 0x60, 0xA6, 0xE6, 0x8, 0x4B, 0x77, 0x51, 0xF7,
+0x50, 0xC2, 0xE6, 0x3C, 0x1C, 0x92, 0xE6, 0x5, 0x4B, 0x47, 0x46, 0xF7, 0x50, 0x74, 0x51, 0xBB, 0xE6, 0x0, 0x0, 0xFF, 0xF, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0xEC, 0x1F, 0x80, 0x3, 0x68, 0x1F, 0x80, 0x3,
+0xF0, 0xB5, 0x57, 0x46, 0x46, 0x46, 0xC0, 0xB4, 0x81, 0xB0, 0x4, 0x1C, 0xF, 0x28, 0x9, 0xD9, 0x0, 0x21, 0x88, 0x46, 0x40, 0x46, 0x1, 0xB0, 0xC, 0xBC, 0x90, 0x46, 0x9A, 0x46, 0xF0, 0xBC, 0x2, 0xBC, 0x8,
+0x47, 0xFF, 0xF7, 0x8C, 0xFA, 0x2B, 0x4A, 0xA4, 0x0, 0x94, 0x46, 0x23, 0x1C, 0x63, 0x44, 0x1D, 0x68, 0xA2, 0x46, 0x69, 0x1C, 0x17, 0xD0, 0x28, 0x4B, 0x9D, 0x42, 0x14, 0xD0, 0x27, 0x4A, 0xE8, 0x0, 0x81,
+0x58, 0xB, 0xF, 0x6F, 0x0, 0x16, 0x1C, 0x4, 0x2B, 0x7, 0xD1, 0x3A, 0xE0, 0xE2, 0x0, 0x91, 0x59, 0xB, 0xF, 0x67, 0x0, 0x4, 0x2B, 0xA, 0xD0, 0x25, 0x1C, 0x1E, 0x4B, 0xC, 0x1C, 0x1C, 0x40, 0x9C, 0x42, 0xF3,
+0xD1, 0xFF, 0xF7, 0x4B, 0xFA, 0x0, 0x22, 0x90, 0x46, 0xCF, 0xE7, 0x93, 0x19, 0x5B, 0x68, 0x98, 0x46, 0x6A, 0x1C, 0x17, 0xD0, 0x17, 0x4B, 0xE8, 0x0, 0x19, 0x40, 0x17, 0x4A, 0x83, 0x59, 0x13, 0x40, 0x19,
+0x43, 0x81, 0x51, 0x28, 0x1C, 0xBB, 0x0, 0x9A, 0x5B, 0x11, 0x4B, 0x9A, 0x42, 0x5, 0xD0, 0x20, 0x1C, 0xFF, 0xF7, 0x20, 0xFA, 0xFF, 0xF7, 0x30, 0xFA, 0xB6, 0xE7, 0x10, 0x4B, 0x51, 0x46, 0xC8, 0x50, 0xF5,
+0xE7, 0x28, 0x1C, 0xA, 0x4A, 0xB, 0x1C, 0x51, 0x46, 0x13, 0x40, 0x61, 0x44, 0xB, 0x60, 0x93, 0x42, 0xE7, 0xD1, 0x1, 0x23, 0x5B, 0x42, 0xB, 0x60, 0xE3, 0xE7, 0x83, 0x18, 0x5B, 0x68, 0x1, 0x20, 0x98, 0x46,
+0x2C, 0x1C, 0x40, 0x42, 0xEC, 0xE7, 0x0, 0x0, 0x68, 0x1F, 0x80, 0x3, 0xFF, 0xFF, 0x0, 0x0, 0x9C, 0x16, 0x80, 0x3, 0x0, 0x0, 0xFF, 0xFF, 0xEC, 0x1F, 0x80, 0x3, 0xF0, 0xB5, 0x57, 0x46, 0x46, 0x46, 0xC0,
+0xB4, 0x81, 0xB0, 0x4, 0x1C, 0xF, 0x28, 0x9, 0xD9, 0x0, 0x21, 0x88, 0x46, 0x40, 0x46, 0x1, 0xB0, 0xC, 0xBC, 0x90, 0x46, 0x9A, 0x46, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xFF, 0xF7, 0x16, 0xFA, 0x2B, 0x4A,
+0xA4, 0x0, 0x94, 0x46, 0x23, 0x1C, 0x63, 0x44, 0x1D, 0x68, 0xA2, 0x46, 0x69, 0x1C, 0x17, 0xD0, 0x28, 0x4B, 0x9D, 0x42, 0x14, 0xD0, 0x27, 0x4A, 0xE8, 0x0, 0x81, 0x58, 0xB, 0xF, 0x6F, 0x0, 0x16, 0x1C, 0x3,
+0x2B, 0x7, 0xD1, 0x3A, 0xE0, 0xE2, 0x0, 0x91, 0x59, 0xB, 0xF, 0x67, 0x0, 0x3, 0x2B, 0xA, 0xD0, 0x25, 0x1C, 0x1E, 0x4B, 0xC, 0x1C, 0x1C, 0x40, 0x9C, 0x42, 0xF3, 0xD1, 0xFF, 0xF7, 0xD5, 0xF9, 0x0, 0x22,
+0x90, 0x46, 0xCF, 0xE7, 0x93, 0x19, 0x5B, 0x68, 0x98, 0x46, 0x6A, 0x1C, 0x17, 0xD0, 0x17, 0x4B, 0xE8, 0x0, 0x19, 0x40, 0x17, 0x4A, 0x83, 0x59, 0x13, 0x40, 0x19, 0x43, 0x81, 0x51, 0x28, 0x1C, 0xBB, 0x0,
+0x9A, 0x5B, 0x11, 0x4B, 0x9A, 0x42, 0x5, 0xD0, 0x20, 0x1C, 0xFF, 0xF7, 0xAA, 0xF9, 0xFF, 0xF7, 0xBA, 0xF9, 0xB6, 0xE7, 0x10, 0x4B, 0x51, 0x46, 0xC8, 0x50, 0xF5, 0xE7, 0x28, 0x1C, 0xA, 0x4A, 0xB, 0x1C,
+0x51, 0x46, 0x13, 0x40, 0x61, 0x44, 0xB, 0x60, 0x93, 0x42, 0xE7, 0xD1, 0x1, 0x23, 0x5B, 0x42, 0xB, 0x60, 0xE3, 0xE7, 0x83, 0x18, 0x5B, 0x68, 0x1, 0x20, 0x98, 0x46, 0x2C, 0x1C, 0x40, 0x42, 0xEC, 0xE7,
+0x0, 0x0, 0x68, 0x1F, 0x80, 0x3, 0xFF, 0xFF, 0x0, 0x0, 0x9C, 0x16, 0x80, 0x3, 0x0, 0x0, 0xFF, 0xFF, 0xEC, 0x1F, 0x80, 0x3, 0x10, 0xB5, 0x4, 0x1C, 0xF, 0x28, 0x4, 0xD9, 0x0, 0x24, 0x20, 0x1C, 0x10, 0xBC,
+0x2, 0xBC, 0x8, 0x47, 0xFF, 0xF7, 0xA9, 0xF9, 0xF, 0x4A, 0xA3, 0x0, 0x98, 0x58, 0x43, 0x1C, 0x15, 0xD0, 0xD, 0x4B, 0x98, 0x42, 0x12, 0xD0, 0xD, 0x49, 0x0, 0x24, 0x1A, 0x1C, 0x2, 0xE0, 0x10, 0x40, 0x90,
+0x42, 0x8, 0xD0, 0xC3, 0x0, 0x58, 0x58, 0x3, 0xF, 0x5, 0x2B, 0xF7, 0xD1, 0x10, 0x40, 0x1, 0x34, 0x90, 0x42, 0xF6, 0xD1, 0xFF, 0xF7, 0x71, 0xF9, 0xDE, 0xE7, 0x0, 0x24, 0xFF, 0xF7, 0x6D, 0xF9, 0xDA, 0xE7,
+0x68, 0x1F, 0x80, 0x3, 0xFF, 0xFF, 0x0, 0x0, 0x9C, 0x16, 0x80, 0x3, 0x10, 0xB5, 0x4, 0x1C, 0xF, 0x28, 0x4, 0xD9, 0x0, 0x24, 0x20, 0x1C, 0x10, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xFF, 0xF7, 0x79, 0xF9, 0x11,
+0x4A, 0xA3, 0x0, 0x98, 0x58, 0x43, 0x1C, 0x12, 0xD0, 0xF, 0x4B, 0x98, 0x42, 0xF, 0xD0, 0xF, 0x4A, 0xC3, 0x0, 0x98, 0x58, 0x3, 0xF, 0x5, 0x2B, 0x5, 0xD1, 0xD, 0xE0, 0xC3, 0x0, 0x98, 0x58, 0x3, 0xF, 0x5,
+0x2B, 0x8, 0xD0, 0x8, 0x4B, 0x18, 0x40, 0x98, 0x42, 0xF6, 0xD1, 0xFF, 0xF7, 0x41, 0xF9, 0x1, 0x24, 0x64, 0x42, 0xDC, 0xE7, 0x3, 0x1, 0x1C, 0xD, 0xFF, 0xF7, 0x3A, 0xF9, 0xD7, 0xE7, 0x0, 0x0, 0x68, 0x1F,
+0x80, 0x3, 0xFF, 0xFF, 0x0, 0x0, 0x9C, 0x16, 0x80, 0x3, 0x10, 0xB5, 0x4, 0x1C, 0xF, 0x28, 0x3, 0xD9, 0x0, 0x20, 0x10, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xFF, 0xF7, 0x46, 0xF9, 0xF, 0x4A, 0xA3, 0x0, 0x98, 0x58,
+0x43, 0x1C, 0x12, 0xD0, 0xE, 0x4B, 0x98, 0x42, 0xF, 0xD0, 0xD, 0x4A, 0xC3, 0x0, 0x98, 0x58, 0x3, 0xF, 0x5, 0x2B, 0x5, 0xD1, 0xB, 0xE0, 0xC3, 0x0, 0x98, 0x58, 0x3, 0xF, 0x5, 0x2B, 0x6, 0xD0, 0x6, 0x4B,
+0x18, 0x40, 0x98, 0x42, 0xF6, 0xD1, 0xFF, 0xF7, 0xE, 0xF9, 0xDE, 0xE7, 0xFF, 0xF7, 0xB, 0xF9, 0x1, 0x20, 0xDB, 0xE7, 0x0, 0x0, 0x68, 0x1F, 0x80, 0x3, 0xFF, 0xFF, 0x0, 0x0, 0x9C, 0x16, 0x80, 0x3, 0x10,
+0xB5, 0x4, 0x1C, 0xF, 0x28, 0x3, 0xD9, 0x0, 0x20, 0x10, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xFF, 0xF7, 0x16, 0xF9, 0xF, 0x4A, 0xA3, 0x0, 0x98, 0x58, 0x43, 0x1C, 0x12, 0xD0, 0xE, 0x4B, 0x98, 0x42, 0xF, 0xD0,
+0xD, 0x4A, 0xC3, 0x0, 0x98, 0x58, 0x3, 0xF, 0x4, 0x2B, 0x5, 0xD1, 0xB, 0xE0, 0xC3, 0x0, 0x98, 0x58, 0x3, 0xF, 0x4, 0x2B, 0x6, 0xD0, 0x6, 0x4B, 0x18, 0x40, 0x98, 0x42, 0xF6, 0xD1, 0xFF, 0xF7, 0xDE, 0xF8,
+0xDE, 0xE7, 0xFF, 0xF7, 0xDB, 0xF8, 0x1, 0x20, 0xDB, 0xE7, 0x0, 0x0, 0x68, 0x1F, 0x80, 0x3, 0xFF, 0xFF, 0x0, 0x0, 0x9C, 0x16, 0x80, 0x3, 0x10, 0xB5, 0x4, 0x1C, 0xF, 0x28, 0x3, 0xD9, 0x0, 0x20, 0x10, 0xBC,
+0x2, 0xBC, 0x8, 0x47, 0xFF, 0xF7, 0xE6, 0xF8, 0xF, 0x4A, 0xA3, 0x0, 0x98, 0x58, 0x43, 0x1C, 0x12, 0xD0, 0xE, 0x4B, 0x98, 0x42, 0xF, 0xD0, 0xD, 0x4A, 0xC3, 0x0, 0x98, 0x58, 0x3, 0xF, 0x3, 0x2B, 0x5, 0xD1,
+0xB, 0xE0, 0xC3, 0x0, 0x98, 0x58, 0x3, 0xF, 0x3, 0x2B, 0x6, 0xD0, 0x6, 0x4B, 0x18, 0x40, 0x98, 0x42, 0xF6, 0xD1, 0xFF, 0xF7, 0xAE, 0xF8, 0xDE, 0xE7, 0xFF, 0xF7, 0xAB, 0xF8, 0x1, 0x20, 0xDB, 0xE7, 0x0,
+0x0, 0x68, 0x1F, 0x80, 0x3, 0xFF, 0xFF, 0x0, 0x0, 0x9C, 0x16, 0x80, 0x3, 0xF0, 0xB5, 0x81, 0xB0, 0x4, 0x1C, 0xE, 0x1C, 0x17, 0x1C, 0xF, 0x28, 0x3, 0xD9, 0x1, 0xB0, 0xF0, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0xFF,
+0xF7, 0xB3, 0xF8, 0x13, 0x4B, 0xA2, 0x0, 0xD6, 0x50, 0x12, 0x4B, 0xD7, 0x50, 0x0, 0x2E, 0x1B, 0xD0, 0x20, 0x1C, 0xFF, 0xF7, 0xF5, 0xFE, 0x5, 0x1C, 0x0, 0x28, 0x15, 0xDD, 0x20, 0x1C, 0xFF, 0xF7, 0x1F,
+0xFF, 0x39, 0x1C, 0x0, 0xF0, 0x8E, 0xF9, 0x20, 0x1C, 0xFF, 0xF7, 0xE9, 0xFE, 0x85, 0x42, 0xEE, 0xD1, 0x0, 0x21, 0x0, 0x22, 0x20, 0x1C, 0xFF, 0xF7, 0xA, 0xFB, 0x20, 0x1C, 0xFF, 0xF7, 0xDF, 0xFE, 0x5, 0x1C,
+0x0, 0x28, 0xE9, 0xDC, 0xFF, 0xF7, 0x70, 0xF8, 0xD3, 0xE7, 0x0, 0x0, 0x30, 0x20, 0x80, 0x3, 0x5C, 0x16, 0x80, 0x3, 0x10, 0xB5, 0x14, 0x1C, 0xF, 0x28, 0x6, 0xD8, 0x7, 0x4B, 0x82, 0x0, 0xD3, 0x58, 0x0,
+0x2B, 0x5, 0xD0, 0x0, 0x29, 0x3, 0xD0, 0x0, 0x20, 0x10, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x22, 0x1C, 0xFF, 0xF7, 0xB6, 0xFF, 0x1, 0x20, 0xF7, 0xE7, 0x30, 0x20, 0x80, 0x3, 0x70, 0xB5, 0x4, 0x1C, 0xD, 0x1C,
+0x16, 0x1C, 0xF, 0x28, 0x2, 0xD9, 0x70, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0xFF, 0xF7, 0x67, 0xF8, 0xB, 0x4B, 0xA2, 0x0, 0xD5, 0x50, 0xA, 0x4B, 0xD6, 0x50, 0x0, 0x2D, 0x6, 0xD1, 0xA, 0xE0, 0x20, 0x1C, 0xFF,
+0xF7, 0xBC, 0xFD, 0x31, 0x1C, 0x0, 0xF0, 0x46, 0xF9, 0x20, 0x1C, 0xFF, 0xF7, 0x36, 0xFF, 0x0, 0x28, 0xF4, 0xD1, 0xFF, 0xF7, 0x34, 0xF8, 0xE4, 0xE7, 0x0, 0x0, 0x9C, 0x1E, 0x80, 0x3, 0x20, 0x1F, 0x80, 0x3,
+0x10, 0xB5, 0x14, 0x1C, 0xF, 0x28, 0x6, 0xD8, 0x7, 0x4B, 0x82, 0x0, 0xD3, 0x58, 0x0, 0x2B, 0x5, 0xD0, 0x0, 0x29, 0x3, 0xD0, 0x0, 0x20, 0x10, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x22, 0x1C, 0xFF, 0xF7, 0xC8, 0xFF,
+0x1, 0x20, 0xF7, 0xE7, 0x9C, 0x1E, 0x80, 0x3, 0x70, 0xB5, 0x4, 0x1C, 0xD, 0x1C, 0x16, 0x1C, 0xF, 0x28, 0x2, 0xD9, 0x70, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0xFF, 0xF7, 0x2B, 0xF8, 0xB, 0x4B, 0xA2, 0x0, 0xD5,
+0x50, 0xA, 0x4B, 0xD6, 0x50, 0x0, 0x2D, 0x6, 0xD1, 0xA, 0xE0, 0x20, 0x1C, 0xFF, 0xF7, 0xF6, 0xFD, 0x31, 0x1C, 0x0, 0xF0, 0xA, 0xF9, 0x20, 0x1C, 0xFF, 0xF7, 0x2A, 0xFF, 0x0, 0x28, 0xF4, 0xD1, 0xFE, 0xF7,
+0xF8, 0xFF, 0xE4, 0xE7, 0x0, 0x0, 0xDC, 0x1E, 0x80, 0x3, 0xAC, 0x1F, 0x80, 0x3, 0x10, 0xB5, 0x14, 0x1C, 0xF, 0x28, 0x6, 0xD8, 0x7, 0x4B, 0x82, 0x0, 0xD3, 0x58, 0x0, 0x2B, 0x5, 0xD0, 0x0, 0x29, 0x3, 0xD0,
+0x0, 0x20, 0x10, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x22, 0x1C, 0xFF, 0xF7, 0xC8, 0xFF, 0x1, 0x20, 0xF7, 0xE7, 0xDC, 0x1E, 0x80, 0x3, 0xF0, 0xB5, 0x5F, 0x46, 0x56, 0x46, 0x4D, 0x46, 0x44, 0x46, 0xF0, 0xB4, 0xC0,
+0x20, 0x85, 0xB0, 0xC0, 0x2, 0x0, 0xF0, 0x7F, 0xF9, 0x51, 0x4A, 0x93, 0x46, 0x5B, 0x46, 0x0, 0x22, 0x1A, 0x60, 0x4F, 0x4B, 0x1A, 0x60, 0x4F, 0x4B, 0x1, 0x22, 0x52, 0x42, 0x1A, 0x60, 0x4E, 0x4B, 0x1A,
+0x60, 0x4E, 0x4B, 0x4F, 0x4C, 0x1A, 0x60, 0x4F, 0x4B, 0xA1, 0x46, 0x4F, 0x4C, 0x1A, 0x60, 0x4F, 0x4B, 0xA0, 0x46, 0x4F, 0x4C, 0x9A, 0x46, 0x4F, 0x4B, 0x4F, 0x4F, 0x50, 0x4E, 0x50, 0x4D, 0x1, 0x94, 0x0,
+0x21, 0x9C, 0x46, 0x0, 0x20, 0x54, 0x46, 0x4B, 0x46, 0xA, 0x51, 0x44, 0x46, 0xCA, 0x50, 0xB, 0x19, 0x64, 0x46, 0x18, 0x60, 0xB, 0x19, 0x18, 0x60, 0xCB, 0x19, 0x18, 0x60, 0x1, 0x9C, 0x8B, 0x19, 0x18, 0x60,
+0x4B, 0x19, 0x18, 0x60, 0xB, 0x19, 0x4, 0x31, 0x18, 0x60, 0x40, 0x29, 0xE9, 0xD1, 0x80, 0x24, 0x43, 0x49, 0x44, 0x4D, 0x0, 0x20, 0x0, 0x26, 0x64, 0x0, 0x1, 0x30, 0x3, 0x1C, 0xA, 0x1F, 0x2B, 0x40, 0xE,
+0x60, 0x13, 0x60, 0x8, 0x31, 0xA0, 0x42, 0xF6, 0xD1, 0x3E, 0x4A, 0xFF, 0x23, 0xDB, 0x0, 0xD5, 0x50, 0x3D, 0x4B, 0x3E, 0x4A, 0x3E, 0x4C, 0x1A, 0x80, 0x4, 0x3B, 0x1E, 0x80, 0x0, 0x25, 0x0, 0x21, 0x1E, 0x1C,
+0xF, 0x20, 0x33, 0x88, 0x1A, 0x1C, 0x4B, 0x1C, 0x2, 0x40, 0x3, 0x40, 0x9A, 0x42, 0x45, 0xD0, 0x53, 0x1C, 0x19, 0x1C, 0x1, 0x40, 0xB, 0x2, 0x33, 0x80, 0xE, 0x2A, 0x14, 0xD0, 0x9, 0x2D, 0x14, 0xDC, 0x0,
+0x23, 0x3, 0x93, 0x3, 0x9B, 0x32, 0x4A, 0x93, 0x42, 0x5, 0xDC, 0x3, 0x9B, 0x1, 0x33, 0x3, 0x93, 0x3, 0x9B, 0x93, 0x42, 0xF9, 0xDD, 0x1, 0x3C, 0x0, 0x2C, 0xE0, 0xD1, 0x2D, 0x4B, 0x0, 0x20, 0x1C, 0x80,
+0x20, 0xE0, 0x2, 0x2D, 0xE8, 0xDD, 0x2A, 0x4A, 0xE0, 0x23, 0x1B, 0x1, 0x13, 0x80, 0x29, 0x4B, 0x0, 0x22, 0x1A, 0x60, 0x28, 0x4B, 0x1A, 0x60, 0x28, 0x4B, 0x1A, 0x60, 0x28, 0x4B, 0x80, 0x20, 0x1A, 0x60,
+0x28, 0x49, 0x80, 0x2, 0x0, 0xF0, 0x57, 0xF8, 0x80, 0x20, 0x26, 0x49, 0xC0, 0x2, 0x0, 0xF0, 0x52, 0xF8, 0xC0, 0x20, 0xC0, 0x2, 0x0, 0xF0, 0xC0, 0xF8, 0x1, 0x23, 0x5A, 0x46, 0x13, 0x60, 0x1, 0x20, 0x5,
+0xB0, 0x3C, 0xBC, 0x90, 0x46, 0x99, 0x46, 0xA2, 0x46, 0xAB, 0x46, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x1, 0x35, 0xB7, 0xE7, 0x0, 0x0, 0x48, 0x16, 0x80, 0x3, 0x1C, 0x1F, 0x80, 0x3, 0x64, 0x1F, 0x80, 0x3,
+0x2C, 0x20, 0x80, 0x3, 0x60, 0x1F, 0x80, 0x3, 0xEC, 0x1F, 0x80, 0x3, 0xA8, 0x1F, 0x80, 0x3, 0x5C, 0x16, 0x80, 0x3, 0x68, 0x1F, 0x80, 0x3, 0x30, 0x20, 0x80, 0x3, 0x20, 0x1F, 0x80, 0x3, 0xAC, 0x1F, 0x80,
+0x3, 0xDC, 0x1E, 0x80, 0x3, 0x9C, 0x1E, 0x80, 0x3, 0xA0, 0x16, 0x80, 0x3, 0xFF, 0xFF, 0x0, 0x0, 0x9C, 0x16, 0x80, 0x3, 0x84, 0x1, 0x0, 0x4, 0xC, 0x84, 0xFF, 0xFF, 0x10, 0x27, 0x0, 0x0, 0xF, 0x27, 0x0,
+0x0, 0x80, 0x1, 0x0, 0x4, 0x4C, 0x16, 0x80, 0x3, 0x50, 0x16, 0x80, 0x3, 0x54, 0x16, 0x80, 0x3, 0x58, 0x16, 0x80, 0x3, 0xE9, 0xD1, 0x7F, 0x3, 0xBD, 0xD6, 0x7F, 0x3, 0x18, 0x47, 0x28, 0x47, 0x30, 0x47,
+0xC0, 0x46, 0x70, 0x47, 0x0, 0x0, 0x10, 0xB5, 0xC, 0x1C, 0x0, 0x28, 0xA, 0xD0, 0x12, 0x4B, 0x0, 0x21, 0x1A, 0x68, 0x0, 0x2A, 0x8, 0xD0, 0x90, 0x42, 0x6, 0xD0, 0x1, 0x31, 0x8, 0x33, 0x19, 0x29, 0xF6, 0xD1,
+0x10, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0xC, 0x4A, 0xCB, 0x0, 0x9C, 0x50, 0x9B, 0x18, 0x58, 0x60, 0xC3, 0x7, 0x6, 0xD5, 0xA, 0x4B, 0x1A, 0x88, 0x8, 0x21, 0xA, 0x43, 0x12, 0x4, 0x12, 0xC, 0x1A, 0x80, 0x83, 0x7,
+0xEC, 0xD5, 0x5, 0x4B, 0x1A, 0x88, 0x10, 0x21, 0xA, 0x43, 0x12, 0x4, 0x12, 0xC, 0x1A, 0x80, 0xE4, 0xE7, 0x74, 0x20, 0x80, 0x3, 0x70, 0x20, 0x80, 0x3, 0x4, 0x0, 0x0, 0x4, 0x0, 0xB5, 0xC, 0x4B, 0xC, 0x4A,
+0x19, 0x1C, 0xC8, 0x31, 0x0, 0x20, 0x1A, 0x60, 0x58, 0x60, 0x8, 0x33, 0x8B, 0x42, 0xFA, 0xD1, 0x9, 0x4A, 0x9, 0x4B, 0x13, 0x60, 0x9, 0x4B, 0xA, 0x4A, 0x18, 0x60, 0x1, 0x23, 0x5B, 0x42, 0x13, 0x60, 0x8,
+0x4B, 0x1, 0x22, 0x1A, 0x80, 0x1, 0xBC, 0x0, 0x47, 0x0, 0x0, 0x70, 0x20, 0x80, 0x3, 0x55, 0xE2, 0x7F, 0x3, 0xFC, 0xFF, 0x80, 0x3, 0xA0, 0xE4, 0x7F, 0x3, 0x10, 0x2, 0x0, 0x4, 0x14, 0x2, 0x0, 0x4, 0x8,
+0x2, 0x0, 0x4, 0x10, 0xB5, 0x8, 0x4C, 0x8, 0x4A, 0x1, 0x23, 0x0, 0x21, 0x5B, 0x42, 0x21, 0x80, 0x13, 0x60, 0x6, 0x4B, 0x19, 0x60, 0x6, 0x4B, 0x18, 0x60, 0x1, 0x23, 0x23, 0x80, 0x10, 0xBC, 0x1, 0xBC, 0x0,
+0x47, 0x0, 0x0, 0x8, 0x2, 0x0, 0x4, 0x14, 0x2, 0x0, 0x4, 0x10, 0x2, 0x0, 0x4, 0xFC, 0xFF, 0x80, 0x3, 0x10, 0xB5, 0x1, 0x24, 0x20, 0x42, 0x6, 0xD0, 0x10, 0x4B, 0x1A, 0x88, 0x8, 0x21, 0xA, 0x43, 0x12, 0x4,
+0x12, 0xC, 0x1A, 0x80, 0x83, 0x7, 0x6, 0xD5, 0xC, 0x4B, 0x1A, 0x88, 0x10, 0x21, 0xA, 0x43, 0x12, 0x4, 0x12, 0xC, 0x1A, 0x80, 0x43, 0x7, 0x6, 0xD5, 0x7, 0x4B, 0x1A, 0x88, 0x20, 0x21, 0xA, 0x43, 0x12, 0x4,
+0x12, 0xC, 0x1A, 0x80, 0x5, 0x4A, 0x13, 0x68, 0x3, 0x43, 0x13, 0x60, 0x4, 0x4B, 0x1C, 0x80, 0x10, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0x4, 0x0, 0x0, 0x4, 0x10, 0x2, 0x0, 0x4, 0x8, 0x2, 0x0, 0x4, 0x0, 0xB5, 0xC3,
+0x7, 0x4, 0xD5, 0xC, 0x4B, 0xC, 0x49, 0x1A, 0x88, 0xA, 0x40, 0x1A, 0x80, 0x83, 0x7, 0x4, 0xD5, 0x8, 0x4B, 0xA, 0x49, 0x1A, 0x88, 0xA, 0x40, 0x1A, 0x80, 0x43, 0x7, 0x4, 0xD5, 0x5, 0x4B, 0x7, 0x49, 0x1A,
+0x88, 0xA, 0x40, 0x1A, 0x80, 0x6, 0x4A, 0x13, 0x68, 0x83, 0x43, 0x13, 0x60, 0x1, 0xBC, 0x0, 0x47, 0x4, 0x0, 0x0, 0x4, 0xF7, 0xFF, 0x0, 0x0, 0xEF, 0xFF, 0x0, 0x0, 0xDF, 0xFF, 0x0, 0x0, 0x10, 0x2, 0x0,
+0x4, 0x10, 0xB5, 0x9, 0x4A, 0x0, 0x24, 0x3, 0xE0, 0x1, 0x34, 0x8, 0x32, 0x19, 0x2C, 0x8, 0xD0, 0x13, 0x68, 0x98, 0x42, 0xF8, 0xD1, 0xFF, 0xF7, 0xCD, 0xFF, 0x4, 0x49, 0x4, 0x4B, 0xE2, 0x0, 0x53, 0x50,
+0x10, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0x74, 0x20, 0x80, 0x3, 0x70, 0x20, 0x80, 0x3, 0x55, 0xE2, 0x7F, 0x3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0xDF, 0x70, 0x47, 0x3,
+0xDF, 0x70, 0x47, 0x4, 0xDF, 0x70, 0x47, 0x5, 0xDF, 0x70, 0x47, 0x7, 0xDF, 0x70, 0x47, 0x8, 0xDF, 0x70, 0x47, 0x9, 0xDF, 0x70, 0x47, 0x9, 0xDF, 0x8, 0x1C, 0x70, 0x47, 0xC, 0xB4, 0x9, 0xDF, 0xC, 0xBC,
+0x10, 0x60, 0x19, 0x60, 0x70, 0x47, 0xB, 0xDF, 0x70, 0x47, 0xC, 0xDF, 0x70, 0x47, 0xD, 0xDF, 0x70, 0x47, 0xE, 0xDF, 0x70, 0x47, 0xF, 0xDF, 0x70, 0x47, 0x10, 0xDF, 0x70, 0x47, 0x11, 0xDF, 0x70, 0x47, 0x12,
+0xDF, 0x70, 0x47, 0x13, 0xDF, 0x70, 0x47, 0x14, 0xDF, 0x70, 0x47, 0x15, 0xDF, 0x70, 0x47, 0x6, 0xDF, 0x70, 0x47, 0x1A, 0xDF, 0x70, 0x47, 0x1B, 0xDF, 0x70, 0x47, 0x1C, 0xDF, 0x70, 0x47, 0x40, 0x20, 0x1F,
+0xDF, 0x2, 0x1C, 0x1F, 0xDF, 0x70, 0x47, 0xC0, 0x46, 0xC0, 0x46, 0xC0, 0x46, 0xC0, 0x46, 0xC0, 0x46, 0xC0, 0x46, 0x1, 0x33, 0xA0, 0xE3, 0x8, 0x12, 0x93, 0xE5, 0x8, 0x32, 0x83, 0xE5, 0x0, 0x0, 0x4F, 0xE1,
+0xB, 0x40, 0x2D, 0xE9, 0x10, 0x12, 0x93, 0xE5, 0x14, 0x22, 0x93, 0xE5, 0x2, 0x10, 0x1, 0xE0, 0x98, 0x0, 0x9F, 0xE5, 0x0, 0x20, 0x90, 0xE5, 0x1, 0x20, 0x82, 0xE1, 0x0, 0x20, 0x80, 0xE5, 0x8C, 0x20, 0x9F,
+0xE5, 0x4, 0x0, 0x92, 0xE5, 0x0, 0x0, 0x50, 0xE3, 0x3, 0x0, 0x0, 0xA, 0x1, 0x0, 0x10, 0xE0, 0x5, 0x0, 0x0, 0x1A, 0x8, 0x20, 0x82, 0xE2, 0xF8, 0xFF, 0xFF, 0xEA, 0x14, 0x12, 0x83, 0xE5, 0xB, 0x40, 0xBD,
+0xE8, 0x8, 0x12, 0x83, 0xE5, 0xE, 0xF0, 0xA0, 0xE1, 0x0, 0x10, 0x92, 0xE5, 0x0, 0x0, 0x51, 0xE3, 0x1, 0x0, 0x0, 0x1A, 0x0, 0x10, 0xA0, 0xE1, 0xF6, 0xFF, 0xFF, 0xEA, 0x0, 0x20, 0xF, 0xE1, 0xDF, 0x20, 0xC2,
+0xE3, 0x1F, 0x20, 0x82, 0xE3, 0x2, 0xF0, 0x29, 0xE1, 0x14, 0x2, 0x83, 0xE5, 0x0, 0x40, 0x2D, 0xE9, 0x0, 0xE0, 0x8F, 0xE2, 0x11, 0xFF, 0x2F, 0xE1, 0x1, 0x33, 0xA0, 0xE3, 0x8, 0x32, 0x83, 0xE5, 0x0, 0x40,
+0xBD, 0xE8, 0x0, 0x30, 0xF, 0xE1, 0xDF, 0x30, 0xC3, 0xE3, 0x92, 0x30, 0x83, 0xE3, 0x3, 0xF0, 0x29, 0xE1, 0xB, 0x40, 0xBD, 0xE8, 0x0, 0xF0, 0x69, 0xE1, 0x8, 0x12, 0x83, 0xE5, 0xE, 0xF0, 0xA0, 0xE1, 0xF8,
+0xFF, 0x80, 0x3, 0x70, 0x20, 0x80, 0x3, 0x0, 0x47, 0xC0, 0x46, 0x8, 0x47, 0xC0, 0x46, 0x10, 0x47, 0xC0, 0x46, 0x18, 0x47, 0xC0, 0x46, 0x20, 0x47, 0xC0, 0x46, 0x28, 0x47, 0xC0, 0x46, 0x30, 0x47, 0xC0,
+0x46, 0x38, 0x47, 0xC0, 0x46, 0x40, 0x47, 0xC0, 0x46, 0x48, 0x47, 0xC0, 0x46, 0x50, 0x47, 0xC0, 0x46, 0x58, 0x47, 0xC0, 0x46, 0x60, 0x47, 0xC0, 0x46, 0x68, 0x47, 0xC0, 0x46, 0x70, 0x47, 0xC0, 0x46, 0x70,
+0x40, 0x2D, 0xE9, 0x34, 0x30, 0x9F, 0xE5, 0x34, 0x60, 0x9F, 0xE5, 0x3, 0x30, 0x66, 0xE0, 0x43, 0x51, 0xB0, 0xE1, 0x6, 0x0, 0x0, 0xA, 0x0, 0x40, 0xA0, 0xE3, 0x4, 0xC1, 0x96, 0xE7, 0xF, 0xE0, 0xA0, 0xE1,
+0x1C, 0xFF, 0x2F, 0xE1, 0x1, 0x40, 0x84, 0xE2, 0x4, 0x0, 0x55, 0xE1, 0xF9, 0xFF, 0xFF, 0x8A, 0x59, 0x0, 0x0, 0xEB, 0x70, 0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x64, 0xE7, 0x7F, 0x3, 0x60, 0xE7, 0x7F,
+0x3, 0x70, 0x40, 0x2D, 0xE9, 0x64, 0x30, 0x9F, 0xE5, 0x64, 0x60, 0x9F, 0xE5, 0x3, 0x30, 0x66, 0xE0, 0x43, 0x51, 0xB0, 0xE1, 0x6, 0x0, 0x0, 0xA, 0x0, 0x40, 0xA0, 0xE3, 0x4, 0xC1, 0x96, 0xE7, 0xF, 0xE0,
+0xA0, 0xE1, 0x1C, 0xFF, 0x2F, 0xE1, 0x1, 0x40, 0x84, 0xE2, 0x4, 0x0, 0x55, 0xE1, 0xF9, 0xFF, 0xFF, 0x8A, 0xAA, 0xE6, 0xFF, 0xEB, 0x38, 0x60, 0x9F, 0xE5, 0x38, 0x30, 0x9F, 0xE5, 0x3, 0x30, 0x66, 0xE0,
+0x43, 0x51, 0xB0, 0xE1, 0x6, 0x0, 0x0, 0xA, 0x0, 0x40, 0xA0, 0xE3, 0x4, 0xC1, 0x96, 0xE7, 0xF, 0xE0, 0xA0, 0xE1, 0x1C, 0xFF, 0x2F, 0xE1, 0x1, 0x40, 0x84, 0xE2, 0x4, 0x0, 0x55, 0xE1, 0xF9, 0xFF, 0xFF,
+0x8A, 0x70, 0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x5C, 0xE7, 0x7F, 0x3, 0x5C, 0xE7, 0x7F, 0x3, 0x5C, 0xE7, 0x7F, 0x3, 0x60, 0xE7, 0x7F, 0x3, 0x78, 0x47, 0xC0, 0x46, 0x22, 0xF0, 0xFF, 0xEA, 0x78,
+0x47, 0xC0, 0x46, 0x6E, 0xF0, 0xFF, 0xEA, 0x78, 0x47, 0xC0, 0x46, 0x31, 0xF2, 0xFF, 0xEA, 0x78, 0x47, 0xC0, 0x46, 0x7A, 0xF0, 0xFF, 0xEA, 0x78, 0x47, 0xC0, 0x46, 0x62, 0xF2, 0xFF, 0xEA, 0x78, 0x47, 0xC0,
+0x46, 0x5B, 0xF0, 0xFF, 0xEA, 0x0, 0xC0, 0x9F, 0xE5, 0x1C, 0xFF, 0x2F, 0xE1, 0x75, 0xE5, 0x7F, 0x3, 0x0, 0xC0, 0x9F, 0xE5, 0x1C, 0xFF, 0x2F, 0xE1, 0xC9, 0xCE, 0x7F, 0x3, 0x0, 0xC0, 0x9F, 0xE5, 0x1C, 0xFF,
+0x2F, 0xE1, 0xB9, 0xE2, 0x7F, 0x3, 0x0, 0xC0, 0x9F, 0xE5, 0x1C, 0xFF, 0x2F, 0xE1, 0x81, 0xE0, 0x7F, 0x3, 0x0, 0xC0, 0x9F, 0xE5, 0x1C, 0xFF, 0x2F, 0xE1, 0x8B, 0x84, 0x7F, 0x3, 0x0, 0xC0, 0x9F, 0xE5, 0x1C,
+0xFF, 0x2F, 0xE1, 0x59, 0xE2, 0x7F, 0x3, 0x0, 0xC0, 0x9F, 0xE5, 0x1C, 0xFF, 0x2F, 0xE1, 0x29, 0xE4, 0x7F, 0x3, 0x0, 0xC0, 0x9F, 0xE5, 0x1C, 0xFF, 0x2F, 0xE1, 0x81, 0xD4, 0x7F, 0x3, 0x0, 0xC0, 0x9F, 0xE5,
+0x1C, 0xFF, 0x2F, 0xE1, 0xF, 0x85, 0x7F, 0x3, 0x0, 0xC0, 0x9F, 0xE5, 0x1C, 0xFF, 0x2F, 0xE1, 0xDD, 0xDF, 0x7F, 0x3, 0x0, 0xC0, 0x9F, 0xE5, 0x1C, 0xFF, 0x2F, 0xE1, 0x65, 0xDF, 0x7F, 0x3, 0x0, 0xC0, 0x9F,
+0xE5, 0x1C, 0xFF, 0x2F, 0xE1, 0x5D, 0xD5, 0x7F, 0x3, 0x0, 0xC0, 0x9F, 0xE5, 0x1C, 0xFF, 0x2F, 0xE1, 0xE9, 0xCA, 0x7F, 0x3, 0x0, 0xC0, 0x9F, 0xE5, 0x1C, 0xFF, 0x2F, 0xE1, 0x6D, 0xE5, 0x7F, 0x3, 0xD, 0xC0,
+0xA0, 0xE1, 0xF8, 0xDF, 0x2D, 0xE9, 0x4, 0xB0, 0x4C, 0xE2, 0x28, 0xD0, 0x4B, 0xE2, 0xF0, 0x6F, 0x9D, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x30, 0x81, 0x7F, 0x3, 0xF0, 0x80, 0x7F, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, };
--- /dev/null
+const u8 arm9_bin[] = {
+0x1, 0x3, 0xA0, 0xE3, 0x8, 0x2, 0x80, 0xE5, 0x30, 0x12, 0x9F, 0xE5, 0xC1, 0xF, 0x80, 0xE2, 0xB0, 0x10, 0xC0, 0xE1, 0x28, 0x12, 0x9F, 0xE5, 0x10, 0x1F, 0x1, 0xEE, 0x0, 0x0, 0xA0, 0xE3, 0x15, 0xF, 0x7,
+0xEE, 0x16, 0xF, 0x7, 0xEE, 0x9A, 0xF, 0x7, 0xEE, 0x14, 0x2, 0x9F, 0xE5, 0xA, 0x0, 0x80, 0xE3, 0x11, 0xF, 0x9, 0xEE, 0x20, 0x0, 0xA0, 0xE3, 0x31, 0xF, 0x9, 0xEE, 0x4, 0x2, 0x9F, 0xE5, 0x10, 0xF, 0x6,
+0xEE, 0x0, 0x2, 0x9F, 0xE5, 0x11, 0xF, 0x6, 0xEE, 0xFC, 0x1, 0x9F, 0xE5, 0x12, 0xF, 0x6, 0xEE, 0xF8, 0x1, 0x9F, 0xE5, 0x13, 0xF, 0x6, 0xEE, 0xE0, 0x1, 0x9F, 0xE5, 0x1B, 0x0, 0x80, 0xE3, 0x14, 0xF, 0x6,
+0xEE, 0xE8, 0x1, 0x9F, 0xE5, 0x1D, 0x0, 0x80, 0xE3, 0x15, 0xF, 0x6, 0xEE, 0xE0, 0x1, 0x9F, 0xE5, 0x16, 0xF, 0x6, 0xEE, 0xDC, 0x1, 0x9F, 0xE5, 0x17, 0xF, 0x6, 0xEE, 0x2, 0x0, 0xA0, 0xE3, 0x10, 0xF, 0x3,
+0xEE, 0x42, 0x0, 0xA0, 0xE3, 0x10, 0xF, 0x2, 0xEE, 0x30, 0xF, 0x2, 0xEE, 0xC4, 0x1, 0x9F, 0xE5, 0x70, 0xF, 0x5, 0xEE, 0xC0, 0x1, 0x9F, 0xE5, 0x50, 0xF, 0x5, 0xEE, 0x10, 0xF, 0x11, 0xEE, 0xB8, 0x11, 0x9F,
+0xE5, 0x1, 0x0, 0x80, 0xE1, 0x10, 0xF, 0x1, 0xEE, 0x12, 0x0, 0xA0, 0xE3, 0x0, 0xF0, 0x29, 0xE1, 0xA8, 0xD1, 0x9F, 0xE5, 0x13, 0x0, 0xA0, 0xE3, 0x0, 0xF0, 0x29, 0xE1, 0xA0, 0xD1, 0x9F, 0xE5, 0x1F, 0x0,
+0xA0, 0xE3, 0x0, 0xF0, 0x29, 0xE1, 0x98, 0xD1, 0x9F, 0xE5, 0x98, 0x11, 0x9F, 0xE5, 0x70, 0x21, 0x9F, 0xE5, 0x94, 0x41, 0x9F, 0xE5, 0x49, 0x0, 0x0, 0xEB, 0x90, 0x11, 0x9F, 0xE5, 0x4C, 0x21, 0x9F, 0xE5,
+0x8C, 0x41, 0x9F, 0xE5, 0x45, 0x0, 0x0, 0xEB, 0x1C, 0x0, 0x0, 0xEB, 0x84, 0x1, 0x9F, 0xE5, 0x84, 0x11, 0x9F, 0xE5, 0x0, 0x10, 0x41, 0xE0, 0x37, 0x0, 0x0, 0xEB, 0x7C, 0x1, 0x9F, 0xE5, 0x7C, 0x11, 0x9F,
+0xE5, 0x0, 0x10, 0x41, 0xE0, 0x33, 0x0, 0x0, 0xEB, 0x74, 0x11, 0x9F, 0xE5, 0x74, 0x1, 0x9F, 0xE5, 0x0, 0x0, 0x81, 0xE5, 0x70, 0x31, 0x9F, 0xE5, 0x33, 0xFF, 0x2F, 0xE1, 0x6C, 0x31, 0x9F, 0xE5, 0x33, 0xFF,
+0x2F, 0xE1, 0x68, 0x1, 0x9F, 0xE5, 0x14, 0x20, 0x90, 0xE5, 0x64, 0x11, 0x9F, 0xE5, 0x0, 0x20, 0x81, 0xE5, 0x10, 0x10, 0x90, 0xE5, 0xC, 0x0, 0x90, 0xE5, 0x58, 0x31, 0x9F, 0xE5, 0x33, 0xFF, 0x2F, 0xE1,
+0x54, 0x1, 0x9F, 0xE5, 0x0, 0x0, 0x90, 0xE5, 0x50, 0x11, 0x9F, 0xE5, 0x0, 0x0, 0x81, 0xE5, 0x11, 0xFF, 0x2F, 0xE1, 0xFE, 0xFF, 0xFF, 0xEA, 0x30, 0x1, 0x9F, 0xE5, 0x0, 0x10, 0xA0, 0xE3, 0xC, 0x10, 0x80,
+0xE5, 0x10, 0x10, 0x80, 0xE5, 0x0, 0x10, 0x90, 0xE5, 0x30, 0x21, 0x9F, 0xE5, 0x2, 0x0, 0x51, 0xE1, 0x1E, 0xFF, 0x2F, 0x11, 0x4, 0x10, 0x90, 0xE5, 0x8, 0x20, 0x90, 0xE5, 0x20, 0x31, 0x9F, 0xE5, 0x4, 0x30,
+0x80, 0xE5, 0x0, 0x0, 0x52, 0xE3, 0x1, 0x40, 0x53, 0x10, 0x1E, 0xFF, 0x2F, 0x1, 0x4, 0x0, 0x52, 0x81, 0x4, 0x0, 0x0, 0x8A, 0x1, 0x40, 0xD1, 0xE4, 0x1, 0x40, 0xC3, 0xE4, 0x1, 0x20, 0x52, 0xE2, 0xFB, 0xFF,
+0xFF, 0x1A, 0x3, 0x0, 0x0, 0xEA, 0x1, 0x20, 0x52, 0xE2, 0x2, 0x40, 0xD1, 0xE7, 0x2, 0x40, 0xC3, 0xE7, 0xFB, 0xFF, 0xFF, 0x1A, 0x0, 0x40, 0x2D, 0xE9, 0xE0, 0x30, 0x9F, 0xE5, 0x33, 0xFF, 0x2F, 0xE1, 0x0,
+0x40, 0xBD, 0xE8, 0x1E, 0xFF, 0x2F, 0xE1, 0x3, 0x20, 0xA0, 0xE3, 0x2, 0x10, 0x81, 0xE0, 0x2, 0x10, 0xD1, 0xE1, 0x1E, 0xFF, 0x2F, 0x1, 0x0, 0x20, 0xA0, 0xE3, 0x4, 0x0, 0xA0, 0xE8, 0x4, 0x10, 0x51, 0xE2,
+0xFC, 0xFF, 0xFF, 0x1A, 0x1E, 0xFF, 0x2F, 0xE1, 0x2, 0x30, 0x44, 0xE0, 0x3, 0x0, 0xA0, 0xE3, 0x0, 0x30, 0x83, 0xE0, 0x0, 0x30, 0xD3, 0xE1, 0x1E, 0xFF, 0x2F, 0x1, 0x1, 0x0, 0xB1, 0xE8, 0x1, 0x0, 0xA2,
+0xE8, 0x4, 0x30, 0x53, 0xE2, 0xFB, 0xFF, 0xFF, 0x1A, 0x1E, 0xFF, 0x2F, 0xE1, 0x3, 0x82, 0x0, 0x0, 0x78, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xB, 0x33, 0x0, 0x0, 0x4, 0x2B, 0x0, 0x0, 0x2, 0x1D, 0x80, 0x7F,
+0x3, 0x35, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x1, 0x1D, 0x0, 0xFF, 0xFF, 0x2B, 0x0, 0x40, 0x2, 0x33, 0x63, 0x63, 0x36, 0x33, 0x33, 0x33, 0x36, 0x5, 0x10, 0x5, 0x0, 0x0, 0x3E, 0x0, 0xB, 0x0, 0x3F, 0x0, 0xB,
+0x0, 0x3D, 0x0, 0xB, 0xDC, 0x6E, 0x0, 0x2, 0x90, 0x1, 0x0, 0x1, 0xDC, 0x6E, 0x0, 0x2, 0x0, 0x0, 0x0, 0xB, 0xDC, 0x6E, 0x0, 0x2, 0x48, 0x86, 0x0, 0x2, 0x0, 0x0, 0x0, 0xB, 0x0, 0x0, 0x0, 0xB, 0xF4, 0x6F,
+0x0, 0x2, 0x0, 0xF0, 0x3F, 0x2, 0x4D, 0x3E, 0x0, 0x2, 0xC1, 0x19, 0x0, 0x2, 0x70, 0xFF, 0x7F, 0x2, 0xF8, 0x6F, 0x0, 0x2, 0xAD, 0xA, 0x0, 0x2, 0x74, 0x1, 0x0, 0x2, 0x78, 0xFE, 0x7F, 0x2, 0x67, 0x72, 0x61,
+0x5F, 0x48, 0x86, 0x0, 0x2, 0x1D, 0x4B, 0x0, 0x2, 0xF8, 0xB5, 0xC0, 0x46, 0xF8, 0xBC, 0x8, 0xBC, 0x9E, 0x46, 0x70, 0x47, 0x0, 0x0, 0x0, 0x0, 0x10, 0xB5, 0x7, 0x4C, 0x23, 0x78, 0x0, 0x2B, 0x7, 0xD1, 0x6,
+0x4B, 0x0, 0x2B, 0x2, 0xD0, 0x5, 0x48, 0x0, 0xE0, 0x0, 0xBF, 0x1, 0x23, 0x23, 0x70, 0x10, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0xDC, 0x6E, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x38, 0x66, 0x0, 0x2, 0x0, 0xB5, 0xA, 0x4B,
+0x81, 0xB0, 0x0, 0x2B, 0x3, 0xD0, 0x9, 0x48, 0x9, 0x49, 0x0, 0xE0, 0x0, 0xBF, 0x9, 0x48, 0x3, 0x68, 0x0, 0x2B, 0x4, 0xD0, 0x8, 0x4B, 0x0, 0x2B, 0x1, 0xD0, 0x0, 0xF0, 0xE, 0xF8, 0x1, 0xB0, 0x1, 0xBC, 0x0,
+0x47, 0xC0, 0x46, 0x0, 0x0, 0x0, 0x0, 0x38, 0x66, 0x0, 0x2, 0xE0, 0x6E, 0x0, 0x2, 0x3C, 0x66, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x18, 0x47, 0xC0, 0x46, 0x10, 0xB5, 0x1, 0x23, 0x4, 0x1C, 0x9C, 0x43, 0x22,
+0x88, 0x18, 0x42, 0x7, 0xD1, 0xFF, 0x23, 0x1B, 0x2, 0x13, 0x40, 0x5B, 0x18, 0x1B, 0x4, 0x19, 0xC, 0x21, 0x80, 0x10, 0xBD, 0xFF, 0x23, 0x13, 0x40, 0xA, 0x2, 0x9B, 0x18, 0x1B, 0x4, 0x19, 0xC, 0xF6, 0xE7,
+0xF0, 0xB5, 0x5F, 0x46, 0x56, 0x46, 0x4D, 0x46, 0x44, 0x46, 0xF0, 0xB4, 0x8A, 0x78, 0xCB, 0x78, 0x12, 0x2, 0x1B, 0x4, 0xD2, 0x18, 0x4B, 0x78, 0x4, 0x31, 0xD6, 0x18, 0x83, 0xB0, 0x5, 0x1C, 0x8C, 0x46,
+0x0, 0x2E, 0x38, 0xDD, 0xFF, 0x22, 0x1, 0x20, 0x13, 0x2, 0x80, 0x46, 0x9B, 0x46, 0x67, 0x46, 0x3F, 0x78, 0x1, 0x20, 0x0, 0x22, 0xB9, 0x46, 0x84, 0x44, 0x92, 0x46, 0x13, 0xE0, 0xFF, 0x27, 0x12, 0x2, 0x3B,
+0x40, 0x9B, 0x18, 0x1B, 0x4, 0x1A, 0xC, 0x1, 0x3E, 0xA, 0x80, 0x1, 0x35, 0x0, 0x2E, 0x20, 0xD0, 0x1, 0x22, 0x92, 0x44, 0x53, 0x46, 0x8, 0x2B, 0x50, 0xD0, 0x4F, 0x46, 0x7B, 0x6, 0x1B, 0xE, 0x99, 0x46,
+0x4F, 0x46, 0x3B, 0x6, 0x0, 0x2B, 0x1A, 0xDB, 0x29, 0x1C, 0x40, 0x46, 0x63, 0x46, 0x1, 0x27, 0x81, 0x43, 0x1A, 0x78, 0xBC, 0x44, 0xB, 0x88, 0x5, 0x42, 0xDD, 0xD1, 0x58, 0x46, 0x3, 0x40, 0x9B, 0x18, 0x1B,
+0x4, 0x1A, 0xC, 0x1, 0x3E, 0xA, 0x80, 0x1, 0x35, 0x0, 0x2E, 0xDE, 0xD1, 0x3, 0xB0, 0x3C, 0xBC, 0x90, 0x46, 0x99, 0x46, 0xA2, 0x46, 0xAB, 0x46, 0xF0, 0xBD, 0x60, 0x46, 0x3, 0x78, 0xF, 0x22, 0x19, 0x9,
+0x13, 0x40, 0x42, 0x78, 0x1B, 0x2, 0x9B, 0x18, 0x2, 0x27, 0xDB, 0x43, 0x3, 0x31, 0xBC, 0x44, 0xEC, 0x18, 0x0, 0x20, 0x1, 0x91, 0xF, 0xE0, 0xFF, 0x27, 0x12, 0x2, 0x3B, 0x40, 0x9B, 0x18, 0x1B, 0x4, 0x1A,
+0xC, 0x1, 0x3E, 0xA, 0x80, 0x1, 0x35, 0x0, 0x2E, 0xDD, 0xD0, 0x1, 0x9A, 0x1, 0x30, 0x1, 0x34, 0x90, 0x42, 0xB7, 0xD0, 0x43, 0x46, 0x29, 0x1C, 0x99, 0x43, 0x47, 0x46, 0x22, 0x78, 0xB, 0x88, 0x3D, 0x42,
+0xE7, 0xD1, 0x5F, 0x46, 0x3B, 0x40, 0x9B, 0x18, 0x1B, 0x4, 0x1A, 0xC, 0xE7, 0xE7, 0x0, 0x2E, 0x94, 0xDC, 0xC7, 0xE7, 0x2, 0x4B, 0x1A, 0x68, 0x80, 0x18, 0x18, 0x60, 0x10, 0x1C, 0x70, 0x47, 0x14, 0x6F,
+0x0, 0x2, 0xF0, 0xB5, 0x10, 0x4B, 0x6, 0x1C, 0x10, 0x1C, 0xD, 0x1C, 0x1C, 0x68, 0x1, 0x78, 0xE, 0x4B, 0x1A, 0x68, 0x0, 0x29, 0x14, 0xD0, 0x6B, 0x1, 0x9B, 0x19, 0x5B, 0x0, 0xE7, 0x18, 0x80, 0x25, 0xC0,
+0x24, 0xD6, 0x18, 0xED, 0x1, 0x0, 0x22, 0xE4, 0x1, 0xB, 0x1C, 0x2B, 0x43, 0xBB, 0x52, 0x3, 0x78, 0x1, 0x30, 0x23, 0x43, 0xB3, 0x52, 0x1, 0x78, 0x2, 0x32, 0x0, 0x29, 0xF4, 0xD1, 0xF0, 0xBD, 0xC0, 0x46,
+0xC, 0x72, 0x0, 0x2, 0x14, 0x72, 0x0, 0x2, 0x10, 0xB5, 0x8, 0x4B, 0x49, 0x1, 0x1C, 0x68, 0x7, 0x4B, 0x9, 0x18, 0x18, 0x68, 0x80, 0x23, 0xDB, 0x1, 0x49, 0x0, 0x13, 0x43, 0x43, 0x52, 0xC0, 0x23, 0xDB, 0x1,
+0x1A, 0x43, 0x62, 0x52, 0x10, 0xBD, 0xC0, 0x46, 0x14, 0x72, 0x0, 0x2, 0xC, 0x72, 0x0, 0x2, 0x0, 0xB5, 0x6, 0x4A, 0x0, 0x23, 0x13, 0x60, 0x5, 0x4A, 0x13, 0x68, 0x1, 0x3B, 0x13, 0x60, 0x0, 0x2B, 0x1, 0xDA,
+0x4, 0x23, 0x13, 0x60, 0x0, 0xBD, 0xC0, 0x46, 0x1C, 0x6F, 0x0, 0x2, 0x18, 0x6F, 0x0, 0x2, 0x0, 0xB5, 0x5, 0x4B, 0x5, 0x4A, 0x0, 0x21, 0x19, 0x60, 0x13, 0x68, 0x1, 0x33, 0x13, 0x60, 0x4, 0x2B, 0x0, 0xDD,
+0x11, 0x60, 0x0, 0xBD, 0x1C, 0x6F, 0x0, 0x2, 0x18, 0x6F, 0x0, 0x2, 0x10, 0xB5, 0x7, 0x4A, 0x1, 0x23, 0x13, 0x60, 0x6, 0x4B, 0x7, 0x4A, 0x1B, 0x68, 0x0, 0x21, 0x9B, 0x0, 0x9B, 0x58, 0x4, 0x1C, 0x98, 0x47,
+0x4, 0x4B, 0x1C, 0x60, 0x10, 0xBD, 0xC0, 0x46, 0x1C, 0x6F, 0x0, 0x2, 0x18, 0x6F, 0x0, 0x2, 0x50, 0x66, 0x0, 0x2, 0x20, 0x6F, 0x0, 0x2, 0x0, 0xB5, 0xB, 0x4B, 0x81, 0xB0, 0x1B, 0x68, 0x0, 0x2B, 0x3, 0xD0,
+0x9, 0x4B, 0x19, 0x68, 0x81, 0x42, 0x1, 0xD0, 0x1, 0xB0, 0x0, 0xBD, 0x7, 0x4B, 0x8, 0x4A, 0x1B, 0x68, 0x9B, 0x0, 0x9B, 0x58, 0x0, 0x2B, 0xF6, 0xD0, 0x8, 0x1C, 0x1, 0x21, 0x98, 0x47, 0xF2, 0xE7, 0xC0,
+0x46, 0x1C, 0x6F, 0x0, 0x2, 0x20, 0x6F, 0x0, 0x2, 0x18, 0x6F, 0x0, 0x2, 0x64, 0x66, 0x0, 0x2, 0x0, 0xB5, 0x6, 0x4B, 0x1A, 0x68, 0x0, 0x2A, 0x3, 0xD1, 0x5, 0x4B, 0x1B, 0x68, 0x98, 0x42, 0x0, 0xD0, 0x0,
+0xBD, 0x3, 0x4B, 0x1A, 0x60, 0xFB, 0xE7, 0xC0, 0x46, 0x24, 0x6F, 0x0, 0x2, 0x20, 0x6F, 0x0, 0x2, 0x1C, 0x6F, 0x0, 0x2, 0x0, 0xB5, 0x19, 0x49, 0xB, 0x68, 0x0, 0x2B, 0xD, 0xD0, 0x5A, 0x1E, 0xA, 0x60, 0x0,
+0x2A, 0x9, 0xD1, 0x16, 0x4B, 0x1A, 0x60, 0x16, 0x4B, 0x16, 0x4A, 0x1B, 0x68, 0x3, 0x33, 0x1B, 0x1, 0x13, 0x80, 0x44, 0x23, 0xA, 0xE0, 0x12, 0x4B, 0x12, 0x4A, 0x1B, 0x68, 0x3, 0x33, 0x1B, 0x1, 0x13, 0x80,
+0xE, 0x4B, 0x1B, 0x68, 0x0, 0x2B, 0x14, 0xD0, 0x45, 0x23, 0xE, 0x49, 0x0, 0x22, 0xB, 0x80, 0xE, 0x4B, 0x1A, 0x80, 0x4, 0x3B, 0x1B, 0x88, 0xD, 0x4A, 0x9B, 0x18, 0xD, 0x4A, 0x13, 0x80, 0xB, 0x88, 0x2, 0x32,
+0x1, 0x33, 0x13, 0x80, 0x80, 0x23, 0x5B, 0x1, 0x2, 0x32, 0x13, 0x80, 0x0, 0xBD, 0x44, 0x23, 0xE9, 0xE7, 0x24, 0x6F, 0x0, 0x2, 0x1C, 0x6F, 0x0, 0x2, 0x18, 0x6F, 0x0, 0x2, 0x0, 0x4, 0x0, 0x7, 0x2, 0x4,
+0x0, 0x7, 0x4, 0x4, 0x0, 0x7, 0x1, 0x4, 0x0, 0x0, 0x8, 0x4, 0x0, 0x7, 0xF0, 0xB5, 0x5F, 0x46, 0x56, 0x46, 0x4D, 0x46, 0x44, 0x46, 0xF0, 0xB4, 0xE7, 0x48, 0x81, 0xB0, 0x3, 0x68, 0x83, 0x46, 0xD9, 0x7,
+0x4, 0xD5, 0xE5, 0x4B, 0x1B, 0x68, 0x0, 0x2B, 0x0, 0xD0, 0x83, 0xE1, 0x59, 0x46, 0xB, 0x68, 0x9A, 0x7, 0x4, 0xD5, 0xE2, 0x4B, 0x1B, 0x68, 0x0, 0x2B, 0x0, 0xD0, 0x20, 0xE1, 0x59, 0x46, 0xB, 0x68, 0x5A,
+0x7, 0x0, 0xD5, 0x6A, 0xE1, 0x58, 0x46, 0x3, 0x68, 0x19, 0x7, 0x48, 0xD5, 0xDC, 0x4B, 0x1A, 0x68, 0x64, 0x23, 0x53, 0x43, 0x80, 0x22, 0x92, 0x0, 0x9B, 0x18, 0x9B, 0x12, 0x99, 0x46, 0x63, 0x2B, 0x0, 0xDD,
+0xF2, 0xE0, 0xD7, 0x4F, 0x85, 0x20, 0x39, 0x68, 0xD6, 0x4E, 0x80, 0x0, 0x9, 0x18, 0x85, 0x22, 0x30, 0x68, 0x80, 0x23, 0xDB, 0x1, 0x92, 0x0, 0x83, 0x52, 0xC0, 0x23, 0xDB, 0x1, 0xB, 0x80, 0xA, 0x21, 0x48,
+0x46, 0x2, 0xF0, 0x26, 0xFD, 0xA, 0x21, 0x2, 0xF0, 0x6D, 0xFD, 0x36, 0x68, 0x30, 0x31, 0x3F, 0x68, 0x9, 0x6, 0xB2, 0x46, 0x9, 0xE, 0xCB, 0x4C, 0x80, 0x26, 0xC0, 0x25, 0xC9, 0x4B, 0xB8, 0x46, 0xF6, 0x1,
+0xA, 0x1C, 0xED, 0x1, 0x44, 0x44, 0x32, 0x43, 0x50, 0x46, 0x29, 0x43, 0xC2, 0x52, 0x21, 0x80, 0x86, 0x21, 0x89, 0x0, 0x88, 0x44, 0x48, 0x46, 0xA, 0x21, 0x2, 0xF0, 0x52, 0xFD, 0x30, 0x31, 0x9, 0x6, 0x9,
+0xE, 0xB, 0x1C, 0x86, 0x24, 0x33, 0x43, 0xA4, 0x0, 0x52, 0x46, 0x13, 0x53, 0x29, 0x43, 0x43, 0x46, 0x19, 0x80, 0x58, 0x46, 0x3, 0x68, 0xD9, 0x6, 0x48, 0xD5, 0xB9, 0x4B, 0x1A, 0x68, 0x64, 0x23, 0x53, 0x43,
+0x80, 0x22, 0x92, 0x0, 0x9B, 0x18, 0x9B, 0x12, 0x99, 0x46, 0x63, 0x2B, 0x0, 0xDD, 0x8C, 0xE0, 0xB0, 0x4F, 0xA5, 0x20, 0x39, 0x68, 0xB0, 0x4E, 0x80, 0x0, 0x9, 0x18, 0xA5, 0x22, 0x30, 0x68, 0x80, 0x23,
+0xDB, 0x1, 0x92, 0x0, 0x83, 0x52, 0xC0, 0x23, 0xDB, 0x1, 0xB, 0x80, 0xA, 0x21, 0x48, 0x46, 0x2, 0xF0, 0xD9, 0xFC, 0xA, 0x21, 0x2, 0xF0, 0x20, 0xFD, 0x36, 0x68, 0x30, 0x31, 0x3F, 0x68, 0x9, 0x6, 0xB2,
+0x46, 0x9, 0xE, 0xA6, 0x4C, 0x80, 0x26, 0xC0, 0x25, 0xA5, 0x4B, 0xB8, 0x46, 0xF6, 0x1, 0xA, 0x1C, 0xED, 0x1, 0x44, 0x44, 0x32, 0x43, 0x50, 0x46, 0x29, 0x43, 0xC2, 0x52, 0x21, 0x80, 0xA6, 0x21, 0x89, 0x0,
+0x88, 0x44, 0x48, 0x46, 0xA, 0x21, 0x2, 0xF0, 0x5, 0xFD, 0x30, 0x31, 0x9, 0x6, 0x9, 0xE, 0xB, 0x1C, 0xA6, 0x24, 0x33, 0x43, 0xA4, 0x0, 0x52, 0x46, 0x13, 0x53, 0x29, 0x43, 0x43, 0x46, 0x19, 0x80, 0x58,
+0x46, 0x3, 0x68, 0x99, 0x6, 0x41, 0xD5, 0x95, 0x4A, 0xFA, 0x23, 0x12, 0x68, 0x9B, 0x0, 0x53, 0x43, 0x9B, 0x12, 0x98, 0x46, 0x8C, 0x4B, 0x40, 0x46, 0x1B, 0x68, 0xA, 0x21, 0x9A, 0x46, 0x2, 0xF0, 0xE7, 0xFC,
+0x8A, 0x4B, 0x30, 0x31, 0x1B, 0x68, 0x9, 0x6, 0x9, 0xE, 0xC6, 0x25, 0x80, 0x27, 0xC0, 0x26, 0x99, 0x46, 0xFF, 0x1, 0xB, 0x1C, 0xF6, 0x1, 0xC6, 0x24, 0xAD, 0x0, 0x3B, 0x43, 0x4A, 0x46, 0xA4, 0x0, 0x55,
+0x44, 0x31, 0x43, 0x13, 0x53, 0x40, 0x46, 0x29, 0x80, 0xA, 0x21, 0x2, 0xF0, 0x84, 0xFC, 0xA, 0x21, 0x2, 0xF0, 0xCB, 0xFC, 0x30, 0x31, 0x9, 0x6, 0x9, 0xE, 0xC5, 0x25, 0xB, 0x1C, 0xC5, 0x24, 0xAD, 0x0,
+0x31, 0x43, 0xA4, 0x0, 0x55, 0x44, 0x3B, 0x43, 0x48, 0x46, 0x3, 0x53, 0x29, 0x80, 0x41, 0x46, 0x63, 0x29, 0x0, 0xDD, 0xFA, 0xE0, 0x78, 0x4A, 0x77, 0x4B, 0x52, 0x44, 0x48, 0x46, 0xC7, 0x52, 0x16, 0x80,
+0x59, 0x46, 0x0, 0x23, 0x1, 0xB0, 0xB, 0x60, 0x3C, 0xBC, 0x90, 0x46, 0x99, 0x46, 0xA2, 0x46, 0xAB, 0x46, 0xF0, 0xBD, 0x6A, 0x4F, 0xA5, 0x23, 0x3D, 0x68, 0x9B, 0x0, 0x48, 0x46, 0x64, 0x21, 0xED, 0x18,
+0x2, 0xF0, 0x56, 0xFC, 0x66, 0x4E, 0x30, 0x30, 0x0, 0x6, 0x80, 0x23, 0x0, 0xE, 0xA5, 0x24, 0x32, 0x68, 0xDB, 0x1, 0x3, 0x43, 0xA4, 0x0, 0x13, 0x53, 0xC0, 0x23, 0xDB, 0x1, 0x18, 0x43, 0x28, 0x80, 0x68,
+0xE7, 0x5D, 0x4F, 0x85, 0x23, 0x3D, 0x68, 0x9B, 0x0, 0x48, 0x46, 0x64, 0x21, 0xED, 0x18, 0x2, 0xF0, 0x3D, 0xFC, 0x5A, 0x4E, 0x30, 0x30, 0x0, 0x6, 0x80, 0x23, 0x0, 0xE, 0x85, 0x24, 0x32, 0x68, 0xDB, 0x1,
+0x3, 0x43, 0xA4, 0x0, 0x13, 0x53, 0xC0, 0x23, 0xDB, 0x1, 0x18, 0x43, 0x28, 0x80, 0x2, 0xE7, 0x51, 0x4B, 0xA, 0x21, 0x1B, 0x68, 0x8C, 0x25, 0x99, 0x46, 0x55, 0x4B, 0x80, 0x27, 0x1B, 0x68, 0xC0, 0x26, 0x18,
+0x1C, 0x98, 0x46, 0x2, 0xF0, 0x20, 0xFC, 0xA, 0x21, 0x2, 0xF0, 0x67, 0xFC, 0x4A, 0x4B, 0x30, 0x31, 0x1B, 0x68, 0x9, 0x6, 0x9, 0xE, 0x9A, 0x46, 0xFF, 0x1, 0xB, 0x1C, 0xF6, 0x1, 0x8C, 0x24, 0x6D, 0x0, 0x3B,
+0x43, 0x64, 0x0, 0x4D, 0x44, 0x50, 0x46, 0x31, 0x43, 0x3, 0x53, 0x29, 0x80, 0x40, 0x46, 0xA, 0x21, 0x2, 0xF0, 0x51, 0xFC, 0x30, 0x31, 0x9, 0x6, 0x9, 0xE, 0xB, 0x1C, 0x8D, 0x24, 0x8D, 0x25, 0x3B, 0x43,
+0x64, 0x0, 0x6D, 0x0, 0x52, 0x46, 0x13, 0x53, 0x4D, 0x44, 0x31, 0x43, 0x43, 0x46, 0x29, 0x80, 0x64, 0x2B, 0x0, 0xDC, 0x98, 0xE0, 0x64, 0x21, 0x40, 0x46, 0x2, 0xF0, 0xF1, 0xFB, 0x30, 0x30, 0x0, 0x6, 0x0,
+0xE, 0x3, 0x1C, 0x8B, 0x24, 0x3B, 0x43, 0x51, 0x46, 0x64, 0x0, 0xB, 0x53, 0x8B, 0x25, 0x59, 0x46, 0x6D, 0x0, 0xB, 0x68, 0x4D, 0x44, 0x30, 0x43, 0x28, 0x80, 0x5A, 0x7, 0x0, 0xD4, 0x94, 0xE6, 0x31, 0x4B,
+0xC, 0x20, 0x1A, 0x68, 0x6, 0x21, 0x53, 0x0, 0x9B, 0x18, 0x2F, 0x4A, 0xD2, 0x18, 0xFF, 0xF7, 0x7E, 0xFD, 0x89, 0xE6, 0x24, 0x4B, 0xA, 0x21, 0x1B, 0x68, 0x80, 0x26, 0x1C, 0x1C, 0x9A, 0x46, 0x2B, 0x4B,
+0xC0, 0x25, 0x1F, 0x68, 0xF6, 0x1, 0x38, 0x1C, 0x2, 0xF0, 0xC6, 0xFB, 0xA, 0x21, 0x2, 0xF0, 0xD, 0xFC, 0x1D, 0x4B, 0x30, 0x31, 0x1B, 0x68, 0x9, 0x6, 0x9, 0xE, 0x98, 0x46, 0xA, 0x1C, 0xED, 0x1, 0x32, 0x43,
+0x98, 0x23, 0x98, 0x34, 0x40, 0x46, 0x29, 0x43, 0xC2, 0x52, 0x21, 0x80, 0x38, 0x1C, 0xA, 0x21, 0x2, 0xF0, 0xFA, 0xFB, 0x30, 0x31, 0x9, 0x6, 0x9, 0xE, 0xA, 0x1C, 0x2, 0x34, 0x32, 0x43, 0x9A, 0x23, 0x40,
+0x46, 0x29, 0x43, 0xC2, 0x52, 0x21, 0x80, 0x64, 0x2F, 0x3F, 0xDD, 0x64, 0x21, 0x38, 0x1C, 0x2, 0xF0, 0x9F, 0xFB, 0x30, 0x30, 0x0, 0x6, 0x0, 0xE, 0x2, 0x1C, 0x4, 0x3C, 0x32, 0x43, 0x96, 0x23, 0x41, 0x46,
+0x28, 0x43, 0xCA, 0x52, 0x20, 0x80, 0x3B, 0xE6, 0xC0, 0x46, 0x4C, 0x66, 0x0, 0x2, 0xC, 0x6F, 0x0, 0x2, 0x10, 0x6F, 0x0, 0x2, 0x44, 0x66, 0x0, 0x2, 0x14, 0x72, 0x0, 0x2, 0xC, 0x72, 0x0, 0x2, 0x16, 0x2,
+0x0, 0x0, 0x48, 0x66, 0x0, 0x2, 0x96, 0x2, 0x0, 0x0, 0x4, 0x6F, 0x0, 0x2, 0x12, 0x3, 0x0, 0x0, 0xFC, 0x6E, 0x0, 0x2, 0x0, 0x6F, 0x0, 0x2, 0x6C, 0x65, 0x0, 0x2, 0xF8, 0x6E, 0x0, 0x2, 0x64, 0x21, 0x40,
+0x46, 0x2, 0xF0, 0x70, 0xFB, 0x30, 0x30, 0x0, 0x6, 0x0, 0xE, 0xD, 0x4C, 0x2, 0x1C, 0xC, 0x4B, 0x54, 0x44, 0x3A, 0x43, 0x49, 0x46, 0x30, 0x43, 0xCA, 0x52, 0x20, 0x80, 0xF9, 0xE6, 0x52, 0x46, 0x96, 0x32,
+0x96, 0x23, 0x40, 0x46, 0xC6, 0x52, 0x15, 0x80, 0x4, 0xE6, 0x8B, 0x22, 0x8B, 0x23, 0x52, 0x0, 0x5B, 0x0, 0x4A, 0x44, 0x50, 0x46, 0xC7, 0x52, 0x16, 0x80, 0x4, 0xE6, 0xC0, 0x46, 0x12, 0x3, 0x0, 0x0, 0x1,
+0x4B, 0x18, 0x60, 0x70, 0x47, 0xC0, 0x46, 0x1C, 0x74, 0x0, 0x2, 0xF0, 0xB5, 0x5F, 0x46, 0x56, 0x46, 0x4D, 0x46, 0x44, 0x46, 0xF0, 0xB4, 0x80, 0x23, 0x0, 0x22, 0xDB, 0x4, 0x1A, 0x60, 0x18, 0x4B, 0x19,
+0x49, 0x1A, 0x60, 0xB, 0x88, 0x18, 0x4A, 0x8D, 0xB0, 0x13, 0x40, 0xB, 0x80, 0x17, 0x4C, 0x2, 0xF0, 0x55, 0xFA, 0x2, 0xF0, 0x3F, 0xF9, 0x16, 0x49, 0x0, 0x22, 0xB, 0x20, 0x2, 0xF0, 0xF0, 0xF8, 0x20, 0x1C,
+0x0, 0xF0, 0xF9, 0xFD, 0x23, 0x88, 0x12, 0x4F, 0x13, 0x4D, 0x3B, 0x60, 0x13, 0x4B, 0x1B, 0x88, 0x2B, 0x60, 0x0, 0x2B, 0x7, 0xD0, 0x0, 0x24, 0x20, 0x1C, 0x0, 0xF0, 0x30, 0xFE, 0x2B, 0x68, 0x1, 0x34, 0xA3,
+0x42, 0xF8, 0xDC, 0x3B, 0x68, 0x0, 0x2B, 0x0, 0xDC, 0x2D, 0xE3, 0xB, 0x48, 0xC, 0x49, 0x0, 0x24, 0x0, 0x25, 0xB, 0x4E, 0x80, 0x46, 0x8A, 0x46, 0x1A, 0xE0, 0x0, 0x10, 0x0, 0x4, 0x4, 0x3, 0x0, 0x4, 0xFF,
+0x7F, 0x0, 0x0, 0x0, 0x0, 0x1, 0x2, 0xA1, 0xA, 0x0, 0x2, 0x10, 0x6F, 0x0, 0x2, 0xC, 0x6F, 0x0, 0x2, 0x2, 0x0, 0x1, 0x2, 0x18, 0x72, 0x0, 0x2, 0x6, 0x0, 0x1, 0x2, 0xC, 0x0, 0x1, 0x2, 0x3B, 0x68, 0x1, 0x34,
+0x4, 0x36, 0xA3, 0x42, 0x12, 0xDD, 0x33, 0x68, 0x0, 0x2B, 0xF7, 0xD0, 0x52, 0x46, 0x9B, 0x5C, 0x1, 0x2B, 0xF3, 0xD1, 0x20, 0x1C, 0x0, 0xF0, 0x4F, 0xFE, 0x6B, 0x0, 0x40, 0x46, 0x1C, 0x52, 0x3B, 0x68, 0x1,
+0x34, 0x1, 0x35, 0x4, 0x36, 0xA3, 0x42, 0xEC, 0xDC, 0x3D, 0x60, 0x4, 0x20, 0x1, 0xF0, 0x86, 0xF8, 0xE6, 0x4C, 0xC4, 0x20, 0x23, 0x68, 0xE6, 0x49, 0x80, 0x33, 0x23, 0x60, 0xC0, 0x4, 0xFF, 0xF7, 0xF1, 0xFB,
+0x20, 0x68, 0xEB, 0x21, 0x49, 0x0, 0x43, 0x18, 0xE2, 0x4A, 0x23, 0x60, 0xC4, 0x23, 0x9B, 0x3, 0x10, 0x60, 0xC0, 0x18, 0x40, 0x1, 0xDF, 0x49, 0x91, 0x46, 0xFF, 0xF7, 0xE2, 0xFB, 0x20, 0x68, 0xDE, 0x4F,
+0xC4, 0x21, 0x89, 0x3, 0x43, 0x1D, 0x38, 0x60, 0x40, 0x18, 0x23, 0x60, 0x40, 0x1, 0xDB, 0x49, 0xFF, 0xF7, 0xD6, 0xFB, 0x20, 0x68, 0xDA, 0x4A, 0x83, 0x1D, 0x23, 0x60, 0xC4, 0x23, 0x9B, 0x3, 0x10, 0x60,
+0xC0, 0x18, 0x40, 0x1, 0xD7, 0x49, 0x92, 0x46, 0xFF, 0xF7, 0xC9, 0xFB, 0x22, 0x68, 0x3F, 0x23, 0xB8, 0x46, 0x3F, 0x32, 0xD4, 0x4F, 0x9A, 0x43, 0x3A, 0x60, 0x5, 0x97, 0xC4, 0x27, 0xBF, 0x3, 0xD2, 0x48,
+0xD3, 0x19, 0x5B, 0x1, 0x11, 0x1C, 0x3, 0x60, 0xD0, 0x4B, 0x40, 0x31, 0x40, 0x37, 0x19, 0x60, 0x4, 0x93, 0xCF, 0x4D, 0xD3, 0x19, 0x5B, 0x1, 0x84, 0x46, 0x2B, 0x60, 0x8, 0x1C, 0xCD, 0x4B, 0x40, 0x30, 0x40,
+0x37, 0x18, 0x60, 0x3, 0x93, 0xCB, 0x4E, 0xD3, 0x19, 0x80, 0x31, 0x5B, 0x1, 0x33, 0x60, 0xB, 0x1C, 0x40, 0x33, 0xC9, 0x48, 0x23, 0x60, 0xC9, 0x4B, 0x1, 0x60, 0xD2, 0x18, 0xC8, 0x49, 0x52, 0x1, 0x83, 0x46,
+0x80, 0x20, 0xA, 0x60, 0x1, 0x91, 0x0, 0x22, 0x0, 0x21, 0x0, 0x1, 0x64, 0x46, 0x23, 0x68, 0x1, 0x9F, 0x99, 0x52, 0x33, 0x68, 0x99, 0x52, 0x3B, 0x68, 0x99, 0x52, 0x2, 0x32, 0x82, 0x42, 0xF4, 0xD1, 0x28,
+0x68, 0xBF, 0x49, 0xC0, 0x24, 0xFF, 0xF7, 0x85, 0xFB, 0xE4, 0x0, 0x0, 0x20, 0x29, 0x68, 0x4B, 0x46, 0x9, 0x18, 0x1A, 0x68, 0xB, 0x88, 0x52, 0x10, 0x9B, 0x18, 0x2, 0x30, 0xB, 0x80, 0xA0, 0x42, 0xF4, 0xD1,
+0xB7, 0x4F, 0x0, 0x24, 0xA4, 0x46, 0xB9, 0x46, 0x63, 0x46, 0x5D, 0x0, 0x4F, 0x46, 0x7C, 0x19, 0x0, 0x20, 0x22, 0x88, 0xA0, 0x21, 0xC9, 0x1, 0x47, 0x46, 0x52, 0x18, 0x39, 0x68, 0x33, 0x68, 0x52, 0x18,
+0x1, 0x30, 0x5A, 0x53, 0x24, 0x34, 0x40, 0x35, 0x11, 0x28, 0xF1, 0xD1, 0x1, 0x20, 0x84, 0x44, 0x61, 0x46, 0x12, 0x29, 0xE7, 0xD1, 0xAA, 0x4A, 0x0, 0x26, 0x94, 0x46, 0x60, 0x46, 0x75, 0x0, 0x44, 0x19,
+0x0, 0x20, 0x22, 0x88, 0xC0, 0x27, 0x1, 0x99, 0xFF, 0x1, 0xD2, 0x19, 0x57, 0x46, 0xB, 0x68, 0x39, 0x68, 0x1, 0x30, 0x52, 0x18, 0x5A, 0x53, 0x22, 0x34, 0x40, 0x35, 0x10, 0x28, 0xF0, 0xD1, 0x1, 0x36, 0x11,
+0x2E, 0xE9, 0xD1, 0x9F, 0x4A, 0x9F, 0x4B, 0x1A, 0x60, 0x9F, 0x4A, 0x4, 0x33, 0x1A, 0x60, 0x9F, 0x4A, 0x9F, 0x4B, 0x13, 0x60, 0x13, 0x68, 0x9D, 0x49, 0x0, 0x2B, 0xFB, 0xDB, 0x9D, 0x4A, 0x9E, 0x4B, 0x1A,
+0x80, 0x9E, 0x4A, 0x97, 0x4B, 0x1A, 0x60, 0x9D, 0x4A, 0x4, 0x33, 0x1A, 0x60, 0x9D, 0x4B, 0xA, 0x1C, 0xB, 0x60, 0x13, 0x68, 0x0, 0x2B, 0xFC, 0xDB, 0x9B, 0x4B, 0x9B, 0x4A, 0x0, 0x21, 0x19, 0x80, 0x2, 0x33,
+0x0, 0x20, 0x93, 0x42, 0xFA, 0xD1, 0x5, 0x99, 0x3, 0x9C, 0xA, 0x68, 0x4, 0x9F, 0xD3, 0x17, 0x9B, 0xE, 0x9B, 0x18, 0x9B, 0x11, 0x95, 0x4A, 0x1B, 0x6, 0x1B, 0xC, 0x13, 0x80, 0x40, 0x23, 0x5B, 0x42, 0x8,
+0x32, 0x13, 0x80, 0x20, 0x23, 0x5B, 0x42, 0x2, 0x32, 0x13, 0x80, 0x5B, 0x46, 0x1A, 0x68, 0xD3, 0x17, 0x9B, 0xE, 0x9B, 0x18, 0x9B, 0x11, 0x8D, 0x4A, 0x1B, 0x6, 0x1B, 0xC, 0x13, 0x80, 0x41, 0x23, 0x5B,
+0x42, 0xA, 0x32, 0x13, 0x80, 0x21, 0x23, 0x5B, 0x42, 0x2, 0x32, 0x13, 0x80, 0x22, 0x68, 0xD3, 0x17, 0x9B, 0xE, 0x9B, 0x18, 0x9B, 0x11, 0x85, 0x4A, 0x1B, 0x6, 0x1B, 0xC, 0x13, 0x80, 0x38, 0x23, 0x5B, 0x42,
+0xC, 0x32, 0x13, 0x80, 0x18, 0x23, 0x5B, 0x42, 0x2, 0x32, 0x13, 0x80, 0x3A, 0x68, 0xD3, 0x17, 0x9B, 0xE, 0x9B, 0x18, 0x9B, 0x11, 0x80, 0x22, 0x1B, 0x2, 0x13, 0x43, 0x1B, 0x4, 0x7C, 0x4A, 0x1B, 0xC, 0x13,
+0x80, 0x7B, 0x4B, 0x7C, 0x4A, 0x18, 0x80, 0x2, 0x33, 0x18, 0x80, 0x32, 0x33, 0x1A, 0x80, 0x7A, 0x4A, 0x2, 0x33, 0x1A, 0x80, 0x4, 0x20, 0x0, 0xF0, 0x65, 0xFF, 0x80, 0x22, 0x77, 0x4B, 0x78, 0x49, 0x92,
+0x0, 0x1A, 0x80, 0x8, 0x33, 0x8B, 0x42, 0xFB, 0xD1, 0x76, 0x4A, 0x61, 0x4B, 0x1A, 0x60, 0x75, 0x4A, 0xCC, 0x23, 0xDB, 0x4, 0x13, 0x60, 0x74, 0x4B, 0x4, 0x32, 0x13, 0x60, 0x13, 0x68, 0x5E, 0x49, 0x0, 0x2B,
+0xFB, 0xDB, 0x72, 0x4A, 0x5A, 0x4B, 0x1A, 0x60, 0x71, 0x4A, 0x4, 0x33, 0x1A, 0x60, 0x6E, 0x4B, 0xA, 0x1C, 0xB, 0x60, 0x13, 0x68, 0x0, 0x2B, 0xFC, 0xDB, 0x6E, 0x4B, 0x6E, 0x4A, 0x0, 0x21, 0x19, 0x80, 0x2,
+0x33, 0x93, 0x42, 0xFB, 0xD1, 0x6C, 0x4A, 0x2, 0x20, 0x2, 0x21, 0xFF, 0xF7, 0x2D, 0xFB, 0x6B, 0x4A, 0x2, 0x20, 0x4, 0x21, 0xFF, 0xF7, 0x28, 0xFB, 0x69, 0x4A, 0x2, 0x20, 0x6, 0x21, 0xFF, 0xF7, 0x23, 0xFB,
+0x68, 0x4A, 0x2, 0x20, 0x8, 0x21, 0xFF, 0xF7, 0x1E, 0xFB, 0x66, 0x4A, 0x2, 0x20, 0xA, 0x21, 0xFF, 0xF7, 0x19, 0xFB, 0xC, 0x21, 0x64, 0x4A, 0x2, 0x20, 0xFF, 0xF7, 0x14, 0xFB, 0xFF, 0xF7, 0xBC, 0xFB, 0xFF,
+0xF7, 0xFE, 0xFB, 0x61, 0x4A, 0x62, 0x4B, 0x1, 0x20, 0x1A, 0x80, 0x2, 0xF0, 0xBE, 0xF8, 0x2, 0xF0, 0x2C, 0xF9, 0x5F, 0x4A, 0x60, 0x4B, 0x19, 0x20, 0x1A, 0x60, 0x5, 0x21, 0x0, 0xF0, 0x5D, 0xFE, 0x5E, 0x48,
+0x0, 0x23, 0x3, 0x60, 0x80, 0x21, 0x5D, 0x4C, 0x98, 0x46, 0x5D, 0x4B, 0x4A, 0x1, 0xB, 0x90, 0x92, 0x46, 0xA, 0x93, 0xA3, 0x46, 0x5B, 0x48, 0x5B, 0x49, 0x5C, 0x4A, 0x5C, 0x4B, 0x5D, 0x4C, 0x0, 0x27, 0x81,
+0x46, 0x9, 0x91, 0x8, 0x92, 0x7, 0x93, 0x6, 0x94, 0x2, 0xF0, 0xC, 0xF9, 0x0, 0xF0, 0x60, 0xFE, 0x0, 0xF0, 0x38, 0xFE, 0x4, 0x1C, 0x0, 0xF0, 0x25, 0xFE, 0x6, 0x1C, 0x0, 0xF0, 0x4C, 0xFE, 0x5, 0x1C, 0x40,
+0x20, 0x4, 0x42, 0x9, 0xD0, 0x58, 0x46, 0x3, 0x68, 0xA, 0x9A, 0x0, 0x21, 0x1, 0x3B, 0x11, 0x60, 0x3, 0x60, 0x0, 0x2B, 0x0, 0xDA, 0x2D, 0xE1, 0x80, 0x23, 0x1C, 0x42, 0xA, 0xD0, 0x5A, 0x46, 0x13, 0x68,
+0xA, 0x99, 0x0, 0x20, 0x1, 0x33, 0x8, 0x60, 0x13, 0x60, 0x4, 0x2B, 0x1, 0xDD, 0x40, 0x4B, 0x18, 0x60, 0x1, 0x20, 0x4, 0x42, 0x0, 0xD0, 0x5, 0xE1, 0x1, 0x21, 0xE, 0x42, 0x0, 0xD0, 0x13, 0xE1, 0x84, 0xE0,
+0xC0, 0x46, 0x14, 0x6F, 0x0, 0x2, 0xA0, 0x5C, 0x0, 0x2, 0x4, 0x72, 0x0, 0x2, 0xE4, 0x4E, 0x0, 0x2, 0x0, 0x72, 0x0, 0x2, 0x88, 0x60, 0x0, 0x2, 0x28, 0x74, 0x0, 0x2, 0x1C, 0x63, 0x0, 0x2, 0x2C, 0x74, 0x0,
+0x2, 0xC, 0x72, 0x0, 0x2, 0x18, 0x74, 0x0, 0x2, 0x10, 0x72, 0x0, 0x2, 0xFC, 0x71, 0x0, 0x2, 0x8, 0x72, 0x0, 0x2, 0x24, 0x74, 0x0, 0x2, 0xC0, 0x0, 0x31, 0x0, 0x14, 0x72, 0x0, 0x2, 0x3C, 0x59, 0x0, 0x2,
+0xB0, 0x60, 0x0, 0x2, 0x4C, 0x63, 0x0, 0x2, 0xE0, 0x5B, 0x0, 0x2, 0xD4, 0x0, 0x0, 0x4, 0x0, 0x4, 0x0, 0x5, 0xDC, 0x0, 0x0, 0x4, 0x40, 0x0, 0x0, 0x80, 0xFF, 0x7F, 0x0, 0x0, 0x82, 0x4, 0x0, 0x5, 0x14, 0x63,
+0x0, 0x2, 0xA0, 0x4, 0x0, 0x5, 0x3, 0x0, 0x0, 0x80, 0xC0, 0x4, 0x0, 0x5, 0xE0, 0x4, 0x0, 0x5, 0x8, 0x10, 0x0, 0x4, 0xA, 0x10, 0x0, 0x4, 0xC, 0x10, 0x0, 0x4, 0xE, 0x10, 0x0, 0x4, 0x1C, 0x10, 0x0, 0x4,
+0x42, 0x3D, 0x0, 0x0, 0x8, 0x8, 0x0, 0x0, 0x0, 0x4, 0x0, 0x7, 0x0, 0x8, 0x0, 0x7, 0x60, 0x5C, 0x0, 0x2, 0xD8, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, 0x80, 0x80, 0x5C, 0x0, 0x2, 0x0, 0x6, 0x0, 0x5, 0x20, 0x6,
+0x0, 0x5, 0x40, 0x6, 0x0, 0x5, 0xCC, 0x65, 0x0, 0x2, 0xDC, 0x65, 0x0, 0x2, 0xEC, 0x65, 0x0, 0x2, 0xF4, 0x65, 0x0, 0x2, 0x4, 0x66, 0x0, 0x2, 0x14, 0x66, 0x0, 0x2, 0x10, 0x80, 0xFF, 0xFF, 0x6C, 0x10, 0x0,
+0x4, 0x0, 0x1F, 0x1, 0x0, 0x0, 0x10, 0x0, 0x4, 0x4, 0x6F, 0x0, 0x2, 0x18, 0x6F, 0x0, 0x2, 0x1C, 0x6F, 0x0, 0x2, 0x24, 0x6F, 0x0, 0x2, 0x20, 0x6F, 0x0, 0x2, 0x8, 0x6F, 0x0, 0x2, 0x1C, 0x74, 0x0, 0x2, 0x4C,
+0x66, 0x0, 0x2, 0x1, 0x22, 0x15, 0x42, 0x8, 0xD0, 0x4B, 0x46, 0x1A, 0x68, 0x0, 0x2A, 0x4, 0xD1, 0x9, 0x98, 0x3, 0x68, 0x1, 0x2B, 0x0, 0xD1, 0x8F, 0xE0, 0x2, 0x22, 0x14, 0x42, 0x68, 0xD1, 0x2, 0x23, 0x1E,
+0x42, 0x77, 0xD1, 0x2, 0x20, 0x5, 0x42, 0x7, 0xD0, 0x49, 0x46, 0xA, 0x68, 0x0, 0x2A, 0x3, 0xD1, 0x9, 0x98, 0x3, 0x68, 0x2, 0x2B, 0x7B, 0xD0, 0x20, 0x22, 0x14, 0x42, 0x53, 0xD1, 0x20, 0x23, 0x1E, 0x42,
+0x62, 0xD1, 0x20, 0x20, 0x5, 0x42, 0x7, 0xD0, 0x49, 0x46, 0xA, 0x68, 0x0, 0x2A, 0x3, 0xD1, 0x9, 0x98, 0x3, 0x68, 0x3, 0x2B, 0x67, 0xD0, 0x10, 0x23, 0x1C, 0x42, 0x3E, 0xD1, 0x1E, 0x42, 0x4E, 0xD1, 0xEA,
+0x6, 0x7, 0xD5, 0x4B, 0x46, 0x1A, 0x68, 0x0, 0x2A, 0x3, 0xD1, 0x9, 0x98, 0x3, 0x68, 0x4, 0x2B, 0x61, 0xD0, 0x22, 0x7, 0xA, 0xD5, 0x8, 0x9C, 0x23, 0x68, 0x0, 0x2B, 0x3B, 0xD0, 0x0, 0xF0, 0xED, 0xF9, 0x8,
+0x98, 0x3, 0x68, 0x5A, 0x42, 0x53, 0x41, 0x3, 0x60, 0x7, 0x99, 0xB, 0x68, 0x98, 0x45, 0x0, 0xDA, 0x98, 0x46, 0x1, 0x37, 0x3A, 0x7, 0x9, 0xD1, 0x6, 0x98, 0xB, 0x9C, 0x43, 0x46, 0x23, 0x60, 0x3, 0x68, 0x20,
+0x21, 0xB, 0x43, 0x0, 0x22, 0x3, 0x60, 0x90, 0x46, 0xFF, 0xF7, 0x80, 0xFA, 0xFF, 0xF7, 0xC2, 0xFA, 0x53, 0x46, 0x0, 0x2B, 0x0, 0xD1, 0xE5, 0xE6, 0x80, 0x24, 0x64, 0x42, 0xA2, 0x44, 0x1E, 0x4A, 0x50, 0x46,
+0x3, 0x12, 0x13, 0x43, 0x1B, 0x4, 0x1C, 0x4A, 0x1B, 0xC, 0x13, 0x80, 0xD9, 0xE6, 0x4, 0x20, 0xFF, 0xF7, 0x1F, 0xFA, 0xBE, 0xE7, 0x3, 0x20, 0xFF, 0xF7, 0x1B, 0xFA, 0xAA, 0xE7, 0x2, 0x20, 0xFF, 0xF7, 0x17,
+0xFA, 0x95, 0xE7, 0xFF, 0xF7, 0x14, 0xFA, 0x80, 0xE7, 0x0, 0xF0, 0xAF, 0xF9, 0xC2, 0xE7, 0x4, 0x20, 0xFF, 0xF7, 0x25, 0xFA, 0xAC, 0xE7, 0x3, 0x20, 0xFF, 0xF7, 0x21, 0xFA, 0x98, 0xE7, 0x2, 0x20, 0xFF,
+0xF7, 0x1D, 0xFA, 0x83, 0xE7, 0x1, 0x20, 0xFF, 0xF7, 0x19, 0xFA, 0x6D, 0xE7, 0xA, 0x4A, 0x4, 0x21, 0x11, 0x60, 0xCD, 0xE6, 0xA, 0x99, 0xA, 0x60, 0x94, 0xE7, 0xA, 0x99, 0xA, 0x60, 0x80, 0xE7, 0xA, 0x99,
+0xA, 0x60, 0x6C, 0xE7, 0xA, 0x99, 0xA, 0x60, 0x9A, 0xE7, 0x0, 0x25, 0x5, 0xE5, 0x0, 0x80, 0xFF, 0xFF, 0x6C, 0x10, 0x0, 0x4, 0x18, 0x6F, 0x0, 0x2, 0x0, 0xB5, 0x81, 0xB0, 0x3, 0x28, 0x2A, 0xD0, 0x4, 0x28,
+0x1B, 0xD0, 0x2, 0x28, 0xF, 0xD0, 0x1A, 0x4B, 0x0, 0x22, 0x1A, 0x60, 0x1A, 0x4B, 0x1A, 0x60, 0x1A, 0x48, 0x0, 0x68, 0x0, 0xF0, 0x85, 0xF9, 0x19, 0x49, 0x10, 0x22, 0xB, 0x68, 0x1, 0xB0, 0x13, 0x43, 0xB,
+0x60, 0x0, 0xBD, 0x0, 0x29, 0xF2, 0xD1, 0x13, 0x48, 0x80, 0x23, 0xDB, 0x0, 0x11, 0x4A, 0x3, 0x60, 0x7, 0x23, 0x13, 0x60, 0xEB, 0xE7, 0xF, 0x48, 0x80, 0x22, 0x3, 0x68, 0x12, 0x1, 0x4, 0x33, 0x3, 0x60,
+0x93, 0x42, 0x0, 0xDD, 0x2, 0x60, 0xA, 0x4A, 0x0, 0x23, 0x13, 0x60, 0xDE, 0xE7, 0x9, 0x48, 0xA, 0x4A, 0x3, 0x68, 0x4, 0x3B, 0x3, 0x60, 0x93, 0x42, 0xF4, 0xDC, 0x80, 0x23, 0x9B, 0x0, 0x3, 0x4A, 0x3, 0x60,
+0x0, 0x23, 0x13, 0x60, 0xD0, 0xE7, 0xC0, 0x46, 0x1C, 0x6F, 0x0, 0x2, 0x24, 0x6F, 0x0, 0x2, 0x48, 0x66, 0x0, 0x2, 0x4C, 0x66, 0x0, 0x2, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xB5, 0x81, 0xB0, 0x3, 0x28, 0x2A, 0xD0,
+0x4, 0x28, 0x1B, 0xD0, 0x2, 0x28, 0xF, 0xD0, 0x1A, 0x4B, 0x0, 0x22, 0x1A, 0x60, 0x1A, 0x4B, 0x1A, 0x60, 0x1A, 0x48, 0x0, 0x68, 0x0, 0xF0, 0x3B, 0xF9, 0x19, 0x49, 0x8, 0x22, 0xB, 0x68, 0x1, 0xB0, 0x13,
+0x43, 0xB, 0x60, 0x0, 0xBD, 0x0, 0x29, 0xF2, 0xD1, 0x13, 0x48, 0x80, 0x23, 0xDB, 0x0, 0x11, 0x4A, 0x3, 0x60, 0x7, 0x23, 0x13, 0x60, 0xEB, 0xE7, 0xF, 0x48, 0x80, 0x22, 0x3, 0x68, 0x12, 0x1, 0x4, 0x33,
+0x3, 0x60, 0x93, 0x42, 0x0, 0xDD, 0x2, 0x60, 0xA, 0x4A, 0x0, 0x23, 0x13, 0x60, 0xDE, 0xE7, 0x9, 0x48, 0xA, 0x4A, 0x3, 0x68, 0x4, 0x3B, 0x3, 0x60, 0x93, 0x42, 0xF4, 0xDC, 0x80, 0x23, 0x9B, 0x0, 0x3, 0x4A,
+0x3, 0x60, 0x0, 0x23, 0x13, 0x60, 0xD0, 0xE7, 0xC0, 0x46, 0x1C, 0x6F, 0x0, 0x2, 0x24, 0x6F, 0x0, 0x2, 0x44, 0x66, 0x0, 0x2, 0x4C, 0x66, 0x0, 0x2, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xB5, 0x14, 0x4A, 0x7, 0x23,
+0x81, 0xB0, 0x13, 0x60, 0x3, 0x28, 0x11, 0xDC, 0x2, 0x28, 0x1A, 0xDB, 0x11, 0x48, 0x3, 0x68, 0x1, 0x3B, 0x3, 0x60, 0x0, 0x2B, 0x17, 0xDB, 0xF, 0x49, 0x4, 0x22, 0xB, 0x68, 0x0, 0x78, 0x13, 0x43, 0xB, 0x60,
+0x0, 0xF0, 0xF3, 0xF8, 0x1, 0xB0, 0x0, 0xBD, 0x4, 0x28, 0xFB, 0xD1, 0x8, 0x48, 0x3, 0x68, 0x1, 0x33, 0x3, 0x60, 0x2, 0x2B, 0xED, 0xDD, 0x0, 0x23, 0x3, 0x60, 0xEA, 0xE7, 0x1, 0x28, 0xF0, 0xD1, 0xF3, 0xE7,
+0x2, 0x23, 0x3, 0x60, 0xE4, 0xE7, 0x24, 0x6F, 0x0, 0x2, 0x0, 0x6F, 0x0, 0x2, 0x4C, 0x66, 0x0, 0x2, 0x0, 0xB5, 0x1D, 0x4B, 0x81, 0xB0, 0x19, 0x68, 0x0, 0x29, 0x18, 0xD0, 0x1B, 0x4A, 0x7, 0x23, 0x13, 0x60,
+0x2, 0x28, 0x23, 0xD0, 0x2, 0x28, 0x17, 0xDD, 0x3, 0x28, 0x22, 0xD0, 0x4, 0x28, 0x11, 0xD1, 0x17, 0x4A, 0x13, 0x68, 0x1, 0x33, 0x13, 0x60, 0x99, 0x42, 0x1, 0xDC, 0x0, 0x23, 0x13, 0x60, 0x14, 0x4B, 0x2,
+0x21, 0x1A, 0x68, 0xA, 0x43, 0x1A, 0x60, 0x3, 0xE0, 0xF, 0x4B, 0x19, 0x60, 0x11, 0x4B, 0x19, 0x60, 0x1, 0xB0, 0x0, 0xBD, 0x1, 0x28, 0xFB, 0xD1, 0xC, 0x4B, 0xE, 0x4A, 0x1B, 0x68, 0x5B, 0x0, 0x98, 0x5A,
+0x0, 0xF0, 0xE3, 0xF8, 0xF3, 0xE7, 0x0, 0xF0, 0x22, 0xF9, 0xF0, 0xE7, 0x6, 0x4A, 0x13, 0x68, 0x1, 0x3B, 0x13, 0x60, 0x0, 0x2B, 0xE0, 0xDA, 0x4B, 0x1E, 0x13, 0x60, 0xDD, 0xE7, 0xC0, 0x46, 0x10, 0x6F, 0x0,
+0x2, 0x24, 0x6F, 0x0, 0x2, 0xFC, 0x6E, 0x0, 0x2, 0x4C, 0x66, 0x0, 0x2, 0x1C, 0x6F, 0x0, 0x2, 0x18, 0x72, 0x0, 0x2, 0x0, 0xB5, 0x1F, 0x4B, 0x81, 0xB0, 0x19, 0x68, 0x0, 0x29, 0x18, 0xD0, 0x1D, 0x4A, 0x7,
+0x23, 0x13, 0x60, 0x2, 0x28, 0x24, 0xD0, 0x2, 0x28, 0x17, 0xDD, 0x3, 0x28, 0x26, 0xD0, 0x4, 0x28, 0x11, 0xD1, 0x19, 0x4A, 0x13, 0x68, 0x1, 0x33, 0x13, 0x60, 0x99, 0x42, 0x1, 0xDC, 0x0, 0x23, 0x13, 0x60,
+0x16, 0x4B, 0x1, 0x21, 0x1A, 0x68, 0xA, 0x43, 0x1A, 0x60, 0x3, 0xE0, 0x11, 0x4B, 0x19, 0x60, 0x13, 0x4B, 0x19, 0x60, 0x1, 0xB0, 0x0, 0xBD, 0x1, 0x28, 0xFB, 0xD1, 0xE, 0x4B, 0x0, 0x21, 0x18, 0x68, 0x0,
+0xF0, 0x4D, 0xF8, 0xE, 0x4A, 0x0, 0x23, 0x13, 0x60, 0xF2, 0xE7, 0x0, 0xF0, 0x50, 0xF8, 0xB, 0x4A, 0x0, 0x23, 0x13, 0x60, 0xEC, 0xE7, 0x6, 0x4A, 0x13, 0x68, 0x1, 0x3B, 0x13, 0x60, 0x0, 0x2B, 0xDC, 0xDA,
+0x4B, 0x1E, 0x13, 0x60, 0xD9, 0xE7, 0xC0, 0x46, 0xC, 0x6F, 0x0, 0x2, 0x24, 0x6F, 0x0, 0x2, 0xF8, 0x6E, 0x0, 0x2, 0x4C, 0x66, 0x0, 0x2, 0x1C, 0x6F, 0x0, 0x2, 0x8, 0x6F, 0x0, 0x2, 0x0, 0xB5, 0x84, 0x49,
+0x8, 0x60, 0x84, 0x49, 0x0, 0x22, 0x1, 0xF0, 0x47, 0xFC, 0x0, 0xBD, 0x9, 0x6, 0x8, 0x43, 0x12, 0x4, 0x10, 0x43, 0x1, 0x1C, 0x7E, 0x48, 0x0, 0x68, 0x7F, 0x4A, 0x10, 0x47, 0x11, 0xB5, 0x1, 0x24, 0x4, 0xE0,
+0x13, 0xB5, 0x2, 0x24, 0x1, 0xE0, 0x17, 0xB5, 0x3, 0x24, 0x78, 0x48, 0x0, 0x68, 0x21, 0x1C, 0x6A, 0x46, 0x0, 0xF0, 0x8F, 0xFE, 0xA4, 0x0, 0xA5, 0x44, 0x10, 0xBD, 0x0, 0x2, 0x0, 0x30, 0x0, 0x2, 0x6, 0x30,
+0xEC, 0xE7, 0xC1, 0x22, 0x1, 0x21, 0xDD, 0xE7, 0xC1, 0x22, 0x0, 0x21, 0xDA, 0xE7, 0x71, 0x4A, 0x1, 0x23, 0x13, 0x70, 0xC2, 0x22, 0xD5, 0xE7, 0x3, 0x22, 0xD5, 0xE7, 0x4, 0x22, 0xD3, 0xE7, 0x5, 0x22, 0xD1,
+0xE7, 0x46, 0x22, 0xCF, 0xE7, 0x87, 0x22, 0xCD, 0xE7, 0x88, 0x22, 0xCB, 0xE7, 0x89, 0x22, 0xC9, 0xE7, 0x8A, 0x22, 0xC7, 0xE7, 0x8B, 0x22, 0xC5, 0xE7, 0x8C, 0x22, 0xC3, 0xE7, 0x4F, 0x22, 0xC1, 0xE7, 0x1B,
+0x4, 0x1A, 0x43, 0x9, 0x4, 0x3, 0xC, 0x19, 0x43, 0x0, 0x2, 0xD, 0x30, 0x0, 0x2, 0xA, 0x30, 0xC4, 0xE7, 0xE, 0x22, 0xB5, 0xE7, 0x5E, 0x49, 0x2, 0x6, 0x12, 0xE, 0x1, 0x3A, 0x89, 0x5C, 0x2, 0xA, 0x91, 0x42,
+0x0, 0xD1, 0x70, 0x47, 0xFF, 0xE7, 0xF0, 0xB5, 0x5A, 0x48, 0x0, 0x68, 0x0, 0x21, 0x1, 0x31, 0x40, 0x8, 0xFC, 0xD2, 0x10, 0x29, 0x13, 0xDC, 0x57, 0x4A, 0x14, 0x88, 0x0, 0x23, 0x13, 0x80, 0x54, 0x4B, 0x1D,
+0x68, 0x4E, 0x1E, 0x1, 0x27, 0xB7, 0x40, 0x3D, 0x43, 0x1D, 0x60, 0x14, 0x80, 0x4F, 0x48, 0x82, 0x5D, 0x1, 0x32, 0x82, 0x55, 0x12, 0x6, 0x10, 0xC, 0x8, 0x43, 0x0, 0xE0, 0x0, 0x20, 0xF0, 0xBD, 0x0, 0xB5,
+0x0, 0x2, 0x10, 0x30, 0x0, 0x2, 0x5, 0x30, 0x1, 0xB4, 0xFF, 0xF7, 0xD9, 0xFF, 0x1, 0x1C, 0x1, 0xBC, 0x0, 0x29, 0x3, 0xD0, 0x2, 0xB4, 0xFF, 0xF7, 0x88, 0xFF, 0x1, 0xBD, 0x0, 0x20, 0x0, 0xBD, 0xD1, 0x22,
+0x76, 0xE7, 0xD2, 0x22, 0x74, 0xE7, 0x0, 0x2, 0x13, 0x30, 0x0, 0x2, 0x5, 0x30, 0x7B, 0xE7, 0x0, 0x2, 0x14, 0x30, 0x0, 0x2, 0x5, 0x30, 0x76, 0xE7, 0x1, 0x21, 0xD5, 0x22, 0x67, 0xE7, 0x0, 0x21, 0xD5, 0x22,
+0x64, 0xE7, 0x30, 0xB5, 0x4, 0x1C, 0xE0, 0x88, 0x0, 0x28, 0x2, 0xD1, 0xFF, 0xF7, 0xB4, 0xFF, 0x1, 0xE0, 0xFF, 0xF7, 0xA7, 0xFF, 0x2, 0x1C, 0x5, 0x1C, 0x20, 0x88, 0x0, 0x2, 0x16, 0x30, 0x0, 0x2, 0xB, 0x30,
+0x61, 0x88, 0xA3, 0x88, 0x1B, 0x4, 0x19, 0x43, 0x23, 0x89, 0x1B, 0x4, 0x1A, 0x43, 0xFF, 0xF7, 0x5A, 0xFF, 0x28, 0x1C, 0x30, 0xBD, 0x1D, 0x22, 0x48, 0xE7, 0x18, 0x22, 0x46, 0xE7, 0x19, 0x22, 0x44, 0xE7,
+0x0, 0xB5, 0x86, 0xB0, 0x6B, 0x46, 0x1A, 0x22, 0x5A, 0x70, 0x2, 0x88, 0x5A, 0x80, 0x4, 0x33, 0x52, 0x8, 0x2, 0xD3, 0x41, 0x68, 0x19, 0x60, 0x4, 0x33, 0x52, 0x8, 0x2, 0xD3, 0x1, 0x89, 0x19, 0x80, 0x2,
+0x33, 0x52, 0x8, 0x2, 0xD3, 0x41, 0x89, 0x19, 0x80, 0x2, 0x33, 0x52, 0x8, 0x2, 0xD3, 0x81, 0x89, 0x19, 0x80, 0x2, 0x33, 0x52, 0x8, 0x2, 0xD3, 0x81, 0x7B, 0x19, 0x70, 0x1, 0x33, 0x6A, 0x46, 0x9B, 0x1A,
+0x1, 0x3B, 0x13, 0x70, 0x4, 0x33, 0x99, 0x8, 0xE, 0x48, 0x0, 0x68, 0x0, 0xF0, 0xBE, 0xFD, 0x6, 0xB0, 0x0, 0xBD, 0x5B, 0x22, 0x15, 0xE7, 0x5C, 0x22, 0x13, 0xE7, 0x1, 0xD, 0x1, 0x29, 0x6, 0xD0, 0xD, 0x49,
+0x8, 0x80, 0xA, 0x49, 0xC0, 0x3, 0xC0, 0xF, 0x8, 0x70, 0x70, 0x47, 0xB, 0x4A, 0x12, 0x68, 0x0, 0x2A, 0x4, 0xD0, 0x1, 0x4, 0x9, 0xE, 0x0, 0x6, 0x0, 0xE, 0x10, 0x47, 0x70, 0x47, 0x28, 0x6F, 0x0, 0x2, 0x15,
+0x16, 0x0, 0x2, 0xB1, 0x21, 0x0, 0x2, 0x58, 0x6F, 0x0, 0x2, 0x30, 0x6F, 0x0, 0x2, 0x2C, 0x6F, 0x0, 0x2, 0x8, 0x2, 0x0, 0x4, 0x54, 0x6F, 0x0, 0x2, 0x37, 0x48, 0x0, 0x78, 0x70, 0x47, 0x37, 0x49, 0x8, 0x60,
+0x70, 0x47, 0xF0, 0xB5, 0x7, 0x1C, 0xE, 0xC8, 0x8C, 0x0, 0xE4, 0x18, 0x34, 0x4D, 0x1E, 0xC5, 0x89, 0x18, 0x3, 0xD0, 0x0, 0x20, 0x1, 0xC3, 0x1, 0x39, 0xFC, 0xD1, 0xF8, 0x68, 0xFF, 0xF7, 0xD0, 0xFE, 0x38,
+0x68, 0xB9, 0x68, 0xFF, 0xF7, 0xEE, 0xFE, 0xF0, 0xBD, 0x31, 0xB5, 0x2C, 0x4A, 0x2D, 0x49, 0x90, 0x47, 0x4, 0x1C, 0x2C, 0x4D, 0x81, 0xB0, 0x68, 0x46, 0x4, 0x21, 0x1, 0x22, 0x23, 0x1C, 0xA8, 0x47, 0x2A,
+0x49, 0x20, 0x1C, 0x88, 0x47, 0x1, 0xBC, 0x1, 0x4, 0x9, 0xC, 0x0, 0xC, 0x7, 0x23, 0xF, 0xB4, 0x40, 0x18, 0x80, 0x0, 0x25, 0x49, 0x88, 0x47, 0x2, 0x90, 0x68, 0x46, 0xFF, 0xF7, 0xCE, 0xFF, 0x4, 0xB0, 0x1,
+0xBC, 0x0, 0xF0, 0xDC, 0xF8, 0x30, 0xBD, 0xC0, 0x46, 0x72, 0x62, 0x0, 0x0, 0x10, 0xB5, 0x2, 0x88, 0x41, 0x88, 0x7, 0x24, 0x1F, 0xB4, 0x88, 0x18, 0x80, 0x0, 0x1B, 0x4B, 0x98, 0x47, 0x3, 0x90, 0x1, 0xA8,
+0xFF, 0xF7, 0xB9, 0xFF, 0x1, 0xBC, 0x0, 0xF0, 0xC4, 0xF8, 0x1F, 0xBD, 0x17, 0x48, 0x0, 0x47, 0x0, 0x0, 0x0, 0x0, 0xF, 0xE1, 0x80, 0x10, 0x0, 0xE2, 0x80, 0x0, 0x80, 0xE3, 0x0, 0xF0, 0x29, 0xE1, 0x1C, 0x10,
+0x8F, 0xE5, 0x1E, 0xFF, 0x2F, 0xE1, 0x10, 0x48, 0x0, 0x47, 0x0, 0x0, 0xF, 0xE1, 0xC, 0x10, 0x9F, 0xE5, 0x80, 0x0, 0xC0, 0xE3, 0x1, 0x0, 0x80, 0xE1, 0x0, 0xF0, 0x29, 0xE1, 0x1E, 0xFF, 0x2F, 0xE1, 0x0,
+0x0, 0x0, 0x0, 0x58, 0x6F, 0x0, 0x2, 0x54, 0x6F, 0x0, 0x2, 0x44, 0x6F, 0x0, 0x2, 0x51, 0x36, 0x0, 0x2, 0xD8, 0x16, 0x0, 0x2, 0xC5, 0x37, 0x0, 0x2, 0x8D, 0x32, 0x0, 0x2, 0xA1, 0x3F, 0x0, 0x2, 0x4, 0x17,
+0x0, 0x2, 0x20, 0x17, 0x0, 0x2, 0xF0, 0xB5, 0x11, 0x4F, 0x3F, 0x68, 0x11, 0x49, 0x9, 0x68, 0x82, 0x0, 0x8C, 0x18, 0x22, 0x68, 0x0, 0x2A, 0x0, 0xD0, 0xF0, 0xBD, 0x1, 0x1C, 0x1A, 0x20, 0xB8, 0x47, 0x20,
+0x60, 0x4, 0x1C, 0x8, 0x34, 0x60, 0x78, 0xA6, 0x78, 0x25, 0x1C, 0xFF, 0x35, 0x15, 0x35, 0x80, 0x0, 0x2D, 0x18, 0x28, 0x68, 0x4, 0x35, 0x0, 0x19, 0x40, 0x89, 0x0, 0xF0, 0x36, 0xF8, 0x1, 0x3E, 0xF7, 0xD1,
+0x0, 0xF0, 0xEE, 0xF8, 0xF0, 0xBD, 0x0, 0x0, 0x40, 0x6F, 0x0, 0x2, 0x4C, 0x6F, 0x0, 0x2, 0xF0, 0xB5, 0x1, 0xB4, 0x12, 0x4F, 0x3F, 0x68, 0x0, 0x26, 0x12, 0x49, 0x9, 0x68, 0x80, 0x0, 0xC, 0x58, 0x0, 0x2C,
+0x1A, 0xD0, 0x8, 0x34, 0x26, 0x1C, 0xA5, 0x78, 0x60, 0x78, 0x80, 0x0, 0x24, 0x18, 0xFF, 0x34, 0x15, 0x34, 0x20, 0x68, 0x80, 0x19, 0x4, 0x34, 0x40, 0x89, 0x0, 0xF0, 0x2F, 0xF8, 0x1, 0x3D, 0xF7, 0xD1, 0x1,
+0xBC, 0x80, 0x0, 0x6, 0x4A, 0x12, 0x68, 0x11, 0x58, 0x0, 0x23, 0x13, 0x50, 0x1C, 0x20, 0xB8, 0x47, 0x0, 0xF0, 0xC2, 0xF8, 0xF0, 0xBD, 0x0, 0x0, 0x40, 0x6F, 0x0, 0x2, 0x4C, 0x6F, 0x0, 0x2, 0x0, 0xB5, 0xA,
+0x49, 0x9, 0x68, 0x82, 0x0, 0x8B, 0x58, 0x0, 0x2B, 0x8, 0xD1, 0x6, 0xB4, 0x1, 0x1C, 0x1B, 0x20, 0x6, 0x4A, 0x12, 0x68, 0x90, 0x47, 0x6, 0xBC, 0x0, 0x2, 0x3, 0xA, 0x4, 0x48, 0x1B, 0x18, 0x8B, 0x50, 0x0,
+0xF0, 0xA7, 0xF8, 0x0, 0xBD, 0x50, 0x6F, 0x0, 0x2, 0x40, 0x6F, 0x0, 0x2, 0x0, 0x0, 0x0, 0x1, 0x0, 0xB5, 0xB, 0x49, 0x9, 0x68, 0x80, 0x0, 0xA, 0x58, 0x13, 0xE, 0xB, 0xD0, 0x9, 0x4B, 0xD2, 0x1A, 0x13, 0xE,
+0x8, 0xD1, 0x7, 0xB4, 0x7, 0x4B, 0xD1, 0x18, 0x1D, 0x20, 0x7, 0x4F, 0x3F, 0x68, 0xB8, 0x47, 0x7, 0xBC, 0x0, 0x22, 0xA, 0x50, 0x0, 0xF0, 0x89, 0xF8, 0x0, 0xBD, 0x50, 0x6F, 0x0, 0x2, 0x0, 0x0, 0x0, 0x1,
+0x0, 0x0, 0x0, 0x2, 0x40, 0x6F, 0x0, 0x2, 0x35, 0x49, 0x8, 0x60, 0x35, 0x48, 0x8, 0xE0, 0x35, 0x49, 0x0, 0x22, 0x83, 0x5C, 0x8B, 0x54, 0x1, 0x32, 0x0, 0x2B, 0xFA, 0xD1, 0x33, 0x48, 0xFF, 0xE7, 0x33, 0x49,
+0x8, 0x60, 0x70, 0x47, 0x2D, 0x4A, 0x12, 0x68, 0x13, 0x1C, 0xC, 0x33, 0x89, 0x0, 0x1A, 0x28, 0x2, 0xD0, 0x1B, 0x28, 0x6, 0xD0, 0x70, 0x47, 0x10, 0x88, 0x80, 0x0, 0x9, 0x18, 0x58, 0x58, 0x80, 0x18, 0x70,
+0x47, 0x58, 0x58, 0x80, 0x18, 0x70, 0x47, 0x2, 0x1C, 0x8, 0x1C, 0x1A, 0x2A, 0x4, 0xD0, 0x1B, 0x2A, 0x4, 0xD0, 0x1D, 0x2A, 0x4, 0xDD, 0x70, 0x47, 0x0, 0x21, 0x3, 0xE0, 0x1, 0x21, 0x1, 0xE0, 0x22, 0x49,
+0x8, 0x47, 0xF3, 0xB5, 0x1E, 0x48, 0x1A, 0xA1, 0x1, 0xF0, 0xAF, 0xFE, 0x4, 0x1C, 0x1F, 0x4D, 0x0, 0xF0, 0x28, 0xF8, 0x7, 0xBC, 0x0, 0x4, 0x80, 0xB, 0x0, 0x2A, 0x0, 0xD0, 0x0, 0x20, 0x89, 0x0, 0xC, 0x31,
+0x9, 0x18, 0x1A, 0x4E, 0x20, 0x1C, 0x0, 0x22, 0xB0, 0x47, 0x0, 0xF0, 0x19, 0xF8, 0x80, 0xBC, 0x20, 0x1C, 0x39, 0x1C, 0x0, 0x22, 0xB0, 0x47, 0x0, 0xF0, 0x12, 0xF8, 0x20, 0x1C, 0x39, 0x1C, 0x0, 0x22, 0xB0,
+0x47, 0x0, 0x98, 0x8, 0x30, 0x12, 0x49, 0x88, 0x47, 0x2, 0xBC, 0x8, 0x31, 0x1, 0xB4, 0x1, 0x22, 0x23, 0x1C, 0xA8, 0x47, 0xF, 0x49, 0x20, 0x1C, 0x88, 0x47, 0xF1, 0xBD, 0x81, 0xB0, 0x68, 0x46, 0x4, 0x21,
+0x1, 0x22, 0x23, 0x1C, 0x28, 0x47, 0xC0, 0x46, 0x72, 0x62, 0x0, 0x0, 0x5C, 0x6F, 0x0, 0x2, 0xA5, 0x18, 0x0, 0x2, 0x60, 0x6F, 0x0, 0x2, 0xCB, 0x18, 0x0, 0x2, 0x40, 0x6F, 0x0, 0x2, 0x89, 0x3F, 0x0, 0x2,
+0xC5, 0x37, 0x0, 0x2, 0x2D, 0x3D, 0x0, 0x2, 0xA1, 0x3F, 0x0, 0x2, 0x8D, 0x32, 0x0, 0x2, 0xA, 0x48, 0x0, 0x68, 0xA, 0x49, 0x9, 0x68, 0xA, 0x4A, 0x12, 0x68, 0x89, 0x18, 0x40, 0x9, 0x40, 0x1, 0x1, 0x31,
+0x8, 0x4B, 0x18, 0x47, 0x3E, 0xF, 0x7, 0xEE, 0x20, 0x0, 0x80, 0xE2, 0x8, 0x10, 0x51, 0xE2, 0xFB, 0xFF, 0xFF, 0x5A, 0x1E, 0xFF, 0x2F, 0xE1, 0x4C, 0x6F, 0x0, 0x2, 0x44, 0x6F, 0x0, 0x2, 0x48, 0x6F, 0x0,
+0x2, 0x9C, 0x19, 0x0, 0x2, 0x0, 0xB5, 0x42, 0x4B, 0x42, 0x4A, 0x0, 0x21, 0x0, 0x20, 0x1, 0x31, 0x98, 0x60, 0x18, 0x60, 0x58, 0x60, 0x50, 0x80, 0xC, 0x33, 0x10, 0x80, 0x4, 0x32, 0x4, 0x29, 0xF5, 0xD1,
+0x3D, 0x4A, 0x3D, 0x4B, 0x3E, 0x49, 0x1A, 0x60, 0x3E, 0x4A, 0x80, 0x23, 0x5B, 0x42, 0x13, 0x70, 0x1, 0x32, 0x13, 0x70, 0x1, 0x32, 0x13, 0x70, 0x2, 0x32, 0x13, 0x70, 0x1, 0x32, 0x13, 0x70, 0xA0, 0x22,
+0x1, 0x23, 0xD2, 0x4, 0x5B, 0x42, 0x13, 0x80, 0x36, 0x4B, 0x37, 0x4A, 0x8, 0x60, 0x19, 0x60, 0x4, 0x33, 0x1A, 0x60, 0x35, 0x4A, 0x36, 0x4B, 0x11, 0x1C, 0x13, 0x60, 0xB, 0x68, 0x0, 0x2B, 0xFC, 0xDB, 0x2E,
+0x4A, 0x2F, 0x4B, 0x1A, 0x60, 0xE0, 0x23, 0x32, 0x4A, 0xDB, 0x4, 0x13, 0x60, 0x31, 0x4B, 0xB, 0x60, 0x2D, 0x49, 0xB, 0x68, 0x0, 0x2B, 0xFC, 0xDB, 0x27, 0x4A, 0x29, 0x4B, 0x1A, 0x60, 0x80, 0x23, 0x2B,
+0x4A, 0xDB, 0x4, 0x13, 0x60, 0x2C, 0x4B, 0xB, 0x60, 0x27, 0x49, 0xB, 0x68, 0x0, 0x2B, 0xFC, 0xDB, 0x21, 0x4A, 0x22, 0x4B, 0x1A, 0x60, 0x28, 0x4A, 0x4, 0x33, 0x1A, 0x60, 0x26, 0x4B, 0xB, 0x60, 0x21, 0x49,
+0xB, 0x68, 0x0, 0x2B, 0xFC, 0xDB, 0x1B, 0x4A, 0x1C, 0x4B, 0x1A, 0x60, 0x1F, 0x4A, 0xD0, 0x23, 0xDB, 0x4, 0x13, 0x60, 0x21, 0x4B, 0x4, 0x32, 0xB, 0x60, 0x13, 0x68, 0x0, 0x2B, 0xFC, 0xDB, 0x1F, 0x4B, 0x0,
+0x21, 0x19, 0x80, 0x80, 0x23, 0xDB, 0x4, 0x19, 0x60, 0x1D, 0x4B, 0x0, 0x22, 0x19, 0x60, 0xF, 0x49, 0x1C, 0x4B, 0xA, 0x70, 0x1A, 0x70, 0x1, 0x33, 0x1A, 0x70, 0x1, 0x33, 0x1A, 0x70, 0x1, 0x33, 0x1A, 0x70,
+0x1, 0x33, 0x1A, 0x70, 0x1, 0x33, 0x1A, 0x70, 0x2, 0x33, 0x1A, 0x70, 0x1, 0x33, 0x1A, 0x70, 0xC0, 0x23, 0x9B, 0x4, 0xB, 0x60, 0x13, 0x4A, 0x14, 0x4B, 0x13, 0x60, 0x0, 0xBD, 0xB0, 0x0, 0x0, 0x4, 0x0, 0x1,
+0x0, 0x4, 0x80, 0x80, 0x80, 0x80, 0x40, 0x2, 0x0, 0x4, 0x4, 0xFE, 0x7F, 0x2, 0x44, 0x2, 0x0, 0x4, 0xD4, 0x0, 0x0, 0x4, 0x2, 0x0, 0x0, 0x5, 0xDC, 0x0, 0x0, 0x4, 0xFF, 0x1, 0x0, 0x85, 0xD8, 0x0, 0x0, 0x4,
+0x0, 0x2, 0x0, 0x85, 0x15, 0x0, 0x0, 0x85, 0x8, 0x10, 0x0, 0x4, 0x0, 0x90, 0x2, 0x85, 0x4, 0x0, 0x0, 0x4, 0x0, 0x10, 0x0, 0x4, 0x41, 0x2, 0x0, 0x4, 0x44, 0x86, 0x0, 0x2, 0x20, 0xF0, 0x7F, 0x2, 0x1, 0x4B,
+0x18, 0x88, 0x70, 0x47, 0x0, 0x0, 0xA0, 0x6F, 0x0, 0x2, 0x2, 0x4B, 0x18, 0x88, 0x2, 0x4B, 0x1B, 0x88, 0x98, 0x43, 0x70, 0x47, 0xA0, 0x6F, 0x0, 0x2, 0xA2, 0x6F, 0x0, 0x2, 0x2, 0x4B, 0x0, 0x22, 0x18, 0x88,
+0x1A, 0x80, 0x70, 0x47, 0x0, 0x0, 0xA4, 0x6F, 0x0, 0x2, 0x4, 0x4B, 0x5, 0x4A, 0x18, 0x70, 0x5, 0x4B, 0x19, 0x70, 0x5, 0x4B, 0x18, 0x70, 0x0, 0x23, 0x13, 0x80, 0x70, 0x47, 0x78, 0x66, 0x0, 0x2, 0xA4, 0x6F,
+0x0, 0x2, 0x79, 0x66, 0x0, 0x2, 0x7A, 0x66, 0x0, 0x2, 0x3, 0x4B, 0x1A, 0x88, 0x3, 0x4B, 0x10, 0x1C, 0x1B, 0x88, 0x58, 0x40, 0x90, 0x43, 0x70, 0x47, 0xA0, 0x6F, 0x0, 0x2, 0xA2, 0x6F, 0x0, 0x2, 0xF0, 0xB5,
+0x1B, 0x4D, 0x1B, 0x4B, 0x2F, 0x88, 0x1B, 0x49, 0x1F, 0x80, 0x1B, 0x4B, 0x81, 0xB0, 0x18, 0x88, 0x1B, 0x4B, 0x81, 0x43, 0x9C, 0x8A, 0x9A, 0x8A, 0x3, 0x23, 0xA3, 0x43, 0x9B, 0x2, 0x19, 0x43, 0xD2, 0x43,
+0xC0, 0x23, 0x9B, 0x1, 0x92, 0x1, 0x1A, 0x40, 0x11, 0x43, 0x80, 0x23, 0x9B, 0x1, 0xE, 0x1C, 0x5E, 0x40, 0x13, 0x4B, 0x2E, 0x80, 0x1B, 0x78, 0x0, 0x2B, 0x13, 0xD0, 0xB7, 0x42, 0x13, 0xD0, 0x10, 0x4D, 0x11,
+0x4C, 0x2B, 0x70, 0xFF, 0xF7, 0xA9, 0xFF, 0x20, 0x80, 0x2B, 0x78, 0x1, 0x3B, 0x1B, 0x6, 0x1B, 0xE, 0x2B, 0x70, 0x0, 0x2B, 0x4, 0xD1, 0xC, 0x4B, 0x1B, 0x78, 0x2B, 0x70, 0x9, 0x4B, 0x1E, 0x80, 0x1, 0xB0,
+0xF0, 0xBD, 0x6, 0x4D, 0xEF, 0xE7, 0xA0, 0x6F, 0x0, 0x2, 0xA2, 0x6F, 0x0, 0x2, 0xFF, 0x3, 0x0, 0x0, 0x30, 0x1, 0x0, 0x4, 0x0, 0xF0, 0x7F, 0x2, 0x78, 0x66, 0x0, 0x2, 0x7A, 0x66, 0x0, 0x2, 0xA4, 0x6F, 0x0,
+0x2, 0x79, 0x66, 0x0, 0x2, 0x70, 0xB5, 0x80, 0x24, 0x64, 0x42, 0x20, 0x43, 0xA, 0x4D, 0x0, 0x6, 0x0, 0xE, 0x21, 0x43, 0x2E, 0x68, 0x9, 0x6, 0x28, 0x70, 0x8, 0x48, 0x9, 0xE, 0x22, 0x43, 0x1, 0x70, 0x12,
+0x6, 0x6, 0x49, 0x12, 0xE, 0x23, 0x43, 0xA, 0x70, 0x1B, 0x6, 0x5, 0x4A, 0x30, 0x1C, 0x1B, 0xE, 0x13, 0x70, 0x70, 0xBD, 0x40, 0x2, 0x0, 0x4, 0x41, 0x2, 0x0, 0x4, 0x42, 0x2, 0x0, 0x4, 0x43, 0x2, 0x0, 0x4,
+0x1, 0x4B, 0x18, 0x60, 0x70, 0x47, 0x0, 0x0, 0x40, 0x2, 0x0, 0x4, 0x80, 0x23, 0x5B, 0x42, 0x18, 0x43, 0x0, 0x6, 0x1, 0x4B, 0x0, 0xE, 0x18, 0x70, 0x70, 0x47, 0x40, 0x2, 0x0, 0x4, 0x80, 0x23, 0x5B, 0x42,
+0x18, 0x43, 0x0, 0x6, 0x1, 0x4B, 0x0, 0xE, 0x18, 0x70, 0x70, 0x47, 0x41, 0x2, 0x0, 0x4, 0x80, 0x23, 0x5B, 0x42, 0x18, 0x43, 0x0, 0x6, 0x1, 0x4B, 0x0, 0xE, 0x18, 0x70, 0x70, 0x47, 0x42, 0x2, 0x0, 0x4,
+0x80, 0x23, 0x5B, 0x42, 0x18, 0x43, 0x0, 0x6, 0x1, 0x4B, 0x0, 0xE, 0x18, 0x70, 0x70, 0x47, 0x43, 0x2, 0x0, 0x4, 0x80, 0x23, 0x5B, 0x42, 0x18, 0x43, 0x0, 0x6, 0x1, 0x4B, 0x0, 0xE, 0x18, 0x70, 0x70, 0x47,
+0x44, 0x2, 0x0, 0x4, 0x80, 0x23, 0x5B, 0x42, 0x18, 0x43, 0x0, 0x6, 0x1, 0x4B, 0x0, 0xE, 0x18, 0x70, 0x70, 0x47, 0x45, 0x2, 0x0, 0x4, 0x80, 0x23, 0x5B, 0x42, 0x18, 0x43, 0x0, 0x6, 0x1, 0x4B, 0x0, 0xE,
+0x18, 0x70, 0x70, 0x47, 0x46, 0x2, 0x0, 0x4, 0x80, 0x23, 0x5B, 0x42, 0x18, 0x43, 0x0, 0x6, 0x1, 0x4B, 0x0, 0xE, 0x18, 0x70, 0x70, 0x47, 0x48, 0x2, 0x0, 0x4, 0x80, 0x23, 0x5B, 0x42, 0x18, 0x43, 0x0, 0x6,
+0x1, 0x4B, 0x0, 0xE, 0x18, 0x70, 0x70, 0x47, 0x49, 0x2, 0x0, 0x4, 0x1, 0x4B, 0x18, 0x68, 0x70, 0x47, 0x0, 0x0, 0xB8, 0x6F, 0x0, 0x2, 0x0, 0xB5, 0x4, 0x4B, 0x0, 0x20, 0x1B, 0x68, 0x1, 0x33, 0x0, 0xD0,
+0x0, 0xBD, 0x1, 0x20, 0xFC, 0xE7, 0x0, 0x0, 0x7C, 0x85, 0x0, 0x2, 0x0, 0xB5, 0x8, 0x49, 0x8, 0x68, 0x43, 0x1C, 0x6, 0xD0, 0x7, 0x4A, 0xC3, 0x0, 0x9A, 0x5A, 0x6, 0x4B, 0xA, 0x60, 0x9A, 0x42, 0x0, 0xD0,
+0x0, 0xBD, 0x1, 0x23, 0x5B, 0x42, 0xB, 0x60, 0xFA, 0xE7, 0x0, 0x0, 0xF0, 0x84, 0x0, 0x2, 0x70, 0x74, 0x0, 0x2, 0xFF, 0xFF, 0x0, 0x0, 0x10, 0xB5, 0x5, 0x4B, 0x4, 0x1C, 0x98, 0x42, 0x5, 0xD8, 0x4, 0x4A,
+0x4, 0x48, 0x13, 0x88, 0xE1, 0x0, 0xB, 0x50, 0x14, 0x60, 0x10, 0xBD, 0xFF, 0x1, 0x0, 0x0, 0xF0, 0x84, 0x0, 0x2, 0x70, 0x74, 0x0, 0x2, 0x0, 0xB5, 0xB, 0x4A, 0x81, 0xB0, 0x13, 0x68, 0x0, 0x2B, 0xB, 0xDD,
+0x1, 0x3B, 0x13, 0x60, 0x0, 0x2B, 0x7, 0xD1, 0x7, 0x4B, 0x1A, 0x68, 0x1, 0x2A, 0x5, 0xD0, 0xC0, 0x20, 0xC0, 0x2, 0x1, 0xF0, 0x20, 0xF9, 0x1, 0xB0, 0x0, 0xBD, 0x3, 0x4B, 0x1A, 0x80, 0xFA, 0xE7, 0x0, 0x0,
+0xAC, 0x6F, 0x0, 0x2, 0xB4, 0x6F, 0x0, 0x2, 0x8, 0x2, 0x0, 0x4, 0x10, 0xB5, 0x9, 0x4C, 0x22, 0x68, 0x0, 0x2A, 0x7, 0xD1, 0x8, 0x4B, 0x1B, 0x68, 0x1, 0x2B, 0x7, 0xD0, 0xC0, 0x20, 0xC0, 0x2, 0x1, 0xF0,
+0x31, 0xF9, 0x23, 0x68, 0x1, 0x33, 0x23, 0x60, 0x10, 0xBD, 0x3, 0x4B, 0x1A, 0x80, 0xF8, 0xE7, 0xAC, 0x6F, 0x0, 0x2, 0xB4, 0x6F, 0x0, 0x2, 0x8, 0x2, 0x0, 0x4, 0x10, 0xB5, 0x4, 0x1C, 0xFF, 0xF7, 0xE2, 0xFF,
+0x13, 0x4B, 0x1B, 0x68, 0x5A, 0x1C, 0x1E, 0xD0, 0x1, 0x3C, 0x0, 0x2C, 0x13, 0xDD, 0x11, 0x48, 0xDB, 0x0, 0x1A, 0x58, 0x10, 0x49, 0x13, 0x1C, 0xB, 0x40, 0x8B, 0x42, 0x8, 0xD1, 0xA, 0xE0, 0x13, 0x1C, 0xB,
+0x40, 0xDB, 0x0, 0x1A, 0x58, 0x13, 0x1C, 0xB, 0x40, 0x8B, 0x42, 0x2, 0xD0, 0x1, 0x3C, 0x0, 0x2C, 0xF4, 0xD1, 0xFF, 0xF7, 0xA7, 0xFF, 0x0, 0x20, 0x0, 0x2C, 0x0, 0xDD, 0x10, 0xBD, 0x1, 0x20, 0xFC, 0xE7,
+0xFF, 0xF7, 0x9F, 0xFF, 0x0, 0x20, 0xF8, 0xE7, 0x0, 0x0, 0xF0, 0x84, 0x0, 0x2, 0x70, 0x74, 0x0, 0x2, 0xFF, 0xFF, 0x0, 0x0, 0xF0, 0xB5, 0x81, 0xB0, 0x7, 0x1C, 0xFF, 0xF7, 0xAF, 0xFF, 0xFF, 0xF7, 0x65,
+0xFF, 0x5, 0x1C, 0x43, 0x1C, 0x22, 0xD0, 0x13, 0x4E, 0x34, 0x68, 0x63, 0x1C, 0x14, 0xD0, 0x12, 0x48, 0x13, 0x4A, 0xEB, 0x0, 0x1A, 0x50, 0x1B, 0x18, 0x5F, 0x60, 0x11, 0x4B, 0xE4, 0x0, 0x29, 0x1C, 0x19,
+0x40, 0x10, 0x4A, 0x23, 0x58, 0x35, 0x60, 0x13, 0x40, 0x19, 0x43, 0x21, 0x50, 0xFF, 0xF7, 0x76, 0xFF, 0x1, 0x20, 0x1, 0xB0, 0xF0, 0xBD, 0x8, 0x49, 0x8, 0x4A, 0xC3, 0x0, 0x5A, 0x50, 0x5B, 0x18, 0x5F, 0x60,
+0x9, 0x4B, 0x30, 0x60, 0x18, 0x60, 0xF0, 0xE7, 0xFF, 0xF7, 0x67, 0xFF, 0x0, 0x20, 0xEF, 0xE7, 0x0, 0x0, 0x34, 0x85, 0x0, 0x2, 0x70, 0x74, 0x0, 0x2, 0xFF, 0xFF, 0x0, 0x10, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0,
+0xFF, 0xFF, 0x7C, 0x85, 0x0, 0x2, 0x70, 0xB5, 0xFF, 0xF7, 0x73, 0xFF, 0xF, 0x4C, 0x20, 0x68, 0x43, 0x1C, 0x16, 0xD0, 0xE, 0x4B, 0xE, 0x4D, 0xC2, 0x0, 0xD2, 0x18, 0x2B, 0x68, 0x56, 0x68, 0x98, 0x42, 0x7,
+0xD0, 0x13, 0x88, 0x23, 0x60, 0xFF, 0xF7, 0x33, 0xFF, 0xFF, 0xF7, 0x43, 0xFF, 0x30, 0x1C, 0x70, 0xBD, 0xFF, 0xF7, 0x2D, 0xFF, 0x1, 0x23, 0x5B, 0x42, 0x2B, 0x60, 0x23, 0x60, 0xF4, 0xE7, 0xFF, 0xF7, 0x38,
+0xFF, 0x0, 0x26, 0xF2, 0xE7, 0x7C, 0x85, 0x0, 0x2, 0x70, 0x74, 0x0, 0x2, 0x34, 0x85, 0x0, 0x2, 0x30, 0xB5, 0x14, 0x4D, 0x1, 0x23, 0x81, 0xB0, 0x2B, 0x60, 0xFF, 0xF7, 0xF3, 0xFE, 0x0, 0x28, 0x6, 0xD0,
+0x11, 0x4A, 0x0, 0x23, 0x13, 0x60, 0x0, 0x23, 0x1, 0xB0, 0x2B, 0x60, 0x30, 0xBD, 0xE, 0x4B, 0xD, 0x4C, 0x1B, 0x88, 0x20, 0x60, 0x9A, 0x7, 0xF5, 0xD4, 0xFF, 0xF7, 0xE2, 0xFE, 0x0, 0x28, 0xF1, 0xD1, 0xFF,
+0xF7, 0xBC, 0xFF, 0x9, 0x4B, 0x18, 0x60, 0x1, 0x23, 0x23, 0x60, 0x6, 0x4B, 0x1B, 0x88, 0x9A, 0x7, 0xE7, 0xD4, 0xFF, 0xF7, 0xD4, 0xFE, 0x0, 0x28, 0xF1, 0xD0, 0xE2, 0xE7, 0x0, 0x0, 0xAC, 0x6F, 0x0, 0x2,
+0xB0, 0x6F, 0x0, 0x2, 0x84, 0x1, 0x0, 0x4, 0x88, 0x1, 0x0, 0x4, 0xF0, 0xB5, 0x81, 0xB0, 0x7, 0x1C, 0xFF, 0xF7, 0x17, 0xFF, 0xFF, 0xF7, 0xCD, 0xFE, 0x5, 0x1C, 0x43, 0x1C, 0x22, 0xD0, 0x13, 0x4E, 0x34,
+0x68, 0x63, 0x1C, 0x14, 0xD0, 0x12, 0x48, 0x13, 0x4A, 0xEB, 0x0, 0x1A, 0x50, 0x1B, 0x18, 0x5F, 0x60, 0x11, 0x4B, 0xE4, 0x0, 0x29, 0x1C, 0x19, 0x40, 0x10, 0x4A, 0x23, 0x58, 0x35, 0x60, 0x13, 0x40, 0x19,
+0x43, 0x21, 0x50, 0xFF, 0xF7, 0xDE, 0xFE, 0x1, 0x20, 0x1, 0xB0, 0xF0, 0xBD, 0x8, 0x49, 0x8, 0x4A, 0xC3, 0x0, 0x5A, 0x50, 0x5B, 0x18, 0x5F, 0x60, 0x9, 0x4B, 0x30, 0x60, 0x18, 0x60, 0xF0, 0xE7, 0xFF, 0xF7,
+0xCF, 0xFE, 0x0, 0x20, 0xEF, 0xE7, 0x0, 0x0, 0x0, 0x86, 0x0, 0x2, 0x70, 0x74, 0x0, 0x2, 0xFF, 0xFF, 0x0, 0x20, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0x38, 0x85, 0x0, 0x2, 0x10, 0xB5, 0xFF, 0xF7,
+0xDB, 0xFE, 0x10, 0x4B, 0x1B, 0x68, 0x5A, 0x1C, 0x15, 0xD0, 0xF, 0x48, 0xDB, 0x0, 0x1A, 0x58, 0xE, 0x49, 0x13, 0x1C, 0xB, 0x40, 0x8B, 0x42, 0x11, 0xD0, 0x1, 0x24, 0x13, 0x1C, 0xB, 0x40, 0xDB, 0x0, 0x1A,
+0x58, 0x1, 0x34, 0x13, 0x1C, 0xB, 0x40, 0x8B, 0x42, 0xF6, 0xD1, 0xFF, 0xF7, 0xA5, 0xFE, 0x20, 0x1C, 0x10, 0xBD, 0xFF, 0xF7, 0xA1, 0xFE, 0x0, 0x24, 0xF9, 0xE7, 0x1, 0x24, 0xF5, 0xE7, 0x0, 0x0, 0x38, 0x85,
+0x0, 0x2, 0x70, 0x74, 0x0, 0x2, 0xFF, 0xFF, 0x0, 0x0, 0x70, 0xB5, 0xFF, 0xF7, 0xB1, 0xFE, 0xF, 0x4C, 0x20, 0x68, 0x43, 0x1C, 0x16, 0xD0, 0xE, 0x4B, 0xE, 0x4D, 0xC2, 0x0, 0xD2, 0x18, 0x2B, 0x68, 0x56,
+0x68, 0x98, 0x42, 0x7, 0xD0, 0x13, 0x88, 0x23, 0x60, 0xFF, 0xF7, 0x71, 0xFE, 0xFF, 0xF7, 0x81, 0xFE, 0x30, 0x1C, 0x70, 0xBD, 0xFF, 0xF7, 0x6B, 0xFE, 0x1, 0x23, 0x5B, 0x42, 0x2B, 0x60, 0x23, 0x60, 0xF4,
+0xE7, 0xFF, 0xF7, 0x76, 0xFE, 0x0, 0x26, 0xF2, 0xE7, 0x38, 0x85, 0x0, 0x2, 0x70, 0x74, 0x0, 0x2, 0x0, 0x86, 0x0, 0x2, 0x10, 0xB5, 0xFF, 0xF7, 0x89, 0xFE, 0x8, 0x4B, 0x1B, 0x68, 0x5A, 0x1C, 0x7, 0xD0,
+0x7, 0x4A, 0xDB, 0x0, 0x9B, 0x18, 0x5C, 0x68, 0xFF, 0xF7, 0x61, 0xFE, 0x20, 0x1C, 0x10, 0xBD, 0xFF, 0xF7, 0x5D, 0xFE, 0x0, 0x24, 0xF9, 0xE7, 0x0, 0x0, 0x38, 0x85, 0x0, 0x2, 0x70, 0x74, 0x0, 0x2, 0x10,
+0xB5, 0xFF, 0xF7, 0x71, 0xFE, 0xC, 0x4C, 0x23, 0x68, 0x0, 0x2B, 0x2, 0xD0, 0xFF, 0xF7, 0x4D, 0xFE, 0x10, 0xBD, 0xFF, 0xF7, 0x14, 0xFE, 0x0, 0x28, 0xF8, 0xD1, 0x7, 0x4B, 0x1, 0x22, 0x1B, 0x88, 0x13, 0x42,
+0x1, 0xD1, 0x22, 0x60, 0xF1, 0xE7, 0x22, 0x60, 0xFF, 0xF7, 0xE6, 0xFE, 0x3, 0x4B, 0x18, 0x60, 0xEB, 0xE7, 0x0, 0x0, 0xB0, 0x6F, 0x0, 0x2, 0x84, 0x1, 0x0, 0x4, 0x88, 0x1, 0x0, 0x4, 0x70, 0xB5, 0x6, 0x1C,
+0xD, 0x1C, 0x14, 0x1C, 0x0, 0x29, 0x1, 0xDD, 0x0, 0x2A, 0x1, 0xD0, 0x20, 0x2D, 0x1, 0xD9, 0x0, 0x20, 0x70, 0xBD, 0xFF, 0xF7, 0x44, 0xFE, 0x68, 0x1C, 0xFF, 0xF7, 0x5B, 0xFE, 0x0, 0x28, 0x3, 0xD1, 0xFF,
+0xF7, 0x1F, 0xFE, 0x0, 0x20, 0xF3, 0xE7, 0x30, 0x1C, 0xFF, 0xF7, 0x84, 0xFE, 0x0, 0x2D, 0x7, 0xDD, 0x26, 0x1C, 0x0, 0x24, 0x1, 0xCE, 0x1, 0x34, 0xFF, 0xF7, 0x7C, 0xFE, 0xA5, 0x42, 0xF9, 0xD1, 0xFF, 0xF7,
+0xB8, 0xFF, 0xFF, 0xF7, 0xC, 0xFE, 0x1, 0x20, 0xE0, 0xE7, 0x0, 0xB5, 0x81, 0xB0, 0xF, 0x28, 0xC, 0xD8, 0x1F, 0x29, 0xA, 0xD8, 0x0, 0x29, 0x1, 0xDD, 0x0, 0x2A, 0x6, 0xD0, 0x4, 0x4B, 0x0, 0x7, 0xB, 0x40,
+0x18, 0x43, 0xFF, 0xF7, 0xC6, 0xFF, 0x0, 0xE0, 0x0, 0x20, 0x1, 0xB0, 0x0, 0xBD, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0xB5, 0x83, 0xB0, 0x2, 0x1C, 0xF, 0x28, 0x1A, 0xD8, 0xE, 0x4B, 0x19, 0x42, 0xA, 0xD0, 0xC0,
+0x23, 0x0, 0x7, 0xDB, 0x4, 0x1, 0x91, 0x18, 0x43, 0x1, 0x21, 0x1, 0xAA, 0xFF, 0xF7, 0xAF, 0xFF, 0x3, 0xB0, 0x0, 0xBD, 0x8, 0x4B, 0x8, 0x1C, 0x18, 0x40, 0x80, 0x23, 0xDB, 0x4, 0x12, 0x7, 0x1A, 0x43, 0x10,
+0x43, 0x0, 0x21, 0x0, 0x22, 0xFF, 0xF7, 0xA1, 0xFF, 0xF0, 0xE7, 0x0, 0x20, 0xEE, 0xE7, 0x0, 0x0, 0x0, 0xFE, 0xFF, 0xFF, 0xFF, 0x1, 0x10, 0xB5, 0x4, 0x1C, 0xF, 0x28, 0x6, 0xD8, 0xA, 0x4B, 0xA, 0x1C, 0x1A,
+0x40, 0x80, 0x23, 0x9B, 0x4, 0x9A, 0x42, 0x1, 0xD0, 0x0, 0x20, 0x10, 0xBD, 0x7, 0x4B, 0x8, 0x1C, 0x18, 0x40, 0x80, 0x23, 0x22, 0x7, 0x1B, 0x5, 0x1A, 0x43, 0x10, 0x43, 0x0, 0x21, 0x0, 0x22, 0xFF, 0xF7,
+0x81, 0xFF, 0xF1, 0xE7, 0x0, 0x0, 0xC0, 0xFF, 0xFF, 0xFF, 0x3F, 0x0, 0x10, 0xB5, 0xFF, 0xF7, 0xCB, 0xFD, 0xD, 0x4B, 0x1B, 0x68, 0x5A, 0x1C, 0x4, 0xD1, 0xFF, 0xF7, 0xA7, 0xFD, 0x80, 0x20, 0x80, 0x0, 0x10,
+0xBD, 0x9, 0x49, 0x1, 0x24, 0x0, 0xE0, 0x13, 0x1C, 0xDB, 0x0, 0x5A, 0x5A, 0x7, 0x4B, 0x9A, 0x42, 0x2, 0xD0, 0x1, 0x34, 0x0, 0x2C, 0xF6, 0xDC, 0xFF, 0xF7, 0x96, 0xFD, 0x80, 0x23, 0x9B, 0x0, 0x18, 0x1B,
+0xEC, 0xE7, 0xF0, 0x84, 0x0, 0x2, 0x70, 0x74, 0x0, 0x2, 0xFF, 0xFF, 0x0, 0x0, 0xF0, 0xB5, 0x5F, 0x46, 0x56, 0x46, 0x4D, 0x46, 0x44, 0x46, 0xF0, 0xB4, 0x81, 0xB0, 0x4, 0x1C, 0xF, 0x1C, 0x91, 0x46, 0xF,
+0x28, 0x31, 0xD8, 0x0, 0x29, 0x2D, 0xDC, 0xFF, 0xF7, 0x9A, 0xFD, 0x49, 0x48, 0xA4, 0x0, 0x84, 0x46, 0x21, 0x1C, 0x61, 0x44, 0xD, 0x68, 0xA2, 0x46, 0x6A, 0x1C, 0x16, 0xD0, 0x46, 0x4B, 0x9D, 0x42, 0x13,
+0xD0, 0x45, 0x4E, 0xEB, 0x0, 0x99, 0x59, 0x6C, 0x0, 0xB, 0xF, 0x5, 0x2B, 0x7, 0xD1, 0x7A, 0xE0, 0xD3, 0x0, 0x99, 0x59, 0x54, 0x0, 0xB, 0xF, 0x5, 0x2B, 0x17, 0xD0, 0x15, 0x1C, 0x3D, 0x4B, 0xA, 0x1C, 0x1A,
+0x40, 0x9A, 0x42, 0xF3, 0xD1, 0xFF, 0xF7, 0x5A, 0xFD, 0x0, 0x22, 0x90, 0x46, 0x40, 0x46, 0x1, 0xB0, 0x3C, 0xBC, 0x90, 0x46, 0x99, 0x46, 0xA2, 0x46, 0xAB, 0x46, 0xF0, 0xBD, 0x0, 0x2A, 0xCF, 0xD1, 0x1,
+0x23, 0x58, 0x42, 0x80, 0x46, 0xF1, 0xE7, 0xAB, 0x46, 0x15, 0x1C, 0xB, 0x1, 0x19, 0xD, 0xB8, 0x46, 0x88, 0x45, 0x3E, 0xDC, 0x1, 0x29, 0x51, 0xDD, 0x2D, 0x48, 0x2F, 0x1C, 0x1, 0x22, 0xFB, 0x0, 0x9B, 0x59,
+0x1, 0x32, 0x1F, 0x1C, 0x7, 0x40, 0x91, 0x42, 0xF8, 0xD1, 0x7C, 0x0, 0x59, 0x46, 0x1, 0x31, 0x30, 0xD0, 0x59, 0x46, 0xC8, 0x0, 0x83, 0x59, 0xA4, 0x0, 0x26, 0x4A, 0xA1, 0x5B, 0x13, 0x40, 0x19, 0x43, 0x81,
+0x51, 0x21, 0x4A, 0xA3, 0x5B, 0x93, 0x42, 0x31, 0xD0, 0x43, 0x46, 0x0, 0x2B, 0xC, 0xDD, 0x48, 0x46, 0x2B, 0x1C, 0x0, 0x21, 0x14, 0x1C, 0xDB, 0x0, 0x9B, 0x19, 0x5A, 0x68, 0x1, 0x31, 0x4, 0xC0, 0x1B, 0x68,
+0x23, 0x40, 0x88, 0x45, 0xF6, 0xD1, 0x78, 0x1C, 0xC, 0xD0, 0x16, 0x49, 0x8A, 0x46, 0x0, 0xE0, 0x25, 0x1C, 0xEB, 0x0, 0x9B, 0x59, 0x54, 0x46, 0x28, 0x1C, 0x1C, 0x40, 0xFF, 0xF7, 0xF7, 0xFC, 0xBD, 0x42,
+0xF5, 0xD1, 0xFF, 0xF7, 0x5, 0xFD, 0xAB, 0xE7, 0x88, 0x46, 0xBE, 0xE7, 0xA4, 0x0, 0xA2, 0x5B, 0x53, 0x46, 0x63, 0x44, 0x1A, 0x60, 0xB, 0x4B, 0x9A, 0x42, 0xCF, 0xD1, 0x1, 0x23, 0x50, 0x46, 0x5B, 0x42,
+0x60, 0x44, 0x3, 0x60, 0xC9, 0xE7, 0x9, 0x4B, 0x59, 0x46, 0x50, 0x46, 0xC1, 0x50, 0xC8, 0xE7, 0x2F, 0x1C, 0xB6, 0xE7, 0x1, 0x23, 0x58, 0x42, 0x83, 0x46, 0xA0, 0xE7, 0x0, 0x0, 0x3C, 0x85, 0x0, 0x2, 0xFF,
+0xFF, 0x0, 0x0, 0x70, 0x74, 0x0, 0x2, 0x0, 0x0, 0xFF, 0xFF, 0xC0, 0x85, 0x0, 0x2, 0xF0, 0xB5, 0x5F, 0x46, 0x56, 0x46, 0x4D, 0x46, 0x44, 0x46, 0xF0, 0xB4, 0xCE, 0x48, 0xCF, 0x49, 0x8B, 0xB0, 0x1, 0x23,
+0xCE, 0x4F, 0xCF, 0x4E, 0x4, 0x90, 0x3, 0x60, 0x88, 0x46, 0xCE, 0x4B, 0x1B, 0x88, 0xD8, 0x5, 0x26, 0xD4, 0xCD, 0x4A, 0x80, 0x23, 0xDB, 0x2, 0x13, 0x60, 0x82, 0x23, 0xDB, 0x4, 0x1D, 0x68, 0xFF, 0xF7, 0x98,
+0xFC, 0x4, 0x1C, 0x42, 0x1C, 0x0, 0xD1, 0xDF, 0xE0, 0xC7, 0x4A, 0xC3, 0x0, 0xB9, 0x46, 0x30, 0x68, 0xDA, 0x51, 0x4B, 0x44, 0x5D, 0x60, 0x43, 0x1C, 0x0, 0xD1, 0xDA, 0xE0, 0xC3, 0x4B, 0xC0, 0x0, 0x4A, 0x46,
+0x21, 0x1C, 0x19, 0x40, 0x83, 0x58, 0xC1, 0x4A, 0x34, 0x60, 0x13, 0x40, 0x19, 0x43, 0x4B, 0x46, 0xC1, 0x50, 0xBA, 0x4B, 0x1B, 0x88, 0xD8, 0x5, 0xD8, 0xD5, 0xBD, 0x4A, 0x4, 0x99, 0x0, 0x23, 0xB, 0x60,
+0x13, 0x68, 0x2, 0x92, 0x0, 0x2B, 0x4E, 0xD1, 0x1, 0x23, 0xB, 0x60, 0xB9, 0x49, 0x13, 0x60, 0xA, 0x68, 0x80, 0x23, 0xDB, 0x2, 0x1A, 0x43, 0xA, 0x60, 0xAD, 0x4B, 0xAD, 0x4F, 0xB2, 0x48, 0xAD, 0x49, 0x1,
+0x22, 0x52, 0x42, 0x3, 0x93, 0x1, 0x97, 0x83, 0x46, 0x6, 0x91, 0x5, 0x92, 0x3, 0x99, 0xF, 0x68, 0x7A, 0x1C, 0x2F, 0xD0, 0x7D, 0x0, 0x1, 0x9E, 0x6B, 0x1C, 0x9B, 0x0, 0x98, 0x59, 0xB1, 0x46, 0x98, 0x46,
+0x3, 0x1, 0x34, 0xD5, 0xAB, 0x4B, 0x2, 0x1C, 0x1A, 0x40, 0x80, 0x23, 0x9B, 0x4, 0x1A, 0x43, 0x92, 0x46, 0xFA, 0x0, 0x93, 0x59, 0x1, 0xF, 0x58, 0x46, 0x3, 0x40, 0x3, 0x98, 0x3, 0x60, 0x5B, 0x45, 0x0, 0xD1,
+0xB5, 0xE0, 0xA3, 0x4D, 0x8C, 0x0, 0x63, 0x59, 0x0, 0x2B, 0x0, 0xD1, 0x9A, 0xE0, 0x38, 0x1C, 0xFF, 0xF7, 0x4F, 0xFC, 0xFF, 0xF7, 0x5F, 0xFC, 0x9F, 0x4B, 0x50, 0x46, 0xE1, 0x58, 0x63, 0x59, 0x98, 0x47,
+0xFF, 0xF7, 0x76, 0xFC, 0x3, 0x99, 0xF, 0x68, 0x7A, 0x1C, 0xCF, 0xD1, 0x9A, 0x4A, 0x4, 0x9F, 0x2, 0x98, 0x0, 0x23, 0x13, 0x80, 0x3B, 0x60, 0x3, 0x60, 0xB, 0xB0, 0x3C, 0xBC, 0x90, 0x46, 0x99, 0x46, 0xA2,
+0x46, 0xAB, 0x46, 0xF0, 0xBD, 0xC0, 0x23, 0x1B, 0x5, 0x1, 0x1C, 0x19, 0x40, 0x80, 0x23, 0xDB, 0x4, 0x99, 0x42, 0x0, 0xD1, 0x8E, 0xE0, 0x0, 0x29, 0x65, 0xD1, 0x8F, 0x4B, 0x3, 0x40, 0x9A, 0x46, 0x20, 0x2B,
+0x0, 0xDD, 0xB7, 0xE0, 0x0, 0x2B, 0x0, 0xDC, 0x7B, 0xE1, 0xFB, 0x0, 0x9B, 0x59, 0x5C, 0x46, 0x1C, 0x40, 0x5C, 0x45, 0xD7, 0xD0, 0x0, 0x21, 0x6, 0xE0, 0xE3, 0x0, 0x4A, 0x46, 0x9B, 0x58, 0x5C, 0x46, 0x1C,
+0x40, 0x5C, 0x45, 0xCE, 0xD0, 0x1, 0x31, 0x8A, 0x45, 0xF5, 0xD1, 0x79, 0x4E, 0xB4, 0x42, 0xC8, 0xD0, 0x63, 0x0, 0x7, 0x93, 0x49, 0x46, 0xE3, 0x0, 0x5B, 0x58, 0x3, 0x9A, 0x33, 0x40, 0x13, 0x60, 0xB3, 0x42,
+0x0, 0xD1, 0x52, 0xE1, 0x0, 0xF, 0x52, 0x46, 0x8, 0x90, 0x0, 0x2A, 0x0, 0xD0, 0x5, 0xE1, 0x78, 0x4B, 0xAA, 0x0, 0x48, 0x46, 0x13, 0x50, 0x8, 0x9B, 0x42, 0x46, 0x76, 0x4D, 0x51, 0x46, 0x4A, 0x44, 0x9E,
+0x0, 0x11, 0x60, 0x71, 0x59, 0x48, 0x1C, 0x0, 0xD1, 0x42, 0xE1, 0xC9, 0x0, 0x48, 0x46, 0xB, 0x58, 0x67, 0x48, 0x5A, 0x46, 0x3, 0x40, 0x3A, 0x40, 0x1A, 0x43, 0x4B, 0x46, 0xCA, 0x50, 0x77, 0x51, 0x6D, 0x4C,
+0x33, 0x59, 0x0, 0x2B, 0x0, 0xD1, 0x64, 0xE7, 0xFF, 0xF7, 0xEB, 0xFB, 0x6B, 0x4B, 0x50, 0x46, 0xF1, 0x58, 0x33, 0x59, 0x98, 0x47, 0xFF, 0xF7, 0x2, 0xFC, 0x8, 0x98, 0x0, 0x21, 0x0, 0x22, 0xFF, 0xF7, 0x53,
+0xFE, 0x55, 0xE7, 0x65, 0x4A, 0x13, 0x68, 0x1, 0x33, 0x13, 0x60, 0x9, 0xE7, 0x40, 0x46, 0x34, 0x60, 0x4, 0x60, 0x5, 0xE7, 0xFB, 0x0, 0x9B, 0x59, 0x59, 0x46, 0x3, 0x9A, 0xB, 0x40, 0x13, 0x60, 0x5B, 0x45,
+0x62, 0xD0, 0x38, 0x1C, 0xFF, 0xF7, 0xB8, 0xFB, 0x40, 0xE7, 0x5C, 0x4B, 0x57, 0x4D, 0x93, 0x51, 0x41, 0x46, 0x52, 0x46, 0x8A, 0x51, 0x61, 0x59, 0x4B, 0x1C, 0x5A, 0xD0, 0xC9, 0x0, 0x48, 0x46, 0xB, 0x58,
+0x49, 0x48, 0x5A, 0x46, 0x3, 0x40, 0x3A, 0x40, 0x1A, 0x43, 0x4B, 0x46, 0xCA, 0x50, 0x67, 0x51, 0x2B, 0xE7, 0x5, 0x9B, 0x6, 0x98, 0x3, 0x60, 0x3, 0x98, 0x3, 0x60, 0x43, 0xE7, 0x81, 0x1, 0x3B, 0xD5, 0xFB,
+0x0, 0x9B, 0x59, 0x5C, 0x46, 0x1C, 0x40, 0x5C, 0x45, 0x0, 0xD1, 0x50, 0xE7, 0xE3, 0x0, 0x9B, 0x19, 0x5B, 0x68, 0x62, 0x0, 0x9, 0x93, 0x93, 0x0, 0x4A, 0x46, 0x9B, 0x58, 0x59, 0x46, 0x3, 0x9A, 0xB, 0x40,
+0x13, 0x60, 0x5B, 0x45, 0x52, 0xD0, 0x3, 0xF, 0x43, 0x4A, 0x9E, 0x0, 0xB3, 0x58, 0x92, 0x46, 0x0, 0x2B, 0x2E, 0xD0, 0x38, 0x1C, 0xFF, 0xF7, 0x7B, 0xFB, 0xBC, 0x42, 0x2, 0xD0, 0x20, 0x1C, 0xFF, 0xF7, 0x76,
+0xFB, 0xFF, 0xF7, 0x86, 0xFB, 0x3C, 0x4B, 0x57, 0x46, 0xF1, 0x58, 0x9, 0x98, 0xF3, 0x59, 0x98, 0x47, 0xFF, 0xF7, 0x9C, 0xFB, 0xF4, 0xE6, 0xFB, 0x0, 0x9B, 0x59, 0x58, 0x46, 0x3, 0x99, 0x3, 0x40, 0xB, 0x60,
+0x5B, 0x45, 0xA7, 0xD1, 0x5, 0x9A, 0x6, 0x9B, 0xA, 0x60, 0x1A, 0x60, 0xA2, 0xE7, 0x29, 0x4B, 0x3C, 0x1C, 0x3, 0x40, 0x2A, 0x1C, 0x9, 0x93, 0xC9, 0xE7, 0x5, 0x9B, 0x6, 0x98, 0x13, 0x60, 0x3, 0x60, 0x97,
+0xE7, 0x2D, 0x4B, 0x67, 0x51, 0xE7, 0x50, 0xD8, 0xE6, 0xBC, 0x42, 0x2, 0xD0, 0x20, 0x1C, 0xFF, 0xF7, 0x4A, 0xFB, 0x29, 0x4B, 0xAA, 0x0, 0x48, 0x46, 0x13, 0x50, 0x9, 0x99, 0x42, 0x46, 0x1E, 0x4D, 0x4A,
+0x44, 0x11, 0x60, 0x71, 0x59, 0x4B, 0x1C, 0x10, 0xD0, 0xC9, 0x0, 0x48, 0x46, 0xB, 0x58, 0x11, 0x48, 0x5A, 0x46, 0x3, 0x40, 0x3A, 0x40, 0x1A, 0x43, 0x4B, 0x46, 0xCA, 0x50, 0x77, 0x51, 0xBB, 0xE6, 0x5,
+0x9B, 0x6, 0x99, 0x13, 0x60, 0xB, 0x60, 0xA7, 0xE7, 0x1A, 0x4B, 0x77, 0x51, 0xF7, 0x50, 0xB2, 0xE6, 0x0, 0x0, 0xAC, 0x6F, 0x0, 0x2, 0x38, 0x85, 0x0, 0x2, 0x70, 0x74, 0x0, 0x2, 0x0, 0x86, 0x0, 0x2, 0x84,
+0x1, 0x0, 0x4, 0x14, 0x2, 0x0, 0x4, 0xFF, 0xFF, 0x0, 0x20, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0xB4, 0x6F, 0x0, 0x2, 0x10, 0x2, 0x0, 0x4, 0xFF, 0xFF, 0x3F, 0x0, 0xB0, 0x84, 0x0, 0x2, 0x80, 0x85,
+0x0, 0x2, 0x8, 0x2, 0x0, 0x4, 0xFF, 0xFF, 0xFF, 0x1, 0xFF, 0xFF, 0x0, 0x50, 0xC0, 0x85, 0x0, 0x2, 0x4, 0x86, 0x0, 0x2, 0x30, 0x74, 0x0, 0x2, 0xB8, 0x6F, 0x0, 0x2, 0xFF, 0xFF, 0x0, 0x30, 0x70, 0x84, 0x0,
+0x2, 0xF4, 0x84, 0x0, 0x2, 0x3C, 0x85, 0x0, 0x2, 0xFF, 0xFF, 0x0, 0x40, 0xAB, 0x0, 0x48, 0x46, 0x1B, 0x58, 0x38, 0x1C, 0x33, 0x40, 0x98, 0x46, 0xFF, 0xF7, 0xEC, 0xFA, 0x42, 0x46, 0xD0, 0x0, 0x4B, 0x46,
+0xC2, 0x58, 0x25, 0x4D, 0x51, 0x46, 0xA0, 0x23, 0x29, 0x40, 0x32, 0x40, 0xDB, 0x5, 0x9, 0x4, 0x1A, 0x43, 0x11, 0x43, 0x4F, 0x46, 0xC1, 0x51, 0x50, 0x46, 0x1, 0x28, 0x13, 0xDD, 0xAC, 0x46, 0xC0, 0x25,
+0x31, 0x40, 0x1, 0x38, 0xED, 0x5, 0xC9, 0x0, 0x4F, 0x46, 0xCA, 0x59, 0x63, 0x46, 0x3, 0x40, 0x32, 0x40, 0x1B, 0x4, 0x2A, 0x43, 0x13, 0x43, 0xCB, 0x51, 0x1, 0x38, 0x19, 0x1C, 0x31, 0x40, 0x0, 0x28, 0xF0,
+0xD1, 0x7, 0x98, 0x49, 0x46, 0x82, 0x0, 0x53, 0x58, 0x13, 0x4F, 0x58, 0x46, 0x3B, 0x40, 0x3, 0x43, 0x53, 0x50, 0x8, 0x99, 0x11, 0x4D, 0x8E, 0x0, 0x73, 0x59, 0x5A, 0x1C, 0x14, 0xD0, 0xDB, 0x0, 0x48, 0x46,
+0x1A, 0x58, 0xC, 0x49, 0x47, 0x46, 0xA, 0x40, 0x3A, 0x43, 0x1A, 0x50, 0x74, 0x51, 0xCC, 0xE6, 0x5, 0x9B, 0x6, 0x99, 0x13, 0x60, 0xB, 0x60, 0xA7, 0xE6, 0x8, 0x4B, 0x77, 0x51, 0xF7, 0x50, 0xC3, 0xE6, 0x3C,
+0x1C, 0x93, 0xE6, 0x5, 0x4B, 0x47, 0x46, 0xF7, 0x50, 0x74, 0x51, 0xBC, 0xE6, 0x0, 0x0, 0xFF, 0xF, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0xC0, 0x85, 0x0, 0x2, 0x3C, 0x85, 0x0, 0x2, 0xF0, 0xB5, 0x57, 0x46, 0x46,
+0x46, 0xC0, 0xB4, 0x81, 0xB0, 0x4, 0x1C, 0xF, 0x28, 0x7, 0xD9, 0x0, 0x21, 0x88, 0x46, 0x40, 0x46, 0x1, 0xB0, 0xC, 0xBC, 0x90, 0x46, 0x9A, 0x46, 0xF0, 0xBD, 0xFF, 0xF7, 0xB2, 0xFA, 0x2B, 0x4A, 0xA4, 0x0,
+0x94, 0x46, 0x23, 0x1C, 0x63, 0x44, 0x1D, 0x68, 0xA2, 0x46, 0x69, 0x1C, 0x17, 0xD0, 0x28, 0x4B, 0x9D, 0x42, 0x14, 0xD0, 0x27, 0x4A, 0xE8, 0x0, 0x81, 0x58, 0x6F, 0x0, 0xB, 0xF, 0x16, 0x1C, 0x4, 0x2B, 0x7,
+0xD1, 0x3A, 0xE0, 0xE2, 0x0, 0x91, 0x59, 0x67, 0x0, 0xB, 0xF, 0x4, 0x2B, 0xA, 0xD0, 0x25, 0x1C, 0x1E, 0x4B, 0xC, 0x1C, 0x1C, 0x40, 0x9C, 0x42, 0xF3, 0xD1, 0xFF, 0xF7, 0x71, 0xFA, 0x0, 0x22, 0x90, 0x46,
+0xD1, 0xE7, 0x93, 0x19, 0x5B, 0x68, 0x98, 0x46, 0x6A, 0x1C, 0x17, 0xD0, 0x17, 0x4B, 0xE8, 0x0, 0x19, 0x40, 0x17, 0x4A, 0x83, 0x59, 0x13, 0x40, 0x19, 0x43, 0x81, 0x51, 0x28, 0x1C, 0xBB, 0x0, 0x9A, 0x5B,
+0x11, 0x4B, 0x9A, 0x42, 0x5, 0xD0, 0x20, 0x1C, 0xFF, 0xF7, 0x46, 0xFA, 0xFF, 0xF7, 0x56, 0xFA, 0xB8, 0xE7, 0x10, 0x4B, 0x51, 0x46, 0xC8, 0x50, 0xF5, 0xE7, 0x28, 0x1C, 0xA, 0x4A, 0xB, 0x1C, 0x51, 0x46,
+0x13, 0x40, 0x61, 0x44, 0xB, 0x60, 0x93, 0x42, 0xE7, 0xD1, 0x1, 0x23, 0x5B, 0x42, 0xB, 0x60, 0xE3, 0xE7, 0x83, 0x18, 0x5B, 0x68, 0x1, 0x20, 0x98, 0x46, 0x2C, 0x1C, 0x40, 0x42, 0xEC, 0xE7, 0x0, 0x0, 0x3C,
+0x85, 0x0, 0x2, 0xFF, 0xFF, 0x0, 0x0, 0x70, 0x74, 0x0, 0x2, 0x0, 0x0, 0xFF, 0xFF, 0xC0, 0x85, 0x0, 0x2, 0xF0, 0xB5, 0x57, 0x46, 0x46, 0x46, 0xC0, 0xB4, 0x81, 0xB0, 0x4, 0x1C, 0xF, 0x28, 0x7, 0xD9, 0x0,
+0x21, 0x88, 0x46, 0x40, 0x46, 0x1, 0xB0, 0xC, 0xBC, 0x90, 0x46, 0x9A, 0x46, 0xF0, 0xBD, 0xFF, 0xF7, 0x3E, 0xFA, 0x2B, 0x4A, 0xA4, 0x0, 0x94, 0x46, 0x23, 0x1C, 0x63, 0x44, 0x1D, 0x68, 0xA2, 0x46, 0x69,
+0x1C, 0x17, 0xD0, 0x28, 0x4B, 0x9D, 0x42, 0x14, 0xD0, 0x27, 0x4A, 0xE8, 0x0, 0x81, 0x58, 0x6F, 0x0, 0xB, 0xF, 0x16, 0x1C, 0x3, 0x2B, 0x7, 0xD1, 0x3A, 0xE0, 0xE2, 0x0, 0x91, 0x59, 0x67, 0x0, 0xB, 0xF,
+0x3, 0x2B, 0xA, 0xD0, 0x25, 0x1C, 0x1E, 0x4B, 0xC, 0x1C, 0x1C, 0x40, 0x9C, 0x42, 0xF3, 0xD1, 0xFF, 0xF7, 0xFD, 0xF9, 0x0, 0x22, 0x90, 0x46, 0xD1, 0xE7, 0x93, 0x19, 0x5B, 0x68, 0x98, 0x46, 0x6A, 0x1C,
+0x17, 0xD0, 0x17, 0x4B, 0xE8, 0x0, 0x19, 0x40, 0x17, 0x4A, 0x83, 0x59, 0x13, 0x40, 0x19, 0x43, 0x81, 0x51, 0x28, 0x1C, 0xBB, 0x0, 0x9A, 0x5B, 0x11, 0x4B, 0x9A, 0x42, 0x5, 0xD0, 0x20, 0x1C, 0xFF, 0xF7,
+0xD2, 0xF9, 0xFF, 0xF7, 0xE2, 0xF9, 0xB8, 0xE7, 0x10, 0x4B, 0x51, 0x46, 0xC8, 0x50, 0xF5, 0xE7, 0x28, 0x1C, 0xA, 0x4A, 0xB, 0x1C, 0x51, 0x46, 0x13, 0x40, 0x61, 0x44, 0xB, 0x60, 0x93, 0x42, 0xE7, 0xD1,
+0x1, 0x23, 0x5B, 0x42, 0xB, 0x60, 0xE3, 0xE7, 0x83, 0x18, 0x5B, 0x68, 0x1, 0x20, 0x98, 0x46, 0x2C, 0x1C, 0x40, 0x42, 0xEC, 0xE7, 0x0, 0x0, 0x3C, 0x85, 0x0, 0x2, 0xFF, 0xFF, 0x0, 0x0, 0x70, 0x74, 0x0,
+0x2, 0x0, 0x0, 0xFF, 0xFF, 0xC0, 0x85, 0x0, 0x2, 0x10, 0xB5, 0x4, 0x1C, 0xF, 0x28, 0x2, 0xD9, 0x0, 0x24, 0x20, 0x1C, 0x10, 0xBD, 0xFF, 0xF7, 0xD3, 0xF9, 0xF, 0x4A, 0xA3, 0x0, 0x98, 0x58, 0x43, 0x1C, 0x15,
+0xD0, 0xD, 0x4B, 0x98, 0x42, 0x12, 0xD0, 0xD, 0x49, 0x0, 0x24, 0x1A, 0x1C, 0x2, 0xE0, 0x10, 0x40, 0x90, 0x42, 0x8, 0xD0, 0xC3, 0x0, 0x58, 0x58, 0x3, 0xF, 0x5, 0x2B, 0xF7, 0xD1, 0x10, 0x40, 0x1, 0x34,
+0x90, 0x42, 0xF6, 0xD1, 0xFF, 0xF7, 0x9B, 0xF9, 0xE0, 0xE7, 0x0, 0x24, 0xFF, 0xF7, 0x97, 0xF9, 0xDC, 0xE7, 0x3C, 0x85, 0x0, 0x2, 0xFF, 0xFF, 0x0, 0x0, 0x70, 0x74, 0x0, 0x2, 0x10, 0xB5, 0x4, 0x1C, 0xF,
+0x28, 0x2, 0xD9, 0x0, 0x24, 0x20, 0x1C, 0x10, 0xBD, 0xFF, 0xF7, 0xA5, 0xF9, 0x11, 0x4A, 0xA3, 0x0, 0x98, 0x58, 0x43, 0x1C, 0x12, 0xD0, 0xF, 0x4B, 0x98, 0x42, 0xF, 0xD0, 0xF, 0x4A, 0xC3, 0x0, 0x98, 0x58,
+0x3, 0xF, 0x5, 0x2B, 0x5, 0xD1, 0xD, 0xE0, 0xC3, 0x0, 0x98, 0x58, 0x3, 0xF, 0x5, 0x2B, 0x8, 0xD0, 0x8, 0x4B, 0x18, 0x40, 0x98, 0x42, 0xF6, 0xD1, 0xFF, 0xF7, 0x6D, 0xF9, 0x1, 0x24, 0x64, 0x42, 0xDE, 0xE7,
+0x3, 0x1, 0x1C, 0xD, 0xFF, 0xF7, 0x66, 0xF9, 0xD9, 0xE7, 0x0, 0x0, 0x3C, 0x85, 0x0, 0x2, 0xFF, 0xFF, 0x0, 0x0, 0x70, 0x74, 0x0, 0x2, 0x10, 0xB5, 0x4, 0x1C, 0xF, 0x28, 0x1, 0xD9, 0x0, 0x20, 0x10, 0xBD,
+0xFF, 0xF7, 0x74, 0xF9, 0xF, 0x4A, 0xA3, 0x0, 0x98, 0x58, 0x43, 0x1C, 0x12, 0xD0, 0xE, 0x4B, 0x98, 0x42, 0xF, 0xD0, 0xD, 0x4A, 0xC3, 0x0, 0x98, 0x58, 0x3, 0xF, 0x5, 0x2B, 0x5, 0xD1, 0xB, 0xE0, 0xC3, 0x0,
+0x98, 0x58, 0x3, 0xF, 0x5, 0x2B, 0x6, 0xD0, 0x6, 0x4B, 0x18, 0x40, 0x98, 0x42, 0xF6, 0xD1, 0xFF, 0xF7, 0x3C, 0xF9, 0xE0, 0xE7, 0xFF, 0xF7, 0x39, 0xF9, 0x1, 0x20, 0xDD, 0xE7, 0x0, 0x0, 0x3C, 0x85, 0x0,
+0x2, 0xFF, 0xFF, 0x0, 0x0, 0x70, 0x74, 0x0, 0x2, 0x10, 0xB5, 0x4, 0x1C, 0xF, 0x28, 0x1, 0xD9, 0x0, 0x20, 0x10, 0xBD, 0xFF, 0xF7, 0x46, 0xF9, 0xF, 0x4A, 0xA3, 0x0, 0x98, 0x58, 0x43, 0x1C, 0x12, 0xD0, 0xE,
+0x4B, 0x98, 0x42, 0xF, 0xD0, 0xD, 0x4A, 0xC3, 0x0, 0x98, 0x58, 0x3, 0xF, 0x4, 0x2B, 0x5, 0xD1, 0xB, 0xE0, 0xC3, 0x0, 0x98, 0x58, 0x3, 0xF, 0x4, 0x2B, 0x6, 0xD0, 0x6, 0x4B, 0x18, 0x40, 0x98, 0x42, 0xF6,
+0xD1, 0xFF, 0xF7, 0xE, 0xF9, 0xE0, 0xE7, 0xFF, 0xF7, 0xB, 0xF9, 0x1, 0x20, 0xDD, 0xE7, 0x0, 0x0, 0x3C, 0x85, 0x0, 0x2, 0xFF, 0xFF, 0x0, 0x0, 0x70, 0x74, 0x0, 0x2, 0x10, 0xB5, 0x4, 0x1C, 0xF, 0x28, 0x1,
+0xD9, 0x0, 0x20, 0x10, 0xBD, 0xFF, 0xF7, 0x18, 0xF9, 0xF, 0x4A, 0xA3, 0x0, 0x98, 0x58, 0x43, 0x1C, 0x12, 0xD0, 0xE, 0x4B, 0x98, 0x42, 0xF, 0xD0, 0xD, 0x4A, 0xC3, 0x0, 0x98, 0x58, 0x3, 0xF, 0x3, 0x2B,
+0x5, 0xD1, 0xB, 0xE0, 0xC3, 0x0, 0x98, 0x58, 0x3, 0xF, 0x3, 0x2B, 0x6, 0xD0, 0x6, 0x4B, 0x18, 0x40, 0x98, 0x42, 0xF6, 0xD1, 0xFF, 0xF7, 0xE0, 0xF8, 0xE0, 0xE7, 0xFF, 0xF7, 0xDD, 0xF8, 0x1, 0x20, 0xDD,
+0xE7, 0x0, 0x0, 0x3C, 0x85, 0x0, 0x2, 0xFF, 0xFF, 0x0, 0x0, 0x70, 0x74, 0x0, 0x2, 0xF0, 0xB5, 0x81, 0xB0, 0x4, 0x1C, 0xE, 0x1C, 0x17, 0x1C, 0xF, 0x28, 0x1, 0xD9, 0x1, 0xB0, 0xF0, 0xBD, 0xFF, 0xF7, 0xE7,
+0xF8, 0x12, 0x4B, 0xA2, 0x0, 0xD6, 0x50, 0x11, 0x4B, 0xD7, 0x50, 0x0, 0x2E, 0x1A, 0xD0, 0x20, 0x1C, 0xFF, 0xF7, 0x1, 0xFF, 0x5, 0x1C, 0x0, 0x28, 0x14, 0xDD, 0x20, 0x1C, 0xFF, 0xF7, 0x29, 0xFF, 0x39, 0x1C,
+0xB0, 0x47, 0x20, 0x1C, 0xFF, 0xF7, 0xF6, 0xFE, 0x85, 0x42, 0xEF, 0xD1, 0x0, 0x21, 0x0, 0x22, 0x20, 0x1C, 0xFF, 0xF7, 0x21, 0xFB, 0x20, 0x1C, 0xFF, 0xF7, 0xEC, 0xFE, 0x5, 0x1C, 0x0, 0x28, 0xEA, 0xDC,
+0xFF, 0xF7, 0xA5, 0xF8, 0xD6, 0xE7, 0x4, 0x86, 0x0, 0x2, 0x30, 0x74, 0x0, 0x2, 0x10, 0xB5, 0x14, 0x1C, 0xF, 0x28, 0x6, 0xD8, 0x6, 0x4B, 0x82, 0x0, 0xD3, 0x58, 0x0, 0x2B, 0x3, 0xD0, 0x0, 0x29, 0x1, 0xD0,
+0x0, 0x20, 0x10, 0xBD, 0x22, 0x1C, 0xFF, 0xF7, 0xBC, 0xFF, 0x1, 0x20, 0xF9, 0xE7, 0x4, 0x86, 0x0, 0x2, 0x70, 0xB5, 0x4, 0x1C, 0xD, 0x1C, 0x16, 0x1C, 0xF, 0x28, 0x0, 0xD9, 0x70, 0xBD, 0xFF, 0xF7, 0xA1,
+0xF8, 0xA, 0x4B, 0xA2, 0x0, 0xD5, 0x50, 0x9, 0x4B, 0xD6, 0x50, 0x0, 0x2D, 0x5, 0xD1, 0x9, 0xE0, 0x20, 0x1C, 0xFF, 0xF7, 0xD2, 0xFD, 0x31, 0x1C, 0xA8, 0x47, 0x20, 0x1C, 0xFF, 0xF7, 0x43, 0xFF, 0x0, 0x28,
+0xF5, 0xD1, 0xFF, 0xF7, 0x6F, 0xF8, 0xE7, 0xE7, 0x70, 0x84, 0x0, 0x2, 0xF4, 0x84, 0x0, 0x2, 0x10, 0xB5, 0x14, 0x1C, 0xF, 0x28, 0x6, 0xD8, 0x6, 0x4B, 0x82, 0x0, 0xD3, 0x58, 0x0, 0x2B, 0x3, 0xD0, 0x0, 0x29,
+0x1, 0xD0, 0x0, 0x20, 0x10, 0xBD, 0x22, 0x1C, 0xFF, 0xF7, 0xCE, 0xFF, 0x1, 0x20, 0xF9, 0xE7, 0x70, 0x84, 0x0, 0x2, 0x70, 0xB5, 0x4, 0x1C, 0xD, 0x1C, 0x16, 0x1C, 0xF, 0x28, 0x0, 0xD9, 0x70, 0xBD, 0xFF,
+0xF7, 0x6B, 0xF8, 0xA, 0x4B, 0xA2, 0x0, 0xD5, 0x50, 0x9, 0x4B, 0xD6, 0x50, 0x0, 0x2D, 0x5, 0xD1, 0x9, 0xE0, 0x20, 0x1C, 0xFF, 0xF7, 0x10, 0xFE, 0x31, 0x1C, 0xA8, 0x47, 0x20, 0x1C, 0xFF, 0xF7, 0x3B, 0xFF,
+0x0, 0x28, 0xF5, 0xD1, 0xFF, 0xF7, 0x39, 0xF8, 0xE7, 0xE7, 0xB0, 0x84, 0x0, 0x2, 0x80, 0x85, 0x0, 0x2, 0x10, 0xB5, 0x14, 0x1C, 0xF, 0x28, 0x6, 0xD8, 0x6, 0x4B, 0x82, 0x0, 0xD3, 0x58, 0x0, 0x2B, 0x3, 0xD0,
+0x0, 0x29, 0x1, 0xD0, 0x0, 0x20, 0x10, 0xBD, 0x22, 0x1C, 0xFF, 0xF7, 0xCE, 0xFF, 0x1, 0x20, 0xF9, 0xE7, 0xB0, 0x84, 0x0, 0x2, 0xF0, 0xB5, 0x5F, 0x46, 0x56, 0x46, 0x4D, 0x46, 0x44, 0x46, 0xF0, 0xB4, 0xC0,
+0x20, 0x85, 0xB0, 0xC0, 0x2, 0x0, 0xF0, 0x71, 0xF9, 0x4F, 0x4A, 0x4F, 0x4C, 0x93, 0x46, 0x5B, 0x46, 0x0, 0x22, 0x1A, 0x60, 0x4E, 0x4B, 0xA1, 0x46, 0x1A, 0x60, 0x4D, 0x4B, 0x1, 0x22, 0x52, 0x42, 0x1A,
+0x60, 0x4C, 0x4B, 0x4D, 0x4C, 0x1A, 0x60, 0x4D, 0x4B, 0xA0, 0x46, 0x1A, 0x60, 0x4C, 0x4B, 0x4D, 0x4C, 0x1A, 0x60, 0x4D, 0x4B, 0x4D, 0x4F, 0x9A, 0x46, 0x4D, 0x4B, 0x4E, 0x4E, 0x4E, 0x4D, 0x0, 0x21, 0x9C,
+0x46, 0x1, 0x94, 0x0, 0x20, 0x54, 0x46, 0x4B, 0x46, 0xA, 0x51, 0x44, 0x46, 0xCA, 0x50, 0xB, 0x19, 0x64, 0x46, 0x18, 0x60, 0xB, 0x19, 0x18, 0x60, 0xCB, 0x19, 0x18, 0x60, 0x1, 0x9C, 0x8B, 0x19, 0x18, 0x60,
+0x4B, 0x19, 0x18, 0x60, 0xB, 0x19, 0x4, 0x31, 0x18, 0x60, 0x40, 0x29, 0xE9, 0xD1, 0x80, 0x24, 0x41, 0x49, 0x42, 0x4D, 0x0, 0x20, 0x0, 0x26, 0xA4, 0x0, 0x1, 0x30, 0x3, 0x1C, 0xA, 0x1F, 0x2B, 0x40, 0xE,
+0x60, 0x13, 0x60, 0x8, 0x31, 0xA0, 0x42, 0xF6, 0xD1, 0x3C, 0x4A, 0x3D, 0x4B, 0x3D, 0x4C, 0xD5, 0x50, 0x3D, 0x4B, 0x3E, 0x4A, 0x0, 0x25, 0x1A, 0x80, 0x4, 0x3B, 0x1E, 0x80, 0x0, 0x21, 0x1E, 0x1C, 0xF, 0x20,
+0x33, 0x88, 0x1A, 0x1C, 0x4B, 0x1C, 0x2, 0x40, 0x3, 0x40, 0x9A, 0x42, 0x43, 0xD0, 0x53, 0x1C, 0x19, 0x1C, 0x1, 0x40, 0xB, 0x2, 0x33, 0x80, 0xE, 0x2A, 0x14, 0xD0, 0x9, 0x2D, 0x14, 0xDC, 0x0, 0x23, 0x3,
+0x93, 0x3, 0x9B, 0x31, 0x4A, 0x93, 0x42, 0x5, 0xDC, 0x3, 0x9B, 0x1, 0x33, 0x3, 0x93, 0x3, 0x9B, 0x93, 0x42, 0xF9, 0xDD, 0x1, 0x3C, 0x0, 0x2C, 0xE0, 0xD1, 0x2C, 0x4B, 0x0, 0x20, 0x1C, 0x80, 0x20, 0xE0,
+0x2, 0x2D, 0xE8, 0xDD, 0x29, 0x4A, 0xE0, 0x23, 0x1B, 0x1, 0x13, 0x80, 0x28, 0x4B, 0x0, 0x22, 0x1A, 0x60, 0x28, 0x4B, 0x80, 0x20, 0x1A, 0x60, 0x27, 0x4B, 0x28, 0x49, 0x1A, 0x60, 0x28, 0x4B, 0x80, 0x2,
+0x1A, 0x60, 0x0, 0xF0, 0x52, 0xF8, 0x80, 0x20, 0x26, 0x49, 0xC0, 0x2, 0x0, 0xF0, 0x4D, 0xF8, 0xC0, 0x20, 0xC0, 0x2, 0x0, 0xF0, 0xB5, 0xF8, 0x1, 0x23, 0x5A, 0x46, 0x13, 0x60, 0x1, 0x20, 0x5, 0xB0, 0x3C,
+0xBC, 0x90, 0x46, 0x99, 0x46, 0xA2, 0x46, 0xAB, 0x46, 0xF0, 0xBD, 0x1, 0x35, 0xB9, 0xE7, 0xA8, 0x6F, 0x0, 0x2, 0xC0, 0x85, 0x0, 0x2, 0xF0, 0x84, 0x0, 0x2, 0x38, 0x85, 0x0, 0x2, 0x0, 0x86, 0x0, 0x2, 0x30,
+0x74, 0x0, 0x2, 0x34, 0x85, 0x0, 0x2, 0x7C, 0x85, 0x0, 0x2, 0x4, 0x86, 0x0, 0x2, 0x3C, 0x85, 0x0, 0x2, 0x80, 0x85, 0x0, 0x2, 0xF4, 0x84, 0x0, 0x2, 0xB0, 0x84, 0x0, 0x2, 0x70, 0x84, 0x0, 0x2, 0x74, 0x74,
+0x0, 0x2, 0xFF, 0xFF, 0x0, 0x0, 0x70, 0x74, 0x0, 0x2, 0xF8, 0xF, 0x0, 0x0, 0x10, 0x27, 0x0, 0x0, 0x84, 0x1, 0x0, 0x4, 0xC, 0x84, 0xFF, 0xFF, 0xF, 0x27, 0x0, 0x0, 0x80, 0x1, 0x0, 0x4, 0xAC, 0x6F, 0x0,
+0x2, 0xB0, 0x6F, 0x0, 0x2, 0xB4, 0x6F, 0x0, 0x2, 0x39, 0x1F, 0x0, 0x2, 0xB8, 0x6F, 0x0, 0x2, 0xDD, 0x23, 0x0, 0x2, 0x70, 0x47, 0x0, 0x0, 0x10, 0xB5, 0xC, 0x1C, 0x0, 0x28, 0xA, 0xD0, 0x11, 0x4B, 0x0, 0x21,
+0x1A, 0x68, 0x0, 0x2A, 0x6, 0xD0, 0x90, 0x42, 0x4, 0xD0, 0x1, 0x31, 0x8, 0x33, 0x19, 0x29, 0xF6, 0xD1, 0x10, 0xBD, 0xC, 0x4A, 0xCB, 0x0, 0x9C, 0x50, 0x9B, 0x18, 0x58, 0x60, 0xC3, 0x7, 0x6, 0xD5, 0xA,
+0x4B, 0x8, 0x21, 0x1A, 0x88, 0xA, 0x43, 0x12, 0x4, 0x12, 0xC, 0x1A, 0x80, 0x83, 0x7, 0xEE, 0xD5, 0x5, 0x4B, 0x10, 0x21, 0x1A, 0x88, 0xA, 0x43, 0x12, 0x4, 0x12, 0xC, 0x1A, 0x80, 0xE6, 0xE7, 0x4, 0x0, 0x0,
+0x1, 0x0, 0x0, 0x0, 0x1, 0x4, 0x0, 0x0, 0x4, 0x0, 0xB5, 0xB, 0x4B, 0xB, 0x4A, 0x19, 0x1C, 0xC8, 0x31, 0x0, 0x20, 0x1A, 0x60, 0x58, 0x60, 0x8, 0x33, 0x8B, 0x42, 0xFA, 0xD1, 0x8, 0x4A, 0x8, 0x4B, 0x13,
+0x60, 0x8, 0x4B, 0x9, 0x4A, 0x18, 0x60, 0x1, 0x23, 0x5B, 0x42, 0x13, 0x60, 0x7, 0x4B, 0x1, 0x22, 0x1A, 0x80, 0x0, 0xBD, 0x0, 0x0, 0x0, 0x1, 0x21, 0x2F, 0x0, 0x2, 0xFC, 0x3F, 0x0, 0xB, 0xC8, 0x0, 0x0,
+0x1, 0x10, 0x2, 0x0, 0x4, 0x14, 0x2, 0x0, 0x4, 0x8, 0x2, 0x0, 0x4, 0x10, 0xB5, 0x7, 0x4C, 0x7, 0x4A, 0x1, 0x23, 0x0, 0x21, 0x5B, 0x42, 0x21, 0x80, 0x13, 0x60, 0x5, 0x4B, 0x19, 0x60, 0x5, 0x4B, 0x18, 0x60,
+0x1, 0x23, 0x23, 0x80, 0x10, 0xBD, 0x0, 0x0, 0x8, 0x2, 0x0, 0x4, 0x14, 0x2, 0x0, 0x4, 0x10, 0x2, 0x0, 0x4, 0xFC, 0x3F, 0x0, 0xB, 0x10, 0xB5, 0x1, 0x24, 0x20, 0x42, 0x6, 0xD0, 0xF, 0x4B, 0x8, 0x21, 0x1A,
+0x88, 0xA, 0x43, 0x12, 0x4, 0x12, 0xC, 0x1A, 0x80, 0x83, 0x7, 0x6, 0xD5, 0xB, 0x4B, 0x10, 0x21, 0x1A, 0x88, 0xA, 0x43, 0x12, 0x4, 0x12, 0xC, 0x1A, 0x80, 0x43, 0x7, 0x6, 0xD5, 0x6, 0x4B, 0x20, 0x21, 0x1A,
+0x88, 0xA, 0x43, 0x12, 0x4, 0x12, 0xC, 0x1A, 0x80, 0x4, 0x4A, 0x13, 0x68, 0x3, 0x43, 0x13, 0x60, 0x3, 0x4B, 0x1C, 0x80, 0x10, 0xBD, 0x4, 0x0, 0x0, 0x4, 0x10, 0x2, 0x0, 0x4, 0x8, 0x2, 0x0, 0x4, 0x0, 0xB5,
+0xC3, 0x7, 0x4, 0xD5, 0xC, 0x4B, 0xC, 0x49, 0x1A, 0x88, 0xA, 0x40, 0x1A, 0x80, 0x83, 0x7, 0x4, 0xD5, 0x8, 0x4B, 0xA, 0x49, 0x1A, 0x88, 0xA, 0x40, 0x1A, 0x80, 0x43, 0x7, 0x4, 0xD5, 0x5, 0x4B, 0x7, 0x49,
+0x1A, 0x88, 0xA, 0x40, 0x1A, 0x80, 0x6, 0x4A, 0x13, 0x68, 0x83, 0x43, 0x13, 0x60, 0x0, 0xBD, 0x0, 0x0, 0x4, 0x0, 0x0, 0x4, 0xF7, 0xFF, 0x0, 0x0, 0xEF, 0xFF, 0x0, 0x0, 0xDF, 0xFF, 0x0, 0x0, 0x10, 0x2,
+0x0, 0x4, 0x10, 0xB5, 0x8, 0x4A, 0x0, 0x24, 0x3, 0xE0, 0x1, 0x34, 0x8, 0x32, 0x19, 0x2C, 0x8, 0xD0, 0x13, 0x68, 0x98, 0x42, 0xF8, 0xD1, 0xFF, 0xF7, 0xCD, 0xFF, 0x3, 0x49, 0x3, 0x4B, 0xE2, 0x0, 0x53, 0x50,
+0x10, 0xBD, 0x4, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x21, 0x2F, 0x0, 0x2, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0xDF, 0x70, 0x47, 0x3, 0xDF, 0x70, 0x47, 0x4, 0xDF, 0x70, 0x47, 0x5, 0xDF, 0x70, 0x47, 0x7, 0xDF,
+0x70, 0x47, 0x8, 0xDF, 0x70, 0x47, 0x9, 0xDF, 0x70, 0x47, 0x9, 0xDF, 0x8, 0x1C, 0x70, 0x47, 0xC, 0xB4, 0x9, 0xDF, 0xC, 0xBC, 0x10, 0x60, 0x19, 0x60, 0x70, 0x47, 0xB, 0xDF, 0x70, 0x47, 0xC, 0xDF, 0x70,
+0x47, 0xD, 0xDF, 0x70, 0x47, 0xE, 0xDF, 0x70, 0x47, 0xF, 0xDF, 0x70, 0x47, 0x10, 0xDF, 0x70, 0x47, 0x11, 0xDF, 0x70, 0x47, 0x12, 0xDF, 0x70, 0x47, 0x13, 0xDF, 0x70, 0x47, 0x14, 0xDF, 0x70, 0x47, 0x15,
+0xDF, 0x70, 0x47, 0x6, 0xDF, 0x70, 0x47, 0x16, 0xDF, 0x70, 0x47, 0x18, 0xDF, 0x70, 0x47, 0x1F, 0xDF, 0x70, 0x47, 0xC0, 0x46, 0xC0, 0x46, 0xC0, 0x46, 0x0, 0x29, 0x41, 0xD0, 0x10, 0xB4, 0x4, 0x1C, 0x4C,
+0x40, 0xA4, 0x46, 0x1, 0x23, 0x0, 0x22, 0x0, 0x29, 0x0, 0xD5, 0x49, 0x42, 0x0, 0x28, 0x0, 0xD5, 0x40, 0x42, 0x88, 0x42, 0x2C, 0xD3, 0x1, 0x24, 0x24, 0x7, 0xA1, 0x42, 0x4, 0xD2, 0x81, 0x42, 0x2, 0xD2,
+0x9, 0x1, 0x1B, 0x1, 0xF8, 0xE7, 0xE4, 0x0, 0xA1, 0x42, 0x4, 0xD2, 0x81, 0x42, 0x2, 0xD2, 0x49, 0x0, 0x5B, 0x0, 0xF8, 0xE7, 0x88, 0x42, 0x1, 0xD3, 0x40, 0x1A, 0x1A, 0x43, 0x4C, 0x8, 0xA0, 0x42, 0x2, 0xD3,
+0x0, 0x1B, 0x5C, 0x8, 0x22, 0x43, 0x8C, 0x8, 0xA0, 0x42, 0x2, 0xD3, 0x0, 0x1B, 0x9C, 0x8, 0x22, 0x43, 0xCC, 0x8, 0xA0, 0x42, 0x2, 0xD3, 0x0, 0x1B, 0xDC, 0x8, 0x22, 0x43, 0x0, 0x28, 0x3, 0xD0, 0x1B, 0x9,
+0x1, 0xD0, 0x9, 0x9, 0xE3, 0xE7, 0x10, 0x1C, 0x64, 0x46, 0x0, 0x2C, 0x0, 0xD5, 0x40, 0x42, 0x10, 0xBC, 0x70, 0x47, 0x2, 0xB5, 0x0, 0xF0, 0xB, 0xF8, 0x0, 0x20, 0x6, 0xBC, 0x10, 0x47, 0x3, 0xB5, 0xFF, 0xF7,
+0xB3, 0xFF, 0xE, 0xBC, 0x42, 0x43, 0x89, 0x1A, 0x18, 0x47, 0xC0, 0x46, 0x70, 0x47, 0xC0, 0x46, 0x70, 0xB5, 0x5, 0x1C, 0xC, 0x1C, 0x0, 0x29, 0x36, 0xD0, 0x0, 0xF0, 0x4D, 0xF9, 0x0, 0x2D, 0x2, 0xD0, 0xAB,
+0x6B, 0x0, 0x2B, 0x34, 0xD0, 0xC, 0x22, 0xA3, 0x5E, 0x0, 0x2B, 0x29, 0xD0, 0x28, 0x1C, 0x21, 0x1C, 0x0, 0xF0, 0x4C, 0xF8, 0xE3, 0x6A, 0x6, 0x1C, 0x0, 0x2B, 0x5, 0xD0, 0xE1, 0x69, 0x28, 0x1C, 0x0, 0xF0,
+0x42, 0xF8, 0x0, 0x28, 0x2F, 0xDB, 0xA3, 0x89, 0x1A, 0x6, 0x27, 0xD4, 0x21, 0x6B, 0x0, 0x29, 0x8, 0xD0, 0x23, 0x1C, 0x40, 0x33, 0x99, 0x42, 0x2, 0xD0, 0x28, 0x1C, 0x0, 0xF0, 0x2B, 0xFB, 0x0, 0x23, 0x23,
+0x63, 0x61, 0x6C, 0x0, 0x29, 0x4, 0xD0, 0x28, 0x1C, 0x0, 0xF0, 0x23, 0xFB, 0x0, 0x23, 0x63, 0x64, 0x0, 0x23, 0xA3, 0x81, 0x0, 0xF0, 0x1D, 0xF9, 0x2, 0xE0, 0x0, 0xF0, 0x1A, 0xF9, 0x0, 0x26, 0x30, 0x1C,
+0x70, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x28, 0x1C, 0x0, 0xF0, 0xB8, 0xF8, 0xC, 0x22, 0xA3, 0x5E, 0x0, 0x2B, 0xC7, 0xD1, 0xF0, 0xE7, 0x21, 0x69, 0x28, 0x1C, 0x0, 0xF0, 0x9, 0xFB, 0xD2, 0xE7, 0x1, 0x26, 0x76,
+0x42, 0xCC, 0xE7, 0xC0, 0x46, 0x0, 0xB5, 0x4, 0x4B, 0x81, 0xB0, 0x1, 0x1C, 0x18, 0x68, 0xFF, 0xF7, 0xA7, 0xFF, 0x1, 0xB0, 0x2, 0xBC, 0x8, 0x47, 0x80, 0x66, 0x0, 0x2, 0x18, 0x47, 0xC0, 0x46, 0xF0, 0xB5,
+0x47, 0x46, 0x80, 0xB4, 0x80, 0x46, 0xF, 0x1C, 0x0, 0x28, 0x2, 0xD0, 0x83, 0x6B, 0x0, 0x2B, 0x55, 0xD0, 0xBA, 0x89, 0x13, 0x4, 0x19, 0x14, 0xB, 0x7, 0x2F, 0xD4, 0x80, 0x23, 0x1B, 0x1, 0x1A, 0x43, 0x7B,
+0x68, 0xBA, 0x81, 0x0, 0x2B, 0x51, 0xDD, 0xBD, 0x6A, 0x0, 0x2D, 0x1F, 0xD0, 0xD3, 0x4, 0x50, 0xD5, 0x3C, 0x6D, 0xBB, 0x89, 0x5A, 0x7, 0x6, 0xD5, 0x7B, 0x68, 0xE4, 0x1A, 0x3B, 0x6B, 0x0, 0x2B, 0x1, 0xD0,
+0xFB, 0x6B, 0xE4, 0x1A, 0xF9, 0x69, 0x40, 0x46, 0x22, 0x1C, 0x0, 0x23, 0x0, 0xF0, 0x6F, 0xF8, 0xA0, 0x42, 0x2A, 0xD1, 0xBB, 0x89, 0x28, 0x4A, 0x13, 0x40, 0xBB, 0x81, 0x0, 0x23, 0x7B, 0x60, 0x3B, 0x69,
+0x3B, 0x60, 0xBB, 0x89, 0xDA, 0x4, 0x2B, 0xD4, 0x0, 0x20, 0x4, 0xBC, 0x90, 0x46, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x3E, 0x69, 0x0, 0x2E, 0xF6, 0xD0, 0x3B, 0x68, 0x3E, 0x60, 0x9D, 0x1B, 0x8B, 0x7, 0x1B,
+0xD0, 0x0, 0x23, 0xBB, 0x60, 0x0, 0x2D, 0x4, 0xDC, 0xEC, 0xE7, 0x2D, 0x1A, 0x0, 0x2D, 0xE9, 0xDD, 0x36, 0x18, 0xF9, 0x69, 0x7C, 0x6A, 0x40, 0x46, 0x32, 0x1C, 0x2B, 0x1C, 0x0, 0xF0, 0x43, 0xF8, 0x0, 0x28,
+0xF2, 0xDC, 0xBB, 0x89, 0x40, 0x22, 0x13, 0x43, 0x1, 0x20, 0xBB, 0x81, 0x40, 0x42, 0xD9, 0xE7, 0x0, 0xF0, 0x3A, 0xF8, 0xA6, 0xE7, 0x7B, 0x69, 0xE2, 0xE7, 0x3C, 0x65, 0x0, 0x20, 0xD1, 0xE7, 0xFB, 0x6B,
+0x0, 0x2B, 0xAA, 0xDC, 0xCC, 0xE7, 0xF9, 0x69, 0x40, 0x46, 0x0, 0x22, 0x1, 0x23, 0x0, 0xF0, 0x29, 0xF8, 0x4, 0x1C, 0x42, 0x1C, 0x1, 0xD0, 0xBD, 0x6A, 0xA4, 0xE7, 0x42, 0x46, 0x13, 0x68, 0x1D, 0x2B, 0xBD,
+0xD0, 0xBB, 0x89, 0x40, 0x22, 0x13, 0x43, 0xBB, 0x81, 0xB9, 0xE7, 0xFF, 0xF7, 0xFF, 0xFF, 0x0, 0xB5, 0x81, 0xB0, 0x1, 0x1C, 0x0, 0x28, 0x6, 0xD0, 0x6, 0x4B, 0x18, 0x68, 0xFF, 0xF7, 0x75, 0xFF, 0x1, 0xB0,
+0x2, 0xBC, 0x8, 0x47, 0x3, 0x4B, 0x4, 0x49, 0x18, 0x68, 0x0, 0xF0, 0xC3, 0xFC, 0xF6, 0xE7, 0x80, 0x66, 0x0, 0x2, 0x78, 0x65, 0x0, 0x2, 0xA9, 0x32, 0x0, 0x2, 0x20, 0x47, 0x28, 0x47, 0xF0, 0xB5, 0x87, 0x6B,
+0x6, 0x1C, 0x0, 0x2F, 0x44, 0xD1, 0x24, 0x4B, 0xC3, 0x63, 0xB8, 0x23, 0x9B, 0x0, 0x1, 0x21, 0xC7, 0x50, 0xB9, 0x23, 0x81, 0x63, 0x8C, 0x46, 0x9B, 0x0, 0x3, 0x22, 0xBB, 0x21, 0xC2, 0x50, 0x89, 0x0, 0xBA,
+0x23, 0x42, 0x18, 0x9B, 0x0, 0xC2, 0x50, 0x1C, 0x4D, 0x43, 0x68, 0x1C, 0x4C, 0x1C, 0x48, 0x1D, 0x49, 0x4, 0x22, 0x9A, 0x81, 0x1F, 0x60, 0x5F, 0x60, 0x9F, 0x60, 0xDF, 0x81, 0x1F, 0x61, 0x5F, 0x61, 0x9F,
+0x61, 0xDB, 0x61, 0x1D, 0x62, 0x5C, 0x62, 0x98, 0x62, 0xD9, 0x62, 0xB3, 0x68, 0x9, 0x22, 0x9A, 0x81, 0x62, 0x46, 0xDA, 0x81, 0x1F, 0x60, 0x5F, 0x60, 0x9F, 0x60, 0x1F, 0x61, 0x5F, 0x61, 0x9F, 0x61, 0xDB,
+0x61, 0x1D, 0x62, 0x5C, 0x62, 0x98, 0x62, 0xD9, 0x62, 0xF3, 0x68, 0x12, 0x22, 0x9A, 0x81, 0x2, 0x22, 0x1F, 0x60, 0x5F, 0x60, 0x9F, 0x60, 0xDA, 0x81, 0x1F, 0x61, 0x5F, 0x61, 0x9F, 0x61, 0xDB, 0x61, 0x1D,
+0x62, 0x5C, 0x62, 0x98, 0x62, 0xD9, 0x62, 0xF0, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0xC0, 0x46, 0xE1, 0x34, 0x0, 0x2, 0x85, 0x47, 0x0, 0x2, 0x45, 0x47, 0x0, 0x2, 0x11, 0x47, 0x0, 0x2, 0xFD, 0x46, 0x0, 0x2, 0x70,
+0x47, 0xC0, 0x46, 0x70, 0x47, 0xC0, 0x46, 0x70, 0x47, 0xC0, 0x46, 0x70, 0x47, 0xC0, 0x46, 0x0, 0x20, 0x70, 0x47, 0x0, 0x20, 0x70, 0x47, 0x0, 0xB5, 0x4, 0x4B, 0x81, 0xB0, 0x18, 0x68, 0x3, 0x49, 0x0, 0xF0,
+0x83, 0xFC, 0x1, 0xB0, 0x1, 0xBC, 0x0, 0x47, 0x80, 0x66, 0x0, 0x2, 0xA5, 0x34, 0x0, 0x2, 0x0, 0xB5, 0x4, 0x4B, 0x81, 0xB0, 0x18, 0x68, 0x3, 0x49, 0x0, 0xF0, 0x75, 0xFC, 0x1, 0xB0, 0x1, 0xBC, 0x0, 0x47,
+0x80, 0x66, 0x0, 0x2, 0xA1, 0x34, 0x0, 0x2, 0x0, 0xB5, 0x81, 0xB0, 0x2, 0x49, 0x0, 0xF0, 0x69, 0xFC, 0x1, 0xB0, 0x1, 0xBC, 0x0, 0x47, 0x8D, 0x32, 0x0, 0x2, 0x0, 0xB5, 0x4, 0x4B, 0x81, 0xB0, 0x18, 0x68,
+0x3, 0x49, 0x0, 0xF0, 0x5D, 0xFC, 0x1, 0xB0, 0x1, 0xBC, 0x0, 0x47, 0x78, 0x65, 0x0, 0x2, 0x8D, 0x32, 0x0, 0x2, 0x70, 0xB5, 0x5C, 0x23, 0x1E, 0x1C, 0x4E, 0x43, 0xD, 0x1C, 0x31, 0x1C, 0xC, 0x31, 0x0, 0xF0,
+0x4B, 0xFD, 0x4, 0x1C, 0x0, 0x28, 0x8, 0xD0, 0xC, 0x30, 0x0, 0x23, 0x23, 0x60, 0x65, 0x60, 0xA0, 0x60, 0x0, 0x21, 0x32, 0x1C, 0x1, 0xF0, 0xF, 0xF8, 0x20, 0x1C, 0x70, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xC0,
+0x46, 0x30, 0xB5, 0x1F, 0x4B, 0x1C, 0x68, 0xA3, 0x6B, 0x81, 0xB0, 0x5, 0x1C, 0x0, 0x2B, 0x27, 0xD0, 0xB8, 0x21, 0x89, 0x0, 0x64, 0x18, 0x63, 0x68, 0xA0, 0x68, 0x5A, 0x1E, 0x3, 0xD5, 0x1A, 0xE0, 0x1, 0x3A,
+0x18, 0xD4, 0x5C, 0x30, 0xC, 0x21, 0x43, 0x5E, 0x0, 0x2B, 0xF8, 0xD1, 0x1, 0x23, 0x5B, 0x42, 0xC3, 0x81, 0x1, 0x23, 0x83, 0x81, 0x0, 0x23, 0x3, 0x60, 0x83, 0x60, 0x43, 0x60, 0x3, 0x61, 0x43, 0x61, 0x83,
+0x61, 0x3, 0x63, 0x43, 0x63, 0x43, 0x64, 0x83, 0x64, 0x1, 0xB0, 0x30, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x20, 0x68, 0x0, 0x28, 0x5, 0xD0, 0x4, 0x1C, 0xDA, 0xE7, 0x20, 0x1C, 0xFF, 0xF7, 0x1B, 0xFF, 0xD3, 0xE7,
+0x28, 0x1C, 0x4, 0x21, 0xFF, 0xF7, 0xAE, 0xFF, 0x20, 0x60, 0x0, 0x28, 0xF2, 0xD1, 0xC, 0x23, 0x2B, 0x60, 0x0, 0x20, 0xE7, 0xE7, 0xC0, 0x46, 0x78, 0x65, 0x0, 0x2, 0xF0, 0xB5, 0x83, 0xB0, 0xF, 0x1C, 0x11,
+0x1C, 0x1, 0xAA, 0x6, 0x1C, 0x1, 0xF0, 0xEE, 0xF8, 0x5, 0x1C, 0x0, 0x28, 0x5, 0xD1, 0x0, 0x24, 0x3, 0xB0, 0x20, 0x1C, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x30, 0x1C, 0xFF, 0xF7, 0xAA, 0xFF, 0x4, 0x1C, 0x0,
+0x28, 0xF4, 0xD0, 0xDB, 0x23, 0x1, 0x9A, 0x30, 0x1C, 0x39, 0x1C, 0x5B, 0x0, 0x1, 0xF0, 0x9A, 0xF9, 0x0, 0x28, 0x14, 0xDB, 0xD, 0x4B, 0x23, 0x62, 0xD, 0x4B, 0x63, 0x62, 0xD, 0x4B, 0xA5, 0x81, 0xA3, 0x62,
+0xD, 0x4B, 0xE3, 0x62, 0xA3, 0x89, 0xE0, 0x81, 0xE4, 0x61, 0xDA, 0x5, 0xDD, 0xD5, 0x30, 0x1C, 0x21, 0x1C, 0x0, 0x22, 0x2, 0x23, 0x0, 0xF0, 0xFC, 0xF9, 0xD6, 0xE7, 0xFF, 0xF7, 0x2D, 0xFF, 0x0, 0x23, 0xA3,
+0x81, 0xFF, 0xF7, 0x2B, 0xFF, 0xCE, 0xE7, 0x85, 0x47, 0x0, 0x2, 0x45, 0x47, 0x0, 0x2, 0x11, 0x47, 0x0, 0x2, 0xFD, 0x46, 0x0, 0x2, 0x10, 0xB5, 0x5, 0x4B, 0x4, 0x1C, 0xA, 0x1C, 0x18, 0x68, 0x21, 0x1C, 0xFF,
+0xF7, 0xB4, 0xFF, 0x10, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xC0, 0x46, 0x80, 0x66, 0x0, 0x2, 0xF0, 0xB5, 0x5F, 0x46, 0x56, 0x46, 0x4D, 0x46, 0x44, 0x46, 0xF0, 0xB4, 0xD, 0x1C, 0x11, 0x1C, 0x59, 0x43, 0x83, 0xB0,
+0x81, 0x46, 0x1, 0x92, 0x0, 0x93, 0xC, 0x9F, 0x8B, 0x46, 0x0, 0x29, 0x33, 0xD0, 0x0, 0x28, 0x3, 0xD0, 0x83, 0x6B, 0x0, 0x2B, 0x0, 0xD1, 0x81, 0xE0, 0x7C, 0x68, 0x0, 0x2C, 0x0, 0xDA, 0x74, 0xE0, 0xBB,
+0x89, 0x2E, 0x1C, 0x99, 0x7, 0x28, 0xD4, 0x5D, 0x46, 0x1, 0xE0, 0x36, 0x19, 0x7C, 0x68, 0xA5, 0x42, 0x0, 0xD8, 0x79, 0xE0, 0x39, 0x68, 0x30, 0x1C, 0x22, 0x1C, 0x0, 0xF0, 0x7, 0xFF, 0x3B, 0x68, 0x1B, 0x19,
+0x3B, 0x60, 0x48, 0x46, 0x39, 0x1C, 0x2D, 0x1B, 0x0, 0xF0, 0x89, 0xFF, 0x0, 0x28, 0xEB, 0xD0, 0x5B, 0x46, 0x58, 0x1B, 0x1, 0x99, 0x1, 0xF0, 0x12, 0xFB, 0x0, 0x90, 0x0, 0x98, 0x3, 0xB0, 0x3C, 0xBC, 0x90,
+0x46, 0x99, 0x46, 0xA2, 0x46, 0xAB, 0x46, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x0, 0x22, 0x0, 0x92, 0xF2, 0xE7, 0x5C, 0x45, 0x0, 0xD9, 0x5C, 0x46, 0x39, 0x68, 0x22, 0x1C, 0x28, 0x1C, 0x0, 0xF0, 0xE2, 0xFE,
+0x3B, 0x68, 0x1B, 0x19, 0x3B, 0x60, 0x5A, 0x46, 0x7B, 0x68, 0x12, 0x1B, 0x39, 0x6B, 0x1B, 0x1B, 0x16, 0x1C, 0x7B, 0x60, 0x92, 0x46, 0x73, 0x1E, 0x9E, 0x41, 0x0, 0x29, 0xA, 0xD0, 0x0, 0x2E, 0xD9, 0xD0,
+0x3B, 0x1C, 0x40, 0x33, 0x99, 0x42, 0x2, 0xD0, 0x48, 0x46, 0x0, 0xF0, 0xAC, 0xF8, 0x0, 0x23, 0x3B, 0x63, 0x0, 0x2E, 0xCE, 0xD0, 0x2D, 0x19, 0xA8, 0x46, 0x1, 0xE0, 0x0, 0x2A, 0xC9, 0xD0, 0x43, 0x46, 0x51,
+0x46, 0x3D, 0x69, 0x3E, 0x68, 0x7C, 0x69, 0x3B, 0x61, 0x79, 0x61, 0x3B, 0x60, 0x48, 0x46, 0x39, 0x1C, 0x0, 0xF0, 0x3F, 0xFF, 0x7B, 0x68, 0x52, 0x46, 0xD2, 0x1A, 0x98, 0x44, 0x0, 0x23, 0x3D, 0x61, 0x7C,
+0x61, 0x3E, 0x60, 0x92, 0x46, 0x7B, 0x60, 0x0, 0x28, 0xE5, 0xD0, 0x59, 0x46, 0x88, 0x1A, 0x1, 0x99, 0x1, 0xF0, 0xBE, 0xFA, 0x0, 0x90, 0xAA, 0xE7, 0x0, 0x23, 0x7B, 0x60, 0xBB, 0x89, 0x0, 0x24, 0x2E, 0x1C,
+0x99, 0x7, 0x0, 0xD4, 0x86, 0xE7, 0xAE, 0xE7, 0xFF, 0xF7, 0x1F, 0xFE, 0x7C, 0x68, 0x0, 0x2C, 0x0, 0xDB, 0x7B, 0xE7, 0xEF, 0xE7, 0x39, 0x68, 0x30, 0x1C, 0x2A, 0x1C, 0x0, 0xF0, 0x8D, 0xFE, 0x7B, 0x68, 0x5B,
+0x1B, 0x7B, 0x60, 0x3B, 0x68, 0x5B, 0x19, 0x3B, 0x60, 0x8E, 0xE7, 0x70, 0xB5, 0x16, 0x1C, 0x7, 0x4A, 0xD, 0x1C, 0x82, 0xB0, 0x4, 0x1C, 0x21, 0x1C, 0x10, 0x68, 0x0, 0x93, 0x2A, 0x1C, 0x33, 0x1C, 0xFF,
+0xF7, 0x47, 0xFF, 0x2, 0xB0, 0x70, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xC0, 0x46, 0x80, 0x66, 0x0, 0x2, 0xF0, 0xB5, 0x81, 0xB0, 0xC, 0x1C, 0x6, 0x1C, 0x0, 0xF0, 0xF2, 0xFE, 0x21, 0x4F, 0xBB, 0x68, 0x5A, 0x68,
+0x3, 0x23, 0x15, 0x1C, 0x20, 0x4A, 0x9D, 0x43, 0xAB, 0x18, 0x1B, 0x1B, 0x1B, 0xB, 0x1, 0x3B, 0x1C, 0x3, 0x1D, 0x4B, 0x9C, 0x42, 0x7, 0xDD, 0x30, 0x1C, 0x0, 0x21, 0x1, 0xF0, 0x5, 0xF9, 0xBB, 0x68, 0x5B,
+0x19, 0x98, 0x42, 0x7, 0xD0, 0x30, 0x1C, 0x0, 0xF0, 0xDA, 0xFE, 0x0, 0x20, 0x1, 0xB0, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x61, 0x42, 0x30, 0x1C, 0x1, 0xF0, 0xF5, 0xF8, 0x1, 0x30, 0xD, 0xD0, 0xB9, 0x68,
+0x1, 0x22, 0x2B, 0x1B, 0x13, 0x43, 0x4B, 0x60, 0xF, 0x4A, 0x13, 0x68, 0x1B, 0x1B, 0x30, 0x1C, 0x13, 0x60, 0x0, 0xF0, 0xC3, 0xFE, 0x1, 0x20, 0xE7, 0xE7, 0x0, 0x21, 0x30, 0x1C, 0x1, 0xF0, 0xE1, 0xF8, 0xBC,
+0x68, 0x1, 0x1B, 0xF, 0x29, 0xDB, 0xDD, 0x8, 0x4B, 0x1B, 0x68, 0x6, 0x4A, 0xC3, 0x1A, 0x13, 0x60, 0x1, 0x23, 0xB, 0x43, 0x63, 0x60, 0xD2, 0xE7, 0x88, 0x6A, 0x0, 0x2, 0xEF, 0xF, 0x0, 0x0, 0xFF, 0xF, 0x0,
+0x0, 0xC8, 0x6F, 0x0, 0x2, 0x94, 0x6E, 0x0, 0x2, 0xF0, 0xB5, 0x47, 0x46, 0x80, 0xB4, 0x80, 0x46, 0xC, 0x1C, 0x0, 0x29, 0x53, 0xD0, 0x25, 0x1C, 0x8, 0x3D, 0x0, 0xF0, 0x99, 0xFE, 0x6C, 0x68, 0x1, 0x27,
+0x21, 0x1C, 0xB9, 0x43, 0x68, 0x18, 0x43, 0x68, 0x3, 0x22, 0x1E, 0x1C, 0x96, 0x43, 0x54, 0x4A, 0x93, 0x68, 0x94, 0x46, 0x83, 0x42, 0x58, 0xD0, 0x46, 0x60, 0x3C, 0x42, 0xA, 0xD1, 0x2B, 0x68, 0xED, 0x1A,
+0xC9, 0x18, 0xAA, 0x68, 0x63, 0x46, 0x8, 0x33, 0x9A, 0x42, 0x66, 0xD0, 0xEB, 0x68, 0xD3, 0x60, 0x9A, 0x60, 0x0, 0x24, 0x83, 0x19, 0x5B, 0x68, 0x1, 0x27, 0x3B, 0x42, 0x9, 0xD1, 0x89, 0x19, 0x0, 0x2C, 0x2F,
+0xD1, 0x82, 0x68, 0x47, 0x4B, 0x9A, 0x42, 0x67, 0xD0, 0xC3, 0x68, 0xD3, 0x60, 0x9A, 0x60, 0x1, 0x20, 0xB, 0x1C, 0x3, 0x43, 0x6B, 0x60, 0x69, 0x50, 0x0, 0x2C, 0x19, 0xD1, 0x41, 0x4B, 0x99, 0x42, 0x20,
+0xD9, 0x4A, 0xA, 0x4, 0x2A, 0x48, 0xD8, 0x8B, 0x9, 0x38, 0x33, 0xDA, 0x0, 0x62, 0x44, 0x90, 0x68, 0x90, 0x42, 0x47, 0xD0, 0x3, 0x24, 0x43, 0x68, 0xA3, 0x43, 0x99, 0x42, 0x2, 0xD2, 0x80, 0x68, 0x82, 0x42,
+0xF8, 0xD1, 0xC3, 0x68, 0xEB, 0x60, 0xA8, 0x60, 0xC5, 0x60, 0x9D, 0x60, 0x40, 0x46, 0x0, 0xF0, 0x4B, 0xFE, 0x4, 0xBC, 0x90, 0x46, 0xF0, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0x82, 0x68, 0xD1, 0xE7, 0xC9, 0x8, 0x8A,
+0x10, 0x90, 0x40, 0x2, 0x1C, 0x60, 0x46, 0x43, 0x68, 0xC9, 0x0, 0x61, 0x44, 0x13, 0x43, 0x43, 0x60, 0x8B, 0x68, 0xE9, 0x60, 0xAB, 0x60, 0xDD, 0x60, 0x8D, 0x60, 0xE5, 0xE7, 0x71, 0x18, 0x3C, 0x42, 0x6,
+0xD1, 0x2B, 0x68, 0xED, 0x1A, 0xEA, 0x68, 0xC9, 0x18, 0xAB, 0x68, 0xDA, 0x60, 0x93, 0x60, 0x1, 0x23, 0xB, 0x43, 0x6B, 0x60, 0x63, 0x46, 0x9D, 0x60, 0x21, 0x4B, 0x1B, 0x68, 0x99, 0x42, 0xD2, 0xD3, 0x20,
+0x4B, 0x40, 0x46, 0x19, 0x68, 0xFF, 0xF7, 0x22, 0xFF, 0xCC, 0xE7, 0x1, 0x24, 0x9A, 0xE7, 0x14, 0x2A, 0x15, 0xD8, 0x13, 0x1C, 0x5B, 0x33, 0xDA, 0x0, 0xB3, 0xE7, 0x9B, 0x10, 0x61, 0x46, 0x1, 0x22, 0x9A,
+0x40, 0x4B, 0x68, 0x13, 0x43, 0x4B, 0x60, 0x3, 0x1C, 0xB7, 0xE7, 0xB, 0x1C, 0x3B, 0x43, 0xD5, 0x60, 0x95, 0x60, 0xEA, 0x60, 0xAA, 0x60, 0x6B, 0x60, 0x69, 0x50, 0xB2, 0xE7, 0x54, 0x2A, 0x3, 0xD8, 0xB,
+0xB, 0x6E, 0x33, 0xDA, 0x0, 0x9B, 0xE7, 0xAA, 0x23, 0x5B, 0x0, 0x9A, 0x42, 0x3, 0xD8, 0xCB, 0xB, 0x77, 0x33, 0xDA, 0x0, 0x93, 0xE7, 0xA, 0x4B, 0x9A, 0x42, 0x3, 0xD9, 0xFC, 0x22, 0x7E, 0x23, 0x92, 0x0,
+0x8C, 0xE7, 0x8B, 0xC, 0x7C, 0x33, 0xDA, 0x0, 0x88, 0xE7, 0x88, 0x6A, 0x0, 0x2, 0x90, 0x6A, 0x0, 0x2, 0xFF, 0x1, 0x0, 0x0, 0x90, 0x6E, 0x0, 0x2, 0xBC, 0x6F, 0x0, 0x2, 0x54, 0x5, 0x0, 0x0, 0xF0, 0xB5,
+0x5F, 0x46, 0x56, 0x46, 0x4D, 0x46, 0x44, 0x46, 0xF0, 0xB4, 0x93, 0xB0, 0x7, 0x1C, 0xC, 0x1C, 0x1, 0x92, 0x98, 0x46, 0x0, 0x28, 0x3, 0xD0, 0x83, 0x6B, 0x0, 0x2B, 0x0, 0xD1, 0x99, 0xE0, 0xA2, 0x89, 0x84,
+0x23, 0x5B, 0x0, 0x1A, 0x40, 0x9A, 0x42, 0x0, 0xD1, 0x9B, 0xE0, 0xA1, 0x6A, 0x89, 0x46, 0x0, 0x29, 0x0, 0xD1, 0x4C, 0xE1, 0x42, 0x46, 0x1, 0x2A, 0x30, 0xD0, 0x2, 0x2A, 0x1, 0xD0, 0x0, 0x2A, 0x1F, 0xD1,
+0x0, 0x26, 0x25, 0x69, 0xB2, 0x46, 0x0, 0x2D, 0x0, 0xD1, 0x6, 0xE1, 0xA0, 0x89, 0xA8, 0x4B, 0x18, 0x42, 0xB, 0xD1, 0x80, 0x25, 0xED, 0x0, 0x28, 0x42, 0x3D, 0xD1, 0xA5, 0x4B, 0x99, 0x45, 0x0, 0xD1, 0xE0,
+0xE0, 0x80, 0x23, 0x1B, 0x1, 0x3, 0x43, 0xA3, 0x81, 0x38, 0x1C, 0x21, 0x1C, 0xFF, 0xF7, 0x2, 0xFC, 0x0, 0x28, 0x0, 0xD1, 0x9, 0xE1, 0x1, 0x20, 0x40, 0x42, 0x3, 0xE0, 0x16, 0x23, 0x1, 0x20, 0x3B, 0x60,
+0x40, 0x42, 0x13, 0xB0, 0x3C, 0xBC, 0x90, 0x46, 0x99, 0x46, 0xA2, 0x46, 0xAB, 0x46, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x38, 0x1C, 0x21, 0x1C, 0xFF, 0xF7, 0xEB, 0xFB, 0xA3, 0x89, 0xD9, 0x4, 0x0, 0xD4,
+0x15, 0xE1, 0x26, 0x6D, 0x59, 0x7, 0x5C, 0xD4, 0x1A, 0x7, 0x61, 0xD5, 0x23, 0x68, 0x0, 0x2B, 0x5E, 0xD0, 0x25, 0x69, 0x5B, 0x1B, 0xF6, 0x18, 0x1, 0x9B, 0x0, 0x21, 0x9B, 0x19, 0x1, 0x22, 0x1, 0x93, 0x88,
+0x46, 0x92, 0x46, 0xBA, 0xE7, 0xA3, 0x89, 0x2B, 0x43, 0xE5, 0x64, 0xA3, 0x81, 0x42, 0x46, 0x0, 0x2A, 0x0, 0xD0, 0x82, 0xE0, 0x1, 0x9B, 0x9B, 0x46, 0x52, 0x46, 0x0, 0x2A, 0x48, 0xD0, 0x21, 0x6B, 0x8A,
+0x46, 0x0, 0x29, 0x0, 0xD1, 0xC3, 0xE0, 0xA3, 0x89, 0x62, 0x68, 0xE1, 0x6B, 0x9C, 0x46, 0xA3, 0x6B, 0x25, 0x69, 0xB2, 0x18, 0x5B, 0x1B, 0xD0, 0x1A, 0xC9, 0x18, 0x62, 0x46, 0x92, 0x4, 0x44, 0xD4, 0x83,
+0x45, 0x42, 0xDB, 0x43, 0x18, 0x9B, 0x45, 0x3F, 0xD2, 0x5A, 0x46, 0x13, 0x1A, 0xEA, 0x18, 0xCB, 0x1A, 0x63, 0x60, 0x53, 0x46, 0x22, 0x60, 0x0, 0x2B, 0xB, 0xD0, 0x23, 0x1C, 0x40, 0x33, 0x53, 0x45, 0x5,
+0xD0, 0x51, 0x46, 0x38, 0x1C, 0xFF, 0xF7, 0x95, 0xFE, 0xA1, 0x89, 0x8C, 0x46, 0x0, 0x23, 0x23, 0x63, 0x20, 0x23, 0x62, 0x46, 0x9A, 0x43, 0xA2, 0x81, 0x0, 0x20, 0x9C, 0xE7, 0xFF, 0xF7, 0x2F, 0xFC, 0xA2,
+0x89, 0x84, 0x23, 0x5B, 0x0, 0x1A, 0x40, 0x9A, 0x42, 0x0, 0xD0, 0x63, 0xE7, 0x38, 0x1C, 0x21, 0x1C, 0xFF, 0xF7, 0x88, 0xFB, 0x5E, 0xE7, 0x63, 0x68, 0xF6, 0x1A, 0x23, 0x6B, 0x0, 0x2B, 0x1, 0xD0, 0xE3,
+0x6B, 0xF6, 0x1A, 0x25, 0x69, 0xA1, 0xE7, 0xA3, 0x89, 0x9C, 0x46, 0xDB, 0x4, 0x6F, 0xD5, 0x20, 0x6D, 0x62, 0x68, 0x23, 0x6B, 0x86, 0x1A, 0x9A, 0x46, 0x0, 0x2B, 0x77, 0xD0, 0xE1, 0x6B, 0x76, 0x1A, 0xB1,
+0xE7, 0xE3, 0x6C, 0x5D, 0x46, 0x5B, 0x42, 0x1D, 0x40, 0xE1, 0x69, 0x38, 0x1C, 0x2A, 0x1C, 0x0, 0x23, 0x0, 0xF0, 0xBA, 0xF8, 0x1, 0x30, 0x0, 0xD1, 0x5C, 0xE7, 0x0, 0x23, 0x63, 0x60, 0x21, 0x6B, 0x23, 0x69,
+0x23, 0x60, 0x0, 0x29, 0x8, 0xD0, 0x23, 0x1C, 0x40, 0x33, 0x99, 0x42, 0x2, 0xD0, 0x38, 0x1C, 0xFF, 0xF7, 0x4B, 0xFE, 0x0, 0x23, 0x23, 0x63, 0xA3, 0x89, 0x20, 0x22, 0x93, 0x43, 0xA3, 0x81, 0x5B, 0x46,
+0x5D, 0x1B, 0x0, 0x2D, 0x10, 0xD1, 0x0, 0x20, 0x50, 0xE7, 0x2, 0xAD, 0xE, 0x22, 0xA1, 0x5E, 0x38, 0x1C, 0x2A, 0x1C, 0x0, 0xF0, 0x30, 0xFE, 0x0, 0x28, 0x0, 0xD0, 0x38, 0xE7, 0x6B, 0x69, 0x1, 0x99, 0xC9,
+0x18, 0x8B, 0x46, 0x6F, 0xE7, 0x38, 0x1C, 0x21, 0x1C, 0x0, 0xF0, 0xD4, 0xFC, 0x0, 0x28, 0x0, 0xD0, 0x2C, 0xE7, 0x62, 0x68, 0x95, 0x42, 0x0, 0xD9, 0x28, 0xE7, 0x23, 0x68, 0x5B, 0x19, 0x23, 0x60, 0x53,
+0x1B, 0x63, 0x60, 0x30, 0xE7, 0xE3, 0x89, 0x1B, 0x4, 0x19, 0x14, 0x0, 0x29, 0x0, 0xDA, 0x18, 0xE7, 0x2, 0xAB, 0x38, 0x1C, 0x1A, 0x1C, 0x9B, 0x46, 0x0, 0xF0, 0xB, 0xFE, 0x0, 0x28, 0x9, 0xD1, 0x59, 0x46,
+0x8A, 0x68, 0xF0, 0x23, 0x1B, 0x2, 0x13, 0x40, 0x80, 0x22, 0x12, 0x2, 0x93, 0x42, 0x0, 0xD1, 0x3C, 0xE7, 0xA0, 0x89, 0x4, 0xE7, 0x38, 0x1C, 0x21, 0x1C, 0x0, 0xF0, 0x9, 0xF9, 0xF3, 0xE6, 0xE1, 0x69, 0x38,
+0x1C, 0x0, 0x22, 0x1, 0x23, 0x0, 0xF0, 0x58, 0xF8, 0x41, 0x1C, 0x0, 0xD1, 0xFA, 0xE6, 0xA2, 0x89, 0x94, 0x46, 0x84, 0xE7, 0xA3, 0x89, 0x62, 0x68, 0x9C, 0x46, 0x23, 0x68, 0x25, 0x69, 0x5B, 0x1B, 0xF0,
+0x1A, 0xD1, 0x18, 0x3C, 0xE7, 0xE1, 0x69, 0x38, 0x1C, 0x1, 0x9A, 0x43, 0x46, 0x0, 0xF0, 0x43, 0xF8, 0x1, 0x30, 0x0, 0xD1, 0xEC, 0xE6, 0x21, 0x6B, 0x0, 0x29, 0x8, 0xD0, 0x23, 0x1C, 0x40, 0x33, 0x99, 0x42,
+0x2, 0xD0, 0x38, 0x1C, 0xFF, 0xF7, 0xD8, 0xFD, 0x0, 0x23, 0x23, 0x63, 0x23, 0x69, 0x23, 0x60, 0x0, 0x23, 0x63, 0x60, 0xD, 0x4A, 0xA3, 0x89, 0x13, 0x40, 0xA3, 0x81, 0x0, 0x20, 0xDD, 0xE6, 0x1D, 0x23, 0x1,
+0x20, 0x3B, 0x60, 0x40, 0x42, 0xD8, 0xE6, 0xE1, 0x69, 0x38, 0x1C, 0x0, 0x22, 0x1, 0x23, 0x0, 0xF0, 0x1F, 0xF8, 0x6, 0x1C, 0x42, 0x1C, 0x0, 0xD1, 0xC7, 0xE6, 0xA3, 0x89, 0xDE, 0xE6, 0xC0, 0x46, 0x1A, 0x8,
+0x0, 0x0, 0x11, 0x47, 0x0, 0x2, 0xDF, 0xF7, 0xFF, 0xFF, 0x30, 0xB5, 0x13, 0x1C, 0x6, 0x4A, 0xD, 0x1C, 0x4, 0x1C, 0x81, 0xB0, 0x10, 0x68, 0x21, 0x1C, 0x2A, 0x1C, 0xFF, 0xF7, 0x73, 0xFE, 0x1, 0xB0, 0x30,
+0xBC, 0x2, 0xBC, 0x8, 0x47, 0xC0, 0x46, 0x80, 0x66, 0x0, 0x2, 0x48, 0x47, 0xC0, 0x46, 0xF0, 0xB5, 0x57, 0x46, 0x46, 0x46, 0xC0, 0xB4, 0xB8, 0x26, 0x80, 0x46, 0xB6, 0x0, 0x81, 0xB0, 0x46, 0x44, 0x8A, 0x46,
+0xFF, 0xF7, 0x92, 0xFB, 0x0, 0x2E, 0x22, 0xD0, 0x0, 0x27, 0x73, 0x68, 0xB4, 0x68, 0x5D, 0x1E, 0x1, 0xD5, 0xF, 0xE0, 0x5C, 0x34, 0xC, 0x22, 0xA3, 0x5E, 0x0, 0x2B, 0x8, 0xD0, 0xE, 0x22, 0xA3, 0x5E, 0x1,
+0x33, 0x4, 0xD0, 0x40, 0x46, 0x21, 0x1C, 0x0, 0xF0, 0x42, 0xF8, 0x7, 0x43, 0x1, 0x3D, 0xEF, 0xD5, 0x36, 0x68, 0x0, 0x2E, 0xE7, 0xD1, 0xFF, 0xF7, 0x77, 0xFB, 0x1, 0xB0, 0x38, 0x1C, 0xC, 0xBC, 0x90, 0x46,
+0x9A, 0x46, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x0, 0x27, 0xF3, 0xE7, 0xC0, 0x46, 0xF0, 0xB5, 0x47, 0x46, 0x80, 0xB4, 0x4, 0x1C, 0x88, 0x46, 0xFF, 0xF7, 0x63, 0xFB, 0xB8, 0x22, 0x92, 0x0, 0xA6, 0x18, 0x0,
+0x2E, 0x1F, 0xD0, 0x0, 0x27, 0x73, 0x68, 0xB5, 0x68, 0x5C, 0x1E, 0x1, 0xD5, 0xE, 0xE0, 0x5C, 0x35, 0xC, 0x22, 0xAB, 0x5E, 0x0, 0x2B, 0x7, 0xD0, 0xE, 0x22, 0xAB, 0x5E, 0x1, 0x33, 0x3, 0xD0, 0x28, 0x1C,
+0x0, 0xF0, 0x10, 0xF8, 0x7, 0x43, 0x1, 0x3C, 0xF0, 0xD5, 0x36, 0x68, 0x0, 0x2E, 0xE8, 0xD1, 0xFF, 0xF7, 0x46, 0xFB, 0x38, 0x1C, 0x4, 0xBC, 0x90, 0x46, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x0, 0x27, 0xF5,
+0xE7, 0x40, 0x47, 0x50, 0x47, 0x70, 0xB5, 0x9, 0x4B, 0x9, 0x4A, 0x9B, 0x1A, 0x9E, 0x10, 0x0, 0x2E, 0x7, 0xD0, 0x15, 0x1C, 0x0, 0x24, 0x8, 0xCD, 0x1, 0x34, 0x0, 0xF0, 0x35, 0xF8, 0xA6, 0x42, 0xF9, 0xD8,
+0x1, 0xF0, 0x4D, 0xF8, 0x70, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0x38, 0x66, 0x0, 0x2, 0x34, 0x66, 0x0, 0x2, 0x70, 0xB5, 0x10, 0x4B, 0x10, 0x4A, 0x9B, 0x1A, 0x9E, 0x10, 0x0, 0x2E, 0x7, 0xD0, 0x15, 0x1C, 0x0,
+0x24, 0x8, 0xCD, 0x1, 0x34, 0x0, 0xF0, 0x1D, 0xF8, 0xA6, 0x42, 0xF9, 0xD8, 0xFC, 0xF7, 0x31, 0xFA, 0xA, 0x4B, 0xA, 0x4A, 0x9B, 0x1A, 0x9E, 0x10, 0x0, 0x2E, 0x7, 0xD0, 0x15, 0x1C, 0x0, 0x24, 0x8, 0xCD,
+0x1, 0x34, 0x0, 0xF0, 0xD, 0xF8, 0xA6, 0x42, 0xF9, 0xD8, 0x70, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0x30, 0x66, 0x0, 0x2, 0x30, 0x66, 0x0, 0x2, 0x34, 0x66, 0x0, 0x2, 0x30, 0x66, 0x0, 0x2, 0x18, 0x47, 0xC0, 0x46,
+0xF0, 0xB5, 0x6, 0x1C, 0x88, 0x89, 0x91, 0xB0, 0xC, 0x1C, 0x2, 0x1C, 0x81, 0x7, 0x3F, 0xD4, 0xE3, 0x89, 0x1B, 0x4, 0x19, 0x14, 0x0, 0x29, 0x46, 0xDB, 0x30, 0x1C, 0x6A, 0x46, 0x0, 0xF0, 0xDF, 0xFC, 0x0,
+0x28, 0x3E, 0xDB, 0x2, 0x9B, 0xF0, 0x22, 0x2B, 0x49, 0x12, 0x2, 0x1A, 0x40, 0x53, 0x18, 0x5F, 0x42, 0x5F, 0x41, 0x80, 0x23, 0x1B, 0x2, 0x9A, 0x42, 0x40, 0xD0, 0xA3, 0x89, 0x80, 0x22, 0x12, 0x1, 0x13,
+0x43, 0x80, 0x25, 0xA3, 0x81, 0xED, 0x0, 0x30, 0x1C, 0x29, 0x1C, 0x0, 0xF0, 0x60, 0xF8, 0x0, 0x28, 0x15, 0xD0, 0x20, 0x4B, 0xF3, 0x63, 0xA3, 0x89, 0x80, 0x22, 0x13, 0x43, 0xA3, 0x81, 0x20, 0x60, 0x20,
+0x61, 0x65, 0x61, 0x0, 0x2F, 0x16, 0xD0, 0xE, 0x21, 0x60, 0x5E, 0x0, 0xF0, 0xE3, 0xFC, 0x0, 0x28, 0x10, 0xD0, 0xA3, 0x89, 0x1, 0x22, 0x13, 0x43, 0xA3, 0x81, 0xB, 0xE0, 0xA2, 0x89, 0x93, 0x5, 0x8, 0xD4,
+0x2, 0x23, 0x13, 0x43, 0xA3, 0x81, 0x23, 0x1C, 0x43, 0x33, 0x23, 0x60, 0x23, 0x61, 0x1, 0x23, 0x63, 0x61, 0x11, 0xB0, 0xF0, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0xA0, 0x89, 0x2, 0x1C, 0x13, 0x6, 0x7, 0xD4, 0x80,
+0x25, 0xED, 0x0, 0x80, 0x23, 0x1B, 0x1, 0x3, 0x43, 0xA3, 0x81, 0x0, 0x27, 0xC7, 0xE7, 0x40, 0x25, 0xF7, 0xE7, 0x7, 0x4A, 0xA3, 0x6A, 0x93, 0x42, 0xBA, 0xD1, 0xA3, 0x89, 0x80, 0x22, 0xD2, 0x0, 0x13, 0x43,
+0xA3, 0x81, 0xE2, 0x64, 0x15, 0x1C, 0xB9, 0xE7, 0x0, 0xE0, 0xFF, 0xFF, 0xE1, 0x34, 0x0, 0x2, 0x11, 0x47, 0x0, 0x2, 0x0, 0xB5, 0x4, 0x4B, 0x81, 0xB0, 0x1, 0x1C, 0x18, 0x68, 0xFF, 0xF7, 0x7F, 0xFC, 0x1,
+0xB0, 0x1, 0xBC, 0x0, 0x47, 0x80, 0x66, 0x0, 0x2, 0x0, 0xB5, 0x4, 0x4B, 0x81, 0xB0, 0x1, 0x1C, 0x18, 0x68, 0x0, 0xF0, 0x5, 0xF8, 0x1, 0xB0, 0x2, 0xBC, 0x8, 0x47, 0x80, 0x66, 0x0, 0x2, 0xF0, 0xB5, 0x5F,
+0x46, 0x56, 0x46, 0x4D, 0x46, 0x44, 0x46, 0xF0, 0xB4, 0xA, 0x1C, 0xB, 0x32, 0x83, 0xB0, 0x81, 0x46, 0x16, 0x2A, 0x0, 0xD9, 0xB0, 0xE0, 0x10, 0x26, 0x0, 0x23, 0x8E, 0x42, 0xC, 0xD2, 0x48, 0x46, 0xC, 0x23,
+0x3, 0x60, 0x0, 0x20, 0x3, 0xB0, 0x3C, 0xBC, 0x90, 0x46, 0x99, 0x46, 0xA2, 0x46, 0xAB, 0x46, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x0, 0x2B, 0xF0, 0xD1, 0x48, 0x46, 0x0, 0xF0, 0xEF, 0xFA, 0xD6, 0x4B, 0x9E,
+0x42, 0x0, 0xD8, 0x9B, 0xE0, 0x72, 0xA, 0x0, 0x2A, 0x0, 0xD0, 0xB2, 0xE0, 0xF5, 0x8, 0xEB, 0x0, 0xD2, 0x4A, 0xD0, 0x18, 0xC4, 0x68, 0x90, 0x46, 0xA0, 0x42, 0x19, 0xD0, 0x62, 0x68, 0x3, 0x23, 0x11, 0x1C,
+0x99, 0x43, 0x8B, 0x1B, 0xF, 0x2B, 0x0, 0xDD, 0xBB, 0xE0, 0x0, 0x2B, 0x0, 0xDB, 0x90, 0xE0, 0x3, 0x22, 0x9, 0xE0, 0x63, 0x68, 0x19, 0x1C, 0x91, 0x43, 0x8B, 0x1B, 0xF, 0x2B, 0x0, 0xDD, 0xAF, 0xE0, 0x0,
+0x2B, 0x0, 0xDB, 0x84, 0xE0, 0xE4, 0x68, 0xA0, 0x42, 0xF2, 0xD1, 0x1, 0x35, 0xAC, 0x46, 0xC2, 0x4F, 0xBC, 0x68, 0xA7, 0x42, 0x0, 0xD1, 0x75, 0xE1, 0x62, 0x68, 0x3, 0x23, 0x11, 0x1C, 0x99, 0x43, 0x88,
+0x1B, 0xF, 0x28, 0x0, 0xDD, 0x31, 0xE1, 0xFF, 0x60, 0xBF, 0x60, 0x0, 0x28, 0x0, 0xDB, 0x85, 0xE0, 0xBA, 0x4B, 0x99, 0x42, 0x0, 0xD9, 0x3B, 0xE1, 0x8, 0x25, 0xC9, 0x8, 0x6D, 0x42, 0xED, 0x19, 0x8B, 0x10,
+0x1, 0x22, 0x9A, 0x40, 0x6B, 0x68, 0xAA, 0x46, 0xC9, 0x0, 0x51, 0x44, 0x13, 0x43, 0x6B, 0x60, 0x8B, 0x68, 0xE1, 0x60, 0xA3, 0x60, 0xDC, 0x60, 0x8C, 0x60, 0x61, 0x46, 0x1, 0x23, 0x8A, 0x10, 0x18, 0x1C,
+0x90, 0x40, 0x52, 0x46, 0x51, 0x68, 0x88, 0x42, 0x78, 0xD8, 0x8, 0x42, 0xD, 0xD1, 0x3, 0x23, 0x65, 0x46, 0x9D, 0x43, 0x2B, 0x1C, 0x4, 0x33, 0x40, 0x0, 0x9C, 0x46, 0x8, 0x42, 0x4, 0xD1, 0x4, 0x22, 0x40,
+0x0, 0x94, 0x44, 0x8, 0x42, 0xFA, 0xD0, 0x3, 0x21, 0x65, 0x46, 0xEB, 0x0, 0x53, 0x44, 0x9B, 0x46, 0xE0, 0x46, 0x1A, 0x1C, 0xD5, 0x68, 0xAA, 0x42, 0x7, 0xD1, 0x55, 0xE1, 0x0, 0x2C, 0x0, 0xDB, 0x59, 0xE1,
+0xED, 0x68, 0xAA, 0x42, 0x0, 0xD1, 0x4E, 0xE1, 0x6B, 0x68, 0x8B, 0x43, 0x9C, 0x1B, 0xF, 0x2C, 0xF3, 0xDD, 0x1, 0x20, 0x33, 0x1C, 0x3, 0x43, 0xE9, 0x68, 0x6B, 0x60, 0xAB, 0x68, 0xD9, 0x60, 0x8B, 0x60,
+0x23, 0x1C, 0xAA, 0x19, 0x3, 0x43, 0xFA, 0x60, 0xBA, 0x60, 0x48, 0x46, 0xD7, 0x60, 0x97, 0x60, 0x53, 0x60, 0x14, 0x51, 0x0, 0xF0, 0x59, 0xFA, 0x28, 0x1C, 0x8, 0x30, 0x56, 0xE7, 0x7, 0x23, 0x16, 0x1C,
+0x9E, 0x43, 0xF3, 0xF, 0x4B, 0xE7, 0x87, 0x49, 0xF2, 0x8, 0xD3, 0x0, 0x88, 0x46, 0x43, 0x44, 0xDC, 0x68, 0x9C, 0x42, 0x0, 0xD1, 0xF4, 0xE0, 0x61, 0x68, 0x3, 0x23, 0x99, 0x43, 0xE2, 0x68, 0xA3, 0x68, 0x61,
+0x18, 0xDA, 0x60, 0x93, 0x60, 0x4B, 0x68, 0x1, 0x22, 0x13, 0x43, 0x48, 0x46, 0x4B, 0x60, 0x0, 0xF0, 0x39, 0xFA, 0x20, 0x1C, 0x8, 0x30, 0x36, 0xE7, 0x4, 0x2A, 0x11, 0xD9, 0x14, 0x2A, 0x0, 0xD9, 0x2, 0xE1,
+0x15, 0x1C, 0x5B, 0x35, 0xEB, 0x0, 0x45, 0xE7, 0x63, 0x18, 0x5A, 0x68, 0x1, 0x21, 0xA, 0x43, 0x48, 0x46, 0x5A, 0x60, 0x0, 0xF0, 0x25, 0xFA, 0x20, 0x1C, 0x8, 0x30, 0x22, 0xE7, 0xB3, 0x9, 0x1D, 0x1C, 0x38,
+0x35, 0xEB, 0x0, 0x35, 0xE7, 0x1, 0x3D, 0x53, 0xE7, 0x53, 0x46, 0x9C, 0x68, 0x62, 0x68, 0x3, 0x23, 0x9A, 0x43, 0x90, 0x46, 0x90, 0x1B, 0x46, 0x45, 0x11, 0xD8, 0xF, 0x28, 0xF, 0xDD, 0x1, 0x21, 0x33, 0x1C,
+0xB, 0x43, 0x63, 0x60, 0xA2, 0x19, 0x53, 0x46, 0x9A, 0x60, 0x3, 0x1C, 0xB, 0x43, 0x48, 0x46, 0x53, 0x60, 0x0, 0xF0, 0x3, 0xFA, 0x20, 0x1C, 0x8, 0x30, 0x0, 0xE7, 0x61, 0x4B, 0x1B, 0x68, 0x61, 0x4D, 0x10,
+0x33, 0x9F, 0x19, 0x2B, 0x68, 0xAB, 0x46, 0x1, 0x33, 0x4, 0xD0, 0x5F, 0x48, 0x5F, 0x4B, 0x3A, 0x18, 0x17, 0x1C, 0x1F, 0x40, 0x48, 0x46, 0x39, 0x1C, 0x0, 0xF0, 0x12, 0xFC, 0x5, 0x1C, 0x41, 0x1C, 0x54,
+0xD0, 0x43, 0x46, 0xE2, 0x18, 0xAA, 0x42, 0x0, 0xD8, 0xF9, 0xE0, 0x54, 0x45, 0x4D, 0xD1, 0x57, 0x48, 0x3, 0x68, 0xF9, 0x18, 0x1, 0x90, 0x1, 0x60, 0x58, 0x46, 0x3, 0x68, 0x1, 0x33, 0x0, 0xD1, 0x30, 0xE1,
+0xAB, 0x1A, 0x5B, 0x18, 0x1, 0x99, 0xB, 0x60, 0x7, 0x23, 0x2A, 0x1C, 0x1A, 0x40, 0x0, 0xD0, 0xFE, 0xE0, 0x80, 0x21, 0x49, 0x1, 0x4B, 0x4A, 0xEB, 0x19, 0x13, 0x40, 0xCF, 0x1A, 0x48, 0x46, 0x39, 0x1C, 0x0,
+0xF0, 0xEB, 0xFB, 0x43, 0x1C, 0x0, 0xD1, 0x17, 0xE1, 0x43, 0x1B, 0xDB, 0x19, 0x1, 0x22, 0x18, 0x1C, 0x10, 0x43, 0x1, 0x99, 0xB, 0x68, 0x52, 0x46, 0xFB, 0x18, 0xB, 0x60, 0x95, 0x60, 0x68, 0x60, 0x54, 0x45,
+0x13, 0xD0, 0x43, 0x46, 0xF, 0x2B, 0x0, 0xD8, 0xEF, 0xE0, 0x41, 0x46, 0x7, 0x23, 0xC, 0x39, 0x99, 0x43, 0x62, 0x18, 0x5, 0x23, 0x53, 0x60, 0x93, 0x60, 0x63, 0x68, 0x1, 0x22, 0x13, 0x40, 0xB, 0x43, 0x63,
+0x60, 0xF, 0x29, 0x0, 0xD9, 0xFA, 0xE0, 0x1, 0x9D, 0x37, 0x49, 0x2A, 0x68, 0xB, 0x68, 0x9A, 0x42, 0x0, 0xD9, 0xA, 0x60, 0x35, 0x49, 0xB, 0x68, 0x9A, 0x42, 0x0, 0xD9, 0xA, 0x60, 0x50, 0x46, 0x84, 0x68,
+0x63, 0x68, 0x3, 0x22, 0x93, 0x43, 0x98, 0x1B, 0x9E, 0x42, 0x2, 0xD8, 0xF, 0x28, 0x0, 0xDD, 0x7A, 0xE7, 0x48, 0x46, 0x0, 0xF0, 0x88, 0xF9, 0x0, 0x20, 0x86, 0xE6, 0x1, 0x21, 0x33, 0x1C, 0xB, 0x43, 0x63,
+0x60, 0x3, 0x1C, 0xA2, 0x19, 0xB, 0x43, 0xFA, 0x60, 0xBA, 0x60, 0x10, 0x50, 0xD7, 0x60, 0x48, 0x46, 0x97, 0x60, 0x53, 0x60, 0x0, 0xF0, 0x76, 0xF9, 0x20, 0x1C, 0x8, 0x30, 0x73, 0xE6, 0x4A, 0xA, 0x4, 0x2A,
+0x62, 0xD9, 0x14, 0x2A, 0x0, 0xD9, 0xAD, 0xE0, 0x13, 0x1C, 0x5B, 0x33, 0xDA, 0x0, 0x45, 0x46, 0xA8, 0x18, 0x85, 0x68, 0xC2, 0x46, 0x85, 0x42, 0x0, 0xD1, 0x97, 0xE0, 0x2A, 0x1C, 0x3, 0x25, 0x53, 0x68,
+0xAB, 0x43, 0x99, 0x42, 0x2, 0xD2, 0x92, 0x68, 0x90, 0x42, 0xF8, 0xD1, 0xD3, 0x68, 0x15, 0x1C, 0xE3, 0x60, 0xA5, 0x60, 0xEC, 0x60, 0x9C, 0x60, 0xB5, 0xE6, 0x23, 0x1C, 0x8, 0x33, 0xDC, 0x68, 0xA3, 0x42,
+0x0, 0xD0, 0x4, 0xE7, 0x2, 0x32, 0x94, 0x46, 0x84, 0xE6, 0x8, 0x23, 0x5B, 0x42, 0xDB, 0x19, 0x9A, 0x46, 0xA7, 0xE6, 0xC0, 0x46, 0xF7, 0x1, 0x0, 0x0, 0x88, 0x6A, 0x0, 0x2, 0x90, 0x6A, 0x0, 0x2, 0xFF, 0x1,
+0x0, 0x0, 0xBC, 0x6F, 0x0, 0x2, 0x94, 0x6E, 0x0, 0x2, 0xFF, 0xF, 0x0, 0x0, 0x0, 0xF0, 0xFF, 0xFF, 0xC8, 0x6F, 0x0, 0x2, 0xC0, 0x6F, 0x0, 0x2, 0xC4, 0x6F, 0x0, 0x2, 0x54, 0x2A, 0x22, 0xD9, 0xAA, 0x23,
+0x5B, 0x0, 0x9A, 0x42, 0x4E, 0xD8, 0xF3, 0xB, 0x1D, 0x1C, 0x77, 0x35, 0xEB, 0x0, 0x3B, 0xE6, 0x1, 0x23, 0x98, 0x44, 0x45, 0x46, 0xD, 0x42, 0x19, 0xD0, 0x8, 0x32, 0x9E, 0xE6, 0xE9, 0x18, 0x4B, 0x68, 0x1,
+0x22, 0x13, 0x43, 0x4B, 0x60, 0xEA, 0x68, 0xAB, 0x68, 0x48, 0x46, 0xDA, 0x60, 0x93, 0x60, 0x0, 0xF0, 0x10, 0xF9, 0x28, 0x1C, 0x8, 0x30, 0xD, 0xE6, 0x8B, 0x9, 0x38, 0x33, 0xDA, 0x0, 0x9E, 0xE7, 0x33, 0xB,
+0x1D, 0x1C, 0x6E, 0x35, 0xEB, 0x0, 0x1C, 0xE6, 0x62, 0x46, 0x5C, 0x46, 0x0, 0xE0, 0x1, 0x3A, 0xA, 0x42, 0x5C, 0xD0, 0x23, 0x1C, 0x8, 0x3B, 0x9C, 0x68, 0x9C, 0x42, 0xF7, 0xD0, 0x55, 0x46, 0x6B, 0x68, 0x40,
+0x0, 0x98, 0x42, 0x0, 0xD9, 0xD7, 0xE6, 0x0, 0x28, 0x0, 0xD1, 0xD4, 0xE6, 0x18, 0x42, 0x58, 0xD0, 0xC4, 0x46, 0x68, 0xE6, 0x2F, 0x48, 0x3, 0x68, 0xF9, 0x18, 0x1, 0x90, 0x1, 0x60, 0xAA, 0x42, 0x0, 0xD0,
+0x4, 0xE7, 0x13, 0x5, 0x0, 0xD0, 0x1, 0xE7, 0x55, 0x46, 0x40, 0x46, 0xAB, 0x68, 0x3A, 0x18, 0x1, 0x21, 0xA, 0x43, 0x5A, 0x60, 0x36, 0xE7, 0x27, 0x4B, 0x9A, 0x42, 0x1C, 0xD9, 0xFC, 0x23, 0x7E, 0x25, 0x9B,
+0x0, 0xEA, 0xE5, 0x8, 0x23, 0x9B, 0x1A, 0x80, 0x22, 0x52, 0x1, 0xED, 0x18, 0x99, 0x18, 0xFB, 0xE6, 0x9B, 0x10, 0x40, 0x46, 0x1, 0x22, 0x9A, 0x40, 0x43, 0x68, 0x13, 0x43, 0x43, 0x60, 0x2B, 0x1C, 0x69,
+0xE7, 0x1, 0x23, 0x6B, 0x60, 0x28, 0xE7, 0x54, 0x2A, 0x8, 0xD8, 0xB, 0xB, 0x6E, 0x33, 0xDA, 0x0, 0x4E, 0xE7, 0xB3, 0xC, 0x1D, 0x1C, 0x7C, 0x35, 0xEB, 0x0, 0xCC, 0xE5, 0xAA, 0x23, 0x5B, 0x0, 0x9A, 0x42,
+0x13, 0xD8, 0xCB, 0xB, 0x77, 0x33, 0xDA, 0x0, 0x41, 0xE7, 0x0, 0x27, 0x1, 0x20, 0xE9, 0xE6, 0x5, 0x60, 0xD0, 0xE6, 0x21, 0x1C, 0x8, 0x31, 0x48, 0x46, 0xFF, 0xF7, 0xFC, 0xF9, 0xFE, 0xE6, 0x52, 0x46, 0x53,
+0x68, 0x83, 0x43, 0x53, 0x60, 0xA2, 0xE7, 0x8, 0x4B, 0x9A, 0x42, 0x7, 0xD9, 0xFC, 0x22, 0x7E, 0x23, 0x92, 0x0, 0x2A, 0xE7, 0x4, 0x22, 0x90, 0x44, 0x40, 0x0, 0xA0, 0xE7, 0x8B, 0xC, 0x7C, 0x33, 0xDA, 0x0,
+0x22, 0xE7, 0xC0, 0x46, 0xC8, 0x6F, 0x0, 0x2, 0x54, 0x5, 0x0, 0x0, 0xF0, 0xB5, 0x7, 0x1C, 0xE, 0x1C, 0x4, 0x1C, 0x15, 0x1C, 0x8, 0x1C, 0x11, 0x1C, 0xF, 0x2A, 0x3, 0xD9, 0x33, 0x1C, 0x3B, 0x43, 0x9A, 0x7,
+0xB, 0xD0, 0x0, 0x29, 0x5, 0xD0, 0x0, 0x22, 0x83, 0x5C, 0xA3, 0x54, 0x1, 0x32, 0x8A, 0x42, 0xFA, 0xD1, 0x38, 0x1C, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x32, 0x1C, 0x39, 0x1C, 0x28, 0x1C, 0x13, 0x68, 0xB,
+0x60, 0x53, 0x68, 0x4B, 0x60, 0x93, 0x68, 0x8B, 0x60, 0xD3, 0x68, 0x10, 0x38, 0xCB, 0x60, 0x10, 0x32, 0x10, 0x31, 0xF, 0x28, 0xF2, 0xD8, 0x2B, 0x1C, 0x10, 0x3B, 0x1A, 0x9, 0x11, 0x1, 0x1, 0x32, 0x12,
+0x1, 0x59, 0x1A, 0xB0, 0x18, 0xBC, 0x18, 0x3, 0x29, 0xD8, 0xD9, 0x0, 0x22, 0x83, 0x58, 0xA3, 0x50, 0x4, 0x32, 0x8B, 0x1A, 0x3, 0x2B, 0xF9, 0xD8, 0xB, 0x1F, 0x9A, 0x8, 0x91, 0x0, 0x1, 0x32, 0x92, 0x0,
+0x59, 0x1A, 0x80, 0x18, 0xA4, 0x18, 0xC8, 0xE7, 0x70, 0xB5, 0x5, 0x1C, 0xFF, 0x23, 0xE, 0x1C, 0x10, 0x1C, 0x2C, 0x1C, 0x1E, 0x40, 0x3, 0x2A, 0x2B, 0xD9, 0xAB, 0x7, 0x2B, 0xD1, 0x33, 0x2, 0x33, 0x43, 0x1A,
+0x4, 0x11, 0x1C, 0x19, 0x43, 0xF, 0x28, 0x14, 0xD9, 0x2, 0x1C, 0x2B, 0x1C, 0x10, 0x3A, 0x19, 0x60, 0x59, 0x60, 0x99, 0x60, 0xD9, 0x60, 0x10, 0x33, 0xF, 0x2A, 0xF7, 0xD8, 0x3, 0x1C, 0x10, 0x3B, 0x1A, 0x9,
+0x1, 0x32, 0x12, 0x1, 0xAC, 0x18, 0x18, 0x1C, 0xF, 0x22, 0x10, 0x40, 0x3, 0x28, 0xD, 0xD9, 0x0, 0x22, 0xA1, 0x50, 0x4, 0x32, 0x83, 0x1A, 0x3, 0x2B, 0xFA, 0xD8, 0x3, 0x1F, 0x18, 0x1C, 0x9B, 0x8, 0x1, 0x33,
+0x3, 0x22, 0x9B, 0x0, 0x10, 0x40, 0xE4, 0x18, 0x0, 0x28, 0x5, 0xD0, 0x31, 0x1C, 0x0, 0x22, 0xA1, 0x54, 0x1, 0x32, 0x90, 0x42, 0xFB, 0xD1, 0x28, 0x1C, 0x70, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xC0, 0x46, 0x70,
+0x47, 0xC0, 0x46, 0x70, 0x47, 0xC0, 0x46, 0x70, 0xB5, 0x6, 0x1C, 0xD, 0x1C, 0x0, 0x28, 0x2, 0xD0, 0x83, 0x6B, 0x0, 0x2B, 0x3E, 0xD0, 0xAA, 0x89, 0x0, 0x23, 0x6B, 0x60, 0x91, 0x6, 0x36, 0xD4, 0x51, 0x7,
+0x20, 0xD4, 0xD1, 0x6, 0x54, 0xD5, 0x8, 0x24, 0x22, 0x42, 0x54, 0xD1, 0x4, 0x23, 0x13, 0x43, 0xAB, 0x81, 0x2B, 0x69, 0x0, 0x2B, 0x46, 0xD0, 0xAB, 0x89, 0x9A, 0x7, 0x34, 0xD1, 0x2A, 0x69, 0x6B, 0x69, 0x2A,
+0x60, 0xE9, 0x69, 0x2C, 0x6A, 0x30, 0x1C, 0x0, 0xF0, 0x65, 0xF8, 0xAA, 0x89, 0x27, 0x4B, 0x1A, 0x40, 0x68, 0x60, 0xAA, 0x81, 0x0, 0x28, 0x1D, 0xDD, 0x0, 0x20, 0x70, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x29, 0x6B,
+0x0, 0x29, 0xE3, 0xD0, 0x2B, 0x1C, 0x40, 0x33, 0x99, 0x42, 0x2, 0xD0, 0x30, 0x1C, 0xFF, 0xF7, 0x1E, 0xF9, 0x0, 0x23, 0x2B, 0x63, 0xEB, 0x6B, 0x6B, 0x60, 0x0, 0x2B, 0xD6, 0xD0, 0xAB, 0x6B, 0x0, 0x20, 0x2B,
+0x60, 0xE8, 0xE7, 0x1, 0x20, 0x40, 0x42, 0xE5, 0xE7, 0xFE, 0xF7, 0xB5, 0xFE, 0xBD, 0xE7, 0x0, 0x28, 0xB, 0xD1, 0x20, 0x23, 0x13, 0x43, 0x1, 0x20, 0xAB, 0x81, 0x40, 0x42, 0xDA, 0xE7, 0x12, 0x4B, 0x13,
+0x49, 0x18, 0x68, 0xFF, 0xF7, 0x95, 0xFB, 0xC4, 0xE7, 0x0, 0x23, 0x6B, 0x60, 0xAB, 0x89, 0x40, 0x22, 0x13, 0x43, 0x1, 0x20, 0xAB, 0x81, 0x40, 0x42, 0xCB, 0xE7, 0x30, 0x1C, 0x29, 0x1C, 0xFF, 0xF7, 0xFB,
+0xFB, 0xB3, 0xE7, 0x9, 0x23, 0x33, 0x60, 0xF0, 0xE7, 0x30, 0x1C, 0x29, 0x1C, 0xFE, 0xF7, 0xF5, 0xFD, 0x0, 0x28, 0xD4, 0xD1, 0xAB, 0x89, 0xA3, 0x43, 0xAB, 0x81, 0xA8, 0x60, 0xA8, 0x61, 0xAA, 0x89, 0x9D,
+0xE7, 0xFF, 0xDF, 0x0, 0x0, 0x78, 0x65, 0x0, 0x2, 0xDD, 0x46, 0x0, 0x2, 0x0, 0xB5, 0x83, 0x89, 0x9, 0x22, 0x13, 0x40, 0x81, 0xB0, 0x9, 0x2B, 0x3, 0xD0, 0x0, 0x20, 0x1, 0xB0, 0x2, 0xBC, 0x8, 0x47, 0xFE,
+0xF7, 0x5B, 0xFE, 0xF9, 0xE7, 0x20, 0x47, 0xC0, 0x46, 0x0, 0xB5, 0x81, 0xB0, 0xE, 0x23, 0xC9, 0x5E, 0x0, 0xF0, 0x94, 0xF8, 0x1, 0xB0, 0x2, 0xBC, 0x8, 0x47, 0xC0, 0x46, 0x30, 0xB5, 0xC, 0x1C, 0x81, 0xB0,
+0xE, 0x25, 0x49, 0x5F, 0x0, 0xF0, 0xE3, 0xF8, 0x43, 0x1C, 0x9, 0xD0, 0xA3, 0x89, 0x80, 0x22, 0x52, 0x1, 0x13, 0x43, 0xA3, 0x81, 0x20, 0x65, 0x1, 0xB0, 0x30, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xA3, 0x89, 0x1,
+0x4A, 0x13, 0x40, 0xA3, 0x81, 0xF6, 0xE7, 0xFF, 0xEF, 0xFF, 0xFF, 0xF0, 0xB5, 0x16, 0x1C, 0x8A, 0x89, 0x81, 0xB0, 0x5, 0x1C, 0xC, 0x1C, 0x1F, 0x1C, 0xD3, 0x5, 0x6, 0xD5, 0xE, 0x23, 0xC9, 0x5E, 0x0, 0x22,
+0x2, 0x23, 0x0, 0xF0, 0xC1, 0xF8, 0xA2, 0x89, 0x6, 0x4B, 0x13, 0x40, 0xA3, 0x81, 0x28, 0x1C, 0xE, 0x23, 0xE1, 0x5E, 0x32, 0x1C, 0x3B, 0x1C, 0x0, 0xF0, 0xA8, 0xF9, 0x1, 0xB0, 0xF0, 0xBC, 0x2, 0xBC, 0x8,
+0x47, 0xFF, 0xEF, 0xFF, 0xFF, 0x30, 0xB5, 0xC, 0x1C, 0x81, 0xB0, 0xE, 0x25, 0x49, 0x5F, 0x0, 0xF0, 0x21, 0xF9, 0x0, 0x28, 0x6, 0xDB, 0x23, 0x6D, 0x1B, 0x18, 0x23, 0x65, 0x1, 0xB0, 0x30, 0xBC, 0x2, 0xBC,
+0x8, 0x47, 0xA3, 0x89, 0x2, 0x4A, 0x13, 0x40, 0xA3, 0x81, 0xF6, 0xE7, 0xC0, 0x46, 0xFF, 0xEF, 0xFF, 0xFF, 0x70, 0xB5, 0xB, 0x78, 0xC, 0x1C, 0x16, 0x1C, 0x72, 0x2B, 0x25, 0xD0, 0x77, 0x2B, 0x1E, 0xD0,
+0x61, 0x2B, 0x6, 0xD0, 0x16, 0x23, 0x3, 0x60, 0x0, 0x22, 0x10, 0x1C, 0x70, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x84, 0x22, 0x82, 0x20, 0x52, 0x0, 0x1, 0x25, 0x80, 0x0, 0x61, 0x78, 0x0, 0x29, 0x9, 0xD0, 0x2B,
+0x29, 0x1B, 0xD0, 0xA3, 0x78, 0x2B, 0x2B, 0x18, 0xD0, 0x62, 0x29, 0xF, 0xD0, 0xA3, 0x78, 0x62, 0x2B, 0xC, 0xD0, 0x2B, 0x1C, 0x3, 0x43, 0x33, 0x60, 0xE5, 0xE7, 0xC0, 0x20, 0x8, 0x22, 0x1, 0x25, 0xC0, 0x0,
+0xE9, 0xE7, 0x4, 0x22, 0x0, 0x25, 0x0, 0x20, 0xE5, 0xE7, 0x80, 0x23, 0x5B, 0x2, 0x1D, 0x43, 0x2B, 0x1C, 0x3, 0x43, 0x33, 0x60, 0xD5, 0xE7, 0x1C, 0x23, 0x9A, 0x43, 0x10, 0x23, 0x1A, 0x43, 0x2, 0x25, 0xE0,
+0xE7, 0xC0, 0x46, 0x30, 0xB5, 0x81, 0xB0, 0x4, 0x1C, 0xD, 0x1C, 0x4B, 0x1C, 0x6, 0xD1, 0x1, 0x24, 0x64, 0x42, 0x1, 0xB0, 0x20, 0x1C, 0x30, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x8, 0x1C, 0x0, 0xF0, 0x90, 0xF9,
+0x0, 0x28, 0xF3, 0xD0, 0x2, 0x68, 0x9, 0x4B, 0x92, 0x0, 0xD3, 0x58, 0xDA, 0x68, 0x41, 0x68, 0x0, 0x2A, 0x7, 0xD0, 0x20, 0x1C, 0x0, 0xF0, 0xB, 0xF8, 0x4, 0x1C, 0x28, 0x1C, 0x0, 0xF0, 0xAB, 0xF9, 0xE5,
+0xE7, 0x1, 0x24, 0x64, 0x42, 0xF8, 0xE7, 0xC0, 0x46, 0x98, 0x6E, 0x0, 0x2, 0x10, 0x47, 0xC0, 0x46, 0x30, 0xB5, 0x4, 0x1C, 0x81, 0xB0, 0x8, 0x1C, 0x15, 0x1C, 0x4B, 0x1C, 0x11, 0xD0, 0x2, 0x29, 0x17, 0xDC,
+0x1, 0x21, 0x49, 0x42, 0xF, 0x4B, 0x82, 0x0, 0xD3, 0x58, 0xDB, 0x69, 0x0, 0x2B, 0xA, 0xD0, 0x20, 0x1C, 0x2A, 0x1C, 0x0, 0xF0, 0x17, 0xF8, 0x1, 0xB0, 0x30, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x1, 0x20, 0x40,
+0x42, 0xF8, 0xE7, 0x58, 0x23, 0x1, 0x20, 0x23, 0x60, 0x40, 0x42, 0xF3, 0xE7, 0x0, 0xF0, 0x53, 0xF9, 0x1, 0x1C, 0x0, 0x28, 0xF2, 0xD0, 0x0, 0x68, 0x49, 0x68, 0xE1, 0xE7, 0xC0, 0x46, 0x98, 0x6E, 0x0, 0x2,
+0x18, 0x47, 0xC0, 0x46, 0x0, 0x20, 0x70, 0x47, 0xF0, 0xB5, 0x5, 0x1C, 0x81, 0xB0, 0x8, 0x1C, 0x16, 0x1C, 0x1F, 0x1C, 0x4B, 0x1C, 0xF, 0xD0, 0x2, 0x29, 0x13, 0xDC, 0x1, 0x21, 0x49, 0x42, 0xC, 0x4B, 0x82,
+0x0, 0xD3, 0x58, 0x9C, 0x69, 0x0, 0x2C, 0x5, 0xD0, 0x28, 0x1C, 0x32, 0x1C, 0x3B, 0x1C, 0x0, 0xF0, 0x11, 0xF8, 0x1, 0xE0, 0x1, 0x20, 0x40, 0x42, 0x1, 0xB0, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x0, 0xF0,
+0x26, 0xF9, 0x1, 0x1C, 0x0, 0x28, 0xF4, 0xD0, 0x0, 0x68, 0x49, 0x68, 0xE5, 0xE7, 0x98, 0x6E, 0x0, 0x2, 0x20, 0x47, 0xC0, 0x46, 0xF0, 0xB5, 0x5F, 0x46, 0x56, 0x46, 0x4D, 0x46, 0x44, 0x46, 0xF0, 0xB4, 0x83,
+0xB0, 0x80, 0x46, 0x8, 0x1C, 0x8A, 0x46, 0x93, 0x46, 0x99, 0x46, 0x0, 0xF0, 0x94, 0xF9, 0x4, 0x1C, 0x42, 0x1C, 0x2C, 0xD0, 0x1C, 0x4F, 0x86, 0x0, 0xF2, 0x59, 0x93, 0x68, 0x0, 0x2B, 0x26, 0xD0, 0x50, 0x68,
+0x8, 0x30, 0x0, 0xF0, 0xF, 0xF9, 0x5, 0x1C, 0x43, 0x1C, 0x1B, 0xD0, 0x0, 0xF0, 0xFC, 0xF8, 0x1, 0x1C, 0x8, 0x31, 0x4A, 0x46, 0x4, 0x60, 0xF3, 0x59, 0x41, 0x60, 0x0, 0x92, 0x40, 0x46, 0x9C, 0x68, 0x52,
+0x46, 0x5B, 0x46, 0x0, 0xF0, 0x1F, 0xF8, 0x4, 0x1C, 0x43, 0x1C, 0x13, 0xD0, 0x3, 0xB0, 0x28, 0x1C, 0x3C, 0xBC, 0x90, 0x46, 0x99, 0x46, 0xA2, 0x46, 0xAB, 0x46, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x3F, 0x23,
+0x42, 0x46, 0x13, 0x60, 0xF1, 0xE7, 0x58, 0x23, 0x42, 0x46, 0x1, 0x25, 0x13, 0x60, 0x6D, 0x42, 0xEB, 0xE7, 0x28, 0x1C, 0x0, 0xF0, 0x1, 0xF9, 0x25, 0x1C, 0xE6, 0xE7, 0xC0, 0x46, 0x98, 0x6E, 0x0, 0x2, 0x20,
+0x47, 0xC0, 0x46, 0xF0, 0xB5, 0x5, 0x1C, 0x81, 0xB0, 0x8, 0x1C, 0x16, 0x1C, 0x1F, 0x1C, 0x4B, 0x1C, 0xF, 0xD0, 0x2, 0x29, 0x13, 0xDC, 0x1, 0x21, 0x49, 0x42, 0xC, 0x4B, 0x82, 0x0, 0xD3, 0x58, 0x5C, 0x69,
+0x0, 0x2C, 0x5, 0xD0, 0x28, 0x1C, 0x32, 0x1C, 0x3B, 0x1C, 0x0, 0xF0, 0x11, 0xF8, 0x1, 0xE0, 0x1, 0x20, 0x40, 0x42, 0x1, 0xB0, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x0, 0xF0, 0xAE, 0xF8, 0x1, 0x1C, 0x0, 0x28,
+0xF4, 0xD0, 0x0, 0x68, 0x49, 0x68, 0xE5, 0xE7, 0x98, 0x6E, 0x0, 0x2, 0x20, 0x47, 0xC0, 0x46, 0x10, 0xB5, 0x10, 0x4A, 0x13, 0x68, 0x4, 0x1C, 0x0, 0x2B, 0x12, 0xD0, 0xE, 0x4B, 0x1B, 0x68, 0x10, 0x68, 0x0,
+0x2B, 0xB, 0xD0, 0x41, 0x18, 0x8B, 0x42, 0x3, 0xD3, 0x11, 0x60, 0x10, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xC, 0x23, 0x1, 0x20, 0x23, 0x60, 0x40, 0x42, 0xF7, 0xE7, 0x6B, 0x46, 0xF1, 0xE7, 0x6, 0x4B, 0x1B, 0x68,
+0x0, 0x2B, 0x1, 0xD0, 0x13, 0x60, 0xE6, 0xE7, 0x4, 0x4B, 0x13, 0x60, 0xE3, 0xE7, 0xF0, 0x6F, 0x0, 0x2, 0xF4, 0x6F, 0x0, 0x2, 0xF8, 0x6F, 0x0, 0x2, 0x48, 0x86, 0x0, 0x2, 0x1, 0x20, 0x40, 0x42, 0x70, 0x47,
+0xC0, 0x46, 0x0, 0xB5, 0x2, 0x1C, 0x0, 0x29, 0x4, 0xD1, 0x1, 0x20, 0x40, 0x42, 0x10, 0x60, 0x2, 0xBC, 0x8, 0x47, 0x5, 0x4B, 0x1B, 0x68, 0x0, 0x2B, 0xF6, 0xD0, 0x1B, 0x68, 0xB, 0x60, 0x0, 0x23, 0x4B, 0x60,
+0x0, 0x20, 0xF2, 0xE7, 0xC0, 0x46, 0x44, 0x86, 0x0, 0x2, 0x0, 0xB5, 0x81, 0xB0, 0x0, 0xF0, 0x6C, 0xF9, 0x58, 0x23, 0x3, 0x60, 0x1, 0xB0, 0x1, 0x20, 0x40, 0x42, 0x2, 0xBC, 0x8, 0x47, 0xC0, 0x46, 0xF0,
+0xB5, 0x5, 0x1C, 0x81, 0xB0, 0x8, 0x1C, 0x16, 0x1C, 0x1F, 0x1C, 0x4B, 0x1C, 0xF, 0xD0, 0x2, 0x29, 0x13, 0xDC, 0x1, 0x21, 0x49, 0x42, 0xC, 0x4B, 0x82, 0x0, 0xD3, 0x58, 0x1C, 0x69, 0x0, 0x2C, 0x5, 0xD0,
+0x28, 0x1C, 0x32, 0x1C, 0x3B, 0x1C, 0x0, 0xF0, 0x11, 0xF8, 0x1, 0xE0, 0x1, 0x20, 0x40, 0x42, 0x1, 0xB0, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x0, 0xF0, 0x34, 0xF8, 0x1, 0x1C, 0x0, 0x28, 0xF4, 0xD0, 0x0,
+0x68, 0x49, 0x68, 0xE5, 0xE7, 0x98, 0x6E, 0x0, 0x2, 0x20, 0x47, 0xC0, 0x46, 0x30, 0xB5, 0x5, 0x1C, 0xAB, 0x68, 0x40, 0x68, 0x1A, 0x1D, 0x82, 0x18, 0x3, 0x21, 0x14, 0x1C, 0x1, 0x3B, 0x8C, 0x43, 0xC2, 0x18,
+0x0, 0x21, 0x2, 0xE0, 0x1, 0x30, 0x82, 0x42, 0xE, 0xD9, 0x8B, 0x0, 0x18, 0x51, 0x3, 0x78, 0x1, 0x31, 0x0, 0x2B, 0xF6, 0xD0, 0x90, 0x42, 0xF4, 0xD2, 0x1, 0x30, 0x3, 0x78, 0x0, 0x2B, 0xF9, 0xD1, 0x1, 0x30,
+0x82, 0x42, 0xF0, 0xD8, 0x0, 0x23, 0x13, 0x70, 0x8B, 0x0, 0xE3, 0x18, 0x2C, 0x61, 0xE9, 0x60, 0x6B, 0x61, 0x30, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0xC0, 0x46, 0x0, 0xB5, 0x3, 0x38, 0x80, 0x28, 0x4, 0xD8, 0x3,
+0x4A, 0x83, 0x0, 0x98, 0x58, 0x2, 0xBC, 0x8, 0x47, 0x0, 0x20, 0xFB, 0xE7, 0xC0, 0x46, 0xFC, 0x6F, 0x0, 0x2, 0x30, 0xB5, 0xD, 0x4D, 0x81, 0xB0, 0x2A, 0x1C, 0x0, 0x24, 0x3, 0xE0, 0x1, 0x34, 0x4, 0x32, 0x80,
+0x2C, 0xD, 0xD0, 0x13, 0x68, 0x0, 0x2B, 0xF8, 0xD1, 0xFF, 0xF7, 0xFB, 0xF9, 0xA3, 0x0, 0x58, 0x51, 0x0, 0x28, 0x4, 0xD0, 0xE0, 0x1C, 0x1, 0xB0, 0x30, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x1, 0x20, 0x40, 0x42,
+0xF8, 0xE7, 0xC0, 0x46, 0xFC, 0x6F, 0x0, 0x2, 0x30, 0xB5, 0x3, 0x38, 0x81, 0xB0, 0x7F, 0x28, 0x8, 0xD8, 0x6, 0x4D, 0x84, 0x0, 0x60, 0x59, 0x0, 0x28, 0x3, 0xD0, 0xFF, 0xF7, 0xD4, 0xF9, 0x0, 0x23, 0x63,
+0x51, 0x1, 0xB0, 0x30, 0xBC, 0x1, 0xBC, 0x0, 0x47, 0xFC, 0x6F, 0x0, 0x2, 0x0, 0xB5, 0xC3, 0x1E, 0xD, 0x2B, 0x1, 0xD8, 0x1, 0x4B, 0x18, 0x60, 0x1, 0xBC, 0x0, 0x47, 0xD8, 0x6E, 0x0, 0x2, 0xF0, 0xB5, 0x57,
+0x46, 0x4E, 0x46, 0x45, 0x46, 0xE0, 0xB4, 0x1, 0x68, 0x17, 0x4B, 0x18, 0x4F, 0x81, 0x46, 0x88, 0x46, 0x3, 0x26, 0x9A, 0x46, 0x3B, 0x68, 0x1D, 0x68, 0x41, 0x46, 0x28, 0x1C, 0x0, 0xF0, 0xBA, 0xF8, 0x0,
+0x28, 0x8, 0xD1, 0x28, 0x1C, 0x0, 0xF0, 0xE3, 0xF8, 0x4, 0x1C, 0x40, 0x46, 0x0, 0xF0, 0xDF, 0xF8, 0x84, 0x42, 0x13, 0xD0, 0x28, 0x1C, 0x51, 0x46, 0x0, 0xF0, 0xAB, 0xF8, 0x0, 0x28, 0xD, 0xD0, 0x1, 0x36,
+0x4, 0x37, 0x10, 0x2E, 0xE4, 0xD1, 0x1, 0x26, 0x76, 0x42, 0x30, 0x1C, 0x1C, 0xBC, 0x90, 0x46, 0x99, 0x46, 0xA2, 0x46, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x4, 0x4A, 0xB3, 0x0, 0x49, 0x46, 0x99, 0x50, 0xF2,
+0xE7, 0x28, 0x66, 0x0, 0x2, 0xA4, 0x6E, 0x0, 0x2, 0x98, 0x6E, 0x0, 0x2, 0xF0, 0xB5, 0x47, 0x46, 0x80, 0xB4, 0x15, 0x4E, 0x80, 0x46, 0x0, 0x27, 0x34, 0x68, 0x0, 0x2C, 0x16, 0xD0, 0x24, 0x68, 0x20, 0x1C,
+0x0, 0xF0, 0xB1, 0xF8, 0x5, 0x1C, 0x41, 0x46, 0x20, 0x1C, 0x2A, 0x1C, 0x0, 0xF0, 0xCD, 0xF8, 0x0, 0x28, 0xA, 0xD1, 0x42, 0x46, 0x53, 0x5D, 0x3A, 0x2B, 0x11, 0xD0, 0x30, 0x3B, 0x9, 0x2B, 0x3, 0xD8, 0x53,
+0x19, 0x5B, 0x78, 0x3A, 0x2B, 0xA, 0xD0, 0x1, 0x37, 0x4, 0x36, 0x10, 0x2F, 0xE1, 0xD1, 0x5, 0x4B, 0x18, 0x68, 0x4, 0xBC, 0x90, 0x46, 0xF0, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0x38, 0x1C, 0xF8, 0xE7, 0xC0, 0x46,
+0x98, 0x6E, 0x0, 0x2, 0xD8, 0x6E, 0x0, 0x2, 0x0, 0xB5, 0x81, 0xB0, 0xFF, 0xF7, 0xCA, 0xFF, 0x43, 0x1C, 0x4, 0xD0, 0x3, 0x49, 0x4, 0x4B, 0x82, 0x0, 0x53, 0x50, 0x0, 0x20, 0x1, 0xB0, 0x2, 0xBC, 0x8, 0x47,
+0x98, 0x6E, 0x0, 0x2, 0x7C, 0x65, 0x0, 0x2, 0x0, 0x29, 0x34, 0xD0, 0x1, 0x23, 0x0, 0x22, 0x10, 0xB4, 0x88, 0x42, 0x2C, 0xD3, 0x1, 0x24, 0x24, 0x7, 0xA1, 0x42, 0x4, 0xD2, 0x81, 0x42, 0x2, 0xD2, 0x9, 0x1,
+0x1B, 0x1, 0xF8, 0xE7, 0xE4, 0x0, 0xA1, 0x42, 0x4, 0xD2, 0x81, 0x42, 0x2, 0xD2, 0x49, 0x0, 0x5B, 0x0, 0xF8, 0xE7, 0x88, 0x42, 0x1, 0xD3, 0x40, 0x1A, 0x1A, 0x43, 0x4C, 0x8, 0xA0, 0x42, 0x2, 0xD3, 0x0,
+0x1B, 0x5C, 0x8, 0x22, 0x43, 0x8C, 0x8, 0xA0, 0x42, 0x2, 0xD3, 0x0, 0x1B, 0x9C, 0x8, 0x22, 0x43, 0xCC, 0x8, 0xA0, 0x42, 0x2, 0xD3, 0x0, 0x1B, 0xDC, 0x8, 0x22, 0x43, 0x0, 0x28, 0x3, 0xD0, 0x1B, 0x9, 0x1,
+0xD0, 0x9, 0x9, 0xE3, 0xE7, 0x10, 0x1C, 0x10, 0xBC, 0x70, 0x47, 0x2, 0xB5, 0xFE, 0xF7, 0x36, 0xFA, 0x0, 0x20, 0x6, 0xBC, 0x10, 0x47, 0xC0, 0x46, 0x3, 0xB5, 0xFF, 0xF7, 0xBF, 0xFF, 0xE, 0xBC, 0x42, 0x43,
+0x89, 0x1A, 0x18, 0x47, 0xC0, 0x46, 0x1, 0x4B, 0x18, 0x68, 0x70, 0x47, 0xC0, 0x46, 0x80, 0x66, 0x0, 0x2, 0x30, 0xB5, 0xB, 0x1C, 0x3, 0x43, 0x9A, 0x7, 0x1C, 0xD1, 0x2, 0x68, 0xB, 0x68, 0x9A, 0x42, 0x18,
+0xD1, 0x10, 0x4C, 0x13, 0x19, 0x93, 0x43, 0xF, 0x4A, 0x13, 0x42, 0xB, 0xD1, 0x14, 0x1C, 0x4, 0x30, 0x4, 0x31, 0x2, 0x68, 0xB, 0x68, 0x9A, 0x42, 0xB, 0xD1, 0x9, 0x4D, 0x53, 0x19, 0x93, 0x43, 0x23, 0x42,
+0xF4, 0xD0, 0x0, 0x20, 0x9, 0xE0, 0xA, 0x78, 0x9A, 0x42, 0x5, 0xD1, 0x1, 0x30, 0x1, 0x31, 0x3, 0x78, 0x0, 0x2B, 0xF7, 0xD1, 0xA, 0x78, 0x98, 0x1A, 0x30, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xFF, 0xFE, 0xFE, 0xFE,
+0x80, 0x80, 0x80, 0x80, 0x30, 0xB5, 0x4, 0x1C, 0x81, 0x7, 0x12, 0xD1, 0x22, 0x68, 0xC, 0x4D, 0x53, 0x19, 0x93, 0x43, 0xB, 0x4A, 0x13, 0x42, 0xB, 0xD1, 0x11, 0x1C, 0x4, 0x30, 0x2, 0x68, 0x7, 0x4D, 0x53,
+0x19, 0x93, 0x43, 0xB, 0x42, 0xF8, 0xD0, 0x3, 0x78, 0x0, 0x2B, 0x3, 0xD0, 0x1, 0x30, 0x3, 0x78, 0x0, 0x2B, 0xFB, 0xD1, 0x0, 0x1B, 0x30, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xFF, 0xFE, 0xFE, 0xFE, 0x80, 0x80,
+0x80, 0x80, 0x70, 0xB5, 0x4, 0x1C, 0x0, 0x2A, 0x41, 0xD0, 0xB, 0x1C, 0x3, 0x43, 0x98, 0x7, 0x2C, 0xD1, 0x20, 0x1C, 0xD, 0x1C, 0x3, 0x2A, 0x26, 0xD9, 0x24, 0x68, 0xB, 0x68, 0x9C, 0x42, 0x22, 0xD1, 0x4,
+0x3A, 0x0, 0x2A, 0x32, 0xD0, 0x1B, 0x49, 0x63, 0x18, 0x1B, 0x49, 0xA3, 0x43, 0xB, 0x42, 0x2C, 0xD1, 0xC, 0x1C, 0xB, 0xE0, 0x1, 0x68, 0x2B, 0x68, 0x99, 0x42, 0x13, 0xD1, 0x4, 0x3A, 0x0, 0x2A, 0x23, 0xD0,
+0x13, 0x4E, 0x8B, 0x19, 0x8B, 0x43, 0x23, 0x42, 0x1E, 0xD1, 0x4, 0x30, 0x4, 0x35, 0x3, 0x2A, 0xEF, 0xD8, 0x4, 0x1C, 0x29, 0x1C, 0x0, 0x2A, 0x5, 0xD1, 0x3, 0x78, 0x28, 0x78, 0x18, 0x1A, 0x13, 0xE0, 0x4,
+0x1C, 0x29, 0x1C, 0x23, 0x78, 0x8, 0x78, 0x1, 0x3A, 0x98, 0x42, 0x9, 0xD0, 0xF5, 0xE7, 0x0, 0x28, 0x8, 0xD0, 0x1, 0x34, 0x1, 0x31, 0x23, 0x78, 0x8, 0x78, 0x98, 0x42, 0xED, 0xD1, 0x1, 0x3A, 0x0, 0x2A,
+0xF4, 0xD1, 0x0, 0x20, 0x70, 0xBC, 0x2, 0xBC, 0x8, 0x47, 0xFF, 0xFE, 0xFE, 0xFE, 0x80, 0x80, 0x80, 0x80, 0xF8, 0xB5, 0xC0, 0x46, 0xF8, 0xBC, 0x8, 0xBC, 0x9E, 0x46, 0x70, 0x47, 0x10, 0xC0, 0x3A, 0x0, 0x3C,
+0x0, 0x0, 0xF0, 0x1, 0xF0, 0x1, 0xF0, 0x1, 0x50, 0x9, 0xC, 0xC, 0xF7, 0xF0, 0x1, 0xF0, 0x1, 0xF0, 0x1, 0xB0, 0x3, 0x3, 0xF0, 0xA, 0x50, 0x14, 0x20, 0x1A, 0xFF, 0x10, 0x1F, 0x90, 0x18, 0x70, 0xF, 0xF0,
+0x15, 0x70, 0x2F, 0xA0, 0x4A, 0x40, 0x62, 0x70, 0x19, 0xFF, 0x60, 0x58, 0x60, 0x3D, 0xB0, 0x31, 0xF0, 0xF, 0x90, 0x51, 0xD0, 0x20, 0x30, 0x61, 0xF0, 0x2F, 0xFF, 0xF0, 0xF, 0xF0, 0x10, 0x70, 0xA2, 0xF0,
+0x2F, 0xF0, 0xF, 0xF0, 0x10, 0xD1, 0x42, 0xF0, 0x1E, 0xFF, 0xF0, 0xF, 0xF0, 0x10, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x39, 0x90, 0x1E, 0xF1, 0x5F, 0xFF, 0xF0, 0x3F, 0xF0, 0x1, 0xA0, 0x41, 0xF0,
+0x2E, 0xF0, 0x10, 0xF0, 0x1, 0xF1, 0x9F, 0xF0, 0x3F, 0xFF, 0xF1, 0xBF, 0xF0, 0x1F, 0xF0, 0x3F, 0xF0, 0x10, 0xF1, 0x7F, 0xF0, 0x1F, 0xF0, 0x3F, 0xF0, 0xBF, 0xFF, 0xF2, 0x40, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0,
+0x3D, 0xF0, 0x1F, 0xF0, 0xE, 0x43, 0x2E, 0xF1, 0x3E, 0xFF, 0xF0, 0x3F, 0xF0, 0xE, 0xF0, 0xF, 0xF0, 0x81, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0xCF, 0xF0, 0x20, 0xFF, 0xF0, 0xE, 0xF0, 0xF, 0xF1, 0xC0, 0xF0, 0x20,
+0xF0, 0x3F, 0xF0, 0xBF, 0xF0, 0xFF, 0xF0, 0x9E, 0xFF, 0xF0, 0xF, 0xF0, 0xFE, 0xF0, 0x1F, 0xF0, 0xF, 0xF0, 0xBF, 0xF0, 0x7E, 0xF0, 0x2F, 0xF0, 0xF, 0xFF, 0xF0, 0xFF, 0xF0, 0x1F, 0xF0, 0xF, 0xF0, 0xF, 0xF1,
+0x2F, 0xF0, 0x2F, 0xD0, 0xF, 0xF0, 0x20, 0xFF, 0xB0, 0x3F, 0xE5, 0x68, 0xF5, 0xA2, 0xC5, 0xED, 0xD1, 0xF, 0xE5, 0xB4, 0x95, 0xC4, 0x75, 0xD7, 0xFF, 0x70, 0x5C, 0x74, 0x76, 0x60, 0xAE, 0x34, 0x87, 0x60,
+0x1B, 0x60, 0xC8, 0x0, 0x12, 0x6, 0x48, 0xFF, 0xC0, 0x9C, 0x20, 0x14, 0x40, 0x17, 0x70, 0x5C, 0x50, 0x7F, 0xE0, 0x1, 0xF1, 0x3F, 0x80, 0x7B, 0xEF, 0x91, 0x22, 0x40, 0x6B, 0x60, 0x4F, 0x3, 0x10, 0x7D,
+0xF1, 0x7F, 0x90, 0x3C, 0xB0, 0x7F, 0xFF, 0x60, 0x70, 0xB0, 0x25, 0xD1, 0x7F, 0x90, 0x18, 0xA0, 0xC2, 0x40, 0x7F, 0x50, 0xDF, 0x60, 0xF, 0xFF, 0xF0, 0x7E, 0x80, 0xAB, 0x81, 0x1D, 0x40, 0x2D, 0x80, 0x57,
+0xB0, 0xC0, 0xF0, 0xFE, 0x80, 0x6B, 0xFF, 0xF0, 0x3D, 0x70, 0xF, 0xC2, 0x3E, 0xC1, 0x9E, 0x77, 0xBE, 0xF0, 0x40, 0xF0, 0xBF, 0xC1, 0xDC, 0xFF, 0x61, 0xCD, 0xF0, 0x81, 0xF0, 0xBF, 0xD1, 0x40, 0xF0, 0x3D,
+0xF0, 0x3D, 0xF0, 0xBF, 0xD1, 0xFA, 0xFF, 0xF0, 0x40, 0xF0, 0x40, 0xF1, 0x7F, 0xB2, 0x7, 0x62, 0x91, 0xF1, 0xA1, 0xF0, 0x7F, 0x81, 0x7C, 0xFF, 0x73, 0x0, 0x61, 0x4D, 0xF2, 0x48, 0xF0, 0x3F, 0x93, 0xDB,
+0xE2, 0x7F, 0xF0, 0x3F, 0xF0, 0xFF, 0xFF, 0x93, 0x6F, 0x91, 0x6D, 0xF0, 0x3F, 0xF0, 0x3F, 0xA3, 0xC6, 0x73, 0x30, 0xF0, 0x3F, 0xF0, 0x3F, 0xFF, 0xC3, 0x72, 0xC0, 0x81, 0xF0, 0x3F, 0xF0, 0x3F, 0xA2, 0x41,
+0xC4, 0xC1, 0xF0, 0x3F, 0xF0, 0x3F, 0xFF, 0xB1, 0xE0, 0x54, 0x74, 0xF0, 0xBF, 0xF0, 0x3F, 0x93, 0xB7, 0xF2, 0x3F, 0xF0, 0x34, 0xA1, 0x1F, 0xFF, 0xF0, 0xC0, 0x93, 0x0, 0xB3, 0xFE, 0xF2, 0x7E, 0xE0, 0x7F,
+0xA0, 0xBF, 0xF2, 0xBF, 0xF0, 0x40, 0xFF, 0x6B, 0x7E, 0xA0, 0xAE, 0x82, 0x2, 0x81, 0x1, 0x82, 0x17, 0xB5, 0x40, 0xB4, 0x2F, 0x61, 0x32, 0xFF, 0x7C, 0x4, 0xF0, 0x80, 0x92, 0x1F, 0x66, 0x8F, 0x56, 0x3,
+0xF2, 0xBE, 0xD5, 0xB9, 0xB6, 0x20, 0xFF, 0xB1, 0xF2, 0xD5, 0x7F, 0x86, 0x4F, 0xC1, 0xA5, 0xE5, 0x8E, 0x5, 0xD9, 0x55, 0xDB, 0x46, 0x79, 0xFF, 0x62, 0x1A, 0x30, 0x19, 0x61, 0x9, 0x50, 0xF, 0xA1, 0x4E,
+0x56, 0x18, 0xE0, 0xED, 0x70, 0x30, 0xFF, 0xA0, 0x27, 0xC6, 0x4F, 0xC0, 0x3D, 0xF0, 0x40, 0xD0, 0x27, 0x96, 0x37, 0x30, 0xA3, 0x70, 0xC7, 0xFF, 0x70, 0xAB, 0x60, 0xC5, 0x90, 0x22, 0xA0, 0xC0, 0x86, 0x5F,
+0xF0, 0x7F, 0x90, 0x7F, 0x76, 0x1D, 0xFF, 0x41, 0x10, 0xC2, 0x50, 0xF0, 0x40, 0x57, 0x30, 0xF0, 0xFF, 0x87, 0xED, 0x72, 0x1D, 0xF0, 0x3D, 0xFF, 0xA0, 0xFE, 0xD0, 0xFF, 0xF0, 0x7E, 0xF0, 0x40, 0x81, 0x3F,
+0xD0, 0x28, 0xF0, 0xBF, 0xF0, 0x40, 0xFF, 0xF0, 0xBF, 0xA1, 0xF1, 0x82, 0xBB, 0x81, 0x69, 0x80, 0x10, 0x61, 0x96, 0xB0, 0x47, 0xF4, 0xC, 0xFF, 0x80, 0x9, 0xA8, 0xE6, 0x90, 0x47, 0xB2, 0x9F, 0xF1, 0x41,
+0xF0, 0xBE, 0xD1, 0xBF, 0xF0, 0xBF, 0xFF, 0xF0, 0x3D, 0xF0, 0xFF, 0xF1, 0x7F, 0xA2, 0x7F, 0xF0, 0x37, 0xF0, 0x7E, 0xF1, 0x7F, 0xF0, 0xE7, 0xFF, 0xF0, 0x40, 0xF0, 0x40, 0x81, 0x25, 0x94, 0xF, 0x72, 0xE1,
+0xF0, 0x40, 0x93, 0xAF, 0xF1, 0x86, 0xFF, 0xF3, 0xC1, 0xE5, 0xB0, 0xB0, 0x3F, 0x94, 0xD, 0xF2, 0xBF, 0xD1, 0x20, 0xF3, 0xBF, 0xF2, 0xBF, 0xFF, 0xF0, 0x36, 0xD2, 0x59, 0xF1, 0x3C, 0xF5, 0x8F, 0xC4, 0xA1,
+0x8A, 0x2F, 0xF3, 0xBF, 0xC0, 0xE, 0xFF, 0xA2, 0x7D, 0xE1, 0x3D, 0x54, 0xEF, 0xF0, 0xA7, 0xD4, 0x7F, 0xA3, 0x15, 0xD4, 0x76, 0xB4, 0x86, 0xEF, 0xA0, 0x3, 0xF0, 0x11, 0xD0, 0x22, 0x8, 0x0, 0x1, 0xA0, 0xE,
+0x50, 0x4, 0xF0, 0x1, 0xFF, 0xF0, 0x1, 0x40, 0x3F, 0x80, 0x41, 0xF0, 0x3A, 0xF0, 0x1, 0xB0, 0x6E, 0xF0, 0x80, 0xF0, 0x43, 0xFF, 0xF0, 0x1, 0xE0, 0x6D, 0x30, 0x37, 0xF0, 0x3A, 0xF0, 0x1, 0xF0, 0x41, 0xF0,
+0x47, 0xF0, 0x1, 0xFF, 0xF0, 0x1, 0xE1, 0x3E, 0xF0, 0x3A, 0xF0, 0x1, 0xF0, 0x3F, 0x11, 0x0, 0xF0, 0x7F, 0xF0, 0x1, 0xFF, 0xF0, 0x1, 0xA1, 0x6E, 0xF0, 0xFF, 0xF0, 0x1, 0xF0, 0x1, 0x21, 0x7C, 0x81, 0x3,
+0xF0, 0x3F, 0xFF, 0xF0, 0x1, 0xF0, 0x3E, 0x92, 0x41, 0xF0, 0x84, 0xF0, 0x1, 0xF0, 0x1, 0xF0, 0xBF, 0xF0, 0x1, 0xFF, 0xF0, 0x1, 0x52, 0x7D, 0xF1, 0x5, 0xF0, 0x29, 0xF0, 0x1, 0xF2, 0xBD, 0xF0, 0x3D, 0xF0,
+0x1, 0xFF, 0xF0, 0x1, 0xF3, 0x46, 0xF3, 0xA, 0x71, 0x5C, 0x62, 0x70, 0x40, 0x69, 0x43, 0x1, 0x60, 0xD, 0xFF, 0x73, 0x4F, 0xA3, 0x55, 0x40, 0x2A, 0xA2, 0xB1, 0x60, 0xAE, 0x12, 0x3F, 0x50, 0xBB, 0xD1, 0x11,
+0xDF, 0xF1, 0x28, 0xB3, 0x7A, 0x5, 0x90, 0x4B, 0xF0, 0x3F, 0xF0, 0x3F, 0xC3, 0xBA, 0x90, 0xC6, 0xFF, 0xF0, 0x26, 0xF0, 0x3D, 0xB2, 0x26, 0xF0, 0xBF, 0xF0, 0x3F, 0xF0, 0x3F, 0xD1, 0x3E, 0xF0, 0xFD, 0xFF,
+0x71, 0x2E, 0xE3, 0xE7, 0xC1, 0x4B, 0x44, 0x7E, 0xA1, 0x8A, 0x3, 0x8F, 0x61, 0x93, 0x24, 0xDF, 0x7F, 0x5, 0x11, 0x28, 0x13, 0xA7, 0x30, 0x19, 0x30, 0x23, 0x80, 0x27, 0x10, 0x18, 0x20, 0x3, 0xFF, 0xA0,
+0x82, 0xC0, 0x91, 0x20, 0xE5, 0x50, 0x2D, 0xF0, 0x3F, 0xF0, 0x3F, 0xC0, 0x8F, 0x90, 0x7A, 0xF3, 0xF0, 0x3F, 0xF0, 0x3F, 0xC1, 0x11, 0x70, 0xCF, 0x8, 0x5, 0x80, 0x3B, 0xA0, 0x3C, 0xE3, 0xC0, 0x4D, 0xF0,
+0x1, 0xF0, 0x1, 0x8, 0x8, 0x1, 0x80, 0x5, 0xF0, 0x1, 0xFF, 0xF0, 0x1, 0xC0, 0x3A, 0x0, 0x3E, 0x80, 0x3B, 0xF0, 0x46, 0xF0, 0x1, 0xD0, 0x7D, 0x70, 0x33, 0xFF, 0xF0, 0x3D, 0xF0, 0x1, 0xF0, 0x40, 0xF0, 0x40,
+0xF0, 0x1, 0xF0, 0x1, 0xF0, 0x33, 0xF0, 0x40, 0xFF, 0xF0, 0x1, 0xF0, 0x3A, 0xF0, 0x40, 0xF0, 0x1, 0xF0, 0x1, 0xF0, 0xBD, 0xF0, 0x1, 0xF0, 0x1, 0xFB, 0xF0, 0x1, 0xF0, 0x47, 0x81, 0x98, 0x41, 0x9E, 0x2,
+0xF6, 0xA, 0x20, 0x2, 0x10, 0x11, 0xF1, 0x0, 0x15, 0x0, 0xC, 0x20, 0x11, 0x10, 0x16, 0x1, 0x8, 0xA, 0x0, 0x2, 0xFF, 0x30, 0x2B, 0x40, 0x1E, 0x30, 0x37, 0x91, 0xDC, 0x20, 0x3A, 0x40, 0x50, 0x10, 0x3D,
+0x10, 0x31, 0xFF, 0xF0, 0x3D, 0x1, 0xE, 0x30, 0x3D, 0x50, 0x7C, 0xA2, 0x16, 0x30, 0x65, 0x70, 0x4A, 0x30, 0x57, 0xFF, 0x20, 0x80, 0x50, 0x97, 0x0, 0x7A, 0x20, 0x89, 0x20, 0x9F, 0x40, 0x8A, 0x71, 0x69,
+0x70, 0x66, 0xFF, 0x10, 0xBF, 0x40, 0x92, 0xF0, 0x3F, 0x50, 0xDF, 0x60, 0x94, 0x40, 0xFE, 0x60, 0x81, 0x30, 0xA7, 0xFF, 0x41, 0x11, 0xF0, 0x3F, 0x21, 0x1F, 0x21, 0xD7, 0x90, 0x40, 0x21, 0x4, 0x30, 0x70,
+0xF0, 0xBF, 0xFF, 0xF0, 0x3F, 0x50, 0x40, 0x51, 0x67, 0x51, 0x5E, 0xF0, 0xBF, 0xF0, 0x3F, 0x30, 0x7F, 0x70, 0x40, 0xFF, 0x40, 0x45, 0x41, 0x61, 0xF0, 0xBF, 0xF0, 0x3F, 0x41, 0xE9, 0x82, 0xA4, 0x30, 0x26,
+0xF1, 0x7F, 0xFE, 0xF0, 0x3F, 0x70, 0x7F, 0xA3, 0x54, 0x81, 0x3B, 0xF0, 0xBF, 0xF0, 0x3F, 0xC1, 0xFE, 0xA, 0xFF, 0x60, 0x51, 0xF0, 0xBF, 0xF0, 0x3F, 0x22, 0x9F, 0xF2, 0x3F, 0x20, 0xAD, 0xF0, 0xBF, 0xF0,
+0x3F, 0xFF, 0xF2, 0x3F, 0xF2, 0x80, 0x54, 0xB5, 0xD0, 0x3F, 0x73, 0x1F, 0xF3, 0x3, 0x81, 0x0, 0x20, 0x8A, 0xFF, 0x41, 0x17, 0x3, 0x4E, 0x73, 0x1F, 0x3, 0x50, 0x30, 0x43, 0x23, 0x56, 0x40, 0x8F, 0x30,
+0x59, 0xFF, 0x20, 0x2, 0x70, 0xA8, 0x20, 0x1, 0x10, 0x2, 0xF0, 0x1, 0x3, 0x81, 0x20, 0x3D, 0x70, 0xD9, 0xFF, 0x70, 0x18, 0x50, 0x5C, 0x40, 0x3F, 0xF0, 0x1, 0x50, 0x67, 0x3, 0xD6, 0xE0, 0x7D, 0xF0, 0x3F,
+0xFF, 0xF0, 0x1, 0x60, 0x80, 0x44, 0x9, 0x11, 0x63, 0x70, 0x28, 0x60, 0x3F, 0x50, 0xD0, 0xF0, 0x47, 0xFF, 0x40, 0xE7, 0x61, 0xA1, 0x70, 0x1E, 0x34, 0x5A, 0x20, 0x9B, 0xA0, 0x3D, 0xF0, 0x3F, 0x70, 0x8,
+0x63, 0x6, 0x40, 0x3, 0xA0, 0x10, 0x1, 0x1, 0x9, 0x20, 0x3, 0x30, 0x5, 0xBF, 0x40, 0x26, 0x9, 0x30, 0x4, 0x0, 0x19, 0x30, 0x12, 0x90, 0x2E, 0x60, 0x4B, 0x80, 0x1A, 0xDF, 0x90, 0x2A, 0x0, 0x65, 0x6, 0x20,
+0x40, 0x30, 0x3D, 0x90, 0x40, 0xB0, 0x8C, 0x20, 0x21, 0xFF, 0x40, 0x74, 0xF0, 0x40, 0x30, 0x98, 0xF0, 0x3D, 0xA0, 0xCF, 0x90, 0x40, 0x50, 0xBF, 0x10, 0x58, 0xFF, 0x10, 0x81, 0xF0, 0x7E, 0xE0, 0xC5, 0x40,
+0xA3, 0xF0, 0x40, 0x50, 0xDF, 0xF0, 0x40, 0xF0, 0x40, 0xFF, 0x50, 0x40, 0x51, 0x4B, 0x11, 0x3B, 0x90, 0x40, 0xF0, 0x1, 0xB0, 0x40, 0x11, 0x7A, 0xF0, 0x40, 0xFF, 0xF0, 0x7E, 0xF0, 0x40, 0x61, 0xAC, 0xA0,
+0x40, 0x31, 0x7C, 0xF0, 0x40, 0xD2, 0x9, 0x71, 0xAE, 0xFF, 0xB0, 0x81, 0x41, 0xBD, 0xF0, 0xBF, 0xF0, 0x40, 0x91, 0xFE, 0x11, 0x6F, 0xA0, 0x40, 0xF0, 0x7E, 0xFF, 0xF1, 0xFE, 0xF2, 0x3F, 0xF2, 0x3F, 0xF0,
+0x39, 0x62, 0xC6, 0x22, 0xCC, 0x92, 0xBA, 0xF1, 0xBF, 0xFF, 0x90, 0x5, 0x41, 0x69, 0x70, 0xB, 0x11, 0x7B, 0x1, 0x2F, 0x41, 0xEE, 0x0, 0xE, 0x10, 0x3, 0xFF, 0x22, 0x99, 0x2, 0x9D, 0x50, 0xF, 0xB0, 0x3D,
+0x70, 0x7, 0x21, 0xB9, 0x3, 0x37, 0x32, 0x2C, 0xFF, 0x12, 0x70, 0xF0, 0x3F, 0x20, 0xF, 0x40, 0xC7, 0xF0, 0x41, 0x30, 0x40, 0x42, 0x6D, 0x70, 0x2F, 0xFF, 0xD0, 0x3F, 0xC0, 0xBF, 0xB0, 0x3D, 0x70, 0x40,
+0xF0, 0x3F, 0xF0, 0xBF, 0xF0, 0xBF, 0x43, 0x27, 0xDF, 0x3, 0xF0, 0x0, 0x30, 0x6, 0x12, 0x3C, 0x3, 0xFB, 0x31, 0x16, 0x50, 0xDF, 0x40, 0x1, 0xEF, 0x50, 0x5F, 0xD0, 0xF, 0xC0, 0x2, 0xB, 0x20, 0x2, 0x80,
+0xD, 0xF0, 0x3F, 0xF0, 0x3F, 0xCF, 0xF0, 0x44, 0x50, 0x4, 0x9, 0xB, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x3D, 0xF0, 0x7F, 0xFF, 0xF0, 0x3F, 0xF0, 0x1, 0x80, 0x76, 0x60, 0x86, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x79,
+0x21, 0x9, 0xB7, 0x10, 0x88, 0xB, 0x41, 0x10, 0x1, 0x17, 0x2, 0x20, 0x1, 0x10, 0x2, 0x2, 0x79, 0x37, 0x2, 0xB, 0x40, 0x2, 0x41, 0x31, 0xB, 0x0, 0x1D, 0x20, 0x2, 0x40, 0x22, 0xFF, 0x30, 0xC, 0x10, 0xF,
+0x51, 0x10, 0x10, 0x31, 0x60, 0x3D, 0x20, 0x40, 0x0, 0x5B, 0x10, 0x5E, 0xFF, 0xD0, 0x30, 0x40, 0x43, 0x60, 0x60, 0x31, 0x10, 0x30, 0x7B, 0x20, 0x7C, 0x30, 0x81, 0x30, 0x3D, 0xFF, 0x0, 0x77, 0xF0, 0x40,
+0x90, 0x40, 0x51, 0x87, 0x40, 0x93, 0x80, 0xBF, 0xF0, 0x7E, 0xF0, 0x3D, 0xFF, 0x41, 0x8B, 0x20, 0xBF, 0x90, 0xFD, 0x60, 0x7E, 0xF0, 0x40, 0xF0, 0x40, 0x40, 0xFF, 0x31, 0x43, 0xFF, 0x50, 0x2F, 0x11, 0x5E,
+0x40, 0x12, 0x20, 0xA5, 0x31, 0x5D, 0x30, 0x1F, 0x21, 0x69, 0x1, 0x60, 0xFF, 0x20, 0x5, 0x1, 0x59, 0x21, 0x5C, 0x31, 0x60, 0x40, 0xF7, 0x0, 0x1, 0x0, 0x11, 0x20, 0x2, 0xFF, 0x20, 0xC, 0x80, 0xE, 0x40,
+0x1, 0x50, 0x1E, 0x51, 0x97, 0x50, 0x5F, 0x40, 0x2E, 0xD0, 0x3E, 0xFF, 0xF0, 0x3F, 0xC0, 0x40, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x3F, 0x70, 0x7E, 0xF0, 0x3F, 0xF0, 0x3F, 0xFF, 0xF0, 0x3F, 0x40, 0xF6, 0x31,
+0xB, 0x21, 0x4, 0x20, 0x3C, 0x2, 0x96, 0xF0, 0x3F, 0xF0, 0x3F, 0xDE, 0xF0, 0xF, 0x80, 0xD6, 0xD, 0x0, 0x1, 0x10, 0x2, 0x70, 0xD, 0x20, 0x11, 0x2, 0x7E, 0x4, 0x50, 0x2, 0x30, 0x1E, 0xF0, 0x3F, 0xC0, 0x2F,
+0xF0, 0x40, 0x80, 0x40, 0x4, 0xF3, 0xF0, 0x3F, 0xF0, 0x31, 0xA0, 0x40, 0xB0, 0x3D, 0x2, 0xD, 0xD1, 0xF, 0xF0, 0x72, 0xFF, 0xB0, 0xE, 0x70, 0xBF, 0x30, 0xC2, 0xE1, 0x4F, 0xC0, 0x40, 0x51, 0x3, 0x21, 0xC,
+0xB0, 0x40, 0xFF, 0xF0, 0xBF, 0x80, 0x40, 0x21, 0x39, 0xF0, 0x40, 0xC0, 0x3D, 0xF0, 0xBF, 0xD0, 0x40, 0x50, 0x92, 0xFF, 0x41, 0x8E, 0x80, 0x40, 0xF0, 0xBF, 0x90, 0xC2, 0x41, 0x7C, 0xE0, 0x40, 0xF0, 0xBF,
+0xF0, 0x3F, 0xFF, 0x90, 0x40, 0xC1, 0xBD, 0xF1, 0x7F, 0xF0, 0x3F, 0xF1, 0x7A, 0xF1, 0xFE, 0x70, 0x81, 0x11, 0x12, 0x7F, 0x4, 0x30, 0x8B, 0x21, 0x1F, 0x31, 0x24, 0x0, 0x13, 0x0, 0x16, 0x10, 0xE, 0x30,
+0x9, 0xFF, 0x50, 0xD, 0x20, 0x81, 0x20, 0x1A, 0x50, 0x10, 0x30, 0x3D, 0x0, 0x2D, 0x41, 0x5D, 0x40, 0x4F, 0xFF, 0x30, 0x1B, 0x10, 0xE2, 0x40, 0x40, 0x40, 0x10, 0x40, 0x4E, 0x2, 0xDF, 0x2, 0xE0, 0x31, 0x90,
+0xFF, 0x20, 0x81, 0x50, 0xA, 0x60, 0x4F, 0xD0, 0x2F, 0x40, 0x6D, 0x70, 0x4E, 0x30, 0x40, 0x80, 0x6F, 0xFF, 0x52, 0x5F, 0x40, 0xBF, 0xD0, 0x2F, 0xB0, 0x8F, 0x40, 0x7E, 0x50, 0xED, 0xF0, 0x3F, 0xF0, 0x3F,
+0xFF, 0xF0, 0xCF, 0x71, 0x3D, 0x1, 0x97, 0xF0, 0xFF, 0xF0, 0x2F, 0x51, 0x58, 0x70, 0x3D, 0x1, 0x60, 0xFC, 0x10, 0x1, 0x1, 0x60, 0x20, 0x3, 0x30, 0xD, 0xF0, 0xF, 0xF0, 0xF, 0x4, 0xE, 0xFF, 0x20, 0x1, 0xF0,
+0x19, 0xF0, 0xF, 0xF0, 0xF, 0x50, 0x3D, 0xF0, 0x3F, 0xF0, 0xF, 0xF0, 0xF, 0xF7, 0x80, 0x7D, 0x50, 0x40, 0xF0, 0x2D, 0xC0, 0xF, 0xE, 0x0, 0x1F, 0x0, 0x3, 0x80, 0x70, 0xFF, 0x50, 0x7C, 0x10, 0x34, 0x0,
+0x38, 0x30, 0x2, 0xF0, 0xF, 0x40, 0xF, 0x0, 0x3A, 0x80, 0x5F, 0xFF, 0x0, 0x68, 0x10, 0xBA, 0x0, 0xC2, 0xF0, 0x78, 0xF0, 0xF, 0xF0, 0xF, 0x20, 0x3F, 0x20, 0xBE, 0xF7, 0x71, 0x1, 0xD1, 0x11, 0x30, 0xDD,
+0xE0, 0x2, 0x7, 0x0, 0x1, 0x1, 0x3A, 0x11, 0x3D, 0xFF, 0x10, 0xA, 0xF0, 0x3D, 0xF0, 0x3D, 0x90, 0x5, 0x51, 0x78, 0x10, 0x46, 0xF0, 0x3F, 0x81, 0x8F, 0xFF, 0xF0, 0x3A, 0x50, 0xB, 0xF0, 0x3F, 0xF0, 0x3F,
+0xF0, 0x40, 0xA0, 0x3D, 0xC0, 0x3F, 0x71, 0x9, 0xFF, 0x32, 0x10, 0xB0, 0xAD, 0x41, 0xE5, 0x61, 0xF1, 0xB0, 0x3F, 0xC0, 0x25, 0x51, 0x98, 0x70, 0x9, 0xFF, 0x60, 0x33, 0x50, 0x61, 0x20, 0xBA, 0x21, 0x44,
+0x80, 0x73, 0xD0, 0x46, 0x40, 0x76, 0xF0, 0x2, 0xFF, 0x30, 0xF8, 0x21, 0x7F, 0xF1, 0xBD, 0xF0, 0xFF, 0xD1, 0x7E, 0x50, 0x3F, 0x60, 0x7F, 0x40, 0x88, 0xF3, 0x21, 0x52, 0x1, 0x55, 0x11, 0x52, 0x10, 0x5,
+0xE, 0xE, 0x30, 0x1, 0x51, 0x67, 0x3F, 0x7, 0xE, 0x30, 0x1, 0x10, 0xB9, 0x20, 0x2, 0x2, 0x9, 0x20, 0x2, 0x43, 0x48, 0xFF, 0x30, 0x3D, 0x70, 0x40, 0xF0, 0x3F, 0x40, 0x41, 0x40, 0x40, 0x40, 0x3D, 0x51,
+0x6, 0x50, 0x7E, 0xFF, 0x60, 0x81, 0xF0, 0x3F, 0x40, 0x81, 0xC0, 0x7E, 0xF0, 0x3D, 0xF0, 0xBF, 0xF0, 0xBF, 0xF0, 0xBF, 0xFF, 0x30, 0x3D, 0x12, 0x4F, 0x21, 0xD3, 0x50, 0x3C, 0x52, 0x67, 0xF0, 0x3D, 0x50,
+0xBF, 0x50, 0x20, 0xFF, 0x41, 0x45, 0x20, 0x2B, 0x81, 0x17, 0x70, 0x39, 0x41, 0xF7, 0xC0, 0xF, 0xB1, 0xD0, 0xF0, 0x3F, 0xFF, 0xF0, 0x3F, 0xB0, 0xF, 0x61, 0x16, 0x21, 0x1B, 0x10, 0x5E, 0x10, 0x5, 0xF0,
+0x1, 0xA0, 0x4, 0x7F, 0x0, 0x70, 0x12, 0x61, 0x56, 0xF0, 0x1, 0xF0, 0x1, 0x40, 0x3A, 0x0, 0x3E, 0x60, 0x41, 0xFF, 0xF0, 0x3F, 0xF0, 0x1, 0xF0, 0x44, 0x70, 0x83, 0xF0, 0x3F, 0xF0, 0x1, 0xF0, 0xBA, 0x70,
+0x40, 0xFF, 0xF0, 0x3F, 0xF0, 0x1, 0xF0, 0x40, 0x70, 0x81, 0xF0, 0x3F, 0xF0, 0x1, 0xF0, 0x40, 0x71, 0x46, 0xFF, 0xF0, 0x3F, 0xF0, 0x1, 0xC0, 0x3D, 0xA0, 0x40, 0xF0, 0x3F, 0xF0, 0x1, 0xF0, 0x40, 0x70,
+0x8B, 0xFF, 0xF0, 0x3F, 0xF0, 0x1, 0xF0, 0x40, 0x70, 0xCC, 0xF0, 0x3F, 0xF0, 0x1, 0xF0, 0x40, 0x72, 0x40, 0xE7, 0xF0, 0x3F, 0xF0, 0x1, 0xF0, 0x40, 0x7, 0x0, 0x52, 0x82, 0xF0, 0x3F, 0xF0, 0x1, 0xBF, 0xF0,
+0x1, 0x0, 0x62, 0xC2, 0xF0, 0x3F, 0xF0, 0x1, 0xF1, 0xBE, 0x72, 0xCA, 0xF0, 0x3F, 0xFF, 0xF0, 0x1, 0xF0, 0x3F, 0x80, 0xFF, 0x70, 0x40, 0x4, 0x23, 0xE0, 0x47, 0xF0, 0x58, 0xB2, 0x1, 0xFF, 0xC0, 0xD2, 0x72,
+0xDD, 0x70, 0x67, 0x40, 0x18, 0x40, 0x4, 0x33, 0x7B, 0x90, 0x5, 0x90, 0x91, 0xFF, 0x40, 0x9C, 0x73, 0x5F, 0xB0, 0x2E, 0x90, 0x40, 0x40, 0x4C, 0xC3, 0x8E, 0xF0, 0x40, 0xC0, 0x40, 0xFF, 0xE0, 0x4C, 0xC3,
+0xCF, 0x51, 0x9E, 0x90, 0xCC, 0x31, 0xEF, 0x30, 0xC5, 0xF0, 0x8D, 0x51, 0xCF, 0xFF, 0xB0, 0x40, 0xA1, 0xD, 0x81, 0x6, 0xD0, 0xCE, 0x82, 0x10, 0x91, 0x99, 0xF0, 0x2B, 0xF0, 0x40, 0xFF, 0xC0, 0x74, 0xB0,
+0x40, 0xF0, 0xFA, 0xF0, 0x40, 0xF0, 0x40, 0x92, 0x99, 0xF0, 0x2B, 0x90, 0x40, 0xFF, 0x91, 0xD0, 0xF0, 0x40, 0xF0, 0x40, 0xD0, 0x81, 0x72, 0x2F, 0xF0, 0x40, 0xF1, 0xBD, 0xF0, 0x40, 0xFF, 0x70, 0xCE, 0xB1,
+0x3, 0xF1, 0xFE, 0xF0, 0x40, 0xD1, 0xBD, 0xD0, 0x34, 0x92, 0xC0, 0xB2, 0x36, 0xFF, 0xF2, 0x3F, 0xE0, 0x7F, 0xB2, 0xA, 0x60, 0x3F, 0xF2, 0x3F, 0xF0, 0x83, 0xF1, 0x3F, 0xB3, 0x26, 0xFF, 0xA3, 0x42, 0xF0,
+0x87, 0x26, 0xDA, 0x80, 0xE4, 0x40, 0xEF, 0xD0, 0x11, 0x60, 0x2, 0xF2, 0x10, 0xFF, 0xB1, 0x24, 0xF0, 0x3D, 0xE0, 0x3D, 0x90, 0x87, 0xC0, 0xD4, 0xF0, 0x3F, 0x30, 0xF, 0x40, 0x81, 0xFF, 0xA0, 0x29, 0xC2,
+0x57, 0xF0, 0x3F, 0xC0, 0xCF, 0xE0, 0xBF, 0xF0, 0xFF, 0xF0, 0x3F, 0x90, 0x3D, 0xFF, 0x50, 0x4, 0x43, 0xD9, 0x80, 0x55, 0x70, 0xA7, 0x40, 0x2, 0xC0, 0x10, 0xF0, 0x1F, 0xD0, 0x2, 0xFF, 0xF0, 0x3F, 0xF0,
+0x3F, 0x80, 0x1F, 0xF0, 0x3D, 0xF0, 0x3F, 0xF0, 0x3F, 0xC0, 0x3E, 0x61, 0x57, 0xF0, 0x45, 0x64, 0xC0, 0x1C, 0x80, 0x10, 0xD0, 0x3F, 0x8, 0x8, 0x10, 0x0, 0x6, 0x0, 0x3C, 0x1, 0x0, 0xF0, 0x1, 0xF0, 0x1,
+0xF0, 0x1, 0x50, 0x9, 0x2, 0x0, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x1, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xA, 0x0, 0x5, 0xA2, 0x10, 0x1, 0xB, 0x0, 0x1, 0xC, 0x0, 0xD, 0x0, 0x7, 0xE, 0x0, 0x0, 0xF,
+0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x20, 0x0, 0x13, 0x0, 0x7, 0x10, 0x0, 0x14, 0x0, 0x15, 0x0, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x0, 0x1A, 0x0, 0x1B, 0x0, 0x1C, 0x0, 0x1D, 0x0, 0x0, 0x1E,
+0x0, 0x1F, 0x0, 0x20, 0x0, 0x21, 0x0, 0x0, 0x22, 0x0, 0x23, 0x0, 0x24, 0x0, 0x25, 0x0, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x0, 0x2A, 0x0, 0x2B, 0x0, 0x2C, 0x0, 0x2D, 0x0, 0x0, 0x2E, 0x0,
+0x2F, 0x0, 0x30, 0x0, 0x31, 0x80, 0xA0, 0x23, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x0, 0x3A, 0x0, 0x3B, 0x0, 0x3C, 0x0, 0x3D, 0x80, 0x40, 0x5,
+0x3E, 0x0, 0x3F, 0x0, 0x40, 0x0, 0x41, 0x0, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x2, 0x0, 0x46, 0x0, 0x47, 0x0, 0x48, 0xC0, 0x23, 0x49, 0x0, 0x0, 0x4A, 0x0, 0x4B, 0x0, 0x4C, 0x0, 0x4D, 0x0, 0x0,
+0x4E, 0x0, 0x4F, 0x0, 0x50, 0x0, 0x51, 0x22, 0x0, 0x52, 0x80, 0x3, 0x53, 0x0, 0x54, 0x40, 0xF, 0x4F, 0x30, 0x0, 0x55, 0x40, 0x7, 0x90, 0x23, 0x56, 0x0, 0x57, 0x0, 0x1, 0x58, 0x0, 0x59, 0x0, 0x5A, 0x0,
+0x5B, 0x0, 0x3, 0x70, 0x5C, 0xF0, 0x3, 0xF0, 0x17, 0xA0, 0x7, 0x5D, 0x0, 0x5E, 0x0, 0x1, 0x5F, 0x0, 0x60, 0x0, 0x61, 0x0, 0x62, 0xF0, 0x3, 0xE0, 0xF0, 0x3, 0xF0, 0x3, 0x0, 0xF, 0x63, 0x0, 0x64, 0x0, 0x65,
+0x0, 0x0, 0x66, 0x0, 0x67, 0x0, 0x68, 0x0, 0x69, 0x0, 0x0, 0x69, 0x4, 0x68, 0x4, 0x67, 0x4, 0x66, 0x38, 0x4, 0x6A, 0xF0, 0x11, 0xF0, 0x11, 0x20, 0x11, 0x6B, 0x0, 0x6C, 0x0, 0x0, 0x6D, 0x0, 0x6E, 0x0,
+0x6F, 0x0, 0x70, 0x0, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x74, 0xC, 0x0, 0x75, 0x0, 0x76, 0xF0, 0x11, 0xF0, 0x11, 0x0, 0x77, 0x0, 0x0, 0x78, 0x0, 0x79, 0x0, 0x7A, 0x0, 0x7B, 0x38, 0x0, 0x7C, 0xF0,
+0x1, 0xF0, 0x1, 0xF0, 0x1, 0x0, 0x7D, 0x0, 0x0, 0x7E, 0x0, 0x7F, 0x0, 0x80, 0x0, 0x81, 0x0, 0x0, 0x82, 0x0, 0x83, 0x0, 0x84, 0x0, 0x85, 0x0, 0x1, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, 0x89, 0xF0, 0x11, 0xC0,
+0xF0, 0x11, 0x20, 0x11, 0x8A, 0x0, 0x8B, 0x0, 0x8C, 0x0, 0x1C, 0x8D, 0x0, 0x8E, 0xF0, 0x5, 0xF0, 0x5, 0xF0, 0x5, 0x0, 0x8F, 0x0, 0x0, 0x90, 0x0, 0x91, 0x0, 0x92, 0x0, 0x93, 0xE0, 0xF0, 0x5, 0xF0, 0x5,
+0xF0, 0x5, 0x0, 0x94, 0x0, 0x95, 0x0, 0x1, 0x96, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0xF0, 0x5, 0xC0, 0xF0, 0x5, 0xE0, 0x5, 0x9A, 0x0, 0x9B, 0x0, 0x9C, 0x0, 0x1C, 0x9D, 0x0, 0x9E, 0xF0, 0x5, 0xF0, 0x5, 0xF0,
+0x5, 0x0, 0x9F, 0x0, 0x0, 0xA0, 0x0, 0xA1, 0x0, 0xA2, 0x0, 0xA3, 0x0, 0x0, 0xA4, 0x0, 0xA5, 0x0, 0xA6, 0x0, 0xA7, 0xE, 0x0, 0xA8, 0x0, 0xA9, 0xF0, 0x11, 0xF0, 0x11, 0x60, 0x11, 0xAA, 0x3, 0x0, 0xAB, 0x0,
+0xAC, 0x0, 0xAD, 0xF0, 0x5, 0xF0, 0x5, 0x80, 0xE0, 0x5, 0xAE, 0x0, 0xAF, 0x0, 0xB0, 0x0, 0xB1, 0xE0, 0xF0, 0x1, 0xF0, 0x1, 0xE0, 0x1, 0xB2, 0x0, 0xB3, 0x0, 0xB4, 0x0, 0x0, 0xB5, 0x0, 0xB6, 0x0, 0xB7,
+0x0, 0xB8, 0x38, 0x0, 0xB9, 0xF0, 0x5, 0xF0, 0x5, 0xA0, 0x5, 0xBA, 0x0, 0xBB, 0x0, 0x0, 0xBC, 0x0, 0xBD, 0x0, 0xBE, 0x0, 0xBF, 0xE, 0x0, 0xC0, 0x0, 0xC1, 0xF0, 0x5, 0xF0, 0x5, 0xA0, 0x5, 0xC2, 0x20, 0x0,
+0xC3, 0x0, 0x1, 0xC4, 0x0, 0xC5, 0x0, 0xC6, 0x0, 0x0, 0xC7, 0x0, 0xC8, 0x0, 0xC9, 0x0, 0xCA, 0x0, 0x0, 0xCB, 0x0, 0xCC, 0x0, 0xCD, 0x0, 0xCE, 0x30, 0x0, 0xCF, 0xF0, 0x11, 0xE0, 0x11, 0xD0, 0x0, 0xD1,
+0x0, 0x0, 0xD2, 0x0, 0xD3, 0x0, 0xD4, 0x0, 0xD5, 0x0, 0x0, 0xD6, 0x0, 0xD7, 0x0, 0xD8, 0x0, 0xD9, 0x0, 0x0, 0xDA, 0x0, 0xDB, 0x0, 0xDC, 0x0, 0xDD, 0x0, 0x60, 0xDE, 0xF0, 0x11, 0xF0, 0x11, 0x0, 0xDF, 0x0,
+0xE0, 0x0, 0x0, 0xE1, 0x0, 0xE2, 0x0, 0xE3, 0x0, 0xE4, 0x0, 0x70, 0xE5, 0xF0, 0x5, 0xF0, 0x5, 0xF0, 0x5, 0x0, 0xE6, 0x0, 0xE7, 0xF, 0x0, 0xE8, 0x0, 0xE9, 0xF0, 0x5, 0xF0, 0x5, 0xF0, 0x5, 0x0, 0x11, 0x0,
+0xEA, 0x0, 0x0, 0x80, 0x24, 0xC0, 0x38, 0xA0, 0x30, 0xE0, 0x40, 0xA0, 0x2C, 0xE0, 0x3C, 0xC0, 0x34, 0x80, 0x28, 0xE0, 0x3C, 0xC0, 0x34, 0xE0, 0x38, 0xC0, 0x30, 0x0, 0x45, 0xA0, 0x2C, 0xA0, 0x28, 0x0,
+0x3C, 0x99, 0x2, 0xAC, 0x3, 0x46, 0x0, 0x0, 0x0, 0xCF, 0x8, 0x0, 0x2, 0x0, 0x21, 0xE0, 0x1, 0x5B, 0x2, 0x1D, 0x0, 0xE2, 0x0, 0x0, 0x0, 0x12, 0x2, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x74, 0x0, 0x74, 0x12, 0x8, 0xF, 0x0, 0x1F, 0x28, 0x1F, 0x70, 0x4, 0x48, 0x0, 0x3C, 0xF, 0x4C, 0x0, 0x74, 0x2, 0x8, 0x0, 0x0, 0x7, 0xC, 0x8,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x24, 0xA0, 0x7, 0x42, 0x40, 0x0, 0x0, 0x33, 0x74, 0xFD, 0x76, 0x2, 0x9, 0xE0, 0x1, 0x0, 0x35, 0x3, 0x0, 0x50, 0x13, 0x11, 0x11, 0x15, 0x13, 0x31, 0x55, 0x15, 0x13, 0x51,
+0x0, 0x15, 0x13, 0x52, 0x0, 0x35, 0x34, 0x53, 0x0, 0x50, 0x55, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1F, 0x0, 0xFF, 0x7F, 0x9C, 0x73, 0x39, 0x67, 0xB5, 0x56, 0x52, 0x4A, 0xFF, 0x7F, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x10, 0x0, 0x30, 0x0, 0x0, 0xF0, 0x1, 0x90, 0x5, 0x10, 0x11, 0x11, 0x1, 0x42, 0x1, 0x0, 0x6, 0x1, 0x1, 0x10, 0x10, 0x20, 0x7,
+0x11, 0x1E, 0x11, 0x10, 0x1, 0x10, 0x1, 0x0, 0x1A, 0x10, 0x1B, 0x10, 0x1F, 0x11, 0x73, 0x11, 0x0, 0x1, 0x10, 0x19, 0x10, 0x8, 0x0, 0x0, 0x30, 0x15, 0x10, 0x12, 0x9F, 0x10, 0x1F, 0x1, 0x11, 0x0, 0x10,
+0x20, 0x23, 0x20, 0x3, 0x0, 0x4F, 0x0, 0x21, 0xFF, 0x10, 0x51, 0x50, 0x60, 0x0, 0x73, 0x0, 0xF, 0x10, 0x17, 0xF0, 0x1F, 0x10, 0x1B, 0x20, 0x51, 0xFD, 0x10, 0x81, 0x10, 0x47, 0x20, 0x71, 0x10, 0xB, 0x20,
+0x17, 0xF0, 0x3F, 0x1, 0x10, 0x1, 0xFF, 0x50, 0x53, 0xB0, 0xC8, 0x40, 0x33, 0x40, 0x4B, 0x50, 0xE9, 0x30, 0xB4, 0x70, 0x79, 0x90, 0xBF, 0xE7, 0x30, 0xCE, 0x30, 0x83, 0x20, 0xF4, 0x0, 0x0, 0x30, 0x3, 0x10,
+0xFE, 0x60, 0x1A, 0xFF, 0x30, 0xF3, 0x21, 0x13, 0x31, 0x5, 0x21, 0x1F, 0x21, 0x7, 0x41, 0xE, 0x11, 0x45, 0x11, 0x16, 0xEF, 0x1, 0x4B, 0x0, 0xBC, 0x70, 0x1, 0x10, 0x11, 0x7, 0x50, 0x5B, 0x40, 0x3, 0x50,
+0xEB, 0xFF, 0x11, 0x77, 0x30, 0xA7, 0x10, 0xC7, 0x10, 0xEB, 0x11, 0x86, 0x20, 0x3, 0x20, 0x37, 0x50, 0xFE, 0xBF, 0x21, 0xB, 0x10, 0x1, 0x4C, 0x1, 0xA1, 0x1, 0x91, 0x11, 0x1D, 0x11, 0x1, 0x11, 0x20, 0xDF,
+0x11, 0x54, 0x21, 0x67, 0x10, 0x10, 0x1F, 0x10, 0x33, 0x11, 0x1B, 0x11, 0x6B, 0x20, 0x2F, 0xFF, 0x31, 0xEB, 0x20, 0x5D, 0x21, 0x4E, 0x21, 0x5F, 0x1, 0xDE, 0x20, 0x22, 0x20, 0x75, 0x42, 0xD, 0xFF, 0x30,
+0x4B, 0x41, 0xC3, 0x20, 0x28, 0x31, 0x5C, 0x31, 0x60, 0x41, 0x8B, 0x2, 0x1D, 0x20, 0xAF, 0xFF, 0x20, 0x7, 0x81, 0x63, 0x90, 0xDB, 0x60, 0xE3, 0x40, 0x17, 0x42, 0x5F, 0x51, 0x35, 0x22, 0x43, 0xFF, 0x1,
+0x13, 0x11, 0xDF, 0x30, 0x3, 0x32, 0x80, 0x11, 0x2, 0x30, 0xB7, 0x40, 0x1, 0x12, 0x3F, 0xFF, 0x10, 0xE2, 0x11, 0x64, 0xF2, 0xAF, 0x32, 0x93, 0x21, 0x3F, 0xF0, 0x9F, 0xA0, 0x9F, 0x61, 0x63, 0xFF, 0x80,
+0x1F, 0xA0, 0x3, 0x61, 0x5F, 0x70, 0x17, 0xD0, 0xDF, 0x62, 0x5B, 0x11, 0xD7, 0x31, 0x1B, 0xFF, 0xB0, 0x1B, 0x22, 0xC3, 0x52, 0x7E, 0x13, 0xF, 0x41, 0xCE, 0xC0, 0x2, 0x12, 0xCD, 0x60, 0x3, 0xFF, 0x50,
+0xBB, 0x61, 0x81, 0x20, 0xF5, 0x23, 0x67, 0x12, 0x83, 0x22, 0x85, 0xA3, 0xA4, 0xC3, 0x3, 0xFF, 0xC0, 0x3F, 0xF3, 0x7B, 0xF0, 0x7F, 0xF0, 0x1, 0xF3, 0x37, 0xE1, 0x17, 0x20, 0x1E, 0x11, 0x9F, 0xFF, 0x43,
+0x19, 0xF0, 0x1, 0x61, 0xCA, 0x30, 0xFB, 0x70, 0x7, 0x51, 0xDE, 0x22, 0x9F, 0x13, 0xFB, 0xFB, 0x40, 0x7, 0x12, 0xC3, 0x24, 0x45, 0x80, 0xE2, 0x14, 0x70, 0x1, 0x14, 0x47, 0x23, 0xF7, 0xFF, 0x60, 0xD, 0x44,
+0x1F, 0x13, 0xEE, 0x34, 0x53, 0x23, 0x17, 0x12, 0xE5, 0x33, 0x5B, 0x34, 0x0, 0xFF, 0x14, 0x26, 0x14, 0x6B, 0xC4, 0xE, 0xB0, 0xDF, 0xC1, 0xF6, 0x20, 0x33, 0x72, 0x3E, 0x60, 0xF, 0xFF, 0x52, 0x1F, 0xE1,
+0xFE, 0x34, 0xF, 0x24, 0xFE, 0x44, 0x2B, 0xF1, 0xDC, 0x24, 0x6B, 0x71, 0xE8, 0xFF, 0xF0, 0x1, 0xB2, 0xC, 0xF0, 0xB3, 0x30, 0x3F, 0xF0, 0x1, 0xF0, 0x1, 0x52, 0x50, 0x63, 0xE2, 0xFF, 0x80, 0xE4, 0x70, 0x6,
+0x55, 0xDF, 0x31, 0x33, 0x13, 0x78, 0x15, 0xC4, 0x15, 0xB1, 0x24, 0xC0, 0xFF, 0x55, 0x5F, 0x54, 0x4A, 0xC3, 0x7, 0x43, 0x5F, 0x30, 0x3F, 0x60, 0x14, 0x34, 0xE9, 0x26, 0x26, 0xFF, 0xF0, 0x1F, 0x35, 0xB3,
+0x33, 0xDC, 0x70, 0x5F, 0x35, 0xDF, 0x26, 0x27, 0xA3, 0x43, 0x35, 0xC0, 0xFF, 0x26, 0x3B, 0x60, 0xFB, 0x46, 0x82, 0x80, 0x3F, 0x50, 0x7F, 0x50, 0x23, 0x54, 0x3C, 0x50, 0xBF, 0xFF, 0x30, 0x3F, 0xC0, 0xF8,
+0x81, 0x83, 0x70, 0x3F, 0x30, 0xF3, 0xD0, 0x3F, 0xC0, 0x1F, 0xE0, 0x7F, 0xFF, 0xC1, 0x6B, 0xF0, 0xF, 0xF0, 0xF, 0xC1, 0xDF, 0xB1, 0x97, 0x72, 0x7B, 0xB1, 0xEB, 0x64, 0xCF, 0xFF, 0xD0, 0xB, 0xD0, 0x33,
+0xC2, 0x9F, 0x43, 0x13, 0xA0, 0x1B, 0x92, 0x1F, 0x17, 0x8F, 0x26, 0x58, 0xFF, 0x13, 0x30, 0x13, 0x67, 0x43, 0x38, 0xF0, 0xFF, 0x31, 0xD3, 0x75, 0x9C, 0x37, 0x44, 0x17, 0xF1, 0xFF, 0x66, 0xBF, 0x86, 0xCB,
+0x57, 0x3A, 0xA1, 0x9F, 0x64, 0xE7, 0xA1, 0x9F, 0xF6, 0x23, 0x80, 0x3F, 0xFF, 0x45, 0x33, 0x14, 0x1, 0x27, 0x2F, 0x45, 0xC6, 0x64, 0xE3, 0xF0, 0x1F, 0x65, 0xD2, 0xF0, 0xBF, 0xFF, 0x35, 0xA5, 0x81, 0xCB,
+0x42, 0xAB, 0xF0, 0xDF, 0x60, 0xDF, 0xA4, 0xF7, 0xA4, 0x3, 0x62, 0xBF, 0xFF, 0xA2, 0x54, 0xA7, 0xDB, 0x28, 0xDA, 0x61, 0x11, 0x40, 0xBF, 0x38, 0x4B, 0x46, 0x9, 0xF0, 0x5E, 0xFF, 0x20, 0xCB, 0x73, 0x3F,
+0x17, 0xF4, 0x27, 0x10, 0x18, 0xD9, 0x19, 0x6B, 0x15, 0x1F, 0x91, 0x7F, 0xFF, 0x20, 0x1B, 0x97, 0x3C, 0x77, 0x40, 0xF0, 0xFF, 0x71, 0xBB, 0xF1, 0x7F, 0x51, 0xBF, 0xD0, 0xDE, 0xFF, 0xC0, 0x3F, 0x15, 0x9F,
+0x8, 0xB8, 0x34, 0x1F, 0x35, 0xAB, 0xF1, 0xFF, 0x70, 0xDF, 0x93, 0x9F, 0xFF, 0x60, 0x33, 0xB3, 0x5F, 0x1A, 0x59, 0x20, 0x3, 0xF1, 0x5F, 0xC1, 0x9F, 0xF0, 0xBF, 0xE0, 0x1F, 0xFF, 0x28, 0x36, 0x8A, 0x5F,
+0xA0, 0xB7, 0x4A, 0x1F, 0x1A, 0x40, 0x58, 0xE2, 0xA0, 0x33, 0x48, 0xDA, 0xFF, 0x34, 0x8B, 0x78, 0xA7, 0xD9, 0x9B, 0xA0, 0x9F, 0x44, 0x5F, 0x16, 0x79, 0x46, 0x4B, 0xA1, 0xBF, 0xFF, 0x32, 0xB3, 0xF2, 0x3E,
+0x62, 0x1F, 0xF3, 0xC3, 0x58, 0x50, 0x60, 0x3F, 0xF0, 0x3C, 0x45, 0x8F, 0xFF, 0x97, 0xFB, 0x80, 0xB3, 0xF0, 0x1, 0xF0, 0x1, 0x5A, 0xFB, 0x3A, 0x5A, 0x48, 0x43, 0xF0, 0x1, 0xFF, 0x8C, 0x7, 0x3A, 0x87,
+0x46, 0x2F, 0xC, 0x17, 0x43, 0xFF, 0xA0, 0xD3, 0xB2, 0xB, 0xCC, 0x47, 0xFF, 0x84, 0x7, 0xC5, 0xFF, 0x54, 0x15, 0x40, 0x5B, 0x90, 0x5F, 0xE0, 0x3F, 0x46, 0xF, 0xB6, 0x3F, 0xFF, 0x1C, 0x1C, 0xB3, 0x8A,
+0x61, 0x1F, 0x6C, 0xC7, 0x66, 0x61, 0x44, 0xDB, 0x3B, 0x7F, 0x76, 0xD6, 0xFF, 0x30, 0xD3, 0xD2, 0xBF, 0x6C, 0x2B, 0xD1, 0x87, 0xA7, 0x8B, 0xF0, 0xCB, 0x5B, 0xDF, 0x77, 0x36, 0xFF, 0xB4, 0x3, 0x60, 0x5F,
+0xF1, 0xDF, 0xF0, 0x5F, 0x54, 0x59, 0x53, 0xFF, 0x40, 0x3, 0xAA, 0x62, 0xFF, 0x2D, 0x16, 0xFB, 0x67, 0xF1, 0x7F, 0xF6, 0xBF, 0xE0, 0x3F, 0x44, 0x7, 0x98, 0x6E, 0xB1, 0x9B, 0xFF, 0xF1, 0x64, 0x34, 0x13,
+0x4E, 0x18, 0xF0, 0xBE, 0x48, 0x67, 0x74, 0x3, 0x78, 0x5F, 0xF9, 0x1B, 0xFF, 0x3A, 0xC, 0xD9, 0x42, 0xB0, 0x1, 0xD2, 0x1F, 0xF3, 0xFF, 0xDB, 0x82, 0x71, 0x37, 0x5A, 0x8B, 0xFF, 0xD0, 0x3F, 0x54, 0x3B,
+0xF3, 0x4B, 0xB0, 0x7F, 0x52, 0x3F, 0x9B, 0xA6, 0x1E, 0xF9, 0x2F, 0x15, 0xFF, 0x2E, 0xAA, 0xA, 0x91, 0x6D, 0xA0, 0x84, 0x0, 0x9A, 0x47, 0x5E, 0xA0, 0xFC, 0x6F, 0xA0, 0xF, 0xFF, 0x43, 0x76, 0x7A, 0x93,
+0x5A, 0x4B, 0x67, 0xDF, 0x2D, 0x34, 0xF3, 0xB0, 0xFC, 0x1F, 0x64, 0xD7, 0x80, 0x99, 0x9F, 0x0, 0x10, 0xA0, 0x0, 0x0, 0x3D, 0x0, 0x0, 0xF0, 0x1, 0xF0, 0x1, 0xF0, 0x1, 0x0, 0xF, 0x22, 0x40, 0x3, 0xDE, 0xF0,
+0x1, 0x10, 0x1C, 0x22, 0x30, 0x1, 0x80, 0x27, 0xF0, 0x3, 0x0, 0x43, 0x11, 0x60, 0x11, 0xF0, 0x1, 0x90, 0x5, 0x0, 0x1, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0,
+0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x1, 0x4, 0x3, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0,
+0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x3, 0x4, 0x3, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0,
+0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x3, 0x4, 0x3, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0,
+0x4, 0x0, 0x4, 0x0, 0x3, 0x4, 0x3, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0,
+0x3, 0x4, 0x3, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x3, 0x4, 0x3, 0x0,
+0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x3, 0x4, 0x3, 0x0, 0x4, 0x0, 0x4, 0x0,
+0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x3, 0x4, 0x3, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0,
+0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x3, 0x4, 0x3, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0,
+0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x3, 0x4, 0x3, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0,
+0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x3, 0x4, 0x3, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0,
+0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x3, 0x4, 0x3, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0,
+0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x3, 0x4, 0x3, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0,
+0x4, 0x0, 0x4, 0x0, 0x3, 0x4, 0x3, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0,
+0x3, 0x4, 0x3, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x3, 0x4, 0x1, 0x8,
+0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x1, 0xC, 0x1F, 0x0, 0x60, 0x5D, 0xFF, 0x7F,
+0x0, 0x0, 0x10, 0xC0, 0x0, 0x0, 0x38, 0x0, 0x0, 0xF0, 0x1, 0xF0, 0x1, 0x30, 0xB, 0x10, 0x11, 0x11, 0x7F, 0x1, 0xF0, 0x3, 0xF0, 0x3, 0x90, 0x7, 0x50, 0x38, 0xF0, 0x3, 0x0, 0xF, 0x40, 0x62, 0x3F, 0x11,
+0x11, 0xF0, 0x1, 0x10, 0xD, 0x50, 0x73, 0x0, 0x19, 0xF0, 0x3, 0x40, 0x5B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x4, 0x0, 0x5, 0x0, 0x48,
+0x57, 0x0, 0x49, 0x4E, 0x0, 0x45, 0x58, 0x0, 0xFF, 0xFF, 0xFF, 0x88, 0x66, 0x0, 0x2, 0x28, 0x66, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4D, 0x75, 0x73, 0x69, 0x63, 0x3A, 0x20, 0x20, 0x20, 0x20, 0x2D, 0x2D, 0x0, 0x0, 0x0, 0x0, 0x45, 0x66, 0x66, 0x65,
+0x63, 0x74, 0x3A, 0x20, 0x20, 0x20, 0x2D, 0x2D, 0x0, 0x0, 0x0, 0x0, 0x4D, 0x6F, 0x64, 0x65, 0x3A, 0x0, 0x0, 0x0, 0x54, 0x65, 0x6D, 0x70, 0x6F, 0x3A, 0x20, 0x20, 0x31, 0x30, 0x30, 0x25, 0x0, 0x0, 0x0,
+0x0, 0x50, 0x69, 0x74, 0x63, 0x68, 0x3A, 0x20, 0x20, 0x31, 0x30, 0x30, 0x25, 0x0, 0x0, 0x0, 0x0, 0x43, 0x50, 0x55, 0x3A, 0x20, 0x20, 0x20, 0x30, 0x30, 0x2E, 0x30, 0x25, 0x0, 0xFF, 0xFF, 0xFF, 0x43, 0x0,
+0xFF, 0xFF, 0x73, 0x74, 0x64, 0x6E, 0x75, 0x6C, 0x6C, 0x0, 0xD, 0x3, 0x0, 0x2, 0xE1, 0x2, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0,
+0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0x13, 0x0, 0x2, 0x1, 0x13, 0x0, 0x2, 0xA1, 0x12, 0x0, 0x2, 0x11, 0x12, 0x0, 0x2, 0x81, 0x11, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x12,
+0x0, 0x2, 0x81, 0x11, 0x0, 0x2, 0x3C, 0x1E, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0x66, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x74, 0x69, 0x0, 0x2, 0xD0, 0x69, 0x0, 0x2, 0x2C, 0x6A, 0x0,
+0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x66, 0x0,
+0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0xE, 0x33, 0xCD, 0xAB, 0x34, 0x12, 0x6D, 0xE6, 0xEC, 0xDE, 0x5, 0x0, 0xB, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x88, 0x6A, 0x0, 0x2, 0x88, 0x6A, 0x0, 0x2, 0x90, 0x6A, 0x0, 0x2, 0x90, 0x6A, 0x0, 0x2, 0x98, 0x6A, 0x0, 0x2,
+0x98, 0x6A, 0x0, 0x2, 0xA0, 0x6A, 0x0, 0x2, 0xA0, 0x6A, 0x0, 0x2, 0xA8, 0x6A, 0x0, 0x2, 0xA8, 0x6A, 0x0, 0x2, 0xB0, 0x6A, 0x0, 0x2, 0xB0, 0x6A, 0x0, 0x2, 0xB8, 0x6A, 0x0, 0x2, 0xB8, 0x6A, 0x0, 0x2, 0xC0,
+0x6A, 0x0, 0x2, 0xC0, 0x6A, 0x0, 0x2, 0xC8, 0x6A, 0x0, 0x2, 0xC8, 0x6A, 0x0, 0x2, 0xD0, 0x6A, 0x0, 0x2, 0xD0, 0x6A, 0x0, 0x2, 0xD8, 0x6A, 0x0, 0x2, 0xD8, 0x6A, 0x0, 0x2, 0xE0, 0x6A, 0x0, 0x2, 0xE0, 0x6A,
+0x0, 0x2, 0xE8, 0x6A, 0x0, 0x2, 0xE8, 0x6A, 0x0, 0x2, 0xF0, 0x6A, 0x0, 0x2, 0xF0, 0x6A, 0x0, 0x2, 0xF8, 0x6A, 0x0, 0x2, 0xF8, 0x6A, 0x0, 0x2, 0x0, 0x6B, 0x0, 0x2, 0x0, 0x6B, 0x0, 0x2, 0x8, 0x6B, 0x0,
+0x2, 0x8, 0x6B, 0x0, 0x2, 0x10, 0x6B, 0x0, 0x2, 0x10, 0x6B, 0x0, 0x2, 0x18, 0x6B, 0x0, 0x2, 0x18, 0x6B, 0x0, 0x2, 0x20, 0x6B, 0x0, 0x2, 0x20, 0x6B, 0x0, 0x2, 0x28, 0x6B, 0x0, 0x2, 0x28, 0x6B, 0x0, 0x2,
+0x30, 0x6B, 0x0, 0x2, 0x30, 0x6B, 0x0, 0x2, 0x38, 0x6B, 0x0, 0x2, 0x38, 0x6B, 0x0, 0x2, 0x40, 0x6B, 0x0, 0x2, 0x40, 0x6B, 0x0, 0x2, 0x48, 0x6B, 0x0, 0x2, 0x48, 0x6B, 0x0, 0x2, 0x50, 0x6B, 0x0, 0x2, 0x50,
+0x6B, 0x0, 0x2, 0x58, 0x6B, 0x0, 0x2, 0x58, 0x6B, 0x0, 0x2, 0x60, 0x6B, 0x0, 0x2, 0x60, 0x6B, 0x0, 0x2, 0x68, 0x6B, 0x0, 0x2, 0x68, 0x6B, 0x0, 0x2, 0x70, 0x6B, 0x0, 0x2, 0x70, 0x6B, 0x0, 0x2, 0x78, 0x6B,
+0x0, 0x2, 0x78, 0x6B, 0x0, 0x2, 0x80, 0x6B, 0x0, 0x2, 0x80, 0x6B, 0x0, 0x2, 0x88, 0x6B, 0x0, 0x2, 0x88, 0x6B, 0x0, 0x2, 0x90, 0x6B, 0x0, 0x2, 0x90, 0x6B, 0x0, 0x2, 0x98, 0x6B, 0x0, 0x2, 0x98, 0x6B, 0x0,
+0x2, 0xA0, 0x6B, 0x0, 0x2, 0xA0, 0x6B, 0x0, 0x2, 0xA8, 0x6B, 0x0, 0x2, 0xA8, 0x6B, 0x0, 0x2, 0xB0, 0x6B, 0x0, 0x2, 0xB0, 0x6B, 0x0, 0x2, 0xB8, 0x6B, 0x0, 0x2, 0xB8, 0x6B, 0x0, 0x2, 0xC0, 0x6B, 0x0, 0x2,
+0xC0, 0x6B, 0x0, 0x2, 0xC8, 0x6B, 0x0, 0x2, 0xC8, 0x6B, 0x0, 0x2, 0xD0, 0x6B, 0x0, 0x2, 0xD0, 0x6B, 0x0, 0x2, 0xD8, 0x6B, 0x0, 0x2, 0xD8, 0x6B, 0x0, 0x2, 0xE0, 0x6B, 0x0, 0x2, 0xE0, 0x6B, 0x0, 0x2, 0xE8,
+0x6B, 0x0, 0x2, 0xE8, 0x6B, 0x0, 0x2, 0xF0, 0x6B, 0x0, 0x2, 0xF0, 0x6B, 0x0, 0x2, 0xF8, 0x6B, 0x0, 0x2, 0xF8, 0x6B, 0x0, 0x2, 0x0, 0x6C, 0x0, 0x2, 0x0, 0x6C, 0x0, 0x2, 0x8, 0x6C, 0x0, 0x2, 0x8, 0x6C,
+0x0, 0x2, 0x10, 0x6C, 0x0, 0x2, 0x10, 0x6C, 0x0, 0x2, 0x18, 0x6C, 0x0, 0x2, 0x18, 0x6C, 0x0, 0x2, 0x20, 0x6C, 0x0, 0x2, 0x20, 0x6C, 0x0, 0x2, 0x28, 0x6C, 0x0, 0x2, 0x28, 0x6C, 0x0, 0x2, 0x30, 0x6C, 0x0,
+0x2, 0x30, 0x6C, 0x0, 0x2, 0x38, 0x6C, 0x0, 0x2, 0x38, 0x6C, 0x0, 0x2, 0x40, 0x6C, 0x0, 0x2, 0x40, 0x6C, 0x0, 0x2, 0x48, 0x6C, 0x0, 0x2, 0x48, 0x6C, 0x0, 0x2, 0x50, 0x6C, 0x0, 0x2, 0x50, 0x6C, 0x0, 0x2,
+0x58, 0x6C, 0x0, 0x2, 0x58, 0x6C, 0x0, 0x2, 0x60, 0x6C, 0x0, 0x2, 0x60, 0x6C, 0x0, 0x2, 0x68, 0x6C, 0x0, 0x2, 0x68, 0x6C, 0x0, 0x2, 0x70, 0x6C, 0x0, 0x2, 0x70, 0x6C, 0x0, 0x2, 0x78, 0x6C, 0x0, 0x2, 0x78,
+0x6C, 0x0, 0x2, 0x80, 0x6C, 0x0, 0x2, 0x80, 0x6C, 0x0, 0x2, 0x88, 0x6C, 0x0, 0x2, 0x88, 0x6C, 0x0, 0x2, 0x90, 0x6C, 0x0, 0x2, 0x90, 0x6C, 0x0, 0x2, 0x98, 0x6C, 0x0, 0x2, 0x98, 0x6C, 0x0, 0x2, 0xA0, 0x6C,
+0x0, 0x2, 0xA0, 0x6C, 0x0, 0x2, 0xA8, 0x6C, 0x0, 0x2, 0xA8, 0x6C, 0x0, 0x2, 0xB0, 0x6C, 0x0, 0x2, 0xB0, 0x6C, 0x0, 0x2, 0xB8, 0x6C, 0x0, 0x2, 0xB8, 0x6C, 0x0, 0x2, 0xC0, 0x6C, 0x0, 0x2, 0xC0, 0x6C, 0x0,
+0x2, 0xC8, 0x6C, 0x0, 0x2, 0xC8, 0x6C, 0x0, 0x2, 0xD0, 0x6C, 0x0, 0x2, 0xD0, 0x6C, 0x0, 0x2, 0xD8, 0x6C, 0x0, 0x2, 0xD8, 0x6C, 0x0, 0x2, 0xE0, 0x6C, 0x0, 0x2, 0xE0, 0x6C, 0x0, 0x2, 0xE8, 0x6C, 0x0, 0x2,
+0xE8, 0x6C, 0x0, 0x2, 0xF0, 0x6C, 0x0, 0x2, 0xF0, 0x6C, 0x0, 0x2, 0xF8, 0x6C, 0x0, 0x2, 0xF8, 0x6C, 0x0, 0x2, 0x0, 0x6D, 0x0, 0x2, 0x0, 0x6D, 0x0, 0x2, 0x8, 0x6D, 0x0, 0x2, 0x8, 0x6D, 0x0, 0x2, 0x10,
+0x6D, 0x0, 0x2, 0x10, 0x6D, 0x0, 0x2, 0x18, 0x6D, 0x0, 0x2, 0x18, 0x6D, 0x0, 0x2, 0x20, 0x6D, 0x0, 0x2, 0x20, 0x6D, 0x0, 0x2, 0x28, 0x6D, 0x0, 0x2, 0x28, 0x6D, 0x0, 0x2, 0x30, 0x6D, 0x0, 0x2, 0x30, 0x6D,
+0x0, 0x2, 0x38, 0x6D, 0x0, 0x2, 0x38, 0x6D, 0x0, 0x2, 0x40, 0x6D, 0x0, 0x2, 0x40, 0x6D, 0x0, 0x2, 0x48, 0x6D, 0x0, 0x2, 0x48, 0x6D, 0x0, 0x2, 0x50, 0x6D, 0x0, 0x2, 0x50, 0x6D, 0x0, 0x2, 0x58, 0x6D, 0x0,
+0x2, 0x58, 0x6D, 0x0, 0x2, 0x60, 0x6D, 0x0, 0x2, 0x60, 0x6D, 0x0, 0x2, 0x68, 0x6D, 0x0, 0x2, 0x68, 0x6D, 0x0, 0x2, 0x70, 0x6D, 0x0, 0x2, 0x70, 0x6D, 0x0, 0x2, 0x78, 0x6D, 0x0, 0x2, 0x78, 0x6D, 0x0, 0x2,
+0x80, 0x6D, 0x0, 0x2, 0x80, 0x6D, 0x0, 0x2, 0x88, 0x6D, 0x0, 0x2, 0x88, 0x6D, 0x0, 0x2, 0x90, 0x6D, 0x0, 0x2, 0x90, 0x6D, 0x0, 0x2, 0x98, 0x6D, 0x0, 0x2, 0x98, 0x6D, 0x0, 0x2, 0xA0, 0x6D, 0x0, 0x2, 0xA0,
+0x6D, 0x0, 0x2, 0xA8, 0x6D, 0x0, 0x2, 0xA8, 0x6D, 0x0, 0x2, 0xB0, 0x6D, 0x0, 0x2, 0xB0, 0x6D, 0x0, 0x2, 0xB8, 0x6D, 0x0, 0x2, 0xB8, 0x6D, 0x0, 0x2, 0xC0, 0x6D, 0x0, 0x2, 0xC0, 0x6D, 0x0, 0x2, 0xC8, 0x6D,
+0x0, 0x2, 0xC8, 0x6D, 0x0, 0x2, 0xD0, 0x6D, 0x0, 0x2, 0xD0, 0x6D, 0x0, 0x2, 0xD8, 0x6D, 0x0, 0x2, 0xD8, 0x6D, 0x0, 0x2, 0xE0, 0x6D, 0x0, 0x2, 0xE0, 0x6D, 0x0, 0x2, 0xE8, 0x6D, 0x0, 0x2, 0xE8, 0x6D, 0x0,
+0x2, 0xF0, 0x6D, 0x0, 0x2, 0xF0, 0x6D, 0x0, 0x2, 0xF8, 0x6D, 0x0, 0x2, 0xF8, 0x6D, 0x0, 0x2, 0x0, 0x6E, 0x0, 0x2, 0x0, 0x6E, 0x0, 0x2, 0x8, 0x6E, 0x0, 0x2, 0x8, 0x6E, 0x0, 0x2, 0x10, 0x6E, 0x0, 0x2, 0x10,
+0x6E, 0x0, 0x2, 0x18, 0x6E, 0x0, 0x2, 0x18, 0x6E, 0x0, 0x2, 0x20, 0x6E, 0x0, 0x2, 0x20, 0x6E, 0x0, 0x2, 0x28, 0x6E, 0x0, 0x2, 0x28, 0x6E, 0x0, 0x2, 0x30, 0x6E, 0x0, 0x2, 0x30, 0x6E, 0x0, 0x2, 0x38, 0x6E,
+0x0, 0x2, 0x38, 0x6E, 0x0, 0x2, 0x40, 0x6E, 0x0, 0x2, 0x40, 0x6E, 0x0, 0x2, 0x48, 0x6E, 0x0, 0x2, 0x48, 0x6E, 0x0, 0x2, 0x50, 0x6E, 0x0, 0x2, 0x50, 0x6E, 0x0, 0x2, 0x58, 0x6E, 0x0, 0x2, 0x58, 0x6E, 0x0,
+0x2, 0x60, 0x6E, 0x0, 0x2, 0x60, 0x6E, 0x0, 0x2, 0x68, 0x6E, 0x0, 0x2, 0x68, 0x6E, 0x0, 0x2, 0x70, 0x6E, 0x0, 0x2, 0x70, 0x6E, 0x0, 0x2, 0x78, 0x6E, 0x0, 0x2, 0x78, 0x6E, 0x0, 0x2, 0x80, 0x6E, 0x0, 0x2,
+0x80, 0x6E, 0x0, 0x2, 0x0, 0x0, 0x2, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0x65, 0x0, 0x2, 0x7C, 0x65, 0x0, 0x2, 0x7C, 0x65, 0x0, 0x2, 0x7C, 0x65, 0x0, 0x2, 0x7C, 0x65, 0x0, 0x2, 0x7C, 0x65, 0x0, 0x2, 0x7C,
+0x65, 0x0, 0x2, 0x7C, 0x65, 0x0, 0x2, 0x7C, 0x65, 0x0, 0x2, 0x7C, 0x65, 0x0, 0x2, 0x7C, 0x65, 0x0, 0x2, 0x7C, 0x65, 0x0, 0x2, 0x7C, 0x65, 0x0, 0x2, 0x7C, 0x65, 0x0, 0x2, 0x7C, 0x65, 0x0, 0x2, 0x7C, 0x65,
+0x0, 0x2, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0xA0, 0xE3, 0x8, 0x12, 0x93, 0xE5, 0x8, 0x32, 0x83, 0xE5, 0x0, 0x0, 0x4F, 0xE1, 0xB, 0x40, 0x2D, 0xE9, 0x10, 0x12, 0x93, 0xE5, 0x14, 0x22, 0x93, 0xE5, 0x2, 0x10,
+0x1, 0xE0, 0x98, 0x0, 0x9F, 0xE5, 0x0, 0x20, 0x90, 0xE5, 0x1, 0x20, 0x82, 0xE1, 0x0, 0x20, 0x80, 0xE5, 0x8C, 0x20, 0x9F, 0xE5, 0x4, 0x0, 0x92, 0xE5, 0x0, 0x0, 0x50, 0xE3, 0x3, 0x0, 0x0, 0xA, 0x1, 0x0,
+0x10, 0xE0, 0x5, 0x0, 0x0, 0x1A, 0x8, 0x20, 0x82, 0xE2, 0xF8, 0xFF, 0xFF, 0xEA, 0x14, 0x12, 0x83, 0xE5, 0xB, 0x40, 0xBD, 0xE8, 0x8, 0x12, 0x83, 0xE5, 0xE, 0xF0, 0xA0, 0xE1, 0x0, 0x10, 0x92, 0xE5, 0x0,
+0x0, 0x51, 0xE3, 0x1, 0x0, 0x0, 0x1A, 0x0, 0x10, 0xA0, 0xE1, 0xF6, 0xFF, 0xFF, 0xEA, 0x0, 0x20, 0xF, 0xE1, 0xDF, 0x20, 0xC2, 0xE3, 0x1F, 0x20, 0x82, 0xE3, 0x2, 0xF0, 0x29, 0xE1, 0x14, 0x2, 0x83, 0xE5,
+0x0, 0x40, 0x2D, 0xE9, 0x0, 0xE0, 0x8F, 0xE2, 0x11, 0xFF, 0x2F, 0xE1, 0x1, 0x33, 0xA0, 0xE3, 0x8, 0x32, 0x83, 0xE5, 0x0, 0x40, 0xBD, 0xE8, 0x0, 0x30, 0xF, 0xE1, 0xDF, 0x30, 0xC3, 0xE3, 0x92, 0x30, 0x83,
+0xE3, 0x3, 0xF0, 0x29, 0xE1, 0xB, 0x40, 0xBD, 0xE8, 0x0, 0xF0, 0x69, 0xE1, 0x8, 0x12, 0x83, 0xE5, 0xE, 0xF0, 0xA0, 0xE1, 0xF8, 0x3F, 0x0, 0xB, 0x0, 0x0, 0x0, 0x1, };
+
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef _defs_h_
+#define _defs_h_
+
+#include "deftypes.h"
+
+#define BYTESMASHER 0xBA
+#define MAX_CHANNELS 32
+extern int PANNING_SEP;
+
+//#define SUPER_ASCII
+
+#define CLAMP(x, a, b) ((x) < (a) ? (a) : ((x) > (b) ? (b) : (x)))
+
+#endif // _defs_h_
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef DEFTYPES_H
+#define DEFTYPES_H
+
+#ifdef HOST_16_BITS
+
+
+typedef unsigned int u16;
+typedef unsigned long u32;
+typedef signed int s16;
+typedef signed long s32;
+
+#else
+
+typedef unsigned short u16;
+typedef unsigned int u32;
+typedef signed short s16;
+typedef signed long s32;
+
+#endif
+
+typedef unsigned char u8;
+typedef signed char s8;
+
+typedef unsigned char bool;
+#define true (!0)
+#define false (0)
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef ERRORS_H
+#define ERRORS_H
+
+#define ERR_NONE 0x00
+#define ERR_INVALID_MODULE 0x01
+#define ERR_MANYARGS 0x02
+#define ERR_NOINPUT 0x03
+#define ERR_NOWRITE 0x04
+#define ERR_MANYCHANNELS 0x05
+#define ERR_UNKNOWNSAMPLE 0x06
+#define ERR_UNKNOWNPATTERN 0x07
+#define ERR_UNKNOWNINST 0x08
+#define ERR_TOOMANYSAMPLES 0x09
+#define ERR_UNKNOWNINPUT 0x0A
+#define ERR_BADINPUT 0x0B
+#define ERR_RETARDEDSCRIPT 0x0C
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#include "defs.h"
+#include "files.h"
+
+FILE *fin;
+FILE *fout;
+
+int file_byte_count;
+
+bool file_exists( char* filename )
+{
+ fin = fopen( filename, "rb" );
+ if( !fin )
+ return false;
+ file_close_read();
+ return true;
+}
+
+int file_size( char* filename )
+{
+ FILE* f;
+ int a;
+ f = fopen( filename, "rb" );
+ if( !f )
+ return 0;
+ fseek( f, 0, SEEK_END );
+ a = ftell( f );
+ fclose( f );
+ return a;
+}
+
+int file_open_read( char* filename )
+{
+ fin = fopen( filename, "rb" );
+ if( !fin )
+ return FILE_OPEN_ERROR;
+ return FILE_OPEN_OKAY;
+}
+
+int file_open_write( char* filename )
+{
+ fout = fopen( filename, "wb" );
+ if( !fout )
+ return FILE_OPEN_ERROR;
+ return FILE_OPEN_OKAY;
+}
+
+int file_open_write_end( char* filename )
+{
+ fout = fopen( filename, "r+b" );
+ if( !fout )
+ return FILE_OPEN_ERROR;
+ fseek( fout, 0, SEEK_END );
+ return FILE_OPEN_OKAY;
+}
+
+void file_close_read( void )
+{
+ fclose( fin );
+}
+
+void file_close_write( void )
+{
+ fclose( fout );
+}
+
+int file_seek_read( int offset, int mode )
+{
+ return fseek( fin, offset, mode );
+}
+
+int file_seek_write( int offset, int mode )
+{
+ return fseek( fout, offset, mode );
+}
+
+int file_tell_read( void )
+{
+ return ftell( fin );
+}
+
+int file_tell_write( void )
+{
+ return ftell( fout );
+}
+
+int file_tell_size( void )
+{
+ int pos = ftell(fin);
+ fseek( fin, 0, SEEK_END );
+ int size = ftell(fin);
+ fseek(fin, pos, SEEK_SET );
+ return size;
+}
+
+u8 read8( void )
+{
+ u8 a;
+ fread( &a, 1, 1, fin );
+ return a;
+}
+
+u16 read16( void )
+{
+ u16 a;
+ a = read8();
+ a |= ((u16)read8()) << 8;
+ return a;
+}
+
+u32 read24( void )
+{
+ u32 a;
+ a = read8();
+ a |= ((u32)read8())<<8;
+ a |= ((u32)read8())<<16;
+ return a;
+}
+
+u32 read32( void )
+{
+ u32 a;
+ a = read16();
+ a |= ((u32)read16()) << 16;
+ return a;
+}
+
+u8 read8f( FILE* p_fin )
+{
+ u8 a;
+ fread( &a, 1, 1, p_fin );
+ return a;
+}
+
+u16 read16f( FILE* p_fin )
+{
+ u16 a;
+ a = read8f( p_fin );
+ a |= ((u16)read8f( p_fin )) << 8;
+ return a;
+}
+
+u32 read32f( FILE* p_fin )
+{
+ u32 a;
+ a = read16f( p_fin );
+ a |= ((u32)read16f( p_fin )) << 16;
+ return a;
+}
+
+void write8( u8 p_v )
+{
+ fwrite( &p_v, 1, 1, fout );
+ file_byte_count++;
+}
+
+void write16( u16 p_v )
+{
+ write8( (u8)(p_v & 0xFF) );
+ write8( (u8)(p_v >> 8) );
+ file_byte_count += 2;
+}
+
+void write24( u32 p_v )
+{
+ write8( (u8)(p_v & 0xFF) );
+ write8( (u8)((p_v >> 8) & 0xFF) );
+ write8( (u8)((p_v >> 16) & 0xFF) );
+ file_byte_count += 3;
+}
+
+void write32( u32 p_v )
+{
+ write16( (u16)(p_v & 0xFFFF) );
+ write16( (u16)(p_v >> 16) );
+ file_byte_count += 4;
+}
+
+void align16( void )
+{
+ if( ftell( fout ) & 1 )
+ write8( BYTESMASHER );
+}
+
+void align32( void )
+{
+ if( ftell( fout ) & 3 )
+ write8( BYTESMASHER );
+ if( ftell( fout ) & 3 )
+ write8( BYTESMASHER );
+ if( ftell( fout ) & 3 )
+ write8( BYTESMASHER );
+}
+
+void align32f( FILE* p_file )
+{
+ if( ftell( p_file ) & 3 )
+ write8( BYTESMASHER );
+ if( ftell( p_file ) & 3 )
+ write8( BYTESMASHER );
+ if( ftell( p_file ) & 3 )
+ write8( BYTESMASHER );
+}
+
+void skip8( u32 count )
+{
+ fseek( fin, count, SEEK_CUR );
+// while( count )
+// {
+// //read8();
+// count--;
+// }
+}
+
+void skip8f( u32 count, FILE* p_file )
+{
+ fseek( p_file, count, SEEK_CUR );
+// while( count ) // this was a major slowdown!
+// {
+// //read8f( p_file );
+//
+// count--;
+// }
+}
+
+void file_delete( char* filename )
+{
+ if( file_exists( filename ) )
+ remove( filename );
+}
+
+int file_get_byte_count( )
+{
+ int a = file_byte_count;
+ file_byte_count = 0;
+ return a;
+}
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef FILES_H
+#define FILES_H
+
+#include <stdio.h>
+
+int file_size( char* filename );
+int file_open_read( char* filename );
+int file_open_write( char* filename );
+int file_open_write_end( char* filename );
+void file_close_read( void );
+void file_close_write( void );
+u8 read8( void );
+u16 read16( void );
+u32 read24( void );
+u32 read32( void );
+void write8( u8 p_v );
+void write16( u16 p_v );
+void write24( u32 p_v );
+void write32( u32 p_v );
+void align16( void );
+void align32( void );
+void skip8( u32 count );
+int file_seek_read( int offset, int mode );
+int file_seek_write( int offset, int mode );
+int file_tell_read( void );
+int file_tell_write( void );
+
+u8 read8f( FILE* p_fin );
+u16 read16f( FILE* p_fin );
+u32 read32f( FILE* p_fin );
+void align32f( FILE* p_file );
+void skip8f( u32 count, FILE* p_file );
+
+void file_delete( char* filename );
+
+bool file_exists( char* filename );
+
+int file_get_byte_count();
+
+int file_tell_size( void );
+
+#define FILE_OPEN_OKAY 0
+#define FILE_OPEN_ERROR -1
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#include <stdlib.h>
+#include "defs.h"
+#include "files.h"
+#include "mas.h"
+
+const u8 GBA_ROM[] = {
+0x30, 0x0, 0x0, 0xEA, 0x24, 0xFF, 0xAE, 0x51, 0x69, 0x9A, 0xA2, 0x21, 0x3D, 0x84, 0x82, 0xA, 0x84, 0xE4, 0x9, 0xAD, 0x11, 0x24, 0x8B, 0x98, 0xC0, 0x81, 0x7F, 0x21, 0xA3, 0x52, 0xBE, 0x19, 0x93, 0x9, 0xCE,
+0x20, 0x10, 0x46, 0x4A, 0x4A, 0xF8, 0x27, 0x31, 0xEC, 0x58, 0xC7, 0xE8, 0x33, 0x82, 0xE3, 0xCE, 0xBF, 0x85, 0xF4, 0xDF, 0x94, 0xCE, 0x4B, 0x9, 0xC1, 0x94, 0x56, 0x8A, 0xC0, 0x13, 0x72, 0xA7, 0xFC, 0x9F,
+0x84, 0x4D, 0x73, 0xA3, 0xCA, 0x9A, 0x61, 0x58, 0x97, 0xA3, 0x27, 0xFC, 0x3, 0x98, 0x76, 0x23, 0x1D, 0xC7, 0x61, 0x3, 0x4, 0xAE, 0x56, 0xBF, 0x38, 0x84, 0x0, 0x40, 0xA7, 0xE, 0xFD, 0xFF, 0x52, 0xFE, 0x3,
+0x6F, 0x95, 0x30, 0xF1, 0x97, 0xFB, 0xC0, 0x85, 0x60, 0xD6, 0x80, 0x25, 0xA9, 0x63, 0xBE, 0x3, 0x1, 0x4E, 0x38, 0xE2, 0xF9, 0xA2, 0x34, 0xFF, 0xBB, 0x3E, 0x3, 0x44, 0x78, 0x0, 0x90, 0xCB, 0x88, 0x11,
+0x3A, 0x94, 0x65, 0xC0, 0x7C, 0x63, 0x87, 0xF0, 0x3C, 0xAF, 0xD6, 0x25, 0xE4, 0x8B, 0x38, 0xA, 0xAC, 0x72, 0x21, 0xD4, 0xF8, 0x7, 0x4D, 0x41, 0x58, 0x4D, 0x4F, 0x44, 0x20, 0x44, 0x45, 0x4D, 0x4F, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x30, 0x31, 0x96, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x64, 0x0, 0x0, 0x6, 0x0, 0x0, 0xEA, 0x0, 0x0, 0x0, 0x0, 0x2, 0x3, 0xA0, 0xE3, 0x2, 0x14, 0xA0, 0xE3, 0xF8, 0x7,
+0xB0, 0xE8, 0xF8, 0x7, 0xA1, 0xE8, 0xA1, 0x29, 0xB0, 0xE1, 0xFB, 0xFF, 0xFF, 0x3A, 0xFE, 0x0, 0xA0, 0xE3, 0x0, 0x0, 0x1, 0xEF, 0x8, 0x0, 0x9F, 0xE5, 0x8, 0x10, 0x9F, 0xE5, 0x0, 0x0, 0x12, 0xEF, 0x4, 0xF0,
+0x9F, 0xE5, 0x4, 0x1, 0x0, 0x2, 0x0, 0x0, 0x0, 0x3, 0x44, 0x18, 0x0, 0x3, 0x10, 0xF2, 0x3A, 0x0, 0x0, 0xC0, 0x7E, 0xC0, 0x7A, 0xA0, 0x76, 0x80, 0x72, 0x0, 0x60, 0x6E, 0x60, 0x6A, 0x40, 0x66, 0x20, 0x62,
+0x0, 0x20, 0x5E, 0x0, 0x5A, 0x0, 0x35, 0x3, 0x0, 0x0, 0x50, 0x13, 0x11, 0x11, 0x15, 0x13, 0x31, 0x55, 0x0, 0x15, 0x13, 0x51, 0x0, 0x15, 0x13, 0x52, 0x0, 0x0, 0x35, 0x34, 0x53, 0x0, 0x50, 0x55, 0x5, 0x0,
+0x40, 0x0, 0x0, 0x1, 0x1F, 0x0, 0xFF, 0x7F, 0x9C, 0x73, 0x0, 0x39, 0x67, 0xB5, 0x56, 0x52, 0x4A, 0xFF, 0x7F, 0xE0, 0x20, 0x12, 0xF0, 0x1, 0x0, 0x29, 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x2, 0x0, 0x18, 0x0,
+0x36, 0x24, 0x24, 0x20, 0x37, 0x36, 0x20, 0x36, 0x7F, 0x0, 0x1, 0x36, 0x0, 0x8, 0x3E, 0xB, 0x0, 0x3E, 0x68, 0x3F, 0x8, 0x0, 0x0, 0x66, 0x35, 0x0, 0x1B, 0x6C, 0x56, 0x33, 0x0, 0x1C, 0x32, 0x1C, 0x0, 0x1E,
+0x73, 0x33, 0x5E, 0x0, 0xC, 0x8, 0x4, 0x80, 0x30, 0x37, 0xC, 0x6, 0x6, 0x6, 0xC, 0x18, 0x0, 0xB0, 0x0, 0x3, 0x18, 0x0, 0xB, 0x0, 0x27, 0x3C, 0xFF, 0x3C, 0x66, 0x83, 0x0, 0x7A, 0xC, 0xC, 0x3F, 0xC, 0xC,
+0x40, 0x67, 0x30, 0x2C, 0x41, 0x3F, 0x70, 0x75, 0xC, 0x0, 0x40, 0x60, 0x30, 0x0, 0x3A, 0x0, 0x3, 0x0, 0x3E, 0x73, 0x7B, 0x6F, 0x67, 0x67, 0x4, 0x3E, 0x0, 0x18, 0x1C, 0x1E, 0x0, 0x40, 0x7E, 0x0, 0x1, 0x3E,
+0x63, 0x60, 0x38, 0xE, 0x63, 0x7F, 0x10, 0x7, 0x0, 0x3C, 0x60, 0x63, 0x3E, 0x0, 0x38, 0x3C, 0x36, 0x0, 0x33, 0x7F, 0x30, 0x78, 0x0, 0x7F, 0x3, 0x3F, 0x41, 0x60, 0x10, 0xF, 0x3E, 0x63, 0x3, 0x3F, 0x63,
+0x0, 0x17, 0x37, 0x7F, 0x63, 0x0, 0x3F, 0x0, 0x60, 0x3E, 0x0, 0xC, 0x10, 0xF, 0x0, 0x7, 0x72, 0x7E, 0x10, 0x2F, 0x0, 0x5A, 0x80, 0x3, 0x8, 0x4, 0x10, 0x65, 0xC, 0x2E, 0x18, 0x30, 0x1, 0xB, 0x7E, 0x20,
+0x2, 0x10, 0xC, 0x10, 0xA7, 0x1E, 0x60, 0x33, 0x0, 0x7F, 0x0, 0x87, 0x3E, 0x41, 0x79, 0x65, 0x79, 0x40, 0x1, 0x20, 0x3F, 0x7F, 0x63, 0x63, 0x63, 0x0, 0x3F, 0x2, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x10,
+0x67, 0x3, 0x70, 0x3, 0x0, 0x7F, 0x0, 0xF, 0x0, 0x1, 0x3F, 0x0, 0x7F, 0x46, 0x4, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x30, 0x7, 0x6, 0xF, 0x83, 0x10, 0x77, 0x3, 0x73, 0x63, 0x7E, 0x0, 0x0, 0x33, 0x20, 0x37,
+0xC0, 0x1, 0x3D, 0x1, 0x0, 0x3C, 0x0, 0x78, 0x30, 0x30, 0x30, 0x0, 0x33, 0x33, 0x1E, 0x0, 0x67, 0x66, 0x36, 0x1E, 0x4, 0x36, 0x66, 0x67, 0x0, 0xF, 0x1, 0x1E, 0x46, 0x66, 0x1, 0x7F, 0x0, 0x41, 0x63, 0x77,
+0x7F, 0x6B, 0x0, 0x5F, 0x7, 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x0, 0x67, 0x0, 0xB7, 0x0, 0x6E, 0x90, 0x20, 0x5F, 0x3E, 0x6, 0x30, 0x4F, 0x63, 0x6B, 0x7B, 0x3E, 0x54, 0x60, 0x30, 0x7F, 0x67, 0x10, 0xE7, 0x3E,
+0x10, 0xFF, 0x7E, 0x5A, 0x78, 0x5A, 0x20, 0x57, 0x20, 0x2E, 0x1, 0xF, 0x10, 0x36, 0x36, 0x1C, 0x8, 0x81, 0x0, 0x77, 0x6B, 0x7F, 0x77, 0x63, 0x41, 0x0, 0x0, 0xC, 0x6, 0x1C, 0x1C, 0x36, 0x63, 0x0, 0x0,
+0xA6, 0x1, 0xC0, 0x3C, 0x8A, 0x1, 0x17, 0x31, 0x18, 0x4C, 0x0, 0x6F, 0x1E, 0x1, 0x96, 0x6, 0x8, 0x6, 0x1E, 0x0, 0x3, 0x10, 0xFD, 0x60, 0x40, 0x0, 0x83, 0x11, 0x5D, 0x18, 0x18, 0x1E, 0x0, 0x8, 0x10, 0x2C,
+0x71, 0xFE, 0x18, 0xFF, 0xC, 0x4, 0x1, 0xDB, 0x22, 0x29, 0x1E, 0x30, 0x3E, 0x3, 0x33, 0x6E, 0x0, 0x7, 0x6, 0x6, 0x0, 0xFF, 0x1, 0x47, 0xDC, 0x11, 0x69, 0x11, 0x7F, 0x30, 0x0, 0x16, 0x0, 0x17, 0x10, 0xF,
+0x7F, 0x3, 0x81, 0x1, 0x8F, 0x6C, 0xC, 0x1E, 0xC, 0xC, 0x1E, 0x2, 0x5B, 0x0, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1E, 0x7, 0x6, 0x22, 0x36, 0x6E, 0x10, 0xAF, 0x18, 0x0, 0x1C, 0x20, 0xFF, 0x0, 0x5B, 0x30, 0x10,
+0x32, 0x33, 0x0, 0x17, 0x11, 0x0, 0x67, 0x20, 0x15, 0x20, 0x17, 0x2, 0x0, 0x33, 0x7F, 0x6B, 0x6B, 0x6B, 0x2, 0x93, 0x3B, 0xF5, 0x11, 0x51, 0x20, 0x5F, 0x11, 0xC7, 0x20, 0xF, 0x3E, 0x1, 0x50, 0x0, 0x0,
+0x66, 0x47, 0x3E, 0x1, 0xE8, 0x0, 0x7B, 0x6E, 0x11, 0xF, 0x0, 0x7F, 0x1, 0x0, 0x12, 0x3E, 0x0, 0x8, 0x12, 0x46, 0x2C, 0x18, 0x10, 0x3F, 0x33, 0xE1, 0x30, 0x87, 0x30, 0xFF, 0x0, 0x7, 0x6B, 0x6B, 0x7F,
+0x36, 0x10, 0xF, 0x62, 0x36, 0x30, 0xD2, 0x0, 0x1F, 0x3E, 0x30, 0x1F, 0x2, 0x66, 0x19, 0x4, 0xC, 0x26, 0x3F, 0x0, 0x70, 0x2, 0x8D, 0x18, 0x18, 0x31, 0x70, 0x0, 0x2, 0x95, 0x20, 0x3, 0x7, 0xC, 0xC, 0x2,
+0x2F, 0xF, 0x7, 0x0, 0x6E, 0x3B, 0x42, 0xFB, 0x11, 0x8, 0x2, 0x67, 0xF3, 0xA, 0xBF, 0x60, 0x8, 0x33, 0x40, 0x3, 0xF0, 0x1, 0x40, 0x8D, 0x10, 0x91, 0x80, 0x27, 0xF0, 0x3, 0x9C, 0x0, 0xF4, 0x22, 0x22, 0xF0,
+0x1, 0x90, 0x5, 0x90, 0x59, 0x10, 0x11, 0x3F, 0x11, 0x1, 0xF0, 0x3, 0xF0, 0x3, 0x90, 0x7, 0x50, 0x38, 0xF0, 0x3, 0x0, 0xF, 0x9F, 0x40, 0xB6, 0x11, 0x11, 0xF0, 0x1, 0x10, 0xD, 0x50, 0x73, 0x0, 0x19, 0xF0,
+0x3, 0x80, 0x40, 0x5B, 0x38, 0x47, 0x10, 0x47, 0x8, 0x47, 0xC0, 0x0, 0x46, 0x0, 0xA0, 0x0, 0x47, 0x0, 0x40, 0x2D, 0x0, 0xE9, 0xF0, 0x7, 0x2D, 0xE9, 0x1, 0x0, 0x8F, 0x0, 0xE2, 0x10, 0xFF, 0x2F, 0xE1, 0x28,
+0x48, 0x0, 0x0, 0x68, 0x80, 0x46, 0x81, 0x79, 0x0, 0x29, 0x1, 0x0, 0xD1, 0x26, 0x49, 0x8F, 0x46, 0x41, 0x7F, 0x0, 0x0, 0x29, 0x5, 0xD1, 0x0, 0x78, 0x0, 0x28, 0x2, 0x0, 0xD1, 0x23, 0x4A, 0xFF, 0xF7, 0xE2,
+0xFF, 0x40, 0x0, 0x46, 0x30, 0x24, 0x4, 0x59, 0x21, 0x4F, 0x3F, 0x1, 0x68, 0x0, 0x20, 0x82, 0x46, 0x40, 0x46, 0x10, 0x1B, 0x1, 0xA, 0xD1, 0x64, 0x8, 0x2, 0xD3, 0x1D, 0x0, 0x1F, 0x0, 0xD2, 0xFF, 0x1, 0x20,
+0x82, 0x44, 0x28, 0x37, 0x2, 0x0, 0x2C, 0xF5, 0xD1, 0x9, 0xE0, 0x10, 0x15, 0x19, 0xA0, 0x0, 0x35, 0xC7, 0x80, 0x15, 0x16, 0x4E, 0x36, 0x68, 0x0, 0x0, 0x24, 0x70, 0x7C, 0x0, 0x28, 0xE, 0xD0, 0x14, 0x0,
+0x48, 0x0, 0x78, 0xF1, 0x7D, 0x89, 0x9, 0x81, 0x0, 0x42, 0x8, 0xD1, 0x12, 0x49, 0x30, 0x7D, 0x8, 0x0, 0x72, 0x0, 0x20, 0x88, 0x81, 0x35, 0x68, 0x0, 0x0, 0xF0, 0x8D, 0xF8, 0xFF, 0xE7, 0xF0, 0x7D, 0x8,
+0x0, 0x21, 0x88, 0x43, 0xF0, 0x75, 0x1C, 0x36, 0x1, 0x20, 0x34, 0xB, 0x0, 0x97, 0x84, 0x42, 0xE3, 0xD1, 0xA, 0x80, 0x0, 0x93, 0x38, 0x5B, 0x0, 0x3, 0x97, 0x27, 0x0, 0x2, 0x3, 0x44, 0xA, 0x0, 0x3, 0x3C,
+0x0, 0xB, 0x30, 0x0, 0xB, 0x0, 0x3, 0x70, 0xD, 0x0, 0x3, 0x50, 0xAA, 0x0, 0x17, 0x4D, 0x0, 0x1B, 0x28, 0x0, 0x1F, 0x5C, 0x0, 0x23, 0x15, 0x80, 0x0, 0x23, 0x10, 0xB5, 0x78, 0x7A, 0x1, 0x38, 0x51, 0x0,
+0xD3, 0x0, 0xF0, 0x56, 0xF8, 0x0, 0x2E, 0x48, 0x40, 0xD0, 0x10, 0xD, 0x41, 0x46, 0x4A, 0x69, 0x89, 0x68, 0x1, 0x80, 0x0, 0x8, 0x58, 0x80, 0x18, 0x39, 0x0, 0x7D, 0x0, 0x2C, 0xD0, 0xC1, 0x78, 0x89, 0x7,
+0x89, 0xF, 0x0, 0x49, 0x0, 0x79, 0x44, 0x8F, 0x46, 0x1C, 0xE0, 0x0, 0x1, 0xE0, 0x8, 0xE0, 0xF, 0xE0, 0xB9, 0x7D, 0x0, 0x49, 0x0, 0x8, 0x31, 0x41, 0x5C, 0xFA, 0x79, 0x5, 0x91, 0x42, 0xC, 0xD0, 0x11, 0x20,
+0xF, 0x9, 0x0, 0xF, 0x0, 0x72, 0x7D, 0x91, 0x42, 0x4, 0xD0, 0x9, 0xE0, 0x0, 0x79, 0x7A, 0xB2, 0x7C, 0x91, 0x42, 0x5, 0xD1, 0x40, 0xC1, 0x1, 0x2B, 0xB, 0xD0, 0x1, 0x29, 0xD, 0xD0, 0x30, 0x13, 0xE0, 0x10,
+0x4D, 0x30, 0x45, 0x2, 0xE0, 0x2, 0xE0, 0x0, 0x4, 0xE0, 0xA, 0xE0, 0x14, 0xE0, 0x2, 0x21, 0x0, 0x71, 0x74, 0xC, 0xE0, 0xF1, 0x7D, 0x1, 0x22, 0xA, 0x91, 0x43, 0xF1, 0x75, 0x10, 0xD, 0x5, 0x0, 0xD, 0x2,
+0x20, 0x22, 0x11, 0x40, 0xD, 0x34, 0x1C, 0x3, 0x49, 0xFF, 0x0, 0xF7, 0x37, 0xFF, 0x38, 0x70, 0x10, 0xBC, 0x8, 0x0, 0xBC, 0x18, 0x47, 0x0, 0x0, 0xD0, 0x9, 0x0, 0x0, 0x3, 0x38, 0x78, 0xFF, 0x28, 0x5, 0xDA,
+0x4, 0x80, 0x1, 0x2B, 0x1C, 0x21, 0x48, 0x43, 0x36, 0x18, 0x70, 0x14, 0x47, 0x0, 0x26, 0x0, 0x3, 0x0, 0x10, 0xE3, 0x0, 0xB5, 0x80, 0x11, 0x19, 0x8, 0x42, 0x1, 0xD0, 0x0, 0xBD, 0x0, 0x0, 0xB5, 0xB0, 0x7C,
+0x1, 0x38, 0x0, 0xD2, 0xB2, 0x40, 0xE0, 0x90, 0xD5, 0x1, 0x1C, 0x4A, 0x79, 0xC, 0x31, 0x0, 0x52, 0x8, 0x2B, 0xD3, 0xF3, 0x7D, 0x9B, 0x9, 0x0, 0x2, 0xD2, 0x8, 0x78, 0x9, 0x18, 0x25, 0xE0, 0x0, 0x6, 0xB4,
+0xF0, 0x88, 0xA, 0x1C, 0x31, 0x7E, 0x0, 0x0, 0xF0, 0x78, 0xF9, 0x31, 0x76, 0xF0, 0x80, 0x0, 0x19, 0x1C, 0x1, 0x2A, 0x8, 0xD1, 0xF0, 0x7D, 0x0, 0x43, 0x46, 0x1B, 0x7E, 0x1B, 0x9, 0x10, 0x23, 0x4, 0x0,
+0xD2, 0x12, 0x23, 0x18, 0x1, 0x6F, 0x1, 0x2A, 0x10, 0x6, 0xDB, 0xF0, 0x0, 0xAF, 0x10, 0x42, 0x2, 0xD1, 0x10, 0x2, 0x22, 0x10, 0x1, 0x81, 0xA1, 0x48, 0x2, 0x7A, 0x0, 0x4A, 0x43, 0x12, 0xB, 0x2, 0x72, 0x6,
+0xBC, 0x82, 0x10, 0x4B, 0xE, 0xE0, 0xF0, 0x7D, 0x10, 0x0, 0x2B, 0x1, 0x2C, 0x23, 0x18, 0x1, 0xB9, 0x2, 0x20, 0x35, 0x2, 0x9, 0x7E, 0x0, 0x0, 0x9, 0x1, 0xD3, 0x0, 0x20, 0xB0, 0x80, 0x52, 0x0, 0x8, 0x10,
+0xD3, 0x6, 0xB4, 0x30, 0x89, 0xA, 0x20, 0x1C, 0x71, 0x0, 0x6D, 0x41, 0xF9, 0x71, 0x76, 0x30, 0x0, 0x81, 0x19, 0x1C, 0x8F, 0x48, 0xC, 0x23, 0xC2, 0x0, 0x5E, 0x9, 0x9, 0x80, 0x39, 0x52, 0x18, 0xC2, 0x0,
+0x52, 0x6, 0xBC, 0x52, 0x8, 0x1A, 0xD3, 0x88, 0x0, 0x79, 0x0, 0x28, 0x17, 0xD1, 0x6, 0xB4, 0x70, 0xA0, 0x0, 0x2B, 0xB1, 0x0, 0x99, 0x2B, 0xF9, 0xB1, 0x76, 0x70, 0x80, 0x0, 0x2B, 0xC9, 0x8, 0xFF, 0x39,
+0x28, 0x1C, 0x1, 0x8, 0x39, 0x3, 0xD4, 0x83, 0x2, 0x75, 0xA7, 0xFE, 0x3, 0x8, 0xE0, 0x49, 0x42, 0x81, 0x2, 0x7F, 0xA2, 0xFE, 0x5, 0x2, 0x1C, 0x6, 0xBC, 0xF0, 0x7D, 0x2, 0x0, 0xFF, 0xD, 0x60, 0xD0, 0x10,
+0xFB, 0x91, 0xCD, 0x40, 0x78, 0xB1, 0x88, 0x9, 0x0, 0x1A, 0x0, 0xD2, 0x0, 0x21, 0xB1, 0x80, 0x70, 0x5, 0x7D, 0x1, 0x38, 0x52, 0xD3, 0x11, 0xEB, 0xC9, 0x51, 0x15, 0x0, 0x89, 0x0, 0x29, 0x1E, 0xD0, 0xB2,
+0x89, 0x52, 0x0, 0x18, 0xD1, 0xB, 0x0, 0xD0, 0x6F, 0x4A, 0xB2, 0x0, 0x81, 0x41, 0x79, 0x51, 0x43, 0xB3, 0x7B, 0x82, 0x0, 0x79, 0x9B, 0x18, 0x1B, 0x6, 0x1B, 0xE, 0xB3, 0x0, 0x73, 0x6B, 0x4A, 0xD2, 0x56,
+0x4A, 0x43, 0xD2, 0x0, 0x15, 0x5, 0xD4, 0x11, 0x1C, 0x28, 0x1C, 0x68, 0x80, 0x2, 0xEF, 0x6A, 0xFE, 0x4, 0xE0, 0x51, 0x42, 0x28, 0x28, 0x1C, 0x66, 0x2, 0xFB, 0x64, 0x0, 0x7B, 0x10, 0xB4, 0x10, 0x8, 0x20,
+0x44, 0x43, 0x64, 0x3, 0x25, 0x24, 0x18, 0xF0, 0x26, 0x7D, 0x4, 0x1, 0x85, 0x20, 0xD0, 0x12, 0xA3, 0x10, 0x6D, 0x1B, 0x80, 0xA0, 0x6D, 0x43, 0x89, 0x59, 0x1C, 0x49, 0xC, 0x3, 0x0, 0xD3, 0xC, 0x30, 0x10,
+0x30, 0x20, 0x60, 0x9, 0x0, 0xE0, 0x58, 0x4A, 0x12, 0x68, 0x11, 0x1C, 0xC, 0x0, 0x31, 0x9B, 0x0, 0xC9, 0x58, 0x8, 0x31, 0x88, 0x40, 0x18, 0x10, 0x15, 0x4B, 0x49, 0x49, 0x7A, 0x9, 0x5, 0x28, 0x61, 0x60,
+0x10, 0xAB, 0x31, 0xB0, 0xAB, 0xB4, 0x41, 0x46, 0x0, 0x9, 0x7E, 0xC9, 0x8, 0x11, 0xD3, 0x40, 0x88, 0x0, 0x80, 0x0, 0x29, 0xA, 0x41, 0x43, 0x9, 0xA, 0x41, 0x48, 0x3, 0x2D, 0x0, 0x28, 0x3, 0xD1, 0x47, 0x3,
+0xA3, 0x0, 0x41, 0x43, 0x89, 0xA, 0x46, 0x48, 0x48, 0x43, 0x0, 0x0, 0xC, 0xE0, 0x60, 0xF, 0xE0, 0x45, 0x48, 0x0, 0x29, 0x1C, 0xC, 0xD0, 0x6, 0xDF, 0x40, 0x49, 0x0, 0x9, 0x78, 0x0, 0x29, 0x3, 0xD1, 0x3F,
+0x49, 0x0, 0x9, 0x68, 0x48, 0x43, 0x80, 0xA, 0x3E, 0x49, 0x85, 0x30, 0x21, 0x1, 0xBC, 0xC3, 0x79, 0x12, 0x27, 0x1, 0x1, 0x19, 0x40, 0x1D, 0xA2, 0x29, 0x0, 0x78, 0x43, 0x43, 0x29, 0x49, 0x1, 0x8, 0x7A,
+0x43, 0x43, 0x41, 0x46, 0x8, 0x1, 0xBF, 0x0, 0x8, 0x79, 0x0, 0xD3, 0x40, 0x0, 0x43, 0x43, 0x8, 0x9B, 0xA, 0xB0, 0x88, 0x10, 0x5, 0x40, 0x46, 0x34, 0x0, 0x21, 0x40, 0x5A, 0x43, 0x43, 0xD9, 0xC, 0xFF, 0x0,
+0x29, 0x0, 0xDB, 0xFF, 0x21, 0x31, 0x74, 0x0, 0x0, 0x29, 0x16, 0xD1, 0xF3, 0x7D, 0x10, 0x22, 0x13, 0x8, 0x42, 0x12, 0xD0, 0x1, 0x0, 0x5, 0xF, 0xD1, 0x26, 0x0, 0x48, 0x20, 0x60, 0x73, 0x7C, 0x3, 0x2B,
+0x7, 0x0, 0xD1, 0xB1, 0x7D, 0x28, 0x23, 0x59, 0x43, 0x23, 0x80, 0x4, 0x43, 0x40, 0x18, 0xFF, 0x21, 0x1, 0x70, 0x0, 0x80, 0x2, 0xFB, 0x1F, 0xE0, 0x21, 0x72, 0x20, 0x68, 0xC0, 0x15, 0x17, 0xF, 0xD0, 0x90,
+0x23, 0x1A, 0x60, 0x23, 0x17, 0x0, 0x3D, 0x80, 0x10, 0x27, 0xB, 0xE0, 0x7, 0x49, 0xC, 0x23, 0xC8, 0x0, 0x5E, 0xF1, 0x7C, 0x9, 0x18, 0x0, 0x29, 0x0, 0x10, 0xDA, 0x0, 0x21, 0x0, 0x71, 0xDD, 0xFF, 0x21,
+0x61, 0x5, 0x72, 0x10, 0xBC, 0x1, 0xBC, 0x4, 0xA9, 0x0, 0x13, 0xD7, 0x4, 0x73, 0x30, 0x0, 0x3, 0x3F, 0x0, 0x3, 0x0, 0x80, 0x85, 0x3, 0x27, 0x37, 0x0, 0x3, 0x69, 0x0, 0xF, 0x35, 0x0, 0x13, 0x2, 0x8, 0x5C,
+0x0, 0x3, 0xB4, 0x5A, 0x33, 0xFF, 0x48, 0x80, 0x4, 0x1F, 0x80, 0x42, 0x0, 0x0, 0xEA, 0xF0, 0x61, 0x50, 0x3, 0x9, 0x30, 0x80, 0x24, 0x23, 0xB4, 0x8C, 0x0, 0x8, 0x0, 0x34, 0xA4, 0x18, 0x63, 0x88, 0x5B,
+0x6, 0xDB, 0x0, 0xC, 0x0, 0x28, 0x14, 0xD1, 0x95, 0x78, 0xA9, 0x80, 0x2, 0xDF, 0x51, 0x78, 0x2, 0x22, 0x1A, 0xE0, 0xF5, 0x1, 0x7D, 0x6D, 0x8, 0x5, 0xD3, 0x15, 0x79, 0x10, 0x11, 0x0, 0xD1, 0x78, 0x0, 0x22,
+0x11, 0xE0, 0x55, 0x79, 0x4, 0x1, 0x3D, 0xA9, 0x42, 0x6, 0x2, 0xFF, 0xB, 0xE0, 0x0, 0x0, 0x25, 0x65, 0x5F, 0x45, 0x43, 0xED, 0x10, 0x0, 0x5B, 0x19, 0x1, 0x30, 0x65, 0x88, 0xED, 0x9, 0x0, 0xA8, 0x42, 0x1,
+0xD1, 0x0, 0x20, 0x1, 0x31, 0x9, 0x30, 0xBC, 0x70, 0x47, 0x14, 0x4B, 0x9, 0x69, 0x34, 0x4B, 0x40, 0x70, 0x5, 0x53, 0x70, 0x0, 0x2D, 0xE9, 0x4, 0x56, 0x0, 0x9F, 0xE5, 0x0, 0x50, 0x95, 0xE5, 0x0, 0x16,
+0x80, 0x0, 0x7, 0x10, 0x91, 0xE5, 0x10, 0x10, 0x81, 0xE2, 0x0, 0x0, 0x0, 0xA0, 0xE3, 0x2, 0x21, 0xA0, 0xE3, 0x22, 0xFF, 0x30, 0x0, 0x7, 0x60, 0xA0, 0xE3, 0x0, 0x98, 0xEA, 0x40, 0x1C, 0x20, 0x17, 0x55,
+0xE3, 0xB, 0x0, 0x0, 0xA, 0x0, 0x1, 0x0, 0x80, 0xE2, 0xA5, 0x50, 0xB0, 0xE1, 0x0, 0xF9, 0xFF, 0xFF, 0x3A, 0xBC, 0x41, 0xD1, 0xE0, 0x0, 0x24, 0x4, 0x56, 0xE1, 0xF7, 0xFF, 0xFF, 0xBA, 0x80, 0x9, 0xF1, 0xCA,
+0x84, 0xB, 0x52, 0xE1, 0xF4, 0xFF, 0x0, 0xFF, 0x9A, 0x0, 0x30, 0xA0, 0xE1, 0x84, 0x2B, 0x0, 0xB0, 0xE1, 0xF1, 0xFF, 0xFF, 0xEA, 0x3, 0x0, 0x1, 0xA0, 0xE1, 0x70, 0x0, 0xBD, 0xE8, 0x1E, 0x5, 0xB3, 0x0,
+0x0, 0x1C, 0x2D, 0xE9, 0x14, 0xB0, 0x98, 0xE5, 0x0, 0x1, 0xC0, 0xDB, 0xE5, 0x18, 0xB0, 0xD8, 0xE5, 0x2, 0x1, 0xA0, 0xA0, 0xE3, 0x88, 0x5, 0x0, 0x83, 0x90, 0x1, 0x90, 0xE5, 0x24, 0x70, 0x98, 0xE5, 0x80,
+0x0, 0xB, 0x10, 0x4, 0x70, 0x80, 0x0, 0x8B, 0xA0, 0xE3, 0x0, 0x50, 0x0, 0xA0, 0xE3, 0x1, 0x30, 0xD7, 0xE4, 0x83, 0x3C, 0x10, 0xB0, 0xE1, 0x27, 0x0, 0x77, 0xA3, 0x3C, 0x6A, 0xE0, 0x4, 0x1A, 0x13, 0x81,
+0xE1, 0x28, 0x0, 0x9F, 0x93, 0x90, 0x0, 0x26, 0xE0, 0x1, 0x20, 0xD7, 0x24, 0x1, 0x20, 0x0, 0xC6, 0x25, 0x1, 0x20, 0xD6, 0x35, 0x1, 0x0, 0x30, 0x12, 0xE3, 0xA, 0x71, 0x0, 0x9B, 0xD7, 0xE4, 0xFE, 0x0, 0x2,
+0x50, 0xE3, 0x16, 0x0, 0xC6, 0xB5, 0x6, 0x9C, 0xBA, 0x0, 0x80, 0x50, 0x85, 0x3, 0x40, 0x50, 0x85, 0xC3, 0x60, 0x2, 0x0, 0x1F, 0x30, 0xBB, 0xD7, 0xE4, 0xC0, 0x0, 0x15, 0x41, 0xE3, 0xA, 0x51, 0x1A, 0xC,
+0x0, 0x50, 0xE1, 0x0, 0xEB, 0x4, 0xC3, 0x9, 0x30, 0xD6, 0xE5, 0xA, 0xC5, 0xE1, 0x2, 0x80, 0x0, 0xDB, 0x2B, 0x33, 0xB0, 0xE1, 0x1, 0x50, 0x85, 0x0, 0x23, 0x10, 0x50, 0x85, 0xE3, 0x9, 0x0, 0xC6, 0x4, 0xE5,
+0xA2, 0x1, 0x1A, 0xE1, 0x0, 0x53, 0x24, 0x3, 0x1C, 0x0, 0xC6, 0x25, 0x1, 0xA0, 0x20, 0x5F, 0x10, 0x93, 0x3, 0x4, 0x0, 0x80, 0xE1, 0xB4, 0x0, 0xC6, 0xE1, 0x22, 0x52, 0x1, 0x85, 0xE1, 0x8, 0x50, 0xC6, 0xE5,
+0xD3, 0x0, 0xE7, 0x0, 0x24, 0x70, 0x88, 0xE5, 0x30, 0x10, 0x88, 0xE5, 0x30, 0x0, 0x1C, 0x40, 0xEB, 0x6, 0xAF, 0x8, 0x50, 0xD7, 0xE5, 0x66, 0x1, 0x0, 0x6F, 0x1, 0xE2, 0xA, 0x8, 0x0, 0x77, 0x10, 0xA3, 0xB4,
+0x0, 0x0, 0xD7, 0xE1, 0xFF, 0x10, 0x0, 0xE2, 0x10, 0xA1, 0x0, 0x87, 0x1C, 0x0, 0x87, 0x7, 0x0, 0x51, 0xE3, 0x8, 0x80, 0x65, 0xA, 0x10, 0xF, 0x8, 0x69, 0x1A, 0x4, 0x0, 0x9F, 0x16, 0x1, 0x67, 0x0, 0x18,
+0x0, 0xD8, 0xE5, 0x20, 0x2, 0xB0, 0xE1, 0x9, 0x3, 0x0, 0xD7, 0xE5, 0xA, 0xED, 0x2A, 0xC1, 0x0, 0xD7, 0x56, 0x10, 0x0, 0xD3, 0xCA, 0x0, 0xDF, 0xE, 0x1, 0x6B, 0x0, 0xAF, 0xEA, 0x65, 0xF0, 0x0, 0xEB, 0xB,
+0x68, 0xAA, 0xA, 0x2, 0x42, 0x0, 0x0, 0x27, 0x52, 0xFF, 0x0, 0xFB, 0x7, 0x0, 0xF, 0x30, 0x64, 0x1, 0xD7, 0x60, 0x10, 0x96, 0xE5, 0x1C, 0x1, 0x47, 0x90, 0x61, 0x26, 0xE0, 0x0, 0xAC, 0x0, 0x0, 0xEB, 0x1,
+0x50, 0xC5, 0xE3, 0x8, 0x8, 0x50, 0xC7, 0xE5, 0x8, 0xA4, 0xEA, 0x1C, 0x24, 0x1, 0x9F, 0xE5, 0xF, 0xE0, 0xA0, 0xE1, 0x12, 0x11, 0x93, 0xC5, 0x40, 0x37, 0x9, 0x98, 0xAA, 0xF8, 0x63, 0xB0, 0x37, 0x9E, 0x0,
+0x37, 0x14, 0x15, 0x0, 0xD6, 0x0, 0xC3, 0x50, 0x0, 0xAF, 0x0, 0x3A, 0x0, 0x18, 0x10, 0xD8, 0xE5, 0xA1, 0x11, 0xB0, 0xE1, 0x80, 0x0, 0x63, 0x2A, 0x14, 0x30, 0x98, 0xE5, 0xC, 0x10, 0x2, 0x98, 0xE5, 0x0,
+0x1, 0x91, 0xE7, 0x2, 0xE4, 0xE0, 0x0, 0xB2, 0x10, 0xD0, 0xE1, 0x1, 0x11, 0xA0, 0xE1, 0x60, 0xBA, 0x10, 0x6B, 0x2, 0xD2, 0xBC, 0x13, 0x9F, 0xE5, 0x2, 0x82, 0x0, 0x1B, 0x10, 0x0, 0x87, 0xE5, 0x17, 0x0,
+0x43, 0x4, 0xE, 0x0, 0x80, 0xE3, 0x17, 0x1, 0x53, 0xB, 0xA5, 0x60, 0xAB, 0x4D, 0xAC, 0x0, 0xBB, 0x84, 0xC0, 0x73, 0x2, 0x1, 0x9F, 0x9, 0xE1, 0xA, 0x9, 0xC1, 0x0, 0xF7, 0x50, 0x77, 0x14, 0x20, 0x98, 0xE5,
+0x8, 0x40, 0x6B, 0x40, 0x2, 0x0, 0x6B, 0x4, 0x10, 0x90, 0xE5, 0x14, 0x20, 0x0, 0xD7, 0xE5, 0xC0, 0x20, 0xC2, 0xE3, 0x1, 0x23, 0x0, 0x82, 0xE1, 0x14, 0x20, 0xC7, 0xE5, 0x17, 0x20, 0x10, 0xD6, 0xE5, 0x20,
+0x0, 0xF, 0x2, 0xB, 0x11, 0xE3, 0x0, 0x20, 0x20, 0x82, 0x13, 0x17, 0x20, 0xC6, 0xE5, 0x0, 0x81, 0x14, 0xB0, 0xE1, 0x21, 0x1C, 0xA0, 0x21, 0xF, 0x2, 0x10, 0xC7, 0x25, 0x50, 0xC7, 0x1, 0x1F, 0x20, 0x4F,
+0x50, 0xBB, 0x0, 0xB2, 0x10, 0x90, 0xE1, 0xE, 0x10, 0xC7, 0xE5, 0x2B, 0x81, 0x18, 0x20, 0x2B, 0xE1, 0x10, 0x2B, 0x3, 0x2, 0x23, 0x1, 0x6B, 0x85, 0x21, 0x83, 0x8, 0x0, 0x10, 0xE3, 0x8, 0xE8, 0xA, 0x10,
+0x97, 0xB0, 0x22, 0xFF, 0xB, 0x2, 0x9B, 0x12, 0x9F, 0x20, 0xA0, 0xE3, 0x4, 0x20, 0xC0, 0x86, 0x0, 0x4F, 0x8C, 0xE8, 0xB8, 0x11, 0xC6, 0x19, 0xE1, 0x1A, 0x10, 0x0, 0xDB, 0x0, 0x47, 0x17, 0x10, 0x1, 0x2F,
+0x0, 0x10, 0x81, 0xE3, 0x12, 0x10, 0xC1, 0xE3, 0x17, 0xB6, 0x0, 0x13, 0x40, 0x41, 0xF7, 0x30, 0x17, 0xC1, 0x1, 0xE3, 0x30, 0x53, 0x2, 0x16, 0x10, 0x81, 0x13, 0x10, 0x1F, 0x80, 0x2, 0x8F, 0x3, 0x73, 0x13,
+0xD, 0xE, 0x0, 0xC7, 0x15, 0x51, 0xA3, 0xD, 0x3C, 0xEA, 0x18, 0xEF, 0xC4, 0x51, 0xD3, 0x4, 0x1C, 0xAA, 0x5C, 0x62, 0xB1, 0xD3, 0x0, 0x60, 0x0, 0xA0, 0xA3, 0x10, 0x50, 0x97, 0xE5, 0x4C, 0x12, 0xC1, 0x3,
+0xC3, 0x3, 0xB3, 0x9, 0x0, 0xC1, 0xE5, 0xA, 0x0, 0x3, 0x54, 0xC, 0x0, 0x7, 0xB, 0x0, 0xB, 0x8, 0x22, 0x37, 0x10, 0xE3, 0x8, 0x38, 0x12, 0x9F, 0x15, 0x1, 0xEB, 0x11, 0x11, 0xFF, 0x34, 0x2F, 0x11, 0x10,
+0x13, 0x10, 0xCF, 0x28, 0x80, 0x13, 0x0, 0x0, 0x24, 0x56, 0xE3, 0xA, 0x8, 0xA, 0xBE, 0x42, 0x97, 0x20, 0x4, 0x0, 0xA0, 0xE1, 0x91, 0x0, 0x0, 0xE0, 0xA0, 0x2, 0x10, 0xA0, 0xE1, 0x14, 0x3, 0x3, 0xEC, 0x11,
+0x9F, 0xE5, 0x0, 0xDA, 0x20, 0xD1, 0xE1, 0x82, 0x1, 0x90, 0xE0, 0x90, 0x4, 0x1B, 0x43, 0x81, 0x3, 0x5F, 0x80, 0x0, 0xA0, 0x23, 0x5A, 0x8, 0x20, 0x67, 0xD1, 0x0, 0xAB, 0x20, 0x9F, 0xA, 0x11, 0xE3, 0x8,
+0xCA, 0x41, 0xE3, 0x2, 0x9F, 0xEA, 0x2, 0x2, 0xB7, 0x13, 0x3, 0x43, 0x10, 0x28, 0x0, 0x97, 0x0, 0xCF, 0x86, 0x20, 0xA3, 0xBC, 0x0, 0xC1, 0x50, 0xE1, 0x90, 0x27, 0x10, 0x4, 0x83, 0x0, 0x40, 0xD7, 0xE5,
+0x72, 0x9C, 0x0, 0x63, 0x12, 0x8F, 0x0, 0xA3, 0xE1, 0x10, 0x4, 0x2B, 0x0, 0x55, 0x40, 0x34, 0x2F, 0x15, 0x1, 0xE3, 0x6, 0x1, 0xE3, 0x15, 0x1, 0xDF, 0xD3, 0x10, 0xA7, 0x2, 0xE7, 0xA, 0x4, 0x4F, 0xE3, 0x11,
+0x3, 0x9B, 0x12, 0x53, 0x4, 0xC0, 0x0, 0xC0, 0xE3, 0x64, 0x0, 0x9F, 0x0, 0x10, 0x0, 0xD1, 0xE5, 0x1, 0x3, 0x80, 0xE1, 0x0, 0x4, 0x2, 0x8A, 0xE1, 0xB6, 0x1, 0xC6, 0xE1, 0x12, 0x3B, 0x12, 0xDD, 0x3, 0xBF,
+0x2, 0x43, 0x5, 0x12, 0xBB, 0xA, 0x8C, 0xE2, 0x43, 0x16, 0x2, 0x3F, 0x46, 0xB8, 0x2, 0xB3, 0x2, 0x9, 0x11, 0x20, 0xBF, 0x11, 0x7, 0x15, 0xD, 0x10, 0xC6, 0x15, 0x7, 0x2, 0x4B, 0x14, 0xAB, 0x82, 0x2, 0xD3,
+0x1C, 0xB1, 0x0, 0x90, 0x2, 0xEB, 0x30, 0x7B, 0x11, 0x17, 0x15, 0x0, 0x30, 0xC6, 0x15, 0x14, 0xC7, 0x13, 0x9B, 0xA0, 0x1, 0xB0, 0xE1, 0x40, 0x2E, 0x3, 0x97, 0x46, 0x30, 0x8F, 0xE2, 0x2, 0x0, 0x0, 0xD3,
+0xE7, 0x1E, 0x30, 0x43, 0xE2, 0x22, 0x21, 0x0, 0xD3, 0xE7, 0xD8, 0x30, 0x9F, 0xE5, 0xB0, 0x0, 0x8, 0x93, 0xE1, 0xAB, 0x3E, 0x5, 0x47, 0x38, 0x83, 0xE3, 0x5A, 0x93, 0x1, 0x4B, 0x30, 0x1, 0x4B, 0xD, 0xFD,
+0xEF, 0x25, 0x3, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, 0xD, 0xE2, 0x2, 0x4, 0x4, 0x4, 0x5, 0x5, 0x5, 0xE, 0xC3, 0x7, 0x0, 0x7, 0x7, 0x8, 0x8, 0x8, 0x9, 0x9, 0x9, 0x0, 0x0, 0x2, 0x4, 0x6, 0x8, 0xA,
+0xC, 0xE, 0xF, 0x10, 0x12, 0x14, 0x16, 0xF0, 0xB, 0xF0, 0xB, 0xF0, 0xB, 0xF0, 0xB, 0xC6, 0xF0, 0xB, 0x40, 0xB, 0x0, 0x18, 0x10, 0x33, 0xA3, 0x15, 0x9B, 0xA8, 0xF0, 0x6, 0x93, 0x1A, 0x97, 0x1A, 0xA7, 0x1A,
+0x97, 0x61, 0x5, 0x0, 0x3, 0x0, 0xB0, 0x35, 0x0, 0x3, 0xB, 0x28, 0x0, 0x3, 0x2, 0x43, 0x2A, 0x0, 0x3, 0x41, 0x6, 0x3A, 0xB3, 0x90, 0x70, 0x31, 0x6, 0xB3, 0x1C, 0x2F, 0x6, 0xB6, 0x60, 0x0, 0x9F, 0xE5,
+0x40, 0xD0, 0x13, 0xF7, 0x10, 0xF0, 0xE1, 0x0, 0x10, 0xC0, 0x48, 0xE5, 0x4, 0x7B, 0xA, 0x50, 0x0, 0x53, 0x11, 0xD, 0xA0, 0x33, 0xE3, 0xB0, 0x1, 0xEB, 0x11, 0xEF, 0xB6, 0xC, 0x70, 0xB, 0x16, 0x4B, 0x58,
+0x34, 0x0, 0x33, 0x34, 0x0, 0x77, 0x16, 0x6F, 0x0, 0x10, 0x80, 0x24, 0xE5, 0x2C, 0x0, 0x43, 0xB0, 0x20, 0x4, 0x3B, 0x20, 0x82, 0x2, 0xE3, 0xB0, 0x20, 0xC0, 0xE1, 0x20, 0x0, 0x53, 0x0, 0x35, 0x0, 0x90,
+0x22, 0x57, 0x6, 0x33, 0x1, 0x1B, 0xEB, 0x26, 0x7, 0x33, 0x5, 0xC6, 0x0, 0x0, 0x4, 0x0, 0x7, 0x3B, 0xC, 0x7, 0x3F, 0x7, 0xF8, 0x7F, 0x0, 0x3, 0xAC, 0x0, 0xAF, 0x12, 0x7B, 0xE, 0x3E, 0x48, 0x1A, 0x16,
+0x5B, 0xF0, 0x4F, 0x1C, 0x1B, 0x2D, 0xE9, 0x7, 0x0, 0xA0, 0x0, 0xE2, 0xA0, 0x21, 0xA0, 0xE1, 0x88, 0x69, 0x4, 0x40, 0x47, 0x6, 0x4B, 0x1, 0x6, 0x8F, 0x1, 0x40, 0x0, 0x3, 0x55, 0x50, 0x0, 0x7, 0x60, 0x0,
+0xB, 0x70, 0x0, 0xF, 0x80, 0x0, 0x13, 0x48, 0x90, 0x11, 0x97, 0x52, 0xE3, 0x15, 0xFB, 0xFA, 0x3, 0xA0, 0x0, 0xE8, 0x1, 0x20, 0x52, 0xE2, 0xFC, 0xFF, 0xFF, 0x8, 0x1A, 0x0, 0x0, 0x5A, 0x20, 0x13, 0x4, 0x10,
+0x80, 0x9, 0xE4, 0x1, 0xA0, 0x5A, 0x20, 0x13, 0x3C, 0xC4, 0x7, 0x2B, 0x5, 0xC0, 0x9C, 0xE5, 0x0, 0xB0, 0x6, 0x9B, 0xA0, 0x0, 0x7, 0x81, 0x0, 0x23, 0xCD, 0x0, 0x0, 0x4A, 0xC, 0x90, 0x10, 0xB, 0x14, 0x59,
+0xE3, 0xCA, 0x0, 0x43, 0x1C, 0x40, 0x73, 0x90, 0x9, 0x0, 0x9, 0xE0, 0x29, 0x97, 0xA0, 0xE1, 0x4, 0x84, 0x90, 0x7, 0x5F, 0x80, 0x98, 0x6, 0xD3, 0x9C, 0xE5, 0x8, 0x60, 0x40, 0xDC, 0x2, 0x8F, 0xDC, 0xE5,
+0x1, 0xC, 0x60, 0xE2, 0x0, 0x90, 0x6, 0x5, 0xE0, 0x25, 0x54, 0xA0, 0xE1, 0x8, 0x5, 0xB0, 0x8B, 0xE0, 0x30, 0xF, 0x6, 0xE0, 0x26, 0x0, 0x64, 0xA0, 0xE1, 0x6, 0xB8, 0x8B, 0xE0, 0x0, 0x10, 0x40, 0x9D, 0xE5,
+0x14, 0x5B, 0x94, 0x9, 0x1, 0xE0, 0x10, 0x5E, 0xD, 0x59, 0x10, 0x9B, 0xAA, 0x6, 0x7, 0x51, 0x0, 0xE3, 0x6, 0x17, 0xA0, 0x83, 0x1, 0x20, 0xA0, 0x0, 0x83, 0x10, 0x0, 0x1A, 0xE5, 0x0, 0x6, 0x67, 0xA5, 0x3,
+0x8B, 0x51, 0x1, 0x73, 0xA0, 0x81, 0xD, 0x84, 0x8A, 0x10, 0xC3, 0xF8, 0xE, 0xFD, 0x4, 0xA3, 0x1D, 0x1F, 0x2, 0x6B, 0x4, 0x9B, 0x9, 0x8, 0x50, 0x4, 0xE0, 0x1, 0x28, 0x82, 0x22, 0x0, 0xCF, 0x2A, 0x9, 0x0,
+0x8, 0x80, 0xE0, 0x89, 0x7, 0x50, 0xE1, 0x89, 0x0, 0x7, 0x40, 0x20, 0x2, 0x29, 0x82, 0x22, 0x9, 0xA9, 0x0, 0xB, 0x9, 0x0, 0xB, 0x1, 0x0, 0xB, 0x89, 0x6, 0x0, 0x17, 0x5A, 0x6, 0x0, 0x17, 0x2A, 0x0, 0x17,
+0x0, 0xB, 0x9, 0x0, 0xB, 0x1, 0x95, 0x0, 0xB, 0x89, 0x5, 0x0, 0x2F, 0x5, 0x0, 0x2F, 0x2B, 0x0, 0x2F, 0xA9, 0x0, 0xB, 0x9, 0x0, 0xB, 0x1, 0x0, 0xB, 0x89, 0x4, 0x0, 0x47, 0x5A, 0x4, 0x0, 0x47, 0x2C, 0x0,
+0x47, 0x0, 0xB, 0x9, 0x0, 0xB, 0x1, 0x90, 0x0, 0xB, 0x89, 0x3, 0x0, 0x5F, 0x3, 0x40, 0x20, 0x80, 0x6A, 0x20, 0x0, 0x5F, 0x0, 0xB, 0x9, 0x0, 0xB, 0x40, 0x0, 0xB, 0x89, 0x44, 0x2, 0x0, 0x77, 0x2, 0x40,
+0x20, 0x5, 0x93, 0x22, 0x9, 0xAA, 0x0, 0xB, 0x9, 0x0, 0xB, 0x10, 0x10, 0x17, 0x1, 0x0, 0x8F, 0x1, 0x1A, 0x40, 0x20, 0x8, 0x10, 0x2F, 0x0, 0xB, 0x9, 0x0, 0xB, 0x4, 0xCE, 0x10, 0x2F, 0x7, 0x97, 0x89, 0x0,
+0x0, 0xA7, 0x10, 0x47, 0x7, 0xA3, 0x9, 0xDB, 0x0, 0xB, 0xD, 0xA9, 0x22, 0x6, 0x83, 0x6, 0xEB, 0xA2, 0x3, 0x6B, 0x14, 0x1F, 0x34, 0x44, 0xE0, 0x18, 0x63, 0x16, 0x67, 0x4, 0x8, 0x6B, 0x0, 0x40, 0x8, 0xA0,
+0xE3, 0x10, 0x18, 0x15, 0x2F, 0x53, 0xE3, 0x4C, 0xD0, 0x1, 0xCB, 0x11, 0x37, 0x31, 0x16, 0xCF, 0x1F, 0x2D, 0xE9, 0x8C, 0x0, 0x2, 0x9F, 0xE5, 0x27, 0xA6, 0x8A, 0xE0, 0x3, 0x0, 0xA0, 0xCA, 0xE3, 0x1, 0x19,
+0x81, 0xE2, 0xA, 0x10, 0x19, 0x51, 0xE2, 0x8, 0xC7, 0x3A, 0xFC, 0x4B, 0xBA, 0x7, 0xE8, 0xFC, 0x4B, 0xA0, 0xE8, 0x10, 0xF, 0x16, 0x13, 0x90, 0xF, 0xD1, 0x9, 0x8C, 0xA0, 0x1F, 0xF3, 0x1, 0x43, 0x1, 0x18,
+0x91, 0x10, 0x37, 0x10, 0x4A, 0xFC, 0x0, 0x0, 0x37, 0x0, 0xA0, 0xE8, 0x6, 0xF8, 0x50, 0x37, 0x80, 0xF, 0x20, 0x37, 0x80, 0x1F, 0x10, 0x37, 0x6, 0x19, 0x91, 0x80, 0x16, 0x73, 0x4A, 0x4, 0x20, 0x9A, 0xE4,
+0x4, 0x20, 0xD8, 0x2, 0x4F, 0x30, 0x5F, 0xDA, 0x90, 0xF, 0x9, 0x3F, 0xCA, 0xF8, 0x1F, 0xA, 0xBD, 0xE8, 0x27, 0x6, 0x2, 0xA7, 0x4, 0x5, 0xF7, 0x76, 0x45, 0xC7, 0x13, 0x2B, 0xE2, 0xD0, 0xA1, 0x9, 0x9F,
+0xA0, 0x0, 0xBB, 0x20, 0x0, 0x18, 0x24, 0xFB, 0x27, 0x6, 0xDA, 0xE7, 0x9, 0x0, 0x70, 0x87, 0xE0, 0x90, 0x5, 0x2, 0xE0, 0xB0, 0x0, 0x10, 0xD8, 0xE1, 0xA2, 0x12, 0x81, 0xE0, 0xB4, 0x5, 0x10, 0xC8, 0xE0,
+0x90, 0x6, 0x70, 0xF, 0xB2, 0x0, 0xF, 0x43, 0x1, 0x4, 0x8B, 0x6, 0x0, 0x55, 0xE1, 0x7, 0x6B, 0x8, 0x1A, 0x65, 0x55, 0x64, 0xDF, 0xF, 0x90, 0xA, 0xC2, 0xA, 0x6E, 0x66, 0xA, 0x72, 0x45, 0x68, 0x28, 0x33,
+0x55, 0xE3, 0x99, 0x3, 0x3F, 0x5F, 0xA, 0x82, 0x80, 0x12, 0x6B, 0x1, 0x4, 0xBD, 0xB8, 0x0, 0x76, 0x87, 0x0, 0xB0, 0x10, 0x18, 0xBD, 0xE8, 0x10, 0x10, 0x1A, 0xA, 0xE5, 0x1, 0x16, 0xA0, 0x7, 0xEB, 0x51,
+0x5, 0x93, 0x0, 0x38, 0xCA, 0xC, 0x0, 0xF, 0x2, 0x73, 0x1A, 0xF, 0x4A, 0x1, 0x76, 0x52, 0x47, 0x6, 0xB, 0x54, 0x15, 0x8F, 0xDA, 0x53, 0x9, 0xE3, 0x2, 0x45, 0x11, 0x17, 0x13, 0x8C, 0xE5, 0x24, 0x10, 0xAF,
+0x90, 0x9, 0xBB, 0x4B, 0x70, 0x7, 0x1B, 0x30, 0xB0, 0x19, 0x53, 0xDA, 0x11, 0x9B, 0x19, 0xCF, 0x68, 0x96, 0xA, 0xB, 0x10, 0x33, 0x47, 0x3, 0x5F, 0x4, 0x70, 0x8C, 0x2, 0xE5, 0x10, 0xC0, 0x8C, 0xE2, 0xF8,
+0x63, 0xEB, 0x5C, 0x29, 0xE1, 0x29, 0x3, 0x77, 0xD4, 0x43, 0xFB, 0xE4, 0x20, 0xA, 0x97, 0x8, 0x20, 0x92, 0xE5, 0xE0, 0x5, 0x4B, 0x0, 0x30, 0x93, 0x4, 0xE5, 0x83, 0x30, 0x82, 0xE0, 0x16, 0x17, 0xAB, 0xC8,
+0x0, 0xA0, 0xE1, 0x8C, 0xC1, 0xA0, 0xE1, 0xB, 0xB8, 0x12, 0xA0, 0xE1, 0xAB, 0x0, 0x3, 0x8B, 0xB1, 0x13, 0xD7, 0x54, 0x20, 0xE2, 0x23, 0x11, 0x4F, 0x60, 0x90, 0xE4, 0xB, 0x50, 0x0, 0x46, 0xE0, 0x5, 0x58,
+0xA0, 0xE1, 0xC5, 0x59, 0x0, 0xB0, 0xE1, 0x80, 0x0, 0x75, 0xE3, 0x7F, 0x50, 0x10, 0xE0, 0xB3, 0x7F, 0xA, 0xB7, 0x7F, 0x50, 0xA0, 0xC3, 0x2, 0x26, 0x78, 0x7B, 0xE0, 0xC7, 0x71, 0x10, 0x17, 0x77, 0x14,
+0xE3, 0x7F, 0x70, 0x10, 0x17, 0x57, 0x0, 0x7, 0xA0, 0xC3, 0x0, 0xFF, 0x50, 0x5, 0xE2, 0x7, 0x54, 0x85, 0xE1, 0xB, 0xB2, 0x50, 0xC2, 0xE0, 0x10, 0x43, 0xC, 0xF0, 0x43, 0x80, 0x43, 0x62, 0x7C, 0xF0, 0x43,
+0xA0, 0x43, 0xC3, 0xE0, 0x2, 0x0, 0x8F, 0xDB, 0xC1, 0x1, 0xCF, 0x24, 0xC7, 0x20, 0x80, 0xE5, 0xF0, 0x4F, 0x3A, 0xFB, 0x6A, 0x4, 0xB, 0xF7, 0x1B, 0xFB, 0x1C, 0x4, 0xBF, 0x28, 0x14, 0xC7, 0x10, 0x1A, 0x0,
+0x3, 0x18, 0x4, 0xCB, 0x14, 0xD3, 0x10, 0x4, 0xD3, 0x93, 0xB, 0x9, 0x0, 0xE0, 0x0, 0x1, 0xDB, 0x9C, 0xB, 0x33, 0xA, 0x9F, 0x2A, 0xEB, 0x9A, 0xB, 0x4F, 0x99, 0xB, 0x3F, 0x6, 0x4, 0xB3, 0x4, 0x28, 0x80,
+0x88, 0x12, 0x93, 0xEB, 0x1B, 0x13, 0x4, 0x80, 0x48, 0x48, 0xE2, 0x6, 0x53, 0xCA, 0x92, 0x10, 0x27, 0x30, 0x53, 0xE2, 0x86, 0xB, 0x1B, 0x4A, 0x6, 0x8, 0x98, 0x2, 0x3B, 0x32, 0x1B, 0x27, 0x40, 0x46, 0x32,
+0x23, 0x4, 0x8, 0x80, 0xE1, 0x90, 0x5, 0x1, 0x4, 0xE0, 0x1F, 0x48, 0xC4, 0xE3, 0xA4, 0x2, 0x27, 0xC, 0x8, 0x10, 0x88, 0xE4, 0xF0, 0x23, 0x80, 0x23, 0xB2, 0x8B, 0x7, 0xE0, 0x8, 0xB0, 0x88, 0xE4, 0xF0,
+0x4B, 0xF0, 0x4B, 0xF0, 0x4B, 0xE0, 0xF0, 0x4B, 0x10, 0x4B, 0x10, 0x9F, 0xD7, 0xFF, 0xFF, 0x5A, 0x8, 0x16, 0x30, 0x93, 0xE2, 0x1B, 0xFF, 0x6, 0x0, 0xAF, 0x9, 0xDB, 0x4A, 0x2A, 0x56, 0x18, 0x80, 0x63,
+0xE6, 0x32, 0xD3, 0xE, 0x20, 0x63, 0xE, 0x2, 0xE0, 0x1F, 0xE8, 0xCE, 0xE3, 0xAE, 0x2, 0xD7, 0xAE, 0x18, 0x22, 0x82, 0xE0, 0xF0, 0x23, 0x80, 0x23, 0x42, 0x84, 0xE0, 0x1C, 0xAE, 0x62, 0x86, 0xF0, 0x23,
+0x90, 0x47, 0x0, 0xD3, 0xAE, 0xC2, 0x2, 0x8C, 0xE0, 0x56, 0x18, 0xA8, 0xE8, 0x10, 0x7B, 0xE0, 0xAC, 0x0, 0x8B, 0x5, 0x5, 0xFF, 0x6, 0x0, 0x8F, 0xD, 0x76, 0xCA, 0x41, 0xB1, 0xC, 0x9F, 0xA, 0x1, 0x43, 0x5,
+0x3B, 0x4A, 0x16, 0x48, 0x80, 0xF7, 0x50, 0xC6, 0x33, 0x67, 0xC, 0x20, 0xF7, 0xC, 0xE0, 0x1F, 0xC8, 0x13, 0xCC, 0xE3, 0xAC, 0x3, 0x6B, 0x90, 0x6, 0x40, 0xB, 0x90, 0x9B, 0x9F, 0xF0, 0x2B, 0xE3, 0xAC, 0x0,
+0x9B, 0x60, 0x2B, 0x1, 0x57, 0xF0, 0x2B, 0x80, 0x57, 0x1, 0xE2, 0x8E, 0xE0, 0x16, 0x48, 0xA8, 0xE8, 0x10, 0x7F, 0xFF, 0x60, 0x5F, 0x3, 0xD7, 0xF0, 0x33, 0x80, 0x8B, 0x1, 0x1B, 0x60, 0x8B, 0x1, 0x7, 0xF0,
+0x2B, 0xFA, 0x80, 0xB7, 0x1, 0xD7, 0x60, 0xB7, 0x40, 0x6B, 0x10, 0xF3, 0xC2, 0x1, 0x97, 0xA, 0xC4, 0x1, 0x97, 0x7, 0x3F, 0xCA, 0xFF, 0xFE, 0x2, 0x67, 0xB8, 0x85, 0x44, 0xE1, 0x54, 0x5F, 0x9B, 0x0, 0x4,
+0x24, 0x5F, 0xFF, 0x28, 0x29, 0xC4, 0xE3, 0x54, 0x53, 0xB2, 0x4, 0x6F, 0xA4, 0x1A, 0x24, 0x5F, 0x37, 0xE1, 0x2, 0x2, 0x77, 0xC, 0x73, 0xBA, 0xF0, 0x2F, 0x30, 0x2F, 0x14, 0x93, 0xCA, 0x14, 0x9F, 0x40,
+0x2F, 0xE0, 0xE8, 0x4, 0xDF, 0xE6, 0x0, 0x63, 0x1, 0x8, 0x43, 0xA0, 0xE3, 0x4C, 0x5, 0x8F, 0x4, 0x0, 0x4, 0xA0, 0xA, 0xE3, 0xF, 0x3, 0x5F, 0xC0, 0xE3, 0x0, 0xF0, 0x29, 0x81, 0x1D, 0x87, 0xE3, 0x34, 0x1,
+0x84, 0xE5, 0x34, 0x5, 0xAB, 0x41, 0x28, 0x0, 0x7, 0x3C, 0x6, 0x9F, 0xE5, 0x20, 0x0, 0xF, 0x44, 0x8, 0xE, 0x8B, 0x4, 0x0, 0x84, 0xD, 0x43, 0xA0, 0xE3, 0x5, 0x8, 0x2, 0x84, 0xE5, 0x81, 0xE, 0x9B, 0x0,
+0x0, 0x7, 0x89, 0x10, 0x17, 0xB4, 0x0, 0xC4, 0xD, 0x9B, 0x8F, 0xE2, 0x18, 0x1F, 0x2, 0x81, 0x48, 0x82, 0x49, 0x1, 0x80, 0x0, 0x3, 0xC9, 0x0, 0x0, 0x28, 0x0, 0xD1, 0x81, 0x49, 0x81, 0x48, 0x0, 0x1, 0x62,
+0x2, 0xB4, 0x0, 0xF0, 0xC9, 0xFC, 0x0, 0x80, 0x4F, 0x20, 0xBC, 0x28, 0x88, 0x69, 0x88, 0x0, 0x79, 0x81, 0x7E, 0x49, 0x0, 0x22, 0x2E, 0x1C, 0x8, 0xC, 0x35, 0x0, 0x28, 0xF, 0x13, 0x21, 0xE, 0xE0, 0x0, 0x10,
+0xCD, 0x0, 0x2C, 0x5, 0xD0, 0xA4, 0x19, 0x0, 0xA4, 0x79, 0x0, 0x2C, 0x1, 0xD0, 0xA, 0x80, 0x0, 0x2, 0x31, 0x1, 0x32, 0x1, 0x38, 0xF3, 0xD1, 0x0, 0x74, 0x48, 0x9, 0x1A, 0x49, 0x8, 0xB9, 0x81, 0x0, 0x73,
+0x49, 0x74, 0x4A, 0x4A, 0x60, 0x74, 0x48, 0x40, 0x8, 0x0, 0x3, 0x74, 0x49, 0x75, 0x4A, 0x8, 0x23, 0x0, 0x14, 0x24, 0x10, 0x80, 0x2, 0x32, 0x1, 0x3B, 0x0, 0xFB, 0xD1, 0x40, 0x1A, 0x8, 0x23, 0x1, 0x3C,
+0x0, 0xF7, 0xD1, 0x70, 0x48, 0x71, 0x49, 0x71, 0x4A, 0x0, 0x10, 0xDF, 0x71, 0x48, 0x72, 0x49, 0x90, 0x22, 0x10, 0x52, 0x0, 0xB, 0x0, 0x9, 0x71, 0x49, 0xC, 0x22, 0x80, 0x10, 0x7, 0x80, 0x21, 0x1, 0x80,
+0x2, 0x30, 0x1, 0x10, 0x31, 0x10, 0x22, 0x20, 0x7, 0x3A, 0xFB, 0xD1, 0x6D, 0x81, 0x0, 0xA3, 0xB, 0x22, 0x82, 0x21, 0x1E, 0x30, 0x40, 0x19, 0x68, 0x23, 0x20, 0x21, 0x0, 0x4F, 0x67, 0x0, 0xBD, 0x1, 0x3A,
+0xF1, 0x10, 0xD1, 0x66, 0x49, 0x10, 0x1B, 0x1, 0x31, 0x2, 0x30, 0xA0, 0x70, 0x35, 0x62, 0x0, 0xD9, 0x5D, 0x49, 0x62, 0x48, 0x1, 0x0, 0x22, 0x52, 0x2, 0x61, 0x4C, 0x8, 0xC9, 0x1B, 0x0, 0x19, 0x8, 0xC0,
+0x1, 0x3A, 0xFA, 0xD1, 0x5F, 0x2, 0x48, 0x60, 0x49, 0x1, 0x60, 0x60, 0x0, 0x5, 0x10, 0xD0, 0x0, 0x6F, 0x10, 0x7, 0x8, 0x20, 0x7, 0x1, 0x21, 0x49, 0x2, 0x10, 0x80, 0x22, 0x6, 0x0, 0x23, 0xFC, 0xD1, 0x40,
+0x4F, 0x0, 0x1, 0x20, 0x80, 0x2, 0xF8, 0x80, 0x38, 0x81, 0x0, 0x2, 0x20, 0x2, 0x21, 0xD, 0xA2, 0x0, 0xF0, 0x1, 0x94, 0xF9, 0x2, 0x20, 0x4, 0x21, 0xE, 0x0, 0x9, 0x45, 0x8F, 0x0, 0x9, 0x6, 0x21, 0x10, 0x0,
+0x13, 0x8A, 0x0, 0x13, 0x10, 0x8, 0x21, 0x11, 0x0, 0x1D, 0x85, 0xF9, 0xFF, 0x21, 0x0, 0xB9, 0x73, 0x0, 0xF0, 0xD1, 0xF9, 0x0, 0xF0, 0x40, 0x8C, 0x0, 0x3, 0x97, 0xF9, 0x1F, 0xE0, 0x4D, 0x75, 0x8, 0x73,
+0x69, 0x63, 0x3A, 0x7, 0xBE, 0x20, 0x2D, 0x2D, 0x0, 0x0, 0x0, 0xC0, 0x46, 0x45, 0x66, 0x66, 0x65, 0x30, 0x63, 0x74, 0x10, 0x10, 0x30, 0xF, 0x54, 0x65, 0x6D, 0x70, 0x42, 0x6F, 0x0, 0x1F, 0x31, 0x30, 0x30,
+0x25, 0x10, 0x1F, 0x50, 0x8, 0x69, 0x74, 0x63, 0x68, 0x80, 0xF, 0x5, 0xDF, 0x3C, 0x30, 0x48, 0x3C, 0x1, 0x9D, 0x10, 0x7, 0x0, 0x88, 0xC5, 0x43, 0x0, 0x3C, 0x88, 0x3D, 0x80, 0x26, 0x1C, 0x2E, 0x40, 0x0,
+0x6E, 0x40, 0xF0, 0x9, 0x1, 0xD3, 0x0, 0xF0, 0x8, 0xAC, 0xF8, 0x30, 0xA, 0x10, 0x7, 0xB0, 0xF8, 0x30, 0x0, 0x1C, 0x34, 0x49, 0x0, 0xF0, 0x6D, 0xF8, 0x20, 0x8, 0x1C, 0x28, 0x40, 0x33, 0x0, 0x9, 0x68, 0xF8,
+0x28, 0x2, 0x1C, 0x20, 0x40, 0x60, 0x40, 0x31, 0x0, 0x15, 0x62, 0x8, 0xF8, 0x0, 0xF0, 0x50, 0x0, 0x95, 0x84, 0xF9, 0xB8, 0x40, 0x7B, 0x1, 0xC1, 0xD0, 0x0, 0xF0, 0x3C, 0xF9, 0x0, 0x20, 0x20, 0xB8, 0x0,
+0xAB, 0x4, 0xFC, 0xD1, 0xE7, 0xD4, 0x50, 0x1D, 0xA, 0x93, 0x50, 0xA, 0x20, 0x2, 0x0, 0x4, 0x14, 0x0, 0x40, 0x0, 0x0, 0xFC, 0x33, 0x0, 0x2, 0x0, 0x0, 0x34, 0x0, 0x8, 0xBC, 0x1E, 0x0, 0x3, 0x58, 0x90, 0xA,
+0xD7, 0x88, 0x52, 0x1A, 0x2B, 0x0, 0x5, 0x60, 0x5D, 0xB, 0xFF, 0x7F, 0x0, 0x0, 0x0, 0x3, 0x7C, 0xA, 0x35, 0xF, 0x54, 0x2, 0x48, 0x51, 0x0, 0x3, 0x54, 0x0, 0x5, 0x83, 0x4, 0x12, 0x0, 0x6, 0xE0, 0x0, 0x2B,
+0x54, 0x3, 0x5, 0x8F, 0x10, 0x1A, 0x0, 0x6, 0xE8, 0x0, 0x37, 0x5, 0x83, 0x4, 0x2, 0x4D, 0x6, 0x54, 0x80, 0xF, 0x7C, 0x82, 0xF, 0x80, 0x80, 0x5, 0x94, 0x80, 0xC, 0x8A, 0xA, 0x6D, 0x30, 0x0, 0x6, 0xA, 0xFC,
+0x10, 0x10, 0x6E, 0x4A, 0x8, 0x35, 0x8, 0x8, 0x14, 0x10, 0x3F, 0x0, 0x1, 0x6, 0x4B, 0x34, 0x10, 0x47, 0x2, 0x0, 0xF, 0xE2, 0x0, 0xF, 0x82, 0xA, 0xAB, 0x80, 0xF, 0x68, 0x30, 0x1, 0x0, 0x4, 0x77, 0x1B,
+0x0, 0x28, 0x3, 0x8F, 0x0, 0x3, 0xA1, 0x0, 0x7, 0x30, 0xB5, 0x4, 0x0, 0x1C, 0xD, 0x1C, 0x60, 0x8, 0x2, 0xD3, 0x0, 0x2, 0x20, 0x0, 0xF0, 0x10, 0xF8, 0xA0, 0x0, 0x9, 0x1, 0x80, 0x0, 0x9, 0xB, 0xF8, 0xA0,
+0x9, 0x2, 0xD3, 0x2, 0x8A, 0x0, 0x13, 0x6, 0xF8, 0x60, 0x0, 0x9, 0x3, 0x0, 0x1D, 0x1, 0x0, 0xF8, 0x30, 0xBD, 0x28, 0x47, 0x1, 0x21, 0xB9, 0x0, 0x74, 0xF8, 0x74, 0x0, 0x21, 0x3A, 0x7C, 0x52, 0x0, 0x0,
+0x7A, 0x44, 0x97, 0x46, 0x41, 0xE0, 0x54, 0x0, 0xE0, 0x63, 0xE0, 0x89, 0xE0, 0xB9, 0x7C, 0x0, 0x0, 0x29, 0x4, 0xD0, 0xF9, 0x7C, 0x88, 0x42, 0x1, 0x0, 0xD1, 0x1, 0x21, 0xEF, 0xE7, 0x70, 0x47, 0x79, 0xB0,
+0x10, 0x11, 0xD1, 0x30, 0x11, 0x1, 0x19, 0x74, 0x70, 0x47, 0x38, 0x0, 0x7C, 0x1, 0x38, 0x0, 0xD5, 0x3, 0x20, 0x38, 0x40, 0x82, 0x60, 0xF, 0x30, 0x3, 0x28, 0xF7, 0xDD, 0x0, 0x0, 0x20, 0xF5, 0xE7, 0x0,
+0x2A, 0x3, 0xD5, 0x0, 0x10, 0x20, 0x78, 0x74, 0x10, 0x27, 0x1, 0x29, 0xFC, 0xD0, 0x0, 0x7, 0x21, 0x79, 0x74, 0x1, 0x28, 0x2, 0xDC, 0x0, 0x0, 0xD0, 0x9F, 0x46, 0xA7, 0x46, 0xB9, 0x5B, 0x0, 0x3, 0x28, 0x3,
+0xD0, 0x1, 0x39, 0x5, 0xD5, 0x0, 0x11, 0x1C, 0x3, 0xE0, 0x1, 0x31, 0x91, 0x42, 0x0, 0x0, 0xDD, 0x0, 0x21, 0xB9, 0x53, 0xB8, 0x7B, 0x0, 0x28, 0x43, 0xB8, 0x73, 0x70, 0x47, 0x70, 0xB5, 0x0, 0x7A, 0x89,
+0x1, 0x3A, 0x3, 0xA3, 0x5, 0xA4, 0x0, 0x1, 0x25, 0x2, 0x26, 0xFF, 0xF7, 0xD8, 0xFF, 0x0, 0x70, 0xBD, 0x0, 0x20, 0xF8, 0x73, 0x78, 0x88, 0x2, 0x0, 0x21, 0xB5, 0x4B, 0x18, 0x47, 0x10, 0xB, 0xB4, 0x28, 0x48,
+0x0, 0x0, 0x27, 0xBA, 0x20, 0x27, 0xB2, 0x4C, 0x2, 0x28, 0x25, 0x4, 0x0, 0x27, 0xC4, 0x0, 0x27, 0xB0, 0x49, 0xB8, 0x2, 0x88, 0x40, 0x0, 0x8, 0x58, 0xAF, 0x10, 0x27, 0xB5, 0x0, 0x0, 0x28, 0x2, 0xD1, 0xB8,
+0x74, 0x78, 0x74, 0x0, 0x0, 0xBD, 0xFA, 0x88, 0x2, 0x28, 0x7, 0xD0, 0x1, 0xC, 0xDC, 0x0, 0x29, 0xF8, 0xD1, 0x7, 0x0, 0x99, 0x0, 0x1, 0x22, 0x92, 0x2, 0xC, 0xE0, 0x4, 0x3A, 0x8, 0x50, 0xA, 0x7, 0xD1, 0x12,
+0xFB, 0x4, 0xE0, 0x4, 0x0, 0x32, 0xD0, 0xA, 0x1, 0xD0, 0x1, 0x22, 0xD2, 0x40, 0x2, 0x10, 0xB9, 0xFA, 0x80, 0xB8, 0x7B, 0x4, 0x21, 0x40, 0x8, 0x0, 0x8F, 0x10, 0x1C, 0x0, 0xF0, 0x6B, 0xFC, 0x27, 0x0, 0xBD,
+0x90, 0x4D, 0x3A, 0x89, 0xF0, 0x4D, 0xF0, 0x4D, 0x70, 0x4D, 0x5, 0x3A, 0x81, 0xB8, 0x7B, 0x8, 0x60, 0x4D, 0x5D, 0x0, 0x4D, 0x0, 0x49, 0x1, 0x40, 0x18, 0x40, 0x0, 0x87, 0x49, 0x4, 0x9, 0x18, 0x1, 0xE0,
+0x8, 0x4, 0x1D, 0x10, 0x78, 0x0, 0x1, 0x32, 0x0, 0x28, 0xF9, 0xD1, 0x70, 0x47, 0x0, 0x10, 0xB4, 0x1, 0x24, 0x64, 0x2, 0x80, 0x48, 0x80, 0x4, 0x67, 0x4A, 0x8, 0xC8, 0x9B, 0x18, 0x8, 0xC1, 0x0, 0x1, 0x3C,
+0xFA, 0xD1, 0x10, 0xBC, 0x70, 0x47, 0x4C, 0x78, 0x1, 0x71, 0x3, 0xD4, 0x0, 0xCD, 0x4, 0x85, 0xB8, 0x74, 0x10, 0x7B, 0x48, 0x30, 0x1, 0xB7, 0x12, 0x1, 0x89, 0x18, 0x8, 0x1, 0x80, 0x79, 0x4A, 0x0, 0x5,
+0x81, 0x3C, 0x21, 0x0, 0xBA, 0x7C, 0x0, 0x2A, 0x0, 0xD0, 0x1, 0x31, 0x40, 0x41, 0x3, 0xE5, 0x41, 0x81, 0x0, 0x21, 0x81, 0x80, 0x0, 0x1, 0x21, 0x9, 0x3, 0x81, 0x81, 0x70, 0x47, 0x0, 0x64, 0x22, 0x50, 0x43,
+0xFF, 0x30, 0xFF, 0x30, 0x0, 0x80, 0xA, 0xA, 0x1C, 0xA, 0x21, 0x6, 0xDF, 0x0, 0x30, 0x31, 0x91, 0x80, 0xA, 0x28, 0x6, 0xDB, 0x80, 0x30, 0xB, 0x51, 0x80, 0x30, 0x30, 0x10, 0x80, 0x3, 0x0, 0xE0, 0x30, 0x30,
+0x50, 0x80, 0x0, 0x20, 0x10, 0x0, 0x80, 0x70, 0x47, 0xF0, 0xB5, 0xBC, 0x7B, 0x64, 0x2, 0x8, 0x6, 0xD3, 0x78, 0x89, 0x0, 0x1, 0xAB, 0x78, 0x1, 0x88, 0x61, 0x49, 0xFF, 0xF7, 0xE2, 0xFF, 0x10, 0x11, 0x45,
+0xB8, 0x20, 0x11, 0xB8, 0x88, 0x5E, 0x0, 0x11, 0xD9, 0x0, 0x11, 0x5, 0x3, 0xD3, 0xF8, 0x88, 0x5C, 0x0, 0x1D, 0xCE, 0x20, 0xB, 0x10, 0x38, 0x89, 0x5A, 0x0, 0x29, 0xC8, 0xFF, 0xF0, 0xBD, 0x8, 0xC0, 0x46,
+0x1, 0x3, 0x9, 0x9B, 0x12, 0x90, 0xE5, 0x40, 0x21, 0x0, 0xE3, 0x2, 0x2C, 0x80, 0xE2, 0xB2, 0x10, 0x6, 0xC2, 0xE1, 0xB8, 0x20, 0x50, 0x1D, 0x8B, 0x0, 0x7, 0x40, 0x91, 0x8, 0xFF, 0x11, 0xE3, 0xA, 0xF3,
+0x1A, 0x34, 0x1, 0x1D, 0xAF, 0xE0, 0x5, 0x83, 0x1D, 0xAF, 0xF, 0xAB, 0x5, 0x24, 0xA0, 0xE3, 0x6, 0xA1, 0xB, 0x3, 0x24, 0x2F, 0x7B, 0x80, 0xE5, 0x1F, 0x1B, 0xD, 0xEF, 0xB0, 0x0, 0x3B, 0x18, 0x0, 0x27,
+0x1D, 0xAF, 0x20, 0x21, 0x90, 0xE5, 0x45, 0x80, 0xF, 0x7, 0x3, 0x0, 0x52, 0x1E, 0xEF, 0xA, 0x2E, 0xF7, 0xAB, 0xC, 0xD3, 0xC6, 0x9, 0xF, 0xC4, 0x9, 0x13, 0xD0, 0x9, 0x17, 0x1D, 0xEB, 0x42, 0x84, 0x9, 0x1F,
+0x54, 0x40, 0x9F, 0xE5, 0xA, 0x47, 0xEB, 0x9C, 0xC, 0xDB, 0xE1, 0xDC, 0x19, 0xEF, 0xB, 0xCB, 0xA, 0xB7, 0xEB, 0x4, 0x0, 0x10, 0x83, 0xE4, 0x1, 0x40, 0x84, 0xE0, 0x4, 0x84, 0xD, 0x93, 0xFA, 0xFF, 0xFF,
+0x8A, 0xB, 0xEB, 0xEB, 0xBC, 0xA0, 0xF, 0x5B, 0x13, 0x10, 0x5F, 0x41, 0x80, 0xE5, 0x28, 0x11, 0x83, 0x0, 0x63, 0x10, 0x81, 0xE3, 0x28, 0x11, 0x40, 0xB, 0x0, 0xAB, 0xB0, 0x1D, 0xBB, 0x20, 0x0, 0x17, 0x1F,
+0x67, 0x42, 0x4F, 0x4F, 0x54, 0x0, 0x4F, 0x4B, 0x41, 0x59, 0x42, 0x52, 0x53, 0x54, 0xA0, 0x13, 0x94, 0x20, 0x40, 0x3, 0xC8, 0x45, 0x0, 0x3, 0xC8, 0x5, 0x4A, 0x0, 0x3, 0x48, 0x4E, 0x0, 0x7, 0x3A, 0x0,
+0x7, 0x6E, 0x40, 0x24, 0x1B, 0x4, 0x5, 0x1, 0x4, 0x11, 0x10, 0x7, 0xE, 0x67, 0x5, 0x0, 0x0, 0x6, 0xC8, 0xFF, 0xE0, 0xFF, 0xC7, 0xFF, 0x0, 0xDF, 0xFF, 0xD0, 0xFF, 0xE8, 0xFF, 0xCA, 0xFF, 0x0, 0xE2, 0xFF,
+0xED, 0x23, 0x0, 0x3, 0xE9, 0x25, 0x9, 0x0, 0x3, 0x6F, 0x21, 0x34, 0x4F, 0x79, 0x1F, 0x9, 0xBB, 0x5D, 0x18, 0x4, 0xB, 0x20, 0x34, 0xF, 0x13, 0xF7, 0x10, 0x41, 0x96, 0x0, 0x13, 0x4, 0x16, 0x19, 0x0, 0x6,
+0x94, 0x0, 0x3, 0x14, 0x1A, 0x18, 0x0, 0x6, 0xB0, 0xE, 0xB7, 0x14, 0x67, 0x1, 0x0, 0x40, 0x38, 0xA2, 0x10, 0x9, 0xF3, 0x10, 0x73, 0x1, 0xC1, 0x21, 0xAF, 0x4A, 0x80, 0x26, 0x4D, 0x39, 0xFB, 0xD1, 0xAE,
+0x4A, 0x10, 0x60, 0x0, 0x70, 0x47, 0xAC, 0x48, 0x0, 0x68, 0x1, 0x21, 0x0, 0x40, 0x8, 0x1, 0xD3, 0x1, 0x31, 0xFB, 0xE7, 0x11, 0x11, 0x29, 0x0, 0x6, 0xA5, 0x8, 0x1C, 0x70, 0x3, 0x23, 0x0, 0x1, 0x21, 0x89,
+0x2, 0xA6, 0x4A, 0x7, 0xB4, 0x0, 0x68, 0x46, 0x0, 0xF0, 0x3, 0xF8, 0x3, 0xB0, 0x10, 0x8, 0xBC, 0x18, 0x3, 0x81, 0x4, 0x1C, 0xE5, 0x88, 0x20, 0xFF, 0x2D, 0x6, 0xCB, 0x25, 0x19, 0xE0, 0x0, 0x2D, 0x0, 0xB,
+0xD0, 0x29, 0x6, 0xC9, 0xD, 0x2, 0x39, 0x0, 0x9A, 0x48, 0x40, 0x5C, 0x0, 0x28, 0x10, 0xD0, 0x40, 0x28, 0x3, 0x13, 0x9C, 0xF8, 0x0, 0x28, 0xB, 0xD1, 0x0, 0xFF, 0xF7, 0xD2, 0xFF, 0x5, 0x1C, 0x7, 0xD0, 0x0,
+0x96, 0x48, 0x1, 0x78, 0x1, 0x31, 0x1, 0x70, 0x0, 0x9, 0x2, 0xD, 0x43, 0x2D, 0x4, 0x2D, 0xC, 0x40, 0x93, 0x5, 0x6B, 0x32, 0xF9, 0xFF, 0x28, 0x42, 0xDA, 0x0, 0x6, 0x1C, 0x0, 0x2D, 0xF, 0xD0, 0x8B, 0x49,
+0x0, 0x6A, 0x1E, 0x12, 0x6, 0x12, 0xE, 0x1, 0x23, 0x0, 0x93, 0x40, 0x52, 0x0, 0x89, 0x18, 0x42, 0x1C, 0x0, 0xA, 0x70, 0x2A, 0xA, 0x4A, 0x70, 0x86, 0x49, 0x0, 0xA, 0x68, 0x1A, 0x43, 0xB, 0x60, 0x88, 0x49,
+0x0, 0x9, 0x68, 0x1C, 0x22, 0x42, 0x43, 0x89, 0x18, 0x4, 0xC8, 0x22, 0xA, 0x74, 0x0, 0x0, 0x79, 0x2, 0x22, 0x0, 0x0, 0xE0, 0x4, 0x22, 0x4A, 0x74, 0x80, 0x22, 0x14, 0xCA, 0x75, 0x82, 0x0, 0x1D, 0x10, 0x0,
+0x1D, 0x8B, 0x18, 0x40, 0x80, 0x0, 0xC7, 0x21, 0x88, 0x89, 0x0, 0xC, 0x31, 0x0, 0x41, 0x58, 0x9, 0x18, 0x4A, 0x8A, 0x18, 0x31, 0x0, 0x19, 0x60, 0xA0, 0x88, 0x42, 0x43, 0x12, 0xA, 0x0, 0xDA, 0x60, 0x0,
+0x21, 0x59, 0x60, 0x20, 0x7A, 0x40, 0x79, 0x0, 0x49, 0x48, 0x43, 0x80, 0xA, 0x18, 0x72, 0x0, 0x60, 0x7A, 0x58, 0x72, 0x28, 0x1C, 0x70, 0xBC, 0x1A, 0x2, 0xBC, 0x8, 0x4, 0x33, 0x30, 0x7, 0x1, 0x0, 0xC7,
+0x0, 0x0, 0x29, 0xB, 0xD0, 0x20, 0x29, 0x9, 0xDC, 0x6F, 0x0, 0x4A, 0x53, 0x5A, 0x19, 0xA, 0x2, 0xA, 0x91, 0x0, 0x42, 0x3, 0xD1, 0x1B, 0x6, 0x1B, 0xE, 0x1, 0x44, 0x3B, 0x1, 0xF, 0x23, 0xDB, 0x43, 0x1,
+0x15, 0x21, 0x5F, 0x4, 0x4A, 0x40, 0x0, 0x11, 0x52, 0x11, 0x31, 0x81, 0x40, 0x2, 0x5D, 0x4A, 0x10, 0x68, 0x88, 0x43, 0x11, 0x45, 0x2, 0x0, 0xB5, 0xDB, 0x46, 0xFF, 0xF7, 0xDD, 0xFF, 0x2, 0x8, 0xBC, 0x6,
+0xD4, 0x5F, 0x1, 0x51, 0x41, 0x43, 0x89, 0x0, 0xA, 0x18, 0x1C, 0x1, 0xF0, 0x3C, 0xFC, 0x1, 0x22, 0xBC, 0x0, 0x0, 0x1D, 0xFF, 0xF7, 0xCF, 0x0, 0x1B, 0x2, 0x55, 0xD4, 0x10, 0x13, 0x39, 0x60, 0x13, 0xC5,
+0x60, 0x13, 0x5, 0x20, 0x27, 0x40, 0x1, 0x0, 0x27, 0xBB, 0xFF, 0x1, 0xBC, 0x14, 0xD4, 0x0, 0x1C, 0x21, 0x59, 0x43, 0x4A, 0x4A, 0x12, 0x68, 0x4, 0x52, 0x18, 0x2, 0x21, 0x51, 0x5, 0x87, 0x11, 0x74, 0x80,
+0x5, 0xFD, 0xE, 0x1, 0x38, 0xFF, 0xF7, 0xBE, 0xFF, 0x21, 0x0, 0x21, 0x10, 0x59, 0xF, 0xFC, 0x1, 0x20, 0x30, 0xBF, 0xD5, 0x20, 0xBD, 0x0, 0x61, 0x9E, 0x0, 0x39, 0xB, 0x20, 0x39, 0x3B, 0x70, 0x39, 0xB4,
+0x40, 0x35, 0xA3, 0x0, 0x55, 0x30, 0x87, 0x8B, 0x60, 0x87, 0xD2, 0xFB, 0xB1, 0x10, 0x9B, 0x81, 0x14, 0xDB, 0x7, 0xAD, 0x31, 0x49, 0x8, 0x2, 0xD, 0x0, 0xF0, 0xB5, 0x28, 0x4C, 0x24, 0x68, 0x26, 0x4E, 0x0,
+0x0, 0x25, 0x64, 0x8, 0xF, 0xD3, 0x77, 0x5D, 0x0, 0x1, 0x3F, 0xC, 0xD4, 0x38, 0x1C, 0x0, 0x21, 0x4, 0x1, 0xF0, 0xD7, 0xFB, 0x26, 0x2, 0x29, 0x1C, 0x21, 0x14, 0x79, 0x43, 0x40, 0x0, 0x93, 0x41, 0x6, 0x1B,
+0x1, 0x74, 0x1, 0x2, 0x35, 0x64, 0x8, 0xEC, 0xD2, 0xFB, 0x11, 0xEB, 0x15, 0xFE, 0xF0, 0xBC, 0x32, 0x1F, 0x18, 0x0, 0x3F, 0x16, 0x20, 0x3F, 0x0, 0x13, 0xD3, 0x70, 0x5D, 0x1, 0x38, 0x10, 0xD4, 0x40, 0x19,
+0x41, 0xA3, 0x89, 0x18, 0xA, 0x68, 0xD2, 0x17, 0x10, 0x8, 0xD0, 0x14, 0x61, 0xD1, 0x0, 0x20, 0x48, 0x74, 0x9, 0xC8, 0x75, 0x70, 0x55, 0x10, 0x47, 0xE8, 0xD2, 0x10, 0x4D, 0x0, 0xE5, 0xD2, 0xF8, 0xD1, 0x0,
+0x24, 0x1, 0x25, 0x0, 0x2D, 0x4, 0x5, 0x4E, 0x30, 0x78, 0x2, 0x36, 0x80, 0x9, 0x57, 0xD0, 0x2C, 0x43, 0x6D, 0x0, 0xF8, 0xD1, 0x0, 0x24, 0xC, 0x2, 0x48, 0x4, 0x60, 0x70, 0xBD, 0x50, 0x70, 0x7, 0x57, 0x90,
+0x7, 0x5B, 0xFF, 0x80, 0x0, 0x0, 0x40, 0x94, 0x7, 0x63, 0xD0, 0x9, 0x0, 0x3, 0x50, 0x5B, 0xAA, 0x3C, 0xE3, 0xB4, 0x7, 0x73, 0x6C, 0x7, 0x77, 0x6E, 0x7, 0x7B, 0x38, 0x0, 0x47, 0x8, 0x47, 0x10, 0x47, 0x18,
+0x47, 0x3A, 0x80, 0x20, 0xD7, 0xC0, 0x46, 0x0, 0xB5, 0x39, 0x4A, 0x20, 0x0, 0x21, 0x41, 0x58, 0x11, 0x60, 0x38, 0x4A, 0x1, 0x0, 0x69, 0x11, 0x60, 0xC1, 0x68, 0x51, 0x60, 0x41, 0x0, 0x68, 0x91, 0x60, 0x81,
+0x68, 0xD1, 0x60, 0x1, 0x8, 0xF0, 0x76, 0xFB, 0x33, 0x2, 0x67, 0x1, 0x20, 0x88, 0x8, 0x40, 0x1, 0x38, 0x32, 0x1, 0x9, 0x32, 0x48, 0x0, 0x8, 0xF0, 0x4C, 0xF9, 0x30, 0x0, 0x5, 0x51, 0xF9, 0x2F, 0x2, 0x48,
+0xFF, 0xF7, 0x6C, 0xFF, 0x2D, 0x0, 0x11, 0x74, 0x20, 0xF9, 0x2C, 0x0, 0x17, 0x8A, 0xF9, 0xFF, 0xF7, 0x5A, 0x50, 0xFE, 0x11, 0xD7, 0x29, 0x21, 0x33, 0x0, 0xB5, 0xF0, 0xB4, 0x1, 0x28, 0x4F, 0x1, 0xF0, 0xFE,
+0xFB, 0x27, 0x0, 0x5, 0x5, 0xFB, 0xFB, 0x27, 0x48, 0x27, 0x10, 0x4B, 0x60, 0x40, 0x7, 0x12, 0x70, 0x27, 0x48, 0x1, 0x3F, 0x70, 0x26, 0x0, 0x15, 0x8, 0x20, 0x60, 0x27, 0x1, 0x5D, 0x81, 0x79, 0x0, 0x29,
+0x22, 0x20, 0xD0, 0x23, 0x3, 0x77, 0x2A, 0x21, 0x45, 0x5A, 0x2C, 0x1, 0x21, 0x46, 0x5A, 0xAD, 0x1B, 0x0, 0x2D, 0xE, 0xB1, 0x0, 0x25, 0xA5, 0x42, 0x0, 0xDB, 0xB, 0xE0, 0x2C, 0x0, 0x21, 0x0, 0x27, 0x47,
+0x52, 0x64, 0x1B, 0x28, 0x24, 0x1C, 0x1C, 0x0, 0x55, 0xD3, 0xFB, 0x10, 0x5, 0xD0, 0xFB, 0x0, 0xE6, 0xE7, 0x2C, 0x21, 0x36, 0x19, 0x46, 0x52, 0x0, 0x20, 0x1C, 0x17, 0x49, 0x1, 0xF0, 0xBC, 0xFB, 0x45, 0xF0,
+0x22, 0xBD, 0x20, 0x1C, 0x13, 0x0, 0xD, 0xB5, 0x40, 0xD, 0x75, 0x98, 0x8, 0x73, 0x11, 0x3, 0x11, 0xF, 0x5C, 0x1, 0x13, 0xA8, 0x8, 0x83, 0xA8, 0x18, 0x6F, 0xAC, 0x8, 0x8B, 0xAF, 0x4, 0x3F, 0xAF, 0x26,
+0x0, 0x2A, 0x3, 0x3C, 0x1, 0x2B, 0x54, 0x1, 0x2F, 0x4C, 0x1, 0x33, 0x58, 0xAE, 0x1, 0x37, 0x4D, 0x1, 0x3B, 0xB8, 0x11, 0x2F, 0x1, 0x43, 0x1E, 0xF, 0x94, 0x80, 0xE, 0x1F, 0x7D, 0x4, 0x0, 0x3, 0x70, 0xB4,
+0x30, 0x80, 0x6, 0xF, 0x79, 0x43, 0x0, 0x22, 0x4, 0xC0, 0x1, 0x0, 0x39, 0xFC, 0xD1, 0x30, 0x1C, 0x28, 0x38, 0x28, 0x82, 0x1, 0xFD, 0xFF, 0x22, 0x42, 0x54, 0x28, 0x0, 0xF, 0x45, 0x80, 0x2, 0x27, 0x45,
+0x4E, 0x36, 0x78, 0x45, 0x4D, 0x46, 0xA0, 0x4, 0x41, 0x46, 0x3, 0xA5, 0x0, 0x22, 0xC3, 0x7D, 0x9B, 0x0, 0x9, 0xB3, 0x42, 0x4, 0xD1, 0x18, 0x23, 0xC2, 0x0, 0x50, 0x4, 0x3B, 0xFC, 0xD5, 0x25, 0x60, 0x1C,
+0x0, 0x30, 0x10, 0x34, 0x1, 0x39, 0xF2, 0xD1, 0x70, 0x8A, 0x6, 0xA5, 0x10, 0xB5, 0x3B, 0x4, 0x6B, 0x37, 0x3, 0xCF, 0x3A, 0x91, 0x2, 0xD9, 0x0, 0x24, 0x10, 0x2D, 0x0, 0xD1, 0xCC, 0x10, 0x23, 0x1, 0x31,
+0x1, 0x3A, 0xF7, 0xD1, 0x10, 0xBD, 0x0, 0x6B, 0x20, 0xB4, 0x34, 0x2, 0xF5, 0x13, 0x88, 0x9B, 0x0, 0xC, 0x10, 0x33, 0x9B, 0x18, 0xB, 0xA7, 0x18, 0x0, 0x68, 0x80, 0x1, 0x18, 0x4, 0xBC, 0x8, 0x30, 0x3, 0xE0,
+0x8, 0x31, 0x4, 0x22, 0x1, 0x21, 0xED, 0xE7, 0x11, 0x6F, 0x27, 0x4B, 0x0, 0x1A, 0x70, 0x0, 0x2A, 0x5, 0xD1, 0x2A, 0x4D, 0x0, 0x2A, 0x4E, 0x36, 0x68, 0x2A, 0x4F, 0x3F, 0x68, 0x20, 0x2, 0xE0, 0x10, 0xB,
+0x4, 0x27, 0x2E, 0x22, 0xA9, 0x4, 0x54, 0x4, 0x1C, 0x6C, 0x61, 0x13, 0xF, 0x63, 0x78, 0x0, 0xA2, 0x78, 0x9B, 0x0, 0x92, 0x0, 0x20, 0x1C, 0x0, 0xFF, 0x30, 0x15, 0x30, 0xA8, 0x60, 0xC0, 0x18, 0x2, 0xE8,
+0x60, 0x80, 0x18, 0x28, 0x61, 0x19, 0x5, 0xF3, 0x0, 0xF8, 0xE0, 0x79, 0x0, 0xF0, 0xD2, 0xF8, 0x60, 0x0, 0x79, 0x28, 0x71, 0x20, 0x79, 0x28, 0x76, 0x80, 0x0, 0x7, 0xC0, 0xF, 0x68, 0x76, 0xA0, 0x79, 0x68,
+0x0, 0x71, 0x1, 0x20, 0xA8, 0x71, 0x29, 0x21, 0x68, 0x8, 0x54, 0x0, 0xF0, 0xBE, 0xA, 0x1B, 0xF, 0x30, 0x3B, 0x0, 0x1C, 0xC, 0x34, 0x21, 0x78, 0x1, 0x70, 0x28, 0x0, 0x30, 0x1, 0x34, 0x1, 0x3B, 0xF9, 0xD1,
+0x20, 0x3, 0x34, 0xE4, 0x1B, 0x30, 0x1C, 0x2, 0x0, 0x17, 0x90, 0x15, 0x27, 0xF0, 0xBC, 0x13, 0xE9, 0x0, 0x0, 0x1F, 0x6B, 0x11, 0x53, 0x6, 0x7F, 0x7D, 0x80, 0x51, 0x87, 0x12, 0x97, 0x11, 0x63, 0x11, 0x77,
+0x11, 0x73, 0xF0, 0xA, 0x1B, 0x40, 0x60, 0x10, 0x23, 0xB5, 0x20, 0xB4, 0x39, 0x4D, 0x29, 0x6D, 0x20, 0xF, 0x97, 0x8, 0xF7, 0x0, 0x0, 0x77, 0x12, 0x69, 0x20, 0x20, 0x49, 0xE, 0x33, 0x49, 0x29, 0x20, 0xF,
+0xB7, 0xA, 0x73, 0x2, 0x95, 0x71, 0x3, 0x70, 0x47, 0x2F, 0x48, 0x80, 0x79, 0x50, 0x5, 0x53, 0xB3, 0x2, 0x2A, 0x49, 0x34, 0x22, 0x88, 0x52, 0x70, 0xF, 0x27, 0x94, 0x40, 0xF, 0x0, 0xB5, 0x3, 0xAB, 0x78,
+0x17, 0x9F, 0x23, 0x4D, 0x41, 0x24, 0x1, 0x13, 0x4, 0xE0, 0x20, 0x4D, 0x23, 0x1, 0x27, 0x71, 0x23, 0x1, 0x27, 0x10, 0x65, 0x10, 0xDD, 0xFF, 0xF7, 0xE, 0x24, 0x13, 0x0, 0x30, 0xB5, 0x19, 0x4D, 0x1, 0xB4,
+0xFF, 0xF7, 0x6A, 0x7, 0x14, 0x21, 0xA, 0xFB, 0x30, 0x23, 0xC7, 0x20, 0x5, 0xFD, 0xC9, 0x26, 0x2, 0x88, 0x9, 0x7F, 0x8, 0x1C, 0x1B, 0xD9, 0x0, 0x9, 0xDA, 0x11, 0x8, 0x1C, 0x14, 0x4, 0x23, 0xD, 0x4D, 0xF,
+0x22, 0xCF, 0x23, 0xE8, 0x79, 0x3B, 0xF, 0x31, 0xF8, 0x20, 0xF0, 0x31, 0x60, 0x31, 0x7F, 0x9, 0x4, 0x55, 0x30, 0x1F, 0x12, 0x63, 0x10, 0xF7, 0x12, 0x6F, 0x10, 0xFB, 0x51, 0xB, 0x50, 0x44, 0x3, 0xBB, 0x48,
+0x11, 0x13, 0xB5, 0x12, 0x49, 0x0, 0x1, 0x20, 0x8, 0x70, 0xFF, 0xF7, 0xA0, 0xFF, 0x34, 0x4B, 0x0, 0xFF, 0x20, 0xA8, 0x76, 0x0, 0x20, 0xE8, 0x76, 0x0, 0x70, 0x47, 0xE8, 0x71, 0xB, 0x49, 0x9, 0x78, 0x6,
+0x0, 0x29, 0xC, 0xD1, 0xA, 0x6, 0xD, 0x15, 0x5B, 0x9, 0x80, 0xB, 0xD3, 0x6, 0xDF, 0x40, 0x8, 0x40, 0x0, 0x2A, 0x4, 0x21, 0x68, 0x52, 0x2C, 0x21, 0x3, 0xE1, 0x3, 0x95, 0xCD, 0x8, 0xBD, 0x10, 0xD, 0x70,
+0x47, 0x12, 0xD3, 0x10, 0x57, 0x24, 0x1, 0x8B, 0x0, 0x0, 0xB5, 0xA8, 0x70, 0x69, 0x69, 0xB, 0x1C, 0x2, 0x4C, 0x31, 0x9, 0x5C, 0xFE, 0x29, 0xA, 0xB5, 0x30, 0x1, 0xF6, 0xE7, 0xFF, 0x29, 0x16, 0xD1, 0x2E,
+0x1, 0x75, 0x0, 0x1, 0x28, 0x0, 0xDA, 0xA, 0xE0, 0xFF, 0xF7, 0x4, 0x67, 0xFF, 0x2B, 0x20, 0x22, 0x12, 0x93, 0x2A, 0x3, 0x33, 0xD0, 0x21, 0x0, 0x69, 0x8, 0xD1, 0xFD, 0xA8, 0x0, 0xDF, 0x7, 0xB, 0x0, 0xBD,
+0x68, 0x69, 0x0, 0x7A, 0xDD, 0xE7, 0x8, 0x0, 0x1C, 0x29, 0x69, 0x80, 0x0, 0x9, 0x58, 0xC9, 0x0, 0x18, 0xA, 0x78, 0xEA, 0x70, 0x0, 0x22, 0x2A, 0x0, 0x80, 0x2A, 0x77, 0x6A, 0x77, 0x24, 0x20, 0x1, 0x1, 0x31,
+0x29, 0x50, 0x20, 0x20, 0x29, 0x50, 0x1, 0xBB, 0x3, 0x77, 0xE8, 0x77, 0x0, 0xBD, 0x13, 0x1, 0xA5, 0x1E, 0xB, 0x4, 0x70, 0x47, 0x11, 0x48, 0x12, 0xD, 0x27, 0x12, 0x48, 0x50, 0x4, 0x3, 0xFB, 0xC, 0xD, 0x1D,
+0x1, 0x70, 0x0, 0xB5, 0x10, 0xB, 0x48, 0xF, 0x5, 0x65, 0x2A, 0x21, 0x41, 0x5A, 0x0, 0x2C, 0x22, 0x83, 0x5A, 0x49, 0x0, 0x5B, 0x18, 0x0, 0x83, 0x52, 0x1B, 0xC, 0x6, 0xD0, 0x8, 0xB4, 0x40, 0xA, 0x9, 0x45,
+0xA7, 0xFD, 0x8, 0xBC, 0x1, 0x3B, 0xF, 0xF8, 0xDC, 0x0, 0xBD, 0x13, 0xC7, 0x13, 0x97, 0x12, 0x27, 0x13, 0xAF, 0xF1, 0x12, 0x2B, 0x13, 0xAF, 0x13, 0xA3, 0x13, 0x9B, 0x45, 0x46, 0x29, 0x7, 0x53, 0x0, 0x6A,
+0x79, 0x91, 0x42, 0x7, 0xDB, 0x2A, 0x7F, 0x0, 0x0, 0x2A, 0x2, 0xD0, 0x1, 0x3A, 0x2A, 0x77, 0x20, 0x1, 0xE0, 0x5, 0xA7, 0xE0, 0x29, 0x70, 0x30, 0xE0, 0x60, 0x6A, 0x0, 0x13, 0xB, 0x47, 0x3A, 0x6A, 0x77,
+0x0, 0xD0, 0x0, 0xF6, 0xE7, 0x29, 0x70, 0xA9, 0x7E, 0xFF, 0x29, 0x0, 0xC, 0xD0, 0xFF, 0x22, 0xAA, 0x76, 0x8, 0x1C, 0x0, 0xFF, 0xF7, 0x76, 0xFF, 0xE9, 0x7E, 0x0, 0x29, 0x80, 0x2, 0x6F, 0x22, 0xEA, 0x76,
+0x0, 0xF0, 0xBF, 0xFC, 0x0, 0x18, 0xE0, 0x28, 0x23, 0xE9, 0x5C, 0x0, 0x29, 0x0, 0x8, 0xD0, 0x0, 0x21, 0xE9, 0x54, 0xA9, 0x7F, 0x0, 0x69, 0x70, 0x20, 0x23, 0xE9, 0x58, 0x24, 0x23, 0x5, 0xE9, 0x50, 0xB,
+0xE0, 0x69, 0x7, 0xBB, 0xEA, 0xA, 0x81, 0x40, 0x91, 0x3, 0xD5, 0xA8, 0x78, 0x1, 0x30, 0xFF, 0xF7, 0x1, 0x57, 0xFF, 0x0, 0xE0, 0x69, 0x70, 0x4, 0xB, 0x65, 0x0, 0x0, 0x0, 0xF0, 0x7, 0xBD, 0xE8, 0x1, 0x0,
+0x24, 0xBD, 0xE8, 0x19, 0x7B, 0x9C, 0x27, 0x38, 0xCF, 0x2, 0x3, 0xE2, 0xC, 0xE0, 0x8, 0xC7, 0xC, 0x8C, 0x8, 0x9, 0xA, 0x9, 0xC5, 0x0, 0x6C, 0x0, 0x1C, 0xBD, 0x9, 0x8E, 0xD, 0x30, 0x1E, 0xC, 0xB5, 0x4,
+0x5, 0x38, 0x2, 0x2, 0x0, 0x21, 0x10, 0x1F, 0xC, 0xD9, 0xD, 0x0, 0xE, 0x80, 0xD, 0xCF, 0x42, 0x46, 0x12, 0x7E, 0x12, 0x9, 0x1, 0x0, 0xD2, 0x43, 0x4A, 0x0, 0xE0, 0x43, 0x4A, 0x12, 0x0, 0x5C, 0x1, 0x3A,
+0x5, 0xD3, 0x17, 0x32, 0x0, 0x80, 0x1, 0xB1, 0xB9, 0x5C, 0x79, 0x71, 0xB9, 0x54, 0x70, 0x0, 0x47, 0x40, 0x46, 0x2, 0x78, 0x40, 0x69, 0x0, 0x0, 0x79, 0x0, 0x9, 0xF8, 0x78, 0x0, 0xD3, 0x86, 0x0, 0xE0, 0x40,
+0x28, 0xC, 0xDD, 0x54, 0x28, 0xE, 0x0, 0xDD, 0x68, 0x28, 0x24, 0xDD, 0x7C, 0x28, 0x2E, 0x0, 0xDD, 0xC0, 0x28, 0x4A, 0xDD, 0xCA, 0x28, 0x52, 0x5, 0xDD, 0xD4, 0x28, 0x70, 0xDD, 0x8, 0xBF, 0x2A, 0xB, 0xB,
+0x80, 0xC, 0x33, 0x0, 0x2A, 0xF8, 0xD1, 0xB9, 0x7B, 0x25, 0x1, 0x22, 0x4B, 0x28, 0x8, 0xDA, 0x41, 0x38, 0xB, 0x1F, 0x0, 0x5C, 0xB8, 0x54, 0x9, 0x18, 0x40, 0x29, 0x8, 0x2, 0xDB, 0x40, 0x21, 0x6, 0xE0,
+0x4B, 0x50, 0x11, 0x1A, 0x30, 0x0, 0xD2, 0xC, 0x69, 0x20, 0x2F, 0xE0, 0xD0, 0xB9, 0x7B, 0x0, 0x5F, 0x28, 0x2, 0xDA, 0x25, 0x22, 0x55, 0x38, 0x0, 0xE6, 0xE7, 0x25, 0x22, 0x5F, 0x38, 0xEC, 0xE7, 0x88, 0x6,
+0x3F, 0x2A, 0xF0, 0xD0, 0x9, 0x13, 0x1C, 0x10, 0x20, 0x0, 0x38, 0x58, 0x73, 0x29, 0x7, 0xDA, 0x69, 0x39, 0x1, 0x89, 0x0, 0x0, 0xD1, 0x79, 0x7E, 0x79, 0x1, 0x43, 0x4, 0xC7, 0xFB, 0x6, 0xE0, 0x73, 0x80,
+0xF, 0xD9, 0xFB, 0x0, 0x10, 0x22, 0xB9, 0x58, 0xB8, 0x50, 0x40, 0x1A, 0x20, 0x2D, 0x18, 0x24, 0x15, 0x2A, 0xB6, 0xD1, 0x80, 0x38, 0x0, 0x80, 0x0, 0xFF, 0x28, 0x0, 0xDB, 0xFF, 0x20, 0x20, 0xB8, 0x70, 0x26,
+0x8F, 0x2A, 0xFB, 0xD0, 0xC1, 0x38, 0x0, 0xA, 0x49, 0x8, 0x5C, 0x41, 0x46, 0x9, 0x7E, 0x8, 0x49, 0x8, 0x4, 0xD2, 0x16, 0xEB, 0xF8, 0x7D, 0xF8, 0x10, 0x75, 0x31, 0xE1, 0x16, 0xF5, 0x78, 0x7E, 0x78, 0x76,
+0x5, 0xF8, 0x75, 0x2B, 0xE1, 0xCB, 0x1, 0x57, 0xAC, 0x1, 0x5B, 0x21, 0xC, 0x29, 0x9, 0xBF, 0x1, 0x4, 0x8, 0x10, 0xE, 0x9A, 0x20, 0x80, 0xFF, 0x10, 0x8F, 0x4, 0xD0, 0xCB, 0x38, 0x1, 0x1, 0xD0, 0x80, 0x0,
+0x38, 0x73, 0x72, 0xE1, 0x9, 0xAF, 0x0, 0x28, 0x11, 0xD0, 0x50, 0x28, 0xB, 0xDD, 0x80, 0x0, 0x28, 0xF, 0xDB, 0xA0, 0x28, 0x2B, 0xDB, 0xC0, 0x0, 0x28, 0x35, 0xDB, 0xD0, 0x28, 0x43, 0xDB, 0xF0, 0x4, 0x28,
+0x4D, 0xDB, 0x72, 0xE0, 0x10, 0xBF, 0x1, 0xD1, 0x34, 0x10, 0x38, 0x1D, 0x45, 0x10, 0xCB, 0x8A, 0x0, 0xE3, 0x23, 0x23, 0x8, 0xFA, 0x5C, 0x70, 0x28, 0x9, 0x1E, 0x38, 0x3, 0xD1, 0x80, 0xC, 0xCB, 0x7, 0x0,
+0xF, 0x3, 0xE0, 0x12, 0x9, 0x0, 0x12, 0x1, 0x2, 0x43, 0xFA, 0x54, 0x76, 0xE7, 0x10, 0x70, 0x38, 0x2, 0x10, 0x15, 0x9, 0x5, 0xE0, 0x12, 0x8, 0x7, 0x12, 0xF, 0x0, 0x0, 0x15, 0x0, 0x9, 0xFA, 0x2A, 0x54,
+0x61, 0xD, 0xC1, 0xDD, 0x1, 0x4F, 0x24, 0x0, 0x3B, 0x90, 0x0, 0x28, 0x1, 0xDA, 0x80, 0x38, 0xE0, 0xE7, 0x90, 0x20, 0x38, 0xE9, 0x21, 0x1F, 0xB, 0xD0, 0xB0, 0x28, 0x4, 0x20, 0xDA, 0xA0, 0x0, 0xE7, 0x0,
+0xD0, 0x38, 0x73, 0x28, 0x8, 0xE1, 0xB0, 0x38, 0xC0, 0x0, 0x9, 0xF8, 0x72, 0x23, 0xC0, 0x0, 0x9D, 0x11, 0x3F, 0x7, 0xD1, 0xC0, 0x38, 0x0, 0x1, 0x70, 0xF0, 0x4, 0xD1, 0x11, 0x1, 0x91, 0x7, 0xBA, 0x78,
+0xBB, 0x7F, 0x0, 0xE0, 0x28, 0xE, 0xDA, 0xD0, 0x38, 0x1, 0xD1, 0x45, 0x18, 0x0, 0x71, 0x1B, 0x7, 0x1B, 0x0, 0x71, 0x3, 0x0, 0x71, 0x0, 0xBB, 0x77, 0x80, 0x0, 0x12, 0x1A, 0xF, 0xD2, 0x5, 0x0, 0x22, 0xD,
+0xE0, 0xE0, 0x0, 0x91, 0x18, 0x20, 0xA5, 0x18, 0x1B, 0x9, 0x1B, 0x0, 0x1D, 0x20, 0x1B, 0x18, 0xFF, 0x2A, 0x91, 0x1, 0x53, 0x22, 0xBA, 0x41, 0x53, 0x7, 0xD0, 0xF0, 0x0, 0x63, 0x0, 0x1, 0xD0, 0x25, 0x21,
+0x78, 0x54, 0x78, 0x5C, 0x10, 0x1, 0x1C, 0x8D, 0x6, 0x35, 0x0, 0xB5, 0x38, 0x79, 0x20, 0x79, 0x79, 0xC, 0x87, 0xFE, 0x40, 0x0, 0x4, 0xBC, 0x40, 0x96, 0x12, 0x69, 0x78, 0x0, 0x2A, 0x78, 0x44, 0x87, 0x0,
+0x46, 0x23, 0xE0, 0x1D, 0xE0, 0x22, 0xE0, 0x25, 0x2, 0xE0, 0x2E, 0xE0, 0x35, 0xE0, 0x34, 0xE, 0xDF, 0xC0, 0x0, 0xE0, 0x1A, 0xE0, 0xF4, 0xE0, 0x15, 0xE1, 0x1E, 0x0, 0xE1, 0x29, 0xE1, 0x2E, 0xE1, 0x35,
+0xE1, 0x13, 0x0, 0xE0, 0x43, 0xE1, 0x84, 0xE1, 0x9D, 0xE1, 0x4C, 0x0, 0xE2, 0x6F, 0xE2, 0x7C, 0xE2, 0x89, 0xE2, 0x9A, 0x0, 0xE2, 0x9D, 0xE2, 0x9E, 0xE2, 0x9F, 0xE2, 0xA2, 0x0, 0xE2, 0xAB, 0xE2, 0xAE,
+0xE2, 0xC0, 0x46, 0x3, 0x42, 0xD1, 0x2, 0x9F, 0xD0, 0x40, 0x46, 0x41, 0x5, 0x9F, 0x1, 0xA, 0xD1, 0x40, 0x46, 0x81, 0x4, 0xAB, 0x7, 0x0, 0x7, 0xC1, 0x23, 0x76, 0x81, 0x3, 0x71, 0x2, 0xD1, 0x81, 0xA, 0xF9,
+0x10, 0x13, 0x0, 0x0, 0xB5, 0xB8, 0x7B, 0x0, 0xF0, 0x20, 0xFB, 0x31, 0xB8, 0x73, 0x1A, 0xD, 0x18, 0x8B, 0x0, 0x23, 0x8, 0x1, 0x5B, 0x0, 0xE, 0x28, 0x5, 0xD1, 0x0, 0x2A, 0x25, 0xD1, 0x0, 0x9, 0x7, 0x9,
+0xF, 0x1, 0x23, 0x8, 0xE0, 0x14, 0xF, 0x28, 0x4, 0x0, 0xF, 0x1D, 0x30, 0xF, 0xE0, 0x0, 0x0, 0x2A, 0x18, 0xD0, 0x38, 0x79, 0x10, 0x22, 0x5, 0x0, 0x28, 0xB8, 0x58, 0x7, 0xD1, 0x0, 0x2B, 0x2, 0x0, 0xD1,
+0x0, 0xF0, 0x92, 0xFA, 0x9, 0xE0, 0x0, 0x4, 0xF0, 0xD3, 0xFA, 0x6, 0xE0, 0x30, 0xF, 0xA4, 0xFA, 0x80, 0x3, 0xF5, 0xF0, 0xC1, 0xFA, 0x10, 0x22, 0x39, 0x69, 0x28, 0x38, 0x61, 0x52, 0x6F, 0x10, 0x0, 0x8B,
+0x0, 0x7E, 0x40, 0xE0, 0xD, 0x93, 0x13, 0x3F, 0x2, 0xA3, 0x71, 0x79, 0x76, 0xF9, 0x75, 0x20, 0x5, 0xE0, 0x13, 0x4D, 0xF9, 0x7D, 0x79, 0x71, 0xF9, 0x40, 0x75, 0x1B, 0xDF, 0xF9, 0x7D, 0x2, 0xB4, 0x0, 0x2E,
+0x10, 0x1, 0xD1, 0xA, 0x1B, 0xD7, 0x7D, 0x1, 0x38, 0x41, 0x2, 0x46, 0x4A, 0x69, 0xC9, 0x68, 0x80, 0xF, 0x23, 0x80, 0x20, 0x18, 0x41, 0xB, 0x49, 0xFA, 0x79, 0x34, 0x4B, 0xFF, 0x0, 0xF7, 0x5E, 0xFB, 0x2,
+0xBC, 0x1, 0xB4, 0x3, 0x4, 0x1C, 0x10, 0x22, 0xB8, 0x58, 0x13, 0xA3, 0xD2, 0x8, 0x0, 0x19, 0xD3, 0x98, 0x42, 0x3, 0xDB, 0x9, 0xDC, 0x40, 0x1, 0x29, 0xF1, 0x0, 0xF0, 0x62, 0xFA, 0x2, 0xBC, 0x49, 0x88,
+0x4, 0x89, 0x8, 0x1C, 0x0, 0x61, 0xF0, 0x41, 0x20, 0xD, 0x1C, 0x0, 0xDC, 0x8, 0x0, 0x31, 0x53, 0x3, 0x15, 0xCD, 0x98, 0x42, 0x15, 0xA, 0xDB, 0x2, 0x60, 0x33, 0x48, 0x20, 0x33, 0xED, 0x0, 0x25, 0x5, 0xEB,
+0xE7, 0x0, 0xF0, 0x27, 0x20, 0x41, 0xE6, 0x0, 0x41, 0x2, 0xE4, 0xE7, 0xC, 0xD1, 0x8, 0x9, 0x32, 0xD5, 0x8, 0x0, 0x7, 0x5, 0xD0, 0x80, 0xE, 0x41, 0x46, 0x49, 0x2, 0x7E, 0x88, 0x40, 0xF8, 0x72, 0x0, 0x7,
+0xFF, 0x40, 0x0, 0x46, 0x1, 0x78, 0x40, 0x7E, 0x0, 0x28, 0x4, 0x21, 0xD0, 0x0, 0x1, 0x5D, 0x0, 0xB5, 0x79, 0x7B, 0x1, 0x7, 0x0, 0xB5, 0x38, 0x7B, 0x79, 0x7B, 0x9, 0x18, 0x9, 0x0, 0x6, 0x9, 0xE, 0x79,
+0x73, 0x9, 0x4A, 0x51, 0x1, 0x56, 0xF8, 0x7A, 0x41, 0x43, 0x9, 0x12, 0xC, 0x89, 0x0, 0x29, 0x2, 0xDB, 0x0, 0xF0, 0x13, 0xFA, 0x2, 0x0, 0xE0, 0x49, 0x42, 0x0, 0xF0, 0xF5, 0xF9, 0x5, 0x4B, 0x1C, 0x1B, 0x8B,
+0xC, 0xF, 0xA, 0x33, 0x37, 0x8, 0xDF, 0xA, 0x13, 0x80, 0xC, 0xC5, 0x20, 0xB8, 0x71, 0x0, 0x2E, 0x5, 0xD0, 0x3, 0xB8, 0x79, 0x1, 0x28, 0x13, 0xDC, 0x5, 0x47, 0x0, 0xF, 0xC0, 0xB, 0xCD, 0x0, 0x15, 0x28,
+0x1C, 0x9, 0x9, 0x2A, 0x1C, 0x82, 0x3, 0x75, 0xDB, 0x52, 0x19, 0x9, 0x1, 0xC, 0xD7, 0xB5, 0x1F, 0x0, 0xF0, 0xF2, 0x40, 0x43, 0x10, 0x35, 0x0, 0x1F, 0x1, 0xB5, 0x18, 0x8D, 0x40, 0x6, 0x7, 0x3D, 0xB2, 0xFF,
+0x6, 0xBC, 0x0, 0x2A, 0x18, 0xFF, 0xF7, 0xA, 0x2B, 0x67, 0x10, 0x13, 0xF9, 0x7D, 0xFF, 0x28, 0xF7, 0x3B, 0x40, 0x15, 0xFF, 0x2A, 0x2D, 0xC0, 0x46, 0x2, 0x2, 0xD1, 0x40, 0x29, 0x0, 0xDC, 0xF9, 0x33, 0x83,
+0xB5, 0x46, 0xF8, 0x2, 0x13, 0x16, 0xFA, 0xF8, 0x42, 0x13, 0x6, 0x99, 0x48, 0x4, 0x41, 0x72, 0x70, 0x47, 0x28, 0x28, 0x17, 0xFF, 0x20, 0x0, 0x1, 0xB4, 0xB8, 0x78, 0x0, 0xF0, 0x8, 0xFA, 0x28, 0xB8, 0x70,
+0x32, 0x33, 0xB8, 0x7, 0x6F, 0x4, 0xD1, 0x8, 0x90, 0x3, 0xA5, 0x1, 0x30, 0x10, 0xA3, 0x1, 0x38, 0x1, 0x28, 0x0, 0xFA, 0xD1, 0xBA, 0x7B, 0x8, 0x9, 0x11, 0xD0, 0x0, 0x5, 0x28, 0x10, 0xDD, 0x6, 0x28, 0x15,
+0xD0, 0x0, 0x7, 0x28, 0x17, 0xD0, 0x8, 0x28, 0x9, 0xD0, 0x0, 0xD, 0x28, 0x15, 0xDD, 0xE, 0x28, 0x1B, 0xD0, 0x0, 0xF, 0x28, 0xFF, 0xD0, 0x52, 0x0, 0x40, 0x2A, 0x2, 0x19, 0xDB, 0x40, 0x22, 0x17, 0xE0, 0x0,
+0x31, 0x23, 0x4, 0x83, 0x40, 0xD2, 0x1A, 0x12, 0x3, 0x4D, 0x10, 0xE0, 0x20, 0xAB, 0x20, 0x1D, 0x1B, 0xC, 0xE0, 0x52, 0x8, 0xA, 0x21, 0xE0, 0x9, 0x30, 0x19, 0x18, 0x40, 0x2A, 0x4, 0x0, 0x29, 0x10, 0x2,
+0xE0, 0xC0, 0x0, 0x1B, 0xD2, 0x9, 0xBA, 0x73, 0x0, 0x0, 0x2E, 0xC6, 0xD0, 0xF0, 0x7D, 0x4, 0x22, 0x5, 0x10, 0x43, 0xF0, 0x75, 0xC1, 0x5, 0x3, 0x4, 0x1, 0x27, 0x10, 0xB, 0x9, 0x9B, 0x9, 0x95, 0xB8, 0x71,
+0xB8, 0x79, 0xD, 0x7, 0x4B, 0x18, 0x56, 0x12, 0xB9, 0xD, 0x53, 0x11, 0x14, 0xC3, 0x0, 0x9, 0x9, 0x0, 0xD2, 0x40, 0x10, 0x2, 0x49, 0x78, 0x88, 0x0, 0xC5, 0x4, 0x2, 0x1, 0x63, 0x10, 0xCB, 0x8, 0x9, 0x40,
+0x40, 0x0, 0x33, 0x6D, 0xF, 0xE0, 0x18, 0xE0, 0x20, 0xE0, 0x40, 0x32, 0x40, 0x1, 0x37, 0xE0, 0x53, 0xE0, 0x55, 0xE0, 0x40, 0x58, 0x0, 0x1, 0x71, 0xE0, 0x77, 0xE0, 0x7F, 0xE0, 0x42, 0x88, 0x9, 0xDF, 0x7,
+0xD1, 0xB8, 0x7B, 0x13, 0xB, 0x40, 0x25, 0x18, 0x40, 0x5, 0x29, 0x40, 0x20, 0x14, 0xAD, 0x6, 0x50, 0x13, 0xD6, 0x15, 0xA1, 0x20, 0x11, 0x3, 0x23, 0x2F, 0xB9, 0x9, 0x13, 0x1, 0xB5, 0x38, 0x62, 0x8, 0x21,
+0x13, 0x11, 0xC5, 0x3, 0xD0, 0xF1, 0x0, 0xAB, 0x11, 0x1E, 0x43, 0xF1, 0x75, 0x11, 0xC3, 0x30, 0x1, 0x30, 0x2B, 0x2, 0x37, 0x77, 0x10, 0x70, 0x47, 0x1A, 0x23, 0x67, 0x2, 0x29, 0x4, 0xDD, 0x1, 0x6, 0x29,
+0x3, 0xDD, 0x8, 0x29, 0x9, 0x6, 0x25, 0x80, 0x0, 0x4D, 0x39, 0x3A, 0x7D, 0x92, 0x6, 0x92, 0xE, 0x4, 0x89, 0x1, 0xA, 0x43, 0x3A, 0x13, 0x17, 0x2E, 0x6, 0x0, 0xD0, 0xF2, 0x7D, 0x20, 0x20, 0x82, 0x43, 0x7,
+0x28, 0x39, 0x49, 0x0, 0x13, 0xF2, 0x3, 0x2B, 0x9, 0x1, 0xB9, 0x84, 0x5, 0xB3, 0x91, 0x29, 0x0, 0xD0, 0x30, 0x57, 0x15, 0xD1, 0x20, 0x42, 0x46, 0x13, 0xB3, 0x6, 0xD1, 0x51, 0x78, 0x91, 0x0, 0x77, 0x8,
+0x49, 0x49, 0x68, 0x20, 0x23, 0xD1, 0x4, 0x50, 0x70, 0x47, 0xD0, 0x7F, 0x9, 0xAF, 0xD1, 0xD1, 0x24, 0x77, 0x2, 0x1, 0x6B, 0xD0, 0x77, 0x12, 0x4D, 0x28, 0x23, 0x73, 0xD0, 0x6, 0xB9, 0x11, 0xD3, 0x13, 0xE3,
+0x91, 0x42, 0x22, 0x71, 0x6, 0x95, 0xC0, 0x16, 0xCB, 0x13, 0xF5, 0x8A, 0x42, 0x1, 0xDA, 0xD, 0x48, 0x56, 0xC1, 0x1, 0xF7, 0x7, 0x40, 0xA9, 0x42, 0x7, 0xBB, 0x8, 0xA5, 0x31, 0x5A, 0x41, 0x0, 0xB1, 0xFD,
+0x2, 0xE3, 0x14, 0x1B, 0x5, 0x28, 0x9B, 0x2, 0x1, 0xD0, 0x2A, 0x20, 0xFF, 0xF7, 0x95, 0xF9, 0x3A, 0x67, 0xC0, 0x12, 0x27, 0x1B, 0xEF, 0x20, 0x29, 0x12, 0xDA, 0x0, 0x2A, 0x40, 0x1B, 0x4, 0x85, 0xC2, 0x79,
+0x10, 0x29, 0x5, 0xDA, 0x0, 0x52, 0x1A, 0x20, 0x2A, 0x0, 0xDA, 0x20, 0x22, 0xA, 0x10, 0x1C, 0x9, 0xE0, 0x14, 0x57, 0x52, 0x5, 0x21, 0xF8, 0xB0, 0x5, 0x21, 0xF6, 0x5, 0xB9, 0x1, 0x2B, 0x1C, 0x20, 0xB5,
+0x45, 0x26, 0x46, 0x3, 0x8, 0x6D, 0x70, 0xF9, 0x39, 0x97, 0x11, 0xAB, 0x5, 0xB4, 0xC, 0x17, 0xA, 0x83, 0x77, 0x3, 0x5F, 0xF, 0x53, 0x77, 0x44, 0xE6, 0x10, 0xC0, 0x46, 0xB, 0x4, 0xDB, 0x2, 0x7E, 0x28,
+0x23, 0x31, 0x1A, 0x42, 0x4, 0xED, 0xF, 0x7D, 0x80, 0x22, 0x91, 0xC, 0xA9, 0x12, 0x11, 0x1C, 0x1, 0xA, 0x97, 0x0, 0xB5, 0x14, 0x6B, 0x0, 0x83, 0x7, 0xB9, 0x80, 0x20, 0x0, 0xE0, 0x40, 0x2, 0xB7, 0x4, 0x7B,
+0x81, 0xB, 0x59, 0xAB, 0xF8, 0x41, 0x46, 0x8, 0x71, 0x44, 0xEF, 0x4E, 0xD1, 0x11, 0x3F, 0xC0, 0x46, 0x50, 0x3, 0x0, 0xF, 0x26, 0x87, 0x91, 0x60, 0x42, 0x4, 0xFF, 0x1, 0xB7, 0xF0, 0x7D, 0x1, 0x21, 0x88,
+0xCE, 0x2, 0x63, 0x43, 0x93, 0x2E, 0xFF, 0x1, 0x67, 0x19, 0x43, 0x12, 0xF3, 0xE, 0x0, 0xD1, 0x78, 0x7D, 0x6, 0x23, 0x58, 0x40, 0x78, 0x0, 0x75, 0xC0, 0x8, 0x3, 0xD3, 0x9, 0x9, 0x1, 0xD, 0x31, 0xB9, 0x71,
+0x6, 0x20, 0xD9, 0x10, 0x9, 0x1, 0x1, 0x69, 0x0, 0xB8, 0x71, 0x7A, 0x7D, 0xD2, 0x8, 0x2, 0xD2, 0x6, 0xC0, 0x21, 0x27, 0x4A, 0x91, 0x3, 0x41, 0x38, 0x4B, 0xD2, 0x4, 0x8, 0xE, 0xD3, 0x3, 0xE0, 0x54, 0xB1,
+0x22, 0x4A, 0x0, 0x49, 0x0, 0x51, 0x5A, 0x40, 0x9, 0x48, 0x43, 0x22, 0xC0, 0xA, 0x9, 0x9F, 0xDA, 0x0, 0x20, 0x11, 0xD5, 0x40, 0x8, 0x18, 0x41, 0xD, 0xFA, 0x3, 0xF3, 0x40, 0x5, 0xF4, 0x50, 0xE7, 0x34,
+0xDB, 0x15, 0x60, 0x33, 0xE5, 0xD3, 0x16, 0x4A, 0x12, 0x3, 0x1C, 0xC0, 0x3, 0xFF, 0xDB, 0x18, 0x70, 0x3B, 0xC0, 0x4, 0x18, 0x1, 0x1C, 0x49, 0xD, 0x1B, 0x93, 0x40, 0x5, 0x98, 0x20, 0x41, 0x1A, 0xFB, 0x2,
+0x95, 0x70, 0x73, 0x2, 0xD3, 0x9, 0x83, 0x0, 0x35, 0xE6, 0xE7, 0x89, 0x0, 0xF1, 0x8, 0x33, 0x35, 0x2F, 0x4, 0x1, 0xD3, 0x5, 0x4A, 0xBF, 0x0, 0x11, 0xC7, 0xE7, 0x96, 0x13, 0xDB, 0xAC, 0x33, 0xD, 0x97,
+0x31, 0xE, 0xC3, 0x4, 0x83, 0xB0, 0x9C, 0x4, 0x87, 0x0, 0x29, 0x1A, 0x2D, 0x1, 0xBD, 0x29, 0x65, 0xF9, 0xDA, 0x1, 0x41, 0x70, 0x80, 0xB5, 0x4, 0x4F, 0x2, 0xB, 0x91, 0x22, 0x9E, 0xF8, 0x5, 0x79, 0x39,
+0xF9, 0xD1, 0x3C, 0x57, 0x44, 0x0, 0xA, 0x0, 0x3, 0x40, 0x23, 0x8, 0xB4, 0x43, 0x0, 0x46, 0x1B, 0x7E, 0x1B, 0x9, 0x2B, 0xD2, 0xF, 0x88, 0x0, 0x37, 0x15, 0xE0, 0xF0, 0x15, 0x7, 0x2A, 0x22, 0xD1, 0x1, 0x4,
+0xE0, 0xB, 0x1C, 0x1B, 0x7, 0x8, 0x6, 0x4D, 0xD, 0x1C, 0xD0, 0x9, 0x9, 0xF, 0xA1, 0x5, 0x91, 0x18, 0x5, 0x91, 0x51, 0x16, 0x10, 0x17, 0x9, 0x6, 0x3D, 0x2A, 0x10, 0xD0, 0x33, 0x45, 0x52, 0xC, 0x3, 0x45,
+0xA, 0x6, 0x5B, 0x8, 0xD1, 0x10, 0x31, 0x1B, 0x4, 0xF, 0xF, 0x2B, 0xE6, 0xD0, 0x10, 0x23, 0xF, 0x2B, 0x19, 0xEE, 0xD0, 0x2, 0xD, 0xA5, 0x18, 0x97, 0xB, 0x9, 0x16, 0x91, 0x14, 0x5B, 0x1A, 0xC0, 0x20, 0x47,
+0x0, 0x5, 0xD9, 0x0, 0x28, 0x20, 0xF1, 0xDC, 0x30, 0xE7, 0x80, 0x35, 0x80, 0x32, 0xA0, 0x0, 0x2F, 0x0, 0x2D, 0x60, 0x2A, 0x0, 0x28, 0xC0, 0x0, 0x25, 0xA0, 0x23, 0xA0, 0x21, 0xC0, 0x1F, 0x0, 0x0, 0x1E,
+0x58, 0x1C, 0x0, 0x0, 0xED, 0x0, 0xDB, 0x0, 0x1, 0xCA, 0x2, 0xB9, 0x3, 0xAA, 0x4, 0x9B, 0x0, 0x5, 0x8D, 0x6, 0x80, 0x7, 0x74, 0x8, 0x69, 0x0, 0x9, 0x5F, 0xA, 0x56, 0xB, 0x4D, 0xC, 0x45, 0x0, 0xD, 0x3F,
+0xE, 0x39, 0xF, 0x34, 0x10, 0x30, 0x0, 0x11, 0x2D, 0x12, 0x2B, 0x13, 0x25, 0x14, 0x29, 0x0, 0x15, 0x2A, 0x16, 0x2C, 0x17, 0x2E, 0x18, 0x31, 0x0, 0x19, 0x36, 0x1A, 0x3B, 0x1B, 0x41, 0x1C, 0x48, 0x0, 0x1D,
+0x51, 0x1E, 0x5A, 0x1F, 0x64, 0x20, 0x6F, 0x0, 0x21, 0x5B, 0x1F, 0x88, 0x23, 0x96, 0x24, 0xA4, 0x0, 0x25, 0xB4, 0x26, 0xC5, 0x27, 0xD7, 0x28, 0xEA, 0x0, 0x29, 0xFE, 0x2A, 0x13, 0x2C, 0x28, 0x2D, 0x3F,
+0x0, 0x2E, 0x57, 0x2F, 0x70, 0x30, 0x8A, 0x31, 0xA5, 0x0, 0x32, 0xC1, 0x33, 0xDD, 0x34, 0xFB, 0x35, 0x1A, 0x0, 0x37, 0x3A, 0x38, 0x5C, 0x39, 0x7E, 0x3A, 0xA1, 0x0, 0x3B, 0xC5, 0x3C, 0xEA, 0x3D, 0x11,
+0x3F, 0x38, 0x0, 0x40, 0x61, 0x41, 0x8A, 0x42, 0xB5, 0x43, 0xE1, 0x0, 0x44, 0xD, 0x46, 0x3B, 0x47, 0x6A, 0x48, 0x9A, 0x0, 0x49, 0xCB, 0x4A, 0xFE, 0x4B, 0x31, 0x4D, 0x66, 0x0, 0x4E, 0x9B, 0x4F, 0xD2, 0x50,
+0xA, 0x52, 0x43, 0x0, 0x53, 0x7D, 0x54, 0xB8, 0x55, 0xF4, 0x56, 0x32, 0x0, 0x58, 0x71, 0x59, 0xB0, 0x5A, 0xF1, 0x5B, 0x34, 0x0, 0x5D, 0x77, 0x5E, 0xBB, 0x5F, 0x1, 0x61, 0x48, 0x0, 0x62, 0x90, 0x63, 0xD9,
+0x64, 0x24, 0x66, 0x6F, 0x0, 0x67, 0xBC, 0x68, 0xA, 0x6A, 0x59, 0x6B, 0xAA, 0x0, 0x6C, 0xFB, 0x6D, 0x4E, 0x6F, 0xA2, 0x70, 0xF7, 0x0, 0x71, 0x4E, 0x73, 0xA6, 0x74, 0xFF, 0x75, 0x59, 0x0, 0x77, 0xB4, 0x78,
+0x10, 0x7A, 0x6F, 0x7B, 0xCF, 0x0, 0x7C, 0x2F, 0x7E, 0x91, 0x7F, 0xF4, 0x80, 0x59, 0x0, 0x82, 0xBE, 0x83, 0x25, 0x85, 0x8E, 0x86, 0xF7, 0x0, 0x87, 0x62, 0x89, 0xCE, 0x8A, 0x3C, 0x8C, 0xAB, 0x0, 0x8D,
+0x1B, 0x8F, 0x8C, 0x90, 0xFF, 0x91, 0x73, 0x0, 0x93, 0xE9, 0x94, 0x60, 0x96, 0xD8, 0x97, 0x52, 0x0, 0x99, 0xCD, 0x9A, 0x49, 0x9C, 0xC7, 0x9D, 0x46, 0x0, 0x9F, 0xC6, 0xA0, 0x48, 0xA2, 0xCC, 0xA3, 0x50,
+0x0, 0xA5, 0xD6, 0xA6, 0x5E, 0xA8, 0xE7, 0xA9, 0x71, 0x0, 0xAB, 0xFD, 0xAC, 0x8A, 0xAE, 0x19, 0xB0, 0xA9, 0x0, 0xB1, 0x3A, 0xB3, 0xCD, 0xB4, 0x62, 0xB6, 0xF7, 0x0, 0xB7, 0x8F, 0xB9, 0x2D, 0xBB, 0xC2,
+0xBC, 0x5E, 0x0, 0xBE, 0xFB, 0xBF, 0x9A, 0xC1, 0x3A, 0xC3, 0xDC, 0x0, 0xC4, 0x7F, 0xC6, 0x24, 0xC8, 0xCA, 0xC9, 0x72, 0x0, 0xCB, 0x1B, 0xCD, 0xC6, 0xCE, 0x73, 0xD0, 0x21, 0x0, 0xD2, 0xD0, 0xD3, 0x82,
+0xD5, 0x34, 0xD7, 0xE9, 0x0, 0xD8, 0x9E, 0xDA, 0x56, 0xDC, 0xF, 0xDE, 0xC9, 0x0, 0xDF, 0x86, 0xE1, 0x43, 0xE3, 0x3, 0xE5, 0xC4, 0x0, 0xE6, 0x87, 0xE8, 0x4B, 0xEA, 0x11, 0xEC, 0xD9, 0x0, 0xED, 0xA2, 0xEF,
+0x6D, 0xF1, 0x39, 0xF3, 0x7, 0x0, 0xF5, 0xD7, 0xF6, 0xA9, 0xF8, 0x7C, 0xFA, 0x51, 0x0, 0xFC, 0x28, 0xFE, 0x0, 0x0, 0xDA, 0x1, 0xB6, 0x0, 0x3, 0x93, 0x5, 0x72, 0x7, 0x53, 0x9, 0x36, 0x0, 0xB, 0x1B, 0xD,
+0x1, 0xF, 0xE7, 0x10, 0xD2, 0x0, 0x12, 0xBE, 0x14, 0xAB, 0x16, 0x9A, 0x18, 0x8B, 0x0, 0x1A, 0x7E, 0x1C, 0x72, 0x1E, 0x68, 0x20, 0x60, 0x0, 0x22, 0x5A, 0x24, 0x56, 0x26, 0x53, 0x28, 0x53, 0x0, 0x2A, 0x54,
+0x2C, 0x57, 0x2E, 0x5C, 0x30, 0x63, 0x0, 0x32, 0x6B, 0x34, 0x76, 0x36, 0x83, 0x38, 0x91, 0x0, 0x3A, 0xA1, 0x3C, 0xB3, 0x3E, 0xC7, 0x40, 0xDD, 0x0, 0x42, 0xF5, 0x44, 0xF, 0x47, 0x2B, 0x49, 0x49, 0x0, 0x4B,
+0x69, 0x4D, 0x8A, 0x4F, 0xAE, 0x51, 0xD4, 0x0, 0x53, 0xFB, 0x55, 0x25, 0x58, 0x51, 0x5A, 0x7E, 0x0, 0x5C, 0xAE, 0x5E, 0xE0, 0x60, 0x13, 0x63, 0x49, 0x0, 0x65, 0x99, 0x63, 0xBB, 0x69, 0xF7, 0x6B, 0x35,
+0x0, 0x6E, 0x75, 0x70, 0xB7, 0x72, 0xFB, 0x74, 0x42, 0x0, 0x77, 0x8A, 0x79, 0xD5, 0x7B, 0x21, 0x7E, 0x70, 0x0, 0x80, 0xC1, 0x82, 0x14, 0x85, 0xC0, 0x46, 0xFF, 0x0, 0xFF, 0x14, 0xFF, 0x29, 0xFE, 0x3E,
+0xFD, 0x54, 0x0, 0xFC, 0x6C, 0xFB, 0x84, 0xFA, 0x9D, 0xF9, 0xB6, 0x0, 0xF8, 0xD1, 0xF7, 0xEC, 0xF6, 0x8, 0xF6, 0x25, 0x0, 0xF5, 0x43, 0xF4, 0x62, 0xF3, 0x81, 0xF2, 0xA2, 0x0, 0xF1, 0xC3, 0xF0, 0xE5, 0xEF,
+0x7, 0xEF, 0x2B, 0x0, 0xEE, 0x4F, 0xED, 0x74, 0xEC, 0x9A, 0xEB, 0xC1, 0x0, 0xEA, 0xE8, 0xE9, 0x10, 0xE9, 0x39, 0xE8, 0x63, 0x0, 0xE7, 0x8E, 0xE6, 0xB9, 0xE5, 0xE5, 0xE4, 0x12, 0x0, 0xE4, 0x40, 0xE3, 0x6E,
+0xE2, 0x9D, 0xE1, 0xCD, 0x0, 0xE0, 0xFD, 0xDF, 0x2F, 0xDF, 0x61, 0xDE, 0x94, 0x0, 0xDD, 0xC7, 0xDC, 0xFC, 0xDB, 0x31, 0xDB, 0x67, 0x0, 0xDA, 0x9D, 0xD9, 0xD4, 0xD8, 0xC, 0xD8, 0x45, 0x0, 0xD7, 0x7E, 0xD6,
+0xB9, 0xD5, 0xF3, 0xD4, 0x2F, 0x0, 0xD4, 0x6B, 0xD3, 0xA8, 0xD2, 0xE6, 0xD1, 0x24, 0x0, 0xD1, 0x63, 0xD0, 0xA3, 0xCF, 0xE3, 0xCE, 0x25, 0x0, 0xCE, 0x66, 0xCD, 0xA9, 0xCC, 0xEC, 0xCB, 0x30, 0x0, 0xCB,
+0x75, 0xCA, 0xBA, 0xC9, 0x0, 0xC9, 0x46, 0x0, 0xC8, 0x8D, 0xC7, 0xD5, 0xC6, 0x1E, 0xC6, 0x67, 0x0, 0xC5, 0xB1, 0xC4, 0xFC, 0xC3, 0x47, 0xC3, 0x93, 0x0, 0xC2, 0xDF, 0xC1, 0x2C, 0xC1, 0x7A, 0xC0, 0xC9,
+0x0, 0xBF, 0x18, 0xBF, 0x67, 0xBE, 0xB8, 0xBD, 0x9, 0x0, 0xBD, 0x0, 0xBC, 0xAC, 0xBB, 0xFF, 0xBA, 0x53, 0x0, 0xBA, 0xA7, 0xB9, 0xFC, 0xB8, 0x51, 0xB8, 0xA7, 0x0, 0xB7, 0xFE, 0xB6, 0x55, 0xB6, 0xAD, 0xB5,
+0x5, 0x0, 0xB5, 0x5E, 0xB4, 0xB8, 0xB3, 0x12, 0xB3, 0x6D, 0x0, 0xB2, 0xC8, 0xB1, 0x24, 0xB1, 0x81, 0xB0, 0xDE, 0x0, 0xAF, 0x3B, 0xAF, 0x9A, 0xAE, 0xF9, 0xAD, 0x58, 0x0, 0xAD, 0xB8, 0xAC, 0x19, 0xAC, 0x7A,
+0xAB, 0xDC, 0x0, 0xAA, 0x3E, 0xAA, 0xA1, 0xA9, 0x5, 0xA9, 0x69, 0x0, 0xA8, 0xCE, 0xA7, 0x33, 0xA7, 0x99, 0xA6, 0xFF, 0x0, 0xA5, 0x66, 0xA5, 0xCD, 0xA4, 0x35, 0xA4, 0x9E, 0x0, 0xA3, 0x7, 0xA3, 0x70, 0xA2,
+0xDA, 0xA1, 0x45, 0x0, 0xA1, 0xB0, 0xA0, 0x1C, 0xA0, 0x88, 0x9F, 0xBF, 0x0, 0x9E, 0x76, 0x9E, 0xD0, 0x9D, 0x3D, 0x9D, 0xAE, 0x0, 0x9C, 0x1D, 0x9C, 0x8D, 0x9B, 0xFE, 0x9A, 0x6F, 0x0, 0x9A, 0xE0, 0x99,
+0x52, 0x99, 0xC5, 0x98, 0x38, 0x0, 0x98, 0xAC, 0x97, 0x20, 0x97, 0x94, 0x96, 0x9, 0x0, 0x96, 0x7F, 0x95, 0xF5, 0x94, 0x6C, 0x94, 0xE3, 0x0, 0x93, 0x5A, 0x93, 0xD2, 0x92, 0x4B, 0x92, 0xC4, 0x0, 0x91, 0x3D,
+0x91, 0xB7, 0x90, 0x32, 0x90, 0xAD, 0x0, 0x8F, 0x28, 0x8F, 0xA4, 0x8E, 0x21, 0x8E, 0x9E, 0x0, 0x8D, 0x1B, 0x8D, 0x99, 0x8C, 0x17, 0x8C, 0x96, 0x0, 0x8B, 0x15, 0x8B, 0x95, 0x8A, 0x15, 0x8A, 0x95, 0x0,
+0x89, 0x17, 0x89, 0x98, 0x88, 0x1A, 0x88, 0x9C, 0x0, 0x87, 0x1F, 0x87, 0xA3, 0x86, 0x27, 0x86, 0xAB, 0x0, 0x85, 0x2F, 0x85, 0xB5, 0x84, 0x3A, 0x84, 0xC0, 0x0, 0x83, 0x47, 0x83, 0xCE, 0x82, 0x55, 0x82,
+0xDD, 0x4, 0x81, 0x65, 0x81, 0xED, 0x80, 0xB, 0x2A, 0x80, 0x8A, 0x0, 0x7F, 0x14, 0x7F, 0x9F, 0x7E, 0x2A, 0x7E, 0xB6, 0x0, 0x7D, 0x42, 0x7D, 0xCE, 0x7C, 0x5B, 0x7C, 0xE8, 0x0, 0x7B, 0x76, 0x7B, 0x4, 0x7B,
+0x93, 0x7A, 0x22, 0x0, 0x7A, 0xB1, 0x79, 0x41, 0x79, 0xD1, 0x78, 0x61, 0x0, 0x78, 0xF2, 0x77, 0x84, 0x77, 0x15, 0x77, 0xA8, 0x0, 0x76, 0x12, 0x76, 0xCD, 0x75, 0x60, 0x75, 0xF4, 0x0, 0x74, 0x88, 0x74,
+0x1D, 0x74, 0xB2, 0x73, 0x47, 0x0, 0x73, 0xDD, 0x72, 0x73, 0x72, 0x9, 0x72, 0xA0, 0x0, 0x71, 0x37, 0x71, 0xCF, 0x70, 0x66, 0x70, 0xFF, 0x0, 0x6F, 0x97, 0x6F, 0x30, 0x6F, 0xCA, 0x6E, 0x64, 0x0, 0x6E, 0xFE,
+0x6D, 0x98, 0x6D, 0x33, 0x6D, 0xCF, 0x0, 0x6C, 0x6A, 0x6C, 0x6, 0x6C, 0xA2, 0x6B, 0x3F, 0x0, 0x6B, 0xDC, 0x6A, 0x7A, 0x6A, 0x17, 0x6A, 0xB6, 0x0, 0x69, 0x54, 0x69, 0xF3, 0x68, 0x92, 0x68, 0x32, 0x0, 0x68,
+0xD1, 0x67, 0x72, 0x67, 0x12, 0x67, 0xB3, 0x1, 0x66, 0x54, 0x66, 0xF6, 0x65, 0x98, 0x65, 0x8, 0xD7, 0xA, 0x8, 0x0, 0x0, 0x7A, 0x0, 0x3, 0xFB, 0x0, 0x7, 0x83, 0x0, 0x9, 0x0, 0x0, 0x14, 0xA, 0x0, 0x0, 0xAE,
+0xAA, 0x0, 0x3, 0x50, 0xE, 0xA, 0xFD, 0xE, 0xE, 0xB3, 0xE, 0xD, 0x74, 0x81, 0xE, 0xA, 0x41, 0xE, 0x0, 0x0, 0x1A, 0xF, 0xE, 0x30, 0x8, 0x10, 0x0, 0x0, 0xF4, 0x0, 0x3, 0xF6, 0x11, 0x0, 0x0, 0x0, 0x7, 0x13,
+0x0, 0x0, 0x29, 0x14, 0x0, 0x0, 0x0, 0x5C, 0x15, 0x0, 0x0, 0xA1, 0x16, 0x0, 0x0, 0x0, 0xF9, 0x17, 0x0, 0x0, 0x66, 0x19, 0x0, 0x2, 0x0, 0xE9, 0x1A, 0x0, 0x0, 0x82, 0x4, 0x61, 0x34, 0x40, 0x1E, 0xE, 0x60,
+0x20, 0x0, 0x0, 0xE7, 0x21, 0x0, 0x0, 0x0, 0xEB, 0x23, 0x0, 0x0, 0xE, 0x26, 0x0, 0x1, 0x0, 0x51, 0x28, 0x0, 0x0, 0xB7, 0x2A, 0x0, 0x4F, 0x0, 0x2D, 0x0, 0x0, 0xF2, 0x2F, 0x0, 0x0, 0xCC, 0x50, 0x32, 0xD,
+0x86, 0x35, 0xE, 0x63, 0x39, 0x0, 0x0, 0x68, 0x60, 0x3C, 0xE, 0x90, 0x8, 0x7E, 0xCE, 0x43, 0x0, 0x0, 0xD6, 0x80, 0xE, 0xAF, 0x1C, 0x4C, 0x0, 0x0, 0xA3, 0x50, 0x0, 0x10, 0x0, 0x6E, 0x55, 0x0, 0x4F, 0x5A,
+0x0, 0x0, 0xE4, 0x0, 0x5F, 0x0, 0x0, 0x98, 0x65, 0x0, 0x0, 0xA2, 0x5, 0x6B, 0x0, 0x0, 0x9, 0x72, 0xD, 0xBE, 0x78, 0xE, 0xC0, 0x80, 0xC, 0xBE, 0x9C, 0x87, 0x0, 0x0, 0xAD, 0x8F, 0x0, 0x0, 0x0, 0x38, 0x98,
+0x0, 0x0, 0x45, 0xA1, 0x0, 0x10, 0x0, 0xDC, 0xAA, 0xE, 0xD2, 0xB5, 0x0, 0x0, 0xC9, 0x4, 0xBF, 0x0, 0x0, 0x30, 0xCB, 0x0, 0x13, 0xD7, 0x0, 0x14, 0x0, 0x12, 0xE4, 0x0, 0x37, 0xF1, 0x1E, 0xF1, 0x1, 0x0,
+0x0, 0x39, 0xF, 0x1, 0x0, 0x5A, 0x1F, 0x1, 0x0, 0x8, 0x70, 0x30, 0x1, 0x0, 0x7, 0xD1, 0x0, 0xB8, 0x55, 0x0, 0x1, 0x0, 0xA, 0x6A, 0x1, 0x0, 0x91, 0x7F, 0x8, 0x1, 0x0, 0x60, 0x96, 0x0, 0x13, 0xAE, 0x1,
+0x0, 0x1, 0x24, 0xC8, 0x1, 0x0, 0x43, 0xE3, 0x1, 0x1F, 0x21, 0x0, 0x0, 0x72, 0x1E, 0x2, 0x0, 0xB3, 0x3E, 0x2, 0x0, 0x0, 0xE0, 0x60, 0x2, 0x0, 0x14, 0x85, 0x2, 0x10, 0x0, 0x70, 0xAB, 0x0, 0x7, 0xD4, 0x2,
+0x0, 0x22, 0x0, 0xFF, 0x2, 0x0, 0xC0, 0x2C, 0x3, 0x0, 0x14, 0x0, 0x5D, 0x3, 0x0, 0x48, 0x90, 0x3, 0x0, 0x87, 0x40, 0xC6, 0x1F, 0x52, 0x4, 0x0, 0xE4, 0x3C, 0x4, 0x0, 0x0, 0x67, 0x7D, 0x4, 0x0, 0xC0, 0xC1,
+0x4, 0x0, 0x0, 0x29, 0xA, 0x5, 0x0, 0xE0, 0x56, 0x5, 0x0, 0x0, 0x28, 0xA8, 0x5, 0x0, 0x44, 0xFE, 0x5, 0x0, 0x0, 0x80, 0x59, 0x6, 0x0, 0x28, 0xBA, 0x6, 0x0, 0x3, 0x90, 0x20, 0x7, 0x0, 0xE, 0x8D, 0xF, 0x75,
+0x1, 0x80, 0x0, 0xC8, 0x79, 0x8, 0x0, 0xCD, 0xFA, 0x8, 0x0, 0x50, 0x7F, 0x1, 0x80, 0x51, 0x1, 0x80, 0xC1, 0xAD, 0xA, 0x0, 0x40, 0x4F, 0x1, 0x80, 0x88, 0xFC, 0xB, 0x0, 0xFF, 0xB2, 0x15, 0xC, 0x0, 0x50,
+0x1, 0x80, 0x1F, 0x1, 0x80, 0x1C, 0x41, 0x80, 0x0, 0x90, 0xF3, 0x10, 0x0, 0x9B, 0xF5, 0x11, 0x0, 0x0, 0xFE, 0x6, 0x13, 0x0, 0xA3, 0x28, 0x14, 0x0, 0x0, 0x81, 0x5B, 0x15, 0x0, 0x9E, 0xA0, 0x16, 0x0, 0x40,
+0x11, 0x1, 0x80, 0xFF, 0x65, 0x19, 0x0, 0xA0, 0xE8, 0x14, 0x1A, 0x0, 0x3E, 0x1, 0x80, 0x38, 0x21, 0x80, 0x3B, 0x0, 0x10, 0x76, 0x0, 0xB2, 0x5, 0xED, 0x28, 0x1, 0x64, 0x1, 0x0, 0x9F, 0x1, 0xDB, 0x1, 0x17,
+0x2, 0x52, 0x2, 0x0, 0x8E, 0x2, 0xCA, 0x2, 0x5, 0x3, 0x41, 0x3, 0x0, 0x7D, 0x3, 0xFF, 0xFF, 0xC5, 0xFF, 0x8A, 0xFF, 0x41, 0x4F, 0x4, 0x9, 0xD9, 0xFE, 0x9E, 0xFE, 0x4F, 0x4, 0xF, 0x0, 0xEE, 0xFD, 0xB3,
+0xFD, 0x78, 0xFD, 0x3E, 0xFD, 0x0, 0x4, 0xFD, 0xC9, 0xFC, 0x85, 0xFC, 0x0, 0x2, 0x0, 0x3, 0x5, 0x6, 0x8, 0x9, 0xB, 0xC, 0xE, 0x0, 0x10, 0x11, 0x13, 0x14, 0x16, 0x17, 0x18, 0x1A, 0x0, 0x1B, 0x1D, 0x1E,
+0x20, 0x21, 0x22, 0x24, 0x25, 0x0, 0x26, 0x27, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x0, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x0, 0x37, 0x38, 0x38, 0x39, 0x3A, 0x3B, 0x3B, 0x3C, 0x0, 0x3C,
+0x3D, 0x3D, 0x3E, 0x3E, 0x3E, 0x3F, 0x3F, 0x1C, 0x3F, 0x40, 0x40, 0x60, 0x1, 0x0, 0xD, 0x0, 0x13, 0x3D, 0x3D, 0x0, 0x3C, 0x3C, 0x3B, 0x3B, 0x3A, 0x39, 0x38, 0x38, 0x0, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32,
+0x31, 0x30, 0x0, 0x2F, 0x2E, 0x2D, 0x2C, 0x2B, 0x2A, 0x29, 0x27, 0x0, 0x26, 0x25, 0x24, 0x22, 0x21, 0x20, 0x1E, 0x1D, 0x0, 0x1B, 0x1A, 0x18, 0x17, 0x16, 0x14, 0x13, 0x11, 0x0, 0x10, 0xE, 0xC, 0xB, 0x9,
+0x8, 0x6, 0x5, 0x0, 0x3, 0x2, 0x0, 0xFE, 0xFD, 0xFB, 0xFA, 0xF8, 0x0, 0xF7, 0xF5, 0xF4, 0xF2, 0xF0, 0xEF, 0xED, 0xEC, 0x0, 0xEA, 0xE9, 0xE8, 0xE6, 0xE5, 0xE3, 0xE2, 0xE0, 0x0, 0xDF, 0xDE, 0xDC, 0xDB,
+0xDA, 0xD9, 0xD7, 0xD6, 0x0, 0xD5, 0xD4, 0xD3, 0xD2, 0xD1, 0xD0, 0xCF, 0xCE, 0x0, 0xCD, 0xCC, 0xCB, 0xCA, 0xC9, 0xC8, 0xC8, 0xC7, 0x0, 0xC6, 0xC5, 0xC5, 0xC4, 0xC4, 0xC3, 0xC3, 0xC2, 0x1, 0xC2, 0xC2,
+0xC1, 0xC1, 0xC1, 0xC0, 0xC0, 0x60, 0x1, 0xC0, 0x0, 0xD, 0x0, 0x13, 0xC3, 0xC3, 0xC4, 0xC4, 0xC5, 0xC5, 0x0, 0xC6, 0xC7, 0xC8, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0x0, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3,
+0xD4, 0x0, 0xD5, 0xD6, 0xD7, 0xD9, 0xDA, 0xDB, 0xDC, 0xDE, 0x0, 0xDF, 0xE0, 0xE2, 0xE3, 0xE5, 0xE6, 0xE8, 0xE9, 0x0, 0xEA, 0xEC, 0xED, 0xEF, 0xF0, 0xF2, 0xF4, 0xF5, 0x0, 0xF7, 0xF8, 0xFA, 0xFB, 0xFD,
+0xFE, 0x10, 0x22, 0x10, 0x50, 0x43, 0x5B, 0x9, 0xCF, 0x80, 0x18, 0x10, 0x31, 0x0, 0x1, 0x60, 0x0, 0x21, 0x41, 0x60, 0x70, 0x47, 0xB4, 0x10, 0x13, 0x56, 0x20, 0x13, 0x50, 0xD, 0x53, 0x20, 0x21, 0x81, 0x81,
+0xA0, 0x30, 0x1B, 0x4F, 0x20, 0x2F, 0xC3, 0x68, 0x4B, 0x43, 0x9B, 0x20, 0xA, 0xC3, 0x10, 0x2F, 0x21, 0x48, 0x43, 0x4A, 0x49, 0x0, 0x9, 0x68, 0x40, 0x18, 0x1, 0x21, 0xC9, 0x7, 0x50, 0x1, 0x40, 0x11, 0x46,
+0x20, 0x11, 0x0, 0x68, 0xC0, 0x17, 0x2B, 0xC0, 0x43, 0x30, 0x53, 0x41, 0x20, 0x67, 0x1, 0xC, 0x55, 0x10, 0x75, 0x60, 0x3E, 0x30, 0x61, 0xC, 0x63, 0x3C, 0x4A, 0x81, 0x68, 0x11, 0x0, 0x61, 0x10, 0x23, 0x59,
+0x43, 0x43, 0x69, 0x53, 0x0, 0x60, 0x5B, 0x18, 0x53, 0x61, 0x81, 0x69, 0x11, 0x0, 0x60, 0xC1, 0x69, 0x91, 0x60, 0x1, 0x68, 0x49, 0x0, 0x0, 0x28, 0xA3, 0x5B, 0x5A, 0xD3, 0x60, 0x29, 0x89, 0x0, 0x5, 0x93,
+0x61, 0x2B, 0x10, 0xB, 0x61, 0x2C, 0x0, 0x11, 0x0, 0x30, 0x4A, 0x13, 0x60, 0x30, 0x48, 0x0, 0x68, 0x40, 0x30, 0x0, 0x77, 0x0, 0x22, 0x4, 0xC0, 0x1, 0x39, 0x0, 0xFC, 0xD1, 0x2E, 0x48, 0x2, 0x70, 0x28,
+0x48, 0x0, 0xC1, 0x68, 0x0, 0x68, 0x2D, 0x4B, 0x3, 0x60, 0x0, 0x10, 0x30, 0x1, 0x39, 0xFB, 0xD1, 0x2B, 0x48, 0x0, 0x2C, 0x49, 0x1, 0x60, 0x2C, 0x48, 0x2, 0x60, 0x0, 0x42, 0x60, 0x2B, 0x48, 0x2, 0x80,
+0x2B, 0x49, 0x0, 0x1, 0x80, 0x2B, 0x48, 0x22, 0x49, 0x4A, 0x68, 0x0, 0x9, 0x68, 0x1, 0x60, 0x89, 0x18, 0x89, 0x18, 0x0, 0xC1, 0x60, 0x24, 0x49, 0x41, 0x60, 0x4, 0x31, 0x0, 0x1, 0x61, 0x26, 0x49, 0x81,
+0x60, 0x41, 0x61, 0x0, 0x26, 0x48, 0x80, 0x21, 0x1, 0x80, 0x25, 0x48, 0x2, 0x1, 0x88, 0xA0, 0x29, 0xFC, 0xDA, 0x20, 0x5, 0xDB, 0x88, 0x90, 0xB, 0x20, 0x48, 0x20, 0x0, 0xEB, 0x80, 0x22, 0x12, 0x10, 0x4,
+0x11, 0x43, 0x10, 0xEB, 0xC0, 0x46, 0x88, 0x0, 0x0, 0xB0, 0x0, 0xE0, 0x0, 0x8, 0x1, 0x30, 0x1, 0x20, 0x60, 0x1, 0x3, 0xAF, 0x60, 0x6D, 0x4B, 0x0, 0x40, 0x0, 0x94, 0x37, 0x0, 0x30, 0xEE, 0xF7, 0xC4, 0xF9,
+0x0, 0x1A, 0xFB, 0xD8, 0xFB, 0x64, 0xFC, 0xE2, 0xFC, 0x0, 0x4E, 0x4F, 0xA8, 0x66, 0xA7, 0x82, 0xFC, 0x99, 0x0, 0x51, 0xB1, 0x50, 0xCD, 0x8, 0x5C, 0x0, 0x3, 0x55, 0x4, 0x0, 0x3, 0x24, 0x0, 0x7, 0xC, 0x0,
+0xB, 0x10, 0x0, 0xF, 0x64, 0x26, 0x0, 0x13, 0x13, 0xED, 0x10, 0x10, 0x10, 0x7, 0xA0, 0xE1, 0x50, 0xA0, 0x4, 0x32, 0x82, 0x4, 0x36, 0xC, 0x9A, 0x0, 0x0, 0x42, 0xBC, 0x13, 0x74, 0x0, 0x0, 0xB6, 0x84, 0x4,
+0x46, 0x6, 0x86, 0x13, 0x80, 0x1, 0x0, 0x4, 0x20, 0x10, 0x2F, 0xF, 0xBB, 0x8, 0xAA, 0xF, 0xBF, 0x10, 0xF, 0xC3, 0x18, 0xF, 0xC7, 0x20, 0xF, 0xCB, 0x28, 0xAA, 0xF, 0xCF, 0x30, 0xF, 0xD3, 0x38, 0xF, 0xD7,
+0x40, 0xF, 0xDB, 0x48, 0xAA, 0xF, 0xDF, 0x50, 0xF, 0xE3, 0x58, 0xF, 0xE7, 0x60, 0xF, 0xEB, 0x68, 0xF0, 0x4A, 0xF7, 0x82, 0xBC, 0xF0, 0x1, 0x90, 0x6, 0xA, 0x0, };
+
+void Write_GBA( void )
+{
+ int x;
+
+ for( x = 0; x < sizeof( GBA_ROM ); x++ )
+ write8( GBA_ROM[x] );
+
+ for( ; x < 0x3400-4; x++ )
+ write8( x );
+}
+
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef GBA_H
+#define GBA_H
+
+void Write_GBA( void );
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+// information from ITTECH.TXT
+
+#include <stdlib.h>
+#include <string.h>
+#include "defs.h"
+#include "mas.h"
+#include "it.h"
+#include "files.h"
+#include "simple.h"
+#include "errors.h"
+#include "samplefix.h"
+
+#ifdef SUPER_ASCII
+#define vstr_it_div "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n"
+#define vstr_it_instr_top "ÚÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"
+#define vstr_it_instr_head "³INDEX³VOLUME³ NNA ³ ENV ³ NAME ³\n"
+#define vstr_it_instr_slice "ÃÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
+#define vstr_it_instr "³%3i ³ %3i%% ³ %3s ³ %s%s%s ³ %-26s³\n"
+#define vstr_it_instr_bottom "ÀÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"
+
+#define vstr_it_samp_top "ÚÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"
+#define vstr_it_samp_head "³INDEX³VOLUME³DVOLUME³ LOOP ³ MID-C ³ NAME ³\n"
+#define vstr_it_samp_slice "ÃÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
+#define vstr_it_samp "³%3i ³ %3i%% ³ %3i%% ³ %4s ³%6ihz ³ %-26s³\n"
+#define vstr_it_samp_bottom "ÀÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"
+
+#define vstr_it_pattern " \x0e %2i"
+#else
+#define vstr_it_div "--------------------------------------------\n"
+#define vstr_it_instr_top vstr_it_div
+#define vstr_it_instr_head " INDEX VOLUME NNA ENV NAME\n"
+//#define vstr_it_instr_slice ""
+#define vstr_it_instr " %-3i %3i%% %3s %s%s%s %-26s \n"
+#define vstr_it_instr_bottom vstr_it_div
+
+#define vstr_it_samp_top vstr_it_div
+#define vstr_it_samp_head " INDEX VOLUME DVOLUME LOOP MID-C NAME \n"
+//#define vstr_it_samp_slice ""
+#define vstr_it_samp " %-3i %3i%% %3i%% %4s %6ihz %-26s \n"
+#define vstr_it_samp_bottom vstr_it_div
+
+#define vstr_it_pattern " * %2i"
+#endif
+
+bool Load_IT_Envelope( Instrument_Envelope* env, bool unsign )
+{
+ // read envelopes
+ u8 a;
+ u8 node_count;
+ int x;
+
+ bool env_loop=false;
+ bool env_sus=false;
+ bool env_enabled=false;
+ bool env_filter=false;
+
+ memset( env, 0, sizeof( Instrument_Envelope ) );
+
+ a=read8();
+
+ if( a & 1 )
+ env_enabled = true;
+ if( !(a & 2) )
+ {
+ env->loop_start=255;
+ env->loop_end =255;
+ }
+ else
+ env_loop=true;
+ if( !(a & 4) )
+ {
+ env->sus_start=255;
+ env->sus_end=255;
+ }
+ else
+ env_sus=true;
+
+ if( a & 128 )
+ {
+ unsign=false;
+ env_filter=true;
+ env->env_filter=env_filter;
+ }
+
+ node_count=read8();
+ if( node_count != 0 )
+ env->env_valid=true;
+
+ env->node_count = node_count;
+ if( env_loop )
+ {
+ env->loop_start=read8();
+ env->loop_end=read8();
+ }
+ else
+ {
+ skip8( 2 );
+ }
+ if( env_sus )
+ {
+ env->sus_start=read8();
+ env->sus_end=read8();
+ }
+ else
+ {
+ skip8( 2 );
+ }
+ for( x = 0; x < 25; x++ )
+ {
+ env->node_y[x] = read8();
+ if( unsign )
+ env->node_y[x] += 32;
+ env->node_x[x] = read16();
+
+ }
+ read8(); // unused byte
+ env->env_enabled = env_enabled;
+ return env_enabled;
+}
+
+int Load_IT_Instrument( Instrument* inst, bool verbose, int index )
+{
+ u16 a;
+ int x;
+
+ memset( inst, 0, sizeof( Instrument ) );
+
+ skip8( 17 );
+ inst->nna =read8();
+ inst->dct =read8();
+ inst->dca =read8();
+ a=read16(); if( a > 255 ) a = 255;
+ inst->fadeout =(u8)a;
+ skip8( 2 );
+ inst->global_volume =read8();
+ a= read8();
+ a = (a&128) | ((a&127)*2 > 127 ? 127 : (a&127)*2);
+ inst->setpan =a^128;
+ inst->random_volume =read8();
+ skip8( 5 );
+ for( x = 0; x < 26; x++ )
+ inst->name[x] = read8();
+ skip8( 6 );
+
+ for( x = 0; x < 120; x++ )
+ inst->notemap[x] = read16();
+
+ inst->env_flags=0;
+
+ Load_IT_Envelope( &inst->envelope_volume, false );
+ inst->env_flags |= inst->envelope_volume.env_valid ? 1 : 0;
+ inst->env_flags |= inst->envelope_volume.env_enabled ? 8 : 0;
+
+ Load_IT_Envelope( &inst->envelope_pan, true );
+ inst->env_flags |= inst->envelope_pan.env_enabled ? 2 : 0;
+
+ Load_IT_Envelope( &inst->envelope_pitch, true );
+ inst->env_flags |= inst->envelope_pitch.env_enabled ? 4 : 0;
+
+ if( verbose )
+ {
+ printf( vstr_it_instr, \
+ index+1, \
+ (inst->global_volume*100)/128, \
+ ((inst->nna==0)?"CUT":((inst->nna==1)?"CON":((inst->nna==2)?"OFF":((inst->nna==3)?"FAD":"???")))), \
+ (inst->env_flags&8)?"V":"-", \
+ (inst->env_flags&2)?"P":"-", \
+ (inst->env_flags&4)?"T":"-", \
+ inst->name );
+
+ /* printf( "%i%% ", (inst->global_volume*100) / 128 );
+ switch( inst->nna )
+ {
+ case 0:
+ printf( "%s ", "CUT" ); break;
+ case 1:
+ printf( "%s ", "OFF" ); break;
+ case 2:
+ printf( "%s ", "CONT" ); break;
+ case 3:
+ printf( "%s ", "FADE" ); break;
+ }
+ if( (!(inst->env_flags & 2)) && (!(inst->env_flags & 4)) && (!(inst->env_flags & 8)) )
+ {
+ printf( "- " );
+ }
+ else
+ {
+ if( inst->env_flags & 8)
+ printf( "V" );
+ if( inst->env_flags & 2)
+ printf( "P" );
+ if( inst->env_flags & 4)
+ printf( "S" );
+ printf( " " );
+ }
+ printf( "%s\n", inst->name );*/
+ }
+
+ skip8( 7 );
+ return 0;
+}
+
+void Create_IT_Instrument( Instrument* inst, int sample )
+{
+ int x;
+
+ memset( inst, 0, sizeof( Instrument ) );
+
+ inst->global_volume =128;
+
+ for( x = 0; x < 120; x++ )
+ inst->notemap[x] = x+sample*256;
+}
+
+int Load_IT_Sample( Sample* samp )
+{
+ bool bit16;
+ bool hasloop;
+ bool pingpong;
+ bool samp_unsigned=false;
+ u8 a;
+ u32 samp_length;
+ u32 loop_start;
+ u32 loop_end;
+ u32 c5spd;
+ u32 data_address;
+ int x;
+
+ memset( samp, 0, sizeof( Sample ) );
+ samp->msl_index = 0xFFFF;
+
+ if( read32() != 'SPMI' )
+ return ERR_UNKNOWNSAMPLE;
+ for( x = 0; x < 12; x++ ) // dos filename
+ samp->filename[x] = read8();
+ if( read8() != 0 )
+ return ERR_UNKNOWNSAMPLE;
+ samp->global_volume = read8();
+ a = read8();
+ samp->it_compression = a & 8 ? 1 : 0;
+ bit16 = a & 2;
+ hasloop = a & 16;
+ pingpong = a & 64;
+ samp->default_volume = read8();
+ for( x = 0; x < 26; x++ )
+ samp->name[x] = read8();
+ a=read8();
+ samp->default_panning = read8();
+ samp->default_panning = (((samp->default_panning&127) == 64) ? 127 : (samp->default_panning<<1)) | (samp->default_panning&128);
+ if( !(a & 1) )
+ samp_unsigned=true;
+ samp_length = read32();
+ loop_start=read32();
+ loop_end=read32();
+ c5spd=read32();
+
+ samp->frequency = c5spd;
+ samp->sample_length = samp_length;
+ samp->loop_start = loop_start;
+ samp->loop_end = loop_end;
+
+ skip8( 8 ); // susloop start/end
+ data_address = read32();
+ samp->vibspeed = read8();
+ samp->vibdepth = read8();
+ samp->vibrate = read8();
+ samp->vibtype = read8();
+ samp->datapointer = data_address;
+ if( hasloop )
+ {
+ if( pingpong )
+ samp->loop_type = 2;
+ else
+ samp->loop_type = 1;
+ samp->loop_start = loop_start;
+ samp->loop_end = loop_end;
+ }
+ else
+ {
+ samp->loop_type = 0;
+ }
+ samp->format = (bit16 ? SAMPF_16BIT : 0) | (samp_unsigned ? 0 : SAMPF_SIGNED );
+ if( samp->sample_length == 0 ) samp->loop_type = 0;
+ return 0;
+}
+
+int Load_IT_Sample_CMP( u8 *p_dest_buffer, int samp_len, u16 cmwt, bool bit16 );
+int Load_IT_SampleData( Sample* samp, u16 cwmt )
+{
+ u32 x;
+ int a;
+ if( samp->sample_length == 0 ) return 0;
+ if( samp->format & SAMPF_16BIT )
+ samp->data = (u16*)malloc( (u32)(samp->sample_length)*2 );
+ else
+ samp->data = (u8*)malloc( (u32)(samp->sample_length) );
+
+ if( !samp->it_compression )
+ {
+
+ for( x = 0; x < samp->sample_length; x++ )
+ {
+ if( samp->format & SAMPF_16BIT )
+ {
+ if( !(samp->format & SAMPF_SIGNED) )
+ {
+ a = (unsigned short)read16();
+ }
+ else
+ {
+ a = (signed short)read16();
+ a += 32768;
+ }
+ ((u16*)samp->data)[x] = (u16)a;
+ }
+ else
+ {
+ if( !(samp->format & SAMPF_SIGNED) )
+ {
+ a = (unsigned char)read8();
+ }
+ else
+ {
+ a = (signed char)read8();
+ a += 128;
+ }
+ ((u8*)samp->data)[x] = (u8)a;
+ }
+
+ }
+ }
+ else
+ {
+ Load_IT_Sample_CMP( samp->data, samp->sample_length, cwmt, (bool)(samp->format & SAMPF_16BIT) );
+ }
+ FixSample( samp );
+ return 0;
+}
+
+int Empty_IT_Pattern( Pattern *patt ) {
+
+ int x;
+ memset( patt, 0, sizeof( Pattern ) );
+ patt->nrows = 64;
+ for( x = 0; x < patt->nrows*MAX_CHANNELS; x++ ) {
+ patt->data[x].note = 250; // special clears for vol¬e
+ patt->data[x].vol = 255;
+ }
+ return ERR_NONE;
+}
+
+int Load_IT_Pattern( Pattern* patt )
+{
+ int x;
+ int clength;
+ u8 chanvar;
+ u8 chan;
+ u8 maskvar;
+
+ u8 old_maskvar[MAX_CHANNELS];
+ u8 old_note[MAX_CHANNELS];
+ u8 old_inst[MAX_CHANNELS];
+ u8 old_vol[MAX_CHANNELS];
+ u8 old_fx[MAX_CHANNELS];
+ u8 old_param[MAX_CHANNELS];
+
+ memset( patt, 0, sizeof( Pattern ) );
+
+ clength = read16();
+ patt->nrows = read16();
+ skip8(4);
+
+ patt->clength = clength;
+
+ for( x = 0; x < patt->nrows*MAX_CHANNELS; x++ )
+ {
+ patt->data[x].note = 250; // special clears for vol¬e
+ patt->data[x].vol = 255;
+ }
+
+
+ // DECOMPRESS IT PATTERN
+
+ for( x = 0; x < patt->nrows; x++ )
+ {
+GetNextChannelMarker:
+ chanvar = read8(); // Read byte into channelvariable.
+ if( chanvar == 0 ) // if(channelvariable = 0) then end of row
+ continue;
+
+ chan = (chanvar-1) & 63; // Channel = (channelvariable-1) & 63
+ if( chan >= MAX_CHANNELS )
+ return ERR_MANYCHANNELS;
+
+ if( chanvar & 128 ) // if(channelvariable & 128) then read byte into maskvariable
+ old_maskvar[chan] = read8();
+
+ maskvar = old_maskvar[chan];
+
+ if( maskvar & 1 ) // if(maskvariable & 1), then read note. (byte value)
+ {
+ old_note[chan] = read8();
+ patt->data[x*MAX_CHANNELS+chan].note = old_note[chan];
+ }
+
+ if( maskvar & 2 ) // if(maskvariable & 2), then read instrument (byte value)
+ {
+ old_inst[chan] = read8();
+ patt->data[x*MAX_CHANNELS+chan].inst = old_inst[chan];
+ }
+
+ if( maskvar & 4 ) // if(maskvariable & 4), then read volume/panning (byte value)
+ {
+ old_vol[chan] = read8();
+ patt->data[x*MAX_CHANNELS+chan].vol = old_vol[chan];
+ }
+
+ if( maskvar & 8 ) // if(maskvariable & 8), then read command (byte value) and commandvalue
+ {
+ old_fx[chan] = read8();
+ patt->data[x*MAX_CHANNELS+chan].fx = old_fx[chan];
+ old_param[chan] = read8();
+ patt->data[x*MAX_CHANNELS+chan].param = old_param[chan];
+ }
+
+ if( maskvar & 16 ) // if(maskvariable & 16), then note = lastnote for channel
+ patt->data[x*MAX_CHANNELS+chan].note = old_note[chan];
+ if( maskvar & 32 ) // if(maskvariable & 32), then instrument = lastinstrument for channel
+ patt->data[x*MAX_CHANNELS+chan].inst = old_inst[chan];
+ if( maskvar & 64 ) // if(maskvariable & 64), then volume/pan = lastvolume/pan for channel
+ patt->data[x*MAX_CHANNELS+chan].vol = old_vol[chan];
+ if( maskvar & 128 ) // if(maskvariable & 128), then {
+ {
+ patt->data[x*MAX_CHANNELS+chan].fx = old_fx[chan]; // command = lastcommand for channel and
+ patt->data[x*MAX_CHANNELS+chan].param = old_param[chan];// commandvalue = lastcommandvalue for channel
+ }
+ goto GetNextChannelMarker;
+ }
+
+ return ERR_NONE;
+}
+
+int Load_IT( MAS_Module* itm, bool verbose )
+{
+ u8 b;
+ u16 w;
+ int x;
+ int cc;
+
+ u16 cwt;
+ u16 cmwt;
+
+ u32* parap_inst;
+ u32* parap_samp;
+ u32* parap_patt;
+
+ bool instr_mode;
+
+ memset( itm, 0, sizeof( MAS_Module ) );
+
+ if( read32() != 'MPMI' )
+ return ERR_INVALID_MODULE;
+ for( x = 0; x < 28; x++ )
+ itm->title[x] = read8();
+ itm->order_count = (u16)read16();
+ itm->inst_count = (u8)read16();
+ itm->samp_count = (u8)read16();
+ itm->patt_count = (u8)read16();
+ cwt = read16();
+ cmwt = read16(); // upward compatible
+ //skip8( 4 ); // created with tracker / upward compatible
+ w = read16(); // flags
+ itm->stereo = w & 1;
+ itm->inst_mode = instr_mode = w & 4;
+ itm->freq_mode = w & 8;
+ itm->old_effects = w & 16;
+ itm->link_gxx = w & 32;
+ skip8( 2 ); // special
+ itm->global_volume = read8();
+ skip8( 1 ); // mix volume
+ itm->initial_speed = read8();
+ itm->initial_tempo = read8();
+
+ if( verbose )
+ {
+ printf( vstr_it_div );
+ printf( "Loading IT, \"%s\"\n", itm->title );
+ printf( vstr_it_div );
+ printf( "#Orders......%i\n", itm->order_count );
+ printf( "#Instr.......%i\n", itm->inst_count );
+ printf( "#Samples.....%i\n", itm->samp_count );
+ printf( "#Patterns....%i\n", itm->patt_count );
+ printf( "Stereo.......%s\n", itm->stereo ? "Yes" : "No" );
+ printf( "Slides.......%s\n", itm->freq_mode ? "Linear" : "Amiga" );
+ printf( "Old Effects..%s\n", itm->old_effects ? "Yes" : "No" );
+ printf( "Global Vol...%i%%\n", (itm->global_volume*100)/128 );
+ printf( "Speed........%i\n", itm->initial_speed );
+ printf( "Tempo........%i\n", itm->initial_tempo );
+ printf( "Instruments..%s\n", instr_mode ? "Yes" : "Will be supplied" );
+ printf( vstr_it_div );
+ }
+ skip8( 12 ); // SEP, PWD, MSGLENGTH, MESSAGE OFFSET, [RESERVED]
+ for( x = 0; x < 64; x++ )
+ {
+ b = read8();
+ if( x < MAX_CHANNELS )
+ itm->channel_panning[x] = b*4 > 255 ? 255 : b*4; // map 0->64 to 0->255
+ }
+ for( x = 0; x < 64; x++ )
+ {
+ b = read8();
+ if( x < MAX_CHANNELS )
+ itm->channel_volume[x] = b;
+ }
+ for( x = 0; x < itm->order_count; x++ )
+ itm->orders[x] = read8();
+
+ parap_inst = (u32*)malloc( itm->inst_count * sizeof( u32 ) );
+ parap_samp = (u32*)malloc( itm->samp_count * sizeof( u32 ) );
+ parap_patt = (u32*)malloc( itm->patt_count * sizeof( u32 ) );
+
+ for( x = 0; x < itm->inst_count; x++ )
+ parap_inst[x] = read32();
+ for( x = 0; x < itm->samp_count; x++ )
+ parap_samp[x] = read32();
+ for( x = 0; x < itm->patt_count; x++ )
+ parap_patt[x] = read32();
+
+ itm->samples = (Sample*)malloc( itm->samp_count * sizeof( Sample ) );
+ itm->patterns = (Pattern*)malloc( itm->patt_count * sizeof( Pattern ) );
+
+ if( instr_mode )
+ {
+ itm->instruments = (Instrument*)malloc( itm->inst_count * sizeof( Instrument ) );
+ if( verbose )
+ {
+ printf( "Loading Instruments...\n" );
+ printf( vstr_it_instr_top );
+ printf( vstr_it_instr_head );
+#ifdef vstr_it_instr_slice
+ printf( vstr_it_instr_slice );
+#endif
+ //printf( "INDEX VOLUME NNA ENV NAME\n" );
+ }
+
+ // read instruments
+ for( x = 0; x < itm->inst_count; x++ )
+ {
+ // if( verbose )
+ // printf( "%i ", x+1 );
+ file_seek_read( parap_inst[x], SEEK_SET );
+ Load_IT_Instrument( &itm->instruments[x], verbose, x );
+ }
+
+ if( verbose )
+ {
+ printf( vstr_it_instr_bottom );
+ }
+ }
+
+ if( verbose )
+ {
+ printf( "Loading Samples...\n" );
+ printf( vstr_it_samp_top );
+ printf( vstr_it_samp_head );
+#ifdef vstr_it_samp_slice
+ printf( vstr_it_samp_slice );
+#endif
+ //printf( "INDEX VOLUME DVOLUME LOOP MID-C NAME\n" );
+ }
+
+ // read samples
+ for( x = 0; x < itm->samp_count; x++ )
+ {
+ file_seek_read( parap_samp[x], SEEK_SET );
+ Load_IT_Sample( &itm->samples[x] );
+ if( verbose )
+ {
+ printf( vstr_it_samp, x+1, (itm->samples[x].global_volume * 100) / 64, (itm->samples[x].default_volume * 100) / 64, itm->samples[x].loop_type == 0 ? "None" : (itm->samples[x].loop_type == 1 ? "Forw" : "BIDI"), itm->samples[x].frequency, itm->samples[x].name );
+ //printf( "%i %i%% %i%% %s %ihz %s\n", x+1, (itm->samples[x].global_volume*100) / 64, (itm->samples[x].default_volume*100) / 64, itm->samples[x].loop_type == 0 ? "None" : (itm->samples[x].loop_type == 1 ? "Yes" : "BIDI"), itm->samples[x].frequency, itm->samples[x].name );
+ }
+ }
+
+ if( verbose )
+ {
+ printf( vstr_it_samp_bottom );
+ }
+
+ if( !instr_mode )
+ {
+ if( verbose )
+ {
+ printf( "Adding Instrument Templates...\n" );
+ printf( vstr_it_div );
+ }
+ itm->inst_count = itm->samp_count;
+ itm->instruments = (Instrument*)malloc( itm->inst_count * sizeof( Instrument ) );
+ cc=0;
+ for( x = 0; x < itm->samp_count; x++ )
+ {
+ if( verbose )
+ {
+ printf( " * %2i", x+1 );
+ cc++;
+ if( cc == 15)
+ {
+ cc=0;
+ printf("\n");
+ }
+ }
+ Create_IT_Instrument( &itm->instruments[x], x+1 );
+ }
+ if( verbose )
+ {
+ if( cc != 0 )
+ printf( (((x+1)%15)==0)?"":"\n" );
+ printf( vstr_it_div );
+ }
+ }
+
+ if(verbose)
+ {
+ printf( "Reading Patterns...\n" );
+ printf( vstr_it_div );
+ }
+
+ // read patterns
+ cc=0;
+ for( x = 0; x < itm->patt_count; x++ )
+ {
+ file_seek_read( parap_patt[x], SEEK_SET );
+ if( parap_patt[x] != 0 )
+ {
+ if( verbose )
+ {
+ printf( vstr_it_pattern, x+1 );
+ cc++;
+ if( cc == 15 )
+ {
+ cc=0;
+ printf("\n");
+ }
+ }
+ Load_IT_Pattern( &itm->patterns[x] );
+
+ }
+ else
+ {
+ Empty_IT_Pattern( &itm->patterns[x] );
+ //memset( &itm->patterns[x], 0, sizeof( Pattern ) );
+ }
+ }
+
+
+ if( verbose )
+ {
+ if( cc != 0 )
+ printf( "\n" );
+ printf( vstr_it_div );
+ printf( "Loading Sample Data...\n" );
+ }
+ // read sample data
+ for( x = 0; x < itm->samp_count; x++ )
+ {
+ file_seek_read( itm->samples[x].datapointer, SEEK_SET );
+ Load_IT_SampleData( &itm->samples[x], cmwt );
+ }
+
+ if( verbose )
+ {
+ printf( vstr_it_div );
+ }
+
+ free( parap_inst );
+ free( parap_samp );
+ free( parap_patt );
+
+ return ERR_NONE;
+}
+
+/* * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE
+
+ -The following sample decompression code is based on CHIBITRACKER's code (http://chibitracker.berlios.de) which is based on xmp's code.(http://xmp.helllabs.org) which is based in openCP code.
+
+* NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE */
+
+int Load_IT_CompressedSampleBlock( u8** buffer )
+{
+ u32 size;
+ u32 x;
+ size = read16();
+ (*buffer) = (u8*)malloc( size+4 );
+ (*buffer)[size+0]=0;
+ (*buffer)[size+1]=0;
+ (*buffer)[size+2]=0;
+ (*buffer)[size+3]=0;
+ for( x = 0; x < size; x++ )
+ (*buffer)[x] = read8();
+ return ERR_NONE;
+}
+
+int Load_IT_Sample_CMP( u8 *p_dest_buffer, int samp_len, u16 cmwt, bool bit16 )
+{
+ u8* c_buffer=NULL;
+ u16 block_length; // length of compressed data block in samples
+ u16 block_position; // position in block
+ u8 bit_width; // actual "bit width"
+ u32 aux_value; // value read from file to be processed
+ s16 d1, d2; // integrator buffers (d2 for it2.15)
+ s8 d18, d28;
+ s8 v8; // sample value
+ s16 v16; // sample value 16 bit
+ bool it215; // is this an it215 module?
+ u16 border;
+ u8 tmp_shift;
+ u32 bit_readpos=0;
+ int i;
+
+ u32 nbits, dsize;
+
+ u8 *dest8_write = (u8 *)p_dest_buffer;
+ u16 *dest16_write = (u16 *)p_dest_buffer;
+
+ nbits = bit16 ? 16 : 8;
+ dsize = bit16 ? 4 : 3;
+ for (i=0;i<samp_len;i++)
+ p_dest_buffer[i]=128;
+
+
+
+ it215=(cmwt==0x215);
+
+ // now unpack data till the dest buffer is full
+
+ while( samp_len )
+ {
+ // read a new block of compressed data and reset variables
+ Load_IT_CompressedSampleBlock( &c_buffer );
+ bit_readpos=0;
+ if( bit16 )
+ block_length = (samp_len < 0x4000) ? samp_len : 0x4000;
+ else
+ block_length = (samp_len < 0x8000) ? samp_len : 0x8000;
+ block_position = 0;
+ bit_width = nbits+1; // start with width of 9 bits
+ d1 = d2 = d18=d28=0; // reset integrator buffers
+
+
+ // now uncompress the data block
+ while ( block_position < block_length ) {
+
+ aux_value = readbits( c_buffer, bit_readpos, bit_width ); // read bits
+ bit_readpos+=bit_width;
+
+ if ( bit_width < 7 ) { // method 1 (1-6 bits)
+
+ if( bit16 )
+ {
+ if ( (signed)aux_value == (1 << (bit_width - 1)) ) { // check for "100..."
+
+ aux_value = readbits( c_buffer, bit_readpos, dsize )+1; //read_n_bits_from_IT_compressed_block(3) + 1; // yes -> read new width;
+ bit_readpos += dsize;
+ bit_width = (aux_value < bit_width) ? aux_value : aux_value + 1;
+ // and expand it
+ continue; // ... next value
+ }
+ }
+ else
+ {
+ if ( aux_value == ((u32)1 << ((u32)bit_width - 1)) ) { // check for "100..."
+
+ aux_value = readbits( c_buffer, bit_readpos, dsize )+1; //read_n_bits_from_IT_compressed_block(3) + 1; // yes -> read new width;
+ bit_readpos += dsize;
+ bit_width = (aux_value < bit_width) ? aux_value : aux_value + 1;
+ // and expand it
+ continue; // ... next value
+ }
+ }
+
+ } else if ( bit_width < nbits + 1 ) { // method 2 (7-8 bits)
+
+ if( bit16 )
+ {
+ border = (0xFFFF >> ((nbits+1) - bit_width)) - (nbits/2);
+ // lower border for width chg
+
+ if ( (int)aux_value > (int)border && (int)aux_value <= ((int)border + nbits) ) {
+
+ aux_value -= border; // convert width to 1-8
+ bit_width = (aux_value < bit_width) ? aux_value : aux_value + 1;
+ // and expand it
+ continue; // ... next value
+ }
+ }
+ else
+ {
+ border = (0xFF >> ((nbits+1) - bit_width)) - (nbits/2);
+ // lower border for width chg
+
+ if ( aux_value > border && aux_value <= (border + nbits) ) {
+
+ aux_value -= border; // convert width to 1-8
+ bit_width = (aux_value < bit_width) ? aux_value : aux_value + 1;
+ // and expand it
+ continue; // ... next value
+ }
+ }
+
+ } else if ( bit_width == nbits+1 ) { // method 3 (9 bits)
+
+ if ( aux_value & (1<<nbits) ) { // bit 8 set?
+
+ bit_width = (aux_value + 1) & 0xff; // new width...
+ continue; // ... and next value
+ }
+
+ } else { // illegal width, abort
+
+ if( c_buffer ) {
+ free( c_buffer ); c_buffer=NULL; }
+ return ERR_UNKNOWNSAMPLE;
+ }
+
+ // now expand value to signed byte
+ if ( bit_width < nbits ) {
+
+ tmp_shift = nbits - bit_width;
+ if( bit16 )
+ {
+ v16=(aux_value << tmp_shift);
+ v16>>=tmp_shift;
+ }
+ else
+ {
+ v8=(aux_value << tmp_shift);
+ v8>>=tmp_shift;
+ }
+
+ }
+ else
+ {
+ if( bit16 )
+ v16 = (s16) aux_value;
+ else
+ v8 = (s8) aux_value;
+ }
+
+ if( bit16 )
+ {
+ // integrate upon the sample values
+ d1 += v16;
+ d2 += d1;
+
+ // ... and store it into the buffer
+ *(dest16_write++) = (it215 ? d2+32768 : d1+32768);
+ }
+ else
+ {
+ // integrate upon the sample values
+ d18 += v8;
+ d28 += d18;
+
+ // ... and store it into the buffer
+ *(dest8_write)++ = (it215 ? (int)d28+128 : (int)d18+128);
+ }
+ block_position++;
+
+ }
+
+ // now subtract block lenght from total length and go on
+ if( c_buffer ) {
+ free( c_buffer ); c_buffer=NULL; }
+ samp_len -= block_length;
+ }
+
+ return ERR_NONE;
+}
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef IT_H
+#define IT_H
+
+int Load_IT( MAS_Module* itm, bool verbose );
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#include "defs.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+u32 time_start;
+
+void kiwi_start( void )
+{
+ int r;
+ time_start = time(NULL);
+ srand( time_start );
+ r=0;
+
+ rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();rand();
+
+ switch( r )
+ {
+ case 0:
+ printf( "Your lucky number today is %i!\n", rand() );
+ break;
+ }
+
+}
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+// this is
+// VERSION 1.8e
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "defs.h"
+#include "mas.h"
+#include "mod.h"
+#include "s3m.h"
+#include "xm.h"
+#include "it.h"
+#include "gba.h"
+#include "nds.h"
+#include "files.h"
+#include "errors.h"
+#include "simple.h"
+#include "msl.h"
+#include "systems.h"
+#include "wav.h"
+#include "samplefix.h"
+
+extern void kiwi_start(void);
+
+int target_system;
+
+bool ignore_sflags;
+int PANNING_SEP;
+
+int number_of_inputs;
+
+#define USAGE "\n\
+************************\n\
+* Maxmod Utility *\n\
+************************\n\
+\n\
+Usage:\n\
+ mmutil [options] input files ...\n\
+\n\
+ Input may be MOD, S3M, XM, IT, and/or WAV\n\
+\n\
+.------------.----------------------------------------------------.\n\
+| Option | Description |\n\
+|------------|----------------------------------------------------|\n\
+| -o<output> | Set output file. |\n\
+| -h<header> | Set header output file. |\n\
+| -m | Output MAS file rather than soundbank. |\n\
+| -d | Use for NDS projects. |\n\
+| -b | Create test ROM. (use -d for .nds, otherwise .gba) |\n\
+| -i | Ignore sample flags. |\n\
+| -v | Enable verbose output. |\n\
+| -p | Set initial panning separation for MOD/S3M. |\n\
+`-----------------------------------------------------------------'\n\
+\n\
+.-----------------------------------------------------------------.\n\
+| Examples: |\n\
+|-----------------------------------------------------------------|\n\
+| Create DS soundbank file (soundbank.bin) from input1.xm |\n\
+| and input2.it Also output header file (soundbank.h) |\n\
+| |\n\
+| mmutil -d input1.xm input2.it -osoundbank.bin -hsoundbank.h |\n\
+|-----------------------------------------------------------------|\n\
+| Create test GBA ROM from two inputs |\n\
+| |\n\
+| mmutil -b input1.mod input2.s3m -oTEST.gba |\n\
+|-----------------------------------------------------------------|\n\
+| Create test NDS ROM from three inputs |\n\
+| |\n\
+| mmutil -d -b input1.xm input2.s3m testsound.wav |\n\
+`-----------------------------------------------------------------'\n\
+ www.maxmod.org\n\
+"
+
+void print_usage( void )
+{
+ printf( USAGE );
+}
+
+void print_error( int err )
+{
+ switch( err )
+ {
+ case ERR_INVALID_MODULE:
+ printf( "Invalid module!\n" );
+ break;
+ case ERR_MANYARGS:
+ printf( "Too many arguments!\n" );
+ break;
+ case ERR_NOINPUT:
+ printf( "No input file!\n" );
+ break;
+ case ERR_NOWRITE:
+ printf( "Unable to write file!\n" );
+ break;
+ case ERR_BADINPUT:
+ printf( "Cannot parse input filename!\n" );
+ break;
+ }
+}
+
+int GetYesNo( void )
+{
+ char c = 0;
+ c = tolower(getchar());
+ while( getchar() != '\n' );
+ while( c != 'y' && c != 'n' )
+ {
+ printf( "Was that a yes? " );
+ c = tolower(getchar());
+ while( getchar() != '\n' );
+ }
+ return c == 'y' ? 1 : 0;
+}
+
+//------------------------------------------------------------------------------------------------
+int main(int argc, char* argv[])
+//------------------------------------------------------------------------------------------------
+{
+ char* str_input=NULL;
+ char* str_output=NULL;
+ char* str_header=NULL;
+
+ MAS_Module mod;
+
+ int strl;
+
+ int input_type=0;
+
+ int strp;
+ int strpi;
+
+ bool g_flag=false;
+ bool v_flag=false;
+ bool m_flag=false;
+ bool z_flag=false;
+ int a;
+
+ int output_size;
+
+ ignore_sflags=false;
+
+ number_of_inputs=0;
+
+ PANNING_SEP = 128;
+
+ //------------------------------------------------------------------------
+ // parse arguments
+ //------------------------------------------------------------------------
+
+ for( a = 1; a < argc; a++ )
+ {
+ if( argv[a][0] == '-' )
+ {
+ if( argv[a][1] == 'b' )
+ g_flag = true;
+ else if( argv[a][1] == 'v' )
+ v_flag = true;
+ else if( argv[a][1] == 'd' )
+ target_system = SYSTEM_NDS;
+ else if( argv[a][1] == 'i' )
+ ignore_sflags = true;
+ else if( argv[a][1] == 'p' )
+ PANNING_SEP = ((argv[a][2] - '0') * 256)/9;
+ else if( argv[a][1] == 'o' )
+ str_output = argv[a]+2;
+ else if( argv[a][1] == 'h' )
+ str_header = argv[a]+2;
+ else if( argv[a][1] == 'm' )
+ m_flag = true;
+ else if( argv[a][1] == 'z' )
+ z_flag = true;
+ }
+ else if( !str_input )
+ {
+ str_input = argv[a];
+ number_of_inputs=1;
+ }
+ else
+ {
+ number_of_inputs++;
+ }
+ }
+
+ if( number_of_inputs==0 )
+ {
+ print_usage();
+ return 0;
+ }
+
+ if( z_flag )
+ {
+ kiwi_start();
+ file_open_read( str_input );
+ Sample s;
+
+ Load_WAV( &s, false,false );
+
+ s.name[0] = '%';
+ s.name[1] = 'c';
+ s.name[2] = 0;
+
+ FixSample( &s );
+
+ file_close_read();
+ file_open_write( str_output );
+
+ int i;
+ for( i = 0; i < s.sample_length; i++ )
+ write8( ((u8*)s.data)[i] );
+
+ file_close_write();
+ printf("okay\n");
+ return 0;
+ }
+
+ if( m_flag & g_flag )
+ {
+ printf("-m and -g cannot be combined.\n");
+ return -1;
+ }
+
+ if( m_flag && number_of_inputs != 1 )
+ {
+ printf( "-m only supports one input.\n" );
+ return -1;
+ }
+
+ //---------------------------------------------------------------------------
+ // m/g generate output target if not given
+ //---------------------------------------------------------------------------
+
+ if( m_flag || g_flag)
+ {
+ if( !str_output )
+ {
+ if( number_of_inputs == 1 )
+ {
+ if( strlen(str_input) < 4 )
+ {
+ print_error( ERR_BADINPUT );
+ return -1;
+ }
+ strp = strlen(str_input);
+ str_output = (char*)malloc( strp+2 );
+ strcpy(str_output, str_input);
+ strp=strlen(str_output)-1;
+
+ for( strpi=strp; str_output[strpi] != '.' && strpi != 0; strpi-- );
+ if( strpi == 0 )
+ {
+ print_error( ERR_BADINPUT );
+ return -1;
+ }
+
+ str_output[strpi++] = '.';
+ if( !g_flag )
+ {
+ str_output[strpi++] = 'm';
+ str_output[strpi++] = 'a';
+ str_output[strpi++] = 's';
+ str_output[strpi++] = 0;
+ }
+ else
+ {
+ if( target_system == SYSTEM_GBA )
+ {
+ str_output[strpi++] = 'g';
+ str_output[strpi++] = 'b';
+ str_output[strpi++] = 'a';
+ str_output[strpi++] = 0;
+ }
+ else if( target_system == SYSTEM_NDS )
+ {
+ str_output[strpi++] = 'n';
+ str_output[strpi++] = 'd';
+ str_output[strpi++] = 's';
+ str_output[strpi++] = 0;
+ }
+ else
+ {
+ // error!
+ }
+ }
+ str_output[strpi++] = 0;
+ }
+ else
+ {
+ printf( "No output file! (-o option)\n" );
+ return -1;
+ }
+ }
+ }
+
+ // catch filename too small
+ strl=strlen(str_input);
+ if( strl < 4 )
+ {
+ print_error( ERR_BADINPUT );
+ return -1;
+ }
+
+ if( m_flag )
+ {
+ if( file_open_read( str_input ) )
+ {
+ printf( "Cannot open %s for reading!\n", str_input );
+ return -1;
+ }
+ input_type = get_ext( str_input );
+
+ switch( input_type )
+ {
+ //------------------------------------------------------
+ case INPUT_TYPE_MOD:
+ //------------------------------------------------------
+ if( Load_MOD( &mod, v_flag ) )
+ {
+ print_error( ERR_INVALID_MODULE );
+ file_close_read();
+ return -1;
+ }
+ break;
+ //------------------------------------------------------
+ case INPUT_TYPE_S3M:
+ //------------------------------------------------------
+ if( Load_S3M( &mod, v_flag ) )
+ {
+ print_error( ERR_INVALID_MODULE );
+ file_close_read();
+ return -1;
+ }
+ break;
+ //------------------------------------------------------
+ case INPUT_TYPE_XM:
+ //------------------------------------------------------
+ if( Load_XM( &mod, v_flag ) )
+ {
+ print_error( ERR_INVALID_MODULE );
+ file_close_read();
+ return -1;
+ }
+ break;
+ //------------------------------------------------------
+ case INPUT_TYPE_IT:
+ //------------------------------------------------------
+ if( Load_IT( &mod, v_flag ) )
+ {
+ // ERROR!
+ print_error( ERR_INVALID_MODULE );
+ file_close_read();
+ return -1;
+ }
+ break;
+ }
+
+ file_close_read();
+
+ if( file_exists( str_output ) )
+ {
+ printf( "Output file exists! Overwrite? (y/n) " );
+ if( !GetYesNo() )
+ {
+ printf( "Operation Canceled!\n" );
+ return -1;
+ }
+
+ }
+
+ if( file_open_write( str_output ) )
+ {
+ print_error( ERR_NOWRITE );
+ return -1;
+ }
+
+ printf( "Writing .mas............\n" );
+
+ // output MAS
+ output_size = Write_MAS( &mod, v_flag, false );
+
+
+ file_close_write();
+
+ Delete_Module( &mod );
+
+ if( v_flag )
+ {
+#ifdef SUPER_ASCII
+ printf( "Success! \x02 \n" );
+#else
+ printf( "Success! :) \n" );
+#endif
+ }
+ }
+ else if( g_flag )
+ {
+ int i;
+
+ MSL_Create( argv, argc, "tempSH308GK.bin", 0, v_flag );
+
+ if( file_exists( str_output ) )
+ {
+ printf( "Output file exists! Overwrite? (y/n) " );
+ if( !GetYesNo() )
+ {
+ printf( "Operation Canceled!\n" );
+ return -1;
+ }
+
+ }
+
+ if( file_open_write( str_output ) )
+ {
+ print_error( ERR_NOWRITE );
+ return -1;
+ }
+
+ if( target_system == SYSTEM_GBA )
+ {
+ if( v_flag )
+ printf( "Making GBA ROM.......\n" );
+ Write_GBA();
+ }
+ else if( target_system == SYSTEM_NDS )
+ {
+ if( v_flag )
+ printf( "Making NDS ROM.......\n" );
+ Write_NDS();
+ }
+
+ output_size = file_size( "tempSH308GK.bin" );
+ file_open_read( "tempSH308GK.bin" );
+
+ if( target_system == SYSTEM_GBA )
+ {
+ write32( (output_size < 248832) ? 1 : 0 );
+ }
+
+ for( i = 0; i < output_size; i++ )
+ {
+ write8( read8() );
+ }
+
+ file_close_read();
+ file_close_write();
+
+ file_delete( "tempSH308GK.bin" );
+
+ if( g_flag && target_system == SYSTEM_NDS )
+ Validate_NDS( str_output, output_size );
+
+ if( v_flag )
+ {
+ printf( "Success! :D\n" );
+
+ if( g_flag && target_system == SYSTEM_GBA )
+ {
+ if( output_size < 262144 )
+ {
+ printf("ROM can be multibooted!!\n" );
+ }
+ }
+ }
+ }
+ else
+ {
+ MSL_Create( argv, argc, str_output, str_header, v_flag );
+ }
+ return 0;
+}
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#define MAS_C
+
+#include <stdlib.h>
+#include "defs.h"
+#include "files.h"
+#include "mas.h"
+#include "simple.h"
+#include "systems.h"
+#include "version.h"
+
+u32 MAS_OFFSET;
+u32 MAS_FILESIZE;
+
+static int CalcEnvelopeSize( Instrument_Envelope* env )
+{
+ return (env->node_count*4) + 8;
+}
+
+static int CalcInstrumentSize( Instrument* instr )
+{
+ int size;
+ size = 12;
+ if( instr->env_flags & 1 ) // volume envelope exists
+ size += CalcEnvelopeSize( &instr->envelope_volume );
+ if( instr->env_flags & 2 ) // panning envelope exists
+ size += CalcEnvelopeSize( &instr->envelope_pan );
+ if( instr->env_flags & 4 ) // pitch envelope exists
+ size += CalcEnvelopeSize( &instr->envelope_pitch );
+ return size;
+}
+
+void Write_Instrument_Envelope( Instrument_Envelope* env )
+{
+ int x;
+ write8( (u8)(env->node_count*4 + 8) ); // maximum is 6+75
+ write8( env->loop_start );
+ write8( env->loop_end );
+ write8( env->sus_start );
+ write8( env->sus_end );
+ write8( env->node_count );
+ write8( env->env_filter );
+ write8( BYTESMASHER );
+ if( env->node_count > 1 )
+ {
+ int delta;
+ int base;
+ int range;
+ for( x = 0; x < env->node_count; x++ )
+ {
+ base = env->node_y[x];
+ if( x != env->node_count-1 )
+ {
+
+ range = env->node_x[x+1] - env->node_x[x];
+ if( range > 511 ) range = 511;
+ if( range < 1 ) range = 1;
+ delta = (((env->node_y[x+1] - base) * 512) + (range/2)) / range;
+ if( delta > 32767 ) delta = 32767;
+ if( delta < -32768 ) delta = -32768;
+ while( (base+ ((delta*range)>>9)) > 64 ) delta--;
+ while( (base+ ((delta*range)>>9)) < 0 ) delta++;
+ }
+ else
+ {
+ range = 0;
+ delta=0;
+ }
+ write16( (u16)delta );
+ write16( (u16)(base | (range<<7)) );
+ }
+ }
+}
+
+void Write_Instrument( Instrument* inst )
+{
+ int y;
+ int full_notemap;
+ int first_notemap_samp;
+ align32();
+ inst->parapointer = file_tell_write()-MAS_OFFSET;
+ /*write8( inst->global_volume );
+ write8( (u8)inst->fadeout );
+ write8( inst->random_volume );
+ write8( inst->nna );
+ write8( inst->dct );
+ write8( inst->dca );
+ write8( inst->env_flags );
+ write8( inst->setpan );*/
+
+ write8( inst->global_volume );
+ write8( (u8)inst->fadeout );
+ write8( inst->random_volume );
+ write8( inst->dct );
+ write8( inst->nna );
+ write8( inst->env_flags );
+ write8( inst->setpan );
+ write8( inst->dca );
+
+ full_notemap = 0;
+ first_notemap_samp = (inst->notemap[0] >> 8);
+ for( y = 0; y < 120; y++ )
+ {
+ if( ((inst->notemap[y] & 0xFF) != y) ||
+ ((inst->notemap[y] >> 8) != first_notemap_samp) )
+ {
+ full_notemap = 1;
+ break;
+ }
+ }
+
+ if( full_notemap )
+ {
+ // full notemap
+ // write offset here
+ write16( (u16)CalcInstrumentSize( inst ) );
+ }
+ else
+ {
+ // single notemap entry
+ write16( (u16)(0x8000 | first_notemap_samp) );
+ }
+
+ write16( 0 ); // reserved space
+
+ if( inst->env_flags & 1 ) // write volume envelope
+ Write_Instrument_Envelope( &inst->envelope_volume );
+ if( inst->env_flags & 2 ) // write panning envelope
+ Write_Instrument_Envelope( &inst->envelope_pan );
+ if( inst->env_flags & 4 ) // write pitch envelope
+ Write_Instrument_Envelope( &inst->envelope_pitch );
+
+ if( full_notemap )
+ {
+ for( y = 0; y < 120; y++ )
+ write16( inst->notemap[y] );
+ }
+}
+
+void Write_SampleData( Sample* samp )
+{
+ u32 x;
+ u32 sample_length = samp->sample_length;
+ u32 sample_looplen = samp->loop_end - samp->loop_start;
+
+ if( target_system == SYSTEM_GBA )
+ {
+ write32( sample_length );
+ write32( samp->loop_type ? sample_looplen : 0xFFFFFFFF );
+ write8( SAMP_FORMAT_U8 );
+ write8( BYTESMASHER );
+ write16( (u16) ((samp->frequency * 1024 + (15768/2)) / 15768) );
+ // write32( 0);
+ }
+ else
+ {
+ if( samp->format & SAMPF_16BIT )
+ {
+ if( samp->loop_type )
+ {
+ write32( samp->loop_start / 2 );
+ write32( (samp->loop_end-samp->loop_start) / 2 );
+ }
+ else
+ {
+ write32( 0 );
+ write32( sample_length/2 );
+ }
+ }
+ else
+ {
+ if( samp->loop_type )
+ {
+ write32( samp->loop_start / 4 );
+ write32( (samp->loop_end-samp->loop_start) / 4 );
+ }
+ else
+ {
+ write32( 0 );
+ write32( sample_length/4 );
+ }
+ }
+ write8( sample_dsformat( samp ) );
+ write8( sample_dsreptype( samp ) );
+ write16( (u16) ((samp->frequency * 1024 + (32768/2)) / 32768) );
+ write32( 0);
+ }
+
+ // write sample data
+ if( samp->format & SAMPF_16BIT )
+ {
+ for( x = 0; x < sample_length; x++ )
+ write16( ((u16*)samp->data)[x] );
+
+ // add padding data
+ if( samp->loop_type )
+ {
+ write16( ((u16*)samp->data)[samp->loop_start] );
+ write16( ((u16*)samp->data)[samp->loop_start+1] );
+ }
+ else
+ {
+ write16( 0 );
+ write16( 0 );
+ }
+ }
+ else
+ {
+ for( x = 0; x < sample_length; x++ )
+ write8( ((u8*)samp->data)[x] );
+
+ // add padding data
+ if( samp->loop_type )
+ {
+ write8( ((u8*)samp->data)[samp->loop_start] );
+ write8( ((u8*)samp->data)[samp->loop_start+1] );
+ write8( ((u8*)samp->data)[samp->loop_start+2] );
+ write8( ((u8*)samp->data)[samp->loop_start+3] );
+ }
+ else
+ {
+ for ( x = 0; x < 4; x++ )
+ write8( (target_system == SYSTEM_GBA) ? 128 : 0 );
+ }
+ }
+}
+
+void Write_Sample( Sample* samp )
+{
+ align32(); // align data by 32 bits
+ samp->parapointer = file_tell_write()-MAS_OFFSET;
+
+ write8( samp->default_volume );
+ write8( samp->default_panning );
+ write16( (u16)(samp->frequency/4) );
+ write8( samp->vibtype );
+ write8( samp->vibdepth );
+ write8( samp->vibspeed );
+ write8( samp->global_volume );
+ write16( samp->vibrate );
+
+ write16( samp->msl_index );
+
+ if( samp->msl_index == 0xFFFF )
+ Write_SampleData(samp);
+}
+
+void Write_Pattern( Pattern* patt, bool xm_vol )
+{
+ int row;
+ int col;
+
+ u16 last_mask[MAX_CHANNELS];
+ u16 last_note[MAX_CHANNELS];
+ u16 last_inst[MAX_CHANNELS];
+ u16 last_vol[MAX_CHANNELS];
+ u16 last_fx[MAX_CHANNELS];
+ u16 last_param[MAX_CHANNELS];
+
+ u8 chanvar;
+ u8 maskvar;
+
+ u8 emptyvol;
+
+ PatternEntry* pe;
+
+ patt->parapointer = file_tell_write()-MAS_OFFSET;
+ write8( (u8)(patt->nrows-1) );
+
+ patt->cmarks[0] = true;
+ emptyvol = xm_vol ? 0 : 255;
+
+ // using IT pattern compression
+
+ for( row = 0; row < patt->nrows; row++ )
+ {
+ if( patt->cmarks[row] )
+ {
+ for( col=0;col<MAX_CHANNELS;col++ )
+ {
+ last_mask[col] = 256; // row is marked, clear previous data
+ last_note[col] = 256;
+ last_inst[col] = 256;
+ last_vol[col]= 256;
+ last_fx[col] = 256;
+ last_param[col] = 256;
+ }
+ }
+ for( col = 0; col < MAX_CHANNELS; col++ )
+ {
+ pe = &patt->data[row*MAX_CHANNELS+col];
+ if( ((pe->note != 250) || (pe->inst != 0) || (pe->vol != emptyvol) || (pe->fx != 0) || (pe->param != 0)) )
+ {
+ maskvar = 0;
+ chanvar = col+1;
+ if( pe->note != 250 )
+ maskvar |= 1|16;
+
+ if( pe->inst != 0 )
+ maskvar |= 2|32;
+
+ if( pe->note > 250 ) // noteoff/cut disabled start+reset
+ maskvar &= ~(16|32);
+
+ if( pe->vol != emptyvol )
+ maskvar |= 4|64;
+
+ if( pe->fx != 0 || pe->param != 0 )
+ maskvar |= 8|128;
+
+ if( maskvar & 1 )
+ {
+ if( pe->note == last_note[col] )
+ {
+ maskvar &= ~1;
+ }
+ else
+ {
+ last_note[col] = pe->note;
+ if( last_note[col] == 254 || last_note[col] == 255 ) // DONT LET NOTEOFF/NOTECUT USE PREVIOUS PARAMETERS!
+ last_note[col] = 256;
+ }
+ }
+
+ if( maskvar & 2 )
+ {
+ if( pe->inst == last_inst[col] )
+ {
+ maskvar &= ~2;
+ }
+ else
+ {
+ last_inst[col] = pe->inst;
+ }
+ }
+
+ if( maskvar & 4 )
+ {
+ if( pe->vol == last_vol[col] )
+ {
+ maskvar &= ~4;
+ }
+ else
+ {
+ last_vol[col] = pe->vol;
+ }
+ }
+
+ if( maskvar & 8 )
+ {
+ if( (pe->fx == last_fx[col]) && (pe->param == last_param[col]) )
+ {
+ maskvar &= ~8;
+ }
+ else
+ {
+ last_fx[col] = pe->fx;
+ last_param[col] = pe->param;
+ }
+ }
+
+ if( maskvar != last_mask[col] )
+ {
+ chanvar |= 128;
+ last_mask[col] = maskvar;
+ }
+
+ write8( chanvar );
+ if( chanvar & 128 )
+ write8( maskvar );
+ if( maskvar & 1 )
+ write8( pe->note );
+ if( maskvar & 2 )
+ write8( pe->inst );
+ if( maskvar & 4 )
+ write8( pe->vol );
+ if( maskvar & 8 )
+ {
+ write8( pe->fx );
+ write8( pe->param );
+ }
+ }
+ else
+ {
+ continue;
+ }
+ }
+ write8( 0 );
+ }
+
+}
+
+void Mark_Pattern_Row( MAS_Module* mod, int order, int row )
+{
+ Pattern* p;
+
+ if( row >= 256 )
+ return;
+ if( mod->orders[order] == 255 )
+ order = 0;
+ while( mod->orders[order] >= 254 )
+ {
+ if( mod->orders[order] == 255 )
+ return;
+ if( mod->orders[order] == 254 )
+ order++;
+ }
+ p = &(mod->patterns[mod->orders[order]]);
+ p->cmarks[row] = true;
+}
+
+void Mark_Patterns( MAS_Module* mod )
+{
+
+ int o;
+ int p;
+ int row;
+ int col;
+
+ PatternEntry* pe;
+
+ for( o = 0; o < mod->order_count; o++ )
+ {
+ p = mod->orders[o];
+ if( p == 255 )
+ break;
+ if( p == 254 )
+ continue;
+ if( p >= mod->patt_count )
+ continue;
+ for( row = 0; row < mod->patterns[p].nrows; row++ )
+ {
+ for( col = 0; col < MAX_CHANNELS; col++ )
+ {
+ pe = &(mod->patterns[p].data[row*MAX_CHANNELS+col]);
+ if( pe->fx == 3 ) // PATTERN BREAK
+ {
+ if( pe->param != 0 ) // if param != 0 then mark next pattern
+ {
+ Mark_Pattern_Row( mod, o+1, pe->param );
+ }
+ }
+ else if( pe->fx == 19 )
+ {
+ if( pe->param == 0xB0 )
+ {
+ Mark_Pattern_Row( mod, o, row );
+ }
+ }
+ }
+ }
+ }
+}
+
+int Write_MAS( MAS_Module* mod, bool verbose, bool msl_dep )
+{
+ // SEE MAS_FORM.TXT
+ int x; //,y;
+ int fpos_pointer;
+// u8 rsamp=0;
+// u16 rsamps[200];
+// bool unique=false;
+
+ file_get_byte_count();
+
+ write32( BYTESMASHER );
+ write8( MAS_TYPE_SONG );
+ write8( MAS_VERSION );
+ write8( BYTESMASHER );
+ write8( BYTESMASHER );
+
+ MAS_OFFSET = file_tell_write();
+
+ write8( (u8)mod->order_count );
+ write8( mod->inst_count );
+ write8( mod->samp_count );
+ write8( mod->patt_count );
+ write8( (u8)((mod->link_gxx ? 1 : 0) | (mod->old_effects ? 2 : 0) | (mod->freq_mode ? 4 : 0) | (mod->xm_mode ? 8 : 0) | (msl_dep ? 16 : 0) | (mod->old_mode ? 32 : 0)) );
+ write8( mod->global_volume );
+ write8( mod->initial_speed );
+ write8( mod->initial_tempo );
+ write8( mod->restart_pos );
+
+/* for( x = 0; x < mod->samp_count; x++ )
+ {
+ unique=true;
+ for( y = x-1; y >= 0; y-- )
+ {
+ if( mod->samples[x].msl_index == mod->samples[y].msl_index )
+ {
+ mod->samples[x].rsamp_index = mod->samples[y].rsamp_index;
+ unique=false;
+ break;
+ }
+ }
+ if( unique )
+ {
+ rsamps[rsamp]=mod->samples[x].msl_index;
+ mod->samples[x].rsamp_index = rsamp;
+ rsamp++;
+ }
+ }
+ write8( rsamp );*/
+ write8( BYTESMASHER );
+ write8( BYTESMASHER );write8( BYTESMASHER );
+ for( x = 0; x < MAX_CHANNELS; x++ )
+ write8( mod->channel_volume[x] );
+ for( x = 0; x < MAX_CHANNELS; x++ )
+ write8( mod->channel_panning[x] );
+ for( x = 0; x < mod->order_count; x++ )
+ {
+ if( mod->orders[x] < 254 )
+ {
+ if( mod->orders[x] < mod->patt_count )
+ write8( mod->orders[x] );
+ else
+ write8( 254 );
+ }
+ else
+ {
+ write8( mod->orders[x] );
+ }
+ }
+ for( ; x < 200; x++ )
+ write8( 255 );
+ // reserve space for offsets
+ fpos_pointer = file_tell_write();
+ for( x = 0; x < mod->inst_count*4+mod->samp_count*4+mod->patt_count*4; x++ )
+ write8( BYTESMASHER ); // BA BA BLACK SHEEP
+/* if( msl_dep && target_system == SYSTEM_NDS )
+ {
+ for( x = 0; x < rsamp; x++ ) // write sample indeces
+ write16( rsamps[x] );
+ }*/
+ // WRITE INSTRUMENTS
+
+ if( verbose )
+ printf("Header: %i bytes\n", file_get_byte_count() );
+
+ for( x = 0; x < mod->inst_count; x++ )
+ Write_Instrument( &mod->instruments[x] );
+
+
+
+ for( x = 0; x < mod->samp_count; x++ )
+ Write_Sample( &mod->samples[x] );
+
+ if( verbose )
+ printf("Instruments: %i bytes\n", file_get_byte_count() );
+
+ Mark_Patterns( mod );
+ for( x = 0; x < mod->patt_count; x++ )
+ {
+// for( y = 0; y < mod->order_count; y++ )
+// {
+// if( mod->orders[y] == x )
+ Write_Pattern( &mod->patterns[x], mod->xm_mode );
+// }
+ }
+ align32();
+
+ if( verbose )
+ printf("Patterns: %i bytes\n", file_get_byte_count() );
+ MAS_FILESIZE = file_tell_write() - MAS_OFFSET;
+ file_seek_write( MAS_OFFSET-8, SEEK_SET );
+ write32( MAS_FILESIZE );
+ file_seek_write( fpos_pointer, SEEK_SET );
+ for( x = 0; x < mod->inst_count; x++ )
+ write32( mod->instruments[x].parapointer );
+ for( x = 0; x < mod->samp_count; x++ )
+ {
+ printf("sample %s is at %d/%d of %d\n", mod->samples[x].name, mod->samples[x].parapointer,
+ file_tell_write(), mod->samples[x].sample_length);
+ write32( mod->samples[x].parapointer );
+ }
+ for( x = 0; x < mod->patt_count; x++ )
+ write32( mod->patterns[x].parapointer );
+ return MAS_FILESIZE;
+}
+
+void Delete_Module( MAS_Module* mod )
+{
+ int x;
+ if( mod->instruments )
+ free( mod->instruments );
+ if( mod->samples )
+ {
+ for( x = 0; x < mod->samp_count; x++ )
+ {
+ if( mod->samples[x].data )
+ free( mod->samples[x].data );
+ }
+ free( mod->samples );
+ }
+ if( mod->patterns )
+ {
+ free( mod->patterns );
+ }
+}
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef MAS_H
+#define MAS_H
+
+//#define SAMPLE_FORMAT_U8 3
+//#define SAMPLE_FORMAT_S8 0
+//#define SAMPLE_FORMAT_S16 1
+//#define SAMPLE_FORMAT_ADPCM 2
+
+#define SAMPF_16BIT 0x001
+#define SAMPF_SIGNED 0x002
+#define SAMPF_COMP 0x004
+
+#define SAMP_FORMAT_U8 (0 )
+#define SAMP_FORMAT_U16 (SAMPF_16BIT)
+#define SAMP_FORMAT_S8 ( SAMPF_SIGNED )
+#define SAMP_FORMAT_S16 (SAMPF_16BIT | SAMPF_SIGNED )
+#define SAMP_FORMAT_ADPCM (SAMPF_COMP)
+
+#define MAS_TYPE_SONG 0
+#define MAS_TYPE_SAMPLE_GBA 1
+#define MAS_TYPE_SAMPLE_NDS 2
+
+typedef struct tInstrument_Envelope
+{
+ u8 loop_start;
+ u8 loop_end;
+ u8 sus_start;
+ u8 sus_end;
+ u8 node_count;
+ u16 node_x[25];
+ u8 node_y[25];
+ bool env_filter;
+ bool env_valid;
+ bool env_enabled;
+} Instrument_Envelope;
+
+typedef struct tInstrument
+{
+ u32 parapointer;
+
+ u8 global_volume;
+ u8 setpan;
+ u16 fadeout;
+ u8 random_volume;
+ u8 nna;
+ u8 dct;
+ u8 dca;
+ u8 env_flags;
+ u16 notemap[120];
+
+ char name[32];
+
+ Instrument_Envelope envelope_volume;
+ Instrument_Envelope envelope_pan;
+ Instrument_Envelope envelope_pitch;
+} Instrument;
+
+typedef struct tSample
+{
+ u32 parapointer;
+
+ u8 global_volume;
+ u8 default_volume;
+ u8 default_panning;
+ u32 sample_length;
+ u32 loop_start;
+ u32 loop_end;
+ u8 loop_type;
+ u32 frequency;
+ void* data;
+
+ u8 vibtype;
+ u8 vibdepth;
+ u8 vibspeed;
+ u8 vibrate;
+ u16 msl_index;
+ u8 rsamp_index;
+
+ u8 format;
+// bool samp_signed;
+
+ // file info
+ u32 datapointer;
+// bool bit16;
+// bool samp_unsigned;
+ u8 it_compression;
+ char name[32];
+ char filename[12];
+} Sample;
+
+typedef struct tPatternEntry
+{
+ u8 note;
+ u8 inst;
+ u8 vol;
+ u8 fx;
+ u8 param;
+} PatternEntry;
+
+typedef struct tPattern
+{
+ u32 parapointer;
+ u16 nrows;
+ int clength;
+ PatternEntry data[MAX_CHANNELS*256];
+ bool cmarks[256];
+} Pattern;
+
+typedef struct tMAS_Module
+{
+ char title[32];
+ u16 order_count;
+ u8 inst_count;
+ u8 samp_count;
+ u8 patt_count;
+ u8 restart_pos;
+ bool stereo;
+ bool inst_mode;
+ u8 freq_mode;
+ bool old_effects;
+ bool link_gxx;
+ bool xm_mode;
+ bool old_mode;
+ u8 global_volume;
+ u8 initial_speed;
+ u8 initial_tempo;
+ u8 channel_volume[MAX_CHANNELS];
+ u8 channel_panning[MAX_CHANNELS];
+ u8 orders[256];
+ Instrument* instruments;
+ Sample* samples;
+ Pattern* patterns;
+} MAS_Module;
+
+void Write_Instrument_Envelope( Instrument_Envelope* env );
+void Write_Instrument( Instrument* inst );
+void Write_SampleData( Sample* samp );
+void Write_Sample( Sample* samp );
+void Write_Pattern( Pattern* patt, bool xm_vol );
+int Write_MAS( MAS_Module* mod, bool verbose, bool msl_dep );
+void Delete_Module( MAS_Module* mod );
+
+extern u32 MAS_FILESIZE;
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+// information from FMODDOC.TXT by FireLight
+
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include "defs.h"
+#include "mas.h"
+#include "mod.h"
+#include "xm.h"
+#include "files.h"
+#include "simple.h"
+#include "errors.h"
+#include "samplefix.h"
+
+#ifdef SUPER_ASCII
+#define vstr_mod_div "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n"
+#define vstr_mod_samp_top "ÚÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"
+#define vstr_mod_samp_header "³INDEX³LENGTH³LOOP ³VOLUME³ MID-C ³ NAME ³\n"
+#define vstr_mod_samp_slice "ÃÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
+#define vstr_mod_samp "³ %2i ³%5i ³ %3s ³ %3i%% ³ %ihz³ %-22s³\n"
+#define vstr_mod_samp_bottom "ÀÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"
+#define vstr_mod_pattern " \x0e %2i%s"
+#else
+#define vstr_mod_div "--------------------------------------------\n"
+#define vstr_mod_samp_top vstr_mod_div
+#define vstr_mod_samp_header " INDEX LENGTH LOOP VOLUME MID-C NAME \n"
+//#define vstr_mod_samp_slice ""
+#define vstr_mod_samp " %-2i %-5i %-3s %3i%% %ihz %-22s \n"
+#define vstr_mod_samp_bottom vstr_mod_div
+#define vstr_mod_pattern " * %2i%s"
+#endif
+
+#ifdef _MSC_VER
+double round( double value )
+{
+ return floor(value+0.5);
+}
+#endif
+
+int Create_MOD_Instrument( Instrument* inst, u8 sample )
+{
+ int x;
+ memset( inst, 0, sizeof( Instrument ) );
+ inst->global_volume = 128;
+ // setup notemap
+ for( x = 0; x < 120; x++ )
+ {
+ inst->notemap[x] = x | ((sample+1)<<8);
+ }
+ return ERR_NONE;
+}
+
+int Load_MOD_SampleData( Sample* samp )
+{
+ u32 t;
+ if( samp->sample_length > 0 )
+ {
+ samp->data = (u8*)malloc( samp->sample_length ); // allocate a SAMPLE_LENGTH sized pointer to buffer in memory and load the sample into it
+ for( t = 0; t < samp->sample_length; t++ )
+ {
+ ((u8*)samp->data)[t] = read8() + 128; // unsign data
+ }
+ }
+ FixSample( samp );
+ return ERR_NONE;
+}
+
+int Load_MOD_Pattern( Pattern* patt, u8 nchannels, u8* inst_count )
+{
+ u8 data1;
+ u8 data2;
+ u8 data3;
+ u8 data4;
+
+ u16 period;
+ u8 inst;
+ u8 effect;
+ u8 param;
+
+ u32 row;
+ u32 col;
+
+ PatternEntry* p;
+
+ memset( patt, 0, sizeof( Pattern ) );
+ patt->nrows = 64; // MODs have fixed 64 rows per pattern
+
+ for( row = 0; row < 64*MAX_CHANNELS; row++ )
+ {
+ patt->data[row].note = 250;
+ }
+
+ for( row = 0; row < 64; row++ )
+ {
+ for( col = 0; col < nchannels; col++ )
+ {
+ data1 = read8(); // +-------------------------------------+
+ data2 = read8(); // | Byte 0 Byte 1 Byte 2 Byte 3 |
+ data3 = read8(); // |-------------------------------------|
+ data4 = read8(); // |aaaaBBBB CCCCCCCCC DDDDeeee FFFFFFFFF|
+ // +-------------------------------------+
+
+ period = (data1&0xf)*256 + (data2); // BBBBCCCCCCCC = sample period value
+ inst = (data1&0xF0)+(data3>>4); // aaaaDDDD = sample number
+ effect = data3&0xF; // eeee = effect number
+ param = data4; // FFFFFFFF = effect parameters
+
+ // fix parameter for certain MOD effects
+ switch( effect )
+ {
+ case 5: // 5xy glis+slide
+ case 6: // 6xy vib+slide
+ if( param & 0xF0 ) // clear Y if X
+ param &= 0xF0;
+ }
+
+ p = &patt->data[row*MAX_CHANNELS+col]; // copy data to pattern entry
+ p->inst = inst; // ...
+ CONV_XM_EFFECT( &effect, ¶m ); // ...
+ p->fx = effect; // ...
+ p->param = param; // ...
+
+ if( period != 0 ) // 0 = no note, otherwise calculate note value from the amiga period
+ p->note = (int)round(12.0*log( (856.0)/(double)period )/log(2)) + 37 + 11;
+ if( *inst_count < (inst + 1) )
+ {
+ *inst_count = (inst + 1);
+ if( *inst_count > 31 )
+ *inst_count = 31;
+ }
+ }
+ }
+ return ERR_NONE;
+}
+
+int Load_MOD_Sample( Sample* samp, bool verbose, int index )
+{
+ int finetune;
+ int x;
+
+ memset( samp, 0, sizeof( Sample ) );
+ samp->msl_index = 0xFFFF;
+ for( x = 0; x < 22; x++ )
+ samp->name[x] = read8(); // read in 22 bytes, store as SAMPLE_NAME
+ for( x = 0; x < 12; x++ ) // copy to filename
+ samp->filename[x] = samp->name[x];
+ samp->sample_length = (read8()*256 + read8()) * 2; // read in 2 bytes (word), store as SAMPLE_LENGTH
+ finetune = read8(); // read in 1 byte, store as FINE_TUNE
+ if( finetune >= 8 ) finetune -= 16;
+
+ samp->default_volume = read8(); // read in 1 byte, store as VOLUME
+ samp->loop_start = (read8()*256 + read8()) * 2; // read in 2 bytes (word), store as LOOP_START
+ samp->loop_end = samp->loop_start + (read8()*256+read8())*2; // read in 2 bytes (word), store as LOOP_LENGTH
+
+ // IS THIS WRONG?? :
+ samp->frequency = (int)(8363.0 * pow( 2.0, ((double)finetune) * (1.0/192.0) ) ); // calculate frequency...
+
+ samp->global_volume=64; // max global volume
+ if( (samp->loop_end - samp->loop_start) <= 2 ) // if loop length <= 2 then disabled loop
+ {
+ samp->loop_type = samp->loop_start = samp->loop_end = 0;
+ }
+ else
+ {
+ samp->loop_type = 1; // otherwise enable
+ }
+ if( verbose )
+ {
+ if( samp->sample_length != 0 )
+ {
+ //printf( "%i %s %i%% %ihz\n", samp->sample_length, samp->loop_type != 0 ? "Yes" : "No", (samp->default_volume*100)/64, samp->frequency );
+ printf( vstr_mod_samp, index, samp->sample_length, samp->loop_type != 0 ? "Yes" : "No", (samp->default_volume*100)/64, samp->frequency, samp->name );
+ /*
+ printf( " Length......%i\n", samp->sample_length );
+ if( samp->loop_type != 0 )
+ {
+ printf( " Loop........%i->%i\n", samp->loop_start, samp->loop_end );
+ }
+ else
+ {
+ printf( " Loop........None\n" );
+ }
+ printf( " Volume......%i\n", samp->default_volume );
+ printf( " Middle C....%ihz\n", samp->frequency );*/
+ }
+ else
+ {
+ //printf( "---\n" );
+ }
+ }
+ return ERR_NONE;
+}
+
+int Load_MOD( MAS_Module* mod, bool verbose )
+{
+ u32 file_start;
+ u32 mod_channels;
+ int x;
+
+ int npatterns;
+
+ u32 sig;
+ char sigs[5];
+
+ if( verbose )
+ printf( "Loading MOD, " );
+
+ memset( mod, 0, sizeof( MAS_Module ) );
+ file_start = file_tell_read();
+ file_seek_read( 0x438, SEEK_SET ); // Seek to offset 1080 (438h) in the file
+ sig = read32(); // read in 4 bytes
+ sigs[0]=sig&0xFF;
+ sigs[1]=(sig>>8)&0xFF;
+ sigs[2]=(sig>>16)&0xFF;
+ sigs[3]=(sig>>24);
+ sigs[4]=0;
+ switch( sig )
+ {
+ case 'NHC1':
+ mod_channels=1;
+ break;
+ case 'NHC2':
+ mod_channels=2;
+ break;
+ case 'NHC3':
+ mod_channels=3;
+ break;
+ case '.K.M': // compare them to "M.K." - if true we have a 4 channel mod
+ case 'NHC4':
+ mod_channels=4;
+ break;
+ case 'NHC5':
+ mod_channels=5;
+ break;
+ case 'NHC6':
+ mod_channels=6; // compare them to "6CHN" - if true we have a 6 channel mod
+ break;
+ case 'NHC7':
+ mod_channels=7;
+ break;
+ case 'NHC8': // compare them to "8CHN" - if true we have an 8 channel mod
+ mod_channels=8;
+ break;
+ case 'NHC9':
+ mod_channels=9;
+ break;
+ default:
+ if( sig>>16 == 'HC' ) // There are also rare tunes that use **CH where ** = 10-32 channels
+ {
+ char chn_number[3];
+ chn_number[0] = (char)(sig&0xFF);
+ chn_number[1] = (char)((sig>>8)&0xFF);
+ chn_number[2] = 0;
+ mod_channels = atoi( chn_number );
+ if( mod_channels > MAX_CHANNELS )
+ return ERR_MANYCHANNELS;
+ }
+ else
+ {
+ return ERR_INVALID_MODULE; // otherwise exit and display error message.
+ }
+ }
+
+ file_seek_read( file_start, SEEK_SET ); // - Seek back to position 0, the start of the file
+ for( x = 0; x < 20; x++ )
+ mod->title[x] = read8(); // - read in 20 bytes, store as MODULE_NAME.
+
+ if( verbose )
+ {
+ printf( "\"%s\"\n", mod->title );
+ printf( "%i channels (%s)\n", mod_channels, sigs );
+ }
+
+ for( x = 0; x < MAX_CHANNELS; x++ )
+ {
+ if( (x&3)!=1 && (x&3) != 2 )
+ mod->channel_panning[x] = clamp_u8( 128 - (PANNING_SEP/2) );
+ else
+ mod->channel_panning[x] = clamp_u8( 128 + (PANNING_SEP/2) );
+ mod->channel_volume[x] = 64;
+ }
+
+ // set MOD settings
+ mod->freq_mode = 0;
+ mod->global_volume = 64;
+ mod->initial_speed = 6;
+ mod->initial_tempo = 125;
+ mod->inst_count = 0; // filled in by Load_MOD_Pattern
+ mod->inst_mode = false;
+ mod->instruments = (Instrument*)malloc( 31 * sizeof( Instrument ) );
+ mod->link_gxx = false;
+ mod->old_effects = true;
+ mod->restart_pos = 0;
+ mod->samp_count = 0; // filled in before Load_MOD_SampleData
+ mod->samples = (Sample*)malloc( 31 * sizeof( Sample ) );
+ mod->stereo = true;
+ mod->xm_mode = true;
+ mod->old_mode=true;
+
+ if( verbose )
+ {
+ printf( vstr_mod_div );
+ printf( "Loading Samples...\n" );
+ printf( vstr_mod_samp_top );
+ printf( vstr_mod_samp_header );
+#ifdef vstr_mod_samp_slice
+ printf( vstr_mod_samp_slice );
+#endif
+ }
+ // Load Sample Information
+ for( x = 0; x < 31; x++ )
+ {
+ // if( verbose )
+ //printf( "Loading Sample %i...\n", x+1 );
+ Create_MOD_Instrument( &mod->instruments[x], (u8)x );
+ Load_MOD_Sample( &mod->samples[x], verbose, x );
+ }
+
+ // read sequence
+ mod->order_count = read8(); // read a byte, store as SONG_LENGTH (this is the number of orders in a song)
+ mod->restart_pos = read8(); // read a byte, discard it (this is the UNUSED byte - used to be used in PT as the restart position, but not now since jump to pattern was introduced)
+ if( mod->restart_pos >= 127 )
+ mod->restart_pos=0;
+ npatterns=0; // set NUMBER_OF_PATTERNS to equal 0......... or -1 :)
+ for( x = 0; x < 128; x++ ) // from this point, loop 128 times
+ {
+ mod->orders[x] = read8(); // read 1 byte, store it as ORDER <loopcounter>
+ if( mod->orders[x] >= npatterns ) // if this value was bigger than NUMBER_OF_PATTERNS then set it to that value.
+ npatterns=mod->orders[x]+1;
+ }
+
+ read32(); // read 4 bytes, discard them (we are at position 1080 again, this is M.K. etc!)
+ mod->patt_count = npatterns;
+ mod->patterns = (Pattern*)malloc( mod->patt_count * sizeof( Pattern ) ); // allocate patterns
+
+ if( verbose )
+ {
+ printf( vstr_mod_samp_bottom );
+ printf( "Sequence has %i entries.\n", mod->order_count );
+ printf( "Module has %i pattern%s.\n", mod->patt_count, mod->patt_count==1?"":"s" );
+ printf( vstr_mod_div );
+ printf( "Loading Patterns...\n" );
+ printf( vstr_mod_div );
+ }
+
+ // Load Patterns
+ for( x = 0; x < mod->patt_count; x++ )
+ {
+ if( verbose )
+ {
+ printf( vstr_mod_pattern, x+1, ((x+1)%15)?"":"\n" );
+ }
+ Load_MOD_Pattern( &mod->patterns[x], (u8)mod_channels, &(mod->inst_count) );
+ }
+ if( verbose )
+ {
+ printf( "\n" );
+ printf( vstr_mod_div );
+ }
+ // Load Sample Data
+ if( verbose )
+ printf( "Loading Sample Data...\n" );
+ mod->samp_count = mod->inst_count;
+ for( x = 0; x < 31; x++ )
+ {
+ Load_MOD_SampleData( &mod->samples[x] );
+ }
+ if( verbose )
+ printf( vstr_mod_div );
+ return ERR_NONE;
+}
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef MOD_H
+#define MOD_H
+
+int Load_MOD( MAS_Module* mod, bool verbose );
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+// MAXMOD SOUNDBANK
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "errors.h"
+#include "defs.h"
+#include "files.h"
+#include "mas.h"
+#include "mod.h"
+#include "s3m.h"
+#include "xm.h"
+#include "it.h"
+#include "wav.h"
+#include "simple.h"
+#include "version.h"
+#include "systems.h"
+#include "samplefix.h"
+
+FILE* F_SCRIPT=NULL;
+
+FILE* F_SAMP=NULL;
+FILE* F_SONG=NULL;
+
+FILE* F_HEADER=NULL;
+
+u16 MSL_NSAMPS;
+u16 MSL_NSONGS;
+
+char str_msl[256];
+
+#define TMP_SAMP "sampJ328G54AU3.tmp"
+#define TMP_SONG "songDJ34957FAI.tmp"
+
+void MSL_PrintDefinition( char* filename, u16 id, char* prefix );
+
+#define SAMPLE_HEADER_SIZE (12 + (( target_system == SYSTEM_NDS ) ? 4:0))
+
+void MSL_Erase( void )
+{
+ MSL_NSAMPS = 0;
+ MSL_NSONGS = 0;
+ file_delete( TMP_SAMP );
+ file_delete( TMP_SONG );
+}
+
+u16 MSL_AddSample( Sample* samp )
+{
+ u32 sample_length;
+ u32 x;
+ file_open_write_end( TMP_SAMP );
+
+ sample_length = samp->sample_length;
+
+ write32( ((samp->format & SAMPF_16BIT) ? sample_length*2 : sample_length ) + SAMPLE_HEADER_SIZE +4); // +4 for sample padding
+ write8 ( (target_system == SYSTEM_GBA) ? MAS_TYPE_SAMPLE_GBA : MAS_TYPE_SAMPLE_NDS );
+ write8( MAS_VERSION );
+ write8( samp->filename[0] == '#' ? 1 : 0);
+ write8( BYTESMASHER );
+
+ Write_SampleData(samp);
+
+ file_close_write();
+ MSL_NSAMPS++;
+ return MSL_NSAMPS-1;
+}
+
+u16 MSL_AddSampleC( Sample* samp )
+{
+ u32 st;
+ u32 samp_len;
+ u32 samp_llen;
+ u8 sformat;
+
+ u32 h_filesize;
+ int samp_id;
+ bool samp_match;
+
+ int fsize=file_size( TMP_SAMP );
+ if( fsize == 0 )
+ {
+ return MSL_AddSample( samp );
+ }
+ F_SAMP = fopen( TMP_SAMP, "rb" );
+ fseek( F_SAMP, 0, SEEK_SET );
+ samp_id = 0;
+ while( ftell( F_SAMP ) < fsize )
+ {
+ h_filesize = read32f( F_SAMP );
+ read32f( F_SAMP );
+ samp_len = read32f( F_SAMP );
+ samp_llen = read32f( F_SAMP );
+ sformat = read8f( F_SAMP ); /////// BUG! GBA DOESNLT WRITE FORMAT!?
+ skip8f( 3, F_SAMP );
+ if( target_system == SYSTEM_NDS )
+ {
+ skip8f(4,F_SAMP);
+ }
+
+ samp_match=true;
+ if( samp->sample_length == samp_len && ( samp->loop_type ? samp->loop_end-samp->loop_start : 0xFFFFFFFF ) == samp_llen && sformat == sample_dsformat( samp ) )
+ {
+ // verify sample data
+ if( samp->format & SAMPF_16BIT )
+ {
+ for( st=0; st<samp_len; st++ )
+ {
+ if( read16f( F_SAMP ) != ((u16*)samp->data)[st] )
+ {
+ samp_match = false;
+ break;
+ }
+ }
+ }
+ else
+ {
+ for( st=0; st<samp_len; st++ )
+ {
+ if( read8f( F_SAMP ) != ((u8*)samp->data)[st] )
+ {
+ samp_match = false;
+ break;
+ }
+ }
+ }
+ if( samp_match )
+ {
+ fclose( F_SAMP );
+ return samp_id;
+ }
+ else
+ {
+ skip8f( (h_filesize-SAMPLE_HEADER_SIZE ) - (st+1) , F_SAMP ); // +4 to skip padding
+ }
+ }
+ else
+ {
+ skip8f( h_filesize- SAMPLE_HEADER_SIZE , F_SAMP ); // +4 to skip padding
+ }
+ samp_id++;
+ }
+ fclose( F_SAMP );
+ return MSL_AddSample( samp );
+}
+
+u16 MSL_AddModule( MAS_Module* mod )
+{
+ int x;
+ int samp_id;
+ // ADD SAMPLES
+ for( x = 0; x < mod->samp_count; x++ )
+ {
+ samp_id = MSL_AddSampleC( &mod->samples[x] );
+ if( mod->samples[x].filename[0] == '#' )
+ MSL_PrintDefinition( mod->samples[x].filename+1, (u16)samp_id, "SFX_" );
+ mod->samples[x].msl_index = samp_id;
+ }
+
+ file_open_write_end( TMP_SONG );
+ Write_MAS( mod, false, true );
+ file_close_write();
+ MSL_NSONGS++;
+ return MSL_NSONGS-1;
+}
+
+void MSL_Export( char* filename )
+{
+ u32 x;
+ u32 y;
+ u32 file_size;
+
+ u32* parap_samp;
+ u32* parap_song;
+
+ file_open_write( filename );
+ write16( MSL_NSAMPS );
+ write16( MSL_NSONGS );
+ write8( '*' );
+ write8( 'm' );
+ write8( 'a' );
+ write8( 'x' );
+ write8( 'm' );
+ write8( 'o' );
+ write8( 'd' );
+ write8( '*' );
+
+ parap_samp = (u32*)malloc( MSL_NSAMPS * sizeof( u32 ) );
+ parap_song = (u32*)malloc( MSL_NSONGS * sizeof( u32 ) );
+
+ // reserve space for parapointers
+ for( x = 0; x < MSL_NSAMPS; x++ )
+ write32( 0xAAAAAAAA );
+ for( x = 0; x < MSL_NSONGS; x++ )
+ write32( 0xAAAAAAAA );
+ // copy samples
+ file_open_read( TMP_SAMP );
+ for( x = 0; x < MSL_NSAMPS; x++ )
+ {
+ align32();
+ parap_samp[x] = file_tell_write();
+ file_size = read32();
+ write32( file_size );
+ for( y = 0; y < file_size+4; y++ )
+ write8( read8() );
+ }
+ file_close_read();
+
+ file_open_read( TMP_SONG );
+ for( x = 0; x < MSL_NSONGS; x++ )
+ {
+ align32();
+ parap_song[x] = file_tell_write();
+ file_size = read32();
+ write32( file_size );
+ for( y = 0; y < file_size+4; y++ )
+ write8( read8() );
+ }
+ file_close_read();
+
+ file_seek_write( 0x0C, SEEK_SET );
+ for( x = 0; x < MSL_NSAMPS; x++ )
+ write32( parap_samp[x] );
+ for( x= 0; x < MSL_NSONGS; x++ )
+ write32( parap_song[x] );
+
+ file_close_write();
+
+ if( parap_samp )
+ free( parap_samp );
+ if( parap_song )
+ free( parap_song );
+}
+
+void MSL_PrintDefinition( char* filename, u16 id, char* prefix )
+{
+ char newtitle[64];
+ int x,s=0;
+ if( filename[0] == 0 ) // empty string
+ return;
+ for( x = 0; x < (int)strlen( filename ); x++ )
+ {
+ if( filename[x] == '\\' || filename[x] == '/' ) s = x+1;
+ }
+ for( x = s; x < (int)strlen( filename ); x++ )
+ {
+ if( filename[x] != '.' )
+ {
+ newtitle[x-s] = toupper(filename[x]);
+ if( newtitle[x-s] >= ' ' && newtitle[x-s] <= '/' )
+ newtitle[x-s] = '_';
+ if( newtitle[x-s] >= ':' && newtitle[x-s] <= '@' )
+ newtitle[x-s] = '_';
+ if( newtitle[x-s] >= '[' && newtitle[x-s] <= '`' )
+ newtitle[x-s] = '_';
+ if( newtitle[x-s] >= '{' )
+ newtitle[x-s] = '_';
+ }
+ else
+ {
+ break;
+ }
+ }
+ newtitle[x-s] = 0;
+ if( F_HEADER )
+ {
+ fprintf( F_HEADER, "#define %s%s %i\r\n", prefix, newtitle, id );
+ }
+}
+
+void MSL_LoadFile( char* filename, bool verbose )
+{
+ Sample wav;
+ MAS_Module mod;
+ int f_ext;
+ if( file_open_read( filename ) )
+ {
+ printf( "Cannot open %s for reading! Skipping.\n", filename );
+ return;
+ }
+ f_ext = get_ext( filename );
+ switch( f_ext )
+ {
+ case INPUT_TYPE_MOD:
+ Load_MOD( &mod, verbose );
+ MSL_PrintDefinition( filename, MSL_AddModule( &mod ), "MOD_" );
+ Delete_Module( &mod );
+ break;
+ case INPUT_TYPE_S3M:
+ Load_S3M( &mod, verbose );
+ MSL_PrintDefinition( filename, MSL_AddModule( &mod ), "MOD_" );
+ Delete_Module( &mod );
+ break;
+ case INPUT_TYPE_XM:
+ Load_XM( &mod, verbose );
+ MSL_PrintDefinition( filename, MSL_AddModule( &mod ), "MOD_" );
+ Delete_Module( &mod );
+ break;
+ case INPUT_TYPE_IT:
+ Load_IT( &mod, verbose );
+ MSL_PrintDefinition( filename, MSL_AddModule( &mod ), "MOD_" );
+ Delete_Module( &mod );
+ break;
+ case INPUT_TYPE_WAV:
+ Load_WAV( &wav, verbose, true );
+ wav.filename[0] = '#'; // set SFX flag (for demo)
+ MSL_PrintDefinition( filename, MSL_AddSample( &wav ), "SFX_" );
+ free( wav.data );
+ break;
+ default:
+ // print error/warning
+ printf( "Unknown file %s...\n", filename );
+ }
+ file_close_read();
+
+}
+
+int MSL_Create( char* argv[], int argc, char* output, char* header, bool verbose )
+{
+// int str_w=0;
+// u8 pmode=0;
+// bool comment=false;
+
+ int x;
+
+ MSL_Erase();
+ str_msl[0] = 0;
+ F_HEADER=NULL;
+ if( header )
+ {
+ F_HEADER = fopen( header, "wb" );
+ }
+
+// if( !F_HEADER )
+// return -1; // needs header file!
+
+ file_open_write( TMP_SAMP );
+ file_close_write();
+ file_open_write( TMP_SONG );
+ file_close_write();
+
+ for( x = 1; x < argc; x++ )
+ {
+ if( argv[x][0] == '-' )
+ {
+
+ }
+ else
+ {
+ MSL_LoadFile( argv[x], verbose );
+ }
+ }
+
+ MSL_Export( output );
+
+ if( F_HEADER )
+ {
+ fprintf( F_HEADER, "#define MSL_NSONGS %i\r\n", MSL_NSONGS );
+ fprintf( F_HEADER, "#define MSL_NSAMPS %i\r\n", MSL_NSAMPS );
+ fprintf( F_HEADER, "#define MSL_BANKSIZE %i\r\n", (MSL_NSAMPS+MSL_NSONGS) );
+ fclose( F_HEADER );
+ F_HEADER=NULL;
+ }
+
+ file_delete( TMP_SAMP );
+ file_delete( TMP_SONG );
+ return ERR_NONE;
+}
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef MSL_H
+#define MSL_H
+
+int MSL_Create( char* argv[], int argc, char* output, char* header, bool verbose );
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+/* NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE
+ SOME CODE WAS STOLEN FROM NDSTOOL.CPP
+NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE */
+
+#include <stdlib.h>
+#include "defs.h"
+#include "files.h"
+#include "mas.h"
+
+#include "arm7_st.inc"
+#include "arm9_st.inc"
+
+const u8 nds_logo[];
+
+#define ARM7_SIZE sizeof(arm7_bin)
+#define ARM9_SIZE sizeof(arm9_bin)
+
+const unsigned short crc16tab[] =
+{
+ 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
+ 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
+ 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
+ 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
+ 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
+ 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
+ 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
+ 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
+ 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
+ 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
+ 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
+ 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
+ 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
+ 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
+ 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
+ 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
+ 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
+ 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
+ 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
+ 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
+ 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
+ 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
+ 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
+ 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
+ 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
+ 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
+ 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
+ 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
+ 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
+ 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
+ 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
+ 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
+};
+
+void Write_NDS( void )
+{
+ int x;
+ const char game_title[] = "SOUND TEST ";
+
+ for( x = 0; x < 12; x++ )
+ write8( game_title[x] );
+
+ write32( '####' ); // gamecode
+ write16( 0 ); // makercode
+ write8( 0 ); // unit code (Nintendo DS)
+ write8( 0 ); // encryption seed
+ write8( 0 ); // device capability
+ for( x= 0; x < 9; x++ )
+ write8( 0 ); // reserved
+ write8( 0 ); // rom version
+ write8( 4 ); // autostart
+
+//-----------------------------------------------------------
+ write32( 512+32768 ); // arm9 ROM offset
+ write32( 0x2000000 ); // arm9 entry point
+ write32( 0x2000000 ); // arm9 ram address
+ write32( 65536 ); // arm9 binary size (modify later)
+//-----------------------------------------------------------
+ write32( 512 ); // arm7 ROM offset
+ write32( 0x37f8000 ); // arm7 entry point
+ write32( 0x37f8000 ); // arm7 ram address
+ write32( 32768 ); // arm7 binary size
+//-----------------------------------------------------------
+
+ write32( 0 ); // fnt address
+ write32( 0 ); // fnt size
+ write32( 0 ); // fat address
+ write32( 0 ); // fat size
+
+ write32( 0 ); // file arm9 overlay address
+ write32( 0 ); // file arm9 overlay size
+ write32( 0 ); // file arm7 overlay address
+ write32( 0 ); // file arm7 overlay size
+
+ write32( 0x7f7fff ); // port 40001a4 setting for normal commands
+ write32( 0x203f1fff ); // port 40001a4 setting for KEY1 commands
+
+ write32( 0 ); // icon (no icon)
+
+ write16( 0 ); // secure area checksum
+ write16( 0x51e ); // secure area loading timeout
+ write32( 0 ); // arm9 auto load list RAM address (?)
+ write32( 0 ); // arm7 auto load list RAM address (?)
+ write32( 0 ); // secure area disable
+ write32( 0 ); // secure area disable
+
+ write32( 0x14400 ); // total used ROM size
+ write32( 0x200 ); // rom header size
+
+ write32( 0 );
+ write32( 0 );
+ write32( 0 );
+ write32( 0 );
+ write32( 0 );
+ write32( 0 );
+ write32( 'MARS' );
+ write32( '11V_' );
+ write8( '0' );
+ write8( 0 );write8( 0 );write8( 0 );
+ write32( 'SSAP' );
+ write8( '0' );write8( '1' );write8( 0x96 );write8( 0 );
+
+ write32( 0 );
+ write32( 0 );
+ write32( 0 );
+
+ for( x = 0; x < 0x9c; x++ )
+ write8( nds_logo[x] ); // NINTENDO LOGO
+
+ write16( 0x9e1a ); // nintendo logo checksum
+ write16( 0 ); // header checksum (modify later)
+ write32( 0 ); // debug rom offset
+ write32( 0 ); // debug rom size
+ write32( 0 ); // debug ram address
+
+ write32( 0 ); // reserved
+
+ for( x = 0; x < 0x90; x++ )
+ write8( 0 );
+
+ // write binaries
+ for( x = 0; x < ARM7_SIZE; x++ )
+ write8( arm7_bin[x] );
+ for( x = 0; x < 32768-ARM7_SIZE; x++ ) // pad to 32k
+ write8( (u8)x );
+ for( x = 0; x < ARM9_SIZE; x++ )
+ write8( arm9_bin[x] );
+ for( x = 0; x < 65536-ARM9_SIZE; x++ ) // pad to 64k
+ write8( (u8)x );
+}
+
+unsigned short calculate_crc( void )
+{
+ int i;
+ unsigned short crc = 0xFFFF;
+ for ( i=0; i<0x15E; i++)
+ {
+ unsigned char data = read8();
+ crc = (crc >> 8) ^ crc16tab[(crc ^ data) & 0xFF];
+ }
+ return crc;
+}
+
+void Validate_NDS( char* filename, int output_size )
+{
+ int arm9_size;
+ int header_crc;
+ arm9_size = 65536 + output_size;
+ file_open_write_end( filename );
+ file_seek_write( 0x2c, SEEK_SET );
+ write32( arm9_size );
+ file_seek_write( 0x80, SEEK_SET );
+ write32( arm9_size+32768 ); // total used rom size
+ file_close_write();
+
+ file_open_read( filename );
+ header_crc=calculate_crc();
+ file_close_read();
+ header_crc &= 0xFFFF;
+
+ file_open_write_end( filename );
+ file_seek_write( 0x15e, SEEK_SET );
+ write16( (u16)header_crc );
+ file_close_write();
+ /*
+ // write arm7 rom_offset
+ file_seek_write( 0x30, SEEK_SET );
+ write32( 512 );
+
+ // write arm9 rom_offset
+ file_seek_write( 0x20, SEEK_SET );
+ write32( 512 + 0x4000 );
+
+ // write arm9 size
+ file_seek_write( 0x2C, SEEK_SET );
+ write32( 0x10000 + output_size );
+ */
+}
+
+const u8 nds_logo[] = {
+ 0xC8, 0x60, 0x4F, 0xE2, 0x1, 0x70, 0x8F, 0xE2, 0x17, 0xFF, 0x2F, 0xE1, 0x12, 0x4F, 0x11, 0x48, 0x12, 0x4C, 0x20, 0x60, 0x64, 0x60, 0x7C, 0x62, 0x30, 0x1C, 0x39, 0x1C, 0x10, 0x4A, 0x0, 0xF0, 0x14, 0xF8,
+0x30, 0x6A, 0x80, 0x19, 0xB1, 0x6A, 0xF2, 0x6A, 0x0, 0xF0, 0xB, 0xF8, 0x30, 0x6B, 0x80, 0x19, 0xB1, 0x6B, 0xF2, 0x6B, 0x0, 0xF0, 0x8, 0xF8, 0x70, 0x6A, 0x77, 0x6B, 0x7, 0x4C, 0x60, 0x60, 0x38, 0x47, 0x7,
+0x4B, 0xD2, 0x18, 0x9A, 0x43, 0x7, 0x4B, 0x92, 0x8, 0xD2, 0x18, 0xC, 0xDF, 0xF7, 0x46, 0x4, 0xF0, 0x1F, 0xE5, 0x0, 0xFE, 0x7F, 0x2, 0xF0, 0xFF, 0x7F, 0x2, 0xF0, 0x1, 0x0, 0x0, 0xFF, 0x1, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, };
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef NDS_H
+#define NDS_H
+
+void Write_NDS( void );
+void Validate_NDS( char* filename, int output_size );
+
+#endif
--- /dev/null
+#define slashblash16.it 0
+#define lemon.mod 1
+#define MSL_NSONGS 2
+#define MSL_NSAMPS 45
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+// information from ST3's TECH.DOC
+
+#include <stdlib.h>
+#include <string.h>
+#include "defs.h"
+#include "mas.h"
+#include "s3m.h"
+#include "files.h"
+#include "simple.h"
+#include "errors.h"
+#include "samplefix.h"
+
+#define S3M_NOTE(a) (((a&15)+(a>>4)*12)+12)
+
+#ifdef SUPER_ASCII
+#define vstr_s3m_samp " %5i ³ %-4s³ %3i%% ³%5ihz³ %-28s³\n"
+#define vstr_s3m_sampe " ----- ³ --- ³ ---- ³ ----- ³ %-28s³\n"
+#define vstr_s3m_div "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n"
+#define vstr_s3m_sampt_top "ÚÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"
+#define vstr_s3m_sampt_mid "³INDEX³LENGTH ³LOOP ³VOLUME³ MID-C ³ NAME ³\n"
+#define vstr_s3m_sampt_slice "ÃÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
+#define vstr_s3m_sampt_index "³ %2i ³"
+#define vstr_s3m_sampt_bottom "ÀÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"
+#define vstr_s3m_pattern " \x0e %2i%s"
+#else
+#define vstr_s3m_samp "%-5i %-3s %3i%% %5ihz %-28s \n"
+#define vstr_s3m_sampe "----- --- ---- ------- %-28s\n"
+#define vstr_s3m_div "--------------------------------------------\n"
+#define vstr_s3m_sampt_top vstr_s3m_div
+#define vstr_s3m_sampt_mid " INDEX LENGTH LOOP VOLUME MID-C NAME\n"
+//#define vstr_s3m_sampt_slice ""
+#define vstr_s3m_sampt_index " %-2i "
+#define vstr_s3m_sampt_bottom vstr_s3m_div
+#define vstr_s3m_pattern " * %2i%s"
+#endif
+
+int Load_S3M_SampleData( Sample* samp, u8 ffi )
+{
+ u32 x;
+ int a;
+ if( samp->sample_length == 0 )
+ return ERR_NONE;
+ if( samp->format & SAMPF_16BIT )
+ samp->data = (u16*)malloc( samp->sample_length*2 );
+ else
+ samp->data = (u8*)malloc( samp->sample_length );
+ if( ffi == 1 )
+ {
+ // signed samples [VERY OLD]
+ for( x = 0; x < samp->sample_length; x++ )
+ {
+ if( samp->format & SAMPF_16BIT )
+ {
+ a = read16();
+ a += 32768;
+ ((u16*)samp->data)[x] = (u16)a;
+ }
+ else
+ {
+ a = read8();
+ a += 128;
+ ((u8*)samp->data)[x] = (u8)a;
+ }
+ }
+ }
+ else if( ffi == 2 )
+ {
+ // unsigned samples
+ for( x = 0; x < samp->sample_length; x++ )
+ {
+ if( samp->format & SAMPF_16BIT )
+ {
+ a = read16();
+ ((u16*)samp->data)[x] = (u16)a;
+ }
+ else
+ {
+ a = read8();
+ ((u8*)samp->data)[x] = (u8)a;
+ }
+ }
+ }
+ else
+ {
+ return ERR_UNKNOWNSAMPLE;
+ }
+ FixSample( samp );
+ return ERR_NONE;
+}
+
+int Load_S3M_Sample( Sample* samp, bool verbose )
+{
+ u8 flags;
+ u32 x;
+ memset( samp, 0, sizeof( Sample ) );
+ samp->msl_index = 0xFFFF;
+ if( read8() == 1 ) // type, 1 = sample
+ {
+ for( x = 0; x < 12; x++ )
+ samp->filename[x] = read8();
+ samp->datapointer = (read8()*65536+read16())*16;//read24();
+ samp->sample_length = read32();
+ samp->loop_start = read32();
+ samp->loop_end = read32();
+ samp->default_volume = read8();
+ samp->global_volume = 64;
+ read8(); // reserved
+ if( read8() != 0 ) // packing, 0 = unpacked
+ return ERR_UNKNOWNSAMPLE;
+ flags = read8();
+ samp->loop_type = flags&1 ? 1 : 0;
+ if( flags & 2 )
+ return ERR_UNKNOWNSAMPLE;
+ //samp->bit16 = flags&4 ? true : false;
+ samp->format = flags&4 ? SAMP_FORMAT_U16 : SAMP_FORMAT_U8;
+ samp->frequency = read32();
+ read32(); // reserved
+ skip8( 8 ); // internal variables
+ for( x =0 ; x < 28; x++ )
+ samp->name[x] = read8();
+ if( read32() != 'SRCS' )
+ return ERR_UNKNOWNSAMPLE;
+
+ if( verbose )
+ {
+ // printf( "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n" );
+ // printf( "Loading Samples...\n" );
+ // printf( "ÚÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n" );
+ // printf( "³LENGTH³LOOP³VOLUME³ MID-C ³ NAME ³\n");
+ // printf( "ÅÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n" );
+ printf( vstr_s3m_samp, samp->sample_length, samp->loop_type ? "Yes" : "No", (samp->default_volume*100) / 64, samp->frequency, samp->name );
+ /*printf( " Name......%s\n", samp->name );
+ printf( " Length....%i\n", samp->sample_length );
+ if( samp->loop_type )
+ printf( " Loop......%i->%i\n", samp->loop_start, samp->loop_end );
+ else
+ printf( " Loop......Disabled\n" );
+ printf( " Volume....%i\n", samp->default_volume );
+ printf( " Middle C..%ihz\n", samp->frequency );
+ if( samp->bit16 )
+ printf( " 16 bit....yes\n" );*/
+ }
+ }
+ else
+ {
+ if( verbose )
+ {
+ printf( vstr_s3m_sampe, samp->name );
+ }
+ }
+ return ERR_NONE;
+}
+
+int Load_S3M_Pattern( Pattern* patt )
+{
+ int clength;
+ int row, col;
+ u8 what;
+ int z;
+
+ clength = read16();
+ // unpack s3m data
+
+ memset( patt, 0, sizeof( Pattern ) );
+
+ patt->clength = clength;
+ patt->nrows = 64;
+
+ for( row = 0; row < 64*MAX_CHANNELS; row++ )
+ {
+ patt->data[row].note = 250;
+ patt->data[row].vol = 255;
+ }
+
+ for( row = 0; row < 64; row++ )
+ {
+ while( (what = read8()) != 0 ) // BYTE:what / 0=end of row
+ {
+ col = what & 31; // &31=channel
+
+ z = row*MAX_CHANNELS+col;
+
+ if( what & 32 ) // &32=follows; BYTE:note, BYTE:instrument
+ {
+ patt->data[z].note = read8();
+ if( patt->data[z].note == 255 )
+ patt->data[z].note = 250;
+ else if( patt->data[z].note == 254 )
+ patt->data[z].note = 254;
+ else
+ patt->data[z].note = S3M_NOTE( patt->data[z].note );
+ patt->data[z].inst = read8();
+ }
+
+ if( what & 64 ) // &64=follows; BYTE:volume
+ {
+ patt->data[z].vol = read8();
+ }
+
+ if( what & 128 ) // &128=follows; BYTE:command, BYTE:info
+ {
+ patt->data[z].fx = read8();
+ patt->data[z].param = read8();
+ if( patt->data[z].fx == 3 ) // convert pattern break to hexadecimal
+ {
+ patt->data[z].param = (patt->data[z].param&0xF) + (patt->data[z].param/16)*10;
+ }
+ if( patt->data[z].fx == 'X'-64 )
+ {
+ patt->data[z].param *= 2; // multiply volume scale by 2
+ }
+ if( patt->data[z].fx == 'V'-64 )
+ {
+ patt->data[z].param *= 2; // multiply volume scale by 2
+ }
+ }
+ if( patt->data[z].fx == 255 )
+ {
+ patt->data[z].fx = 0;
+ patt->data[z].param = 0;
+ }
+ }
+ }
+ return ERR_NONE;
+}
+
+int Load_S3M( MAS_Module* mod, bool verbose )
+{
+ u16 s3m_flags;
+ u16 cwt;
+ u16 ffi;
+ u8 dp;
+
+ bool stereo;
+
+ u8 a;
+ bool chan_enabled[32];
+
+ int x,y;
+
+ u16* parap_inst;
+ u16* parap_patt;
+
+
+
+ memset( mod, 0, sizeof( MAS_Module ) );
+ for( x = 0; x < 28; x++ )
+ mod->title[x] = read8(); // read song name
+
+ if( read8() != 0x1A );
+// return ERR_INVALID_MODULE;
+ if( read8() != 16 )
+ return ERR_INVALID_MODULE;
+ if( verbose )
+ {
+ printf( vstr_s3m_div );
+ }
+ if( verbose )
+ printf( "Loading S3M, \"%s\"\n", mod->title );
+
+ skip8( 2 ); // reserved space
+ mod->order_count = (u8)read16();
+ mod->inst_count = (u8)read16();
+ mod->samp_count = mod->inst_count;
+ mod->patt_count = (u8)read16();
+
+ for( x = 0; x < 32; x++ )
+ mod->channel_volume[x] = 64;
+
+ mod->freq_mode = 0; // amiga frequencies
+ mod->old_effects=true; // old effects (maybe not?)
+ mod->link_gxx=false; // dont link gxx memory
+ mod->restart_pos = 0; // restart from beginning
+ mod->old_mode=true;
+
+ s3m_flags = read16();
+ cwt = read16();
+ ffi = read16();
+ if( read32() != 'MRCS' ) // "SCRM" mark
+ return ERR_INVALID_MODULE;
+ mod->global_volume = read8()*2;
+ mod->initial_speed = read8();
+ mod->initial_tempo = read8();
+ stereo = read8() >> 7; // master volume
+ read8(); // ultra click removal
+ dp = read8(); // default pan positions (when 252)
+ skip8( 8+2 ); // reserved space + special pointer
+ for( x = 0; x < 32; x++ )
+ {
+ u8 chn = read8();
+ chan_enabled[x] = chn >> 7;
+ if( stereo )
+ {
+ if( (chn&127) < 8 ) // left channel
+ mod->channel_panning[x] = clamp_u8( 128 - (PANNING_SEP/2) );
+ else // right channel
+ mod->channel_panning[x] = clamp_u8( 128 + (PANNING_SEP/2) );
+ }
+ else
+ {
+ mod->channel_panning[x] = 128;
+ }
+ }
+ for( x = 0; x < mod->order_count; x++ )
+ {
+ mod->orders[x] = read8();
+ }
+ parap_inst = (u16*)malloc( mod->inst_count * sizeof( u16 ) );
+ parap_patt = (u16*)malloc( mod->patt_count * sizeof( u16 ) );
+
+ for( x = 0; x < mod->inst_count; x++ )
+ parap_inst[x] = read16();
+ for( x = 0; x < mod->patt_count; x++ )
+ parap_patt[x] = read16();
+
+ if( dp == 252 )
+ {
+ for( x = 0; x < 32; x++ )
+ {
+ a = read8();
+ if( a & 32 )
+ {
+ mod->channel_panning[x] = (a&15)*16 > 255 ? 255 : (a&15)*16;
+ }
+ else
+ {/*
+ if( stereo )
+ {
+ switch( x & 3 ) {
+ case 0:
+ case 3:
+ mod->channel_panning[x] = clamp_u8( 128 - (PANNING_SEP/2) );
+ break;
+ case 1:
+ case 2:
+ mod->channel_panning[x] = clamp_u8( 128 + (PANNING_SEP/2) );
+ }
+ }
+ else
+ {
+ mod->channel_panning[x] = 128;
+ }*/
+ }
+ }
+ }
+ else
+ {
+ for( x = 0; x < 32; x++ )
+ {
+ if( stereo )
+ mod->channel_panning[x] = x & 1 ? clamp_u8( 128 - (PANNING_SEP/2) ) : clamp_u8( 128 + (PANNING_SEP/2) );
+ else
+ mod->channel_panning[x] = 128;
+ }
+ }
+
+ mod->instruments = (Instrument*)malloc( mod->inst_count * sizeof( Instrument ) );
+ mod->samples = (Sample*)malloc( mod->samp_count * sizeof( Sample ) );
+ mod->patterns = (Pattern*)malloc( mod->patt_count * sizeof( Pattern ) );
+
+ if( verbose )
+ {
+ printf( vstr_s3m_div );
+ printf( "Loading Samples...\n" );
+ printf( vstr_s3m_sampt_top );
+ printf( vstr_s3m_sampt_mid );
+#ifdef vstr_s3m_sampt_slice
+ printf( vstr_s3m_sampt_slice );
+#endif
+ }
+ // load instruments
+ for( x = 0; x < mod->inst_count; x++ )
+ {
+ if( verbose )
+ {
+ printf( vstr_s3m_sampt_index, x+1 );
+ //printf( "Sample %i\n", x+1 );
+ }
+ // create instrument for sample
+ memset( &mod->instruments[x], 0, sizeof( Instrument ) );
+ mod->instruments[x].global_volume = 128;
+ // make notemap
+ for( y = 0; y < 120; y++ )
+ mod->instruments[x].notemap[y] = y | ((x+1) << 8);
+
+ // load sample
+ file_seek_read( parap_inst[x]*16, SEEK_SET );
+ if( Load_S3M_Sample( &mod->samples[x], verbose ) )
+ {
+ printf( "Error loading sample!\n" );
+ return ERR_UNKNOWNSAMPLE;
+ }
+ }
+
+ // load patterns
+ if( verbose )
+ {
+ printf( vstr_s3m_sampt_bottom );
+ printf( "Loading Patterns...\n" );
+ printf( vstr_s3m_div );
+ }
+ for( x = 0; x < mod->patt_count; x++ )
+ {
+ if( verbose )
+ {
+ printf( vstr_s3m_pattern, x+1, ((x+1)%15)?"":"\n" );
+ }
+ //printf( "%i...", x+1 );
+ file_seek_read( parap_patt[x]*16, SEEK_SET );
+ Load_S3M_Pattern( &mod->patterns[x] );
+ }
+
+ if( verbose )
+ {
+ printf( "\n" );
+ printf( vstr_s3m_div );
+ printf( "Loading Sample Data...\n" );
+ }
+ for( x = 0; x < mod->samp_count; x++ )
+ {
+ file_seek_read( mod->samples[x].datapointer, SEEK_SET );
+ Load_S3M_SampleData( &mod->samples[x], (u8)ffi );
+ }
+ if( verbose )
+ {
+ printf( vstr_s3m_div );
+ }
+ return ERR_NONE;
+}
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef S3M_H
+#define S3M_H
+
+int Load_S3M( MAS_Module* mod, bool verbose );
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#define MAX_UNROLL_THRESHOLD 1024 // will unroll upto 1kb more of data (when fixing NDS samples)
+#define GBA_MIN_LOOP_SIZE 512
+
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include "defs.h"
+#include "mas.h"
+#include "errors.h"
+#include "systems.h"
+#include "adpcm.h"
+
+extern int ignore_sflags;
+
+void Sample_PadStart( Sample* samp, u32 count )
+{
+ // Pad beginning of sample with zero
+ u8* newdata8;
+ u16* newdata16;
+ u32 x;
+ if( count == 0 )
+ return; // nothing to do
+ if( samp->format & SAMPF_16BIT )
+ {
+ newdata16 = (u16*)malloc( (samp->sample_length+count)*2 );
+ for( x = 0; x < count; x++ )
+ newdata16[x]=32768;
+ for( x = 0; x < samp->sample_length; x++ )
+ newdata16[count+x]=((u16*)samp->data)[x];
+ free( samp->data );
+ samp->data = (void*)newdata16;
+ }
+ else
+ {
+ newdata8 = (u8*)malloc( (samp->sample_length+count) );
+ for( x = 0; x < count; x++ )
+ newdata8[x]=128;
+ for( x = 0; x < samp->sample_length; x++ )
+ newdata8[count+x] = ((u8*)samp->data)[x];
+ free( samp->data );
+ samp->data = (void*)newdata8;
+ }
+ samp->loop_start += count;
+ samp->loop_end += count;
+ samp->sample_length += count;
+}
+
+void Sample_PadEnd( Sample* samp, u32 count )
+{
+ // Pad end of sample with zero
+ u8* newdata8;
+ u16* newdata16;
+ u32 x;
+ if( count == 0 )
+ return; // nothing to do
+ if( samp->format & SAMPF_16BIT )
+ {
+ newdata16 = malloc( (samp->sample_length+count)*2 );
+ for( x = 0; x < samp->sample_length; x++ )
+ newdata16[x]= ((u16*)samp->data)[x];
+ for( x = 0; x < count; x++ )
+ newdata16[samp->sample_length+x]=32768;
+ free( samp->data );
+ samp->data = (void*)newdata16;
+ }
+ else
+ {
+ newdata8 = malloc( (samp->sample_length+count) );
+ for( x = 0; x < samp->sample_length; x++ )
+ newdata8[x]= ((u8*)samp->data)[x];
+ for( x = 0; x < count; x++ )
+ newdata8[samp->sample_length+x]=128;
+ free( samp->data );
+ samp->data = (void*)newdata8;
+ }
+ samp->loop_end += count;
+ samp->sample_length += count;
+}
+
+void Unroll_Sample_Loop( Sample* samp, u32 count )
+{
+ // unrolls sample loop (count) times
+ // loop end MUST equal sample length
+ u8* newdata8;
+ u16* newdata16;
+ u32 newlen;
+ u32 looplen;
+ u32 x;
+ looplen = samp->loop_end-samp->loop_start;
+ newlen = samp->sample_length + looplen*count;
+ if( samp->format & SAMPF_16BIT )
+ {
+ newdata16 = (u16*)malloc( newlen *2 );
+ for( x = 0; x < samp->sample_length; x++ )
+ newdata16[x] = ((u16*)samp->data)[x];
+ for( x = 0; x < looplen*count; x++ )
+ newdata16[samp->sample_length+x] = ((u16*)samp->data)[samp->loop_start+ (x%looplen)];
+ free( samp->data );
+ samp->data = (void*)newdata16;
+ }
+ else
+ {
+ newdata8 = (u8*)malloc( newlen );
+ for( x = 0; x < samp->sample_length; x++ )
+ newdata8[x] = ((u8*)samp->data)[x];
+ for( x = 0; x < looplen*count; x++ )
+ newdata8[samp->sample_length+x] = ((u8*)samp->data)[samp->loop_start+ (x%looplen)];
+ free( samp->data );
+ samp->data = (void*)newdata8;
+ }
+ samp->loop_end += looplen*count;
+ samp->sample_length += looplen*count;
+}
+
+void Unroll_BIDI_Sample( Sample* samp )
+{
+ // sample length MUST equal sample loop end
+ // sample MUST have loop type 2 (BIDI)
+ u8* newdata8;
+ u16* newdata16;
+ u32 newlen;
+ u32 looplen;
+ u32 x;
+
+ looplen = samp->loop_end-samp->loop_start;
+ newlen = (samp->sample_length + looplen);
+
+ if( samp->format & SAMPF_16BIT )
+ {
+ newdata16 = malloc( newlen *2 );
+ for( x = 0; x < samp->sample_length; x++ )
+ newdata16[x] = ((u16*)samp->data)[x];
+ for( x = 0; x < looplen; x++ )
+ newdata16[x+samp->sample_length] = ((u16*)samp->data)[samp->loop_end-1-x];
+ free( samp->data );
+ samp->data = (void*)newdata16;
+ }
+ else
+ {
+ newdata8 = malloc( newlen );
+ for( x = 0; x < samp->sample_length; x++ )
+ newdata8[x] = ((u8*)samp->data)[x];
+ for( x = 0; x < looplen; x++ )
+ newdata8[x+samp->sample_length] = ((u8*)samp->data)[samp->loop_end-1-x];
+ free( samp->data );
+ samp->data = (void*)newdata8;
+ }
+ samp->loop_type = 1;
+ samp->sample_length += looplen;
+ samp->loop_end += looplen;
+}
+
+/* NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE
+ The following resample routine was stolen from CHIBITRACKER (http://chibitracker.berlios.de), thanks reduz!
+ NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE */
+
+void Resample( Sample* samp, u32 newsize )
+{
+ // output pointers
+ u8 *dst8 =0;
+ u16 *dst16=0;
+ u8 *src8 = (u8*)samp->data;
+ u16 *src16 = (u16*)samp->data;
+
+ int oldlength = samp->sample_length;
+ int lpoint = samp->loop_start;
+ int i;
+
+ bool bit16 = samp->format & SAMPF_16BIT;
+ double sign_diff;
+
+ // allocate memory
+ if( bit16 )
+ {
+ dst16 = (u16*)malloc(newsize*2);
+ sign_diff = 32768.0;
+ }
+ else
+ {
+ dst8 = (u8*)malloc(newsize);
+ sign_diff = 128.0;
+ }
+
+ double tscale = (double)oldlength / (double)newsize;
+ double posf;
+
+ for( i = 0; i < newsize; i++ )
+ {
+ posf = (double)i * tscale;
+ int posi = (int)floor(posf);
+
+ double mu = posf - (double)posi;
+ double s0, s1, s2, s3;
+ double mu2, a0, a1, a2, a3, res;
+
+ // get previous, current, next, and after next samples
+ if( bit16 )
+ {
+ s0 = (posi-1) < 0 ? 0 : ((double)(src16[posi-1]));
+ s1 = ((double)(src16[posi ]));
+ s2 = (posi+1) >= oldlength ?
+ (samp->loop_type ?
+ ((double)(src16[lpoint + (posi + 1 - oldlength)])) : 0) :
+ ((double)(src16[posi+1]));
+ s3 = (posi+1) >= oldlength ?
+ (samp->loop_type ?
+ ((double)(src16[lpoint + (posi + 2 - oldlength)])) : 0) :
+ ((double)(src16[posi+2]));
+ }
+ else
+ {
+ s0 = (posi-1) < 0 ? 0 : ((double)(src8[posi-1]));
+ s1 = ((double)(src8[posi ]));
+ s2 = (posi+1) >= oldlength ?
+ (samp->loop_type ?
+ ((double)(src8[lpoint + (posi + 1 - oldlength)])) : 0) :
+ ((double)(src8[posi+1]));
+ s3 = (posi+1) >= oldlength ?
+ (samp->loop_type ?
+ ((double)(src8[lpoint + (posi + 2 - oldlength)])) : 0) :
+ ((double)(src8[posi+2]));
+ }
+
+ // sign data
+ s0 -= sign_diff;
+ s1 -= sign_diff;
+ s2 -= sign_diff;
+ s3 -= sign_diff;
+
+ mu2 = mu * mu;
+ a0 = s3 - s2 - s0 + s1;
+ a1 = s0 - s1 - a0;
+ a2 = s2 - s0;
+ a3 = s1;
+
+ res = a0*mu*mu2 + a1*mu2 + a2*mu + a3;
+ int resi = ((int)floor(res+0.5));
+
+ if( bit16 )
+ {
+ if( resi < -32768 ) resi = -32768;
+ if( resi > 32767 ) resi = 32767;
+ dst16[i] = resi + 32768;
+ }
+ else
+ {
+ if( resi < -128 ) resi = -128;
+ if( resi > 127 ) resi = 127;
+ dst8[i] = resi + 128;
+ }
+
+ }
+
+ free( samp->data );
+ if( bit16 )
+ samp->data = (void*)dst16;
+ else
+ samp->data = (void*)dst8;
+
+ samp->sample_length = newsize;
+ samp->loop_end = newsize;
+ samp->loop_start = (int)(((double)samp->loop_start * (double)newsize+((double)oldlength/2))/(double)oldlength);
+ samp->frequency = (int)(((double)samp->frequency * (double)newsize+((double)oldlength/2))/(double)oldlength);
+}
+
+void Sample_8bit( Sample* samp )
+{
+ if( samp->format & SAMPF_16BIT )
+ {
+ u8* newdata;
+ u32 t;
+ newdata = (u8*)malloc( samp->sample_length );
+ for( t = 0; t < samp->sample_length; t++ )
+ newdata[t] = ((u16*)samp->data)[t] / 256;
+ free( samp->data );
+ samp->data = newdata;
+// samp->bit16=false;
+ samp->format &= ~SAMPF_16BIT;
+ }
+}
+
+void Sample_Sign( Sample* samp )
+{
+ // sample must be unsigned
+ u32 x;
+ if( samp->format & SAMPF_16BIT )
+ {
+ for( x =0 ; x < samp->sample_length; x++ )
+ {
+ int a = (( (int) ((u16*)samp->data)[x] ) - 32768);
+ if(a < -32767) a = -32767; // clamp LOW to -32767 (leave space for interpolation error)
+// if(a > 32765) a = 32765; // clamp HIGH to 32766
+ ((u16*)samp->data)[x] = (u16)a ;
+ }
+ }
+ else
+ {
+ for( x =0 ; x < samp->sample_length; x++ )
+ {
+ int a = (( (int) ((u8*)samp->data)[x] ) - 128);
+ if( a == -128 ) a = -127;
+ ((u8*)samp->data)[x] = (u8) a;
+ }
+
+ }
+ samp->format |= SAMPF_SIGNED;
+}
+
+void FixSample_GBA( Sample* samp )
+{
+ // convert to 8-bit if neccesary
+ Sample_8bit( samp );
+
+ // delete data after loop_end if loop exists
+ if( samp->loop_type != 0 )
+ samp->sample_length = samp->loop_end;
+
+ // unroll BIDI loop
+ if( samp->loop_type == 2 )
+ Unroll_BIDI_Sample( samp );
+
+ if( samp->loop_type )
+ {
+ if( samp->loop_end-samp->loop_start < GBA_MIN_LOOP_SIZE )
+ {
+ Unroll_Sample_Loop( samp, (GBA_MIN_LOOP_SIZE / (samp->loop_end-samp->loop_start))+1 );
+ }
+ }
+}
+
+int strcmpshit( char* str1, char* str2 )
+{
+ int x=0;
+ int f=0;
+ while( str1[x] != 0 )
+ {
+ if( str1[x] == str2[f] )f++;
+ else f=0;
+ if( str2[f] == 0 ) return 1;
+ x++;
+ }
+ return 0;
+}
+
+void FixSample_NDS( Sample* samp )
+{
+ if( samp->sample_length == 0 )
+ {
+ // sample has no data
+ samp->loop_end=samp->loop_start=0;
+ return;
+ }
+ // delete data after loop_end if loop exists
+ if( samp->loop_type != 0 )
+ samp->sample_length = samp->loop_end;
+
+ // unroll BIDI loop
+ if( samp->loop_type == 2 )
+ Unroll_BIDI_Sample( samp );
+
+ // %o option
+ if( samp->loop_type )
+ {
+ if( !ignore_sflags )
+ {
+ if( ((strcmpshit( samp->name, "%o" )) > 0) )
+ {
+ Unroll_Sample_Loop( samp, 1 );
+ samp->loop_start += (samp->loop_end-samp->loop_start) / 2;
+ }
+ }
+ }
+
+ if( !ignore_sflags )
+ {
+ if( ((strcmpshit( samp->name, "%c" )) > 0) )
+ {
+ samp->format |= SAMPF_COMP;
+ }
+ }
+
+ // Resize loop
+ if( samp->loop_type )
+ {
+ int looplen = samp->loop_end-samp->loop_start;
+ if( !(samp->format & SAMPF_COMP) )
+ {
+ if( samp->format & SAMPF_16BIT )
+ {
+ if( looplen & 1 )
+ {
+ int addition = (samp->loop_end - samp->loop_start);
+ if( addition > MAX_UNROLL_THRESHOLD )
+ Resample( samp, samp->sample_length +1 );
+ else
+ Unroll_Sample_Loop( samp, 1 );
+ }
+ }
+ else
+ {
+ if( looplen & 3 )
+ {
+ int count;
+ int addition;
+ count = looplen & 3;
+ switch( count ) {
+ case 0:
+ count=0; break;
+ case 1:
+ count=3; break;
+ case 2:
+ count=1; break;
+ case 3:
+ count=3; break;
+ }
+ addition = looplen*count;
+ if( addition > MAX_UNROLL_THRESHOLD )
+ Resample( samp, samp->sample_length + (4-(looplen & 3)) );
+ else
+ Unroll_Sample_Loop( samp, count );
+ }
+ }
+ }
+ else
+ {
+ int a = looplen;
+ int count=0, addition;
+ while( looplen & 7 )
+ {
+ count++;
+ looplen += a;
+ }
+ addition = looplen*count;
+ if( addition > MAX_UNROLL_THRESHOLD )
+ Resample( samp, samp->sample_length + (4-(looplen & 7)) );
+ else
+ Unroll_Sample_Loop( samp, count );
+ }
+ }
+
+ // Align loop_start
+ if( samp->loop_type )
+ {
+ int padsize;
+ if( !(samp->format & SAMPF_COMP) )
+ {
+ if( samp->format & SAMPF_16BIT ) {
+ padsize = ( (2 - (samp->loop_start & 1)) & 1 );
+ } else {
+ padsize = ( (4 - (samp->loop_start & 3)) & 3 );
+ }
+ }
+ else
+ {
+ padsize = ( (8 - (samp->loop_start & 7)) & 7 );
+ }
+ Sample_PadStart( samp, padsize );
+ }
+
+ // Pad end, only happens when loop is disabled
+ if( !(samp->format & SAMPF_COMP) )
+ {
+ if( samp->format & SAMPF_16BIT )
+ {
+ if( samp->sample_length & 1 )
+ {
+ Sample_PadEnd( samp, 2-(samp->sample_length&1) );
+ }
+ }
+ else
+ {
+ if( samp->sample_length & 3 )
+ {
+ Sample_PadEnd( samp, 4-(samp->sample_length&3) );
+ }
+ }
+ }
+ else
+ {
+ if( samp->sample_length & 7 )
+ {
+ Sample_PadEnd( samp, 8-(samp->sample_length&7) );
+ }
+ }
+
+ Sample_Sign( samp ); // DS hardware takes signed samples
+
+ if( samp->format & SAMPF_COMP )
+ {
+ // compress with IMA-ADPCM hunger owned
+ adpcm_compress_sample( samp );
+ }
+ else
+ {
+
+ }
+}
+
+void FixSample( Sample* samp )
+{
+ // Clamp loop_start and loop_end (f.e. FR_TOWER.MOD)
+ samp->loop_start = CLAMP(samp->loop_start, 0, samp->sample_length);
+ samp->loop_end = CLAMP(samp->loop_end, 0, samp->sample_length);
+
+ if( target_system == SYSTEM_GBA )
+ FixSample_GBA( samp );
+ else if( target_system == SYSTEM_NDS )
+ FixSample_NDS( samp );
+}
+
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef SAMPLEFIX_H
+#define SAMPLEFIX_H
+
+void FixSample( Sample* samp );
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <ctype.h>
+
+#include "defs.h"
+#include "mas.h"
+#include "simple.h"
+#include "files.h"
+#include "samplefix.h"
+
+// cREDITS TO CODA, LOOK AT THIS AWESOME CODES
+u32 readbits(u8* buffer, unsigned int pos, unsigned int size) {
+ u32 result=0;
+ u32 i;
+
+ for(i=0;i<size;i++) {
+ u32 byte_pos;
+ u32 bit_pos;
+ byte_pos = (pos+i)>>3;
+ bit_pos = (pos+i)&7;
+ result |= ( (buffer[byte_pos] >> bit_pos) & 1 ) << i;
+ }
+ return result;
+}
+
+int get_ext( char* filename )
+{
+ int strl = strlen(filename);
+ int x;
+ u32 a=0;
+ if( strl < 4 )
+ return INPUT_TYPE_UNK;
+ for( x = 0; x < 4; x++ )
+ {
+ if( filename[strl-x-1] != '.' )
+ {
+ a |= tolower(filename[strl-x-1]) << (x*8);
+ }
+ else
+ break;
+ }
+ //a = tolower( filename[strl-1] ) | (tolower( filename[strl-1] )<<8) | tolower( filename[strl-2]<<16 ) | tolower( filename[strl-3]<<24 );
+
+ switch( a )
+ {
+ case 'mod':
+ return INPUT_TYPE_MOD;
+ case 's3m':
+ return INPUT_TYPE_S3M;
+ case 'txt':
+ return INPUT_TYPE_TXT;
+ case 'wav':
+ return INPUT_TYPE_WAV;
+ case 'msl':
+ return INPUT_TYPE_MSL;
+ case 'xm':
+ return INPUT_TYPE_XM;
+ case 'it':
+ return INPUT_TYPE_IT;
+ case 'h':
+ return INPUT_TYPE_H;
+ }
+ return INPUT_TYPE_UNK;
+}
+
+u32 calc_samplen_ex2( Sample* s )
+{
+ if( s->loop_type == 0 )
+ {
+ return s->sample_length;
+ }
+ else
+ {
+ return s->loop_end;
+ }
+}
+
+u32 calc_samplooplen( Sample* s )
+{
+ u32 a;
+ if( s->loop_type == 1 )
+ {
+ a = s->loop_end - s->loop_start;
+ return a;
+ }
+ else if( s->loop_type == 2 )
+ {
+ a = (s->loop_end-s->loop_start) *2;
+ return a;
+ }
+ else
+ {
+ return 0xFFFFFFFF;
+ }
+}
+
+u32 calc_samplen( Sample* s )
+{
+ if( s->loop_type == 1 )
+ {
+ return s->loop_end;
+ }
+ else if( s->loop_type == 2 )
+ {
+ return (s->loop_end-s->loop_start)+s->loop_end;
+ }
+ else
+ {
+ return s->sample_length;
+ }
+}
+
+u8 sample_dsformat( Sample* samp )
+{
+ if( samp->format & SAMPF_COMP )
+ {
+ return 2;
+ }
+ else
+ {
+ if( samp->format & SAMPF_SIGNED )
+ {
+ if( samp->format & SAMPF_16BIT )
+ return 1;
+ else
+ return 0;
+ }
+ else
+ {
+ if( !(samp->format & SAMPF_16BIT) )
+ return 3;
+ else
+ return 3; // error
+ }
+ }
+}
+
+u8 sample_dsreptype( Sample* samp )
+{
+ if( samp->loop_type )
+ return 1;
+ else
+ return 2;
+}
+
+int clamp_s8( int value )
+{
+ if( value < -128 ) value = -128;
+ if( value > 127 ) value = 127;
+ return value;
+}
+
+int clamp_u8( int value )
+{
+ if( value < 0 ) value = 0;
+ if( value > 255 ) value = 255;
+ return value;
+}
+
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef SIMPLE_H
+#define SIMPLE_H
+
+#define INPUT_TYPE_MOD 0
+#define INPUT_TYPE_S3M 1
+#define INPUT_TYPE_XM 2
+#define INPUT_TYPE_IT 3
+#define INPUT_TYPE_WAV 4
+#define INPUT_TYPE_TXT 5
+#define INPUT_TYPE_UNK 6
+#define INPUT_TYPE_H 7
+#define INPUT_TYPE_MSL 8
+
+int get_ext( char* filename );
+u32 calc_samplooplen( Sample* s );
+u32 calc_samplen( Sample* s );
+u32 calc_samplen_ex2( Sample* s );
+int clamp_s8( int value );
+int clamp_u8( int value );
+u32 readbits(u8* buffer, unsigned int pos, unsigned int size);
+
+u8 sample_dsformat( Sample* samp );
+u8 sample_dsreptype( Sample* samp );
+
+#endif
--- /dev/null
+// MASTER SOLUTION, DEFINITIONS
+#define SFX_CRASH 0
+#define MOD_ACID 0
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#define SYSTEM_GBA 0
+#define SYSTEM_NDS 1
+
+extern int target_system;
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+// xboo uploader...................
+
+void Upload_GBA( char* filename )
+{
+ // todo.........
+}
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#define MAS_VERSION 0x18
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+// WAV file loader
+
+#include <stdlib.h>
+#include <string.h>
+#include "defs.h"
+#include "files.h"
+#include "mas.h"
+#include "wav.h"
+#include "simple.h"
+#include "samplefix.h"
+
+int Load_WAV( Sample* samp, bool verbose, bool fix )
+{
+ unsigned int file_size;
+ unsigned int bit_depth = 8;
+ unsigned int hasformat = 0;
+ unsigned int hasdata = 0;
+ unsigned int chunk_code;
+ unsigned int chunk_size;
+ unsigned int num_channels = 0;
+
+ if( verbose )
+ printf( "Loading WAV file...\n" );
+
+ // initialize data
+ memset( samp, 0, sizeof( Sample ) );
+
+ file_size = file_tell_size();
+
+ read32(); // "RIFF"
+ read32(); // filesize-8
+ read32(); // "WAVE"
+
+ while( 1 )
+ {
+ // break on end of file
+ if( file_tell_read() >= file_size ) break;
+
+ // read chunk code and length
+ chunk_code = read32();
+ chunk_size = read32();
+
+ // parse chunk code
+ switch( chunk_code )
+ {
+ //---------------------------------------------------------------------
+ case ' tmf': // format chunk
+ //---------------------------------------------------------------------
+
+ // check compression code (1 = PCM)
+ if( read16() != 1 )
+ {
+ if( verbose )
+ printf( "Unsupported WAV format.\n" );
+ return LOADWAV_UNKNOWN_COMP;
+ }
+
+ // read # of channels
+ num_channels = read16();
+
+ // read sampling frequency
+ samp->frequency = read32();
+
+ // skip average something, wBlockAlign
+ read32();
+ read16();
+
+ // get bit depth, catch unsupported values
+ bit_depth = read16();
+ if( bit_depth != 8 && bit_depth != 16 )
+ {
+ if( verbose )
+ printf( "Unsupported bit-depth.\n" );
+ return LOADWAV_UNSUPPORTED_BD;
+ }
+
+ if( bit_depth == 16 )
+ samp->format |= SAMPF_16BIT;
+
+ // print verbose data
+ if( verbose )
+ {
+ printf( "Sample Rate...%i\n", samp->frequency );
+ printf( "Bit Depth.....%i-bit\n", bit_depth );
+ }
+
+ // skip the rest of the chunk (if any)
+ if( (chunk_size - 0x10) > 0 )
+ skip8( (chunk_size - 0x10) );
+
+ hasformat = 1;
+ break;
+
+ //---------------------------------------------------------------------
+ case 'atad': // data chunk
+ //---------------------------------------------------------------------
+ {
+ int t, c, dat;
+
+ if( !hasformat )
+ {
+ return LOADWAV_CORRUPT;
+ }
+
+ if( verbose )
+ printf( "Loading Sample Data...\n" );
+
+ // clip chunk size against end of file (for some borked wavs...)
+ {
+ int br = file_size - file_tell_read();
+ chunk_size = chunk_size > br ? br : chunk_size;
+ }
+
+ samp->sample_length = chunk_size / (bit_depth/8) / num_channels;
+ samp->data = malloc( chunk_size );
+
+ // read sample data
+ for( t = 0; t < samp->sample_length; t++ )
+ {
+ dat = 0;
+
+ // for multi-channel samples, get average value
+ for( c = 0; c < num_channels; c++ )
+ {
+ dat += bit_depth == 8 ? ((int)read8()) - 128 : ((short)read16());
+ }
+ dat /= num_channels;
+
+ if( bit_depth == 8 )
+ {
+ ((u8*)samp->data)[t] = dat + 128;
+ }
+ else
+ {
+ ((u16*)samp->data)[t] = dat + 32768;
+ }
+ }
+
+ hasdata = 1;
+
+ break;
+ }
+ //------------------------------------------------------------------------------
+ case 'lpms': // sampler chunk
+ //------------------------------------------------------------------------------
+ {
+ int pos;
+ skip8( 4 // manufacturer
+ +4 // product
+ +4 // sample period
+ +4 // midi unity note
+ +4 // midi pitch fraction
+ +4 // smpte format
+ +4 // smpte offset
+ );
+ int num_sample_loops = read32();
+
+ read32(); // sample data
+
+ pos = 36;
+
+ // check for sample looping data
+ if( num_sample_loops )
+ {
+ read32(); // cue point ID
+ int loop_type = read32();
+ pos += 8;
+
+ if( loop_type < 2 )
+ {
+ // sample | internal
+ // 0=forward | 1
+ // 1=bidi | 2
+ samp->loop_type = loop_type + 1;
+ samp->loop_start = read32();
+ samp->loop_end = read32();
+
+ // clip loop start against sample length
+ if( samp->loop_end > samp->sample_length ) {
+ samp->loop_end = samp->sample_length;
+ }
+
+ // disable tiny loop
+ // catch invalid loop
+ if( (samp->loop_start > samp->sample_length) ||
+ (samp->loop_end - samp->loop_start < 16) ) {
+
+ samp->loop_type = 0;
+ samp->loop_start = 0;
+ samp->loop_end = 0;
+ }
+
+ // ignore fractional
+ // ignore play count
+ pos += 8;
+ }
+ }
+
+ skip8( chunk_size - pos );
+ break;
+ }
+ default:
+ skip8( chunk_size );
+ }
+ }
+
+ if( hasformat && hasdata )
+ {
+ if( fix ) FixSample( samp );
+ return LOADWAV_OK;
+ }
+ else
+ {
+ return LOADWAV_CORRUPT;
+ }
+}
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef WAV_H
+#define WAV_H
+
+#define LOADWAV_OK 0x00
+#define LOADWAV_CORRUPT 0x01
+#define LOADWAV_UNKNOWN_COMP 0x11
+#define LOADWAV_TOOMANYCHANNELS 0x12
+#define LOADWAV_UNSUPPORTED_BD 0x13
+#define LOADWAV_BADDATA 0x14
+
+int Load_WAV( Sample* samp, bool verbose, bool fix );
+
+#endif
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+// information from XM.TXT by Mr.H of Triton
+
+#include <stdlib.h>
+#include <string.h>
+#include "defs.h"
+#include "mas.h"
+#include "xm.h"
+#include "files.h"
+#include "simple.h"
+#include "errors.h"
+#include "math.h"
+#include "samplefix.h"
+
+#define cho 64
+
+#ifdef SUPER_ASCII
+#define vstr_xm_samp " %2i ³ %s%s ³ %-22s ³\n"
+#define vstr_xm_nosamp " -- ³ -- ³ %-22s ³\n"
+#define vstr_xm_div "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n"
+#define vstr_xm_patt " \x0e %2i "
+#define vstr_xm_samp_top "ÚÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"
+#define vstr_xm_samp_header "³INDEX³SAMPLES³ENVELOPE³ NAME ³\n"
+#define vstr_xm_samp_prefix "³%3i ³"
+#define vstr_xm_samp_slice "ÃÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´\n"
+#define vstr_xm_samp_bottom "ÀÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"
+#else
+#define vstr_xm_samp " %2i | %s%s | %-22s |\n"
+#define vstr_xm_nosamp " -- | -- | %-22s |\n"
+#define vstr_xm_div "--------------------------------------------\n"
+#define vstr_xm_patt " Pattern %2i "
+#define vstr_xm_samp_top ".-----------------------------------------------.\n"
+#define vstr_xm_samp_header "|INDEX|SAMPLES|ENVELOPE| NAME |\n"
+#define vstr_xm_samp_prefix "|%3i |"
+#define vstr_xm_samp_slice "|-----+-------+--------+------------------------|\n"
+#define vstr_xm_samp_bottom "`-----------------------------------------------'\n"
+#endif
+
+int Get_XM_Frequency( s8 relnote, s8 finetune )
+{
+ double rn=relnote;
+ double ft=finetune;
+ double middle_c;
+ double freq;
+ middle_c = 8363.0f;
+ freq = middle_c * pow( 2.0, (1.0/12.0)*rn + (1.0/(12.0*128.0))*ft );
+ return (int)freq;
+}
+
+int Load_XM_Instrument( Instrument* inst, MAS_Module* mas, u8* p_nextsample, bool verbose )
+{
+
+ int inst_size;
+ int nsamples;
+
+ int ns;
+
+ int samp_headstart;
+ int samp_headsize;
+ int inst_headstart;
+
+ int sample_old;
+
+ int x,y;
+ u32 t;
+
+ u8 vibtype;
+ u8 vibsweep;
+ u8 vibdepth;
+ u8 vibrate;
+
+ s8 finetune;
+ s8 relnote;
+ u8 loopbits;
+
+ u8 volbits;
+ u8 panbits;
+
+ Sample* samp;
+
+ ns = *p_nextsample;
+
+ memset( inst, 0, sizeof( Instrument ) );
+
+ inst_headstart = file_tell_read();
+ inst_size = read32();
+
+ for( x = 0; x < 22; x++ )
+ inst->name[x] = read8(); // instrument name
+// if( verbose )
+// printf( " Name=\"%s\"\n", inst->name );
+// if( read8() != 0 )
+// return ERR_UNKNOWNINST;
+ read8(); // instrument type, SUPPOSED TO ALWAYS BE 0...
+ nsamples = read16();
+ if( nsamples > 0 )
+ {
+ samp_headsize = read32();
+ // read sample map
+ for( x = 0; x < 96; x++ )
+ {
+ inst->notemap[x+12] = ((read8()+ns+1)*256) | (x+12);
+ }
+ for( x=0; x < 12; x++ )
+ inst->notemap[x] =( inst->notemap[12]&0xFF00) | x;
+ for( x=96;x<120;x++)
+ inst->notemap[x] =( inst->notemap[12]&0xFF00) | x;
+ for( x = 0; x < 12; x++ )
+ {
+ inst->envelope_volume.node_x[x] = read16();
+ inst->envelope_volume.node_y[x] = (u8)read16();
+ }
+ for( x = 0; x < 12; x++ )
+ {
+ inst->envelope_pan.node_x[x] = read16();
+ inst->envelope_pan.node_y[x] = (u8)read16();
+ }
+ inst->global_volume = 128;
+ inst->envelope_volume.node_count = read8();
+ inst->envelope_pan.node_count = read8();
+ inst->envelope_volume.sus_start = inst->envelope_volume.sus_end = read8();
+ inst->envelope_volume.loop_start = read8();
+ inst->envelope_volume.loop_end = read8();
+ inst->envelope_pan.sus_start = inst->envelope_pan.sus_end = read8();
+ inst->envelope_pan.loop_start = read8();
+ inst->envelope_pan.loop_end = read8();
+ volbits = read8();
+ panbits = read8();
+ inst->env_flags = 0;
+ if( volbits & 1 )
+ inst->env_flags |= 1|8;
+ if( panbits & 1 )
+ inst->env_flags |= 2;
+
+ if( !(volbits & 2) )
+ inst->envelope_volume.sus_start=inst->envelope_volume.sus_end=255;
+ if( !(panbits & 2) )
+ inst->envelope_pan.sus_start=inst->envelope_pan.sus_end=255;
+
+ if( !(volbits & 4) )
+ inst->envelope_volume.loop_start=inst->envelope_volume.loop_end=255;
+ if( !(panbits & 4) )
+ inst->envelope_pan.loop_start=inst->envelope_pan.loop_end=255;
+
+ vibtype=read8();
+ vibsweep=32768/(read8()+1);
+ vibdepth=read8();
+ vibrate=read8();
+ inst->fadeout = read16()/32; // apply scalar!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ file_seek_read( inst_headstart+inst_size, SEEK_SET );
+
+/* if( verbose )
+ {
+ if( volbits & 1 )
+ printf( " Has Volume Envelope\n" );
+ if( panbits & 1 )
+ printf( " Has Panning Envelope\n" );
+ if( nsamples != 1 )
+ printf( " Contains %i samples...\n", nsamples );
+ else
+ printf( " Loading sample\n" );
+ }
+*/
+ // read sample headers
+ for( x = 0; x < nsamples; x++ )
+ {
+ if( ns+x >= 256 )
+ return ERR_TOOMANYSAMPLES;
+ samp_headstart = file_tell_read();
+ samp = &mas->samples[ns+x];
+// if( verbose && nsamples != 1 )
+// printf( " Loading sample %i...\n", x+1 );
+ memset( samp, 0, sizeof( Sample ) );
+ samp->msl_index = 0xFFFF;
+ samp->sample_length = read32();
+ samp->loop_start = read32();
+ samp->loop_end = read32()+samp->loop_start;
+ samp->default_volume = read8();
+ samp->global_volume = 64;
+
+ samp->vibtype = vibtype;
+ samp->vibdepth = vibdepth;
+ samp->vibspeed = vibrate;
+ samp->vibrate = vibsweep;
+
+ finetune = (s8)read8();
+ loopbits = read8();
+ samp->default_panning = (read8()>>1) | 128;
+ relnote = (s8)read8();
+ read8(); // reserved
+
+ for( y =0; y <22; y ++)
+ {
+ samp->name[y] = read8();
+ if( y < 12 )
+ samp->filename[y] = samp->name[y];
+ }
+
+ samp->frequency = Get_XM_Frequency( relnote, finetune );
+
+// samp->bit16 = loopbits & 16 ? true : false;
+ samp->format = loopbits & 16 ? SAMP_FORMAT_U16 : SAMP_FORMAT_U8;
+ if( samp->format & SAMPF_16BIT )
+ {
+ samp->sample_length /= 2;
+ samp->loop_start /= 2;
+ samp->loop_end /= 2;
+ }
+ samp->loop_type = loopbits & 3;
+ file_seek_read( samp_headstart + samp_headsize, SEEK_SET );
+/*
+ if( verbose )
+ {
+ printf( " Length........%i\n", samp->sample_length );
+ if( samp->loop_type == 0 )
+ printf( " Loop..........Disabled\n" );
+ else if( samp->loop_type == 1 )
+ printf( " Loop..........Forward %i->%i\n", samp->loop_start, samp->loop_end );
+ else if( samp->loop_type == 2 )
+ printf( " Loop..........BIDI %i->%i\n", samp->loop_start, samp->loop_end );
+ printf( " Volume........%i\n", samp->default_volume );
+ printf( " Panning.......%i\n", samp->default_panning & 127 );
+ printf( " Middle C......%ihz\n", samp->frequency );
+ printf( " 16 bit........%s\n", (samp->format & SAMPF_16BIT) ? "yes (will be converted)" : "no" );
+ }*/
+ }
+
+ // read sample
+ for( x = 0; x < nsamples; x++ )
+ {
+ samp = &mas->samples[ns+x];
+ if( samp->sample_length == 0 )
+ continue;
+
+ sample_old = 0;
+ if( samp->format & SAMPF_16BIT )
+ {
+ samp->data = (u16*)malloc( samp->sample_length*2 );
+ for( t = 0; t < samp->sample_length; t++ )
+ {
+ sample_old = (s16)((s16)read16() + sample_old);
+ ((u16*)samp->data)[t] = sample_old + 32768;
+ }
+ }
+ else
+ {
+ samp->data = (u8*)malloc( samp->sample_length );
+ for( t = 0; t < samp->sample_length; t++ )
+ {
+ sample_old = (s8)((s8)read8() + sample_old);
+ ((u8*)samp->data)[t] = sample_old + 128;
+ }
+ }
+ FixSample( samp );
+ }
+ *p_nextsample = ns+nsamples;
+
+
+ if( verbose )
+ {
+ printf( vstr_xm_samp, nsamples, (volbits&1)?"V":"-", (panbits&1)?"P":"-", inst->name );
+ }
+ }
+ else
+ {
+ file_seek_read( inst_headstart+inst_size, SEEK_SET );
+ if( verbose )
+ printf( vstr_xm_nosamp, inst->name );
+ }
+
+ return ERR_NONE;
+}
+
+void CONV_XM_EFFECT( u8* fx, u8* param )
+{
+ int wfx, wpm;
+ wfx=*fx;
+ wpm=*param;
+
+ switch( wfx )
+ {
+ case 0: // 0xy arpeggio
+ if( wpm != 0)
+ wfx = 'J'-cho;
+ else
+ wfx=wpm=0;
+ break;
+
+ case 1: // 1xx porta up
+ wfx = 'F'-cho;
+ if( wpm >= 0xE0 )
+ wpm = 0xDF;
+ break;
+
+ case 2: // 2xx porta down
+ wfx = 'E'-cho;
+ if( wpm >= 0xE0 )
+ wpm = 0xDF;
+ break;
+
+ case 3: // 3xx porta to note
+ wfx = 'G'-cho;
+ break;
+
+ case 4: // 4xy vibrato
+ wfx = 'H'-cho;
+ break;
+
+ case 5: // 5xy volslide+glissando
+ wfx = 'L'-cho;
+ break;
+
+ case 6: // 6xy volslide+vibrato
+ wfx = 'K'-cho;
+ break;
+
+ case 7: // 7xy tremolo
+ wfx = 'R'-cho;
+ break;
+
+ case 8: // 8xx set panning
+ wfx = 'X'-cho;
+ break;
+
+ case 9: // 9xx set offset
+ wfx = 'O'-cho;
+ break;
+
+ case 0xA: // Axy volume slide
+ wfx = 'D'-cho;
+ break;
+
+ case 0xB: // Bxx position jump
+ wfx = 'B'-cho;
+ break;
+
+ case 0xC: // Cxx set volume
+ wfx = 27; // compatibility effect
+ break;
+
+ case 0xD: // Dxx pattern break
+ wfx = 'C'-cho;
+ wpm = (wpm&0xF) + (wpm>>4) * 10;
+ /*if( wpm >= 0xF0 ) what the fuck is this
+ {
+ wpm = 0xE0 | (wpm&0xF);
+ }
+ if( wpm & 0xF == 0xF )
+ {
+ wpm = 0x0F | (wpm&0xF0);
+ }*/
+ break;
+
+ case 0xE: // Exy extended
+// if( (wpm & 0xF0) != 0xC0 )
+// {int foo = 1;}
+ switch( wpm >> 4 )
+ {
+ case 1: // fine porta up
+ wfx = 'F'-cho;
+ wpm = 0xF0 | (wpm&0xF);
+ break;
+
+ case 2: // fine porta down
+ wfx = 'E'-cho;
+ wpm = 0xF0 | (wpm&0xF);
+ break;
+
+ case 3: // glissando control
+ case 5: // set finetune
+ // UNSUPPORTED :(
+ wfx=0;
+ wpm=0;
+ break;
+
+ case 4: // vibrato control
+ wfx = 'S'-cho;
+ wpm = 0x30 | (wpm&0xF);
+ break;
+
+ case 6: // pattern loop
+ wfx = 'S'-cho;
+ wpm = 0xB0 | (wpm&0xF);
+ break;
+
+ case 7: // tremolo control
+ wfx = 'S'-cho;
+ wpm = 0x40 | (wpm&0xF);
+ break;
+
+ case 8: // set panning
+ wfx = 'X'-cho;
+ wpm = (wpm&0xF) * 16;
+ break;
+
+ case 9: // old retrig
+ wfx = 'S'-cho;
+ wpm = 0x20 | (wpm&0xF);
+ break;
+
+ case 10: // fine volslide up
+ wfx = 'S'-cho;
+ wpm = 0x00 | (wpm&0xF);
+ break;
+
+ case 11: // fine volslide down
+ wfx = 'S'-cho;
+ wpm = 0x10 | (wpm&0xF);
+ break;
+
+ case 12: // note cut
+ wfx = 'S'-cho;
+ wpm = 0xC0 | (wpm&0xF);
+ break;
+
+ case 13: // note delay
+ wfx = 'S'-cho;
+ wpm = 0xD0 | (wpm&0xF);
+ break;
+
+ case 14: // pattern delay
+ wfx = 'S'-cho;
+ wpm = 0xE0 | (wpm&0xF);
+ break;
+ case 15: // event
+ wfx = 'S'-cho;
+ wpm = wpm;
+ break;
+ case 0: // set filter
+ wfx=0;
+ wpm=0;
+
+ }
+ break;
+
+ case 0xF: // Fxx set speed
+ if( wpm >= 32 )
+ wfx = 'T'-cho;
+ else
+ wfx = 'A'-cho;
+ break;
+
+ case 16: // Gxx set global volume
+ wfx = 'V'-cho;
+ wpm=wpm;
+ break;
+
+ case 17: // Hxx global volume slide
+ wfx = 'W'-cho;
+ break;
+
+ case 18: // Ixx unused
+ case 19: // Jxx unused
+ case 22: // Mxx unused
+ case 23: // Nxx unused
+ case 24: // Oxx unused
+ case 26: // Qxx unused
+ case 28: // Sxx unused
+ case 30: // Uxx unused
+ case 31: // Vxx unused
+ case 32: // Wxx unused
+ case 34: // Yxx unused
+ case 35: // Zxx unused
+ wfx = 0;
+ wpm = 0;
+ break;
+
+ case 20: // Kxx key off
+ wfx = 28;
+ break;
+
+ case 21: // Lxx set envelope position
+ wfx = 29;
+ break;
+
+ case 25: // Pxx panning slide
+ wfx = 'P'-cho;
+ break;
+
+
+
+ case 27: // Rxx retrigger note
+ wfx = 'Q'-cho;
+ break;
+
+ case 29: // Txx tremor
+ wfx = 30;
+ break;
+
+ case 33: // Xxx extra fine slide
+ if( (wpm>>4) == 1 )
+ {
+ wfx = 'F'-cho;
+ wpm = 0xE0 | (wpm & 0xF);
+ }
+ else if( (wpm>>4) == 2 )
+ {
+ wfx = 'E'-cho;
+ wpm = 0xE0 | (wpm & 0xF);
+ }
+ else
+ {
+ wfx=0;
+ wpm=0;
+ }
+ break;
+ }
+ *fx = wfx;
+ *param = wpm;
+}
+
+int Load_XM_Pattern( Pattern* patt, u32 nchannels, bool verbose )
+{
+ u32 headsize;
+ u32 headstart;
+ u16 clength;
+ u16 row, col;
+ u8 b;
+ u32 e;
+ u8 fx,param;
+
+ headstart = file_tell_read();
+ headsize = read32();
+
+ if( read8() != 0 )
+ return ERR_UNKNOWNPATTERN;
+
+ memset( patt, 0, sizeof( Pattern ) );
+
+ patt->nrows = read16();
+ clength = read16();
+
+ if( verbose )
+ printf( "- %i rows, %.2f KB\n", patt->nrows, (float)(clength)/1000 );
+
+
+ for( row = 0; row < patt->nrows*MAX_CHANNELS; row++ )
+ {
+ patt->data[row].note = 250;
+ patt->data[row].vol = 0;
+ }
+
+ file_seek_read( headstart+headsize, SEEK_SET );
+
+ if( clength == 0 )
+ {
+ // pattern is empty
+ return ERR_NONE;
+ }
+
+ // read pattern data
+ for( row = 0; row < patt->nrows; row++ )
+ {
+ for( col = 0; col < nchannels; col++ )
+ {
+ e = row*MAX_CHANNELS+col;
+ b = read8();
+ if( b & 128 ) // packed
+ {
+ if( b & 1 ) // bit 0 set: Note follows
+ {
+ patt->data[e].note = read8(); // (byte) Note (1-96, 1 = C-0)
+ if( patt->data[e].note == 97 )
+ patt->data[e].note = 255;
+ else
+ patt->data[e].note += 12-1;
+ }
+ if( b & 2 ) // 1 set: Instrument follows
+ {
+ patt->data[e].inst = read8(); // (byte) Instrument (1-128)
+ }
+ if( b & 4 ) // 2 set: Volume column byte follows
+ {
+ patt->data[e].vol = read8(); // (byte) Volume column byte
+ }
+ if( b & 8 ) // 3 set: Effect type follows
+ fx = read8(); // (byte) Effect type
+ else
+ fx=0;
+ if( b & 16 ) // 4 set: Guess what!
+ param=read8(); // (byte) Effect parameter
+ else
+ param=0;
+
+ if( fx != 0 || param != 0 )
+ {
+ CONV_XM_EFFECT( &fx, ¶m ); // convert effect
+ patt->data[e].fx = fx;
+ patt->data[e].param = param;
+ }
+ }
+ else // unpacked
+ {
+ patt->data[e].note = b; // (byte) Note (1-96, 1 = C-0)
+ if( patt->data[e].note == 97 )
+ patt->data[e].note = 255;
+ else
+ patt->data[e].note += 12-1;
+ patt->data[e].inst = read8(); // (byte) Instrument (1-128)
+ patt->data[e].vol = read8(); // (byte) Volume column byte (see below)
+ fx = read8(); // (byte) Effect type
+ param=read8(); // (byte) Effect parameter
+ CONV_XM_EFFECT( &fx, ¶m ); // convert effect
+ patt->data[e].fx = fx;
+ patt->data[e].param = param;
+ }
+ }
+ }
+ return ERR_NONE;
+}
+
+int Load_XM( MAS_Module* mod, bool verbose )
+{
+ int x;
+ u16 xm_version;
+ u32 xm_headsize;
+ u16 xm_nchannels;
+ u8 next_sample;
+
+ memset( mod, 0, sizeof( MAS_Module ) );
+
+ mod->old_effects=true;
+ mod->xm_mode=true;
+ mod->global_volume=64;
+ mod->old_mode=false;
+
+ if( read32() != 'etxE' || read32() != 'dedn' || read32() != 'doM ' || read32() != ':elu' || read8() != ' ' )
+ return ERR_INVALID_MODULE;
+ for( x = 0; x < 20; x++ )
+ mod->title[x] = read8();
+ if( verbose )
+ {
+ printf( vstr_xm_div );
+ printf( "Loading XM, \"%s\"\n", mod->title );
+ }
+ if( read8() != 0x1a )
+ return ERR_INVALID_MODULE;
+ skip8( 20 ); // tracker name
+ xm_version = read16();
+ xm_headsize = read32();
+ mod->order_count = (u8)read16();
+ mod->restart_pos = (u8)read16();
+ xm_nchannels = read16();
+ mod->patt_count = (u8)read16();
+ mod->inst_count = (u8)read16();
+ mod->freq_mode = read16() & 1 ? true : false; // flags
+ mod->initial_speed = (u8)read16();
+ mod->initial_tempo = (u8)read16();
+
+ if( verbose )
+ {
+ printf( "Version....%i.%i\n", xm_version>>8 & 0xFF, xm_version & 0xFF );
+ printf( "Length.....%i\n", mod->order_count );
+ printf( "Restart....%i\n", mod->restart_pos );
+ printf( "Channels...%i\n", xm_nchannels );
+ printf( "#Patterns..%i\n", mod->patt_count );
+ printf( "#Instr.....%i\n", mod->inst_count );
+ printf( "Freq Mode..%s\n", mod->freq_mode ? "Linear" : "Amiga" );
+ printf( "Speed......%i\n", mod->initial_speed );
+ printf( "Tempo......%i\n", mod->initial_tempo );
+ }
+
+ for( x = 0; x < 32; x++ )
+ {
+ mod->channel_volume[x] = 64;
+ mod->channel_panning[x] = 128;
+ }
+ if( verbose )
+ {
+ printf( vstr_xm_div );
+ printf( "Reading sequence...\n" );
+ }
+ for( x = 0; x < 200; x++ ) // read order table
+ {
+ if( x < mod->order_count )
+ mod->orders[x] = read8();
+ else
+ {
+ read8();
+ mod->orders[x] = 255;
+ }
+ }
+
+ for( ; x < 256; x++ ) // skip 200->255
+ read8();
+ file_seek_read( 60+xm_headsize, SEEK_SET ); // or maybe 60..
+
+ if( verbose )
+ {
+ printf( vstr_xm_div );
+ printf( "Loading patterns...\n" );
+ printf( vstr_xm_div );
+ }
+
+ mod->patterns = (Pattern*)malloc( mod->patt_count * sizeof( Pattern ) );
+ for( x = 0; x < mod->patt_count; x++ )
+ {
+ if( verbose )
+ printf( vstr_xm_patt, x+1 );
+ Load_XM_Pattern( &mod->patterns[x], xm_nchannels, verbose );
+ }
+
+ mod->instruments = (Instrument*)malloc( mod->inst_count * sizeof( Instrument ) );
+ mod->samples = (Sample*)malloc( 256 * sizeof( Sample ) );
+ next_sample=0;
+
+
+ if( verbose )
+ {
+ printf( vstr_xm_div );
+ printf( "Loading instruments...\n" );
+ printf( vstr_xm_samp_top );
+ printf( vstr_xm_samp_header );
+ printf( vstr_xm_samp_slice );
+ }
+
+ for( x = 0; x < mod->inst_count; x++ )
+ {
+ // if( verbose )
+ // printf( "Reading Instrument %i...\n", x+1 );
+ if( verbose )
+ printf( vstr_xm_samp_prefix, x+1 );
+ Load_XM_Instrument( &mod->instruments[x], mod, &next_sample, verbose );
+ }
+
+ if( verbose )
+ {
+ printf( vstr_xm_samp_bottom );
+ }
+
+ mod->samp_count = next_sample;
+ return ERR_NONE;
+}
--- /dev/null
+/****************************************************************************
+ * __ *
+ * ____ ___ ____ __ ______ ___ ____ ____/ / *
+ * / __ `__ \/ __ `/ |/ / __ `__ \/ __ \/ __ / *
+ * / / / / / / /_/ /> </ / / / / / /_/ / /_/ / *
+ * /_/ /_/ /_/\__,_/_/|_/_/ /_/ /_/\____/\__,_/ *
+ * *
+ * Copyright (c) 2008, Mukunda Johnson (mukunda@maxmod.org) *
+ * *
+ * Permission to use, copy, modify, and/or distribute this software for any *
+ * purpose with or without fee is hereby granted, provided that the above *
+ * copyright notice and this permission notice appear in all copies. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES *
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF *
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR *
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES *
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN *
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *
+ ****************************************************************************/
+
+#ifndef XM_H
+#define XM_H
+
+int Load_XM( MAS_Module* mod, bool verbose );
+void CONV_XM_EFFECT( u8* fx, u8* param );
+
+#endif